;;; ------------------------------------------------------------
;;; 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)
