빈 레이어 확인 후 삭제 리습 (LAYPURGE)

도면 전체를 검사해 삭제 가능한 빈 레이어를 미리 보여주고 Yes 확인을 받은 경우에만 삭제합니다.

코드 전문 공개 · 다운로드 파일과 100% 동일 · 출처 표기 후 자유 사용

삭제 전에 후보부터 확인

레이어별 객체 사용을 검사한 뒤 실제 삭제를 시도할 빈 레이어 이름을 먼저 출력합니다.

보호 규칙과 명시적 확인

  • 0, Defpoints, 현재 레이어, Xref 종속 레이어는 제외합니다.
  • 블록 정의에서 참조하는 레이어는 빈 레이어로 보지 않습니다.
  • 기본 응답은 No이며 Yes를 입력해야만 삭제합니다.
HOW TO USE

사용 순서

리습 로드가 처음이라면
  1. 1

    APPLOAD로 empty-layer-clean.lsp를 로드합니다.

  2. 2

    LAYPURGE를 입력합니다.

  3. 3

    명령행의 삭제 후보 목록을 검토합니다.

  4. 4

    삭제하려면 Yes, 유지하려면 Enter 또는 No를 입력합니다.

SOURCE

코드 전문

명령 LAYPURGE

다운로드 파일은 아래 코드와 100% 동일합니다. 붙여넣기보다 파일 다운로드 후 APPLOAD 로드를 권장합니다.

.lsp 다운로드
;;; ------------------------------------------------------------
;;; 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)
COMPATIBILITY

호환 CAD

AutoCAD 2021AutoCAD 2026

위 환경에서 확인했습니다. 목록에 없는 CAD는 샘플 도면에서 먼저 결과를 대조한 뒤, CAD 종류·버전과 함께 네이버 카페에 알려주세요.

ONE-CLICK ALTERNATIVE

이 기능, CATS Pro에는 버튼으로 있습니다

PG_LAYERCLEANEMPTY / CATS_PG_LAYERCLEANEMPTYCATS Pro에서는 더 상세한 미리보기와 통합 도면 정리 흐름을 제공합니다.

CATS Pro는 계속 무료입니다. 리습 로드 없이 버튼 클릭으로 같은 작업을 처리할 수 있습니다.

WORKS WELL WITH

함께 쓰면 좋은 CATS 명령

전체 명령 보기
PG_LAYERCLEANEMPTY / CATS_PG_LAYERCLEANEMPTYCATS Pro에서 보호 레이어를 제외한 빈 레이어를 미리 확인하고 정리합니다.
FAQ

자주 묻는 질문

현재 레이어도 삭제 후보에 나오나요?

현재 레이어와 기본 보호 레이어는 항상 후보에서 제외합니다.

삭제에 실패한 레이어는 어떻게 되나요?

스타일이나 다른 데이터가 참조해 삭제할 수 없는 레이어는 그대로 두고 건너뜀 수에 포함합니다.

WORKFLOW PRODUCTS

업무 분야에 맞는 전용 자동화도 확인해 보세요.

공통 CAD 작업은 CATS Pro로, 분야별 도면과 산출 업무는 전용 제품으로 이어갈 수 있습니다.

FREE LISP + FREE ADD-IN

리습과 CATS Pro를 함께 쓰세요.

리습은 가볍게, 반복 작업은 CATS Pro 버튼으로. 둘 다 무료입니다.