想请老大们做一个一键清除所有隐藏图层内容和所有约束的快捷键
就是隐藏图层和约束连在一起清除的快捷方式,谢谢!rouka23 发表于 2025-11-14 17:13
不怎么用约束管理器,不是很理解
这里有用户变量的测试文件,能帮我再加上去吗? 277283904 发表于 2025-11-14 15:29
......................谢谢!
(defun c:CleanAll (/ lay laylist ent entlist ss doc)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
; 开始事务处理
(vla-startundomark doc)
; 方法1:尝试使用DELCONSTRAINT命令删除所有约束
(command "._DELCONSTRAINT" "_All" "")
; 方法2:通过选择集删除可能残留的约束对象
(setq ss (ssget "_X" '((0 . "GEOMCONSTRAINT,DIMCONSTRAINT,ACAD_TABLE,*DIMCONSTRAINT"))))
(if ss
(command "._ERASE" ss "")
)
; 方法3:清除关联标注的约束
(setq ss (ssget "_X" '((0 . "DIMENSION"))))
(if ss
(progn
(command "._DIMDISASSOCIATE" ss "")
; 删除可能成为独立对象的约束
(setq ss (ssget "_X" '((0 . "GEOMCONSTRAINT,DIMCONSTRAINT"))))
(if ss
(command "._ERASE" ss "")
)
)
)
; 获取所有隐藏(关闭或冻结)的图层
(setq laylist '())
(vlax-for lay (vla-get-layers doc)
(if (or (= (vla-get-layeron lay) :vlax-false)
(= (vla-get-freeze lay) :vlax-true))
(setq laylist (cons (vla-get-name lay) laylist))
)
)
; 在每个隐藏图层中选择并删除所有对象
(foreach layname laylist
(setq ss (ssget "_X" (list (cons 8 layname))))
(if ss
(progn
(command "._ERASE" ss "")
(princ (strcat "\n已删除图层 \"" layname "\" 中的 " (itoa (sslength ss)) " 个对象"))
)
)
)
; 清理未使用的图层、标注样式等
(command "._-PURGE" "_A" "*" "_N")
; 结束事务处理
(vla-endundomark doc)
(princ "\n操作完成!所有隐藏图层内容和约束已清除。")
(princ)
)
; 安全版本,带有确认提示
(defun c:CleanAllSafe (/ resp)
(initget "Yes No")
(setq resp (getkword "\n警告:此操作将永久删除所有隐藏图层内容和约束,且不可撤销!确定继续? <No>: "))
(if (= resp "Yes")
(c:CleanAll)
(princ "\n操作已取消。")
)
(princ)
)
; 加载提示
(princ "\n清理程序已加载,命令: CleanAll 或 CleanAllSafe(带确认)")
(princ) rouka23 发表于 2025-11-14 14:16
AI可以搞定
试过了DS,3个代码都不起作用,例如如下:
lisp
(defun c:CDHL ()
; 保存当前系统变量
(setq oldCmdEcho (getvar "CMDECHO"))
(setvar "CMDECHO" 0) ; 关闭命令回显
; 1. 首先显示所有图层
(command "LAYON")
(command "REGEN") ; 重生成以确保所有对象可见
; 2. 删除所有约束
(command "DELCON" "all" "")
; 3. 删除隐藏图层(关闭或冻结的图层)
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq layers (vla-get-Layers doc))
(setq deletedCount 0)
(vlax-for layer layers
(setq layerName (vla-get-Name layer))
; 跳过不能删除的图层(当前图层、0层、Defpoints)
(if (and
(not (eq layerName (getvar "CLAYER"))) ; 不是当前图层
(not (eq layerName "0")) ; 不是0层
(not (wcmatch layerName "*|*")) ; 不是外部参照图层
(or
(not (vla-get-LayerOn layer)) ; 图层关闭
(vla-get-Freeze layer) ; 图层冻结
)
)
(progn
; 尝试删除图层
(if (vl-catch-all-error-p
(vl-catch-all-apply 'vla-Delete (list layer)))
(princ (strcat "\n无法删除图层: " layerName))
(setq deletedCount (1+ deletedCount))
)
)
)
)
; 恢复系统变量
(setvar "CMDECHO" oldCmdEcho)
; 显示结果
(princ (strcat "\n已删除 " (itoa deletedCount) " 个隐藏图层和所有约束。"))
(princ)
) AI可以搞定 ;几何约束
(setvar "CONSTRAINTINFER" 0) ;关闭推断几何约束
(vl-cmdf "DELCONSTRAINT" "all" "");删除所有约束 277283904 发表于 2025-11-14 14:46
试过了DS,3个代码都不起作用,例如如下:
lisp
麻烦上个测试文件 本帖最后由 277283904 于 2025-11-14 15:40 编辑
rouka23 发表于 2025-11-14 15:14
麻烦上个测试文件
......................谢谢!
G〆h 发表于 2025-11-14 14:45
;几何约束
(setvar "CONSTRAINTINFER" 0) ;关闭推断几何约束
(vl-cmdf "DELCONSTRAINT" "all" "");删 ...
怎么使用{:1_1:} rouka23 发表于 2025-11-14 16:02
谢谢!,可以了 rouka23 发表于 2025-11-14 16:02
可以增加用户变量一起删除吗?谢谢!
页:
[1]
2