(defun c:KUI (/ ss tsize i ent obj cen csv_path file count unique_list sorted_pts fuz is_dup p x_str y_str z_str s_x s_y s_z prefix start_num pt_name target_ang p1 p2 w_cen w_offset l_name ss_vp mode scale)
  (vl-load-com)

  (princ "\n【杭ナビ・端末別仕様切り替え】純正端末での小数点不一致問題を解消します。")

  ;; --- 1. 使用端末の選択 ---
  (initget "T K")
  (setq mode (getkword "\n出力先を選択 [TopLayoutメートル単位(T) / 杭ナビ純正端末ミリ単位(K)] <T>: "))
  (if (null mode) (setq mode "T"))

  ;; スケール（小数点の移動）を設定
  ;; TopLayout(T)はメートル換算(0.001)、純正端末(K)はCADのまま(1.0)
  (setq scale (if (= mode "T") 0.001 1.0))

  ;; --- 2. 角度の指定 ---
  (setq p1 (getpoint "\nテキストを並行にしたい基準の1点目をクリック: "))
  (if p1 (setq p2 (getpoint p1 "\n基準の2点目をクリック: ")))

  (if (and p1 p2)
    (progn
      (setq target_ang (angle p1 p2))
      (setq ss (ssget '((0 . "CIRCLE,ARC,LINE,LWPOLYLINE,POLYLINE,RECTANG,ELLIPSE,INSERT"))))

      (if ss
        (progn
          (setq prefix (getstring "\n点名の接頭英字を入力 (例: P): "))
          (if (= prefix "") (setq prefix "P"))
          (setq start_num (getint "\n開始番号を入力: "))
          (if (null start_num) (setq start_num 1))
          (setq tsize (getdist (strcat "\n文字サイズを指定: ")))
          (if (null tsize) (setq tsize (getvar "TEXTSIZE")))
          
          ;; 重複排除
          (setq i 0 unique_list nil)
          (repeat (sslength ss)
            (setq ent (ssname ss i) obj (vlax-ename->vla-object ent))
            (vla-getboundingbox obj 'minpt 'maxpt)
            (setq cen (mapcar '(lambda (a b) (/ (+ a b) 2.0)) (vlax-safearray->list minpt) (vlax-safearray->list maxpt)))
            (setq is_dup nil)
            (foreach p unique_list (if (equal cen (cadr p) 0.1) (setq is_dup t)))
            (if (not is_dup) (setq unique_list (cons (list (trans cen 1 0) cen) unique_list)))
            (setq i (1+ i))
          )

          ;; ソート
          (setq fuz (* tsize 0.8))
          (setq sorted_pts (vl-sort unique_list 
            '(lambda (a b)
               (if (not (equal (cadr (cadr a)) (cadr (cadr b)) fuz))
                 (> (cadr (cadr a)) (cadr (cadr b)))
                 (< (car (cadr a)) (car (cadr b)))
               ))))

          ;; 3. CSV出力
          (setq csv_path (strcat (getenv "USERPROFILE") "\\Desktop\\Kuinavi_Survey_Data.csv"))
          (setq file (open csv_path "w"))
          (if file
            (progn
              (write-line "Name,N(X),E(Y),Z,Code" file)
              (setq count start_num)
              (foreach item sorted_pts
                (setq w_cen (car item))
                
                ;; 【修正】
                ;; XYは測量座標（入れ替え）とし、倍率(scale)のみモードによって切り替え
                (setq s_x (* (cadr w_cen) scale)) ;; CADのY座標
                (setq s_y (* (car w_cen) scale))  ;; CADのX座標
                (setq s_z (* (caddr w_cen) scale))
                
                (setq x_str (rtos s_x 2 5) y_str (rtos s_y 2 5) z_str (rtos s_z 2 5))
                (setq pt_name (strcat prefix (itoa count)))
                (write-line (strcat pt_name "," x_str "," y_str "," z_str ",CENTER") file)
                
                ;; 描画
                (entmake (list '(0 . "POINT") (cons 10 w_cen)))
                (entmake (list '(0 . "TEXT") (cons 10 w_cen) (cons 40 tsize) (cons 1 pt_name) (cons 50 target_ang) '(72 . 1) '(73 . 2) (cons 11 w_cen)))
                (setq w_offset (polar w_cen (- target_ang (/ pi 2.0)) (* tsize 1.2)))
                (entmake (list '(0 . "TEXT") (cons 10 w_offset) (cons 40 tsize) (cons 1 (strcat "X:" x_str " Y:" y_str)) (cons 50 target_ang) '(72 . 1) '(73 . 2) (cons 11 w_offset)))
                
                (setq count (1+ count))
              )
              (close file)
              
              ;; レイアウト作成
              (setq l_name "Kuinavi_Layout")
              (if (member l_name (layoutlist)) (command "_.layout" "D" l_name))
              (command "_.layout" "N" l_name)
              (setvar "CTAB" l_name)
              (command "_.mview" "10,10" "287,200") 
              (command "_.mspace")
              (command "_.ucs" "z" (/ (* target_ang 180.0) pi))
              (command "_.plan" "c") 
              (command "_.zoom" "e")
              (command "_.pspace")
              
              (princ (strcat "\n完了: [" (if (= mode "T") "TopLayout" "杭ナビ純正") "] モードで出力しました。"))
            )
            (princ "\nエラー: CSVファイルを作成できませんでした。")
          )
        )
      )
    )
    (princ "\nキャンセルされました。")
  )
  (princ)
)