;;; ==========================================================================
;;;  K-°Ç¼³¸Ê Ä³µå À¯Æ¿        ¿øº» ÆÄÀÏ ÀÌ¸§:  k-conmap.lsp
;;;  ¹öÀü 2.5   2026-09-14     https://k-conmap.com      ¹«·á·Î ¾²¼Åµµ µË´Ï´Ù
;;;
;;;  ------------------------ ¸¸µç °÷ ¡¤ ÀÌ¿ë Á¶°Ç ------------------------
;;;   ¸¸µç °÷ : K-°Ç¼³¸Ê  https://k-conmap.com
;;;   °ª      : ¹«·áÀÔ´Ï´Ù. ÇöÀå µ¿·á¡¤Çù·Â¾÷Ã¼¿¡ ¸¶À½²¯ ³ª´² ÁÖ½Ê½Ã¿À.
;;;   Á¶°Ç    : ¸¸µç °÷ Ç¥½Ã¿Í ÀÌ ¸Ó¸®¸»Àº Áö¿ìÁö ¸¶½Ê½Ã¿À.
;;;             ³»¿ëÀ» °íÃÄ¼­ ¹èÆ÷ÇÏ½Ç ¶§¿¡µµ ÃâÃ³¸¦ ³²°Ü ÁÖ½Ê½Ã¿À.
;;;   ¿øº» ÆÄÀÏ ÀÌ¸§ : k-conmap.lsp   (ÃÖ½ÅÆÇÀº ´Ã À§ ÁÖ¼Ò¿¡ ÀÖ½À´Ï´Ù)
;;;   À¯È¿±â°£       : ¹ÞÀ¸½Å ³¯ºÎÅÍ 30ÀÏÀÔ´Ï´Ù (¾Æ·¡ kcm*exp ³¯Â¥).
;;;                    Áö³ª¸é k-conmap.com/cad ¿¡¼­ »õ·Î ¹Þ¾Æ µ¤¾î¾²½Ã¸é µË´Ï´Ù.
;;;                    ¹«·áÀÌ°í 10ÃÊ¸é ³¡³³´Ï´Ù. ¼³Á¤Àº ±×´ë·Î ³²½À´Ï´Ù.
;;;   »õ ¹öÀü È®ÀÎ   : ¸í·ÉÃ¢¿¡  KUPDATE
;;;   ÀÚµ¿ µî·Ï      : ¸í·ÉÃ¢¿¡  KINSTALL  (Ä³µå ÄÓ ¶§¸¶´Ù ÀúÀý·Î ¿Ã¶ó¿É´Ï´Ù)
;;;  ---------------------------------------------------------------------
;;;
;;;  ------------------------------------------------------------------------
;;;   ¾²´Â ¹ýÀº ÇÏ³ªÀÔ´Ï´Ù.   ¸í·ÉÃ¢¿¡   K   -> Ã¢ÀÌ ¶ß¸é ´ÜÃß¸¦ ´©¸£½Ê½Ã¿À.
;;;  ------------------------------------------------------------------------
;;;
;;;  2.0 ¿¡¼­ ¹Ù²ï °Í
;;;   . ¸í·ÉÀ» ¿Ü¿ìÁö ¾Ê½À´Ï´Ù. K ¸¦ Ä¡¸é ¡¸´ÜÃß Ã¢¡¹ÀÌ ¶å´Ï´Ù
;;;   . µµ¸é ´ÜÀ§¸¦ ¡¸ÀÚµ¿¡¹À¸·Î ¾Ë¾Æ³À´Ï´Ù (INSUNITS). Æ²¸®¸é Ã¢¿¡¼­ ¹Ù²Ù½Ê½Ã¿À
;;;   . °á°úµµ Ã¢À¸·Î ³ª¿É´Ï´Ù. [¿¢¼¿·Î ÀúÀå] [µµ¸é¿¡ Àû±â] [´Ù¸¥ °è»ê] ´ÜÃß
;;;   . ¾µµ¥¾øÀÌ ¹¯´ø Áú¹®À» ¾ø¾Ý½À´Ï´Ù
;;;   . Ã¢ÀÌ ¾È ¶ß´Â Ä³µå¿¡¼­´Â ÀúÀý·Î ¡¸±ÛÀÚ ¸Þ´º¡¹·Î ¹Ù²ò´Ï´Ù (¾È ¸ØÃä´Ï´Ù)
;;;
;;;  ¸í·É ÀÌ¸§À¸·Î ¹Ù·Î ¾²¼Åµµ µË´Ï´Ù:
;;;   KL ±æÀÌÇÕ ¡¤ KA ¸éÀûÇÕ ¡¤ KN ¼ýÀÚÇÕ ¡¤ KC °³¼ö¼¼±â ¡¤ KD °Å¸®Àç±â ¡¤ KI Á¤º¸
;;;   KXY ÁÂÇ¥»Ì±â ¡¤ KXYT ÁÂÇ¥Àû±â ¡¤ KIN ÁÂÇ¥³Ö±â
;;;   KAT ¸éÀûÀû±â ¡¤ KTH ¹®ÀÚ³ôÀÌ ¡¤ KLAY ·¹ÀÌ¾î ¡¤ KDUP Áßº¹Á¦°Å ¡¤ KBG ¹è°æ»ö
;;;   KUNIT ´ÜÀ§ ¡¤ KHELP µµ¿ò¸» ¡¤ KCONMAP ¡¤ KSARASA
;;;
;;;  ¼ø¼ö AutoLISP + DCL ¸¸ ¾¹´Ï´Ù. ActiveX(vla-) ´Â ¾È ¾¹´Ï´Ù.
;;;  AutoCAD / AutoCAD LT 2024 ÀÌ»ó / Ä³µð¾È / ZWCAD / GstarCAD ¿¡¼­ µ½´Ï´Ù.
;;; ==========================================================================


;;; ================================================================ °øÅë µµ±¸

(defun kcm:posdot ( s / i n p )
  (setq i 1 n (strlen s) p 0)
  (while (and (<= i n) (= p 0))
    (if (= (substr s i 1) ".") (setq p i))
    (setq i (1+ i)))
  p
)

(defun kcm:comma ( s / p head tail sign n i out )
  (setq p (kcm:posdot s))
  (if (> p 0)
    (setq head (substr s 1 (1- p)) tail (substr s p))
    (setq head s tail ""))
  (setq sign "")
  (if (= (substr head 1 1) "-") (setq sign "-" head (substr head 2)))
  (if (= (substr head 1 1) "+") (setq head (substr head 2)))
  (setq n (strlen head) out "" i 0)
  (while (> n 0)
    (setq out (strcat (substr head n 1) out) i (1+ i) n (1- n))
    (if (and (= 0 (rem i 3)) (> n 0)) (setq out (strcat "," out))))
  (strcat sign out tail)
)

(defun kcm:num ( x prec ) (kcm:comma (rtos x 2 prec)))
(defun kcm:raw ( x prec ) (rtos x 2 prec))
(defun kcm:digit ( c ) (and (= 1 (strlen c)) (>= (ascii c) 48) (<= (ascii c) 57)))
(defun kcm:say ( s ) (princ (strcat "\n" s)))
(setq kcm*ver "2.5")
(setq kcm*exp  20261014)   ; [¹èÆ÷¶§ÂïÀ½] ÀÌ ÆÇÀ» ¾µ ¼ö ÀÖ´Â ¸¶Áö¸· ³¯
(setq kcm*warn 20261007)   ; [¹èÆ÷¶§ÂïÀ½] ÀÌ ³¯ºÎÅÍ ¹Ì¸® ¾Ë·Á ÁÝ´Ï´Ù
;; À§ µÎ ÁÙÀº »çÀÌÆ®¿¡ ¿Ã¸± ¶§ ¡¸¹Þ´Â ³¯ + 30ÀÏ¡¹ ·Î ÀÚµ¿À¸·Î ´Ù½Ã ÂïÈü´Ï´Ù.
;; Á÷Á¢ ¹ÞÀ¸½Å ÆÇÀº ´Ã 30ÀÏÀÌ ³²¾Æ ÀÖ½À´Ï´Ù. k-conmap.com/cad ¿¡¼­ ¹ÞÀ¸½Ê½Ã¿À.

;; 20270331 -> "2027-03-31"
(defun kcm:dstr ( n / s )
  (setq s (itoa n))
  (strcat (substr s 1 4) "-" (substr s 5 2) "-" (substr s 7 2))
)

(defun kcm:today () (fix (getvar "CDATE")))

;; ÄÄÇ»ÅÍ ³¯Â¥°¡ ¾û¶×ÇÏ¸é(2020³â ÀÌÀü) ±×³É Åë°ú½ÃÅµ´Ï´Ù
(defun kcm:expired ()
  (and (>= (kcm:today) 20200101) (> (kcm:today) kcm*exp))
)

(defun kcm:expalert ()
  (alert (strcat "K-°Ç¼³¸Ê Ä³µå À¯Æ¿ " kcm*ver "\n\n"
                 "ÀÌ ÆÇÀº " (kcm:dstr kcm*exp) " ±îÁö ¾µ ¼ö ÀÖ½À´Ï´Ù.\n"
                 "±â°£ÀÌ Áö³µ½À´Ï´Ù.\n\n"
                 "ÃÖ½ÅÆÇÀ» ¹ÞÀ¸½Ã¸é µË´Ï´Ù.  ¹«·áÀÌ°í 10ÃÊ¸é ³¡³³´Ï´Ù.\n\n"
                 "        https://k-conmap.com/cad\n\n"
                 "¹ÞÀº ÆÄÀÏÀ» ¾²½Ã´ø ÀÚ¸®¿¡ ±×´ë·Î µ¤¾î¾²½Ê½Ã¿À.\n"
                 "¼³Á¤(µµ¸é ´ÜÀ§¡¤ÁÂÇ¥ Ç¥±â)µµ, ÀÚµ¿ µî·Ï(KINSTALL)µµ ±×´ë·ÎÀÔ´Ï´Ù."))
  (startapp "explorer" "https://k-conmap.com/cad")
  (princ)
)

