AutoCAD VBAを掌握せよ:図形生成の「作法」と堅牢な設計論
AutoCADの自動化において、`AddLine` や `AddCircle` を叩くのは誰にでもできる。しかし、「なぜそのコードが現場でゴミコードと化すのか」を理解している者は極めて少ない。
業務自動化エンジニアとして断言する。君たちが目指すべきは「動くコード」ではない。「何万回呼び出してもメモリをリークせず、仕様変更に耐えうる堅牢なアーキテクチャ」だ。今回は、AutoCAD VBAにおける図形操作の極意を伝授する。
—
1. オブジェクトモデルの「本質」を見極める
AutoCAD VBAにおいて、全ての操作は `ThisDrawing`(現在のドキュメント)を起点とする。だが、安易に `ActiveDocument` を連発してはならない。それは「今、ユーザーがどこをクリックしているか」に依存する不安定なコードを生むからだ。
堅牢なコードの鉄則:オブジェクトのスコープ
図形を生成する際、必ず「どの空間(ModelSpace/PaperSpace)」に描画するかを明示的に変数へ格納せよ。
‘ 良いコードの設計:空間を明示的に取得する
Dim ms As AcadModelSpace
Set ms = ThisDrawing.ModelSpace
これを怠ると、ユーザーがレイアウトタブに切り替えた瞬間にコードが死ぬ。常に「どこで動くか」を定義するのが、プロのエンジニアだ。
—
2. 実践:プロダクションレベルの図形生成コード
初心者向けのチュートリアルによくある「いきなりコマンドを打つ」手法は捨てろ。「エラーハンドリング」と「オブジェクトの開放」こそが、実務で生き残るコードの必須条件だ。
以下に、再利用性が高く、保守性の高いサンプルコードを示す。
Public Sub CreateGeometryFactory()
‘ エラーハンドリングの設置(必須)
On Error GoTo ErrorHandler
Dim ms As AcadModelSpace
Set ms = ThisDrawing.ModelSpace
‘ 1. 線分 (Line)
Dim startPoint(0 To 2) As Double: Dim endPoint(0 To 2) As Double
startPoint(0) = 0: startPoint(1) = 0
endPoint(0) = 100: endPoint(1) = 100
Dim lineObj As AcadLine
Set lineObj = ms.AddLine(startPoint, endPoint)
lineObj.Layer = “0” ‘ レイヤー等の属性管理は徹底せよ
‘ 2. 円 (Circle)
Dim center(0 To 2) As Double
Dim radius As Double: radius = 50
Dim circleObj As AcadCircle
Set circleObj = ms.AddCircle(center, radius)
‘ 3. ポリライン (LWPolyline)
Dim pts(0 To 5) As Double
pts(0) = 0: pts(1) = 0: pts(2) = 100: pts(3) = 0: pts(4) = 100: pts(5) = 100
Dim plineObj As AcadLWPolyline
Set plineObj = ms.AddLightWeightPolyline(pts)
plineObj.Closed = True ‘ 閉じたポリラインへ
ThisDrawing.Regen acActiveViewport
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub
—
3. なぜ「編集」でバグるのか?
図形の「編集(移動、回転、尺度変更)」で最も多いミスは、「更新通知の連発」だ。
AutoCADは、図形を操作するたびに再描画(Regen)を試みる。数千の図形をループ処理で操作する場合、このオーバーヘッドでPCはフリーズする。
極限のパフォーマンスチューニング
大量の図形を生成・編集する際は、以下の最適化を行え。
1. `Application.ScreenUpdating` を制御せよ(AutoCAD VBAでは `ThisDrawing.Utility.Prompt` 等でステータスを見せ、無駄な再描画を抑制する)。
2. `Update` メソッドのタイミングを制御せよ。個別の `obj.Update` は呼ばず、処理の最後に一括で `ThisDrawing.Regen` を呼ぶのが定石だ。
3. 不要なオブジェクト変数は `Nothing` で開放せよ。VBAのメモリ管理は甘い。特に大規模な図面を扱う際は必須だ。
—
4. データベース連携と「ID」の罠
実務では、Excelや外部DBから読み込んだ座標で図形を描くことが多い。ここで最も陥りやすい罠が、「図形IDの不変性」への過信だ。
- 注意点: `Handle`(ハンドル番号)は保存しても、削除・再作成のたびに変わる。もし図形と外部データを紐づけたいなら、`XData`(拡張データ)を活用せよ。図形自体にメタデータを埋め込むことで、図面とデータベースの同期が劇的に安定する。
—
エンジニアへのメッセージ
AutoCAD VBAは古臭い言語かもしれない。しかし、その強力なAPIを掌握すれば、他人が手作業で3日かかる作図を1秒で終わらせることができる。
「動けばいい」はプロの思考ではない。
「誰が読んでも理解でき、メモリ効率が良く、予期せぬエラーで図面を破壊しない」コードを書くこと。それが、君を現場で不可欠なエンジニアにする唯一の道だ。
さあ、コードを開け。まずは `ErrorHandler` を書くことから始めよう。そこが、アマチュアとプロの境界線だ。
