Yes, Lee's code is surely what you're looking for... But I suggest you that you nevertheless use code that operates in 3D... Here are 2 simple examples... Much shorter than my one with transptucs and transptwcs functions... Again, Lee's sub function LM:Collinear-p is involved :
Code:
;; Collinear-p - Lee Mac
;; Returns T if p1,p2,p3 are collinear
(defun LM:Collinear-p ( p1 p2 p3 )
(
(lambda ( a b c )
(or
(equal (+ a b) c 1e-8)
(equal (+ b c) a 1e-8)
(equal (+ c a) b 1e-8)
)
)
(distance p1 p2) (distance p2 p3) (distance p1 p3)
)
)
(defun nor ( v )
(polar '(0 0 0) (+ (angle '(0 0 0) v) (/ PI 2)) 1.0)
)
(defun pld ( a b p / ab nab pp ppp d )
(setq ab (mapcar '- b a))
(setq nab (nor ab))
(setq pp (mapcar '+ p nab))
(setq ppp (inters a b p pp nil))
(setq d (distance p ppp))
d
)
(defun c:ptmirror ( / pt1 pt2 pt pt1w pt2w ptw d pt3 pt4 )
(if (setq pt1 (getpoint "\nFirst point on line : ")
pt2 (getpoint "\nSecond point on line : " pt1)
pt (getpoint "\nPoint at dist from line : ")
)
(progn
(setq pt1w (trans pt1 1 0)
pt2w (trans pt2 1 0)
ptw (trans pt 1 0)
)
(vl-cmdf "_.UCS" "3p" pt pt1 pt2)
(setq pt1 (trans pt1w 0 1)
pt2 (trans pt2w 0 1)
pt (trans ptw 0 1)
)
(setq d (pld pt1 pt2 pt))
(setq pt3 (polar pt (+ (angle pt1 pt2) (/ pi 2.0)) d))
(if (null (LM:Collinear-p pt1 pt2 pt3))
(setq pt3 (polar pt (- (angle pt1 pt2) (/ pi 2.0)) d))
)
(setq pt4 (polar pt3 (angle pt pt3) d))
(entmakex (list '(0 . "LINE") (cons 10 pt1w) (cons 11 pt2w)))
(entmakex (list '(0 . "LINE") (cons 10 ptw) (cons 11 (trans pt4 1 0))))
(vl-cmdf "_.UCS" "p")
)
)
(princ)
)
And here is addition - c:projptonline
Code:
;; Collinear-p - Lee Mac
;; Returns T if p1,p2,p3 are collinear
(defun LM:Collinear-p ( p1 p2 p3 )
(
(lambda ( a b c )
(or
(equal (+ a b) c 1e-8)
(equal (+ b c) a 1e-8)
(equal (+ c a) b 1e-8)
)
)
(distance p1 p2) (distance p2 p3) (distance p1 p3)
)
)
(defun nor ( v )
(polar '(0 0 0) (+ (angle '(0 0 0) v) (/ PI 2)) 1.0)
)
(defun pld ( a b p / ab nab pp ppp d )
(setq ab (mapcar '- b a))
(setq nab (nor ab))
(setq pp (mapcar '+ p nab))
(setq ppp (inters a b p pp nil))
(setq d (distance p ppp))
d
)
(defun c:projptonline ( / pt1 pt2 pt pt1w pt2w ptw d pt3 )
(if (setq pt1 (getpoint "\nFirst point on line : ")
pt2 (getpoint "\nSecond point on line : " pt1)
pt (getpoint "\nPoint at dist from line : ")
)
(progn
(setq pt1w (trans pt1 1 0)
pt2w (trans pt2 1 0)
ptw (trans pt 1 0)
)
(vl-cmdf "_.UCS" "3p" pt pt1 pt2)
(setq pt1 (trans pt1w 0 1)
pt2 (trans pt2w 0 1)
pt (trans ptw 0 1)
)
(setq d (pld pt1 pt2 pt))
(setq pt3 (polar pt (+ (angle pt1 pt2) (/ pi 2.0)) d))
(if (null (LM:Collinear-p pt1 pt2 pt3))
(setq pt3 (polar pt (- (angle pt1 pt2) (/ pi 2.0)) d))
)
(entmakex (list '(0 . "LINE") (cons 10 pt1w) (cons 11 pt2w)))
(entmakex (list '(0 . "LINE") (cons 10 ptw) (cons 11 (trans pt3 1 0))))
(vl-cmdf "_.UCS" "p")
)
)
(princ)
)
Regards, M.R.
Bookmarks