AutoCAD VBAで3Dを制する:ソリッド・サーフェス・メッシュを操る「境界」と「実体」の設計論
AutoCAD VBAで3Dを扱う際、多くのエンジニアが陥る罠がある。それは「2Dの延長線上で考えてしまうこと」だ。
3D空間は単なる座標の拡張ではない。AutoCAD内部では、ソリッド(B-Rep)、サーフェス(NURBS/プロシージャル)、メッシュ(ポリゴン)という、それぞれ異なる数学的解釈を持つオブジェクトが混在している。これを理解せず「とりあえず動くコード」を量産すれば、数ヶ月後の修正時に地獄を見ることになる。
本稿では、実務レベルで「壊れない3D自動化」を実現するためのアーキテクチャを伝授する。
—
1. 3Dオブジェクトの「本質」を見極める
コードを書く前に、以下の3つの違いを脳に刻め。
- 3Dソリッド (Acad3DSolid): 計算の基本。境界表現(B-Rep)を持ち、体積や質量特性が計算可能。安定性が最も高い。
- サーフェス (AcadSurface): 形状の滑らかさが重要。解析や曲面加工に適しているが、閉じていない場合、体積計算ができない。
- メッシュ (AcadSubDMesh): 頂点と面の集合体。レンダリングや自由曲面向きだが、厳密なCAD解析には向かない。
【鉄則】: 実務で自動生成を行うなら、可能な限り「3Dソリッド」を選択せよ。ブーリアン演算(和・差・積)が最も安定して動作するからだ。
—
2. 実務向け:堅牢な3Dソリッド生成コード
単に「箱を作る」コードではない。エラーハンドリングとオブジェクトの解放を組み込んだ、プロダクション品質のテンプレートだ。
‘ @description: 3Dソリッド(直方体)を安全に生成する関数
‘ @param pt: 挿入基点, length: 長さ, width: 幅, height: 高さ
Public Function CreateSolidBox(pt As Variant, length As Double, width As Double, height As Double) As Acad3DSolid
On Error GoTo ErrHandler
Dim boxObj As Acad3DSolid
‘ 原点(0,0,0)に作成し、後でMoveする手法が計算誤差を防ぐコツ
Set boxObj = ThisDrawing.ModelSpace.AddBox(pt, length, width, height)
‘ 更新の反映
boxObj.Update
Set CreateSolidBox = boxObj
Exit Function
ErrHandler:
Err.Raise vbObjectError + 1000, “CreateSolidBox”, “3Dソリッド生成に失敗: ” & Err.Description
End Function
—
3. 破綻を防ぐ「設計の極意」
1. 座標系(WCS/UCS)の管理を徹底せよ
3D操作で最もバグを生むのは、現在のUCSが不明な状態での操作だ。常に `ThisDrawing.Utility.TranslateCoordinates` を使い、WCSへ正規化してから計算を行え。相対座標に依存したコードは、現場の図面設定一つで崩壊する。
2. オブジェクトの破棄とメモリ管理
AutoCAD VBAはGC(ガベージコレクション)が優秀とは言えない。数千個のソリッドを生成する場合、`Set obj = Nothing` をループ内で明示的に行い、さらに `ThisDrawing.Regen acActiveViewport` を適度に実行し、表示データベースをクリーンに保て。
3. データベース連携との接続
外部DBからCSVやExcelで「寸法値」を読み込んで生成する場合、必ず「単位系(ミリ/インチ)」のバリデーションを入れろ。3Dモデルにおいて「1.0」の解釈ミスは、物理的な干渉や計算エラーの元になる。
—
4. 応用:ブーリアン演算で複雑な形状を生成する
実務では、単純な直方体を作ることは稀だ。既存のソリッドから穴を開けるといった操作が主となる。
‘ 2つのソリッドを合成(和集合)する例
Public Sub BooleanUnionExample()
Dim solid1 As Acad3DSolid, solid2 As Acad3DSolid
‘ (適宜、solid1, solid2を生成または取得)
‘ Boolean演算は、元のオブジェクトが変化し、引数のオブジェクトが削除される仕様
‘ この仕様を理解せずにコードを書くと、後の参照でエラーになる
solid1.Boolean acUnion, solid2
‘ solid2はメモリから解放されているため、再参照してはならない
Set solid2 = Nothing
ThisDrawing.Regen acActiveViewport
End Sub
—
最後に:伝説的エンジニアからの提言
3D自動化の成否を分けるのは、コードの長さではない。「どの段階でエラーをハンドリングし、いかにして計算誤差を最小化するか」という執着心だ。
AutoCADの3Dエンジンは、微小な隙間(ギャップ)があるだけでブーリアン演算に失敗する。コードを書く際は常に「この形状は物理的に閉じて存在できるか?」を自問自答せよ。
次回の記事では、`AcadSubDMesh` を用いた複雑なトポロジー生成と、その最適化手法について深掘りする。君たちの自動化プロジェクトが、堅牢な基盤の上に築かれることを期待している。
さあ、設計に戻れ。コードは嘘をつかない。
