SolidWorks自動化の真髄:面ID変動に屈しない「トポロジー追跡型」合致エンジンの構築
多くのエンジニアがSolidWorks VBAでアセンブリの自動化を試み、そして挫折する。その理由はただ一つ。「SolidWorksの面ID(Entity ID)は、設計変更という名の『嵐』によっていとも簡単に書き換わるからだ。」
多くの人が記述する`GetEntityByName`やハードコーディングされた選択処理は、モデルの微小な再構築(Rebuild)やフィーチャの順序変更で即座にエラーを吐く。本稿では、面IDという「砂上の楼閣」に頼らず、モデルの幾何学的特徴(トポロジー)を抽出して合致を強制的に再定義する、真にロバストな自動化基盤の設計思想を伝授する。
—
1. なぜ従来の「面選択」は破綻するのか
SolidWorks APIにおいて、`SelectByRay`やID指定による選択は、開発当初は軽快だが、運用フェーズに入った瞬間に死を招く。面はフィーチャの再構築によって内部IDが再割り当てされるため、昨日動いたコードが今日は「NULLオブジェクト」を返す。
我々プロフェッショナルが目指すべきは、「特徴量による面特定(Feature-based Identification)」である。面の法線ベクトル、面積、重心位置、あるいは接続するエッジの特性。これらをAPIで動的に走査し、合致対象を「発見(Discover)」するアーキテクチャこそが、堅牢な自動化の正体だ。
—
2. 実装の要:IMateEntity2 と トポロジー解析
今回実装するエンジンの核となるのは、`IMateEntity2` を介した「面情報の永続化に近い探索」である。単に面を捕まえるのではなく、以下のステップで合致対象を特定する。
1. フィルタリング: 指定コンポーネント内の全面を走査。
2. 形状照合: 法線ベクトル(Normal Vector)と面積(Area)を計算し、目標の面と一致するものを特定。
3. 安全な合致: 特定した面を `IMateEntity2` へ変換し、合致を作成。
—
3. 実践:ロバスト合致生成エンジン(VBAサンプル)
以下は、部品内の「特定の面積と法線を持つ面」を自動で探し出し、合致をかけるためのプロトタイプコードだ。
‘ 堅牢な合致生成エンジンのコアモジュール
Public Sub RobustMateEngine(swApp As SldWorks.SldWorks, swAssy As SldWorks.AssemblyDoc)
Dim swModel As SldWorks.ModelDoc2
Dim swComp As SldWorks.Component2
Dim swEnt As SldWorks.Entity
‘ 1. 対象コンポーネントの特定(名前で取得し、NULLチェックを徹底)
Set swComp = swAssy.GetComponentByName(“Part1-1”)
If swComp Is Nothing Then Exit Sub
‘ 2. 目標となる面の探索(面積と法線ベクトルで特定)
Dim targetFace As SldWorks.Face2
Set targetFace = FindFaceByGeometry(swComp, 0.005, 0, 0, 1) ‘ 面積0.005, 法線(0,0,1)
If Not targetFace Is Nothing Then
‘ 3. IMateEntity2として合致定義に使用
Dim swMateEntity As SldWorks.MateEntity2
Set swMateEntity = swAssy.CreateMateEntity2(targetFace)
‘ ここでMate2メソッドを呼び出し合致を生成
‘ swAssy.AddMate5(…)
End If
End Sub
‘ 形状特徴量に基づき面を検索するロジック
Private Function FindFaceByGeometry(swComp As SldWorks.Component2, targetArea As Double, nx As Double, ny As Double, nz As Double) As SldWorks.Face2
Dim swBody As SldWorks.Body2
Dim swFace As SldWorks.Face2
Dim swSurf As SldWorks.Surface
Dim area As Double
Dim normal As Variant
‘ ボディから面をイテレート
Set swBody = swComp.GetBody
Set swFace = swBody.GetFirstFace
Do While Not swFace Is Nothing
‘ 面積計算
area = swFace.GetArea
‘ 法線ベクトル取得(重心位置での評価)
normal = swFace.Normal
‘ 許容誤差範囲内で一致するか判定
If Abs(area – targetArea) < 0.0001 And _
Abs(normal(0) - nx) < 0.01 And _
Abs(normal(2) - nz) < 0.01 Then
Set FindFaceByGeometry = swFace
Exit Function
End If
Set swFace = swFace.GetNextFace
Loop
End Function
---
4. 開発現場で生き残るための鉄則
ファイル・DB連携の罠
アセンブリの自動化において、外部DBから「面ID」を読み込むような設計は絶対に避けろ。IDは流動的だ。保存すべきは「その面がどのフィーチャによって生成され、どのような幾何学的特性を持っているか」というメタデータである。JSON形式などで外部設定ファイルを持ち、そこに「特定のためのパラメータ」を保持させるのが、モダンな開発のスタンダードだ。
ライフサイクルの管理
VBAはメモリ管理が甘い。`GetNextFace`や`GetFirstFace`を多用する場合、オブジェクトの解放(`Set swFace = Nothing`)をループの最後で徹底しなければ、大規模アセンブリではメモリリークによりSolidWorksごとクラッシュする。
—
結論:自動化は「コード」ではなく「哲学」である
ロバストなアセンブリ生成とは、SolidWorksの気まぐれな内部構造に依存するのではなく、「設計意図(Design Intent)」を幾何学的に定義し直すことに他ならない。
今回紹介した「特徴量ベースの探索」は、最初は実装コストがかかるように思えるだろう。しかし、設計変更でツールが止まるたびに修正作業に追われるコストと比べれば、圧倒的に安上がりだ。
さあ、ID依存の脆弱なコードを捨て、幾何学を味方につけた真の自動化エンジニアとしての第一歩を踏み出してほしい。君の書くコードが、明日の設計現場を救うことになる。
