SolidWorks APIの深淵:数千点規模の図面を「秒速」で捌くためのアーキテクチャ
SolidWorks APIを操るエンジニアの多くが、ある地点で壁に突き当たる。「コードは正しいはずなのに、図面を開くと数分間フリーズする」「マクロが途中で沈黙する」。それはAPIの使い方が悪いのではない。SolidWorksのオブジェクトモデルが持つ「重力」を制御できていないだけだ。
数千パーツを抱えるアセンブリ図面を扱う際、デフォルトの挙動に身を任せることは自殺行為に等しい。本稿では、レガシー環境の限界を突破し、マクロの実行速度を物理限界まで引き上げるための「禁忌の最適化」を伝授する。
—
1. 再描画という「見えないコスト」の排除
SolidWorksのGUI更新は、API実行において最も高価な処理だ。`swApp.Visible = False`にするだけで満足してはならない。
`ModelDoc2.Visible` と `DrawingView.KeepLinkedToModel` の制御
図面更新時に地獄を見る最大の原因は、ビューの再計算(モデルリンクの同期)がループ内で発生することだ。`KeepLinkedToModel`を安易に切り替えるのではなく、処理のスコープ内で明示的に制御せよ。
‘ パフォーマンス最適化のための定型テンプレート
Public Sub FastDrawingProcessing(swModel As SldWorks.ModelDoc2)
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
‘ 1. UI更新の完全停止(これに勝る魔法はない)
swApp.Frame.EnableEvents = False
swApp.UserControl = False
swModel.EnableUpdates2 = False ‘ モデルの再構築抑制
‘ 2. メモリと描画のバッファ開放
‘ 処理中にビューのリンクを一時的に切断し、最後に一括同期する設計が重要
On Error GoTo Cleanup
‘ — ここに重い処理を記述 —
Cleanup:
‘ 3. 終了時は必ず状態を戻す(失敗した際にUIが固まるのを防ぐ)
swModel.EnableUpdates2 = True
swApp.Frame.EnableEvents = True
swApp.UserControl = True
swModel.ForceRebuild3 False ‘ 最後に一度だけ再構築
End Sub
2. オブジェクトのライフサイクル管理:メモリリークの防波堤
VBAのガーベジコレクション(GC)は信用してはならない。特に`ModelDoc2`や`View`オブジェクトをループ内で何度も生成・破棄する場合、メモリは確実に断片化する。
- 明示的Nothingの強制: `Set swView = Nothing` はおまじないではない。COMオブジェクトの参照カウントを確実にデクリメントし、OSへのメモリ返還を促すための「儀式」だ。
- コレクションの回避: `ModelDoc2.GetViews` などで取得した配列をそのまま放置せず、ループ終了後即座にクリアせよ。
3. Windows APIを駆使した「強制沈黙」
標準のAPIで制御できない「OSレベルの描画割り込み」を抑え込むには、Windows APIの力が必要だ。`LockWindowUpdate` を併用することで、SolidWorksのウィンドウ描画を物理的にロックできる。
‘ 標準APIで解決できない描画フリーズへの対抗策
Private Declare PtrSafe Function LockWindowUpdate Lib “user32” (ByVal hwndLock As LongPtr) As LongPtr
Public Sub ExtremePerformanceMode(swModel As SldWorks.ModelDoc2)
Dim swFrameHwnd As LongPtr
swFrameHwnd = Application.SldWorks.FrameWindowHandle
‘ UI描画をロック
LockWindowUpdate swFrameHwnd
‘ ここでAPI処理を実行
‘ ロック解除(忘れればSolidWorksは永遠に描画されない)
LockWindowUpdate 0
End Sub
4. シニアエンジニアへの提言:なぜ「遅い」のか
多くのエンジニアが犯す過ちは、「APIを通じたオブジェクトのプロパティ参照(Get系)」の多用だ。
- `swView.Name` をループ内で1000回呼べば、1000回のCOM通信が発生する。
- 配列に一度格納し、メモリ上で処理せよ。
- 「DB化」の思考: 必要な情報は事前に一度のAPIアクセスで取得し、VBA側の変数(Dictionaryや配列)にキャッシュする。これが数千パーツを扱うシステムの唯一の生存戦略だ。
最後に
SolidWorks APIは、単なる自動化ツールではない。巨大なCADエンジンを、あなたのコードという「外部脳」で制御するプログラミングだ。
`EnableUpdates2` を切り、`LockWindowUpdate` で画面を黙らせ、オブジェクトの参照を血眼になって管理する。この泥臭い最適化の積み重ねが、数秒の処理時間を数十分のフリーズから救い出す。
次にマクロを記述する時、あなたは「動くコード」を書くのではなく、「SolidWorksという巨大な獣を、いかに静かに大人しくさせるか」を考えてほしい。それこそが、伝説のエンジニアへの第一歩だ。
