SolidWorks APIの深淵:アセンブリ機構を自在に操る「合致抑制」のアーキテクチャ
SolidWorks APIを扱う際、多くのエンジニアが陥る罠がある。それは「GUIの操作をそのままコードに落とし込もうとする」ことだ。特にアセンブリの合致(Mate)操作において、`SelectByID2`を多用するようなコードは、複雑な大規模アセンブリの前では無力であり、パフォーマンスの劣化とクラッシュの温床となる。
今回は、機構の検証やレイアウト検討において、特定の合致状態をシームレスに切り替える「抑制(Suppression)トグル」の設計思想を伝授する。
—
1. 概念の再定義:なぜ「抑制」が必要か
機構解析において、全ての合致が有効であることは時に足枷となる。ある時は「固定(Fix)」を外し、ある時は「角度制限」を外して可動域を広げたい。これをGUIで行うのは非効率であり、何よりヒューマンエラーの元だ。
我々が目指すのは、「合致の名称」をキーにした辞書的アクセスによる一括制御である。ポインタをメモリ上に直接配置し、APIのオーバーヘッドを最小化する設計を行わねばならない。
—
2. 実装:合致抑制・解除のコアロジック
以下のコードは、特定のアセンブリ内で特定の名前を持つ合致を検索し、その状態を反転させるプロシージャである。
マクロ:Mate State Switcher
Option Explicit
‘ 伝説的なチーフアーキテクトによる実装
‘ 参照設定: SolidWorks 20xx Type Library
Sub ToggleMateSuppression(ByVal mateName As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim found As Boolean
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 swFeat = swAssy.FirstFeature
‘ 再帰的な走査よりも、FeatureManagerの直列走査がメモリ効率的
Do While Not swFeat Is Nothing
‘ 合致機能かつ名称の一致を確認
If swFeat.GetTypeName2 = “Mate” And swFeat.Name = mateName Then
‘ 抑制状態の反転処理
If swFeat.IsSuppressed Then
swFeat.Unsuppress2
Else
swFeat.Select2 False, 0
swFeat.Suppress2
End If
found = True
Exit Do
End If
Set swFeat = swFeat.GetNextFeature
Loop
‘ メモリ最適化:不要なオブジェクトは即座に解放
Set swFeat = Nothing
Set swAssy = Nothing
Set swModel = Nothing
If Not found Then Debug.Print “Error: Mate ‘” & mateName & “‘ not found.”
End Sub
—
3. シニアエンジニアのための最適化知見
① Featureの走査コストを抑える
上記コードでは `GetNextFeature` を使用しているが、これは単純なリスト構造を辿るため、大規模アセンブリでは処理時間が線形に増加する。もし対象の合致が特定の「合致フォルダー」内にあると分かっているなら、`FeatureManager`から直接対象を絞り込むAPIを優先すべきだ。
② Windows APIとの連携(UIのフリーズ防止)
大規模な抑制変更を行う際、SolidWorksの画面更新がボトルネックとなる。コード実行前に `swApp.Frame.Enable = False` で画面の描画を停止させ、完了後に戻すことで、処理速度を劇的に向上させることが可能だ。
③ オブジェクトライフサイクルの管理
VBAはガベージコレクションが脆弱だ。特に `Select2` メソッドを多用すると内部的な選択バッファが肥大化し、メモリリークを起こす。
- 原則: `Select2` を呼んだ後は必ず `swModel.ClearSelection2 True` を実行せよ。
- 原則: 参照したCOMオブジェクトは、スコープを抜ける前に `Nothing` を明示的に代入せよ。
—
4. 総括:レガシーを「資産」に変える
このコードは一見シンプルだが、大規模な自動化システムの一部として組み込むことで、設計者の試行錯誤を加速させる強力なエンジンとなる。
VBAは「終わった技術」ではない。SolidWorksのAPI構造を深く理解し、メモリの挙動を制御できる者にとっては、GUIの限界を超えるための最強の武器だ。コードを書き換えるときは常に「これが数千個の部品を持つモデルでも、0.1秒で動作するか?」と自問自答すること。それが、真のプロフェッショナルの矜持である。
質問があれば、いつでも現場の知見を共有しよう。準備はいいか。次の設計課題へ進むぞ。
