SolidWorks APIの深淵:AddMate5によるアセンブリ自動構築の極意
SolidWorks API開発において、アセンブリの合致(Mate)構築は避けて通れない「死の谷」である。多くのエンジニアが `AddMate5` の引数の多さに怯え、マクロ記録の出力結果をそのまま貼り付けては、コンテキストエラーや再構築失敗の泥沼に沈んでいく。
本稿では、単なるAPIリファレンスの解説ではない。数千部品規模のアセンブリを高速かつ堅牢に自動構築し続けるための、チーフアーキテクトとしての「生存戦略」を授ける。
—
1. AddMate5の真実:なぜ多くのコードは失敗するのか
`IAssemblyDoc::AddMate5` は、非常に強力だが極めて気難しいメソッドだ。特に、「どの面(Entity)を渡すか」というオブジェクトの特定と、「合致の設定状態」の同期が取れていないと、瞬時に破綻する。
失敗を避けるための鉄則
- 選択のクリアを徹底する: `ModelDoc2.ClearSelection2 True` を実行せずに合致を追加しようとするのは、手作業で選択状態を維持したまま別の部品を触るようなものだ。予期せぬ面が選択され、合致が爆発する。
- SelectByID2ではなくポインタ直接指定: レガシーなコードでは `SelectByID2` で名前を指定して選択しがちだが、これは言語依存のリスクを孕む。可能であれば `Feature.GetFaces` や `Component2.Select2` で取得した `Entity` オブジェクトを直接 `SelectionManager` 経由で操作すべきだ。
—
2. 実践:堅牢な合致構築コードのテンプレート
以下は、実務で使える「部品Aの平面と部品Bの平面を一致させる」ためのアーキテクチャだ。
‘ — 伝説のアーキテクトが推奨する合致構築ルーチン —
Public Sub CreateMateRobust(swApp As SldWorks.SldWorks, swAssy As SldWorks.AssemblyDoc)
Dim swModel As SldWorks.ModelDoc2
Set swModel = swAssy
‘ 1. 選択バッファの完全消去(必須)
swModel.ClearSelection2 True
‘ 2. オブジェクトの明示的選択(Entityとして取得)
‘ 実務ではここでComponentの内部Entityを再帰的に走査する
Dim face1 As SldWorks.Entity, face2 As SldWorks.Entity
Set face1 = GetFaceFromComponent(swAssy, “PartA-1”, “Front”)
Set face2 = GetFaceFromComponent(swAssy, “PartB-1”, “Front”)
face1.Select4 True, Nothing
face2.Select4 True, Nothing
‘ 3. AddMate5の実行
‘ swMateCOINCIDENT = 0, swMateAlignALIGNED = 0
Dim mateError As Long
Dim swMate As SldWorks.Feature
Set swMate = swAssy.AddMate5( _
swMateType_e.swMateCOINCIDENT, _
swMateAlign_e.swMateAlignALIGNED, _
False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, False, mateError)
If mateError <> 0 Then
Debug.Print “Mate Failed with Error Code: ” & mateError
‘ ここでエラー処理(再構築の強制など)を実装する
End If
‘ 4. オブジェクト解放(VBAのメモリリークを塞ぐ)
Set face1 = Nothing
Set face2 = Nothing
End Sub
—
3. パフォーマンスとメモリ管理の極意
アセンブリ構築が数千部品に及ぶ場合、VBAのガベージコレクションに頼るのは自殺行為だ。
オブジェクトのライフサイクル管理
- 不要なポインタの即時解放: `Set obj = Nothing` をループの最後で行うのは基本中の基本。特に `Feature` や `Component` オブジェクトは、参照を保持し続けるとメモリ消費が指数関数的に増大し、SolidWorks自体をフリーズさせる。
- 再構築(Rebuild)のタイミング制御: 合致を追加するたびに `ModelDoc2.ForceRebuild3` を呼ぶのは愚策だ。全ての合致を追加し終えた後、あるいは論理的に区切られたセクション単位で一度だけ呼び出す。計算コストを最小化せよ。
Windows APIとの連携
もし、大規模アセンブリ構築中にSolidWorksが「応答なし」になるのを防ぎたいなら、`DoEvents` だけでなく、Windows APIの `Sleep` を利用してCPUの割り込みを意図的に制御するのも一つの手だ。あるいは、`UserPreference` でバックグラウンド再構築をオフにすることで、処理速度を劇的に向上できる。
—
4. 最後に:伝説を継ぐ者へ
自動化とは、単にコードを書くことではない。「SolidWorksがどのようにモデルを評価し、どの順序で再構築を計算しているか」というカーネルの思考回路を模倣することである。
`AddMate5` は単なる関数ではない。アセンブリという名の構造体に対する「拘束条件の定義」そのものだ。エラーが出たときに「なぜ失敗したか」をエラーコードから即座に逆算できるまで、徹底的に `Entity` の階層構造を叩き込んでほしい。
VBAは古いと言われる。しかし、SolidWorks APIの核心は、言語の進化を超越したところにある。君たちの書くコードが、明日の設計現場を支える強力なエンジンとなることを期待している。
—
チーフアーキテクトより
