如何实现相同图元连线?
各位大佬,工作中(主要是改模)经常要找到相同的图元,当图档很大东西很多的时候就特别费劲(如下图),看到了这个相同文字连线的程序:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=112791&highlight=%C1%AC%CF%DF,如果把同一图层的相同的图元(直线圆多段线等)用线连起来,这样一目了然,省去了很多查找时间,请大师们帮忙看看,谢谢!查找最多相同图元就如下图示,异形多段线,圆,矩形等,在论坛上找到lee50310大师的一个程序,这个好像只支持矩形,帮忙参考看下
;;
;;找寻长宽相同的矩形(含有角度的矩形) by lee50310 2022/06/11
;;
;--------------------------------------------------------------------------------------------------
(defun c:SXXX( / ssa ss lst p1 p2 pea peb ang sel per)
(setq cmd (getvar 'cmdecho))
(setq os (getvar 'osmode))
(sssetfirst nil nil) ;取消先前亮显
(command "_.undo" "_begin")
(setvar 'cmdecho 0)
(setvar 'osmode 0)
(setq ssa(ssadd))
(setq en(car(entsel "\n选择一个矩形物(要找寻的):")))
(setq pea(chack_ang en)) ;判断物体角度取包围框周长及面积值
(princ "\n请圈选找寻物体的范围")
(setq ss(ssget '((0 . "LWPOLYLINE")(-4 . "<or")(70 . 1)(70 . 129)(-4 . "or>"))))
(setq lst((lambda(x)(vl-remove(last x)x))(mapcar 'cadr(ssnamex SS))));选集转图元串列
(foreach x lst
(setq peb (chack_angx)) ;判断物体角度取包围框周长及面积值
(if (and (= (carpea)(carpeb))
(= (cadr pea)(cadr peb))
)
(setq ssa(ssadd x ssa)) ;周长及面积值 相等加入选集
)
)
(command "_.undo" "_end")
(setvar 'osmode os)
(setvar 'cmdecho cmd)
(sssetfirst nil ssa) ;找到的物体亮显
(print (strcat "在圈选范围内找到长宽相同的矩形物共" (rtos(sslength ssa)2 0) "个"))
(princ)
)
;;------------------------------------------------------------------------------------------------
;取物体最小包围框并求周长及面积值
(defun obj_box_per(en / ll ur)
(vla-getboundingbox (vlax-ename->vla-object en) 'minpt 'maxpt)
(mapcar 'set '(minpt maxpt) (mapcar 'vlax-safearray->list (list minpt maxpt)))
(command "_.rectangle" "_non" minpt "_non" maxpt)
(command "area" "o" (entlast))
(entdel(entlast))
(setq an_area(rtos(getvar "area")2 2)) ;an_area 为面积(实数)
(setq an_per(rtos(getvar "perimeter")2 2));an_per为周长(实数)
(list an_per an_area)
)
;--------------------------------------------------------------------------------------------------
;;获取两顶点及角度
(defun get_vertex_point (Obj)
(setq sel(reverse(mapcar 'cdr (vl-remove-if-not '(lambda (x) (= 10 (car x))) (entget obj)))))
(setq p1(car sel) p2 (cadr sel) ang (read(rtos (/(angle p1 p2)(/ pi 180))2 0)) )
)
;--------------------------------------------------------------------------------------------------
;物体回正
(defun back_to_normal(ee)
(setq ds(distance p1 p2))
(setq pp(polar p1 0 ds))
(command "_rotate" ee "" "non" p1"r" "non" p1 "non" p2"non" pp) ;物体回正
)
;--------------------------------------------------------------------------------------------------
;判断物体角度并获取包围框周长及面积值
(defun chack_ang(ve)
(get_vertex_point ve) ;获取两顶点及角度
(if (or (= ang 0)(= ang 90)(= ang 180)(= ang 270));判断物体角度
(setq per(obj_box_per ve)) ;取物体包围框周长及面积值
(progn
(vl-cmdf "_undo" "mark") ;设画面记忆点
(back_to_normal ve) ;物体回正
(setq per(obj_box_per ve)) ;取物体包围框周长及面积值
(vl-cmdf "_undo" "back") ;恢复到记忆点画面
)
)
per ;回传 (周长值 ,面积值)
)
;--------------------------------------------------------------------------------------------------
pxt2001 发表于 2024-11-14 08:17
相同图元,相同的定义太笼统了,各种不同类型统一到一个程序很复杂,小菜选择易已经很惊艳了,而且是源码。 ...
谢谢,是有办法找到,只是想再快一些,不纠结了 aws 发表于 2024-11-12 11:03
怎么判断相同是个麻烦,圆可以通过半径直径来判断,但是直线和多段线,就麻烦了。要不要考虑旋转
旋转是要,因为考虑到三视图摆放,谢谢! 怎么判断相同是个麻烦,圆可以通过半径直径来判断,但是直线和多段线,就麻烦了。要不要考虑旋转 选择相似线
https://www.bilibili.com/video/BV1Ym421379o/?vd_source=f238933ef363feb9bc3ceff41b386f5c 小菜的选择易不是可以解决你的问题嘛 ssyfeng 发表于 2024-11-12 12:19
小菜的选择易不是可以解决你的问题嘛
这个我试过了是可行,但有时候会多选或少选,有时候就有这么巧把不同同形状的选了:L 你要是想定制,可以加我沟通一下细节。主要是你要想清楚规律,如何定义为相同。比如,一个矩形,被旋转了180度,是否是相同? 可能你的需求更复杂些,你图上显示的选相同文字这些选择易是完全没问题的。如果针对不同形状的图形,感觉需要定制才能满足你 本帖最后由 llsheng_73 于 2024-11-12 14:16 编辑
首先你得根据你的需求去定义你的相同,然后根据你的定义去找相同(这个过程可能会推翻关于相同的定义,所以定义和实现可能需要反复)....最后就简单了
页:
[1]
2