AutoLISP程序需求:自动定位首个空IS属性并完成更新
解决方案:自动查找首个空IS属性并完成修订更新
以下是修改后的AutoLISP代码,实现自动从IS1到IS6中识别首个值为空的属性,提取其编号作为修订号,再完成后续属性更新:
(defun c:AttRenList ( / strRevLet strRevNo doc new tagLst tag blk obj) ;; 获取用户输入修订字母和描述 (setq strRevLet (getstring T "输入修订字母(如A、B、C):")) (setq strDesc (getstring T "输入修订描述:")) ;; 自动查找第一个空的IS1-IS6属性,提取编号作为strRevNo (setq strRevNo nil) (vlax-for blk (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (when (and (= :vlax-false (vla-get-isxref blk)) (not strRevNo)) (vlax-for obj blk (when (and (= "AcDbAttributeDefinition" (vla-get-objectname obj)) (not strRevNo)) (setq tag (vla-get-tagstring obj)) ;; 匹配IS1到IS6,且属性值为空(可根据需求调整空白判断逻辑) (when (and (wcmatch tag "IS[1-6]") (zerop (strlen (trim (vla-get-textstring obj))))) (setq strRevNo (substr tag 3)) ; 提取编号部分,比如从"IS1"取"1" ) ) ) ) ) ;; 未找到空IS属性时提示退出 (if (not strRevNo) (progn (alert "未找到空的IS1-IS6属性!") (princ) ) ) ;; 构建属性更新列表,基于自动获取的strRevNo (setq tagLst ; 所有标签需大写 (list ;; 旧标签 新标签 提示文本 属性值 (list (strcat "IS" strRevNo) (strcat "IS" strRevNo) (strcat "修订 #" strRevNo) (strcat strRevLet strRevNo)) (list (strcat "DESC" strRevNo) (strcat "DESC" strRevNo) (strcat "修订描述 #" strRevNo) strDesc) (list (strcat "BY" strRevNo) (strcat "BY" strRevNo) "绘制人(缩写)" "WR") (list (strcat "CH" strRevNo) (strcat "CH" strRevNo) "审核人(缩写)" "DL") (list (strcat "APP" strRevNo) (strcat "APP" strRevNo) "批准人" "DL") (list (strcat "REG" strRevNo) (strcat "REG" strRevNo) "注册类型及编号" "CPEng 1012053") (list (strcat "COM" strRevNo) (strcat "COM" strRevNo) "公司" "ETK") ) ) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-endundomark doc) (vla-startundomark doc) ;; 遍历所有块,更新属性定义和块引用的属性 (vlax-for blk (vla-get-blocks doc) (if (= :vlax-false (vla-get-isxref blk)) (vlax-for obj blk (cond ((= "AcDbBlockReference" (vla-get-objectname obj)) (if (= :vlax-true (vla-get-hasattributes obj)) (foreach att (vlax-invoke obj 'getattributes) (if (setq new (assoc (vla-get-tagstring att) tagLst)) (progn (vla-put-tagstring att (cadr new)) (vla-put-textstring att (cadddr new)) ) ) ) ) ) ((= "AcDbAttributeDefinition" (vla-get-objectname obj)) (if (setq new (assoc (vla-get-tagstring obj) tagLst)) (progn (vla-put-tagstring obj (cadr new)) (vla-put-textstring obj (cadddr new)) (vla-put-promptstring obj (caddr new)) ) ) ) ) ) ) ) (vla-endundomark doc) (princ) )
关键修改说明
替换手动输入为自动查找
移除了原代码中手动输入修订编号的逻辑,新增遍历逻辑:- 跳过外部参照块,遍历所有本地块
- 定位块内的属性定义对象(
AcDbAttributeDefinition) - 用
wcmatch匹配IS1到IS6格式的标签 - 判断属性值是否为空(含前后空格的空白值也会被识别为空),找到第一个符合条件的属性后提取编号
异常处理
如果遍历后未找到空的IS属性,弹出提示框并终止程序,避免后续逻辑报错适配原有更新逻辑
自动获取的修订编号会直接传入原有的属性更新列表tagLst,保持后续属性更新逻辑不变
可选调整点
如果需要支持包含空格的空白属性值判断,代码中已经用trim处理属性值;若只需严格匹配空字符串,可将(zerop (strlen (trim (vla-get-textstring obj))))改为(zerop (strlen (vla-get-textstring obj)))
内容的提问来源于stack exchange,提问作者The Rad
相关产品推荐
相关产品推荐

