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

スポンサーリンク

SolidWorks APIの「負の遺産」を断つ:レガシーコードをモダンに昇華させる極意

こんにちは。SolidWorksの自動化の世界へようこそ。
長年SolidWorksを触っていると、ネットで見つけた古いコードや、マクロの記録で生成された「継ぎはぎのコード」が溜まっていくものです。「動くからいいや」と放置していませんか?

しかし、そのコードこそが、あなたのPCを重くし、予期せぬクラッシュを招く「時限爆弾」かもしれません。今日は、伝説のエンジニアとして、「レガシーAPIを最新の洗練されたコードへ書き換えるための極意」を伝授します。

1. なぜ「マクロの記録」は卒業すべきなのか

マクロの記録は、SolidWorksが裏で何をしているかを覗くには良い教材です。しかし、記録されたコードは「今、画面上で何が選択されているか」という不確実な情報に依存しています。

‘ 【レガシーコードの典型例】
‘ 選択状態に依存しており、エラーが起きやすい
Set swModel = swApp.ActiveDoc
swModel.Extension.SelectByID2 “Face1”, “FACE”, 0, 0, 0, False, 0, Nothing, 0

`SelectByID2`は非常に強力ですが、モデルの変更で名前が変われば即座に破綻します。これからは、「名前で指定する」のではなく「オブジェクトを直接取得する」という設計思想へ切り替えましょう。

2. 非推奨APIの特定とモダンな置換術

避けるべきは、パフォーマンスを著しく低下させる古いメソッドです。特に「描画更新」と「再構築」の扱いは重要です。

A. 画面更新の制御をスマートに

古いコードでは`swApp.Visible = True`を繰り返すような無駄な描写が発生しがちです。最新のAPIでは、処理開始前に画面更新を止め、最後に一気に再描画するのが鉄則です。

‘ 【リファクタリング後の鉄板パターン】
Sub OptimizePerformance()
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks

‘ 処理開始:画面更新を止めて高速化
swApp.Frame.EnableEvents = False
swApp.EnableGraphicsUpdate = False

‘ ここにメイン処理を記述

‘ 処理終了:確実に復帰させる
swApp.EnableGraphicsUpdate = True
swApp.Frame.EnableEvents = True
End Sub

B. `GetActiveDoc` から `IModelDoc2` への参照管理

`ActiveDoc`は非常に曖昧です。どの種類のドキュメント(Part, Assembly, Drawing)か確定させることで、APIの呼び出し速度と安定性が飛躍的に向上します。

‘ 【推奨される安全な参照】
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then Exit Sub

‘ 型チェックを行い、特定のAPIへのアクセスを安全にする
If swModel.GetType = swDocPART Then
Dim swPart As SldWorks.PartDoc
Set swPart = swModel
‘ Part専用の高度なAPIが使えるようになる
End If

3. オブジェクトの「ライフサイクル」を理解する

VBAのメモリ管理で最も多いミスは、「取得したオブジェクトを開放せずに放置すること」です。特に`ModelDoc2`や`Feature`をループ内で生成し続けると、メモリリークの温床となります。

  • ポイント: ループ内で`Set obj = Nothing`を明示的に行い、参照を解除する癖をつけましょう。

4. 今日から始めるリファクタリング・チェックリスト

あなたのコードをモダンにするための「3つの問い」を用意しました。

1. `SelectByID2` を連発していないか?

  • → `Feature.GetSpecificFeature2` や `Component2.GetModelDoc2` を使って、オブジェクトを直接操作できないか検討してください。

2. エラーハンドリングはあるか?

  • → `On Error GoTo` を入れ、予期せぬ失敗時に「画面更新を有効にしてから終了する」構造になっているか確認してください。

3. 変数の型を `Object` で逃げていないか?

  • → `Dim swFeat As SldWorks.Feature` のように、可能な限り明示的な型を指定してください。これにより、入力補完(IntelliSense)が効き、開発効率が劇的に上がります。

最後に:自動化は「設計」である

コードを書くことは、単なる作業ではありません。「SolidWorksという巨大なシステムの挙動を、どうスマートに操るか」という設計行為です。

古いコードを捨てることは、勇気がいることです。しかし、一度リファクタリングしてしまえば、それはあなたの最強の武器になります。今日紹介した「画面更新の制御」と「型指定の徹底」を意識するだけで、あなたのマクロは別次元の速さと安定性を手に入れるはずです。

もし行き詰まったら、いつでも戻ってきてください。この場所には、常にあなたの成長を支える知見があります。さあ、次はどんな素晴らしいツールを作りましょうか?

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