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

スポンサーリンク

【SolidWorks VBA】マクロ記録の限界を超えろ!アセンブリの「合致関係」を丸裸にする極意

こんにちは。現場で設計自動化の壁にぶつかり、そこからエンジニアとしての腕を磨いてきた皆さんに、今日は一段階上の「SolidWorksの操り方」を伝授します。

多くの初心者が最初にぶつかる壁。それは「マクロの記録」で生成されたコードが、なぜか自分の思い通りに動かないという現実です。特にアセンブリの合致(Mate)は、マクロ記録ではただの「選択と実行」の履歴としてしか残りません。

しかし、SolidWorksのAPIを直接叩けば、ツリーの奥底にある合致情報をプログラムから自由自在に抽出できます。今回は、アセンブリ内の全合致関係をイミディエイトウィンドウに叩き出す、「脱・初心者」のための実践的コードを解説します。

—

なぜ「マクロ記録」では不十分なのか?

マクロの記録は、あくまで「マウス操作をなぞる」機能です。しかし、APIの世界では、SolidWorksは「ツリー構造」を辿る論理的なパスとして世界を捉えています。

  • マクロ記録の視点: 「この面を選択して、あの面を選択して、合致ボタンを押す」
  • APIの視点: 「`AssemblyDoc`というオブジェクトの中に`Feature`があり、その中に`MateFeature`というデータ構造があり、その`GetEntities`メソッドで紐づく`Component`を特定する」

この「データ構造」を理解した瞬間、あなたの自動化スキルは飛躍的に向上します。

—

合致構造を一網打尽にするVBAコード

以下のコードをVBAエディタ(Alt+F11)に貼り付けてみてください。現在の開いているアセンブリの全合致情報と、結合されている構成部品の名前をイミディエイトウィンドウ(Ctrl+G)に出力します。

Option Explicit

Sub ListUpAssemblyMates()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim swMate As SldWorks.MateFeature
Dim swMateEnt As SldWorks.MateEntity2
Dim swComp As SldWorks.Component2
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

‘ フィーチャーツリーの先頭から走査開始
Set swFeat = swAssy.FirstFeature

Debug.Print “— 合致関係の走査を開始 —”

Do While Not swFeat Is Nothing
‘ フィーチャーの種類が「合致(Mate)」であるものだけを抽出
If swFeat.GetTypeName2 = “MateGroup” Then
‘ 合致グループ内の各合致を取得
Dim swSubFeat As SldWorks.Feature
Set swSubFeat = swFeat.GetFirstSubFeature

Do While Not swSubFeat Is Nothing
If swSubFeat.GetTypeName2 = “Mate” Then
Set swMate = swSubFeat.GetSpecificFeature2
Debug.Print “合致名: ” & swSubFeat.Name

‘ 合致に紐づくエンティティ(構成部品)を走査
For i = 0 To swMate.GetMateEntityCount – 1
Set swMateEnt = swMate.MateEntity(i)
Set swComp = swMateEnt.ReferenceComponent

If Not swComp Is Nothing Then
Debug.Print ” -> 構成部品: ” & swComp.Name2
Else
Debug.Print ” -> 構成部品: (外部参照またはアセンブリ自身)”
End If
Next i
End If
Set swSubFeat = swSubFeat.GetNextSubFeature
Loop
End If
Set swFeat = swFeat.GetNextFeature
Loop

Debug.Print “— 走査完了 —”
End Sub

—

初心者が必ずつまずく「3つのポイント」

1. `GetTypeName2` でフィルタリングする

ツリーの中には「スケッチ」も「穴」も「合致」も混在しています。全部をループさせるのではなく、`GetTypeName2 = “MateGroup”` という識別子で、必要なものだけをすくい上げるのがプロのやり方です。

2. `SubFeature` の概念

SolidWorksのツリーにおいて、合致は「MateGroup」という大きな箱の中に、「Mate」という個別のフィーチャーがぶら下がっています。`GetFirstSubFeature` / `GetNextSubFeature` を使うことで、この親子関係を正確に辿れます。

3. `ReferenceComponent` の重要性

合致した「面」の情報だけでは不十分です。「どの部品(Component)のどの面か」を知るために `ReferenceComponent` プロパティを使います。ここが取れるようになると、アセンブリの論理構造を完全に把握できたも同然です。

—

最後に:ここをクリアすれば「自動化の達人」です

このコードを動かすと、イミディエイトウィンドウにズラリと合致情報が表示されます。
「自分の書いたコードが、SolidWorksのデータ構造を読み解いている」という実感が湧いてくるはずです。

もしエラーが出たら?それはSolidWorksが「ここにはデータがないよ」と教えてくれているサインです。`If swComp Is Nothing Then` のように、「存在しない場合」のケアを書き加えることが、現場で壊れないマクロを作るための最初の一歩です。

さあ、次はどの情報を抽出しましょうか?この「ツリーを辿る技術」さえあれば、もう怖いものはありません。素晴らしい設計自動化ライフを!

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