【実務・中級編】【上級プロ】IMateEntity2とトポロジー変更検知を組み合わせた、形状修正に極めて強いロバスト合致定義エンジンの実装 – SolidWorks VBA解析バイブル

スポンサーリンク

序論:なぜあなたの合致(Mate)は、モデルの変更でいとも簡単に崩壊するのか

SolidWorks VBAを操るエンジニア諸君、一つ訊きたい。
「マクロで自動アセンブリを作ったが、設計変更で角にフィレットを入れた途端、エラーを吐いて止まった」
そんな経験はないか?

もしあなたが、`SelectByID2` で取得したマジックナンバー(FaceId)を盲信しているなら、そのコードは「使い捨てのゴミ」と同義だ。実務で求められるのは、形状が多少変化しようと、トポロジーが再構築されようと、意図した面を自ら探し出し、確実に合致を成立させる「ロバスト合致定義エンジン」である。

今回は、`IMateEntity2` インターフェースを核に、形状の特徴量(面積・法線・重心)を解析して対象を特定する、極めて実戦的な実装手法を伝授する。

—

1. 概念設計:内部IDを捨て、「指紋」で面を特定せよ

SolidWorksの内部ID(Persistent ID)は、フィーチャーの追加や削除によって容易に変動する。これに依存したコードは保守性の地獄を招く。

プロの設計は、合致対象を「ID」ではなく「形状の指紋(特徴量)」で定義する。
具体的には、以下のメタ情報を組み合わせて「合致エンジン」に渡すのだ。

1. Component Name: どの部品か
2. Entity Type: 面(Face)か、エッジ(Edge)か
3. Area/Length: 面積や長さ(許容誤差を含む)
4. Normal Vector: 面の法線方向(アセンブリ座標系または部品座標系)
5. Distance from Origin: 部品原点からの距離

これらをデータベースや設定ファイル(JSON/CSV)で管理し、実行時に動的に検索・照合するのが、次世代の自動化アーキテクチャである。

—

2. 実装:ロバスト合致定義エンジンのコアコード

以下のコードは、単なる合致作成ではない。コンポーネント内の全Faceを走査し、指定した条件(面積と法線)に合致する面を「動的に特定」して合致させる、エンジンの最小構成単位だ。

‘
‘ Module: RobustMateEngine
‘ Description: 特徴量解析による動的エンティティ特定とIMateEntity2を用いた合致定義
‘

Option Explicit

‘ 合致定義用の構造体(本来はクラスモジュール化すべきだが、解説のため構造体で定義)
Public Type EntitySignature
Area As Double ‘ 面積
NormalX As Double ‘ 法線ベクトルX
NormalY As Double ‘ 法線ベクトルY
NormalZ As Double ‘ 法線ベクトルZ
Tolerance As Double ‘ 許容誤差
End Type

”’

”’ 特徴量に合致するFaceを特定し、IMateEntity2を取得する
”’

Function FindRobustFace(swComp As SldWorks.Component2, sig As EntitySignature) As SldWorks.Entity
Dim swBody As SldWorks.Body2
Dim swFace As SldWorks.Face2
Dim swEnt As SldWorks.Entity
Dim swSurf As SldWorks.Surface
Dim faceArea As Double
Dim vNormal As Variant

‘ コンポーネントからボディーを取得(簡略化のため最初のボディーのみ)
Set swBody = swComp.GetBody
Set swFace = swBody.GetFirstFace

Do While Not swFace Is Nothing
‘ 1. 面積によるフィルタリング
faceArea = swFace.GetArea
If Abs(faceArea – sig.Area) < sig.Tolerance Then ' 2. 法線ベクトルによるフィルタリング(平面を想定) Set swSurf = swFace.GetSurface If swSurf.IsPlane Then vNormal = swFace.Normal ' ベクトルの近似一致判定 If Abs(vNormal(0) - sig.NormalX) < 0.01 And _ Abs(vNormal(1) - sig.NormalY) < 0.01 And _ Abs(vNormal(2) - sig.NormalZ) < 0.01 Then ' 合致対象(Entity)として返す Set FindRobustFace = swFace Exit Function End If End If End If Set swFace = swFace.GetNextFace Loop Set FindRobustFace = Nothing End Function '''

”’ メインエンジン:2つのコンポーネントを動的に合致させる
”’

