【SolidWorks APIの深淵】合致(Mate)の動的フィルタリングとメモリ管理の流儀
SolidWorksの設計自動化において、アセンブリ内の合致関係(Mate)をプログラムで制御することは、単なる「選択」以上の意味を持つ。大規模アセンブリにおいて、数千の合致から特定の論理を持つものだけを抽出・操作することは、設計意図をコードで追跡する行為に他ならない。
多くのエンジニアは `GetMates` を呼び出してループを回すだけで満足しているが、真の自動化エンジニアは、メモリの断片化とオブジェクトライフサイクルの管理にまで神経を尖らせる。今日は、その最前線の知見を共有する。
—
1. 探索アルゴリズムの選定とパフォーマンスの罠
アセンブリ内の `Mate` は、`AssemblyDoc` オブジェクトの `GetMates` メソッドで取得できる。しかし、ここで初学者が陥る罠が「全走査によるオーバーヘッド」だ。
大規模アセンブリで `Feature` オブジェクトを一つずつループして `MateFeature` にキャストし、名前を照合する。このプロセスは、メモリ上に大量のラッパーオブジェクトを生成する。この「ガベージの山」を放置すれば、SolidWorksの動作は極端に鈍化する。
極限の探索ロジック
我々が重視するのは、`Feature` の `GetTypeName2` を利用し、オブジェクトを実体化させる前に名前のフィルタリングを行うことだ。
‘ メモリ効率を最大化した合致抽出の実装
Public Sub SelectMatesByPattern(ByVal TargetPattern As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim swFeat As SldWorks.Feature
Dim swMateFeat As SldWorks.MateFeature
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel.GetType <> swDocASSEMBLY Then Exit Sub
Set swAssy = swModel
‘ モデルの再構築抑制(API実行を高速化する鉄則)
swModel.FeatureManager.EnableFeatureTree = False
Set swFeat = swModel.FirstFeature
Do While Not swFeat Is Nothing
‘ “Mate”というTypeNameを持つFeatureのみを対象に絞り込む
If swFeat.GetTypeName2 = “Mate” Then
‘ 正規表現やInStrで命名規則を評価
If InStr(1, swFeat.Name, TargetPattern, vbTextCompare) > 0 Then
‘ 選択状態にする(Append:=Trueで複数選択)
swFeat.Select2 True, 0
End If
End If
Set swFeat = swFeat.GetNextFeature
‘ 循環参照を防ぎ、ループ内で明示的に参照を解放(重要)
Loop
swModel.FeatureManager.EnableFeatureTree = True
‘ 最後にメモリの断片を掃除するアーキテクトの矜持
Set swFeat = Nothing
Set swAssy = Nothing
End Sub
—
2. メモリ管理の「鉄則」:オブジェクトの明示的解放
VBAのガーベジコレクションを信じてはいけない。特にCOMオブジェクトを扱うSolidWorks APIでは、スコープを抜けても参照カウントが残存し、メモリリークの温床となる。
- 循環参照の回避: ループ内でのオブジェクトの再代入(`Set`)は、必ず古い参照を `Nothing` にする意識を持つこと。
- API実行のセーフティ: `EnableFeatureTree = False` は、Treeの再描画を止めることで、数秒単位の実行速度短縮を実現する。これは大規模アセンブリを扱う際の「必須の作法」だ。
—
3. レガシー保守とシステム間連携への視座
もしあなたが、このコードをより大規模なシステムに組み込むなら、`Windows API` を使ったプロセス監視を検討すべきだ。
`User32.dll` を呼び出し、SolidWorksのウィンドウハンドル(HWND)を監視することで、APIがハングアップした際に自動的にエラーログを吐き出し、プロセスを再起動する「ウォッチドッグ」を構築できる。
‘ 参考:Windows APIを用いたプロセス制御の定石
If VBA7 Then
Private Declare PtrSafe Function GetForegroundWindow Lib “user32” () As LongPtr
Else
Private Declare Function GetForegroundWindow Lib “user32” () As Long
End If
—
チーフアーキテクトからの提言
コードは単なる命令の羅列ではない。それは設計者の意図を具現化した「デジタルな設計図」だ。
1. 命名規則の強制: 合致の名付けルールが崩れていれば、どんな優れたアルゴリズムも無力だ。APIを組む前に、設計現場に命名規則を徹底させることこそが、自動化の第一歩である。
2. 疎結合な設計: 今回の抽出メソッドを `Class Module` にカプセル化せよ。メインのロジックから切り離すことで、将来的なSOLIDWORKSのバージョンアップや、API仕様変更にも耐えうる保守性の高いシステムが完成する。
技術は常に進化する。しかし、オブジェクトを丁寧に扱い、リソースを無駄にせず、泥臭い最適化を厭わない姿勢こそが、10年後も動くコードを生むのだ。
君のコードが、SolidWorksの広大なアセンブリの中で、静かに、そして確実に、設計の意図を汲み取れるようになることを期待している。
