【AutoCAD VBA】`Elevation`プロパティを制し、2D図面から「3Dの骨組み」を瞬時に生成する技術
AutoCADで「高さ」を扱う際、初心者は決まって座標のZ値を一つ一つ計算してプロパティウィンドウで修正するという地獄のような作業に陥る。だが、実務で戦うエンジニアは違う。
AutoCADのオブジェクトモデルには、`AcadDocument.Elevation` という強力なプロパティが存在する。これは現在の「作図平面の高さ」を定義するグローバルなスイッチだ。今回は、このプロパティをVBAで制御し、2Dの平面図から3Dワイヤーフレームを自動生成する「極限の設計手法」を伝授する。
—
1. なぜ「力技」ではいけないのか:オブジェクトのライフサイクルと設計思想
多くの初学者は、図形を描画した後に `StartPoint(2)` に値を代入してZ値を持ち上げるコードを書く。これは間違いではないが、「スケーラビリティ」と「堅牢性」の観点から見て、二流の設計だ。
- 非効率な点: 図形を生成するたびに座標計算を挟むと、コードが複雑化し、修正コストが跳ね上がる。
- あるべき姿: 描画のコンテキスト(高さ)を先に定義し、その上でコマンドを実行する。これにより、「どの高さにあるか」というビジネスロジックと、「何を描くか」という描画ロジックを分離できる。
—
2. 実践:Elevation制御による3D自動生成プロトタイプ
以下のコードは、現在のドキュメントの高度を動的に変更しながら、異なる高さのワイヤーフレームを生成するプロダクションコードの雛形だ。
‘ ———————————————————
‘ 機能: 指定された高度で矩形を生成し、3Dワイヤーフレームの骨組みを作る
‘ 設計思想: 描画コンテキストを分離し、メンテナンス性を確保する
‘ ———————————————————
Public Sub Generate3DFrame()
Dim acadDoc As AcadDocument
Set acadDoc = ThisDrawing
‘ エラーハンドリングの定石:現在の状態を保護する
Dim originalElevation As Double
originalElevation = acadDoc.Elevation
On Error GoTo Cleanup
‘ 設定したい高さのリスト
Dim heights As Variant
heights = Array(0#, 1000#, 2000#)
Dim h As Variant
For Each h In heights
‘ 【核心】ここで現在のドキュメントの作図高度を切り替える
acadDoc.Elevation = CDbl(h)
‘ 基準となる矩形を描画(Z値の計算は不要)
Call CreateRectangle(0, 0, 5000, 3000)
Next h
Cleanup:
‘ 終了後は必ず元の高度に戻す(重要:環境を汚染しない)
acadDoc.Elevation = originalElevation
If Err.Number <> 0 Then MsgBox “エラー発生: ” & Err.Description
End Sub
Private Sub CreateRectangle(x1 As Double, y1 As Double, width As Double, height As Double)
Dim pts(0 To 14) As Double
‘ 矩形パスの作成(Z値は現在のElevation値が自動適用される)
pts(0) = x1: pts(1) = y1: pts(2) = 0
pts(3) = x1 + width: pts(4) = y1: pts(5) = 0
pts(6) = x1 + width: pts(7) = y1 + height: pts(8) = 0
pts(9) = x1: pts(10) = y1 + height: pts(11) = 0
pts(12) = x1: pts(13) = y1: pts(14) = 0
ThisDrawing.ModelSpace.AddPolyline pts
End Sub
—
3. 実務で「バグを生まない」ための極意
このスクリプトを単なる「動くコード」で終わらせないための、シニアエンジニアからの忠告がある。
① 環境の汚染を許すな
上記のコードで `Cleanup` ラベルを用意した理由がわかるだろうか。`acadDoc.Elevation` はグローバル設定だ。スクリプトが途中でクラッシュしても、必ず `Finally` 的な処理で元の値に戻さなければ、次の作図作業でユーザーが「なぜか勝手に高さが変わっている」という謎の不具合に直面することになる。
② 外部データ連携の注意点
将来的にExcelやCSVから高さ情報を読み込む場合、「数値の型変換」で必ず躓く。
- `CDbl()` による明示的な型変換を徹底すること。
- 座標単位(mm/m)の取り違えを防ぐため、定数で係数(`SCALE_FACTOR = 1000`など)を管理すること。
③ なぜ `AcadApplication` ではなく `AcadDocument` なのか
`AcadApplication` はオートメーションのルートだが、図面内の操作は常に `ActiveDocument` ではなく、オブジェクト変数に格納した `AcadDocument` を参照する癖をつけろ。将来的にマルチドキュメント環境で複数の図面を同時に処理するツールに拡張する際、`ActiveDocument` に依存しているとコードが崩壊するからだ。
—
結論:自動化は「思考の抽象化」である
`Elevation` を操作するということは、単に数値をいじることではない。「3次元空間の中に、論理的な階層を構築する」という設計者の意図をコードに落とし込むことだ。
今回のコードをテンプレートとして、君の現場の「面倒な高さ合わせ作業」をすべてスクリプトに置き換えてほしい。コードが複雑になることを恐れるな。適切にモジュール化し、コンテキストを管理すれば、AutoCADは最強の自動作図エンジンに化ける。
次なるステップは、このワイヤーフレームに `AddLine` で柱を繋ぐロジックの実装だ。それができれば、君の業務は劇的に変わる。健闘を祈る。
