;;; 命令:RRDF - 删除图层工具 ;;; 功能1:选择对象,删除该对象所在的图层 ;;; 功能2:删除块内图层 ;;; 功能3:删除所有模型空间冻结的图层 (defun c:RRDF (/ _ent _lay _opt _frozenLays _curLayer acaddocument acadobject en ent lay layersobj vlay) (setvar "CMDECHO" 0) ;; 菜单选项 - 关键字用空格分隔,不需要中文 (initget "S B F ") (setq _opt (getkword "\n请选择模式 [选择对象(S)/删除块内图层(B)/删除冻结(F)] : ")) (if (null _opt) (setq _opt "S") ) (cond ;; 模式1:选择对象删除图层 ((= _opt "S") (if (and (setq _ent (entsel "\n选择要删除图层上的对象: ")) (setq _lay (cdr (assoc 8 (entget (car _ent))))) ) (progn (setq _curLayer (getvar "CLAYER")) (if (= _lay _curLayer) (princ "\n错误:不能删除当前图层!") (progn (princ (strcat "\n正在删除图层: " _lay)) (command "_.LAYDEL" "_N" _lay "" "_Y") ) ) ) (princ "\n未选择对象") ) ) ;; 模式2:删除块内图层 ((= _opt "B") (setq AcadObject (vlax-get-acad-object) AcadDocument (vla-get-ActiveDocument AcadObject) LayersObj (vla-get-layers AcadDocument) ) (setvar "ErrNo" 0) (princ "\n请选择需要删除的图层") (while (/= (getvar "ErrNo") 52) (if (setq en (nentsel "\n请选择需要删除的图层:")) (progn (setq ent (car en) lay (cdr (assoc 8 (entget ent))) ;vlay (vla-item LayersObj lay) ) ;(vla-put-layeron vlay :vlax-false) (command "-LAYDEL" "n" lay "" "y" "") (princ "\n已删除图层") ) ) ) (princ) ) ;; 模式3:删除冻结图层 ((= _opt "F") (setq _frozenLays (GetFrozenModelList)) (if _frozenLays (progn (setq _curLayer (getvar "CLAYER")) ;; 移除不能删除的图层 (setq _frozenLays (vl-remove _curLayer _frozenLays)) (setq _frozenLays (vl-remove "0" _frozenLays)) (setq _frozenLays (vl-remove "DEFPOINTS" _frozenLays)) (if _frozenLays (progn (princ (strcat "\n找到 " (itoa (length _frozenLays)) " 个可删除的冻结图层")) (foreach lay _frozenLays (command "_.LAYDEL" "_N" lay "" "_Y") ) (princ "\n删除完成!") ) (princ "\n没有可删除的冻结图层") ) ) (princ "\n没有找到冻结图层") ) ) ) (setvar "CMDECHO" 1) (princ) ) ;; 获取模型空间冻结图层列表 (defun GetFrozenModelList (/ lst ly) (setq lst '()) (setq ly (tblnext "LAYER" T)) (while ly ;; 判断图层冻结标记 (if (= 1 (logand (cdr (assoc 70 ly)) 1)) (setq lst (cons (cdr (assoc 2 ly)) lst)) ) (setq ly (tblnext "LAYER")) ) (reverse lst) ) (princ "\nRRDF 已加载 - 输入 RRDF 运行") (princ)