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ユーザーではありません。自動化アーキテクトです。
まずはこのコードをコピーして、ご自身のアセンブリで動かしてみてください。「あ、本当に潜ってくれた!」という感動が、あなたの次のステップへの扉を開くはずです。
何か分からないことがあれば、いつでも聞いてください。一緒に最高の自動化環境を作り上げましょう。
