アセンブリの「合致」を完全掌握せよ:マクロ記録の先にある、実務レベルの走査術
SolidWorksのアセンブリ自動化に挑む多くのエンジニアが、最初にぶつかる壁がある。それが「合致(Mate)」の構造だ。
「マクロ記録」ボタンを押して合致を作成すれば、VBAのコードが生成される。しかし、生成されたコードをそのまま動かしても、「なぜか特定の合致だけエラーになる」「複雑な構成になるとコードが追いつかない」といった現象に悩まされるはずだ。
なぜか?それはマクロ記録が「操作の再現」しかしていないからだ。我々が目指すべきは、SolidWorksの内部モデルを論理的に解釈し、合致という名の「関係性」をデータとして抽出することである。
今日は、アセンブリ内の全合致を走査し、どの部品とどの部品がどう結びついているのかを、イミディエイトウィンドウに鮮やかに射抜くための「プロの作法」を伝授する。
—
1. なぜ「マクロ記録」を信じてはいけないのか
マクロ記録は、ユーザーのUI操作を逐次的に追う「イベントログ」に過ぎない。しかし、実際の業務ツールでは、以下の理由から記録コードは破綻する。
- コンポーネントの参照が変わる: ファイル名やアセンブリの構造が変わった途端、記録されたコードは迷子になる。
- 合致の「状態」が取れない: 記録は「作成」しか見ない。既存の合致がエラー(赤色)になっているか、抑制されているかといったメタ情報は取得できない。
- 非効率なループ: 全ての構成部品を力技で走査すると、大規模アセンブリではフリーズする。
我々がやるべきは、`FeatureManager`を根底から辿り、`Mate2`オブジェクトを直接叩くことだ。
—
2. 堅牢な合致走査コード(プロダクション・グレード)
以下のコードは、現在のアセンブリから全合致フィーチャーを列挙し、関与している構成部品の名称を抽出する。実務でそのまま組み込めるよう、エラーハンドリングと参照の安全性を考慮している。
Option Explicit
‘ SolidWorksの合致関係を可視化するアーキテクチャ
Public Sub TraceAssemblyMates()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim swMate As SldWorks.Mate2
Dim i As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントがアセンブリか確認
If swModel Is Nothing Or swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いてから実行してください。”
Exit Sub
End If
Set swAssy = swModel
‘ 特徴(Feature)をトップダウンで走査
Set swFeat = swAssy.FirstFeature
Debug.Print “— 合致関係走査開始 —”
Do While Not swFeat Is Nothing
‘ フィーチャータイプが「Mate」であるかを確認
If swFeat.GetTypeName2 = “Mate” Then
Set swMate = swFeat.GetSpecificFeature2
‘ 合致の詳細を解析
Call PrintMateInfo(swFeat.Name, swMate)
End If
Set swFeat = swFeat.GetNextFeature
Loop
Debug.Print “— 走査終了 —”
End Sub
Private Sub PrintMateInfo(featName As String, swMate As SldWorks.Mate2)
Dim i As Long
Dim compName As String
Debug.Print “合致名: ” & featName & ” | 関連部品数: ” & swMate.GetMateEntityCount
‘ 合致に関与する構成部品を列挙
For i = 0 To swMate.GetMateEntityCount – 1
Dim swEntity As SldWorks.MateEntity2
Set swEntity = swMate.MateEntity(i)
Dim swComp As SldWorks.Component2
Set swComp = swEntity.ReferenceComponent
If Not swComp Is Nothing Then
Debug.Print ” -> 構成部品: ” & swComp.Name2
Else
Debug.Print ” -> 構成部品: (不明/非アセンブリ構成)”
End If
Next i
End Sub
—
3. 実務運用における「3つの鉄則」
このコードをただ動かすだけでなく、システムとして運用するための知見を共有する。
① インスタンスの寿命(ライフサイクル)を意識せよ
`swMate.MateEntity(i)`で取得したオブジェクトは、非常に揮発性が高い。大規模アセンブリでは、ループごとに必ず`Set = Nothing`でメモリを解放する癖をつけろ。さもないと、SolidWorksはメモリリークを起こし、数時間後にクラッシュする。
② ファイル・DB連携時の注意点
合致関係をCSVやDBへ出力する場合、`swComp.Name2`(アセンブリ内での一意なインスタンス名)を主キーにするのは危険だ。「ファイル名(パス)」と「インスタンスID」の組み合わせで管理せよ。特にパターン(ミラーやコピー)で配置された部品は、名前が重複する可能性がある。
③ 抑制状態(Suppressed)のハンドリング
実務では「抑制された合致」を無視したいケースが多いはずだ。`swFeat.GetSuppression` を使い、`swFeatureSuppressionState_e` が `swFeatureSuppressed` でないものだけを処理するようにフィルタリングをかけるのが、プロの設計だ。
—
結論:コードは「対話」である
自動化の目的は、単純なルーチンワークの削減ではない。「SolidWorksが理解している設計意図を、我々がデータとして再定義すること」にある。
このコードをベースに、あなたの現場で必要なロジックを肉付けしていってほしい。もし「特定の合致条件(例えば距離合致の数値のみ)を抽出したい」といった要求があるなら、次は`swMate.GetMateEntityCount`の後に`swMate.Type`をチェックする条件分岐を追加するだけでいい。
迷ったら、いつでも戻ってこい。SolidWorksの内部構造を知ることは、あなたの自動化エンジニアとしての最大の武器になるはずだ。