(defun kcm:remove1 ( x l / out done )
  (setq out '() done nil)
  (foreach y l
    (if (and (not done) (equal y x)) (setq done T) (setq out (cons y out))))
  (reverse out)
)

(defun kcm:sortd ( al / out best )
  (setq out '())
  (while al
    (setq best (car al))
    (foreach x al (if (> (cdr x) (cdr best)) (setq best x)))
    (setq out (cons best out))
    (setq al (kcm:remove1 best al)))
  (reverse out)
)

(defun kcm:acc ( key val al / a )
  (setq a (assoc key al))
  (if a (subst (cons key (+ (cdr a) val)) a al) (cons (cons key val) al))
)

(defun kcm:has ( s sub / i n m )
  (setq n (strlen s) m (strlen sub) i 1)
  (while (and (<= i (- n m -1)) (/= (strcase (substr s i m)) (strcase sub)))
    (setq i (1+ i)))
  (<= i (- n m -1))
)

(defun kcm:slash ( s / i n c out )
  (setq i 1 n (strlen s) out "")
  (while (<= i n)
    (setq c (substr s i 1))
    (setq out (strcat out (if (= c "\\") "/" c)))
    (setq i (1+ i)))
  out
)

(defun kcm:pad ( s w / o )
  (setq o s)
  (while (< (strlen o) w) (setq o (strcat o " ")))
  o
)


;;; ============================================================== µµ¸é ´ÜÀ§

;; kcm*u = µµ¸é 1´ÜÀ§°¡ ¸î m ÀÎ°¡.  INSUNITS ·Î ¡¸ÀÚµ¿¡¹ ÆÇ´ÜÇÕ´Ï´Ù.
(defun kcm:setu ( v nm )
  (setq kcm*u v kcm*un nm)
  (kcm:say (strcat "  µµ¸é ´ÜÀ§: " nm))
  v
)

(defun kcm:autounit ( / iu )
  (setq iu (getvar "INSUNITS"))
  (cond
    ((= iu 4) (kcm:setu 0.001 "mm"))
    ((= iu 5) (kcm:setu 0.01  "cm"))
    ((= iu 6) (kcm:setu 1.0   "m"))
    ((= iu 1) (kcm:setu 0.0254 "inch"))
    (T        (kcm:setu 0.001 "mm"))
  )
)

(defun kcm:u () (if (null kcm*u) (kcm:autounit)) kcm*u)

(defun C:KUNIT ( / k )
  (initget "MM CM M")
  (setq k (getkword "\nµµ¸é 1´ÜÀ§ [MM/CM/M] <MM>: "))
  (cond ((= k "CM") (kcm:setu 0.01 "cm"))
        ((= k "M")  (kcm:setu 1.0 "m"))
        (T          (kcm:setu 0.001 "mm")))
  (princ)
)


;;; ===================================================== »ö¡¤¼±Á¾·ù¡¤¼±±½±â ÀÐ±â

(defun kcm:colorname ( n )
  (cond
    ((null n) "·¹ÀÌ¾îº°") ((= n 0) "ºí·Ïº°")
    ((= n 1) "»¡°­(1)")  ((= n 2) "³ë¶û(2)") ((= n 3) "ÃÊ·Ï(3)")
    ((= n 4) "ÇÏ´Ã(4)")  ((= n 5) "ÆÄ¶û(5)") ((= n 6) "ºÐÈ«(6)")
    ((= n 7) "Èò°Ë(7)")  ((= n 8) "ÁøÈ¸»ö(8)") ((= n 9) "¿¬È¸»ö(9)")
    ((= n 256) "·¹ÀÌ¾îº°")
    (T (strcat (itoa n) "¹ø"))
  )
)

(defun kcm:objcol ( e / d c tb )
  (setq d (entget e) c (cdr (assoc 62 d)))
  (if (or (null c) (= c 256))
    (progn
      (setq tb (tblsearch "LAYER" (cdr (assoc 8 d))))
      (setq c (if tb (cdr (assoc 62 tb)) 7))
      (if (and c (< c 0)) (setq c (abs c)))))
  (if (null c) 7 c)
)

(defun kcm:objlt ( e / d lt tb )
  (setq d (entget e) lt (cdr (assoc 6 d)))
  (if (or (null lt) (= (strcase lt) "BYLAYER"))
    (progn
      (setq tb (tblsearch "LAYER" (cdr (assoc 8 d))))
      (setq lt (if tb (cdr (assoc 6 tb)) "CONTINUOUS"))))
  (if lt lt "CONTINUOUS")
)

(defun kcm:objlw ( e / d w tb )
  (setq d (entget e) w (cdr (assoc 370 d)))
  (if (or (null w) (< w 0))
    (progn
      (setq tb (tblsearch "LAYER" (cdr (assoc 8 d))))
      (setq w (if tb (cdr (assoc 370 tb)) nil))))
  (if (and w (>= w 0)) (strcat (rtos (/ w 100.0) 2 2) " mm") "±âº»°ª")
)


;;; ============================================================= ±æÀÌ¡¤³ÐÀÌ °è»ê

(defun kcm:arclen ( p1 p2 b / c th r )
  (setq c (distance p1 p2))
  (if (or (null b) (equal b 0.0 1e-12) (< c 1e-12))
    c
    (progn
      (setq th (* 4.0 (atan (abs b))))
      (setq r (/ c (* 2.0 (sin (/ th 2.0)))))
      (* r th)))
)

(defun kcm:segarea ( p1 p2 b / c th r )
  (if (or (null b) (equal b 0.0 1e-12))
    0.0
    (progn
      (setq c (distance p1 p2)
            th (* 4.0 (atan (abs b)))
            r (/ c (* 2.0 (sin (/ th 2.0)))))
      (* (if (< b 0) -1.0 1.0) 0.5 r r (- th (sin th)))))
)

(defun kcm:cross ( p1 p2 )
  (* 0.5 (- (* (car p1) (cadr p2)) (* (car p2) (cadr p1))))
)

(defun kcm:lwvs ( d / vs )
  (setq vs '())
  (foreach it d
    (cond
      ((= 10 (car it)) (setq vs (cons (list (cdr it) 0.0) vs)))
      ((= 42 (car it))
        (if vs (setq vs (cons (list (car (car vs)) (cdr it)) (cdr vs)))))))
  (reverse vs)
)

(defun kcm:pvs ( e / v vd vs f )
  (setq vs '() v (entnext e))
  (while (and v (setq vd (entget v)) (/= "SEQEND" (cdr (assoc 0 vd))))
    (if (= "VERTEX" (cdr (assoc 0 vd)))
      (progn
        (setq f (cond ((cdr (assoc 70 vd))) (0)))
        (if (and (= 0 (logand 16 f)) (= 0 (logand 1 f)))
          (setq vs (cons (list (cdr (assoc 10 vd))
                               (cond ((cdr (assoc 42 vd))) (0.0))) vs)))))
    (setq v (entnext v)))
  (reverse vs)
)

(defun kcm:vslen ( vs cl / tot prev fst )
  (if (< (length vs) 2)
    0.0
    (progn
      (setq fst (car vs) prev fst tot 0.0)
      (foreach v (cdr vs)
        (setq tot (+ tot (kcm:arclen (car prev) (car v) (cadr prev))) prev v))
      (if cl (setq tot (+ tot (kcm:arclen (car prev) (car fst) (cadr prev)))))
      tot))
)

(defun kcm:vsarea ( vs / tot prev fst )
  (if (< (length vs) 3)
    0.0
    (progn
      (setq fst (car vs) prev fst tot 0.0)
      (foreach v (cdr vs)
        (setq tot (+ tot (kcm:cross (car prev) (car v))
                       (kcm:segarea (car prev) (car v) (cadr prev))))
        (setq prev v))
      (setq tot (+ tot (kcm:cross (car prev) (car fst))
                     (kcm:segarea (car prev) (car fst) (cadr prev))))
      (abs tot)))
)

(defun kcm:len ( e / d ty a1 a2 da )
  (setq d (entget e) ty (cdr (assoc 0 d)))
  (cond
    ((= ty "LINE")   (distance (cdr (assoc 10 d)) (cdr (assoc 11 d))))
    ((= ty "CIRCLE") (* 2.0 pi (cdr (assoc 40 d))))
    ((= ty "ARC")
      (setq a1 (cdr (assoc 50 d)) a2 (cdr (assoc 51 d)) da (- a2 a1))
      (if (< da 0) (setq da (+ da (* 2.0 pi))))
      (* (cdr (assoc 40 d)) da))
    ((= ty "LWPOLYLINE")
      (kcm:vslen (kcm:lwvs d) (= 1 (logand 1 (cond ((cdr (assoc 70 d))) (0))))))
    ((= ty "POLYLINE")
      (kcm:vslen (kcm:pvs e) (= 1 (logand 1 (cond ((cdr (assoc 70 d))) (0))))))
    (T nil))
)

;; ¿­¸° Æú¸®¼±µµ ´ÝÈù °ÍÀ¸·Î º¾´Ï´Ù (Ä³µåÀÇ AREA ¸í·É°ú °°Àº ¹æ½Ä)
(defun kcm:area ( e / d ty a b )
  (setq d (entget e) ty (cdr (assoc 0 d)))
  (cond
    ((= ty "CIRCLE") (* pi (expt (cdr (assoc 40 d)) 2)))
    ((= ty "ELLIPSE")
      (if (and (equal (cond ((cdr (assoc 41 d))) (0.0)) 0.0 1e-8)
               (equal (abs (cond ((cdr (assoc 42 d))) (0.0))) (* 2.0 pi) 1e-6))
        (progn
          (setq a (distance '(0.0 0.0 0.0) (cdr (assoc 11 d))))
          (setq b (* a (cdr (assoc 40 d))))
          (* pi a b))
        nil))
    ((= ty "LWPOLYLINE") (kcm:vsarea (kcm:lwvs d)))
    ((= ty "POLYLINE")   (kcm:vsarea (kcm:pvs e)))
    (T nil))
)

(defun kcm:center ( e / d ty vs sx sy n )
  (setq d (entget e) ty (cdr (assoc 0 d)))
  (cond
    ((member ty '("CIRCLE" "ARC" "ELLIPSE")) (cdr (assoc 10 d)))
    ((member ty '("LWPOLYLINE" "POLYLINE"))
      (setq vs (if (= ty "LWPOLYLINE") (kcm:lwvs d) (kcm:pvs e)))
      (setq sx 0.0 sy 0.0 n 0)
      (foreach v vs (setq sx (+ sx (car (car v))) sy (+ sy (cadr (car v))) n (1+ n)))
      (if (> n 0) (list (/ sx n) (/ sy n) 0.0) nil))
    (T nil))
)


;;; ================================================================ ¹®ÀÚ ´Ù·ç±â

(defun kcm:strip ( s / out i n c nx )
  (setq out "" i 1 n (strlen s))
  (while (<= i n)
    (setq c (substr s i 1))
    (cond
      ((= c "\\")
        (setq nx (substr s (1+ i) 1))
        (cond
          ((member nx '("P" "p" "X" "x")) (setq out (strcat out " ") i (+ i 2)))
          ((member nx '("f" "F" "H" "h" "W" "w" "A" "a" "C" "c" "T" "t" "Q" "q" "S" "s" "L" "l" "O" "o" "K" "k"))
            (setq i (+ i 2))
            (while (and (<= i n) (/= (substr s i 1) ";")) (setq i (1+ i)))
            (setq i (1+ i)))
          (T (setq out (strcat out nx) i (+ i 2)))))
      ((or (= c "{") (= c "}")) (setq i (1+ i)))
      (T (setq out (strcat out c) i (1+ i)))))
  out
)

(defun kcm:nocomma ( s / i n out c )
  (setq i 1 n (strlen s) out "")
  (while (<= i n)
    (setq c (substr s i 1))
    (if (/= c ",") (setq out (strcat out c)))
    (setq i (1+ i)))
  out
)

(defun kcm:validnum ( t2 / i n c d dot ok )
  (setq n (strlen t2) i 1 d 0 dot 0 ok T)
  (if (= n 0) (setq ok nil))
  (while (and ok (<= i n))
    (setq c (substr t2 i 1))
    (cond
      ((kcm:digit c) (setq d (1+ d)))
      ((= c ".") (setq dot (1+ dot)))
      ((and (or (= c "-") (= c "+")) (= i 1)) nil)
      (T (setq ok nil)))
    (setq i (1+ i)))
  (and ok (> d 0) (< dot 2))
)

(defun kcm:tok2num ( tok / t2 )
  (setq t2 (kcm:nocomma tok))
  (while (and (> (strlen t2) 0) (member (substr t2 (strlen t2) 1) '("." "-" "+")))
    (setq t2 (substr t2 1 (1- (strlen t2)))))
  (if (kcm:validnum t2) (atof t2) nil)
)

(defun kcm:firstnum ( s / i n c tok res )
  (setq s (kcm:strip s) i 1 n (strlen s) tok "" res nil)
  (while (and (<= i n) (null res))
    (setq c (substr s i 1))
    (if (or (kcm:digit c) (= c ".") (= c ",") (= c "-") (= c "+"))
      (setq tok (strcat tok c))
      (if (/= tok "") (setq res (kcm:tok2num tok) tok "")))
    (setq i (1+ i)))
  (if (and (null res) (/= tok "")) (setq res (kcm:tok2num tok)))
  res
)

(defun kcm:txt ( e / d ty )
  (setq d (entget e) ty (cdr (assoc 0 d)))
  (if (member ty '("TEXT" "MTEXT" "ATTDEF" "ATTRIB"))
    (kcm:strip (cond ((cdr (assoc 1 d))) ("")))
    nil)
)

(defun kcm:cq ( s / i n c out q )
  (if (null s) (setq s ""))
  (setq n (strlen s) i 1 out "" q nil)
  (while (<= i n)
    (setq c (substr s i 1))
    (cond
      ((= c "\"") (setq out (strcat out "\"\"") q T))
      ((= c ",")  (setq out (strcat out c) q T))
      (T (setq out (strcat out c))))
    (setq i (1+ i)))
  (if q (strcat "\"" out "\"") out)
)

(defun kcm:split ( s / i n c out fld q )
  (setq i 1 n (strlen s) out '() fld "" q nil)
  (while (<= i n)
    (setq c (substr s i 1))
    (cond
      ((= c "\"") (setq q (not q)))
      ((and (= c ",") (not q)) (setq out (cons fld out) fld ""))
      (T (setq fld (strcat fld c))))
    (setq i (1+ i)))
  (reverse (cons fld out))
)

(defun kcm:nth ( l i ) (if (and (> i 0) (<= i (length l))) (nth (1- i) l) nil))

(defun kcm:height ( / h v )
  ;; È­¸é¿¡ º¸ÀÌ´Â Å©±â¸¦ ±âÁØÀ¸·Î Àâ½À´Ï´Ù.
  ;; TEXTSIZE °¡ µµ¸é Å©±â¿¡ ºñÇØ ³Ê¹« ÀÛÀ¸¸é ±ÛÀÚ°¡ ÂïÇôµµ ¡¸¾È º¸ÀÔ´Ï´Ù¡¹.
  (setq v (/ (getvar "VIEWSIZE") 45.0))
  (setq h (getvar "TEXTSIZE"))
  (if (or (null h) (<= h 0.0) (< h (/ v 15.0)) (> h (* v 15.0))) (setq h v))
  h
)

;; ±ÛÀÚ ³ôÀÌ¸¦ ¹°¾îº¾´Ï´Ù. ±×³É Enter ¸é È­¸é¿¡ ¸Â´Â Å©±â.
(defun kcm:askheight ( / h a )
  (setq h (kcm:height))
  (setq a (getreal (strcat "\n±ÛÀÚ ³ôÀÌ - ±×³É Enter ¸é " (kcm:num h 2) " : ")))
  (if (and a (> a 0.0)) a h)
)

(defun kcm:mktext ( p h s )
  (entmake (list '(0 . "TEXT") (cons 10 p) (cons 40 h) (cons 1 s)))
)


;;; =============================================================== ´ëÈ­»óÀÚ(DCL)

;; DCL ÆÄÀÏÀ» ÀÓ½Ã Æú´õ¿¡ ¡¸½º½º·Î¡¹ ¸¸µé¾î ¾¹´Ï´Ù. µû·Î ÆÄÀÏÀ» ¹ÞÀ» ÇÊ¿ä°¡ ¾ø½À´Ï´Ù.
(defun kcm:dcltext ()
  (list
"kcm_menu : dialog { label = \"K-°Ç¼³¸Ê Ä³µå À¯Æ¿ 2.5        k-conmap.com\";"
"  : text { key = \"unit\"; label = \"\"; width = 56; }"
"  : row {"
"    : boxed_column { label = \" Àç ±â \";"
"      : button { key = \"kl\";   label = \"±æÀÌ ÇÕ°è\";        width = 20; }"
"      : button { key = \"ka\";   label = \"¸éÀû ÇÕ°è\";        width = 20; }"
"      : button { key = \"kn\";   label = \"¼ýÀÚ ÇÕ°è\";        width = 20; }"
"      : button { key = \"kc\";   label = \"°³¼ö ¼¼±â\";        width = 20; }"
"      : button { key = \"kd\";   label = \"°Å¸® Àç±â\";        width = 20; }"
"      : button { key = \"ki\";   label = \"¼± Á¤º¸ º¸±â\";     width = 20; }"
"    }"
"    : boxed_column { label = \" ÁÂ Ç¥ \";"
"      : button { key = \"kxy\";  label = \"ÁÂÇ¥ »Ì±â -> ¿¢¼¿\"; width = 20; }"
"      : button { key = \"kxyt\"; label = \"ÁÂÇ¥ Àû±â -> µµ¸é\"; width = 20; }"
"      : button { key = \"kin\";  label = \"ÁÂÇ¥ ³Ö±â <- ¿¢¼¿\"; width = 20; }"
"      : spacer { height = 1; }"
"      : button { key = \"kbg\";  label = \"°ËÀº ¹è°æ ¾ø¾Ö±â\";  width = 20; }"
"      : button { key = \"khelp\";label = \"µµ¿ò¸»\";            width = 20; }"
"    }"
"    : boxed_column { label = \" Á¤ ¸® \";"
"      : button { key = \"kat\";  label = \"¸éÀû Àû±â\";         width = 20; }"
"      : button { key = \"kth\";  label = \"¹®ÀÚ ³ôÀÌ ¹Ù²Ù±â\";  width = 20; }"
"      : button { key = \"klay\"; label = \"·¹ÀÌ¾î »ìÆìº¸±â\";   width = 20; }"
"      : button { key = \"kdup\"; label = \"°ãÄ£ °Í Áö¿ì±â\";    width = 20; }"
"      : spacer { height = 1; }"
"      : button { key = \"ksite\";label = \"K-°Ç¼³¸Ê ¿­±â\";     width = 20; }"
"    }"
"  }"
"  : boxed_radio_row { label = \"µµ¸é 1´ÜÀ§ (ÀÚµ¿À¸·Î Àâ¾Ò½À´Ï´Ù. Æ²¸®¸é ¹Ù²Ù½Ê½Ã¿À)\";"
"    : radio_button { key = \"umm\"; label = \"¹Ð¸®¹ÌÅÍ mm\"; }"
"    : radio_button { key = \"ucm\"; label = \"¼¾Æ¼ cm\"; }"
"    : radio_button { key = \"um\";  label = \"¹ÌÅÍ m\"; }"
"  }"
"  : text { label = \"¾²´Â ¹ý: ´ÜÃß ´©¸£±â -> ¸¶¿ì½º·Î °í¸£±â -> Enter -> °á°ú\"; }"
"  : button { key = \"cancel\"; label = \"´Ý ±â\"; is_cancel = true; width = 14;"
"             alignment = centered; }"
"}"
""
"kcm_res : dialog { label = \"K-°Ç¼³¸Ê °á°ú\";"
"  : text { key = \"ttl\"; label = \"\"; width = 58; }"
"  : list_box { key = \"lst\"; width = 58; height = 17; multiple_select = false; }"
"  : row {"
"    : button { key = \"csv\";   label = \"¿¢¼¿(CSV)·Î ÀúÀå\"; width = 18; }"
"    : button { key = \"txt\";   label = \"µµ¸é¿¡ Àû±â\";       width = 14; }"
"    : button { key = \"again\"; label = \"´Ù¸¥ °è»ê\";         width = 12; }"
"    : button { key = \"accept\";label = \"´Ý ±â\";             width = 10;"
"               is_default = true; is_cancel = true; }"
"  }"
"  : text { label = \"K-°Ç¼³¸Ê Ä³µå À¯Æ¿ (k-conmap.lsp)   k-conmap.com\"; }"
"}"
  )
)

(defun kcm:dclfile ( / p f )
  (if (and kcm*dcl (findfile kcm*dcl))
    kcm*dcl
    (progn
      (setq p (strcat (cond ((getvar "TEMPPREFIX")) ("")) "kcm_dlg.dcl"))
      (setq f (open p "w"))
      (if f
        (progn
          (foreach l (kcm:dcltext) (write-line l f))
          (close f)
          (setq kcm*dcl p))
        (setq kcm*dcl nil))
      kcm*dcl))
)

;; ¸Þ´º Ã¢.  ´©¸¥ ´ÜÃß ÀÌ¸§À» µ¹·ÁÁÝ´Ï´Ù.  Ã¢À» ¸ø ¶ç¿ì¸é nil
(defun kcm:menudlg ( / dcl id ok )
  (setq kcm*pick nil dcl (kcm:dclfile))
  (if dcl
    (progn
      (setq id (load_dialog dcl))
      (if (and id (>= id 0))
        (progn
          (if (new_dialog "kcm_menu" id)
            (progn
              (setq ok T)
              (set_tile "unit"
                (strcat "Áö±Ý µµ¸é ´ÜÀ§´Â  "  kcm*un
                        "  ·Î ÀâÇô ÀÖ½À´Ï´Ù.   (¼ýÀÚ°¡ ÀÌ»óÇÏ¸é ¾Æ·¡¿¡¼­ ¹Ù²Ù½Ê½Ã¿À)"))
              (set_tile (cond ((= kcm*un "cm") "ucm") ((= kcm*un "m") "um") ("umm")) "1")
              (action_tile "umm" "(kcm:setu 0.001 \"mm\")")
              (action_tile "ucm" "(kcm:setu 0.01 \"cm\")")
              (action_tile "um"  "(kcm:setu 1.0 \"m\")")
              (foreach k '("kl" "ka" "kn" "kc" "kd" "ki" "kxy" "kxyt" "kin"
                           "kat" "kth" "klay" "kdup" "kbg" "khelp" "ksite")
                (action_tile k "(setq kcm*pick $key)(done_dialog 1)"))
              (action_tile "cancel" "(setq kcm*pick nil)(done_dialog 0)")
              (start_dialog)))
          (unload_dialog id)))))
  (if ok kcm*pick nil)
)

;; °á°ú Ã¢.  ´©¸¥ ´ÜÃß("csv" "txt" "again" "close")¸¦ µ¹·ÁÁÝ´Ï´Ù.
;; Ã¢À» ¸ø ¶ç¿ì¸é nil (±×·¯¸é ¾Ë¸²Ã¢À¸·Î ´ë½Å º¸¿© ÁÝ´Ï´Ù)
(defun kcm:resdlg ( title lines cancsv cantxt / dcl id ok )
  (setq kcm*act "close" dcl (kcm:dclfile) ok nil)
  (if dcl
    (progn
      (setq id (load_dialog dcl))
      (if (and id (>= id 0))
        (progn
          (if (new_dialog "kcm_res" id)
            (progn
              (setq ok T)
              (set_tile "ttl" title)
              (start_list "lst")
              (foreach l lines (add_list l))
              (end_list)
              (if (null cancsv) (mode_tile "csv" 1))
              (if (null cantxt) (mode_tile "txt" 1))
              (action_tile "csv"    "(setq kcm*act \"csv\")(done_dialog 1)")
              (action_tile "txt"    "(setq kcm*act \"txt\")(done_dialog 1)")
              (action_tile "again"  "(setq kcm*act \"again\")(done_dialog 1)")
              (action_tile "accept" "(setq kcm*act \"close\")(done_dialog 0)")
              (start_dialog)))
          (unload_dialog id)))))
  (if ok kcm*act nil)
)


;;; ======================================================== °á°ú Ã³¸® (°øÅë ÇÑ °÷)

(defun kcm:savecsv ( hdr rows / p f )
  (setq p (getfiled "¿¢¼¿(CSV)·Î ÀúÀå" "" "csv" 1))
  (if p
    (progn
      (setq f (open p "w"))
      (if f
        (progn
          (write-line hdr f)
          (foreach r rows (write-line r f))
          (write-line "" f)
          (write-line "# K-°Ç¼³¸Ê Ä³µå À¯Æ¿(k-conmap.lsp) ·Î »Ì¾Ò½À´Ï´Ù . k-conmap.com" f)
          (close f)
          (kcm:say (strcat "  ÀúÀåÇß½À´Ï´Ù -> " p))
          (alert (strcat "ÀúÀåÇß½À´Ï´Ù.\n\n" p)))
        (alert "ÆÄÀÏÀ» ¸¸µéÁö ¸øÇß½À´Ï´Ù.\n¹ÙÅÁÈ­¸é °°Àº ´Ù¸¥ ÀÚ¸®¿¡ ÀúÀåÇØ º¸½Ê½Ã¿À."))))
  (princ)
)

(defun kcm:drawtext ( s / p )
  (setq p (getpoint "\n±ÛÀÚ¸¦ ³õÀ» ÀÚ¸®¸¦ ÂïÀ¸½Ê½Ã¿À: "))
  (if p (progn (kcm:mktext p (kcm:height) s) (kcm:say "  Àû¾ú½À´Ï´Ù.")))
  (princ)
)

;; ¸ðµç ¸í·ÉÀÌ ÀÌ ÇÑ °÷À¸·Î ³¡³³´Ï´Ù.
;;  title  Ã¢ Á¦¸ñ / sum ÇÑ ÁÙ ¿ä¾à / lines °á°ú ÁÙµé
;;  hdr¡¤rows  CSV (¾øÀ¸¸é nil) / txt  µµ¸é¿¡ ÀûÀ» ±Û (¾øÀ¸¸é nil)
;;  µ¹·ÁÁÖ´Â °ªÀÌ "again" ÀÌ¸é ¸Þ´º¸¦ ´Ù½Ã ¿±´Ï´Ù.
(defun kcm:result ( title sum lines hdr rows txt / act s )
  (if (kcm:expired) (progn (kcm:expalert) (setq lines nil)))
  (if (null lines) (setq lines (list "ÀÌ ÆÇÀº ±â°£ÀÌ Áö³µ½À´Ï´Ù."
                                     "ÃÖ½ÅÆÇÀ» ¹Þ¾Æ ÁÖ½Ê½Ã¿À (¹«·á)."
                                     "" "   https://k-conmap.com/cad")
                         hdr nil rows nil txt nil))
  (kcm:say (strcat "--- " title " ---"))
  (foreach l lines (kcm:say (strcat " " l)))
  (setq act (kcm:resdlg title lines (if rows T nil) (if txt T nil)))
  (if (null act)
    (progn   ;; Ã¢À» ¸ø ¶ç¿ì´Â Ä³µå -> ¾Ë¸²Ã¢À¸·Î
      (setq s title)
      (foreach l lines (setq s (strcat s "\n" l)))
      (alert (strcat s "\n\n----------------------------------------"
                       "\n K-°Ç¼³¸Ê Ä³µå À¯Æ¿ (k-conmap.lsp)  k-conmap.com"))
      (setq act "close")))
  (while (member act '("csv" "txt"))
    (cond
      ((= act "csv") (if rows (kcm:savecsv hdr rows)))
      ((= act "txt") (if txt (kcm:drawtext txt))))
    (setq act (kcm:resdlg title lines (if rows T nil) (if txt T nil)))
    (if (null act) (setq act "close")))
  act
)

;; °í¸£¶ó°í ¾È³»ÇÏ´Â ÇÑ ÁÙ (¸Å¹ø °°Àº ¸»À» ÇÕ´Ï´Ù)
(defun kcm:pickmsg ( what )
  (kcm:say (strcat "[" what "] ¸¶¿ì½º·Î °í¸£½Ê½Ã¿À.  ´Ù °í¸£¸é ¡¸Enter¡¹ ¸¦ Ä¡½Ê½Ã¿À."))
)


;;; ================================================================== KL ±æÀÌÇÕ

(defun C:KL ( / ss n i e L tot lays cols skip u lines rows sum )
  (kcm:u)
  (kcm:pickmsg "±æÀÌ ÇÕ°è")
  (setq ss (ssget))
  (if (null ss)
    (progn (kcm:say "°í¸¥ °ÍÀÌ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq n (sslength ss) i 0 tot 0.0 lays '() cols '() skip 0 u (kcm:u))
      (while (< i n)
        (setq e (ssname ss i) L (kcm:len e))
        (if L
          (setq tot (+ tot L)
                lays (kcm:acc (cdr (assoc 8 (entget e))) L lays)
                cols (kcm:acc (kcm:colorname (kcm:objcol e)) L cols))
          (setq skip (1+ skip)))
        (setq i (1+ i)))
      (setq lays (kcm:sortd lays) cols (kcm:sortd cols))
      (setq sum (strcat "±æÀÌÇÕ " (kcm:num (* tot u) 3) " m"))
      (setq lines (list (strcat "ÇÕ°è        " (kcm:num (* tot u) 3) " m")
                        (strcat "µµ¸é °ª      " (kcm:num tot 2) " " kcm*un)
                        (strcat "¼¾ °Í        " (itoa (- n skip)) " / " (itoa n) " °³")))
      (if (> skip 0)
        (setq lines (append lines
          (list (strcat "¸ø ¼¾ °Í      " (itoa skip) " °³ (½ºÇÃ¶óÀÎ¡¤Å¸¿ø¡¤¹®ÀÚ µî)")))))
      (setq lines (append lines (list "" "[ ·¹ÀÌ¾îº° ]")))
      (foreach a lays
        (setq lines (append lines (list (strcat "  " (kcm:pad (car a) 22) " "
                                                (kcm:num (* (cdr a) u) 3) " m")))))
      (setq lines (append lines (list "" "[ »ö±òº° ]")))
      (foreach a cols
        (setq lines (append lines (list (strcat "  " (kcm:pad (car a) 22) " "
                                                (kcm:num (* (cdr a) u) 3) " m")))))
      (setq rows '())
      (foreach a lays
        (setq rows (cons (strcat "·¹ÀÌ¾î," (kcm:cq (car a)) ","
                                 (kcm:raw (* (cdr a) u) 3)) rows)))
      (foreach a cols
        (setq rows (cons (strcat "»ö±ò," (kcm:cq (car a)) ","
                                 (kcm:raw (* (cdr a) u) 3)) rows)))
      (setq rows (append (reverse rows) (list (strcat "ÇÕ°è,," (kcm:raw (* tot u) 3)))))
      (kcm:result "±æÀÌ ÇÕ°è" sum lines "±¸ºÐ,ÀÌ¸§,±æÀÌ(m)" rows sum)))
)


;;; ================================================================== KA ¸éÀûÇÕ

(defun C:KA ( / ss n i e A tot lays cols skip u lines rows sum py )
  (kcm:u)
  (kcm:pickmsg "¸éÀû ÇÕ°è")
  (setq ss (ssget))
  (if (null ss)
    (progn (kcm:say "°í¸¥ °ÍÀÌ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq n (sslength ss) i 0 tot 0.0 lays '() cols '() skip 0 u (kcm:u))
      (while (< i n)
        (setq e (ssname ss i) A (kcm:area e))
        (if A
          (setq tot (+ tot A)
                lays (kcm:acc (cdr (assoc 8 (entget e))) A lays)
                cols (kcm:acc (kcm:colorname (kcm:objcol e)) A cols))
          (setq skip (1+ skip)))
        (setq i (1+ i)))
      (setq lays (kcm:sortd lays) cols (kcm:sortd cols))
      (setq tot (* tot u u) py (/ tot 3.305785))
      (setq sum (strcat "¸éÀûÇÕ " (kcm:num tot 3) " m2"))
      (setq lines (list (strcat "ÇÕ°è        " (kcm:num tot 3) " m2")
                        (strcat "            " (kcm:num py 2) " Æò")
                        (strcat "¼¾ °Í        " (itoa (- n skip)) " / " (itoa n) " °³")))
      (if (> skip 0)
        (setq lines (append lines
          (list (strcat "¸ø ¼¾ °Í      " (itoa skip) " °³ (ÇØÄ¡¡¤¼±¡¤¹®ÀÚ µî)")))))
      (setq lines (append lines (list "" "[ ·¹ÀÌ¾îº° ]")))
      (foreach a lays
        (setq lines (append lines (list (strcat "  " (kcm:pad (car a) 22) " "
                                                (kcm:num (* (cdr a) u u) 3) " m2")))))
      (setq lines (append lines (list "" "[ »ö±òº° ]")))
      (foreach a cols
        (setq lines (append lines (list (strcat "  " (kcm:pad (car a) 22) " "
                                                (kcm:num (* (cdr a) u u) 3) " m2")))))
      (setq rows '())
      (foreach a lays
        (setq rows (cons (strcat "·¹ÀÌ¾î," (kcm:cq (car a)) ","
                                 (kcm:raw (* (cdr a) u u) 3) ","
                                 (kcm:raw (/ (* (cdr a) u u) 3.305785) 2)) rows)))
      (foreach a cols
        (setq rows (cons (strcat "»ö±ò," (kcm:cq (car a)) ","
                                 (kcm:raw (* (cdr a) u u) 3) ","
                                 (kcm:raw (/ (* (cdr a) u u) 3.305785) 2)) rows)))
      (setq rows (append (reverse rows)
                         (list (strcat "ÇÕ°è,," (kcm:raw tot 3) "," (kcm:raw py 2)))))
      (kcm:result "¸éÀû ÇÕ°è" sum lines "±¸ºÐ,ÀÌ¸§,¸éÀû(m2),¸éÀû(Æò)" rows
                  (strcat (kcm:num tot 3) " m2"))))
)


;;; ================================================================== KN ¼ýÀÚÇÕ

(defun C:KN ( / ss n i e s v tot cnt skip ex lines rows sum )
  (kcm:pickmsg "¼ýÀÚ ÇÕ°è - ¹®ÀÚ¸¦ Ã¢À¸·Î °¨½Î½Ê½Ã¿À")
  (setq ss (ssget '((0 . "TEXT,MTEXT"))))
  (if (null ss)
    (progn (kcm:say "°í¸¥ ¹®ÀÚ°¡ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq n (sslength ss) i 0 tot 0.0 cnt 0 skip 0 ex '() rows '())
      (while (< i n)
        (setq e (ssname ss i) s (kcm:txt e))
        (setq v (if s (kcm:firstnum s) nil))
        (if v
          (progn (setq tot (+ tot v) cnt (1+ cnt))
                 (setq rows (cons (strcat (kcm:cq s) "," (kcm:raw v 4)) rows)))
          (progn (setq skip (1+ skip))
                 (if (and s (/= s "") (< (length ex) 8)) (setq ex (cons s ex)))))
        (setq i (1+ i)))
      (setq sum (kcm:num tot 4))
      (setq lines (list (strcat "ÇÕ°è        " (kcm:num tot 4))))
      (if (> cnt 0)
        (setq lines (append lines (list (strcat "Æò±Õ        " (kcm:num (/ tot cnt) 4))))))
      (setq lines (append lines
        (list (strcat "Ã£Àº °Í      " (itoa cnt) " / " (itoa n) " °³"))))
      (if (> skip 0)
        (progn
          (setq lines (append lines
            (list (strcat "¼ýÀÚ ¾ø¾î »­  " (itoa skip) " °³") "" "[ »« °Í ]")))
          (foreach x (reverse ex) (setq lines (append lines (list (strcat "  " x)))))))
      (setq rows (append (reverse rows) (list (strcat "ÇÕ°è," (kcm:raw tot 4)))))
      (kcm:result "¼ýÀÚ ÇÕ°è" sum lines "¹®ÀÚ,¼ýÀÚ" rows (kcm:num tot 4))))
)


;;; ================================================================ KC °³¼ö¼¼±â

(defun C:KC ( / ss n i e d ty key tab lines rows )
  (kcm:pickmsg "°³¼ö ¼¼±â")
  (setq ss (ssget))
  (if (null ss)
    (progn (kcm:say "°í¸¥ °ÍÀÌ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq n (sslength ss) i 0 tab '())
      (while (< i n)
        (setq e (ssname ss i) d (entget e) ty (cdr (assoc 0 d)))
        (setq key (if (= ty "INSERT")
                    (strcat "ºí·Ï: " (cond ((cdr (assoc 2 d))) ("?"))) ty))
        (setq tab (kcm:acc key 1.0 tab))
        (setq i (1+ i)))
      (setq tab (kcm:sortd tab))
      (setq lines (list (strcat "¸ðµÎ        " (itoa n) " °³") ""))
      (foreach a tab
        (setq lines (append lines (list (strcat "  " (kcm:pad (car a) 26) " "
                                                (itoa (fix (cdr a))) " °³")))))
      (setq rows '())
      (foreach a tab
        (setq rows (cons (strcat (kcm:cq (car a)) "," (itoa (fix (cdr a)))) rows)))
      (setq rows (append (reverse rows) (list (strcat "ÇÕ°è," (itoa n)))))
      (kcm:result "°³¼ö ¼¼±â" (strcat "¸ðµÎ " (itoa n) "°³") lines "ÀÌ¸§,°³¼ö" rows nil)))
)


;;; ================================================================ KI Á¤º¸º¸±â

(defun C:KI ( / e d ty lines L A u )
  (kcm:u)
  (kcm:say "[¼± Á¤º¸ º¸±â] ¾Ë°í ½ÍÀº °ÍÀ» ÇÏ³ª Å¬¸¯ÇÏ½Ê½Ã¿À.")
  (setq e (car (entsel "\nÇÏ³ª °í¸£½Ê½Ã¿À: ")))
  (if (null e)
    (progn (kcm:say "°í¸¥ °ÍÀÌ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq d (entget e) ty (cdr (assoc 0 d)) u (kcm:u))
      (setq lines (list (strcat "Á¾·ù        " ty)
                        (strcat "·¹ÀÌ¾î      " (cdr (assoc 8 d)))
                        (strcat "»ö±ò        " (kcm:colorname (kcm:objcol e))
                                (if (assoc 62 d) "   (°´Ã¼¿¡ Á÷Á¢ ÁØ »ö)" "   (·¹ÀÌ¾î »ö)"))
                        (strcat "¼±Á¾·ù      " (kcm:objlt e))
                        (strcat "¼±±½±â      " (kcm:objlw e))))
      (setq L (kcm:len e) A (kcm:area e))
      (if L (setq lines (append lines
              (list (strcat "±æÀÌ        " (kcm:num (* L u) 3) " m")))))
      (if A (setq lines (append lines
              (list (strcat "¸éÀû        " (kcm:num (* A u u) 3) " m2  ("
                            (kcm:num (/ (* A u u) 3.305785) 2) " Æò)")))))
      (if (assoc 10 d)
        (setq lines (append lines
          (list "" (strcat "X ÁÂÇ¥      " (kcm:num (car (cdr (assoc 10 d))) 3))
                   (strcat "Y ÁÂÇ¥      " (kcm:num (cadr (cdr (assoc 10 d))) 3))))))
      (if (member ty '("TEXT" "MTEXT"))
        (setq lines (append lines
          (list "" (strcat "±ÛÀÚ        " (kcm:txt e))
                   (strcat "±ÛÀÚ ³ôÀÌ    " (kcm:num (cond ((cdr (assoc 40 d))) (0.0)) 2))))))
      (if (= ty "INSERT")
        (setq lines (append lines
          (list (strcat "ºí·Ï ÀÌ¸§    " (cond ((cdr (assoc 2 d))) ("?")))))))
      (kcm:result "¼± Á¤º¸ º¸±â" "" lines nil nil nil)))
)


;;; ================================================================ KD °Å¸®Àç±â

(defun C:KD ( / p0 p1 tot u lines k n )
  (kcm:u)
  (setq u (kcm:u))
  (kcm:say "[°Å¸® Àç±â] Á¡À» ÀÌ¾î ÂïÀ¸½Ê½Ã¿À.  ³¡³»·Á¸é Enter.")
  (setq p0 (getpoint "\nÃ¹ Á¡: ") tot 0.0 n 0 lines '())
  (if (null p0)
    (progn (kcm:say "Ãë¼ÒÇß½À´Ï´Ù.") "close")
    (progn
      (setq k T)
      (while k
        (setq p1 (getpoint p0 "\n´ÙÀ½ Á¡ (³¡³»·Á¸é Enter): "))
        (if p1
          (progn
            (setq n (1+ n) tot (+ tot (distance p0 p1)))
            (setq lines (append lines
              (list (strcat "  " (kcm:pad (strcat (itoa n) "±¸°£") 10)
                            (kcm:pad (strcat (kcm:num (* (distance p0 p1) u) 3) " m") 16)
                            "´©Àû " (kcm:num (* tot u) 3) " m"))))
            (kcm:say (strcat "   ´©Àû " (kcm:num (* tot u) 3) " m"))
            (setq p0 p1))
          (setq k nil)))
      (if (= n 0)
        (progn (kcm:say "Á¡À» ÇÏ³ª¸¸ ÂïÀ¸¼Ì½À´Ï´Ù.") "close")
        (kcm:result "°Å¸® Àç±â" (strcat "°Å¸® " (kcm:num (* tot u) 3) " m")
          (append (list (strcat "ÀüÃ¼ °Å¸®    " (kcm:num (* tot u) 3) " m")
                        (strcat "±¸°£        " (itoa n) " °³") "") lines)
          nil nil (strcat "L=" (kcm:num (* tot u) 3) " m")))))
)


;;; =============================================================== KXY ÁÂÇ¥»Ì±â

(defun kcm:xy1 ( e / d ty p nm )
  (setq d (entget e) ty (cdr (assoc 0 d)) nm "")
  (cond
    ((= ty "POINT")  (setq p (cdr (assoc 10 d)) nm "Á¡"))
    ((= ty "INSERT") (setq p (cdr (assoc 10 d)) nm (cdr (assoc 2 d))))
    ((= ty "CIRCLE") (setq p (cdr (assoc 10 d)) nm "¿øÁß½É"))
    ((= ty "ARC")    (setq p (cdr (assoc 10 d)) nm "È£Áß½É"))
    ((= ty "TEXT")
      (setq nm (kcm:strip (cond ((cdr (assoc 1 d))) (""))))
      (setq p (if (and (cdr (assoc 11 d))
                       (or (/= 0 (cond ((cdr (assoc 72 d))) (0)))
                           (/= 0 (cond ((cdr (assoc 73 d))) (0)))))
                (cdr (assoc 11 d)) (cdr (assoc 10 d)))))
    ((= ty "MTEXT")
      (setq p (cdr (assoc 10 d)) nm (kcm:strip (cond ((cdr (assoc 1 d))) ("")))))
    (T (setq p nil)))
  (if p (list p ty nm) nil)
)

(defun C:KXY ( / ss n i e r pts p k rows z lines )
  (kcm:say "[ÁÂÇ¥ »Ì±â] Á¡¡¤ºí·Ï¡¤¹®ÀÚ¡¤¿øÀ» °í¸£½Ê½Ã¿À.  ´Ù °í¸£¸é Enter.")
  (kcm:say "            ¾Æ¹«°Íµµ ¾È °í¸£°í Enter ¸¦ Ä¡¸é ¡¸È­¸é¿¡¼­ Âï±â¡¹°¡ µË´Ï´Ù.")
  (setq ss (ssget '((0 . "POINT,INSERT,TEXT,MTEXT,CIRCLE,ARC"))) pts '())
  (if ss
    (progn
      (setq n (sslength ss) i 0)
      (while (< i n)
        (setq e (ssname ss i) r (kcm:xy1 e))
        (if r (setq pts (cons r pts)))
        (setq i (1+ i)))
      (setq pts (reverse pts)))
    (progn
      (setq k T)
      (while k
        (setq p (getpoint "\nÁ¡À» ÂïÀ¸½Ê½Ã¿À (³¡³»·Á¸é Enter): "))
        (if p (setq pts (append pts (list (list p "PICK" "")))) (setq k nil)))))
  (if (null pts)
    (progn (kcm:say "ÁÂÇ¥°¡ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq rows '() lines '() i 0)
      (foreach r pts
        (setq i (1+ i) p (car r) z (if (caddr p) (caddr p) 0.0))
        (setq rows (cons (strcat (itoa i) "," (kcm:raw (car p) 4) ","
                                 (kcm:raw (cadr p) 4) "," (kcm:raw z 4) ","
                                 (kcm:cq (cadr r)) "," (kcm:cq (caddr r))) rows))
        (setq lines (append lines
          (list (strcat "  " (kcm:pad (itoa i) 5)
                        "X " (kcm:pad (kcm:num (car p) 3) 16)
                        "Y " (kcm:num (cadr p) 3))))))
      (kcm:result "ÁÂÇ¥ »Ì±â" ""
        (append (list (strcat "ÁÂÇ¥        " (itoa i) " °³")
                      "[¿¢¼¿(CSV)·Î ÀúÀå] À» ´©¸£½Ê½Ã¿À." "") lines)
        "¹øÈ£,X,Y,Z,Á¾·ù,³»¿ë" (reverse rows) nil)))
)


;;; ============================================================== KXYT ÁÂÇ¥Àû±â

;; ÃøÁ¡¿¡¼­ ±ÛÀÚ±îÁö ¡¸Áö½Ã¼±¡¹À» ±ß°í ±× À§¿¡ X¡¤Y ¸¦ Àû½À´Ï´Ù.
;;   p1 = ÃøÁ¡ / p2 = ²ªÀÌ´Â ÀÚ¸®(»ç¿ëÀÚ°¡ ÂïÀ½) / p3 = ¼öÆò ²¿¸® ³¡
(defun kcm:leader ( p1 p2 h t1 t2 / dirx w tail p3 x1 y1 )
  (setq dirx (if (>= (car p2) (car p1)) 1.0 -1.0))
  (setq w (* h 0.62 (max (strlen t1) (strlen t2))))
  (setq tail (max w (* h 3.0)))
  (setq p3 (list (+ (car p2) (* dirx tail)) (cadr p2) 0.0))
  (entmake (list '(0 . "LINE") (cons 10 p1) (cons 11 p2)))          ; ºñ½ºµëÇÑ ¼±
  (entmake (list '(0 . "LINE") (cons 10 p2) (cons 11 p3)))          ; ¼öÆò ²¿¸®
  (entmake (list '(0 . "CIRCLE") (cons 10 p1) (cons 40 (* h 0.3)))) ; ÃøÁ¡ Ç¥½Ã
  (setq x1 (+ (min (car p2) (car p3)) (* h 0.25)))
  (setq y1 (cadr p2))
  (kcm:mktext (list x1 (+ y1 (* h 1.75)) 0.0) h t1)                 ; X=
  (kcm:mktext (list x1 (+ y1 (* h 0.35)) 0.0) h t2)                 ; Y=
  (princ)
)

(defun C:KXYT ( / h mode p1 p2 k n tx ty t1 t2 dec done )
  (kcm:say "[ÁÂÇ¥ Àû±â]  ÃøÁ¡À» Âï°í -> ±ÛÀÚ ³õÀ» ÀÚ¸®¸¦ ÂïÀ¸¸é")
  (kcm:say "             ±× »çÀÌ¿¡ Áö½Ã¼±À» ±ß°í X¡¤Y ¸¦ Àû½À´Ï´Ù.")
  (if (null kcm*xymode)
    (progn
      (initget "S D")
      (kcm:say "")
      (kcm:say "  Ãø·®½Ä = X ´Â ºÏ(¼¼·Î), Y ´Â µ¿(°¡·Î)   <- Ãø·® ¼º°úÇ¥¿Í °°Àº ¹æ½Ä")
      (kcm:say "  µµ¸é½Ä = X ´Â °¡·Î, Y ´Â ¼¼·Î           <- Ä³µå ÁÂÇ¥ ±×´ë·Î")
      (setq mode (getkword "\nÁÂÇ¥ Ç¥±â [Ãø·®½ÄS/µµ¸é½ÄD] <S>: "))
      (setq kcm*xymode (if (null mode) "S" mode))))
  (setq mode kcm*xymode)
  (kcm:say (strcat "  -> " (if (= mode "S") "Ãø·®½Ä (X=ºÏ, Y=µ¿)" "µµ¸é½Ä (X=°¡·Î, Y=¼¼·Î)")
                   "  . ¹Ù²Ù·Á¸é KXYMODE"))
  (setq h (kcm:askheight) dec 3 n 0 k T)
  (while k
    (setq p1 (getpoint "\nÃøÁ¡À» ÂïÀ¸½Ê½Ã¿À (³¡³»·Á¸é Enter): "))
    (if (null p1)
      (setq k nil)
      (progn
        (setq p2 (getpoint p1 "\n±ÛÀÚ¸¦ ³õÀ» ÀÚ¸®¸¦ ÂïÀ¸½Ê½Ã¿À (°Ç³Ê¶Ù·Á¸é Enter): "))
        (if p2
          (progn
            (if (= mode "S")
              (setq tx (cadr p1) ty (car p1))
              (setq tx (car p1)  ty (cadr p1)))
            (setq t1 (strcat "X=" (kcm:raw tx dec))
                  t2 (strcat "Y=" (kcm:raw ty dec)))
            (kcm:leader p1 p2 h t1 t2)
            (setq n (1+ n))
            (kcm:say (strcat "   " (itoa n) "°³Â°   " t1 "   " t2)))))))
  (if (> n 0)
    (kcm:result "ÁÂÇ¥ Àû±â" ""
      (list (strcat "ÃøÁ¡ " (itoa n) " °³¿¡ Áö½Ã¼±°ú ÁÂÇ¥¸¦ Àû¾ú½À´Ï´Ù.")
            (strcat "Ç¥±â ¹æ½Ä    " (if (= mode "S") "Ãø·®½Ä (X=ºÏ, Y=µ¿)"
                                                    "µµ¸é½Ä (X=°¡·Î, Y=¼¼·Î)"))
            (strcat "±ÛÀÚ ³ôÀÌ    " (kcm:num h 2))
            ""
            "Ç¥±â ¹æ½ÄÀ» ¹Ù²Ù·Á¸é  KXYMODE"
            "±ÛÀÚ¸¸ µû·Î Å°¿ì·Á¸é  [¹®ÀÚ ³ôÀÌ ¹Ù²Ù±â]"
            ""
            "Áö¿ì·Á¸é µÇµ¹¸®±â (U ¶Ç´Â Ctrl+Z).")
      nil nil nil)
    (progn (kcm:say "ÀûÀº °ÍÀÌ ¾ø½À´Ï´Ù.") "close"))
)

;; Ãø·®½Ä / µµ¸é½Ä ¹Ù²Ù±â
(defun C:KXYMODE ( / mode )
  (initget "S D")
  (setq mode (getkword "\nÁÂÇ¥ Ç¥±â [Ãø·®½ÄS (X=ºÏ,Y=µ¿)/µµ¸é½ÄD (X=°¡·Î,Y=¼¼·Î)] <S>: "))
  (setq kcm*xymode (if (null mode) "S" mode))
  (kcm:say (strcat "  -> " (if (= kcm*xymode "S") "Ãø·®½Ä (X=ºÏ, Y=µ¿)"
                                                  "µµ¸é½Ä (X=°¡·Î, Y=¼¼·Î)")))
  (princ)
)


;;; =============================================================== KIN ÁÂÇ¥³Ö±â

(defun C:KIN ( / p f ln flds cx cy cn a h hh n bad lines x y )
  (kcm:say "[ÁÂÇ¥ ³Ö±â] ¿¢¼¿¿¡¼­ ÀúÀåÇÑ CSV ÆÄÀÏÀ» °í¸£½Ê½Ã¿À.")
  (alert (strcat "¿¢¼¿ ÁÂÇ¥¸¦ µµ¸é¿¡ Á¡À¸·Î Âï½À´Ï´Ù.\n\n"
                 "CSV ÆÄÀÏÀº ÀÌ·± ¸ð¾çÀÌ¸é µË´Ï´Ù (Ã¹ ÁÙÀº Á¦¸ñÀÌ¾îµµ µË´Ï´Ù)\n\n"
                 "    ÃøÁ¡,X,Y\n"
                 "    No.1,214500.000,382900.000\n"
                 "    No.2,214540.000,382900.000\n\n"
                 "¿¢¼¿¿¡¼­ [´Ù¸¥ ÀÌ¸§À¸·Î ÀúÀå] -> [CSV(½°Ç¥·Î ºÐ¸®)] ·Î ÀúÀåÇÏ½Ê½Ã¿À.\n"
                 "´ÙÀ½ Ã¢¿¡¼­ ±× ÆÄÀÏÀ» °í¸£½Ã¸é µË´Ï´Ù."))
  (setq p (getfiled "ÁÂÇ¥°¡ µç CSV ÆÄÀÏ °í¸£±â" "" "csv" 4))
  (if (null p)
    (progn (kcm:say "Ãë¼ÒÇß½À´Ï´Ù.") "close")
    (progn
      (setq a (getint "\nX °¡ ¸î ¹øÂ° Ä­ÀÔ´Ï±î? <2>: ") cx (if a a 2))
      (setq a (getint "\nY °¡ ¸î ¹øÂ° Ä­ÀÔ´Ï±î? <3>: ") cy (if a a 3))
      (setq a (getint "\nÀÌ¸§(ÃøÁ¡) Ä­Àº? ¾øÀ¸¸é 0 <1>: ") cn (if a a 1))
      (setq hh (kcm:askheight))
      (setq f (open p "r") n 0 bad 0 lines '())
      (if (null f)
        (progn (alert "ÆÄÀÏÀ» ¿­Áö ¸øÇß½À´Ï´Ù.") "close")
        (progn
          (while (setq ln (read-line f))
            (setq flds (kcm:split ln))
            (setq x (kcm:tok2num (cond ((kcm:nth flds cx)) (""))))
            (setq y (kcm:tok2num (cond ((kcm:nth flds cy)) (""))))
            (if (and x y)
              (progn
                (setq n (1+ n))
                (entmake (list '(0 . "POINT") (cons 10 (list x y 0.0))))
                (setq h (if (> cn 0) (kcm:nth flds cn) nil))
                (entmake (list '(0 . "CIRCLE") (cons 10 (list x y 0.0))
                               (cons 40 (* hh 0.35))))
                (if (and h (/= h ""))
                  (kcm:mktext (list (+ x (* hh 0.8)) (+ y (* hh 0.8)) 0.0) hh h))
                (setq lines (append lines
                  (list (strcat "  " (kcm:pad (itoa n) 5)
                                (kcm:pad (cond (h) ("")) 12)
                                "X " (kcm:pad (kcm:num x 3) 16)
                                "Y " (kcm:num y 3))))))
              (setq bad (1+ bad))))
          (close f)
          (kcm:result "ÁÂÇ¥ ³Ö±â" ""
            (append (list (strcat "ÂïÀº Á¡      " (itoa n) " °³")
                          (strcat "°Ç³Ê¶Ú ÁÙ    " (itoa bad) " °³ (Á¦¸ñÁÙ Æ÷ÇÔ)")
                          ""
                          "Á¡ÀÌ ¾È º¸ÀÌ¸é -> ¸í·ÉÃ¢¿¡ ZOOM Ä¡°í E"
                          "Á¡ÀÌ ³Ê¹« ÀÛÀ¸¸é -> PDMODE ¸¦ 34 ·Î"
                          "") lines)
            nil nil nil)))))
)


;;; =============================================================== KAT ¸éÀûÀû±â

(defun C:KAT ( / ss n i e A c h u done skip )
  (kcm:u)
  (setq u (kcm:u))
  (kcm:pickmsg "¸éÀû Àû±â - Æú¸®¼±¡¤¿øÀ» °í¸£½Ê½Ã¿À")
  (setq ss (ssget))
  (if (null ss)
    (progn (kcm:say "°í¸¥ °ÍÀÌ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq h (kcm:askheight) n (sslength ss) i 0 done 0 skip 0)
      (while (< i n)
        (setq e (ssname ss i) A (kcm:area e) c (kcm:center e))
        (if (and A c)
          (progn (kcm:mktext c h (strcat (kcm:num (* A u u) 2) " m2"))
                 (setq done (1+ done)))
          (setq skip (1+ skip)))
        (setq i (1+ i)))
      (kcm:result "¸éÀû Àû±â" ""
        (list (strcat "ÀûÀº °Í      " (itoa done) " °³")
              (strcat "°Ç³Ê¶Ú °Í    " (itoa skip) " °³ (³ÐÀÌ¸¦ ¸ø Àç´Â °Í)")
              "" "Áö¿ì·Á¸é µÇµ¹¸®±â (U ¶Ç´Â Ctrl+Z).")
        nil nil nil)))
)


;;; =============================================================== KTH ¹®ÀÚ³ôÀÌ

(defun C:KTH ( / ss n i e d h cur )
  (kcm:pickmsg "¹®ÀÚ ³ôÀÌ ¹Ù²Ù±â - ¹®ÀÚ¸¦ °í¸£½Ê½Ã¿À")
  (setq ss (ssget '((0 . "TEXT,MTEXT"))))
  (if (null ss)
    (progn (kcm:say "°í¸¥ ¹®ÀÚ°¡ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq cur (cdr (assoc 40 (entget (ssname ss 0)))))
      (setq h (getreal (strcat "\n»õ ±ÛÀÚ ³ôÀÌ (Áö±Ý "
                               (kcm:num (cond (cur) (0.0)) 2) ") : ")))
      (if (or (null h) (<= h 0.0))
        (progn (kcm:say "Ãë¼ÒÇß½À´Ï´Ù.") "close")
        (progn
          (setq n (sslength ss) i 0)
          (while (< i n)
            (setq d (entget (ssname ss i)))
            (if (assoc 40 d) (entmod (subst (cons 40 h) (assoc 40 d) d)))
            (setq i (1+ i)))
          (kcm:result "¹®ÀÚ ³ôÀÌ ¹Ù²Ù±â" ""
            (list (strcat "¹®ÀÚ " (itoa n) " °³ÀÇ ³ôÀÌ¸¦ " (kcm:num h 2) " ·Î ¹Ù²å½À´Ï´Ù.")
                  "" "µÇµ¹¸®·Á¸é U ¶Ç´Â Ctrl+Z.")
            nil nil nil)))))
)


;;; ================================================================= KLAY ·¹ÀÌ¾î

(defun C:KLAY ( / ss n i ly tab tb all empt lines rows cnt )
  (kcm:say "[·¹ÀÌ¾î] µµ¸é ÀüÃ¼¸¦ ÈÈ´Â ÁßÀÔ´Ï´Ù...")
  (setq ss (ssget "_X") tab '() n 0)
  (if ss
    (progn
      (setq n (sslength ss) i 0)
      (while (< i n)
        (setq tab (kcm:acc (cdr (assoc 8 (entget (ssname ss i)))) 1.0 tab))
        (setq i (1+ i)))))
  (setq all '() empt '() tb (tblnext "LAYER" T))
  (while tb
    (setq ly (cdr (assoc 2 tb)) all (cons ly all))
    (if (null (assoc ly tab)) (setq empt (cons ly empt)))
    (setq tb (tblnext "LAYER")))
  (setq tab (kcm:sortd tab))
  (setq lines (list (strcat "·¹ÀÌ¾î      " (itoa (length all)) " °³")
                    (strcat "°´Ã¼        " (itoa n) " °³")
                    (strcat "ºó ·¹ÀÌ¾î    " (itoa (length empt)) " °³")
                    "" "[ °´Ã¼°¡ ¸¹Àº ·¹ÀÌ¾î ]"))
  (setq cnt 0)
  (foreach a tab
    (setq cnt (1+ cnt))
    (if (<= cnt 20)
      (setq lines (append lines (list (strcat "  " (kcm:pad (car a) 26) " "
                                              (itoa (fix (cdr a))) " °³"))))))
  (if (> cnt 20) (setq lines (append lines (list "  ..."))))
  (if empt
    (progn
      (setq lines (append lines (list "" "[ ºñ¾î ÀÖ´Â ·¹ÀÌ¾î ]")) cnt 0)
      (foreach x (reverse empt)
        (setq cnt (1+ cnt))
        (if (<= cnt 20) (setq lines (append lines (list (strcat "  " x))))))
      (if (> cnt 20) (setq lines (append lines (list "  ..."))))
      (setq lines (append lines
        (list "" "Áö¿ì·Á¸é ¸í·ÉÃ¢¿¡ PURGE Ä¡°í ¡¸·¹ÀÌ¾î¡¹ ¸¦ °í¸£½Ê½Ã¿À."
                 "(¾ÈÀüÀ» À§ÇØ ÀÌ À¯Æ¿Àº Áö¿ìÁö ¾Ê½À´Ï´Ù)")))))
  (setq rows '())
  (foreach a tab (setq rows (cons (strcat (kcm:cq (car a)) "," (itoa (fix (cdr a)))) rows)))
  (foreach x (reverse empt) (setq rows (cons (strcat (kcm:cq x) ",0") rows)))
  (kcm:result "·¹ÀÌ¾î »ìÆìº¸±â" "" lines "·¹ÀÌ¾î,°´Ã¼¼ö" (reverse rows) nil)
)


;;; =============================================================== KDUP Áßº¹Á¦°Å

(defun kcm:ps ( p ) (strcat (rtos (car p) 2 6) "_" (rtos (cadr p) 2 6)))

(defun kcm:ptless ( a b )
  (or (< (car a) (car b))
      (and (equal (car a) (car b) 1e-9) (< (cadr a) (cadr b))))
)

(defun kcm:sig ( e / d ty p1 p2 s )
  (setq d (entget e) ty (cdr (assoc 0 d)))
  (setq s
    (cond
      ((= ty "LINE")
        (setq p1 (cdr (assoc 10 d)) p2 (cdr (assoc 11 d)))
        (if (kcm:ptless p2 p1) (strcat "L|" (kcm:ps p2) "|" (kcm:ps p1))
                               (strcat "L|" (kcm:ps p1) "|" (kcm:ps p2))))
      ((= ty "CIRCLE")
        (strcat "C|" (kcm:ps (cdr (assoc 10 d))) "|" (rtos (cdr (assoc 40 d)) 2 6)))
      ((= ty "ARC")
        (strcat "A|" (kcm:ps (cdr (assoc 10 d))) "|" (rtos (cdr (assoc 40 d)) 2 6)
                "|" (rtos (cdr (assoc 50 d)) 2 6) "|" (rtos (cdr (assoc 51 d)) 2 6)))
      ((= ty "POINT") (strcat "P|" (kcm:ps (cdr (assoc 10 d)))))
      ((= ty "TEXT")
        (strcat "T|" (kcm:ps (cdr (assoc 10 d))) "|" (cond ((cdr (assoc 1 d))) (""))))
      ((= ty "INSERT")
        (strcat "I|" (kcm:ps (cdr (assoc 10 d))) "|" (cond ((cdr (assoc 2 d))) (""))))
      ((= ty "LWPOLYLINE")
        (setq s "W|")
        (foreach v (kcm:lwvs d) (setq s (strcat s (kcm:ps (car v)) ";")))
        s)
      (T nil)))
  (if s (strcat (cdr (assoc 8 d)) "|" s) nil)
)

(defun C:KDUP ( / ss n i e s seen dups tab lines act )
  (kcm:pickmsg "°ãÄ£ °Í Áö¿ì±â - °Ë»çÇÒ °ÍÀ» °í¸£½Ê½Ã¿À (ÀüÃ¼´Â Ctrl+A)")
  (setq ss (ssget))
  (if (null ss)
    (progn (kcm:say "°í¸¥ °ÍÀÌ ¾ø½À´Ï´Ù.") "close")
    (progn
      (setq n (sslength ss) i 0 seen '() dups '() tab '())
      (while (< i n)
        (setq e (ssname ss i) s (kcm:sig e))
        (if s
          (if (member s seen)
            (progn (setq dups (cons e dups))
                   (setq tab (kcm:acc (cdr (assoc 0 (entget e))) 1.0 tab)))
            (setq seen (cons s seen))))
        (setq i (1+ i)))
      (if (null dups)
        (kcm:result "°ãÄ£ °Í Áö¿ì±â" ""
          (list (strcat "°í¸¥ °Í      " (itoa n) " °³") ""
                "¶È°°ÀÌ °ãÄ£ °ÍÀÌ ¾ø½À´Ï´Ù.  ±ú²ýÇÕ´Ï´Ù.") nil nil nil)
        (progn
          (setq lines (list (strcat "°í¸¥ °Í      " (itoa n) " °³")
                            (strcat "°ãÄ£ °Í      " (itoa (length dups)) " °³") ""))
          (foreach a (kcm:sortd tab)
            (setq lines (append lines (list (strcat "  " (kcm:pad (car a) 20) " "
                                                    (itoa (fix (cdr a))) " °³")))))
          (setq lines (append lines
            (list "" "°ãÄ£ ¼±ÀÌ ÀÖÀ¸¸é ¼ö·®ÀÌ µÎ ¹è·Î ³ª¿É´Ï´Ù."
                     "ÀÌ¾î¼­ Áö¿ïÁö ¹°¾îº¾´Ï´Ù. Áö¿öµµ U ·Î µÇµ¹¾Æ°©´Ï´Ù.")))
          (kcm:result "°ãÄ£ °Í Áö¿ì±â" "" lines nil nil nil)
          (initget "Y N")
          (if (= "Y" (cond ((getkword (strcat "\n°ãÄ£ " (itoa (length dups))
                                              "°³¸¦ Áö¿ï±î¿ä? [Y/N] <N>: "))) ("N")))
            (progn
              (foreach x dups (entdel x))
              (kcm:result "°ãÄ£ °Í Áö¿ì±â" ""
                (list (strcat (itoa (length dups)) " °³¸¦ Áö¿ü½À´Ï´Ù.")
                      "" "µÇµ¹¸®·Á¸é U ¶Ç´Â Ctrl+Z.") nil nil nil))
            (progn (kcm:say "  ¾È Áö¿ü½À´Ï´Ù.") "close"))))))
)


;;; ================================================================== KBG ¹è°æ»ö

(defun C:KBG ( / k now )
  (initget "W B")
  (setq k (getkword "\n¹è°æÀ» ¾î¶»°Ô ÇÒ±î¿ä? [Èò»öW/°ËÁ¤B] <B °ËÁ¤>: "))
  (if (null k) (setq k "B"))
  (if (= k "W")
    (progn (setenv "Background" "16777215") (setq now "Èò»ö"))
    (progn (setenv "Background" "0")        (setq now "°ËÁ¤")))
  (kcm:result "¹è°æ»ö" ""
    (list (strcat "¹è°æÀ» " now " À¸·Î ¹Ù²ã ºÃ½À´Ï´Ù.")
          ""
          "È­¸éÀÌ ¾È ¹Ù²î¸é Ä³µå¸¦ ²°´Ù ÄÑ º¸½Ê½Ã¿À."
          "±×·¡µµ ¾È µÇ¸é ¾Æ·¡°¡ È®½ÇÇÕ´Ï´Ù."
          ""
          "   ¿É¼Ç(OPTIONS) -> È­¸éÇ¥½Ã -> »ö»ó"
          "   -> 2D ¸ðÇü °ø°£ -> ±ÕÀÏÇÑ ¹è°æ -> Èò»ö ¶Ç´Â °ËÁ¤"
          ""
          "[ Èò»öÀ¸·Î µÎ¸é ]"
          "   . º¹»çÇØ¼­ ¿¢¼¿¡¤¿öµå¿¡ ºÙÀÏ ¶§ °ËÀº ¹ÙÅÁÀÌ ¾È µþ·Á¿É´Ï´Ù"
          "   . ¼± »öÀÌ ¡¸Èò°Ë(7)¡¹ ÀÎ °ÍÀº Ä³µå°¡ ¾Ë¾Æ¼­ °Ë°Ô º¸¿© ÁÝ´Ï´Ù"
          "   . µµ¸é ³»¿ëÀº ÇÏ³ªµµ ¾È ¹Ù²ò´Ï´Ù"
          ""
          "[ µÇµ¹¸®·Á¸é ]"
          "   KBG ¸¦ ´Ù½Ã Ä¡°í  B  ¸¦ °í¸£½Ê½Ã¿À."
          "   ¶Ç´Â ¸í·ÉÃ¢¿¡ ÀÌ ÇÑ ÁÙÀ» ºÙ¿©³ÖÀ¸½Ê½Ã¿À"
          "      (setenv \"Background\" \"0\")"
          ""
          "* ¿ÀÅäÄ³µå ±âÁØÀÔ´Ï´Ù. Ä³µð¾È¡¤ZWCAD ´Â À§ ¿É¼Ç °æ·Î·Î ÇÏ½Ê½Ã¿À.")
    nil nil nil)
)


;;; ================================================ KINSTALL  ÀÚµ¿À¸·Î ¿Ã¶ó¿À°Ô

;; Ä³µå¸¦ ÄÓ ¶§¸¶´Ù ÀúÀý·Î ºÒ·¯¿À°Ô µî·ÏÇÕ´Ï´Ù (acaddoc.lsp ¿¡ ÇÑ ÁÙ Ãß°¡)
(defun kcm:acaddoc () (strcat (getvar "ROAMABLEROOTPREFIX") "Support\\acaddoc.lsp"))

(defun kcm:mypath ( / me )
  (setq me (findfile "k-conmap.lsp"))
  (if (null me) (setq me (findfile "k-conmap_utf8.lsp")))
  (if (null me)
    (progn
      (alert (strcat "Áö±Ý ¾²°í °è½Å  k-conmap.lsp  ÆÄÀÏÀ» °ñ¶ó ÁÖ½Ê½Ã¿À.\n\n"
                     "Ä³µå¸¦ ÄÓ ¶§¸¶´Ù ÀúÀý·Î ¿Ã¶ó¿À°Ô µî·ÏÇÕ´Ï´Ù."))
      (setq me (getfiled "k-conmap.lsp °í¸£±â" "" "lsp" 4))))
  me
)

(defun C:KINSTALL ( / me tgt f ln have )
  (setq me (kcm:mypath))
  (if (null me)
    (progn (kcm:say "Ãë¼ÒÇß½À´Ï´Ù.") (princ))
    (progn
      (setq tgt (kcm:acaddoc) have nil)
      (setq f (open tgt "r"))
      (if f
        (progn
          (while (setq ln (read-line f))
            (if (kcm:has ln "k-conmap") (setq have T)))
          (close f)))
      (if have
        (kcm:result "ÀÚµ¿ µî·Ï" ""
          (list "ÀÌ¹Ì µî·ÏµÅ ÀÖ½À´Ï´Ù." ""
                "Ä³µå¸¦ ÄÓ ¶§¸¶´Ù ÀúÀý·Î ¿Ã¶ó¿É´Ï´Ù."
                "" (strcat "µî·Ï ÆÄÀÏ : " tgt)
                "" "»©·Á¸é  KUNINSTALL") nil nil nil)
        (progn
          (setq f (open tgt "a"))
          (if f
            (progn
              (write-line "" f)
              (write-line ";;; --- K-°Ç¼³¸Ê Ä³µå À¯Æ¿ ÀÚµ¿ ºÒ·¯¿À±â (KUNINSTALL ·Î »®´Ï´Ù) ---" f)
              (write-line (strcat "(if (findfile \"" (kcm:slash me) "\") (load \""
                                  (kcm:slash me) "\"))") f)
              (close f)
              (kcm:result "ÀÚµ¿ µî·Ï" ""
                (list "µî·ÏÇß½À´Ï´Ù."
                      "ÀÌÁ¦ Ä³µå¸¦ ÄÓ ¶§¸¶´Ù ÀúÀý·Î ¿Ã¶ó¿É´Ï´Ù." ""
                      (strcat "À¯Æ¿ ÆÄÀÏ : " me)
                      (strcat "µî·Ï ÆÄÀÏ : " tgt)
                      ""
                      "* À¯Æ¿ ÆÄÀÏÀ» Áö¿ì°Å³ª ´Ù¸¥ Æú´õ·Î ¿Å±â¸é ¸ø Ã£½À´Ï´Ù."
                      "  C:/CADÀ¯Æ¿/ Ã³·³ ¾È °Çµå¸± ÀÚ¸®¿¡ µÎ½Ê½Ã¿À."
                      ""
                      "»©·Á¸é  KUNINSTALL") nil nil nil))
            (alert (strcat "µî·Ï ÆÄÀÏÀ» ¾²Áö ¸øÇß½À´Ï´Ù.\n\n" tgt
                           "\n\nAPPLOAD ÀÇ [½ÃÀÛ µµ±¸ ¸ðÀ½] À¸·Î µî·ÏÇØ ÁÖ½Ê½Ã¿À.")))))))
)

(defun C:KUNINSTALL ( / tgt f ln keep n )
  (setq tgt (kcm:acaddoc) keep (list) n 0)
  (setq f (open tgt "r"))
  (if (null f)
    (progn (alert "µî·ÏµÈ °ÍÀÌ ¾ø½À´Ï´Ù.") (princ))
    (progn
      (while (setq ln (read-line f))
        (if (kcm:has ln "k-conmap") (setq n (1+ n)) (setq keep (append keep (list ln)))))
      (close f)
      (if (= n 0)
        (kcm:result "ÀÚµ¿ µî·Ï »©±â" "" (list "µî·ÏµÈ °ÍÀÌ ¾ø½À´Ï´Ù.") nil nil nil)
        (progn
          (setq f (open tgt "w"))
          (if f
            (progn
              (foreach l keep (write-line l f))
              (close f)
              (kcm:result "ÀÚµ¿ µî·Ï »©±â" ""
                (list (strcat "µî·ÏÀ» »°½À´Ï´Ù. (" (itoa n) "ÁÙ)") ""
                      "´ÙÀ½ºÎÅÍ´Â APPLOAD ·Î Á÷Á¢ ¿Ã¸®¼Å¾ß ÇÕ´Ï´Ù."
                      "" "´Ù½Ã ³ÖÀ¸·Á¸é  KINSTALL") nil nil nil))
            (alert "ÆÄÀÏÀ» °íÄ¡Áö ¸øÇß½À´Ï´Ù."))))))
)


;;; ================================================== KUPDATE  »õ ¹öÀü È®ÀÎ

(defun C:KUPDATE ()
  (startapp "explorer" "https://k-conmap.com/cad")
  (kcm:result "»õ ¹öÀü È®ÀÎ" ""
    (list (strcat "Áö±Ý ¾²½Ã´Â °ÍÀº  " kcm*ver "  ÀÔ´Ï´Ù.") ""
          "´Ù¿î·Îµå ÂÊÀ» ºê¶ó¿ìÀú·Î ¿­¾ú½À´Ï´Ù."
          "»çÀÌÆ®ÀÇ ¹öÀüÀÌ ´õ ³ôÀ¸¸é ¹Þ¾Æ¼­"
          "Áö±Ý ¾²½Ã´Â ÆÄÀÏ¿¡ ±×´ë·Î µ¤¾î¾²½Ê½Ã¿À." ""
          "¼³Á¤(µµ¸é ´ÜÀ§¡¤ÁÂÇ¥ Ç¥±â)Àº ±×´ë·Î ³²½À´Ï´Ù."
          "KINSTALL ·Î µî·ÏÇØ µÎ¼ÌÀ¸¸é ´Ù½Ã µî·ÏÇÒ ÇÊ¿äµµ ¾ø½À´Ï´Ù." ""
          "  https://k-conmap.com/cad") nil nil nil)
)


;;; ============================================================ »çÀÌÆ®¡¤µµ¿ò¸»

(defun C:KCONMAP () (startapp "explorer" "https://k-conmap.com") (princ))
(defun C:KSARASA () (startapp "explorer" "https://sarasa.kr") (princ))

(defun C:KHELP ()
  (kcm:result "µµ¿ò¸»" ""
    (list "¾²´Â ¹ýÀº ÇÏ³ªÀÔ´Ï´Ù."
          ""
          "   ¸í·ÉÃ¢¿¡  K  ->  ´ÜÃß ´©¸£±â  ->  ¸¶¿ì½º·Î °í¸£±â  ->  Enter"
          ""
          "°í¸£°í ³ª¼­ Enter ¸¦ ¾È Ä¡¸é °è¼Ó ±â´Ù¸³´Ï´Ù. ¿©±â¼­ Á¦ÀÏ ¸¹ÀÌ ¸·Èü´Ï´Ù."
          ""
          "[ Àç±â ]"
          "  ±æÀÌ ÇÕ°è     ¼±¡¤Æú¸®¼±¡¤È£¡¤¿ø (·¹ÀÌ¾îº°¡¤»ö±òº°·Î °¥¶ó ÁÝ´Ï´Ù)"
          "  ¸éÀû ÇÕ°è     ´ÝÈù Æú¸®¼±¡¤¿ø (m2 ¿Í Æò)"
          "  ¼ýÀÚ ÇÕ°è     µµ¸é ¹®ÀÚ ¼Ó ¼ýÀÚ ´õÇÏ±â"
          "  °³¼ö ¼¼±â     ºí·Ï¡¤°´Ã¼¸¦ ÀÌ¸§º°·Î"
          "  °Å¸® Àç±â     Á¡À» ÀÌ¾î ÂïÀ¸¸ç ´©Àû"
          "  ¼± Á¤º¸ º¸±â   »ö¡¤·¹ÀÌ¾î¡¤¼±Á¾·ù¡¤¼±±½±â¡¤±æÀÌ"
          ""
          "[ ÁÂÇ¥ ]"
          "  ÁÂÇ¥ »Ì±â     µµ¸é -> ¿¢¼¿(CSV)"
          "  ÁÂÇ¥ Àû±â     ÃøÁ¡ -> ±ÛÀÚ ÀÚ¸® µÎ ¹ø ÂïÀ¸¸é Áö½Ã¼±°ú X¡¤Y"
          "  ÁÂÇ¥ ³Ö±â     ¿¢¼¿(CSV) -> µµ¸é¿¡ Á¡À¸·Î"
          "  KXYMODE      ÁÂÇ¥ Ç¥±â¸¦ Ãø·®½Ä/µµ¸é½ÄÀ¸·Î ¹Ù²Ù±â"
          ""
          "[ Á¤¸® ]"
          "  ¸éÀû Àû±â     Æú¸®¼± ¾È¿¡ ¸éÀûÀ» ±ÛÀÚ·Î"
          "  ¹®ÀÚ ³ôÀÌ     °í¸¥ ¹®ÀÚ Å©±â¸¦ ÇÑ ¹ø¿¡"
          "  ·¹ÀÌ¾î       ·¹ÀÌ¾îº° °´Ã¼ ¼ö¡¤ºó ·¹ÀÌ¾î"
          "  °ãÄ£ °Í Áö¿ì±â  ¶È°°ÀÌ °ãÄ£ ¼± (¼ö·® µÎ ¹è »ç°í ¹æÁö)"
          "  °ËÀº ¹è°æ     ¿¢¼¿¿¡ ºÙÀÏ ¶§ °ËÀº ¹ÙÅÁ ¾ø¾Ö±â"
          ""
          "µµ¸é ´ÜÀ§´Â ÀÚµ¿À¸·Î Àâ½À´Ï´Ù. ¼ýÀÚ°¡ 1,000¹è ÀÌ»óÇÏ¸é"
          "¸Þ´º Ã¢ ¾Æ·¡¿¡¼­ mm / cm / m À» ¹Ù²Ù½Ê½Ã¿À."
          ""
          "[ ÇÑ ¹ø¸¸ ÇØ µÎ¸é ÁÁÀº °Í ]"
          "  KINSTALL     Ä³µå ÄÓ ¶§¸¶´Ù ÀúÀý·Î ¿Ã¶ó¿À°Ô µî·Ï"
          "  KUNINSTALL   ±× µî·ÏÀ» »©±â"
          "  KUPDATE      »õ ¹öÀü ³ª¿Ô´ÂÁö º¸±â"
          ""
          "¸¸µç °÷: K-°Ç¼³¸Ê  k-conmap.com   ¹«·áÀÔ´Ï´Ù."
          "ÀÚÀ¯·Ó°Ô ³ª´² ÁÖ½Ê½Ã¿À. ¸¸µç °÷ Ç¥½Ã¸¸ Áö¿ìÁö ¸»¾Æ ÁÖ½Ê½Ã¿À.")
    nil nil nil)
)


;;; ============================================================= K  (¸ÞÀÎ ¸Þ´º)

(defun kcm:textmenu ( / k )
  ;; Ã¢ÀÌ ¾È ¶ß´Â Ä³µå¿¡¼­ ¾²´Â ¡¸±ÛÀÚ ¸Þ´º¡¹
  (initget "L A N C D I XY XYT IN AT TH LAY DUP BG HELP SITE")
  (setq k (getkword
    (strcat "\n¹«¾ùÀ» ÇÒ±î¿ä?"
            "\n [±æÀÌL/¸éÀûA/¼ýÀÚN/°³¼öC/°Å¸®D/Á¤º¸I]"
            "\n [ÁÂÇ¥»Ì±âXY/ÁÂÇ¥Àû±âXYT/ÁÂÇ¥³Ö±âIN]"
            "\n [¸éÀûÀû±âAT/¹®ÀÚ³ôÀÌTH/·¹ÀÌ¾îLAY/Áßº¹DUP/¹è°æBG]"
            "\n [µµ¿ò¸»HELP/»çÀÌÆ®SITE]  <L>: ")))
  (cond
    ((null k) "kl")
    ((= k "L") "kl")   ((= k "A") "ka")   ((= k "N") "kn")  ((= k "C") "kc")
    ((= k "D") "kd")   ((= k "I") "ki")   ((= k "XY") "kxy")((= k "XYT") "kxyt")
    ((= k "IN") "kin") ((= k "AT") "kat") ((= k "TH") "kth")((= k "LAY") "klay")
    ((= k "DUP") "kdup")((= k "BG") "kbg")((= k "HELP") "khelp")((= k "SITE") "ksite")
    (T nil))
)

(defun C:K ( / go pick act )
  (if (kcm:expired)
    (progn (kcm:expalert) (exit)))
  (kcm:u)
  (setq go T)
  (while go
    (setq pick (kcm:menudlg))
    (if (null pick) (setq pick (if kcm*dcl nil (kcm:textmenu))))
    (if (null pick)
      (setq go nil)
      (progn
        (setq act
          (cond
            ((= pick "kl")   (C:KL))   ((= pick "ka")   (C:KA))
            ((= pick "kn")   (C:KN))   ((= pick "kc")   (C:KC))
            ((= pick "kd")   (C:KD))   ((= pick "ki")   (C:KI))
            ((= pick "kxy")  (C:KXY))  ((= pick "kxyt") (C:KXYT))
            ((= pick "kin")  (C:KIN))  ((= pick "kat")  (C:KAT))
            ((= pick "kth")  (C:KTH))  ((= pick "klay") (C:KLAY))
            ((= pick "kdup") (C:KDUP)) ((= pick "kbg")  (C:KBG))
            ((= pick "khelp")(C:KHELP))
            ((= pick "ksite")(progn (startapp "explorer" "https://k-conmap.com") "again"))
            (T "close")))
        (if (/= act "again") (setq go nil)))))
  (princ)
)


;;; ============================================================== ºÒ·¯¿Ã ¶§ ÀÎ»ç

(kcm:autounit)
(princ "\n=================================================================")
(cond
  ((kcm:expired)
    (princ (strcat "\n [±â°£ Áö³²] ÀÌ ÆÇÀº " (kcm:dstr kcm*exp) " ±îÁö¿´½À´Ï´Ù."))
    (princ "\n             ÃÖ½ÅÆÇÀ» ¹Þ¾Æ ÁÖ½Ê½Ã¿À -> k-conmap.com/cad"))
  ((>= (kcm:today) kcm*warn)
    (princ (strcat "\n [¾Ë¸²] ÀÌ ÆÇÀº " (kcm:dstr kcm*exp) " ±îÁöÀÔ´Ï´Ù. °ð ³¡³³´Ï´Ù."))
    (princ "\n        k-conmap.com/cad ¿¡¼­ »õ·Î ¹Þ¾Æ µ¤¾î¾²½Ê½Ã¿À. 10ÃÊ¸é µË´Ï´Ù. (KUPDATE)"))
)
(princ "\n K-°Ç¼³¸Ê Ä³µå À¯Æ¿ 2.5  (k-conmap.lsp)   k-conmap.com")
(princ "\n")
(princ "\n     ¸í·ÉÃ¢¿¡  K  ¸¸ Ä¡½Ê½Ã¿À.  ´ÜÃß Ã¢ÀÌ ¶å´Ï´Ù.")
(princ "\n")
(princ "\n=================================================================\n")
(princ)
