如何选择离文字最近的直线
如题,如何判断出离文字最近的线,并选择它,eg:一个文字周围有很多直线,我先选择了文字,然后框选周围所有的线,希望能选出最近的线。 主要是不懂怎么去实习这个判断的过程。最终的目的是框选所有文字,文字平行到离它最近的直线,直线可能是斜的本帖最后由 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)))))))) 还有一个思路:以选中的文字位置为中心,根据你的需求指定一个长度构建一个正方形(或其它形状的区域),用“窗交”的方式选择直线,其它地方与llsheng_73的程序相同。若直线很多时,这样选择可以大大地提高速度,尤其是要处理的文字也较多时。但选择一个适当的长度是关键! 本帖最后由 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 16:17 编辑
还要看看你怎样理解“最近”这个概念:
1、离文字插入点最近,这个比较容易实现;
2、离文字范围内某个指定点(例如下中点、中心点)最近,稍微复杂但不难;
3、如果是整个文字范围(包围盒)的最近点,就比较复杂,要判断线与矩形的最近距离,还要判断线与文字相交的情况。 xyp1964 发表于 2014-4-24 13:38 static/image/common/back.gif
院长 我按你的那个写了个类似的,但是想再判断个文字是上下的 ,求指点啊 http://bbs.xdcad.net/thread-673496-1-1.html
页:
[1]