Zrrrrr 发表于 2018-4-6 12:16:39

多重引线属性快中属性修改的方法

修改多重引线块中属性的方法,包含几个子函数,需要的朋友可参考。等空了录个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))
)




yoyoho 发表于 2018-4-13 23:49:54

感谢 Zrrrrr 分享程序!!!!

pengfei2010 发表于 2018-12-7 13:57:14

学习一下,谢谢楼主分享

qq1254582201 发表于 2019-6-19 17:13:15

这是好东西啊,为啥没人顶呢
页: [1]
查看完整版本: 多重引线属性快中属性修改的方法