;;; ±ÛÀÚ Å©±â¡¤±Û²Ã ÀÏ°ý º¯°æ - TORVA ¹«·á ¸®½À (torva.kr/lisp.html)
;;; TXH  : °í¸¥ ±ÛÀÚ(TEXT, MTEXT)ÀÇ ³ôÀÌ¸¦ ÇÑ ¹ø¿¡ ¹Ù²Û´Ù. ±ÛÀÚ °¡¿îµ¥¸¦ ±âÁØÀ¸·Î Ä¿Áö°í ÁÙ¾î Á¦ÀÚ¸®¸¦ ÁöÅ²´Ù
;;; TXST : °í¸¥ ±ÛÀÚÀÇ ¹®ÀÚ ½ºÅ¸ÀÏÀ» ÇÑ ¹ø¿¡ ¹Ù²Û´Ù. ±âÁØ ±ÛÀÚ¸¦ Âï°Å³ª ½ºÅ¸ÀÏ ÀÌ¸§À» ÀÔ·ÂÇÑ´Ù. ¿£ÅÍ¸¦ ´©¸£¸é µµ¸é ÀüÃ¼
;;; ³ôÀÌ ±âº»°ª = 3.5 x DIMSCALE (1:100 µµ¸éÀÌ¸é 350). ¹Ù²Û °ªÀº µµ¸éÀ» ´ÝÀ» ¶§±îÁö À¯ÁöµÈ´Ù
;;; Àá±ä ·¹ÀÌ¾îÀÇ ±ÛÀÚ´Â °Çµå¸®Áö ¾Ê´Â´Ù

(vl-load-com)

(defun tv-tb-height ()
  (cond (*TV-TB-HEIGHT*)
        ((> (getvar "DIMSCALE") 0) (* 3.5 (getvar "DIMSCALE")))
        (3.5)))

