【SolidWorks API】レガシーコードの墓場を越えて:2015以前のObsoleteメソッドを最新環境で蘇らせる「極限リファクタリング術」
SolidWorksのAPIの世界において、「古いマクロが突然動かなくなった」という事態は、単なる技術的トラブルではない。それは、「APIのライフサイクル管理を怠ったことによる負債の顕在化」だ。
特にSolidWorks 2015以前のコードには、現在の64bitアーキテクチャや、COMオブジェクトの厳格な参照管理において「地雷」となる記述が散見される。本稿では、レガシーなマクロを現代のプロダクション品質へ引き上げるための、エンジニアリング指針を授ける。
—
1. なぜ「動くのに不安定」なのか?:レガシーコードの病理
多くの現場で放置されている古いマクロは、以下の3つの点で現代のSolidWorks環境を毒している。
- 暗黙的なオブジェクト参照: `Set swApp = Application.SldWorks` のような記述で、インスタンスの生存期間をOS任せにしている。
- 非推奨メソッドの使用: `SelectByID` 等の「セレクション依存」メソッド。これらは現在のSolidWorksのバックグラウンド処理(マルチスレッド化が進むレンダリングや再構築)と衝突し、クラッシュの主因となる。
- エラーハンドリングの欠如: `On Error Resume Next` で全てを包み込むという「逃げ」の設計。これが、メモリリークを隠蔽している。
—
2. リファクタリングの鉄則:オブジェクトの「生存期間」を支配せよ
最新のAPIへ移行する際、最も重要なのは「どのオブジェクトがどのスコープで生きているか」を明示することだ。
非推奨から推奨への置換パターン(実例)
| レガシー (Obsolete) | 推奨 (Modern) | 理由 |
| :— | :— | :— |
| `SelectByID` | `Extension.SelectByID2` | 選択フィルタを明示し、誤操作を排除 |
| `InsertFeature` | `CreateFeature`系 | フィーチャ生成の確定(Commit)を明示化 |
| `ActiveDoc` | `IModelDoc2`へのキャスト | 型安全性を確保し、予測不能なバグを防ぐ |
—
3. 実践:プロダクションコードのテンプレート
以下は、堅牢性を担保し、後々の保守を容易にする「モデル作成」のプロトタイプコードだ。この構造をベースに、全ての自動化ロジックを再構築せよ。
‘ ———————————————————
‘ SolidWorks API ロバスト・テンプレート
‘ 目的: 安定したパーツファイル作成のための基盤
‘ ———————————————————
Public Sub CreateNewPartRobustly()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
‘ 1. インスタンスの確実な取得
Set swApp = Application.SldWorks
‘ 2. エラーを握りつぶさない明示的な制御
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\…\Part.prtdot”, 0, 0, 0)
If swModel Is Nothing Then
Err.Raise vbObjectError + 1001, “AutoTool”, “パーツファイルの生成に失敗しました。”
End If
‘ 3. 処理開始のロック(パフォーマンス向上の要)
swModel.EnableGraphicsUpdate = False
On Error GoTo Cleanup
‘ ここにフィーチャ生成ロジックを記述
‘ 例: swModel.Extension.SelectByID2(…)
‘ 4. 処理終了のアンロック
Cleanup:
swModel.EnableGraphicsUpdate = True
If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description, vbCritical
End If
‘ オブジェクトの明示的解放(VBAでは推奨)
Set swModel = Nothing
End Sub
—
4. 現場で生き残るための「3つの絶対ルール」
① 「セレクション」に頼るな
古いコードの多くは「何かを選択してから操作する」というUIベースのロジックだ。しかし、APIの真髄は「IModelDocExtension::SelectByID2」でIDを指定し、その後の処理を「IModelDoc2」のメソッドでダイレクトに行うことにある。UI操作をシミュレートするのではなく、メモリ上のジオメトリを直接書き換える意識を持て。
② データ連携は「中間フォーマット」を介せ
Excelやデータベースと連携する際、`Cells(i, j)` を直接参照し続けるのはやめろ。一度 `Collection` や `Dictionary` オブジェクトにデータを読み込み、メモリ上で完結させてから SolidWorks に値を渡せ。I/Oのボトルネックは、SolidWorksの動作を最も遅くする要因だ。
③ 開発環境を現代化せよ
もし未だに「VBAエディタ」だけで戦っているなら、VS Code等の外部エディタでコードを管理し、Git等でバージョン管理することを強く推奨する。レガシーコードの保守とは、単なる「修正」ではなく、「変更履歴を透明化する作業」である。
—
最後に:エンジニアへの提言
あなたが書くコードは、あなたがいなくなった後のチームメンバーが読み、そして修正する。「動けばいい」という考えは、未来の自分に対する最大の裏切りだ。
SolidWorks 2015以前のコードを現在の環境に適合させることは、単なるバージョンの追従ではない。「APIの仕様を深く理解し、その裏側にあるオブジェクトの振る舞いを制御下に置く」という、エンジニアとしての格を上げる儀式である。
さあ、コードをリファクタリングし、真の自動化エンジニアの領域へ足を踏み入れろ。
