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という巨大なシステムの挙動を、どうスマートに操るか」という設計行為です。
古いコードを捨てることは、勇気がいることです。しかし、一度リファクタリングしてしまえば、それはあなたの最強の武器になります。今日紹介した「画面更新の制御」と「型指定の徹底」を意識するだけで、あなたのマクロは別次元の速さと安定性を手に入れるはずです。
もし行き詰まったら、いつでも戻ってきてください。この場所には、常にあなたの成長を支える知見があります。さあ、次はどんな素晴らしいツールを作りましょうか?
