fjutcivil 发表于 2014-4-22 20:42:50

如何选择离文字最近的直线

如题,如何判断出离文字最近的线,并选择它,eg:一个文字周围有很多直线,我先选择了文字,然后框选周围所有的线,希望能选出最近的线。       主要是不懂怎么去实习这个判断的过程。最终的目的是框选所有文字,文字平行到离它最近的直线,直线可能是斜的

llsheng_73 发表于 2014-4-23 19:35:04

本帖最后由 llsheng_73 于 2014-4-23 20:53 编辑

这个我只会用笨办法,选出所有直线,计算它到文字的距离(用文字的哪个点呢?)取出距离最小的一个
(setq a(car(entsel"选取文字")))
(setq p(cdr(assoc 10(entget a)))i 0);;不清楚楼主的具体情况,暂时用10组的坐标吧
(setq ss(ssget"X" '((0 . "LINE"))));;;(setq ss(ssget '((0 . "LINE"))))
(repeat (sslength ss)
   (setq en(ssname ss i)i(1+ i)
            ens(cons(cons en(distance(vlax-curve-getClosestPointTo(vlax-ename->vla-object en)p)p))ens)))
(sssetfirst(ssadd(caar(vl-sort ens (function(lambda(e1 e2)(<(cdr e1)(cdr e2))))))))

tengte 发表于 2014-4-23 21:21:09

还有一个思路:以选中的文字位置为中心,根据你的需求指定一个长度构建一个正方形(或其它形状的区域),用“窗交”的方式选择直线,其它地方与llsheng_73的程序相同。若直线很多时,这样选择可以大大地提高速度,尤其是要处理的文字也较多时。但选择一个适当的长度是关键!

xyp1964 发表于 2014-4-24 13:38:25

本帖最后由 xyp1964 于 2014-4-24 13:40 编辑

(if (and (setq s1 (car (entsel "\n选取文字: ")))
         (setq ss (ssget '((0 . "LINE"))))
    )
(progn
    (setq pt (cdr (assoc 10 (entget s1)))
          lst '()
          i   -1
    )
    (repeat (sslength ss)
      (setq s1 (ssname ss (setq i (1+ i)))
            l1 (distance (vlax-curve-getClosestPointTo s1 pt) pt)
            lst (cons (list s1 l1) lst)
      )
    )
    (caar (vl-sort lst '(lambda (x y) (< (cadr x) (cadr y)))))
)
)

819534890 发表于 2014-4-24 15:23:46

本帖最后由 819534890 于 2014-4-24 16:17 编辑

还要看看你怎样理解“最近”这个概念:
1、离文字插入点最近,这个比较容易实现;
2、离文字范围内某个指定点(例如下中点、中心点)最近,稍微复杂但不难;
3、如果是整个文字范围(包围盒)的最近点,就比较复杂,要判断线与矩形的最近距离,还要判断线与文字相交的情况。

fjutcivil 发表于 2014-4-28 09:53:37

xyp1964 发表于 2014-4-24 13:38 static/image/common/back.gif


院长 我按你的那个写了个类似的,但是想再判断个文字是上下的 ,求指点啊 http://bbs.xdcad.net/thread-673496-1-1.html
页: [1]
查看完整版本: 如何选择离文字最近的直线