【SolidWorks API】アセンブリ自動化の極意:AddMate5による「堅牢な合致定義」の実装術
エンジニア諸君。業務効率化のためにVBAでアセンブリを自動生成しようとしているのなら、まずはその「不安定なコード」を捨てる準備をしてほしい。
SolidWorks APIを扱う上で最も多い失敗は、「手動操作をそのままコードに翻訳しようとすること」だ。画面上のクリック動作をなぞるだけのコードは、モデルの変更やエラーメッセージ一つで即座にクラッシュする。
今日は、アセンブリ自動化の心臓部である `AddMate5` を使い、実務で「落ちない」コードを書くための作法を伝授する。
—
1. なぜ `AddMate5` なのか?
SolidWorksには複数の合致追加メソッドが存在するが、結論から言えば `AddMate5` 一択だ。
旧来のメソッドと異なり、`AddMate5` は合致の反転方向や整列状態を制御するオプションが充実しており、何より「どのエンティティに対して合致を行うか」をAPI側で明示的に定義できるため、予期せぬエラーを劇的に減らせる。
—
2. 堅牢な合致定義のための設計鉄則
コードを書く前に、以下の3つの鉄則を脳に刻め。
- 選択クリアは儀式ではない、必須の安全策:
`swApp.ActiveDoc.ClearSelection2 True` を呼び出さないコードは、地雷原を歩くのと同じだ。直前の選択状態が残っていると、意図しない場所に合致が飛ぶ。
- エンティティ選択の確定:
`SelectByID2` を使う際は、引数の `Append`(第5引数)を適切に制御せよ。`False` を指定し、常にクリーンな状態から選択を開始するのが鉄則だ。
- エラーハンドリングの徹底:
APIが失敗した際、SolidWorksは沈黙する。必ず戻り値(MateFeature)が `Nothing` になっていないかを確認し、失敗した場合は即座にログを吐いて中断せよ。
—
3. 実践:アセンブリ合致自動化プロトタイプ
以下は、部品1の円筒面と部品2の円筒面を「同軸(Concentric)」で拘束する、保守性の高いプロダクションコードだ。
‘ SolidWorks APIによる堅牢な同軸合致の実装
Sub AddConcentricMateExample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swMateFeature As SldWorks.Feature
Dim boolstatus As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントがアセンブリであることを確認
If swModel.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いて実行してください。”
Exit Sub
End If
Set swAssy = swModel
‘ 【重要】選択状態を完全リセット
swModel.ClearSelection2 True
‘ 1つ目の面を選択(名前ベースでの選択は実務では危険。本来は探索ロジックを組むこと)
boolstatus = swModel.Extension.SelectByID2(“面1@部品1-1@アセンブリ名”, “FACE”, 0, 0, 0, False, 1, Nothing, 0)
‘ 2つ目の面を選択(AppendをTrueにすることで、複数選択状態を作る)
boolstatus = swModel.Extension.SelectByID2(“面1@部品2-1@アセンブリ名”, “FACE”, 0, 0, 0, True, 1, Nothing, 0)
‘ 同軸合致を追加
‘ AddMate5: 戻り値がNothingなら失敗
Set swMateFeature = swAssy.AddMate5(swMateCONCENTRIC, swMateALIGN_CLOSEST, False, 0, 0, 0, 0, 0, 0, 0, 0, False, False, False, 0)
If swMateFeature Is Nothing Then
MsgBox “合致の作成に失敗しました。選択面を確認してください。”
Else
swModel.EditRebuild3
Debug.Print “合致成功: ” & swMateFeature.Name
End If
End Sub
—
4. プロフェッショナルへのアドバイス
このコードをそのまま使って満足してはならない。実務レベルへ引き上げるために必要な視点は以下の通りだ。
1. 名前参照の脱却: 上記コードでは `SelectByID2` で固定名を使っているが、モデルが入れ替われば即座に破綻する。`FeatureManager` を走査して、特定のコンポーネント内にある面を `SelectByRay` 等で動的に取得するロジックへ進化させよ。
2. データベース連携: 合致の条件(距離、角度、反転フラグ)はExcelやCSVから読み込むように設計すること。ロジック(コード)とデータ(寸法)を分離するのが、変更に強いプログラムの絶対条件だ。
3. ライフサイクル管理: 大規模アセンブリでこれを繰り返すとメモリを食う。定期的に `swModel.EditRebuild3` を呼び出し、必要に応じて `ClearSelection2` を行い、SolidWorksの内部キャッシュを解放させる意識を持て。
自動化の本質は「作業を速くすること」ではない。「人間が手動でやるにはミスが多く、精神を摩耗させる作業を、機械に正確かつ確実に実行させること」にある。
次回の記事では、この「動的エンティティ探索」のアルゴリズムについて深掘りする。準備を整えておけ。
