多重引线属性快中属性修改的方法
修改多重引线块中属性的方法,包含几个子函数,需要的朋友可参考。等空了录个gif演示下。;;子函数:
;;1.获取多重引线对象某个属性
;;2.设置多重引线某个属性的值
;;3.获取多重引线的属性值列表
;;4.批量设置某多重引线属性值
;;5.对vla对象集合中,将多重引线中符合wcmatch的属性标签的多重引线筛选出来
;;1.(zr-ml-getatt vl-ml flagstr att-tag) -> value
;;调用:(zr-ml-getatt (vl-en0) "PROMPTSTRING" "尺寸")
;;说明:获取多重引线对象某个属性
;;参数:vlen0:多重引线的vla对象
;;参数:flagstr:标签,可选择"PROMPTSTRING"或"TAGSTRING"
;;参数:att-tag:块中属性的标签,可按PROMPTSTRING或TAGSTRING进行选择
;;返回:属性值
(defun zr-ml-getatt (vlen0 flagstr att-tag / )
(cdr (assoc att-tag (zr-ml-getatts vlen0 flagstr)))
)
;;2.(zr-ml-setatt vl-ml flagstr att-tag att-value) -> Attribute value if successful, else nil.
;;调用 (zr-ml-setatt (vl-en0) "PROMPTSTRING" "尺寸" "500*500")
;;说明:设置多重引线某个属性的值
;;参数:vlen0:多重引线的vla对象
;;参数:flagstr:标签,可选择"PROMPTSTRING"或"TAGSTRING"
;;参数:att-tag:块中属性的标签,可按PROMPTSTRING或TAGSTRING进行选择
;;参数:att-value:要设置的属性值
;;返回:无
(defun zr-ml-setatt (vlen0 flagstr att-tag att-value / id blk-name blk)
(if (or (= (strcase flagstr) "PROMPTSTRING") (= (strcase flagstr) "TAGSTRING"))
(progn
(if (not (= "" (setq blk-name (vla-get-ContentBlockName vlen0))))
(progn
(setq blk (vla-Item (vla-get-Blocks (zr-dqwd)) blk-name))
(vlax-for o blk
(if (= "AcDbAttributeDefinition" (vla-get-ObjectName o))
(if (= (strcase (vlax-get-property o flagstr)) (strcase att-tag))
(setq id (vla-get-ObjectID o))
)
)
)
)
)
)
)
(vla-SetBlockAttributeValue vlen0 id att-value)
(princ)
)
;;3.(zr-ml-getatts vl-ml flagstr) -> association list
;;调用:(zr-ml-getatts (vl-en0) "PROMPTSTRING")
;;调用:(zr-ml-getatts (vl-en0) "TAGSTRING")
;;说明:获取多重引线的属性值列表
;;参数:vlen0:多重引线的vla对象
;;参数:flagstr:标签,可选择"PROMPTSTRING"或"TAGSTRING"
;;返回:多重引线的属性值列表
(defun zr-ml-getatts (vlen0 flagstr /blk-name blk l3)
(if (or (= (strcase flagstr) "PROMPTSTRING") (= (strcase flagstr) "TAGSTRING"))
(progn
(if (not (= "" (setq blk-name (vla-get-ContentBlockName vlen0))))
(progn
(setq blk (vla-Item (vla-get-Blocks (zr-dqwd)) blk-name))
(vlax-for o blk
(if (= "AcDbAttributeDefinition" (vla-get-ObjectName o))
(setq l3
(cons
(cons
(vlax-get-property o flagstr) (vla-GetBlockAttributeValue vlen0 (vla-get-ObjectID o))
)
l3
)
)
)
)
)
)
(setq l3 (reverse l3))
)
)
)
;;4.(zr-ml-setatts vl-ml flagstr ((<tag> . <value>)...))
;;调用:(zr-ml-setatts (vl-en0) "PROMPTSTRING" '(("尺寸" . "100*100") ("个数" . 2)))
;;说明:批量设置某多重引线属性值
;;参数:vlen0:多重引线的vla对象
;;参数:flagstr:标签,可选择"PROMPTSTRING"或"TAGSTRING"
;;参数:asslist:关联表,形如((<tag> . <value>)...))样式
;;返回:无
(defun zr-ml-setatts (vlen0 flagstr asslist / )
(mapcar '(lambda (x) (zr-ml-setatt vlen0 flagstr (car x) (cdr x)))
asslist
)
(princ)
)
;;5.(zr-ml-searchatts ss flagstr att-tag match-str) -> vla list which att-tag match match-str
;;调用:(zr-ml-searchatts (ss->ssvlalist (ssget "_X" '((0 . "MULTILEADER")))) "PROMPTSTRING" "风口" "GP")
;;说明:对vla对象集合中,将多重引线中符合wcmatch的属性标签的多重引线筛选出来
;;参数:vlalist:vla对象的list,可由ss->ssvlalist函数将ss转化而来
;;参数:flagstr:"PROMPTSTRING" 或 "TAGSTRING",用于指定按属性的哪种标签选择
;;参数:att-tag:属性的标签,如“风口”
;;参数:match-str:属性的值所要匹配的字符串模式,如风口为AV AV/D,模式为AV*,选择所有AV开头的风口
;;返回:list,里面为符合条件的vla对象
(defun zr-ml-searchatts (vlalist flagstr att-tag match-str / i vlen0 sum blk-name blk)
(foreach vlen0 vlalist
(if (and
(strcase= (vla-get-ObjectName vlen0) "AcDbMLeader")
(not (= "" (setq blk-name (vla-get-ContentBlockName vlen0))))
)
(progn
(setq blk (vla-Item (vla-get-Blocks (zr-dqwd)) blk-name))
(vlax-for o blk
(if (= "AcDbAttributeDefinition" (vla-get-ObjectName o))
(if (strcase= (vlax-get-property o flagstr) att-tag)
(if (strcase-wcmatch (vla-GetBlockAttributeValue vlen0 (vla-get-ObjectID o)) match-str)
(setq sum (cons vlen0 sum))
)
)
)
)
)
)
)
(setq sum (reverse sum))
)
;;其余功能子函数
(defun zr-dqwd ( / )
(vla-get-ActiveDocument (vlax-get-acad-object)))
(defun strcase= (a b / )
(if (and (= (type a) 'STR) (= (type b) 'STR))
(= (strcase a) (strcase b))
(= a b)
)
)
(defun strcase-wcmatch (str pat / )
(wcmatch (strcase str) (strcase pat))
)
感谢 Zrrrrr 分享程序!!!! 学习一下,谢谢楼主分享 这是好东西啊,为啥没人顶呢
页:
[1]