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