cj52000 发表于 2024-11-12 10:34:45

如何实现相同图元连线?

各位大佬,工作中(主要是改模)经常要找到相同的图元,当图档很大东西很多的时候就特别费劲(如下图),看到了这个相同文字连线的程序:http://bbs.mjtd.com/forum.php?mod=viewthread&tid=112791&highlight=%C1%AC%CF%DF,如果把同一图层的相同的图元(直线圆多段线等)用线连起来,这样一目了然,省去了很多查找时间,请大师们帮忙看看,谢谢!


cj52000 发表于 2024-11-12 15:57:20

查找最多相同图元就如下图示,异形多段线,圆,矩形等,在论坛上找到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                                           ;回传 (周长值 ,面积值)
)
;--------------------------------------------------------------------------------------------------





cj52000 发表于 2024-11-14 16:19:25

pxt2001 发表于 2024-11-14 08:17
相同图元,相同的定义太笼统了,各种不同类型统一到一个程序很复杂,小菜选择易已经很惊艳了,而且是源码。 ...

谢谢,是有办法找到,只是想再快一些,不纠结了

cj52000 发表于 2024-11-12 13:58:53

aws 发表于 2024-11-12 11:03
怎么判断相同是个麻烦,圆可以通过半径直径来判断,但是直线和多段线,就麻烦了。要不要考虑旋转

旋转是要,因为考虑到三视图摆放,谢谢!

aws 发表于 2024-11-12 11:03:17

怎么判断相同是个麻烦,圆可以通过半径直径来判断,但是直线和多段线,就麻烦了。要不要考虑旋转

vitalgg 发表于 2024-11-12 11:39:04

选择相似线

https://www.bilibili.com/video/BV1Ym421379o/?vd_source=f238933ef363feb9bc3ceff41b386f5c

ssyfeng 发表于 2024-11-12 12:19:43

小菜的选择易不是可以解决你的问题嘛

cj52000 发表于 2024-11-12 14:02:30

ssyfeng 发表于 2024-11-12 12:19
小菜的选择易不是可以解决你的问题嘛

这个我试过了是可行,但有时候会多选或少选,有时候就有这么巧把不同同形状的选了:L

liuhe 发表于 2024-11-12 14:11:48

你要是想定制,可以加我沟通一下细节。主要是你要想清楚规律,如何定义为相同。比如,一个矩形,被旋转了180度,是否是相同?

ssyfeng 发表于 2024-11-12 14:12:03

可能你的需求更复杂些,你图上显示的选相同文字这些选择易是完全没问题的。如果针对不同形状的图形,感觉需要定制才能满足你

llsheng_73 发表于 2024-11-12 14:15:44

本帖最后由 llsheng_73 于 2024-11-12 14:16 编辑

首先你得根据你的需求去定义你的相同,然后根据你的定义去找相同(这个过程可能会推翻关于相同的定义,所以定义和实现可能需要反复)....最后就简单了
页: [1] 2
查看完整版本: 如何实现相同图元连线?