【テクニカル・上級編】【上級プロ】IMateEntity2インターフェースの動的構築:面IDの変更に一切依存しない、形状特徴量ベースのロバスト合致生成エンジン – SolidWorks VBA解析バイブル

スポンサーリンク

【上級プロ】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プログラミングの領域へ踏み出してほしい。

タイトルとURLをコピーしました