;;; ------------------------------------------------------------
;;; AutoCATS ¸®½À ÀÚ·á½Ç
;; ¸í·É: LAYERSWAP
;; ±â´É: ¼±ÅÃ ¹üÀ§¿¡¼­ µÎ ·¹ÀÌ¾îÀÇ °´Ã¼¸¦ ¼­·Î ±³È¯
;; ÃâÃ³: https://www.autocats.co.kr/lisp/layer-swap
;; ¹öÀü: 1.0 (2026-07-27)
;; ¶óÀÌ¼±½º: ÀÚÀ¯ »ç¿ë¡¤¼öÁ¤, Àç¹èÆ÷ ½Ã ÃâÃ³(autocats.co.kr) Ç¥±â
;; ¾ÈÀü: *error* ÇÚµé·¯ + UNDO ±×·ì, Àá±ä ·¹ÀÌ¾î °´Ã¼ °Ç³Ê¶Ü
;;; ------------------------------------------------------------

(vl-load-com)

(defun autocats-layerswap-locked-p (ent / row)
  (setq row (tblsearch "LAYER" (cdr (assoc 8 (entget ent)))))
  (and row (= 4 (logand 4 (cdr (assoc 70 row))))))

(defun autocats-layerswap-name (value / row)
  (if (setq row (tblsearch "LAYER" value))
    (cdr (assoc 2 row))
    nil))

(defun autocats-layerswap-apply (ent layer-a layer-b / data current target updated)
  (setq data (entget ent)
        current (cdr (assoc 8 data)))
  (cond
    ((= (strcase current) (strcase layer-a)) (setq target layer-b))
    ((= (strcase current) (strcase layer-b)) (setq target layer-a))
    (T (setq target nil)))
  (if target
    (progn
      (setq updated (entmod (subst (cons 8 target) (assoc 8 data) data)))
      (if updated (progn (entupd ent) T) nil))
    'unchanged))

(defun c:LAYERSWAP (/ *error* doc undo-open raw-a raw-b layer-a layer-b ss idx ent
                       result moved unchanged skipped)
  (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[LAYERSWAP] Áß´Ü: " msg)))
    (princ))

  (setq raw-a (getstring T "\n[LAYERSWAP] Ã¹ ¹øÂ° ·¹ÀÌ¾î ÀÌ¸§: ")
        raw-b (getstring T "\n[LAYERSWAP] µÎ ¹øÂ° ·¹ÀÌ¾î ÀÌ¸§: ")
        layer-a (autocats-layerswap-name raw-a)
        layer-b (autocats-layerswap-name raw-b))
  (if (or (null layer-a) (null layer-b)
          (= (strcase layer-a) (strcase layer-b)))
    (princ "\n[LAYERSWAP] ¼­·Î ´Ù¸¥ ±âÁ¸ ·¹ÀÌ¾î µÎ °³¸¦ ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.")
    (progn
      (princ "\n[LAYERSWAP] µÎ ·¹ÀÌ¾î¸¦ ±³È¯ÇÒ ´ë»ó ¹üÀ§¸¦ ¼±ÅÃÇÏ¼¼¿ä.")
      (setq ss (ssget))
      (if ss
        (progn
          (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
                idx 0 moved 0 unchanged 0 skipped 0)
          (vla-StartUndoMark doc)
          (setq undo-open T)
          (while (< idx (sslength ss))
            (setq ent (ssname ss idx))
            (if (autocats-layerswap-locked-p ent)
              (setq skipped (1+ skipped))
              (progn
                (setq result (autocats-layerswap-apply ent layer-a layer-b))
                (cond
                  ((eq result 'unchanged) (setq unchanged (1+ unchanged)))
                  (result (setq moved (1+ moved)))
                  (T (setq skipped (1+ skipped))))))
            (setq idx (1+ idx)))
          (vla-EndUndoMark doc)
          (setq undo-open nil)
          (princ (strcat "\n[LAYERSWAP] ¿Ï·á: " (itoa moved)
                         "°³ ±³È¯ / " (itoa unchanged) "°³ ´ë»ó ¾Æ´Ô / "
                         (itoa skipped) "°³ °Ç³Ê¶Ü")))
        (princ "\n[LAYERSWAP] ¼±ÅÃµÈ °´Ã¼°¡ ¾ø½À´Ï´Ù."))))
  (princ))

(princ "\n[AutoCATS] LAYERSWAP ·Îµå ¿Ï·á - ¸í·ÉÇà¿¡ LAYERSWAP ¸¦ ÀÔ·ÂÇÏ¼¼¿ä.")
(princ)
