Initial commit
This commit is contained in:
142
ptfix.lsp
Normal file
142
ptfix.lsp
Normal file
@@ -0,0 +1,142 @@
|
||||
;; ptfix.lsp
|
||||
;;
|
||||
;; Fix inaccurate points in AutoCAD with this lisp routine
|
||||
;; Select the elements you want to modify, click the desired point and add a tolerance.
|
||||
;; The points which are closer to the desired point than the tolerance will be moved to the desired point.
|
||||
;; Video about how it works: https://www.youtube.com/watch?v=iiLdYgVTKkc
|
||||
;;
|
||||
;; Created by Peter Gyetvai
|
||||
;; gyetpet@gmail.com
|
||||
;; gyetvai-peter.hu
|
||||
;;
|
||||
;; massoc routine created by Jason Piercey: https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/getting-multiple-assoc-values/td-p/852437
|
||||
|
||||
(defun massoc (key alist / x nlist)
|
||||
(foreach x alist
|
||||
(if (eq key (car x))
|
||||
(setq nlist (cons (cdr x) nlist))
|
||||
)
|
||||
)
|
||||
(reverse nlist)
|
||||
)
|
||||
|
||||
(defun C:ptfix (/ ss i il imax j jl jmax currElem currTyp currPoints currPointXY goodPoint goodPointXY tolerance currDist newPoint newElem movedPoints oldMovedPoints movedElems)
|
||||
;variables:
|
||||
(setq i 0);counter to zero
|
||||
(setq imax 1);while variable
|
||||
(setq movedPoints 0)
|
||||
(setq movedElems 0)
|
||||
|
||||
(vl-load-com)
|
||||
(graphscr)
|
||||
(prompt "\nSelect polylines: ")
|
||||
(setq ss (ssget));asks for selection
|
||||
(setq il (sslength ss));length of selection
|
||||
(setq goodPoint (getpoint "\nSelect desired point: "))
|
||||
(setq goodPointXY (vl-remove (last goodPoint) goodPoint))
|
||||
(setq tolerance (getdist "\nTolerance?"))
|
||||
|
||||
(while imax
|
||||
(print )
|
||||
(princ "Checking element ")
|
||||
(princ i)
|
||||
|
||||
(setq currElem (entget (ssname ss i) ))
|
||||
(setq currTyp (cdr (assoc 0 currElem)))
|
||||
(setq oldMovedPoints movedPoints)
|
||||
|
||||
(print )
|
||||
(princ " Element type: ")
|
||||
(princ currTyp)
|
||||
(cond
|
||||
(
|
||||
(= currTyp "LWPOLYLINE");if polyline
|
||||
(progn
|
||||
(setq currPoints (massoc 10 currElem))
|
||||
;; (print currPoints)
|
||||
|
||||
(setq jl (length currPoints))
|
||||
(setq j 0);counter to zero
|
||||
(setq jmax 1);while variable
|
||||
(while jmax
|
||||
(print )
|
||||
(princ " Checking point: ")
|
||||
(princ (nth j currPoints))
|
||||
|
||||
(setq currDist (distance (nth j currPoints) goodPointXY))
|
||||
(if
|
||||
(and (< currDist tolerance) (/= currDist 0))
|
||||
(progn
|
||||
(setq newPoint (cons 10 goodPointXY))
|
||||
(setq newElem(subst newPoint (cons 10 (nth j currPoints)) currElem))
|
||||
(setq currElem newElem)
|
||||
(entmod newElem)
|
||||
(princ " - Point moved to desired location")
|
||||
(setq movedPoints (1+ movedPoints))
|
||||
)
|
||||
(progn
|
||||
(princ " - Point is farther than tolerance")
|
||||
)
|
||||
)
|
||||
|
||||
;while specific:
|
||||
(setq j (1+ j));increments i
|
||||
(if (= j jl) (setq jmax nil));finish function if i equals il
|
||||
)
|
||||
(if (/= oldMovedPoints movedPoints) (setq movedElems (1+ movedElems)))
|
||||
)
|
||||
);polyline end
|
||||
(
|
||||
(= currTyp "LINE")
|
||||
(progn
|
||||
(setq j 10)
|
||||
(repeat 2
|
||||
(progn
|
||||
(setq currPoints (cdr (assoc j currElem)))
|
||||
(print )
|
||||
(princ " Checking point: ")
|
||||
(princ currPoints)
|
||||
(setq currPointXY (vl-remove (last currPoints) currPoints))
|
||||
(setq currDist (distance currPointXY goodPointXY))
|
||||
|
||||
(if
|
||||
(and (< currDist tolerance) (/= currDist 0))
|
||||
(progn
|
||||
(setq newPoint (cons j goodPoint))
|
||||
(setq newElem(subst newPoint (cons j currPoints) currElem))
|
||||
(setq currElem newElem)
|
||||
(entmod newElem)
|
||||
(princ " - Point moved to desired location")
|
||||
(setq movedPoints (1+ movedPoints))
|
||||
)
|
||||
(progn
|
||||
(princ " - Point is farther than tolerance")
|
||||
)
|
||||
)
|
||||
(setq j 11)
|
||||
)
|
||||
)
|
||||
(if (/= oldMovedPoints movedPoints) (setq movedElems (1+ movedElems)))
|
||||
)
|
||||
); line end
|
||||
(progn
|
||||
(print )
|
||||
(princ " This element is not line or polyline!")
|
||||
)
|
||||
)
|
||||
|
||||
;while specific:
|
||||
(setq i (1+ i));increments i
|
||||
(if (= i il) (setq imax nil));finish function if i equals il
|
||||
)
|
||||
|
||||
(terpri)
|
||||
(princ movedPoints)
|
||||
(princ " point(s) moved to the desired location")
|
||||
(terpri)
|
||||
(princ movedElems)
|
||||
(princ " element(s) modified")
|
||||
|
||||
(setq ss nil)
|
||||
(princ)
|
||||
)
|
||||
Reference in New Issue
Block a user