AutoLISP需求:移除图层名称中的_1/_2,保留其余下划线
批量重命名CAD图层:仅移除
_1和_2子串 原代码的问题在于它把下划线、1、2这三个字符单独替换成空格后删除,导致所有下划线都被移除。要实现仅删除_1和_2这两个完整子串,我们需要精准匹配并替换这两个子串,而不是单个字符。
以下是修改后的AutoLISP代码:
(vl-load-com) (defun C:SLPC (/ layname fixed); = 批量移除图层名中的_1和_2子串 (vlax-for layer (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))) (setq layname (vla-get-name layer) fixed layname ; 复制原始图层名作为初始值 ) ; 循环替换所有_1子串为空 (while (wcmatch fixed "*_1*") (setq fixed (vl-string-subst "" "_1" fixed)) ) ; 循环替换所有_2子串为空 (while (wcmatch fixed "*_2*") (setq fixed (vl-string-subst "" "_2" fixed)) ) ; 验证新图层名合法性:不重复、非空、与原名称不同 (if (and (not (tblsearch "layer" fixed)) (/= fixed "") (/= fixed layname) ) (vla-put-name layer fixed) ; 执行重命名 ) ) (princ "\n图层重命名完成!") (princ) )
关键修改说明
- 替换逻辑:放弃字符级替换,改为针对
_1和_2完整子串的循环替换,确保只删除目标内容,保留其他下划线和字符 - 合法性检查:新增
(/= fixed layname)判断,避免对不含目标子串的图层执行无意义操作 - 操作反馈:添加完成提示,方便确认任务执行状态
内容的提问来源于stack exchange,提问作者Pezza
相关产品推荐
相关产品推荐

