;;; ±ÛÀÚ ¾ÕµÚ ºÙÀÌ±â¡¤¹Ù²Ù±â - TORVA ¹«·á ¸®½À (torva.kr/lisp.html)
;;; TXP : °í¸¥ ±ÛÀÚ ¾Õ¿¡ ºÙÀÌ±â        (B1 -> 2B1)
;;; TXS : °í¸¥ ±ÛÀÚ µÚ¿¡ ºÙÀÌ±â        (G1 -> G1A)
;;; TXF : ¾Õ ±ÛÀÚ ¹Ù²Ù±â. ÀÔ·ÂÇÑ ±ÛÀÚ ¼ö¸¸Å­ ¾ÕÀ» ¹Ù²Û´Ù (2G1 -> 3G1 : 3 ÀÔ·Â)
;;; TXR : Ã£¾Æ ¹Ù²Ù±â. ¹Ù²Ü ±ÛÀÚ¸¦ ºñ¿ì¸é Áö¿î´Ù
;;; TEXT, MTEXT ´ë»ó. Àá±ä ·¹ÀÌ¾î´Â °Çµå¸®Áö ¾Ê´Â´Ù. ÇÑ ¹øÀÇ U ·Î µÇµ¹¸°´Ù

(vl-load-com)

;; ±ÛÀÚ ÀüºÎ ¹Ù²Ù±â - »õ ±ÛÀÚ¿¡ ¿¾ ±ÛÀÚ°¡ µé¾î ÀÖ¾îµµ ³¡³­´Ù
(defun tv-te-replace (s old new / i)
  (setq i 0)
  (while (setq i (vl-string-search old s i))
    (setq s (strcat (substr s 1 i) new (substr s (+ i 1 (strlen old))))
          i (+ i (strlen new))))
  s)

;; °øÅë - ±ÛÀÚ¸¦ °í¸£°í fn À¸·Î ¹Ù²Û´Ù
(defun tv-te-apply (fn / *error* old ss i ed n)
  (setq old *error*)
  (defun *error* (msg)
    (command "_.UNDO" "_E")
    (setq *error* old)
    (if (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*")) (princ (strcat "\n¿À·ù: " msg)))
    (princ))
  (setq ss (cond ((ssget "_I" '((0 . "TEXT,MTEXT"))))
                 (T (prompt "\n¹Ù²Ü ±ÛÀÚ ¼±ÅÃ: ") (ssget ":L" '((0 . "TEXT,MTEXT"))))))
  (sssetfirst nil nil)
  (if ss
    (progn
      (command "_.UNDO" "_BE")
      (setq i 0 n 0)
      (repeat (sslength ss)
        (setq ed (entget (ssname ss i)) i (1+ i))
        (if (entmod (subst (cons 1 (apply fn (list (cdr (assoc 1 ed))))) (assoc 1 ed) ed)) (setq n (1+ n))))
      (command "_.UNDO" "_E")
      (princ (strcat "\n±ÛÀÚ " (itoa n) "°³ ¹Ù²Þ"))))
  (setq *error* old)
  (princ))

(defun c:TXP (/ a)
  (if (/= "" (setq a (getstring T "\n¾Õ¿¡ ºÙÀÏ ±ÛÀÚ: ")))
    (tv-te-apply '(lambda (s) (strcat a s))))
  (princ))

(defun c:TXS (/ a)
  (if (/= "" (setq a (getstring T "\nµÚ¿¡ ºÙÀÏ ±ÛÀÚ: ")))
    (tv-te-apply '(lambda (s) (strcat s a))))
  (princ))

(defun c:TXF (/ a)
  (if (/= "" (setq a (getstring T "\n¾ÕÀ» ¹Ù²Ü »õ ±ÛÀÚ (±ÛÀÚ ¼ö¸¸Å­ ¹Ù²ï´Ù): ")))
    (tv-te-apply '(lambda (s) (strcat a (substr s (1+ (strlen a)))))))
  (princ))

(defun c:TXR (/ a b)
  (if (/= "" (setq a (getstring T "\nÃ£À» ±ÛÀÚ: ")))
    (progn
      (setq b (getstring T (strcat "\n" a " ¸¦ ¹Ù²Ü ±ÛÀÚ (¿£ÅÍ = Áö¿ì±â): ")))
      (tv-te-apply '(lambda (s) (tv-te-replace s a b)))))
  (princ))

(princ "\n±ÛÀÚ ºÙÀÌ±â¡¤¹Ù²Ù±â: TXP (¾Õ) / TXS (µÚ) / TXF (¾Õ ¹Ù²Ù±â) / TXR (Ã£¾Æ ¹Ù²Ù±â) / 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)
