✨
TEXTをコピーしてCSVに出力すると こんな感じ
AutoCADで図面内のTEXTオブジェクトを抽出し、CSVファイルに出力するLISPを作成しました。
Y座標の大きい順に3つずつグループ化し、各グループ内をX座標の小さい順に並べて出力する処理です。
利用目的は、
道路の線形座標を取って、EXCELに貼付け 測量等で使えます
また、武蔵等の3D設計データ作成の際に 座標登録しても使えます
自分用の備忘録として残しておきます。
;-----------------------------------LISP処理開始
(setq path (getvar "dwgprefix"))
(setq file (getfiled "CSVファイルの保存" path "csv" 1))
(setq ss (ssget '((0 . "TEXT"))))
(setq all '())
;-----------------------------------選択セットから内容と座標抽出
(if ss
(progn
(princ "\nデータ収集中...")
(setq i 0)
(while (< i (sslength ss))
(setq data (entget (ssname ss i)))
(setq pt (cdr (assoc 10 data))) ; 座標取得
(setq x (car pt)) ; X座標
(setq y (cadr pt)) ; Y座標
(setq txt (cdr (assoc 1 data))) ; TEXT内容
(setq all (append all (list (list txt x y)))) ; TEXTと座標を保存
(setq i (1+ i))
)
;-----------------------------------
;; Y座標降順でソート(上から下)
(setq all (vl-sort all (function (lambda (a b) (> (nth 2 a) (nth 2 b))))))
;; CSV出力
(setq file (open file "w"))
(write-line "点名,X座標,Y座標" file)
(setq i 0)
(while (< i (length all))
;; 3つずつグループ化
(setq group (list (nth i all)))
(if (< (+ i 1) (length all)) (setq group (append group (list (nth (+ i 1) all)))))
(if (< (+ i 2) (length all)) (setq group (append group (list (nth (+ i 2) all)))))
;; グループ内をX座標昇順で並べ替え
(setq group (vl-sort group (function (lambda (a b) (< (nth 1 a) (nth 1 b))))))
;; 出力(TEXT内容のみ)
(if (= (length group) 3)
(write-line
(strcat
(nth 0 (nth 0 group)) "," ; 点名
(nth 0 (nth 1 group)) "," ; X座標(意味)
(nth 0 (nth 2 group)) ; Y座標(意味)
)
file
)
)
(setq i (+ i 3))
)
(close file)
(princ "\nCSV出力が完了しました。")
)
(princ "\nTEXTオブジェクトが選択されていません。")
)
;-----------------------------------LISP処理終了
(redraw)
(princ)
defun C:コマンドを作れば使えます。
この処理を使えば、図面内の文字情報を整理して外部に出力する作業が効率化できます。
次回は、画面操作の動画も紹介してみたいと思います。
ssgetで選択したものは、規則正しく並んでいません。
並び変えるは、難しいと思っていましたが 規則を考えればできるもんですね
何事も、アイデアながやね~
ほいたらネー。
Discussion