Sub ExecuteRobustMate(swApp As SldWorks.SldWorks)
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swComp1 As SldWorks.Component2
Dim swComp2 As SldWorks.Component2

Set swModel = swApp.ActiveDoc
Set swAssy = swModel

‘ ここでは既にアセンブリに配置されているコンポーネントを取得
‘ 実務ではデータベースから取得した名前でコンポーネントを特定する
Set swComp1 = swAssy.GetComponentByName(“Part1-1”)
Set swComp2 = swAssy.GetComponentByName(“Part2-1”)

‘ ターゲット面の「指紋」を定義
Dim sig1 As EntitySignature, sig2 As EntitySignature
sig1.Area = 0.0025: sig1.NormalX = 0: sig1.NormalY = 0: sig1.NormalZ = 1: sig1.Tolerance = 0.00001
sig2.Area = 0.0025: sig2.NormalX = 0: sig2.NormalY = 0: sig2.NormalZ = -1: sig2.Tolerance = 0.00001

‘ 動的にEntityを取得
Dim ent1 As SldWorks.Entity, ent2 As SldWorks.Entity
Set ent1 = FindRobustFace(swComp1, sig1)
Set ent2 = FindRobustFace(swComp2, sig2)

If ent1 Is Nothing Or ent2 Is Nothing Then
MsgBox “合致対象の面が見つかりません。トポロジーが大幅に変更された可能性があります。”
Exit Sub
End If

‘ IMateEntity2へキャスト(内部処理用)
‘ AddMate5はEntityを直接受け取るが、詳細な制御にはIMateEntity2のプロパティが有効

‘ 合致実行:一致合致 (swMateCOINCIDENT = 0)
Dim swMate As SldWorks.Mate2
Dim errors As Long

‘ 選択バッファをクリアして対象を選択
swModel.ClearSelection2 True
ent1.Select4 True, Nothing
ent2.Select4 True, Nothing

‘ 高精度な合致APIの呼び出し
Set swMate = swAssy.AddMate5(swMateCOINCIDENT, swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, 0, errors)

If swMate Is Nothing Then
Debug.Print “合致失敗。エラーコード: ” & errors
Else
Debug.Print “合致成功:ロバスト・エンジンの勝利だ。”
End If

swModel.EditRebuild3
End Sub

—

3. チーフアーキテクトが教える「極限の知見」

① IMateEntity2 の真価

`IMateEntity2` は単なる器ではない。例えば、合致させた後に「どの部品のどの面が使われているか」を逆引きしたり、合致の参照をプログラムから書き換える際に、そのEntityが有効かどうかを `ReferenceComponent` プロパティ等で検証できる。大規模アセンブリの修復ツールを作るなら、このインターフェースの理解は必須だ。

② データベース連携の黄金律

実務レベルのツールでは、上記コードの `sig1.Area` などの値はハードコードしない。

  • マスターデータ: SQL ServerやExcel、またはJSONファイルに、部品型番ごとの「合致面スペック」を格納しておく。
  • 動的解決: 部品を挿入した瞬間、その型番をキーにDBを叩き、取得した特徴量で合致エンジンを回す。これが「プロ」の仕事だ。

③ トポロジー変更検知の高度化

面積と法線だけでは、左右対称の部品などで誤判定が起きる。これを防ぐには、以下のロジックを追加せよ。

  • Bounding Box: 面の境界ボックスの中心座標を確認する。
  • Topology Check: その面が「何本のエッジを持っているか(エッジカウント)」を条件に加える。
  • Custom Property: あらかじめ設計段階で、特定の面に「MATE_REF_01」といった属性(Attribute)を付与しておき、それをマクロで検索する(これが最も堅牢だが、設計側の協力が必要)。

—

4. 結言:保守性こそが開発者のプライドである

「動けばいい」コードは、半年後の自分、あるいは後任の担当者を苦しめる。
今回紹介した特徴量ベースの合致エンジンは、実装コストこそ高いが、SolidWorksのバージョンアップや軽微な設計変更に対して無類の強さを発揮する。

オブジェクトのライフサイクルを意識し、常に「そのEntityは明日も存在するか?」を自問自答せよ。それが世界最高峰のエンジニアへの道だ。

このコードをベースに、君たちの現場に最適化された最強のアセンブリ自動化ツールを構築してほしい。幸運を祈る。

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