dyjwyqz5221 发表于 2020-8-20 09:54:09

有没有这样一个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
)





XDSoft 发表于 2020-8-20 09:54:10

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 10:29:36

最近你是指从哪算呢?
你可以求实体的型心代替实体去找

dyjwyqz5221 发表于 2020-8-20 11:25:52

有时候,要查找边框最近的实体

newer 发表于 2020-8-20 13:24:31

本帖最后由 newer 于 2020-8-20 13:28 编辑

dyjwyqz5221 发表于 2020-8-20 11:25
有时候,要查找边框最近的实体
那你就用包围盒四个顶点,建立个几何实体,用 closestpointto 去找其他最近的曲线

newer 发表于 2020-8-20 15:57:06

本帖最后由 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:37:23

本帖最后由 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谁主动)





dyjwyqz5221 发表于 2021-4-17 22:08:55

XDSoft 发表于 2020-8-20 09:54
下载 2020.08.21 API

(xdrx-getpropertyvalue ent "GetClosestEnts" )


查找文字图元距离文字选择集中最近文字时,是不可以。

dyjwyqz5221 发表于 2021-5-9 09:50:23

终于测试出来了,可以采用这个来使用:
(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)))
前面这个点为文字上的点,后面这个为拟查找的文字选择集上最近的图元及点。

dyjwyqz5221 发表于 2021-8-17 14:40:11

(xdrx-getpropertyvalue (XD::PnTs:Close (xdrx-text-box (car(entsel)))) "GetClosestEnts" (ssget))
这样使用更准确,是从文字的周边查找与选择最近的点。
页: [1]
查看完整版本: 有没有这样一个api函数,求一个实体与选择集中实体最近的图元及其最近点