;;; ------------------------------------------------------------
;;; AutoCATS ¸®½À ÀÚ·á½Ç
;; ¸í·É: COLORSET
;; ±â´É: ¼±ÅÃ °´Ã¼ÀÇ ACI »ö»óÀ» ByLayer, ByBlock ¶Ç´Â 1~255·Î ÀÏ°ý º¯°æ
;; ÃâÃ³: https://www.autocats.co.kr/lisp/color-set
;; ¹öÀü: 1.0 (2026-07-23)
;; ¶óÀÌ¼±½º: ÀÚÀ¯ »ç¿ë¡¤¼öÁ¤, Àç¹èÆ÷ ½Ã ÃâÃ³(autocats.co.kr) Ç¥±â
;; ¾ÈÀü: *error* ÇÚµé·¯ + UNDO ±×·ì, Àá±ä ·¹ÀÌ¾î °Ç³Ê¶Ü
;;; ------------------------------------------------------------

(vl-load-com)

(defun autocats-colorset-digits-p (value / idx valid)
  (setq idx 1 valid (/= value ""))
  (while (and valid (<= idx (strlen value)))
    (if (not (wcmatch (substr value idx 1) "#"))
      (setq valid nil))
    (setq idx (1+ idx)))
  valid)

(defun autocats-colorset-parse (value / upper number)
  (setq upper (strcase value))
  (cond
    ((or (= upper "") (= upper "BYLAYER")) 256)
    ((= upper "BYBLOCK") 0)
    ((autocats-colorset-digits-p value)
     (setq number (atoi value))
     (if (and (>= number 1) (<= number 255)) number nil))
    (T nil)))

(defun autocats-colorset-locked-p (ent / row)
  (setq row (tblsearch "LAYER" (cdr (assoc 8 (entget ent)))))
  (and row (= 4 (logand 4 (cdr (assoc 70 row))))))

(defun autocats-colorset-apply (ent color / data cleaned updated)
  (setq data (entget ent)
        cleaned
        (vl-remove-if
          '(lambda (pair) (member (car pair) '(62 420 430)))
          data))
  (if (= color 256)
    (setq updated (entmod cleaned))
    (setq updated (entmod (append cleaned (list (cons 62 color))))))
  (if updated (progn (entupd ent) T) nil))

(defun c:COLORSET (/ *error* doc undo-open raw color ss idx ent changed 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[COLORSET] Áß´Ü: " msg)))
    (princ))

  (setq raw (getstring T "\n[COLORSET] »ö»ó [ByLayer/ByBlock/1~255] <ByLayer>: ")
        color (autocats-colorset-parse raw))
  (if (null color)
    (princ "\n[COLORSET] ¿Ã¹Ù¸¥ ACI »ö»óÀ» ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù.")
    (progn
      (princ "\n[COLORSET] »ö»óÀ» º¯°æÇÒ °´Ã¼¸¦ ¼±ÅÃÇÏ¼¼¿ä.")
      (setq ss (ssget))
      (if ss
        (progn
          (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
                idx 0 changed 0 skipped 0)
          (vla-StartUndoMark doc)
          (setq undo-open T)
          (while (< idx (sslength ss))
            (setq ent (ssname ss idx))
            (if (or (autocats-colorset-locked-p ent)
                    (not (autocats-colorset-apply ent color)))
              (setq skipped (1+ skipped))
              (setq changed (1+ changed)))
            (setq idx (1+ idx)))
          (vla-EndUndoMark doc)
          (setq undo-open nil)
          (princ (strcat "\n[COLORSET] ¿Ï·á: " (itoa changed)
                         "°³ º¯°æ / " (itoa skipped) "°³ °Ç³Ê¶Ü")))
        (princ "\n[COLORSET] ¼±ÅÃµÈ °´Ã¼°¡ ¾ø½À´Ï´Ù."))))
  (princ))

(princ "\n[AutoCATS] COLORSET ·Îµå ¿Ï·á - ¸í·ÉÇà¿¡ COLORSET ¸¦ ÀÔ·ÂÇÏ¼¼¿ä.")
(princ)
