有没有这样一个api函数,求一个实体与选择集中实体最近的图元及其最近点
本帖最后由 dyjwyqz5221 于 2020-8-20 09:57 编辑参照之前大师们的指导及插件,这样一个函数是可以求出一条多段线或text文字距离多段线或文字选择集中最近图元及最近点的。
有没有这样的api函数呢,当然我水平有限,还不能罗列其他类型的实体。
(defun get::nearent (e ss / g1 get::g)
(defun get::g (e)
(cond
((xdrx-object-isa e "AcDbPolyline")
(xdge::constructor e)
)
((xdrx-object-isa e "AcDbText")
(xdge::constructor "kcompositecrv3d" (xdrx-text-box e))
)
);;;cond
);;;defun
(cond
((equal (type ss) 'ENAME)
(setq ss (list ss)) )
(( equal (type ss) 'pickset)
(setq ss (xdrx-pickset->ents ss))
)
);;;cond
(setq g1 (get::g e))
(cadar
(vl-sort
(mapcar
'(lambda(x / g2 ints)
(setq g2 (get::g x))
(setq ints (xdge::getpropertyvalue g1 "closestPointTo" g2))
(list (apply 'distance ints) (cons x ints))
);;;lambda
ss
);;;mapcar
'(lambda (a b)
(< (car a) (car b))
)
)
);;;cadar
)
dyjwyqz5221 发表于 2020-8-20 11:25
有时候,要查找边框最近的实体
下载 2020.08.21 API
(xdrx-getpropertyvalue ent "GetClosestEnts" <ss or ent.....>)
命令: (xdrx-getpropertyvalue ent "GetClosestEnts" (ssget))
选择对象: 找到 1 个
选择对象: 指定对角点: 找到 2 个,总计 3 个
选择对象:
((<图元名: 21ef7ad9190> (696.698 -303.839 0.0)) (<图元名: 21ef7ad9190> (696.698 -303.839 0.0))) 最近你是指从哪算呢?
你可以求实体的型心代替实体去找 有时候,要查找边框最近的实体 本帖最后由 newer 于 2020-8-20 13:28 编辑
dyjwyqz5221 发表于 2020-8-20 11:25
有时候,要查找边框最近的实体
那你就用包围盒四个顶点,建立个几何实体,用 closestpointto 去找其他最近的曲线 本帖最后由 newer 于 2020-8-20 16:20 编辑
(defun xd::geom:getnearpt (e1 ss / box dis g1 ge ge1 ges lst ret x y)
(if (= (type ss) 'pickset)
(setq ss (xdrx-pickset->ents ss))
)
(setq lst (mapcar '(lambda (x)
(cond ((xdrx-object-iskindof x "acdbcurve")
(setq ge (xdge::constructor x))
)
((xdrx-object-iskindof x "acdbtext")
(setq ge (xdge::constructor
"kcompositecrv3d"
(xd::pnts:close (xdrx-text-box x))
)
)
)
(t
(setq box (xdrx-points-ucs2wcs (xdrx-entity-box x))
ge (xdge::constructor "kcompositecrv3d"
(xd::pnts:close box)
)
)
)
)
(setq ges (cons ge ges))
(list ge x)
)
ss
)
g1(if (not (xdrx-object-iskindof e1 "acdbcurve"))
(progn (setq ge1 (xdge::constructor "kcompositecrv3d"
(xd::pnts:close (xdrx-entity-box e1))
)
ges (cons ge1)
)
ge1
)
e1
)
lst (mapcar '(lambda (x)
(setq ret (xdrx-getpropertyvalue g1
"getclosestpointto"
(car x)
)
dis (apply 'distance ret)
)
(list dis (list e1 (car ret))(list (cadr x)(cadr ret)))
)
lst
)
lst (vl-sort lst '(lambda (x y) (< (car x) (car y))))
)
(xdrx-free ges)
(cdar lst)
)
命令: (setq a (XD::GEOM:GETNEARPT e ss))
((<图元名: 16c2dce9b70> (1413.73 -1519.64 0.0)) (<图元名: 16c2dce9b80> (1995.16 -55.6127 0.0)))
本帖最后由 pxt2015 于 2021-4-15 21:45 编辑
图元名与图元名(选择集)最近点,这个功能很强大。
(setq xd-getval xdrx_getpropertyValue)
(setq a (xd-getval en "GetClosestEnts" ss或en))
;;返回 ((en1 pt1) (en2 pt2))
(xdrx-line-make (mapcar 'cadr a))
以上代码运行效果如截图所示(箭头是另外加的,表示en和ss谁主动)
XDSoft 发表于 2020-8-20 09:54
下载 2020.08.21 API
(xdrx-getpropertyvalue ent "GetClosestEnts" )
查找文字图元距离文字选择集中最近文字时,是不可以。 终于测试出来了,可以采用这个来使用:
(xdrx-getpropertyvalue (xdrx-text-box (car(entsel))) "GetClosestEnts" (ssget))
返回的结果为:
((<图元名: b602a4> (1.94404e+006 933331.0 0.0)) (<图元名: 7ff469ef2210> (1.94371e+006 933331.0 0.0)))
前面这个点为文字上的点,后面这个为拟查找的文字选择集上最近的图元及点。
(xdrx-getpropertyvalue (XD::PnTs:Close (xdrx-text-box (car(entsel)))) "GetClosestEnts" (ssget))
这样使用更准确,是从文字的周边查找与选择最近的点。
页:
[1]