明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 377|回复: 12

[提问] 如何实现相同图元连线?

[复制链接]
发表于 前天 10:34 | 显示全部楼层 |阅读模式
各位大佬,工作中(主要是改模)经常要找到相同的图元,当图档很大东西很多的时候就特别费劲(如下图),看到了这个相同文字连线的程序:http://bbs.mjtd.com/forum.php?mo ... hlight=%C1%AC%CF%DF,如果把同一图层的相同的图元(直线圆多段线等)用线连起来,这样一目了然,省去了很多查找时间,请大师们帮忙看看,谢谢!


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 前天 15:57 | 显示全部楼层
查找最多相同图元就如下图示,异形多段线,圆,矩形等,在论坛上找到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_ang  x))                ;判断物体角度取包围框周长及面积值
                                   (if (and (= (car  pea)(car  peb))
                                            (= (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                                           ;回传 (周长值 ,面积值)
)
;--------------------------------------------------------------------------------------------------





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 前天 13:58 | 显示全部楼层
aws 发表于 2024-11-12 11:03
怎么判断相同是个麻烦,圆可以通过半径直径来判断,但是直线和多段线,就麻烦了。要不要考虑旋转

旋转是要,因为考虑到三视图摆放,谢谢!
 楼主| 发表于 前天 16:20 | 显示全部楼层
liuhe 发表于 2024-11-12 14:11
你要是想定制,可以加我沟通一下细节。主要是你要想清楚规律,如何定义为相同。比如,一个矩形,被旋转了18 ...

好的,旋转了依然算相同的
发表于 前天 11:03 | 显示全部楼层
怎么判断相同是个麻烦,圆可以通过半径直径来判断,但是直线和多段线,就麻烦了。要不要考虑旋转
发表于 前天 11:39 | 显示全部楼层
发表于 前天 12:19 | 显示全部楼层
小菜的选择易不是可以解决你的问题嘛
 楼主| 发表于 前天 14:02 | 显示全部楼层
ssyfeng 发表于 2024-11-12 12:19
小菜的选择易不是可以解决你的问题嘛

这个我试过了是可行,但有时候会多选或少选,有时候就有这么巧把不同同形状的选了
发表于 前天 14:11 | 显示全部楼层
你要是想定制,可以加我沟通一下细节。主要是你要想清楚规律,如何定义为相同。比如,一个矩形,被旋转了180度,是否是相同?
发表于 前天 14:12 | 显示全部楼层
可能你的需求更复杂些,你图上显示的选相同文字这些选择易是完全没问题的。如果针对不同形状的图形,感觉需要定制才能满足你
发表于 前天 14:15 | 显示全部楼层
本帖最后由 llsheng_73 于 2024-11-12 14:16 编辑

首先你得根据你的需求去定义你的相同,然后根据你的定义去找相同(这个过程可能会推翻关于相同的定义,所以定义和实现可能需要反复)....最后就简单了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-14 14:26 , Processed in 0.245564 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表