【実務・中級編】【初心者向け】マクロ記録では取得できないアセンブリ合致関係(Mate)のツリー構造を一網打尽にするイミディエイト出力 – SolidWorks VBA解析バイブル

スポンサーリンク

アセンブリの「合致」を完全掌握せよ:マクロ記録の先にある、実務レベルの走査術

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の内部構造を知ることは、あなたの自動化エンジニアとしての最大の武器になるはずだ。

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