下方向きの折れ線グラフ(N値)のLISPをGemini(AI)に作ってもらった
今更だけど
私がこの仕事を始めて30年になりますが、大きく仕事のやり方が変わったのが図面のCAD化でした。
太田ジオリサーチさんのホームページを見て、これからは図面はCADで描くんだよって洗脳されて、電子納品が当たり前になる5年くらい前からCADで成果品作ってました。
その中で柱状図のデータができないなら「CAD上で書けば良い」なんてそんなことを書いていましたが、短冊状の簡易柱状図もDXFにしてくれるアプリがありましたので、それはしていません。
斜面・地盤のエンジニア:有限会社太田ジオリサーチ – 斜面・地盤のエンジニア
ぼちぼちと2
幸いなことに入社3年目くらいに取り組めたので、なんのストレスもなく2次元の断面図は描けています。
しかし、私にはマクロとかプログラムとか作るセンスがないので、ボーリング柱状図以外の、サウンディングの深度-換算N値グラフは、柱状図アプリにダミーデータを入れてそれを、DXFにして使っているという、あまり賢くないやり方を25年以上やり続けていたわけです。
その他、残念ならが25年以上このスタイルが続いているわけです。
マクロ職人を人工知能(AI)にやってもらえばいい
結局のところ、若い頃から他人にはパソコンが得意だと思われていました。
しかし情報インフラの対応力だけが長けていただけ、それも最近ではWeb会議とかその辺りからもう付いていけなくなりつつあります。
最近では人工知能(AI)なんかが出てきて、あらあらどうしましょう?状態にありますが、発想の転換で「私はプログラムが組めないのだから、マクロ職人を人工知能(AI)にやらせたら良いんじゃない?」と考えるようになりました。
まあ欲しいものを思い浮かぶセンスがないのであまり進行しておりません。
方向きの折れ線グラフ(N値)のLISPをGemini(AI)に発注
サウンディング結果のグラフを断面図に入れる必要があったので、これまでのやり方を変更することにしました。
Geminiを選択したのは気分です。別にChatGPTでも問題無く作ってくれるような簡単なものです。
Geminiに適当にチャットしながら発注しました。
- AUTOCADで折れ線グラフを書きたい
- 座標有り、LISPにしたい
- ファイル読み込み型にしたい
- (エラーが出たので)引数がまちがっている
- (エラーが出たので)引数のタイプが間違っています
- (エラーが出たので)no function definition: VL-STRING-TOKENIZE
- (エラーが出たので)エラー: 引数のタイプが間違っています: listp “
- Y軸を反転
- X軸を40倍にスケールする
- プロット点を間引かない(こいつの対応は失敗してる)
- プロット点に○を入れる(プロット点を間引かなくなった)
- X方向に0から50まで10おきに縦軸をYの最大値+500まで作成
- (0,0)点と(50,Yの最大値+500まで)点まで四角で囲む
- プロット点の○のサイズを20にする
こんなやりとりをして吐き出したAutoCADのLISPコードがこんな風になりました。
(defun c:GraphFromFile_GridFinal ( / filename file-handle line-data point-list final-point-list p-data x y circle-radius max-y-original grid-y-limit grid-x-values x-orig x-plotted)
(princ "\n--- 座標ファイルから折れ線グラフを作成 (最終グリッド版) ---")
;; --- 設定 ---
(setq circle-radius 20.0) ; ★★★ この値を 20.0 に変更しました ★★★
;; X軸のグリッド間隔 (元のデータ値: 0, 10, 20, 30, 40, 50)
(setq grid-x-values '(0 10 20 30 40 50))
;; -------------------
;; 初期化
(setq point-list '())
(setq max-y-original -1e20)
;; 1. ファイルの選択と読み込み (Yの最大値の取得を含む)
(setq filename (getfiled "座標ファイルを選択" "" "txt;csv" 4))
(if (not filename)
(progn (princ "\nファイル選択がキャンセルされました。") (princ))
(progn
(setq file-handle (open filename "r"))
(if (not file-handle)
(princ "\nエラー: ファイルを開けませんでした。")
(progn
(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 (not (vl-catch-all-error-p p-data))
(listp p-data)
(= (length p-data) 2)
(numberp (car p-data))
(numberp (cadr p-data))
)
(progn
;; 有効な座標をリストに追加
(setq point-list (append point-list (list p-data)))
;; Yの最大値を更新
(if (> (cadr p-data) max-y-original)
(setq max-y-original (cadr p-data))
)
)
)
)
(close file-handle)
;; 2. 座標の変換処理 (X軸40倍スケールとY軸反転)
(if (>= (length point-list) 2)
(progn
(setq final-point-list '())
(foreach pt point-list
(setq x (car pt))
(setq y (cadr pt))
;; X座標を40倍にスケール
(setq x (* x 40.0))
;; Y座標を反転
(setq y (* y -1.0))
;; 変換後の座標リストを作成
(setq final-point-list (append final-point-list (list (list x y))))
)
(princ (strcat "\n" (itoa (length final-point-list)) "点のデータを読み込みました。"))
;; 3. ポリラインの作成
(command "_PLINE")
(foreach pt final-point-list (command pt))
(command "")
;; 4. 各点に円を作成する処理
(princ (strcat "\n各点に半径 " (rtos circle-radius 2 2) " の円を作成中..."))
(foreach center-point final-point-list
(command "_CIRCLE" center-point circle-radius)
)
;; 5. 縦グリッド線を作成する処理
(if (/= max-y-original -1e20) ; 有効なY座標が見つかったか確認
(progn
;; Y軸の終点: (MaxY + 500) -> 反転後のプロット座標: -(MaxY + 500)
(setq grid-y-limit (* (+ max-y-original 500.0) -1.0))
(princ "\n縦軸グリッド線を作成中...")
(foreach x-orig grid-x-values
;; X座標を40倍にスケール
(setq x-plotted (* x-orig 40.0))
(command "_LINE")
;; 始点: X軸上 (Y=0)
(command (list x-plotted 0.0))
;; 終点: 計算したグリッドの終端
(command (list x-plotted grid-y-limit))
(command "")
)
(princ "\nグリッド線の作成が完了しました。")
)
(princ "\n注意: 有効なY座標が見つからなかったため、グリッド線は作成されませんでした。")
)
(princ "\nグラフ作成処理が完了しました。")
)
(princ "\nエラー: グラフを作成するための有効な座標点が2点未満です。")
)
)
)
)
)
(princ)
)
AutoCADでGeminiに作らせたLISPを走らせる
せっかく作ったので、走らせてみます。
あぁこんなんでいいんですよ。旗も軸もコピペで描けますので、一番めんどくさいコアのところをLISP化できています。
こんなに簡単にできるなら、他にも何かできそうです。
「俺個人のマクロを作って残業代を稼ぐマクロ職人」を撲滅してやろうかと思った次第です。
