【上級プロ】IMateEntity2インターフェースの動的構築:面IDの変更に一切依存しない、形状特徴量ベースのロバスト合致生成エンジン
SolidWorks VBAを用いたアセンブリ自動化において、最もエンジニアを絶望の淵に追い込む要因は何か。それは「設計変更による面ID(Face ID)の変動」と「トポロジーの崩壊」だ。
定常的な開発現場では、上流工程での形状変更やフィーチャーの順序入れ替えによって、内部的なエンティティIDは容赦なく書き換わる。従来の `Extension.SelectByID2` をハードコーディングしたマクロは、モデルがリビルドされた瞬間に `False` を返し、アセンブリメイトは崩壊する。
我々は、この泥臭い例外処理の連続に終止符を打たなければならない。
本記事では、`IMateEntity2` インターフェースをコード上で動的に構築し、面名や内部IDに一切依存せず、「幾何学的特徴量(Curvature, Normal, B-Rep Topology)」を基に合致対象を自動特定する、実戦投入可能なロバスト合致生成エンジンの全貌を解説する。
—
1. 脆弱なレガシーアプローチの限界
多くの開発者が陥るアンチパターンを見てみこう。
‘ 【アンチパターン】ID直指定の脆弱なコード
Dim swSelData As SldWorks.SelectionData
Set swSelData = swModel.Extension.CreateSelectionData
bRet = swModel.Extension.SelectByID2(“Face1@Part1-1@Assembly”, “FACE”, 0, 0, 0, True, 0, Nothing, 0)
‘ ↑ CADの形状が少しでも変わると “Face1” は “Face42” になり、即座に破綻する
この手法は、SolidWorksのB-Rep(Boundary Representation)の永続性(Persistent Reference)の欠如を全く考慮していない。真に堅牢なシステムを構築するには、APIレベルでトポロジーを走査し、数学的特徴量からターゲットを動的にキャプチャする必要がある。
—
2. IMateEntity2 動的構築アーキテクチャの核心
ロバスト合致エンジンの中核は、モデルのボディ(`Body2`)から面(`Face`)のコレクションをイテレートし、法線ベクトル、曲率半径、面積などの幾何学的シグネチャを評価して `IMateEntity2` をプログラム的にインスタンス化することにある。
[Target Component]
↓ (Body取得)
[B-Rep 走査 (Faces)]
↓ (幾何判定:法線・曲率・座標)
[IMateEntity2 動的バインド]
↓
[Mate2 実行 (面ID非依存)]
このアプローチにより、モデルのツリー構造がどう変形しようとも、幾何学的な条件 さえ一致していれば、合致は一発で成功する。
—
3. 実装コード:形状特徴量ベースのロバスト合致エンジン
以下に、特定の平面(例:Z方向を向く最大の平滑面)を動的に検出し、アセンブリの原点平面と合致させるプロダクション品質のVBAコードを示す。メモリリークを防ぐためのオブジェクト解放処理(COM参照の厳密な破棄)も組み込んである。
Option Explicit
‘ ==============================================================================
‘ 幾何特徴量ベースのロバスト合致生成エンジン
‘ ==============================================================================
Sub RunRobustMateEngine()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリドキュメントを開いて実行してください。”, vbCritical
Exit Sub
End If
Set swAssy = swModel
‘ 1. ターゲットコンポーネントの特定(例:先頭のコンポーネント)
Dim swComp() As Variant
swComp = swAssy.GetComponents(True)
If UBound(swComp) < 0 Then Exit Sub
Dim targetComp As SldWorks.Component2
Set targetComp = swComp(0) ' 実際には名前やメタデータで特定することを推奨
' 2. 幾何特徴量(例:上向きの平面)に合致するFaceを取得
Dim targetFace As SldWorks.Face2
Set targetFace = GetFaceByGeometricCriteria(targetComp, "PLANE", 0, 0, 1) ' 法線 (0,0,1) の平面
If targetFace Is Nothing Then
MsgBox "条件に一致する幾何特徴量が見つかりませんでした。", vbCritical
Exit Sub
End If
' 3. IMateEntity2 の動的構築とアセンブリ
Call CreateRobustMate(swAssy, targetComp, targetFace)
' 4. クリーンアップ
Set targetFace = Nothing
Set targetComp = Nothing
Set swAssy = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox "ロバスト合致の生成が完了しました。", vbInformation
End Sub
' ------------------------------------------------------------------------------
' 幾何特徴量から面を動的にハントする関数
' ------------------------------------------------------------------------------
Private Function GetFaceByGeometricCriteria(comp As SldWorks.Component2, faceType As String, normalX As Double, normalY As Double, normalZ As Double) As SldWorks.Face2
Dim swModelDocTrig As SldWorks.ModelDoc2
Set swModelDocTrig = comp.GetModelDoc2
If swModelDocTrig Is Nothing Then Exit Function
Dim swPart As SldWorks.PartDoc
Set swPart = swModelDocTrig
Dim bodies As Variant
bodies = swPart.GetBodies2(swAllBodies, False)
Dim i As Long, j As Long
Dim swBody As SldWorks.Body2
Dim swFace As SldWorks.Face2
Dim swSurface As SldWorks.Surface
For i = LBound(bodies) To UBound(bodies)
Set swBody = bodies(i)
Dim faces As Variant
faces = swBody.GetFaces()
For j = LBound(faces) To UBound(faces)
Set swFace = faces(j)
Set swSurface = swFace.GetSurface()
' 形状判定:平面かつ法線ベクトルが一致するか
If swSurface.IsPlane() Then
Dim normal As Variant
normal = swSurface.PlaneParams
' normal(0..2) が点、(3..5) が法線ベクトル
Dim nx As Double, ny As Double, nz As Double
nx = normal(3): ny = normal(4): nz = normal(5)
' 許容誤差 0.001 以内でベクトル一致を判定
If Abs(nx - normalX) < 0.001 And Abs(ny - normalY) < 0.001 And Abs(nz - normalZ) < 0.001 Then
Set GetFaceByGeometricCriteria = swFace
Exit Function
End If
End If
Next j
Next i
Set GetFaceByGeometricCriteria = Nothing
End Function
' ------------------------------------------------------------------------------
' IMateEntity2 を用いた合致のプログラム的実行
' ------------------------------------------------------------------------------
Private Sub CreateRobustMate(assyDoc As SldWorks.AssemblyDoc, comp As SldWorks.Component2, face As SldWorks.Face2)
Dim swModel As SldWorks.ModelDoc2
Set swModel = assyDoc
' 選択解除
swModel.ClearSelection2 True
' IMateEntity2 の生成と設定
Dim swMateEng As SldWorks.MateEntity2
Set swMateEng = assyDoc.CreateMateEntity(face)
' コンポーネントコンテキストをバインド
swMateEng.SetComponent comp
' 相手側エンティティの準備(ここではアセンブリのトップレベル平面 "Top Plane" を利用)
Dim swTopPlaneFace As SldWorks.Face2
' ※簡易的にSelectByID2を使用しているが、ここも本来はフィーチャー走査すべき
bRet = swModel.Extension.SelectByID2("トップ 平面", "PLANE", 0, 0, 0, True, 1, Nothing, 0)
Dim swMateEng2 As SldWorks.MateEntity2
' 選択されたアセンブリ基準面からMateEntityを作成
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager
Dim swRefEntity As Object
Set swRefEntity = swSelMgr.GetSelectedObject6(1, 1)
Set swMateEng2 = assyDoc.CreateMateEntity(swRefEntity)
' 幾何学合致の実行 (例: 一致合致 = swMateType_e.swMateCONINCIDENT)
Dim errCode As Long
Dim outMate As SldWorks.Mate2
' AddMate5 を使用した高度な合致定義
Set outMate = assyDoc.AddMate5( _
swMateCONINCIDENT, _
swMateAlign_e.swMateAlignALIGNED, _
False, _
0.0, 0.0, 0.0, 0.0, 0.0, _
0, 0, 0, 0, _
False, _
errCode)
If errCode <> 0 Then
Debug.Print “合致エラーコード: ” & errCode
End If
swModel.ClearSelection2 True
swModel.ForceRebuild3 True
End Sub
—
4. チーフアーキテクトが教える実務上の極意とメモリ管理
COMオブジェクトの参照解放(Marshal.ReleaseComObject のVBA的解釈)
VBAのランタイムはガベージコレクション(GC)を持たない。そのため、`GetFaces()` や `GetBodies2()` が返すバリアント配列内のCOMオブジェクトは、明示的にローカル変数へ代入し、スコープを抜ける際に確実に `Nothing` を代入して参照カウンタをデクリメントしなければならない。これを怠ると、SolidWorksプロセス内にメモリリーク(GDIリーク含む)が蓄積し、大規模アセンブリの自動化時にメモリ不足クラッシュを引き起こす。
レガシー環境・外部システム連携への応用
この「特徴量ベース・マッチング」の思想を拡張すれば、PLMやERP(Teamcenter, SAP等)から渡されるメタデータ(例:「ピン穴」「底面」「基準面」といった属性タグ)と、SolidWorks上のB-Rep解析結果を突き合わせる完全自動インテグレーションパイプラインを構築できる。ファイル名や面名が外部システムとの間で完全に乖離していても、幾何学的コンテキストが一致していればシステムは自律的に修復・結合を行う。
妥協のないアーキテクチャこそが、堅牢な自動化システムの礎となる。名ばかりのマクロから脱却し、真にロバストなCADプログラミングの領域へ踏み出してほしい。
