【実務・中級編】【レガシーコードのリファクタリング】廃止予定・非推奨となった古いSolidWorks APIメソッドの特定とモダンAPIへの置換術 – SolidWorks VBA解析バイブル

スポンサーリンク

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` を排除し、オブジェクト指向的なアプローチへ切り替えてください。コードが美しくなれば、バグは消え、あなたの生産性は指数関数的に向上します。

次回の記事では、「大規模アセンブリを瞬時に走査する再帰的アルゴリズム」について深掘りします。期待していてください。

タイトルとURLをコピーしました