【実務・中級編】【マクロパフォーマンスの極限追求】DrawingView.KeepLinkedToModelの制御と画面再描画の抑制テクニック – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの深淵:数千点規模を操る「高速化」の極意とメモリの静寂

SolidWorksの自動化において、多くのエンジニアが直面する壁。それは「モデルが複雑化した瞬間にマクロが止まったかのように重くなる」という現象だ。

なぜあなたのマクロは数分もかかるのか? なぜメモリリークでSolidWorksがクラッシュするのか?
答えは簡単だ。「SolidWorksの再計算と描画のサイクルを、プログラマであるあなたが制御できていないから」に他ならない。

今日は、数千点規模の図面を瞬時に捌くための、APIの「呼吸」を制御するテクニックを伝授する。

1. 描画を制する者は時間を制す:再描画抑制の真実

多くの初心者が `swApp.AutoRedraw = False` を書くだけで満足している。だが、真のプロは「スコープ」と「例外処理」をセットで考える。

`AutoRedraw` をオフにした状態でエラーが発生し、マクロが強制終了するとどうなるか? SolidWorksは「描画しない状態」で凍りつき、ユーザーは操作不能に陥る。

堅牢なスコープ管理の実装

再描画の抑制は、必ず `Finally` ブロックに近い構造で管理し、いかなる場合でも状態が復帰するように設計せよ。

‘ 描画抑制の安全な管理
Sub ProcessLargeDrawing()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

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

‘ 描画の凍結(パフォーマンス向上の生命線)
swApp.AutoRedraw = False
swModel.FeatureManager.EnableFeatureTree = False ‘ フィーチャツリーの更新も止める

On Error GoTo Cleanup

‘ — ここに重い処理を記述 —
PerformHeavyOptimization swModel

Cleanup:
‘ どんなエラーが起きても必ず復帰させる
swApp.AutoRedraw = True
swModel.FeatureManager.EnableFeatureTree = True
If Err.Number <> 0 Then MsgBox “エラー発生: ” & Err.Description
End Sub

2. DrawingView.KeepLinkedToModel の深淵

大規模図面で最も避けるべきは、ビューの再構築だ。`KeepLinkedToModel` プロパティは、モデルとのリンクを維持するかどうかを決定するが、これを安易に触ると、図面を開くたびに全ビューの再計算(解像度の再構築)が走り、数分単位のロスを生む。

鉄則:必要な時以外、リンク状態を変更するな。

もし属性情報の更新だけであれば、リンクを維持したまま、以下の「最小限の更新」を心がけよ。

効率的なビューアクセス術

‘ ビューの更新を最小限に抑えるためのチェック
If Not swView.KeepLinkedToModel Then
‘ 必要に応じてリンクを繋ぎ、処理後に戻すのがプロの流儀
swView.KeepLinkedToModel = True
‘ 処理実行
swView.KeepLinkedToModel = False
End If

3. メモリの静寂:ゴミを残さないプロの作法

VBAはガベージコレクションが優秀ではない。特にCOMオブジェクトを大量に生成するループ処理では、メモリリークが致命的となる。

  • `Set obj = Nothing` の徹底: ループ内のオブジェクト参照を解放せよ。
  • Variant型の排除: 型指定のない変数は、実行時のオーバーヘッドを生む。
  • APIのキャッシュ: 同じメソッドを何度も呼ぶな。`swModel.Extension` などを変数にキャッシュするだけで、数ミリ秒の短縮が積もり積もって数分に変わる。

ループ処理の最適化例

Dim swView As SldWorks.View
Dim swSheet As SldWorks.Sheet
‘ … 処理 …

‘ ループ内でオブジェクトを生成する場合の作法
Do While Not swView Is Nothing
‘ 処理

Set swView = swView.GetNextView ‘ 次へ
‘ ここで明示的にNothingにしてメモリを解放する意識を持つ
Loop

4. 現場のアーキテクトからの助言

最後に、データベースや外部ファイル(Excel/JSON等)と連携する際の注意点を一つ。

「SolidWorksを開いたまま外部ファイルを頻繁に開閉するな。」

ファイルIOはAPIの計算よりも重い。データを一度配列やコレクションにすべてロード(Read)し、SolidWorks側で一気に書き込み(Write)を行う。「外部アクセスは一往復に集約する」。これが大規模システムを構築する際の黄金律だ。

最後に

あなたの書くコードは、単なる命令の羅列ではない。SolidWorksという巨大なエンジンの「リソース配分」を司る指揮官だ。再描画を止め、不要な計算を省き、メモリの海をクリーンに保て。

その先にあるのは、数千点規模のモデルを一瞬で処理し、定時退社を勝ち取るあなたの姿だ。コードの最適化を妥協するな。それがエンジニアとしての矜持である。

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