【入門編】【実務中級】アセンブリ構造の深い階層(マルチレベル)にある部品を一発で特定し、最上位から一括合致を定義する再帰的アルゴリズム – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAの極致:再帰的アルゴリズムで「深い階層」の部品を支配する

こんにちは。SolidWorksの自動化の世界へようこそ。

「マクロの記録」で生成されたコードが、複雑なアセンブリの前で無力になった経験はありませんか?アセンブリの階層が深くなればなるほど、目的の部品は迷路の奥底に隠れてしまいます。

今回は、「再帰関数(Recursive Function)」という最強の武器を使い、何階層下に眠る部品であっても一瞬で特定し、最上位から強制的に合致(Mate)を定義する、プロ級のテクニックを伝授します。

—

なぜ「再帰」が必要なのか?

通常、アセンブリ内の部品を探すとき、多くの人は最上位の構成部品リストをループで回します。しかし、サブアセンブリの中にさらにサブアセンブリがあるような「マルチレベル構造」では、そのループは通用しません。

ここで再帰です。これは「関数が自分自身を呼び出す」ことで、ツリー構造を深くまで自動的に潜り込み、どん底まで探索を完了させる手法です。

—

【実践】再帰的探索と合致定義のコード

このコードは、指定した名前の部品を全階層から探し出し、そのエンティティ(面やエッジ)を取得して合致を強制するテンプレートです。

‘ SolidWorks API 再帰的探索と合致の自動化コア
Option Explicit

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

Sub Main()
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel.GetType <> swDocASSEMBLY Then Exit Sub

‘ 再帰関数を呼び出し、目的の部品を探して合致させる
‘ 引数:探索対象のコンポーネント、ターゲット名
TraverseAndMate swModel.GetComponentByName(“RootAssembly-1”), “TargetPart-1”
End Sub

‘ 再帰関数:ツリーを潜りながら目的の部品を探す
Sub TraverseAndMate(swComp As SldWorks.Component2, targetName As String)
Dim vChildren As Variant
Dim swChildComp As SldWorks.Component2
Dim i As Long

vChildren = swComp.GetChildren
If IsEmpty(vChildren) Then Exit Sub

For i = 0 To UBound(vChildren)
Set swChildComp = vChildren(i)

‘ 部品名が一致したら合致処理を実行
If Left(swChildComp.Name2, Len(targetName)) = targetName Then
Debug.Print “発見: ” & swChildComp.Name2
ApplyMate swChildComp
Else
‘ 見つからなければ、さらに下の階層へ再帰的に潜る
TraverseAndMate swChildComp, targetName
End If
Next i
End Sub

‘ 合致定義のロジック(簡易例)
Sub ApplyMate(swComp As SldWorks.Component2)
‘ ここでMate2インターフェースを使い、面と面を拘束する
‘ 実際には swModel.AddMate5 等を使用します
MsgBox swComp.Name2 & ” に合致を定義しました。”
End Sub

—

このコードの「本質」を理解する

1. `GetChildren` の役割:
このメソッドが階層の鍵です。サブアセンブリを「子を持つ親」として認識し、その中身を配列として返します。
2. 再帰の脱出条件:
`If IsEmpty(vChildren) Then Exit Sub`。これが重要です。これがないと関数はどこまでも潜り続け、メモリ不足でクラッシュします。底(部品単体)に達したら止まる、という明確なルールです。
3. なぜ `Name2` を使うのか:
SolidWorks APIにおいて、単なる `Name` よりも `Name2` を使うのがプロの流儀です。APIのバージョン進化に対応しやすく、メモリ管理の観点からもより正確なオブジェクト参照が可能です。

—

陥りやすい罠:ここだけは注意!

  • コンポーネントの抑制: 抑制(Suppressed)されている部品は `GetChildren` では取得できない場合があります。探索前に構成部品の状態を確認するロジックを挟むと、より堅牢になります。
  • パスの競合: 同名の部品が別々のサブアセンブリに存在する場合、このコードは最初に見つけたものを優先します。厳密に特定したい場合は、フルパス(`GetPathName`)で比較するように改修してください。

—

最後に:エンジニアとしての一歩先へ

「再帰」を使いこなせるようになると、これまで手動で数時間かかっていた修正が、わずか数秒の実行で終わるようになります。

プログラミングは魔法ではありません。「SolidWorksがどのようにアセンブリを構造化しているか」という本質的なモデル構造を理解し、それをコードでなぞる。これができれば、あなたはもう単なるVBAユーザーではありません。自動化アーキテクトです。

まずはこのコードをコピーして、ご自身のアセンブリで動かしてみてください。「あ、本当に潜ってくれた!」という感動が、あなたの次のステップへの扉を開くはずです。

何か分からないことがあれば、いつでも聞いてください。一緒に最高の自動化環境を作り上げましょう。

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