选择所有相交的块
尊敬的各位:,我正在寻找lisp来选择通过特定多段线相交的所有块。
我有多段线绘制的通风管道系统方案,其中插入了流量阻尼器。
我的多段线具有与风管尺寸相对应的特定线型。
因此,我想选择,例如,位于线型为“TZB_100”的多段线上的所有块,然后我可以将值100写入flow damper block Attibute tag“SIZE”。
其次,其他尺寸125、160。。。。
最后,我可以创建特定流量阻尼器和其他组件的数量清单。
计划图纸
你好
就这样吧。
(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)
完美的塔尔瓦特,
首先,我很困惑,因为在我看来它什么都没做。
但是当我看到这些代码时,我意识到它可以工作,但它可以与“dn\u cu”块和属性标记“dn”一起工作,而不是与“Flow damper JL”块和标记“SIZE”一起工作。
当我改变它时,它完全符合我的需要。
你对我的帮助超出了我的预期:)
“Flow damper JL”块存在一个小问题,因为它是动态块,如果它是动态旋转的,则显示为匿名(块名:“Flow damper JL”,匿名名称:“*U20”),并且不是由代码选择的。
是否可以修改它以根据原始名称选择块? 嗨,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)
非常感谢你。
它工作完美:
如果你能抽出时间的话,我有个新主意。
是否可以基于位于同一多段线上的主块属性修改次块属性?
我描述了原因:
当我创建由多段线绘制的通风管道系统方案时,我在每个具有不同气流的段上插入块“dn\u cu”。
然后我对段进行编号(“CU”标记),并添加以m3/h为单位的气流(“V”标记)。
之后,我将所有属性导出到excel,并对风管尺寸(“DN”标记)进行尺寸标注,然后将其导入回AutoCAD。
因此,“dn\u cu”块是我的主要块,包含有关管道方案的信息。
然后,我需要修改辅助块ar块(阻尼器、衰减器等)的“大小”属性最后根据“DN”属性更改多段线线段的线型。
页:
[1]