关于点与多个闭合多段线的关系
; a way to find a closed polyline by point inside;Lee Mac
(defun polyfrominsidepoint ( p / e i r s )
(if
(setq i -1 s
(ssget "_X"
(list '(0 . "LWPOLYLINE") '(-4 . "&=") '(70 . 1)
(if (= 1 (getvar 'cvport))
(cons 410 (getvar 'ctab))
'(410 . "Model")
)
)
)
)
(while (and (null r) (setq e (ssname s (setq i (1+ i)))))
(if (raycast p (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e))))
(setq r e)
)
)
)
r
)
(defun raycast ( p l )
(= 1
(logand 1
(length
(vl-remove 'nil
(mapcar
'(lambda ( a b ) (inters p (mapcar '+ p '(1e8 0.0)) a b))
(cons (last l) l)
l
)
)
)
)
)
)
(defun c:SelPolylinebyPoint ( / e p )
(if (setq p (getpoint "\nSpecify point: "))
(if (setq e (polyfrominsidepoint p))
(sssetfirst nil (ssadd e))
(princ "\nNo polyline found.")
)
)
(princ)
)
以上代码是已知一个点和很多封闭的多段线,快速确定出包含这个点的多段线,但默认选择面积最大那个,而不是最小那个。
即运行结果是选择B,而我想选择A,这要如何实现呢?谢谢!
开源代码
;|函数功能,寻找包含pt点的最小封闭多边形
使用格式,(n5-minpl pt);1,PT是个坐标情况下;如果存在返回图元名,否则nil
(n5-minpl pt);1,PT是个坐标表情况下;如果存在返回与坐标表对应的图元名表,否则nil|;
(defun n5-minpl(pt / lst nlst)
(cond
((/= (type (car pt)) 'LIST)
(setq lst(mapcar 'cadr(ssnamex (ssget "f" (list pt (list (car pt)(+ 1000000(cadr pt))))))))
(setq lst (vl-remove-if-not'(lambda(x)(AND(= "LWPOLYLINE"(CDR(ASSOC 0 (ENTGET x))))(MEMBER (CDR(ASSOC 70 (ENTGET X)))(LIST 1 129))))LST))
(IF LST (SETQ NLST(CAR LST)) (SETQ NLST NIL)))
((= (type (car pt)) 'LIST)(FOREACH A PT (SETQ NLST (CONS (N5-MINPL A)NLST))))
)
(if (= 'LIST (TYPE NLST))(SETQ NLST(REVERSE nLST)) NLST)
) 当然这个还是存在挺大的缺陷,不过够用了 陈进佳 发表于 2016-2-21 10:31 static/image/common/back.gif
开源代码
真帅,谢谢! 陈进佳 发表于 2016-2-21 10:37 static/image/common/back.gif
当然这个还是存在挺大的缺陷,不过够用了
试用了,缺陷还是蛮大的,比如说当闭合多段线不是包含关系的时候就会产生错选。 yhly555 发表于 2016-2-21 16:08 static/image/common/back.gif
试用了,缺陷还是蛮大的,比如说当闭合多段线不是包含关系的时候就会产生错选。
对,已经做了处理
。不过不想上传了.累 陈进佳 发表于 2016-2-21 17:53 static/image/common/back.gif
对,已经做了处理
。不过不想上传了.累
大神,上传一下呗,学习一下,正好我现在也在编这个小程序
远方小山 发表于 2016-3-9 11:02 static/image/common/back.gif
大神,上传一下呗,学习一下,正好我现在也在编这个小程序
不愿找了。。。。。
页:
[1]