robierzo 发表于 2022-7-6 07:30:40

指向ano内部或外部

你好我如何知道一个点是在另一个实体的内部还是外部:圆、矩形、多段线、样条线。。。。
当做

marko_ribar 发表于 2022-7-6 07:45:37


(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。

robierzo 发表于 2022-7-6 07:55:21

你好,marko_ribar。效果很好。太棒了。非常感谢你。

robierzo 发表于 2022-7-6 08:08:01

马尔科,有个小问题。当de点属于多段线时,不起作用。

marko_ribar 发表于 2022-7-6 08:27:13

命令:(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")
)
)

robierzo 发表于 2022-7-6 08:39:16

非常感谢你,马尔科。现在它工作得很好。
页: [1]
查看完整版本: 指向ano内部或外部