;;; ------------------------------------------------------------
;;; AutoCATS ¸®½À ÀÚ·á½Ç
;; ¸í·É: THEIGHT
;; ±â´É: ¼±ÅÃÇÑ TEXT ¹× MTEXTÀÇ ³ôÀÌ¸¦ °ª ¶Ç´Â ÂüÁ¶ ¹®ÀÚ·Î ÀÏ°ý º¯°æ
;; ÃâÃ³: https://www.autocats.co.kr/lisp/text-height
;; ¹öÀü: 1.0 (2026-07-27)
;; ¶óÀÌ¼±½º: ÀÚÀ¯ »ç¿ë¡¤¼öÁ¤, Àç¹èÆ÷ ½Ã ÃâÃ³(autocats.co.kr) Ç¥±â
;; ¾ÈÀü: *error* ÇÚµé·¯ + UNDO ±×·ì, Àá±ä ·¹ÀÌ¾î °Ç³Ê¶Ü
;;; ------------------------------------------------------------

(vl-load-com)

(defun autocats-theight-locked-p (ent / row)
  (setq row (tblsearch "LAYER" (cdr (assoc 8 (entget ent)))))
  (and row (= 4 (logand 4 (cdr (assoc 70 row))))))

(defun autocats-theight-value (ent / value)
  (setq value (cdr (assoc 40 (entget ent))))
  (if (and value (> value 0.0)) value nil))

(defun autocats-theight-apply (ent height / data pair updated)
  (setq data (entget ent)
        pair (assoc 40 data))
  (if pair
    (progn
      (setq updated (entmod (subst (cons 40 height) pair data)))
      (if updated (progn (entupd ent) T) nil))
    nil))

(defun c:THEIGHT (/ *error* doc undo-open mode pick height 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[THEIGHT] Áß´Ü: " msg)))
    (princ))

  (initget "Value Match")
  (setq mode (getkword "\n[THEIGHT] ³ôÀÌ ÁöÁ¤ [Value/Match] <Value>: "))
  (if (null mode) (setq mode "Value"))
  (if (= mode "Match")
    (progn
      (setq pick (entsel "\n[THEIGHT] ÂüÁ¶ TEXT ¶Ç´Â MTEXT¸¦ ¼±ÅÃÇÏ¼¼¿ä: "))
      (if (and pick
               (member (cdr (assoc 0 (entget (car pick)))) '("TEXT" "MTEXT")))
        (setq height (autocats-theight-value (car pick)))))
    (progn
      (initget 6)
      (setq height (getdist "\n[THEIGHT] Àû¿ëÇÒ ¹®ÀÚ ³ôÀÌ: "))))
  (if (null height)
    (princ "\n[THEIGHT] ¿Ã¹Ù¸¥ ¹®ÀÚ ³ôÀÌ¸¦ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù.")
    (progn
      (princ "\n[THEIGHT] ³ôÀÌ¸¦ º¯°æÇÒ TEXT ¶Ç´Â MTEXT¸¦ ¼±ÅÃÇÏ¼¼¿ä.")
      (setq ss (ssget '((0 . "TEXT,MTEXT"))))
      (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-theight-locked-p ent)
                    (not (autocats-theight-apply ent height)))
              (setq skipped (1+ skipped))
              (setq changed (1+ changed)))
            (setq idx (1+ idx)))
          (vla-EndUndoMark doc)
          (setq undo-open nil)
          (princ (strcat "\n[THEIGHT] ¿Ï·á: " (itoa changed)
                         "°³ º¯°æ / " (itoa skipped) "°³ °Ç³Ê¶Ü / ³ôÀÌ "
                         (rtos height 2 4))))
        (princ "\n[THEIGHT] ¼±ÅÃµÈ ¹®ÀÚ°¡ ¾ø½À´Ï´Ù."))))
  (princ))

(princ "\n[AutoCATS] THEIGHT ·Îµå ¿Ï·á - ¸í·ÉÇà¿¡ THEIGHT ¸¦ ÀÔ·ÂÇÏ¼¼¿ä.")
(princ)
