AutoCAD LISP開発ブログ:座標データから折れ線グラフを自動作図する道のり(NotebookLM作成)
0.Googleが出している、NotebookLMというアプリでブログの記事を書いてもらった。
Googleが出しているAIといえばGeminiなのだが、もうひとつ少し視点のちがったツールにNotebookLMというのが存在する。
Google NotebookLM | AI リサーチツール&思考パートナー
使い道を考えあぐねていたのですが、先日GeminiにおいてAutoCADのLISP作成のやりとりをNotebokLMに仕込んで、この話題でブログの記事を書いてとお願いしたら、以下のものを吐き出しました。
あぁなんかもうこう言うものをふんだんに利用する時代に突入しているのだろうか?
でも人間はボケる一方だなと思いました。
下方向きの折れ線グラフ(N値)のLISPをGemini(AI)に作ってもらった | 地質屋さんと呼ばないで
1. 開発の動機:なぜLISPによる自動化が必要だったか?
AutoCADで折れ線グラフを作成する方法はいくつかありますが、手動での作図には限界がありました。
手動での作図の課題
• 基準線や目盛りをLINEやARRAY/COPYコマンドで手動作成する必要がある。
• 折れ線を描画するために、PLINEコマンド中に座標を一つずつ入力するか、クリックする必要がある。
• データ量が多い場合、手動での座標入力は非常に手間がかかり、ミスが発生しやすい。
当初、座標データ(Excelなど)がある場合は、座標リストを作成してPLINEコマンド中に貼り付ける方法や、AutoCADのコマンドを連続で実行する**スクリプトファイル(*.scr)**を作成する方法が一般的でした。しかし、これらの方法は柔軟性に欠けます。
そこで、座標データを使ってLISPで折れ線グラフ(ポリライン)を作成するという、より自動化された方法が採用されました。これは、AutoCADの作業を自動化するのに非常に有効な方法です。
2. ステップ1:基本的なLISP作図機能の実現(内部データ版)
開発の出発点は、LISPプログラム内で定義した固定の座標リストからポリラインを作成する基本的な機能でした。
| 機能 | LISPの要素 | 解説 |
| 座標の定義 | (setq data-points '((X1 Y1) (X2 Y2)...)) | 座標をリスト形式でプログラム冒頭に格納。 |
| ポリライン作成 | (command "_PLINE") | _PLINEコマンドを実行。 |
| 点入力の自動化 | (foreach pt data-points (command pt)) | foreachループで座標リストの各要素をcommand関数に渡し、連続で点を入力する。 |
この段階で、手動入力を伴わない折れ線グラフの自動作図が実現しました。
3. ステップ2:実用性向上 — 外部ファイルからのデータ読み込み
次の課題は、プログラム内で座標を固定するのではなく、**CSVやテキストファイル(例: data.txt)**から大量の座標データを読み込めるようにすることでした。
ファイル読み込み機能 (c:GraphFromFile) の導入により、データの準備(X座標とY座標をコンマかスペースで区切って記述)と、プログラム実行時のファイル選択が可能となりました。
発生した課題と「ロバスト化」の道のり
しかし、外部ファイルからの文字列処理は非常に不安定でした。開発過程では、LISPの環境やデータ形式の揺らぎにより、以下のようなエラーに直面しました。
1. 文字列処理の不安定さ:read/princ/strcatを使用した初期のデータ抽出ロジックはエラーになりやすかった。
2. vl-string-tokenize****利用時のエラー:より堅牢なはずのvl-string-tokenizeを使っても、空行や区切り文字の連続によって「引数のタイプが間違っています」というエラーが発生。
3. Visual LISP依存性の問題:最終的にvl-string-tokenizeが使用できない環境(古いAutoCADなど)が存在することが判明した。
この不安定さを解決するため、最終的に**「ロバスト版」が導入されました**。これは、LISPのread関数を**vl-catch-all-apply**という強力なエラーハンドリング関数でラップすることで実現しました。これにより、ファイル内に不正な形式の行があっても、プログラムが中断することなくその行をスキップし、処理を続行できるようになりました。
4. ステップ3:グラフ仕様の明確化と特殊機能の追加
データ読み込みの安定化が達成された後、グラフの特定の要件を満たすための機能が次々と追加されました。
| 機能 | 変換ロジック / 目的 | 導入コマンド例 | 参照元 |
| Y軸反転 | Y座標に -1.0 を乗算 ((* y -1.0))。 | グラフの描画方向を反転させる。 | GRAPHFROMFILE_INVERTY |
| X軸スケール | X座標に 40.0 を乗算 ((* x 40.0))。 | X方向の間隔を40倍に引き伸ばす。 | GRAPHFROMFILE_SCALEDYINV |
| プロット点の強調 | 変換後の各点に半径 20.0 の円 (_CIRCLE) を描画。 | 各データ点を視覚的に強調する。 | GRAPHFROMFILE_GRIDFINAL |
| 縦グリッド線 | X座標 0, 10, 20, 30, 40, 50 を40倍にスケールした位置に線を描画。線の長さは、元のY軸最大値に500を加えた値の反転 (-(MaxY + 500)) まで。 | グラフの読み取りを助ける補助線を作成する。 | GRAPHFROMFILE_GRIDFINAL |
| 全体フレーム | (0, 0) と (X=50*40, Y=-(MaxY+500)) を対角とする四角形 (_RECTANG) を描画。 | 描画範囲全体を明示的に囲む。 | GRAPHFROMFILE_FRAME |
この過程を経て、データファイルの選択だけで、座標変換、折れ線、プロット点(半径20.0)、グリッド、全体フレームを含む、複雑な折れ線グラフを自動的に作成する最終的なLISPプログラムが完成しました。
5. まとめ
このLISPプログラムの開発は、基本的な自動化から始まり、外部データ処理の不安定性という壁を、堅牢なエラーハンドリング(vl-catch-all-apply)によって克服しました。最終的には、お客様の具体的な要求(X軸スケール40倍、Y軸反転、詳細なグリッド、半径20.0の円、全体フレーム)をすべて組み込んだ、実用性の高いツールへと進化しました。
この自動化により、AutoCADでグラフを作成する作業は、手動での苦労から解放され、ファイルを選択してコマンドを実行するだけのシンプルなプロセスへと変わりました。

