【実務・中級編】【パフォーマンス改善】ModelDoc2.ViewZoomtoFit2やEnableGraphicsUpdateによる画面ちらつき抑制と秒速化テクニック – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの真髄:地獄の再描画を封印し、フィーチャ生成を「秒速」へ昇華させる技術

SolidWorksのマクロを組んでいて、こんな経験はないだろうか。
「100個の穴を開けるだけのマクロなのに、実行中に画面がチカチカと点滅し、完了までカップ麺が伸びるほど時間がかかる」

もしあなたがそう感じているなら、それはSolidWorks APIを「操作」しているのではなく、「振り回されている」証拠だ。

世界最高峰の自動化を志すなら、まずは「グラフィックス更新の制御」と「ビュー管理の哲学」を叩き込まねばならない。本記事では、プロフェッショナルな現場で採用される、実行速度を劇的に改善するコーディングの極意を伝授する。

1. なぜ「画面の更新」がパフォーマンスを殺すのか

SolidWorks APIが重い最大の要因は、実はAPIの処理速度そのものではない。「フィーチャを一つ生成するたびに、裏側で走る画面の再描画(リペイント)とズーム計算」である。

デフォルトの設定では、APIがフィーチャを追加するたびにSolidWorksは「ユーザーに見せるための描画」を試みる。これに費やされるCPUリソースは膨大だ。自動化の目的は「ユーザーが納得する過程を見せること」ではなく「一瞬で結果を出すこと」にある。

これを解決するための鍵が `ModelDocExtension.EnableGraphicsUpdate` と `ModelDoc2.ViewZoomtofit2` の正しい制御だ。

2. 禁断のパフォーマンス最適化:プロダクションコード

以下に、実務レベルで必ず実装すべき「処理の封印・解凍」のテンプレートを提示する。これをフレームワークとして活用してほしい。

Option Explicit

‘ SolidWorks APIを利用した高速化テンプレート
Public Sub ExecuteHighSpeedFeatureGeneration()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
Set swExt = swModel.Extension

‘ 1. 【最重要】画面更新を凍結する
‘ これにより、フィーチャ生成中の無駄なリペイントを完全に遮断する
swExt.EnableGraphicsUpdate = False

‘ 2. 処理開始前の状態を保存(必要であれば)
‘ 3. メイン処理(フィーチャ生成など)
Call GenerateComplexFeatures(swModel)

‘ 4. 処理完了後の後処理
‘ 再描画を許可する前に、一度全体を表示させるのが「堅牢な設計」
swModel.ViewZoomtofit2

‘ 5. 【最重要】グラフィックス更新を再開する
swExt.EnableGraphicsUpdate = True

‘ 6. 明示的に画面を更新し、最終結果を反映させる
swModel.GraphicsRedraw2
End Sub

Private Sub GenerateComplexFeatures(swModel As SldWorks.ModelDoc2)
‘ ここに重いフィーチャ生成処理を記述
‘ 例: ループ処理での押し出し、カットなど
End Sub

このコードの「設計思想」

  • EnableGraphicsUpdateのトグル: 処理の開始と終了で確実にフラグを切り替える必要がある。もし処理中にエラーが発生して中断されると、画面がフリーズしたままになるリスクがある。実務では必ず `On Error GoTo` でエラーハンドラを作成し、エラー時にも `EnableGraphicsUpdate = True` が実行されるように設計すること
  • ViewZoomtofit2のタイミング: これをループ内で呼ぶのは「自殺行為」だ。必ずすべてのフィーチャ生成が終わった「後」に一度だけ実行する。

3. 現場で生き残るための「鉄則」

データベース連携の罠

CSVやデータベースから寸法データを読み込み、フィーチャを生成する場合、「読み込み」と「生成」を完全に分離せよ
APIを叩きながらデータベースにクエリを投げるのは、通信遅延とAPI負荷の二重苦になる。配列(Array)やコレクションに全てのデータを格納してから、一気にフィーチャ生成のループを回す。これが鉄則だ。

ジオメトリ再構築(Rebuild)の抑制

`swModel.ForceRebuild3` をループ内で叩いていないか?
複雑なアセンブリであれば、フィーチャの追加ごとに再構築するのは非効率極まりない。可能な限りフィーチャをまとめてから、最後に一度だけリビルドを実行する設計を目指すべきだ。

4. 総括:エンジニアの誇りとして

「動けばいい」コードは素人でも書ける。しかし、数千のフィーチャを生成する際に、画面を一切揺らさず、バックグラウンドで静かに、かつ弾丸のような速度で完遂させるコードこそが、プロの技術だ。

今回紹介した `EnableGraphicsUpdate` の制御は、単なる小手先のテクニックではない。「システムのリソースをいかに効率的に支配するか」というアーキテクトの思想そのものである。

次にマクロを書くときは、画面を「見せない」勇気を持ってほしい。その先にあるのは、かつてないほどの快適な自動化の世界だ。


追伸:もしこのコードを適用してもなお重い場合は、フィーチャの作成順序や、不要な干渉チェックの有効化を見直せ。APIの仕様だけでなく、SolidWorksの「計算の論理」を理解することが、真の解決への近道となる。

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