;; ±ÛÀÚ ¿Ü°û »óÀÚÀÇ °¡¿îµ¥
(defun tv-tb-center (o / a b)
  (vla-getboundingbox o 'a 'b)
  (mapcar '(lambda (x y) (/ (+ x y) 2.0)) (vlax-safearray->list a) (vlax-safearray->list b)))

;; ¹Ì¸® °í¸¥ °ÍÀÌ ÀÖÀ¸¸é ±×°Í, ¾øÀ¸¸é »õ·Î °í¸¥´Ù (Àá±ä ·¹ÀÌ¾î Á¦¿Ü)
(defun tv-tb-pick (msg)
  (cond ((ssget "_I" '((0 . "TEXT,MTEXT"))))
        (T (prompt msg) (ssget ":L" '((0 . "TEXT,MTEXT"))))))

(defun c:TXH (/ *error* old ss v h i o c0 c1 n lay)
  (setq old *error*)
  (defun *error* (msg)
    (setq *error* old)
    (if (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*")) (princ (strcat "\n¿À·ù: " msg)))
    (princ))
  (setq ss (tv-tb-pick "\n³ôÀÌ¸¦ ¹Ù²Ü ±ÛÀÚ ¼±ÅÃ: "))
  (sssetfirst nil nil)
  (if ss
    (progn
      (if (setq v (getdist (strcat "\n±ÛÀÚ ³ôÀÌ <" (rtos (tv-tb-height) 2 1) ">: "))) (setq *TV-TB-HEIGHT* v))
      (setq h (tv-tb-height) n 0 i 0)
      (repeat (sslength ss)
        (setq o (vlax-ename->vla-object (ssname ss i)) i (1+ i)
              lay (tblsearch "LAYER" (vla-get-layer o)))
        (if (= 0 (logand 4 (cdr (assoc 70 lay))))
          (progn
            (setq c0 (tv-tb-center o))
            (vla-put-height o h)
            (setq c1 (tv-tb-center o))
            (vla-move o (vlax-3d-point c1) (vlax-3d-point c0))
            (setq n (1+ n)))))
      (princ (strcat "\n±ÛÀÚ " (itoa n) "°³ ³ôÀÌ " (rtos h 2 1)))))
  (setq *error* old)
  (princ)
)

;; ½ºÅ¸ÀÏ Á¤ÇÏ±â - ±âÁØ ±ÛÀÚ¸¦ Âï°Å³ª N À¸·Î ÀÌ¸§ ÀÔ·Â. ¾ø´Â ÀÌ¸§ÀÌ¸é ±Û²Ã ÆÄÀÏÀ» ¹°¾î »õ·Î ¸¸µç´Ù
(defun tv-tb-style (/ e st f)
  (initget "N")
  (setq e (entsel (strcat "\n±âÁØ ±ÛÀÚ ¼±ÅÃ ¶Ç´Â [ÀÌ¸§ ÀÔ·Â(N)] <" (getvar "TEXTSTYLE") ">: ")))
  (cond
    ((= e "N")
     (setq st (getstring T (strcat "\n¹®ÀÚ ½ºÅ¸ÀÏ ÀÌ¸§ <" (getvar "TEXTSTYLE") ">: ")))
     (if (= st "") (setq st (getvar "TEXTSTYLE")))
     (if (not (tblsearch "STYLE" st))
       (progn
         (setq f (getstring (strcat "\n" st " ½ºÅ¸ÀÏÀÌ ¾ø½À´Ï´Ù. ¾µ ±Û²Ã ÆÄÀÏ <malgun.ttf>: ")))
         (if (= f "") (setq f "malgun.ttf"))
         (command "_.-STYLE" st f 0 1 0 "_N" "_N")))
     st)
    ((and e (wcmatch (cdr (assoc 0 (entget (car e)))) "TEXT,MTEXT"))
     (cdr (assoc 7 (entget (car e)))))
    (e (princ "\n±ÛÀÚ°¡ ¾Æ´Õ´Ï´Ù. ÇöÀç ½ºÅ¸ÀÏÀ» ¾¹´Ï´Ù.") (getvar "TEXTSTYLE"))
    (T (getvar "TEXTSTYLE")))
)

(defun c:TXST (/ *error* old doc st ss i o n all)
  (setq old *error* doc (vla-get-ActiveDocument (vlax-get-acad-object)))
  (defun *error* (msg)
    (setq *error* old)
    (if (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*")) (princ (strcat "\n¿À·ù: " msg)))
    (princ))
  (setq ss (ssget "_I" '((0 . "TEXT,MTEXT"))) n 0)   ; ¹Ì¸® °í¸¥ °ÍÀº ±âÁØ ±ÛÀÚ¸¦ Âï±â Àü¿¡ Àâ¾Æ µÐ´Ù
  (sssetfirst nil nil)
  (setq st (tv-tb-style))
  (if (not ss)
    (progn (prompt (strcat "\n" st " ½ºÅ¸ÀÏ·Î ¹Ù²Ü ±ÛÀÚ ¼±ÅÃ (¿£ÅÍ = µµ¸é ÀüÃ¼): "))
           (setq ss (ssget ":L" '((0 . "TEXT,MTEXT"))))))
  (if ss
    (progn
      (setq i 0)
      (repeat (sslength ss)
        (setq o (vlax-ename->vla-object (ssname ss i)) i (1+ i))
        (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-stylename (list o st)))) (setq n (1+ n)))))
    (progn
      (initget "Y N")
      (if (= "Y" (getkword (strcat "\nµµ¸é ÀüÃ¼ ±ÛÀÚ(ºí·Ï ¾È Æ÷ÇÔ)¸¦ " st " ½ºÅ¸ÀÏ·Î ¹Ù²Ü±î¿ä? [¿¹(Y)/¾Æ´Ï¿À(N)] <N>: ")))
        (vlax-for blk (vla-get-Blocks doc)
          (if (= :vlax-false (vla-get-isxref blk))
            (vlax-for o blk
              (if (wcmatch (vla-get-ObjectName o) "AcDbText,AcDbMText")
                (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-stylename (list o st)))) (setq n (1+ n))))))))))
  (if (> n 0)
    (progn (setvar "TEXTSTYLE" st)
           (vla-Regen doc acAllViewports)
           (princ (strcat "\n±ÛÀÚ " (itoa n) "°³¸¦ " st " ½ºÅ¸ÀÏ·Î ¹Ù²Þ"))))
  (setq *error* old)
  (princ)
)

(princ "\n±ÛÀÚ ÀÏ°ý º¯°æ: TXH (³ôÀÌ) / TXST (½ºÅ¸ÀÏ) / torva.kr")
(princ)

;;; ---- ´ÜÃàÅ° ¹Ù²Ù±â (TVKEY) - TORVA ¸®½À °øÅë, torva.kr/lisp-guide.html ----
;;; TVKEY -> ¸í·É -> »õ ´ÜÃàÅ°. ¿ø·¡ ¸í·É¾îµµ ±×´ë·Î ¾´´Ù
;;; Á¤ÇÑ ´ÜÃàÅ°´Â ÀÌ PC ¿¡ TORVA-KEYS ·Î ÀúÀåµÇ°í, ¸®½ÀÀ» ºÒ·¯¿Ã ¶§¸¶´Ù µÇ»ì¾Æ³­´Ù
;;; (TORVA ¸®½À ÆÄÀÏ¸¶´Ù °°Àº ÄÚµå°¡ µé¾î ÀÖ´Ù. ¿©·¯ °³¸¦ ºÒ·¯¿Íµµ °°Àº Á¤ÀÇ¸¦ µ¤¾î¾µ »ÓÀÌ´Ù)

;; "A1=PY;B2=CN;" -> (("A1" . "PY") ("B2" . "CN"))
(defun tv-key-list (/ s i out)
  (setq s (cond ((getenv "TORVA-KEYS")) ("")) out nil)
  (while (setq i (vl-string-search ";" s))
    (setq out (cons (substr s 1 i) out) s (substr s (+ i 2))))
  (if (/= s "") (setq out (cons s out)))
  (vl-remove nil
    (mapcar '(lambda (x / j) (if (setq j (vl-string-search "=" x)) (cons (substr x 1 j) (substr x (+ j 2)))))
            (reverse out))))

(defun tv-key-save (lst)
  (setenv "TORVA-KEYS" (apply 'strcat (mapcar '(lambda (p) (strcat (car p) "=" (cdr p) ";")) lst))))

;; ºÒ·¯¿Â ¸®½À ¸í·ÉÀÎ°¡
(defun tv-key-cmd-p (cmd)
  (member (type (eval (read (strcat "C:" cmd)))) '(SUBR USUBR EXRXSUBR)))

(defun tv-key-def (key cmd)
  (eval (list 'defun (read (strcat "C:" key)) '() (list (read (strcat "C:" cmd))) '(princ))))

;; acad.pgp ¿¡ °°Àº º°ÄªÀÌ ÀÖ³ª ("L,   *LINE")
(defun tv-key-pgp-p (key / f h l hit)
  (if (setq f (findfile "acad.pgp"))
    (progn
      (setq h (open f "r"))
      (while (and (not hit) (setq l (read-line h)))
        (if (and (not (wcmatch l ";*")) (wcmatch (strcase l) (strcat key ",*"))) (setq hit T)))
      (close h)))
  hit)

;; ¾µ ¼ö ¾ø´Â ´ÜÃàÅ°¸é ±î´ßÀ», ¾µ ¼ö ÀÖÀ¸¸é nil
(defun tv-key-bad (key lst)
  (cond
    ((not (vl-every '(lambda (c) (or (<= 48 c 57) (<= 65 c 90))) (vl-string->list key))) "¿µ¹®°ú ¼ýÀÚ¸¸ ¾¹´Ï´Ù")
    ((getcname key) "AutoCAD ¸í·É°ú °°Àº ÀÌ¸§ÀÔ´Ï´Ù")
    ((tv-key-pgp-p key) "AutoCAD ´ÜÃàÅ°(acad.pgp)¿Í °°Àº ÀÌ¸§ÀÔ´Ï´Ù")
    ((and (tv-key-cmd-p key) (not (assoc key lst))) "ÀÌ¹Ì ÀÖ´Â ¸®½À ¸í·ÉÀÔ´Ï´Ù")))

(defun c:TVKEY (/ cmd key lst why)
  (setq lst (tv-key-list)
        cmd (strcase (getstring "\n´ÜÃàÅ°¸¦ ºÙÀÏ ¸í·É [¸ñ·Ï(?)]: ")))
  (cond
    ((= cmd ""))
    ((= cmd "?")
     (if lst
       (foreach p lst (princ (strcat "\n  " (car p) " = " (cdr p))))
       (princ "\nÁ¤ÇÑ ´ÜÃàÅ°°¡ ¾ø½À´Ï´Ù")))
    ((not (tv-key-cmd-p cmd)) (princ (strcat "\n" cmd " ´Â ºÒ·¯¿Â ¸®½À ¸í·ÉÀÌ ¾Æ´Õ´Ï´Ù")))
    (T
     (setq key (strcase (getstring (strcat "\n" cmd " ÀÇ »õ ´ÜÃàÅ° [Áö¿ì±â(-)]: "))))
     (cond
       ((= key ""))
       ((= key "-")
        (foreach p lst
          (if (= (cdr p) cmd) (set (read (strcat "C:" (car p))) nil)))
        (tv-key-save (vl-remove-if '(lambda (p) (= (cdr p) cmd)) lst))
        (princ (strcat "\n" cmd " ÀÇ ´ÜÃàÅ°¸¦ Áö¿ü½À´Ï´Ù")))
       ((= key cmd))
       ((setq why (tv-key-bad key lst)) (princ (strcat "\n" key ": " why)))
       (T
        (tv-key-save (cons (cons key cmd) (vl-remove-if '(lambda (p) (= (car p) key)) lst)))
        (tv-key-def key cmd)
        (princ (strcat "\nÀÌÁ¦ " key " ·Îµµ " cmd " °¡ ½ÇÇàµË´Ï´Ù"))))))
  (princ))

;; ºÒ·¯¿Ã ¶§ - ÀúÀåµÈ ´ÜÃàÅ° Áß ¸í·ÉÀÌ ºÒ·¯¿ÍÁ® ÀÖ´Â °ÍÀ» µÇ»ì¸°´Ù
(foreach p (tv-key-list)
  (if (tv-key-cmd-p (cdr p)) (tv-key-def (car p) (cdr p))))
(princ "\n´ÜÃàÅ° ¹Ù²Ù±â: TVKEY")
(princ)
