SolidWorks APIの「負の遺産」を断つ:レガシーコードをモダンに昇華させる極意
「動くからいい」という思考が、あなたの工数を蝕んでいることに気づいていますか?
SolidWorksのAPIは20年以上の歴史を持ちます。しかし、その過程で多くのメソッドが「非推奨(Deprecated)」となり、背後で重厚なラッパーが動くことでパフォーマンスを低下させています。本稿では、伝説的な自動化エンジニアの視点から、レガシーコードを現代的な高速・堅牢なアーキテクチャへと脱皮させるための「リファクタリングの極意」を伝授します。
—
1. なぜ「古いメソッド」は悪なのか?
単に「動かなくなるから」ではありません。最も深刻な問題は「メモリ管理の不透明さ」と「実行速度の損失」です。
古いAPIは、現在のSolidWorksのマルチスレッド対応や、複雑なコンフィギュレーション管理に対応しきれていません。特に `SelectionManager` 周りの処理や、力技の `Extension.SelectByID2` を多用するコードは、バグの温床であり、処理を劇的に遅くします。
あなたのコードをチェックリストで診断
- [ ] `SelectByID2` で名前を指定して要素を選択しているか?
- [ ] `ActiveDoc` を多用し、ドキュメントの切り替えをAPIに依存しているか?
- [ ] `Set swApp = Application.SldWorks` と書いて終わらせているか?
これらに当てはまるなら、あなたのコードは「時限爆弾」です。
—
2. リファクタリングの核心:モダンAPIへの転換術
改善案1:SelectByID2 の廃止(セレクションの最適化)
`SelectByID2` は非常に高コストです。現代のSolidWorks APIでは、「直接オブジェクトにアクセスする」のが鉄則です。
【Before: 悪い例】
‘ 非推奨:名前による選択は不安定かつ低速
swModel.Extension.SelectByID2 “Sketch1@Part1.SLDPRT”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0
【After: 推奨されるモダンアプローチ】
‘ フィーチャーオブジェクトを直接取得し、Selectメソッドを使用
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FeatureByName(“Sketch1”)
If Not swFeat Is Nothing Then
swFeat.Select2 False, 0 ‘ 直接選択することで安定性が飛躍的に向上
End If
改善案2:ActiveDocからの脱却
`swApp.ActiveDoc` を使うコードは、ユーザーが別のウィンドウをクリックした瞬間に死にます。常に「明示的にドキュメントオブジェクトを保持する」設計にしてください。
—
3. 実践:保守性の高いプロダクションコード・テンプレート
業務自動化ツールにおいて、最も重要なのは「エラーハンドリング」と「オブジェクトの寿命管理」です。以下は、堅牢なツールを作成するためのクラスベースのテンプレートです。
‘ 堅牢な処理のための標準テンプレート
Public Sub OptimizeModelProcessing()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
‘ 1. インスタンスの安全な取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
‘ 2. グラフィックスと再構築の抑制(高速化の鍵)
swModel.FeatureManager.EnableFeatureTree = False
swModel.EditSuppress2 ‘ 処理中のモデルの不要な計算を抑止
On Error GoTo ErrorHandler
‘ — メイン処理 —
‘ ここにロジックを記述
‘ ——————
CleanUp:
‘ 3. 必ずリソースを解放する
swModel.FeatureManager.EnableFeatureTree = True
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
—
4. データベース連携時の落とし穴
SolidWorksのデータをExcelやSQL Serverと連携させる際、「COMオブジェクトの解放漏れ」は致命的です。
- オブジェクトの参照を確実に切る: `Set swObj = Nothing` をループの最後で必ず行うこと。これを怠ると、SolidWorksのプロセスが裏で残り続け、次回起動時に「ファイルが使用中です」というエラーを招きます。
- ファイルオープンには必ず `OpenDoc6` を使用: 旧来の `OpenDoc` ではなく、フラグ制御が可能な `OpenDoc6` を使用し、バックグラウンドでの読み込み(`swOpenDocOptions_Silent`)を徹底してください。
—
最後に:エンジニアとしての矜持
レガシーなコードをリファクタリングすることは、単なる「掃除」ではありません。それは、あなたの業務時間を物理的に短縮し、SolidWorksという巨大なシステムの挙動を制御下に置くという「支配の儀式」です。
今日から `SelectByID2` を排除し、オブジェクト指向的なアプローチへ切り替えてください。コードが美しくなれば、バグは消え、あなたの生産性は指数関数的に向上します。
次回の記事では、「大規模アセンブリを瞬時に走査する再帰的アルゴリズム」について深掘りします。期待していてください。
