삭제 전에 후보부터 확인
레이어별 객체 사용을 검사한 뒤 실제 삭제를 시도할 빈 레이어 이름을 먼저 출력합니다.
보호 규칙과 명시적 확인
- 0, Defpoints, 현재 레이어, Xref 종속 레이어는 제외합니다.
- 블록 정의에서 참조하는 레이어는 빈 레이어로 보지 않습니다.
- 기본 응답은 No이며 Yes를 입력해야만 삭제합니다.
사용 순서
- 1
APPLOAD로 empty-layer-clean.lsp를 로드합니다.
- 2
LAYPURGE를 입력합니다.
- 3
명령행의 삭제 후보 목록을 검토합니다.
- 4
삭제하려면 Yes, 유지하려면 Enter 또는 No를 입력합니다.
코드 전문
다운로드 파일은 아래 코드와 100% 동일합니다. 붙여넣기보다 파일 다운로드 후 APPLOAD 로드를 권장합니다.
;;; ------------------------------------------------------------
;;; AutoCATS 리습 자료실
;; 명령: LAYPURGE
;; 기능: 보호 및 참조 레이어를 제외한 빈 레이어 미리보기 후 삭제
;; 출처: https://www.autocats.co.kr/lisp/empty-layer-clean
;; 버전: 1.0 (2026-07-27)
;; 라이선스: 자유 사용·수정, 재배포 시 출처(autocats.co.kr) 표기
;; 안전: *error* 핸들러 + UNDO 그룹, 기본값은 삭제 취소
;;; ------------------------------------------------------------
(vl-load-com)
(defun autocats-lpurge-seed (/ row rows)
(setq row (tblnext "LAYER" T) rows nil)
(while row
(setq rows (cons (cons (cdr (assoc 2 row)) 0) rows)
row (tblnext "LAYER")))
rows)
(defun autocats-lpurge-add (name rows / found)
(if (setq found (assoc name rows))
(subst (cons name (1+ (cdr found))) found rows)
(cons (cons name 1) rows)))
(defun autocats-lpurge-counts (/ ss idx block-row block-name block-ent ent data layer rows)
(setq rows (autocats-lpurge-seed)
ss (ssget "_X")
idx 0)
(if ss
(while (< idx (sslength ss))
(setq data (entget (ssname ss idx))
layer (cdr (assoc 8 data)))
(if layer (setq rows (autocats-lpurge-add layer rows)))
(setq idx (1+ idx))))
(setq block-row (tblnext "BLOCK" T))
(while block-row
(setq block-name (cdr (assoc 2 block-row)))
(if (and (null (vl-string-search "*MODEL_SPACE" (strcase block-name)))
(null (vl-string-search "*PAPER_SPACE" (strcase block-name))))
(progn
(setq block-ent (tblobjname "BLOCK" block-name)
ent (if block-ent (entnext block-ent) nil))
(while (and ent (/= "ENDBLK" (cdr (assoc 0 (entget ent)))))
(setq data (entget ent)
layer (cdr (assoc 8 data)))
(if layer (setq rows (autocats-lpurge-add layer rows)))
(setq ent (entnext ent)))))
(setq block-row (tblnext "BLOCK")))
rows)
(defun autocats-lpurge-protected-p (name)
(or (= (strcase name) "0")
(= (strcase name) "DEFPOINTS")
(= (strcase name) (strcase (getvar "CLAYER")))
(vl-string-search "|" name)))
(defun autocats-lpurge-candidates (/ rows result)
(setq rows (autocats-lpurge-counts)
result nil)
(foreach row rows
(if (and (= 0 (cdr row))
(not (autocats-lpurge-protected-p (car row))))
(setq result (cons (car row) result))))
(vl-sort result
'(lambda (left right)
(< (strcase left) (strcase right)))))
(defun autocats-lpurge-delete (names / name result deleted skipped)
(setq deleted 0 skipped 0)
(foreach name names
(setq result
(vl-catch-all-apply
'(lambda ()
(command "_.-PURGE" "_Layers" name "_No")
T)))
(if (or (vl-catch-all-error-p result) (tblsearch "LAYER" name))
(setq skipped (1+ skipped))
(setq deleted (1+ deleted))))
(cons deleted skipped))
(defun c:LAYPURGE (/ *error* doc undo-open names answer result)
(defun *error* (msg)
(if undo-open
(progn (vla-EndUndoMark doc) (setq undo-open nil)))
(if (and msg (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*EXIT*,*취소*")))
(princ (strcat "\n[LAYPURGE] 중단: " msg)))
(princ))
(setq names (autocats-lpurge-candidates))
(if (null names)
(princ "\n[LAYPURGE] 삭제 가능한 빈 레이어가 없습니다.")
(progn
(princ (strcat "\n[LAYPURGE] 삭제 후보 " (itoa (length names)) "개"))
(foreach name names (princ (strcat "\n " name)))
(initget "Yes No")
(setq answer (getkword "\n[LAYPURGE] 위 빈 레이어를 삭제할까요? [Yes/No] <No>: "))
(if (= answer "Yes")
(progn
(setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-StartUndoMark doc)
(setq undo-open T
result (autocats-lpurge-delete names))
(vla-EndUndoMark doc)
(setq undo-open nil)
(princ (strcat "\n[LAYPURGE] 완료: " (itoa (car result))
"개 삭제 / " (itoa (cdr result)) "개 보호 또는 참조로 유지")))
(princ "\n[LAYPURGE] 취소했습니다. 도면은 변경되지 않았습니다."))))
(princ))
(princ "\n[AutoCATS] LAYPURGE 로드 완료 - 명령행에 LAYPURGE 를 입력하세요.")
(princ)
호환 CAD
위 환경에서 확인했습니다. 목록에 없는 CAD는 샘플 도면에서 먼저 결과를 대조한 뒤, CAD 종류·버전과 함께 네이버 카페에 알려주세요.
이 기능, CATS Pro에는 버튼으로 있습니다
PG_LAYERCLEANEMPTY / CATS_PG_LAYERCLEANEMPTYCATS Pro에서는 더 상세한 미리보기와 통합 도면 정리 흐름을 제공합니다.CATS Pro는 계속 무료입니다. 리습 로드 없이 버튼 클릭으로 같은 작업을 처리할 수 있습니다.
함께 쓰면 좋은 CATS 명령
자주 묻는 질문
현재 레이어도 삭제 후보에 나오나요?
현재 레이어와 기본 보호 레이어는 항상 후보에서 제외합니다.
삭제에 실패한 레이어는 어떻게 되나요?
스타일이나 다른 데이터가 참조해 삭제할 수 없는 레이어는 그대로 두고 건너뜀 수에 포함합니다.