指向ano内部或外部
你好我如何知道一个点是在另一个实体的内部还是外部:圆、矩形、多段线、样条线。。。。当做
(defun GroupByNum ( lst n / r)
(if lst
(cons
(reverse (repeat n (setq r (cons (car lst) r) lst (cdr lst)) r))
(GroupByNum lst n)
)
)
)
(defun ptonline ( pt pt1 pt2 / vec12 vec1p d result )
(setq vec12 (mapcar '- pt2 pt1))
(setq vec12 (reverse (cdr (reverse vec12))))
(setq vec1p (mapcar '- pt pt1))
(setq vec1p (reverse (cdr (reverse vec1p))))
(setq vec2p (mapcar '- pt2 pt))
(setq vec2p (reverse (cdr (reverse vec2p))))
(setq d (distance '(0.0 0.0) vec12) d1 (distance '(0.0 0.0) vec1p) d2 (distance '(0.0 0.0) vec2p))
(if (equal d (+ d1 d2) 1e- (setq result T) (setq result nil))
result
)
(defun ptinsideent ( pt ent / msp ptt xlin int k kk tst result )
(vl-load-com)
(setq msp (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
(setq ptt (vlax-curve-getclosestpointto ent pt))
(setq xlin (vla-addxline msp (vlax-3d-point pt) (vlax-3d-point ptt)))
(setq int (GroupByNum (vlax-invoke (if (eq (type ent) 'ENAME) (vlax-ename->vla-object ent)) 'intersectwith xlin acExtendBoth) 3))
(setq int (vl-sort int '(lambda (a b) (< (vlax-curve-getparamatpoint xlin a) (vlax-curve-getparamatpoint xlin b)))))
(setq k 0)
(while (< (setq k (1+ k)) (length int))
(if (and (eq (rem k 2) 1) (ptonline pt (nth (- k 1) int) (nth k int))) (setq tst (cons T tst)) (setq tst (cons nil tst)))
)
(setq tst (reverse tst))
(setq k 0)
(mapcar '(lambda (x) (setq k (1+ k)) (if (eq x T) (setq kk k))) tst)
(vla-delete xlin)
(if kk
(if (eq (rem kk 2) 1) (setq result T) (setq result nil))
(setq result nil)
)
result
)
(ptinsideent pt ent) => T or nil
M、 R。 你好,marko_ribar。效果很好。太棒了。非常感谢你。 马尔科,有个小问题。当de点属于多段线时,不起作用。 命令:(vl catch all apply’PTINSIDENT(list pt ent))
#
-pt位于ent上
-如果要返回T(pt位于ent上,可能不在ent内部或外部),请使用:
(vl-catch-all-error-p(vl catch all apply’PTINSIDENT(list pt ent)))
命令:(vl catch all apply’PTINSIDENT(list pt ent))
T
-pt在ent内
命令:(vl catch all apply’PTINSIDENT(list pt ent))
无
-pt在ent之外
(if (vl-catch-all-error-p (vl-catch-all-apply 'ptinsideent (list pt ent)))
(prompt "\nPoint is on entity")
(if (ptisideent pt ent)
(prompt "\nPoint is inside entity")
(prompt "\nPoint is outside entity")
)
)
非常感谢你,马尔科。现在它工作得很好。
页:
[1]