SolidWorks APIの深淵:レガシーコードを「現代の速度」へ引き戻すリファクタリングの極意
SolidWorks APIの世界において、コードが「動く」ことは最低条件に過ぎない。真のエンジニアが問うべきは、そのコードが「SolidWorksのメモリ空間をどれだけ汚染せず、次世代のAPIと共生できるか」という一点に尽きる。
20年近く前のVBAコードが、今日の巨大なアセンブリ環境で悲鳴を上げているのを目にするのは忍びない。本稿では、死にゆくAPIを最新の設計思想へと置き換え、システムを延命させるための「外科手術」を伝授する。
—
1. 殺意を抱くべき「レガシーAPI」の正体
多くのレガシーコードは、`Select`や`Activate`という「GUI操作のなぞり」に依存している。これらはSolidWorksのレンダリングエンジンを不必要に呼び出し、処理時間を指数関数的に増大させる。
避けるべき「死のパターン」
- `SelectionManager.GetSelectedObject6` の乱用: インデックスベースの選択取得は、UIの状態に依存するため極めて不安定だ。
- `ModelDoc2.EditRebuild3` の連発: モデルの再構築はコストが高い。可能な限り `IModelDocExtension::Rebuild` を使い、再構築範囲を限定せよ。
- `Application.SldWorks` をグローバル変数に置く: これがメモリリークとCOMサーバーのゾンビ化の主犯である。
—
2. メモリ最適化:COMの「明示的解放」という流儀
VBAのガーベッジコレクションは信用するな。SolidWorks APIはCOMベースであり、参照カウントが残ればSolidWorksプロセスはバックグラウンドで生き残り続ける。
鉄則:オブジェクトのスコープと解放
‘ 非推奨:グローバルに宣言して放置する
Dim swApp As SldWorks.SldWorks
‘ 推奨:必要なときだけ取得し、直ちにNothingへ
Public Sub ProcessModel()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ プロセスへのアタッチ
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Exit Sub
‘ ここで処理を実行
PerformDeepAnalysis swModel
‘ 明示的な解放:ここを通らなければメモリは解放されない
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. モダンAPIへの置換:高速化のメソッド
古くは `FeatureManager` を介して行っていた処理も、現在は `IModelDocExtension` 経由で実行するのが定石だ。これにより、UIの描画更新をバイパスし、計算処理のみを高速に行える。
置換の実践:再構築の最適化
レガシーコードでよく見かける `swModel.EditRebuild` は、ドキュメント全体を強制的に更新する。大規模アセンブリでは致命的だ。
‘ 【置換前】レガシーな再構築(重い)
swModel.EditRebuild3
‘ 【置換後】モダンな再構築(IModelDocExtensionを使用)
Dim swExt As IModelDocExtension
Set swExt = swModel.Extension
‘ 必要な範囲だけを再構築することで、パフォーマンスを劇的に改善する
swExt.Rebuild2 swRebuildOptions_e.swRebuildAll
—
4. Windows APIを活用した「防弾」システム
SolidWorksのAPIだけでは、ウィンドウの状態やプロセス間通信の制御に限界がある。`User32.dll` を活用し、システムを強制的に制御下に置く手法も、シニアエンジニアの嗜みだ。
‘ ウィンドウの非表示化による描画コストのカット
Private Declare PtrSafe Function ShowWindow Lib “user32” (ByVal hwnd As LongPtr, ByVal nCmdShow As Long) As Long
Public Sub SilentMode(swApp As SldWorks.SldWorks, ByVal enable As Boolean)
‘ UIの更新を停止してパフォーマンスを最大化する
swApp.UserControl = Not enable
swApp.Visible = Not enable
End Sub
—
5. アーキテクトからの最終警告
リファクタリングとは、単なる置換作業ではない。「なぜそのAPIが廃止されたのか」という設計意図を読み解くプロセスだ。
1. Selectionを排除せよ: APIは「選択」を待つ必要はない。オブジェクトIDや名前から直接 `Feature` や `Component` を取得する設計に変えろ。
2. エラーハンドリングを再定義せよ: `On Error Resume Next` で逃げるのはアマチュアのすることだ。`HRESULT` をチェックし、APIが返すエラーコードからボトルネックを特定せよ。
3. VB.NETへの移行を視野に入れよ: VBAは限界に近い。`SolidWorks.Interop.sldworks` 名前空間を利用した .NET アプリケーションは、型安全性が高く、マルチスレッド処理の恩恵を受けられる。
コードを整理することは、SolidWorksという巨大なシステムの「血流」を良くすることと同義だ。無駄な再描画を止め、不要な参照を捨て、論理的なデータ構造のみを操作する。その先にこそ、真の自動化エンジニアの境地がある。
明日、あなたの現場のコードから一つ、`Select` を消してみせよ。それが伝説への第一歩だ。
