;;; µîºÐ ÀÚ¸£±â - TORVA ¹«·á ¸®½À (torva.kr/lisp.html)
;;; EQ  : ¼±¡¤Æú¸®¼±À» N µîºÐÀ¸·Î ÀÚ¸¥´Ù. S ¸¦ ÀÔ·ÂÇÏ¸é °£°Ý ÀÚ¸£±â - Å¬¸¯ÇÑ ³¡¿¡¼­ºÎÅÍ Á¤ÇÑ ±æÀÌ¸¶´Ù ÀÚ¸¥´Ù
;;; EQC : °í¸¥ °´Ã¼¸¦ ½ÃÀÛÁ¡~³¡Á¡ »çÀÌ¿¡ N µîºÐ °£°ÝÀ¸·Î º¹»çÇÑ´Ù
;;; ¿©·¯ °´Ã¼¸¦ ÇÑ ¹ø¿¡ °ñ¶óµµ µÈ´Ù. ³¡³­ µÚ µÇµ¹¸®±â(U) ÇÑ ¹ø¿¡ ÀüºÎ µ¹¾Æ°£´Ù

(vl-load-com)

;; ent ¸¦ ½ÃÀÛ¿¡¼­ºÎÅÍ Àé °Å¸® ¸ñ·Ï dists ÀÚ¸®¸¶´Ù ²÷´Â´Ù (¸Õ °÷ºÎÅÍ ²÷¾î¾ß °Å¸®°¡ ¾È ¹Ù²ï´Ù)
(defun tv-divide-cut (ent dists / p)
  (foreach d (vl-sort dists '>)
    (if (setq p (vlax-curve-getPointAtDist ent d))
      (progn
        (setq p (trans p 0 1))
        (command "_.BREAK" (list ent p) "_F" "_non" p "_non" p)))))

(defun tv-divide-len (ent) (vlax-curve-getDistAtParam ent (vlax-curve-getEndParam ent)))

(defun c:EQ (/ *error* ce doc ss inp pick gap i ent len rev n j dists)
  (setq ce (getvar "CMDECHO") doc (vla-get-activedocument (vlax-get-acad-object)))
  (defun *error* (msg)
    (setvar "CMDECHO" ce) (vla-EndUndoMark doc)
    (if (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*")) (princ (strcat "\n¿À·ù: " msg)))
    (princ))
  (setvar "CMDECHO" 0)
  (vla-StartUndoMark doc)
  (princ "\nÀÚ¸¦ ¼±¡¤Æú¸®¼± ¼±ÅÃ: ")
  (if (setq ss (ssget '((0 . "LINE,LWPOLYLINE"))))
    (progn
      (initget 6 "S")
      (setq inp (getint "\nµîºÐ °³¼ö [°£°Ý ÀÚ¸£±â(S)]: "))
      (cond
        ;; °£°Ý ÀÚ¸£±â - Å¬¸¯ÇÑ ÂÊ ³¡¿¡¼­ºÎÅÍ gap ¸¶´Ù
        ((= inp "S")
         (if (and (setq pick (getpoint "\n½ÃÀÛÇÒ ³¡ ÂÊÀ» Å¬¸¯: "))
                  (setq gap (getdist "\n°£°Ý: ")))
           (progn
             (setq i 0)
             (repeat (sslength ss)
               (setq ent (ssname ss i) len (tv-divide-len ent) dists nil j 1
                     rev (> (vlax-curve-getDistAtPoint ent (vlax-curve-getClosestPointTo ent (trans pick 1 0))) (/ len 2.0))
                     n (fix (/ (- len 1e-6) gap)))
               (repeat n
                 (setq dists (cons (if rev (- len (* j gap)) (* j gap)) dists) j (1+ j)))
               (tv-divide-cut ent dists)
               (setq i (1+ i)))
             (princ (strcat "\n" (rtos gap 2 0) " °£°ÝÀ¸·Î Àß¶ú½À´Ï´Ù.")))))
        ;; µîºÐ
        ((and inp (> inp 1))
         (setq i 0)
         (repeat (sslength ss)
           (setq ent (ssname ss i) len (tv-divide-len ent) dists nil j 1)
           (repeat (1- inp)
             (setq dists (cons (* j (/ len inp)) dists) j (1+ j)))
           (tv-divide-cut ent dists)
           (setq i (1+ i)))
         (princ (strcat "\n" (itoa inp) " µîºÐÀ¸·Î Àß¶ú½À´Ï´Ù."))))))
  (vla-EndUndoMark doc)
  (setvar "CMDECHO" ce)
  (princ)
)

(defun c:EQC (/ *error* ce doc ss p1 p2 n ang step k)
  (setq ce (getvar "CMDECHO") doc (vla-get-activedocument (vlax-get-acad-object)))
  (defun *error* (msg)
    (setvar "CMDECHO" ce) (vla-EndUndoMark doc)
    (if (not (wcmatch (strcase msg) "*CANCEL*,*QUIT*,*BREAK*")) (princ (strcat "\n¿À·ù: " msg)))
    (princ))
  (setvar "CMDECHO" 0)
  (vla-StartUndoMark doc)
  (princ "\nº¹»çÇÒ °´Ã¼ ¼±ÅÃ: ")
  (if (and (setq ss (ssget))
           (setq p1 (getpoint "\n½ÃÀÛÁ¡: "))
           (setq p2 (getpoint p1 "\n³¡Á¡: "))
           (progn (initget 6) (setq n (getint "\nµîºÐ °³¼ö: "))))
    (if (> n 1)
      (progn
        (setq ang (angle p1 p2) step (/ (distance p1 p2) (float n)) k 1)
        (repeat (1- n)
          (command "_.COPY" ss "" "_non" p1 "_non" (polar p1 ang (* k step)))
          (setq k (1+ k)))
        (princ (strcat "\n" (itoa n) " µîºÐ °£°ÝÀ¸·Î º¹»çÇß½À´Ï´Ù.")))
      (princ "\nµîºÐ °³¼ö´Â 2 ÀÌ»óÀÔ´Ï´Ù.")))
  (vla-EndUndoMark doc)
  (setvar "CMDECHO" ce)
  (princ)
)

(princ "\nµîºÐ ÀÚ¸£±â: EQ (µîºÐ¡¤°£°Ý ÀÚ¸£±â) / EQC (µîºÐ º¹»ç) / 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)
