SolidWorks VBAの「秒速」を手に入れろ:描画抑制による劇的なパフォーマンス改善術
SolidWorks APIを扱うエンジニアの多くが、ある日壁にぶつかる。「マクロを走らせると、画面がチカチカと点滅し、数千個のフィーチャ生成に数分を要する」という現象だ。
もし君のコードが、フィーチャを追加するたびにモデルの再構築(Rebuild)と描画更新を繰り返しているなら、それは「重い」のではなく「無駄が多い」だけだ。
今回は、数百〜数千のフィーチャを秒速で処理し、かつ堅牢な設計を維持するための「描画抑制(Freeze)」の極意を伝授する。
—
なぜ、デフォルトのコードは遅いのか
SolidWorksのGUIは、一つフィーチャが増えるたびに、その結果を「人間が見やすいように」描画し直そうとする。APIはこのGUIスレッドと密接に結びついているため、何もしなければマクロは「人間が目で追える速度」に制限されてしまう。
これを回避するための鉄則は以下の3つだ。
1. 画面更新の停止(`Interactive`をFalseに)
2. モデル再構築の抑制(`FeatureManager.EnableFeatureTree`の制御)
3. エラーハンドリングによる確実な復帰(最重要)
—
実践:プロダクションコードのテンプレート
以下のコードは、単に速いだけではない。「途中でエラーが起きても確実に描画を元に戻す」という、現場で最も重要な「堅牢性」を備えた設計だ。
‘ ——————————————————————
‘ SolidWorks 高速化処理のベストプラクティス・テンプレート
‘ ——————————————————————
Public Sub RunHighSpeedAutomation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim bRet As Boolean
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 【重要】エラー発生時に確実に画面更新を再開させるためのトラップ
On Error GoTo Cleanup
‘ 1. 画面更新とユーザー入力を抑制(劇的に高速化する)
swApp.UserControl = False
swApp.Visible = True ‘ アプリそのものは落とさない
swModel.FeatureManager.EnableFeatureTree = False ‘ フィーチャツリー更新抑制
swModel.EditRebuild3 ‘ 大量処理前に一度だけ再構築
‘ — ここに重い処理を記述 —
Call PerformHeavyGeometryLogic(swModel)
‘ —————————
Cleanup:
‘ 2. 処理完了・エラー発生に関わらず描画を復帰させる
swModel.FeatureManager.EnableFeatureTree = True
swApp.UserControl = True
If Err.Number <> 0 Then
MsgBox “エラー発生: ” & Err.Description, vbCritical
Else
‘ 3. 最後に一括で再構築し、整合性を保つ
swModel.ForceRebuild3 False
End If
End Sub
Private Sub PerformHeavyGeometryLogic(ByRef swModel As SldWorks.ModelDoc2)
‘ ここでフィーチャ生成を繰り返す。
‘ 描画抑制されているため、驚くほど高速に完了するはずだ。
End Sub
—
アーキテクトの視点:設計上の注意点
1. `ForceRebuild3` のタイミング
ループの中で`ForceRebuild`を呼ぶのは自殺行為だ。描画抑制をしている意味がなくなる。大量のフィーチャを追加した後に、最後に一度だけ`ForceRebuild3`を呼び出し、モデルの整合性を一気に解決させるのが鉄則である。
2. ファイル連携・DB連携時の罠
外部DBから値を取得してジオメトリを生成する場合、「DBアクセス」と「SW操作」を完全に分離せよ。
DBからデータをすべて配列(Array)に格納し、その後にSolidWorksを操作する。ファイルI/Oの遅延がSW操作のボトルネックを誘発し、予期せぬタイムアウトを引き起こす可能性があるからだ。
3. `swApp.UserControl` の取り扱い
`swApp.UserControl = False` を指定すると、マクロ実行中にユーザーがSolidWorksを操作できなくなる。これは安全な一方で、強制終了するとSolidWorksがバックグラウンドに残り続けるリスクがある。必ず `On Error GoTo` で終了処理を保証すること。
—
最後に:エンジニアとしての心得
「マクロが遅い」と嘆く時間は生産的ではない。それはSolidWorksのAPIが未熟なのではなく、我々の設計が「対話的」すぎただけだ。
描画を抑制し、裏側で計算を完結させ、最後に一括でレンダリングする。この考え方は、SolidWorksだけでなく、あらゆるGUIベースの自動化において共通の哲学である。
このテンプレートを君のツールキットの基盤に据えてほしい。次に作るツールは、実行ボタンを押した瞬間に終わるはずだ。
さあ、設計に戻ろう。コードを止めるな。
