SolidWorks VBAを掌握せよ:AddMate5が暴く「合致自動化」の深淵
自動化の入り口は常に「AddMate5」だ。しかし、多くのエンジニアはここで躓く。
「動いたから良し」とするコードは、複雑なアセンブリに適用した瞬間、メモリリークと再構築エラーの嵐を巻き起こす。
本稿では、単なるAPIのリファレンス解説ではない。「いかにしてSolidWorksのエンジンを制御下に置き、システムとして破綻させないか」という、極限の知見を授ける。
—
1. AddMate5を「ただの合致」と考えるな
`AddMate5`は、SolidWorksの合致関係における「核」である。しかし、このメソッドは単独で完結しない。
真の自動化エンジニアは、以下の3ステップを不可分なサイクルとして実装する。
1. 選択の確定(SelectionManagerの潔癖な管理)
2. 合致の構築(AddMate5のパラメーター最適化)
3. オブジェクトの解放(COMメモリの強制的な回収)
これらが欠けたコードは、ゴミをメモリに溜め込み、数千部品規模の構築で確実にクラッシュする。
—
2. 実装の真髄:堅牢な合致定義コード
以下は、実務でそのまま運用可能な「同軸」および「一致」を定義する標準ルーチンだ。
‘ SolidWorks APIを利用した合致自動化のテンプレート
Option Explicit
Public Sub AddAssemblyMate_Robust()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swSelMgr As SldWorks.SelectionMgr
Dim swMateFeature As SldWorks.Feature
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 swSelMgr = swModel.SelectionManager
‘ 重要:合致追加の前に必ずクリア
swModel.ClearSelection2 True
‘ ここで選択処理を行う(本来はSelectByID2等でエンティティを取得)
‘ 例: swModel.Extension.SelectByID2(…)
‘ AddMate5の真髄:
‘ MateType: swMateCOINCIDENT(1), swMateCONCENTRIC(4) 等
‘ Alignment: swMateAlignALIGNED(0), swMateAlignANTI_ALIGNED(1)
Dim mateError As Long
Set swMateFeature = swAssy.AddMate5(swMateCONCENTRIC, swMateAlignALIGNED, False, 0#, 0#, 0#, 0#, 0#, 0#, 0#, 0#, False, mateError)
If mateError <> 0 Then
Debug.Print “Mate Error Code: ” & mateError
End If
‘ — オブジェクトの明示的解放 —
‘ これを怠ることは、大規模システムでは「罪」である
Set swMateFeature = Nothing
Set swSelMgr = Nothing
Set swAssy = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. シニアエンジニアが守るべき「3つの鉄則」
1. SelectionManagerの呪縛を解け
`SelectByID2`でエンティティを選択した際、不要なオブジェクトがスタックに残り続ける。常に`ClearSelection2`を適切なタイミングで呼び出し、コンテキストをクリーンに保て。
2. COMオブジェクトのライフサイクル管理
VBAはガベージコレクションが脆弱だ。`Set Object = Nothing`を書き忘れることは、 SolidWorksのプロセスをゾンビ化させる。特にループ内で`AddMate5`を多用する場合、`DoEvents`を挟むか、オブジェクトの再利用を検討せよ。
3. Windows APIによる監視
大規模アセンブリでは、APIの実行速度がボトルネックになる。`GetTickCount`や`QueryPerformanceCounter`といったWindows APIを用いて、処理時間を計測せよ。1合致あたり500ms以上かかる場合、それはコードの設計ミスだ。アセンブリの再構築(`Rebuild`)を最小限にするロジックを組め。
—
4. 最後に:なぜ「初心者向け」と銘打つのか
初心者は「動くこと」を目標にする。しかし、私がこの記事で伝えたかったのは、「動かした後に何が起きるか」を予測することの重要性だ。
システム連携において、VBAは単なる接着剤ではない。それは、SolidWorksという巨大なCADエンジンの心臓部に直接メスを入れる外科手術に等しい。
コードをコピペして終わりにするな。その一行が、将来の保守担当者にとっての「負債」になるか「資産」になるか。それを決めるのは、あなた自身の美学だ。
さあ、アセンブリをプログラムで支配せよ。それが、エンジニアの誇りというものだ。
