下方向きの折れ線グラフ(N値)のLISPから簡易柱状図版にブラッシュアップしてもらった。
LISP改造計画
50本のデータを処理する必要が出てきましたので、昨年作ったやっつけLISPからブラッシュアップすることにしました。
下方向きの折れ線グラフ(N値)のLISPをGemini(AI)に作ってもらった | 地質屋さんと呼ばないで
少なくとも断面図でよく見る形の旗立ち上げの部品を作って、勝手に保存するところまで機能アップをしたい。
上手く出来たので、ここでは手順を保存しておきたい。
最近すぐ忘れるのでやったことノートです。
実現したいこと
・旗揚げラベルを自動入れ替えしたい。
・柱状図の換算N値のラベルを入れたい。
・N値グラフを矩形で閉じたい。
・DXFファイルに自動で保存したい。
加工元のDXFファイルをGeminiに登録してLISPを作る
AutoCADのDXFファイルはGeminiは認識しているしているようで、モデルとするDXFファイルをGeminiにぶっ込んでやればいい。
CSVファイルの1行目をラベルとして、上段、下段のラベルだということをGeminiに認識させた。
深度方向のデータが異なるので、最大深度+500で矩形で枠を閉じることを指示した。
いちいち保存するのがめんどくさいので、上段ラベルの名前でDXF保存させてやる。
LISPの起動コードを自分の使いやすい名前にしてやる。
出来上がったLISPはこれだ
(defun c:kanikan ( / dxf-template csv-file file-handle header-line label-top label-bottom point-list p-data max-depth grid-bottom final-point-list circle-radius old-osmode ss i ent ent-data txt-val csv-dir save-path)
(princ "\n--- 地質調査グラフ作成 (kanikan) を開始 ---")
;; --- 基本設定 ---
(setq circle-radius 20.0)
(setq old-osmode (getvar "OSMODE"))
(setvar "OSMODE" 0) ;; スナップをオフにして作図ミスを防止
;; 1. テンプレートDXFの挿入
;; 既存の図枠や「No.」「m」というテキストが含まれるファイルを指定してください
(setq dxf-template (getfiled "ベースのDXFファイルを選択" "" "dxf" 4))
(if (and dxf-template (findfile dxf-template))
(progn
(command "_.-INSERT" dxf-template "0,0" "1" "1" "0")
(command "_.EXPLODE" (entlast))
)
(progn (princ "\nDXFが見つかりません。") (exit))
)
;; 2. CSVデータの読み込み
(setq csv-file (getfiled "CSVデータを選択" "" "csv" 4))
(if (and csv-file (setq file-handle (open csv-file "r")))
(progn
(setq csv-dir (vl-filename-directory csv-file))
;; 1行目:ラベル分離 (1列目:上段ラベル/ファイル名, 2列目:下段ラベル)
(setq header-line (read-line file-handle))
(if (vl-string-search "," header-line)
(progn
(setq label-top (substr header-line 1 (vl-string-search "," header-line)))
(setq label-bottom (substr header-line (+ 2 (vl-string-search "," header-line))))
)
(setq label-top header-line label-bottom "")
)
;; 2行目以降:データ取得と最大深度の特定
(setq point-list '() max-depth 0.0)
(while (setq line-data (read-line file-handle))
(setq line-data (vl-string-subst " " "," line-data))
(setq line-data (strcat "(" (vl-string-trim " " line-data) ")"))
(setq p-data (vl-catch-all-apply 'read (list line-data)))
(if (and (listp p-data) (= (length p-data) 2))
(progn
(setq point-list (append point-list (list p-data)))
(if (> (cadr p-data) max-depth) (setq max-depth (cadr p-data)))
)
)
)
(close file-handle)
;; 3. 動的グリッドの作成 (最大深度 + 500)
(setq grid-bottom (* (+ max-depth 500.0) -1.0))
;; N値 0, 10, 20, 30, 40, 50 の垂直線を引く
(foreach x-val '(0 10 20 30 40 50)
(command "_LINE" (list (* x-val 40.0) 0.0) (list (* x-val 40.0) grid-bottom) "")
)
;; 水平の枠線を引き直す
(command "_LINE" (list 0.0 0.0) (list 2000.0 0.0) "")
(command "_LINE" (list 0.0 grid-bottom) (list 2000.0 grid-bottom) "")
;; 4. グラフのプロット (X軸:N値*40倍, Y軸:深度*-1)
(if (>= (length point-list) 1)
(progn
(setq final-point-list '())
(foreach pt point-list
(setq final-point-list (append final-point-list (list (list (* (car pt) 40.0) (* (cadr pt) -1.0)))))
)
;; 折れ線グラフ
(command "_PLINE") (foreach pt final-point-list (command pt)) (command "")
;; 各点のマーカー(円)
(foreach pt final-point-list
(command "_CIRCLE" pt circle-radius)
)
;; 5. ラベル置換 (DXF内の既存テキストを検索して書き換え)
(setq ss (ssget "X" '((0 . "TEXT,MTEXT"))))
(if ss
(progn
(setq i 0)
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq ent-data (entget ent))
(setq txt-val (cdr (assoc 1 ent-data)))
(cond
((vl-string-search "No." txt-val)
(setq ent-data (subst (cons 1 label-top) (assoc 1 ent-data) ent-data)))
((vl-string-search "m" txt-val)
(setq ent-data (subst (cons 1 label-bottom) (assoc 1 ent-data) ent-data)))
)
(entmod ent-data)
(setq i (1+ i))
)
)
)
;; 6. DXF形式で自動保存 (保存名はCSVの1列目)
(setq save-path (strcat csv-dir "\\" label-top ".dxf"))
(if (findfile save-path) (vl-file-delete save-path))
(command "_DXFOUT" save-path "Version" "2000" "16" "")
(princ (strcat "\n完了: ファイル「" save-path "」を生成しました。"))
)
)
)
(princ "\nCSVファイルの読み込みに失敗しました。")
)
(setvar "OSMODE" old-osmode) ;; OSNAP設定を元に戻す
(princ)
)
元のDXFファイルを読み込ませ、書かせたいデータのCSVファイルを読むと、勝手に作図して勝手に保存するLISPとなりました。

これで、50本のデータがあっという間に出来上がる。この仕事は勝ったな。
構想5分、試行完成が1時間。マクロ職人撲滅委員長の仕事である。
目を開けたまま寝言を言えるようになれば出世できます
