Jozef13 发表于 2022-7-5 15:09:07

选择所有相交的块

尊敬的各位:,
我正在寻找lisp来选择通过特定多段线相交的所有块。
我有多段线绘制的通风管道系统方案,其中插入了流量阻尼器。
我的多段线具有与风管尺寸相对应的特定线型。
因此,我想选择,例如,位于线型为“TZB_100”的多段线上的所有块,然后我可以将值100写入flow damper block Attibute tag“SIZE”。
其次,其他尺寸125、160。。。。
 
最后,我可以创建特定流量阻尼器和其他组件的数量清单。
计划图纸

Tharwat 发表于 2022-7-5 15:34:21

你好
 
就这样吧。
 

(defun c:Test (/ int sel ent get bks lws ins)
;;        Tharwat . Date: 17.Jun.2018        ;;
(and
   (setq int -1
         sel (ssget "_:L"
                  '((-4 . "<OR")
                      (-4 . "<AND")
                      (0 . "LWPOLYLINE")
                      (6 . "TZB_100,TZB_125,TZB_160")
                      (-4 . "AND>")
                      (-4 . "<AND")
                      (0 . "INSERT")
                      (2 . "dn_cu")
                      (-4 . "AND>")
                      (-4 . "OR>")
                     )
             )
   )
   (progn
   (while (setq ent (ssname sel (setq int (1+ int))))
       (if (= (cdr (assoc 0 (setq get (entget ent)))) "INSERT")
         (setq bks (cons get bks))
         (setq lws (cons get lws))
       )
   )
   (and bks lws)
   )
   (foreach lw lws
   (foreach bk bks
       (and
         (setq ins (cdr (assoc 10 bk)))
         (equal (distance
                  (vlax-curve-getclosestpointto (cdr (assoc -1 lw)) ins)
                  ins
                )
                0.0
                1e-4
         )
         (vl-some
         '(lambda (att)
            (and
                (eq (vla-get-tagstring att) "DN")
                (vla-put-textstring att (substr (cdr (assoc 6 lw)) 5))
            )
            )
         (vlax-invoke
             (vlax-ename->vla-object (cdr (assoc -1 bk)))
             'getattributes
         )
         )
         (setq bks (vl-remove bk bks))
       )
   )
   )
)
(princ)
) (vl-load-com)

Jozef13 发表于 2022-7-5 15:48:53

完美的塔尔瓦特,
首先,我很困惑,因为在我看来它什么都没做。
但是当我看到这些代码时,我意识到它可以工作,但它可以与“dn\u cu”块和属性标记“dn”一起工作,而不是与“Flow damper JL”块和标记“SIZE”一起工作。
当我改变它时,它完全符合我的需要。
 
你对我的帮助超出了我的预期:)
 
“Flow damper JL”块存在一个小问题,因为它是动态块,如果它是动态旋转的,则显示为匿名(块名:“Flow damper JL”,匿名名称:“*U20”),并且不是由代码选择的。
 
是否可以修改它以根据原始名称选择块?

Tharwat 发表于 2022-7-5 15:55:47

嗨,Jozef,
 
很抱歉,由于工作负荷过重,回复时间太晚。
 
我已经修改了程序,将动态块“Flow Damper JL”和相关标记字符串“SIZE”包括在内,因此请尝试以下程序并告诉我。
 

(defun c:Test (/ int sel ent get obj bks lws ins)
;;        Tharwat . Date: 19.Jun.2018        ;;
(and
   (setq int -1
         sel (ssget "_:L"
                  '((-4 . "<OR")
                      (-4 . "<AND")
                      (0 . "*POLYLINE")
                      (6 . "TZB_100,TZB_125,TZB_160")
                      (-4 . "AND>")
                      (-4 . "<AND")
                      (0 . "INSERT")
                      (2 . "`*U*,Flow damper-JL,dn_cu")
                      (-4 . "AND>")
                      (-4 . "OR>")
                     )
             )
   )
   (progn
   (while (setq ent (ssname sel (setq int (1+ int))))
       (cond ((wcmatch (cdr (assoc 0 (setq get (entget ent)))) "*LINE")
            (setq lws (cons get lws))
             )
             ((wcmatch (vla-get-effectivename
                         (setq obj (vlax-ename->vla-object ent))
                     )
                     "Flow damper-JL,dn_cu"
            )
            (setq bks (cons (list obj get) bks))
             )
       )
   )
   (and bks lws)
   )
   (foreach lw lws
   (foreach bk bks
       (and
         (setq ins (cdr (assoc 10 (cadr bk))))
         (or (equal
               (distance
               (vlax-curve-getclosestpointto (cdr (assoc -1 lw)) ins)
               ins
               )
               0.0
               1e-4
             )
             (vlax-invoke
               (car bk)
               'intersectwith
               (vlax-ename->vla-object (cdr (assoc -1 lw)))
               AcExtendnone
             )
         )
         (vl-some
         '(lambda (att)
            (and
                (wcmatch (vla-get-tagstring att) "DN,SIZE")
                (progn (vla-put-textstring att (substr (cdr (assoc 6 lw)) 5)) t)
            )
            )
         (vlax-invoke (car bk) 'getattributes)
         )
         (setq bks (vl-remove bk bks))
       )
   )
   )
)
(princ)
) (vl-load-com)

Jozef13 发表于 2022-7-5 16:10:37

非常感谢你。
它工作完美:
如果你能抽出时间的话,我有个新主意。
是否可以基于位于同一多段线上的主块属性修改次块属性?
我描述了原因:
当我创建由多段线绘制的通风管道系统方案时,我在每个具有不同气流的段上插入块“dn\u cu”。
然后我对段进行编号(“CU”标记),并添加以m3/h为单位的气流(“V”标记)。
之后,我将所有属性导出到excel,并对风管尺寸(“DN”标记)进行尺寸标注,然后将其导入回AutoCAD。
因此,“dn\u cu”块是我的主要块,包含有关管道方案的信息。
然后,我需要修改辅助块ar块(阻尼器、衰减器等)的“大小”属性最后根据“DN”属性更改多段线线段的线型。
页: [1]
查看完整版本: 选择所有相交的块