【SolidWorks自動化の深淵】バックグラウンド印刷キュー制御による「メモリ枯渇」との決別
SolidWorksのAPIを用いた大量図面印刷において、多くのエンジニアが直面する壁がある。「なぜ、100枚目の印刷でSolidWorksは沈黙するのか?」という問いだ。
標準的な `PrintOut2` を愚直にループさせる手法は、墓穴を掘っているに等しい。GUI描画のオーバーヘッド、COMオブジェクトのゾンビ化、そしてプリンタスプーラのメモリ飽和。これらを制御下に置かなければ、真の自動化とは呼べない。
本稿では、レガシーなVBA環境下で「見えない図面」を高速かつ安定して捌くための、アーキテクト級の戦術を伝授する。
—
1. 原理:なぜ「Visible = False」だけでは不十分なのか
`SldWorks.Visible = False` でプロセスを隠すことは第一歩に過ぎない。真の問題は、SolidWorksのドキュメントがメモリ上にロードされた際、グラフィックレンダリングエンジンがバックグラウンドで不要な負荷をかけ続ける点にある。
我々が目指すべきは、「ヘッドレスに近い状態で、ドキュメントのライフサイクルを最小化する」ことだ。
戦略の核心
- 非表示ロード: `swApp.OpenDoc6` のオプションで `swOpenDocOptions_Silent` を活用する。
- 描画抑止: `swApp.DocumentVisible = False` を徹底し、画面描画のレンダリングコストを排除する。
- 強制クリーンアップ: COMの参照カウンタを当てにせず、`Set swModel = Nothing` の後に `DoEvents` を挟み、ガベージコレクションを強制的に呼び出すタイミングを制御する。
—
2. 実装:堅牢なバックグラウンド印刷エンジン
以下のコードは、単なる印刷ではなく「メモリの断片化」を考慮した設計となっている。
‘ SolidWorks APIによるメモリ最適化印刷の実装
Public Sub RobustBatchPrint(ByVal filePath As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim openErr As Long, openWarn As Long
Set swApp = Application.SldWorks
‘ 1. 描画を強制停止(パフォーマンスの劇的向上)
swApp.DocumentVisible = False
‘ 2. 静音モードで読み込み
Set swModel = swApp.OpenDoc6(filePath, swDocDRAWING, swOpenDocOptions_Silent, “”, openErr, openWarn)
If Not swModel Is Nothing Then
‘ 3. 印刷実行(詳細なプリンタ設定は予めOS側にキューイングしておくのがベスト)
‘ ※PrintOut2の引数は環境に合わせ適宜調整せよ
swModel.PrintOut2 “”, “DefaultPrinter”, 1, False, “”
‘ 4. 即座にクローズ(重要:ここでメモリを解放する)
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
End If
‘ 5. 明示的な開放とイベントの処理
‘ 大量ループ時はこのDoEventsがCOMの残骸を整理する猶予を作る
DoEvents
swApp.DocumentVisible = True
End Sub
—
3. シニアエンジニアが押さえるべき「極限の知見」
① スプーラ溢れを防ぐ「同期制御」
`PrintOut2` は非同期的にスプーラへ投げる。短時間に大量のジョブを投入すると、スプーラがパンクする。これを防ぐには、Windows APIの `GetPrinter` を呼び出し、ジョブキューの深さを監視する「ポーリングループ」を構築することだ。
② モデルのゾンビ化を回避するライフサイクル管理
`swApp.CloseDoc` を実行しても、メモリが直ちに解放されるとは限らない。特にアドインが裏で動いている場合、参照が残る。
私の現場では、「50ファイルごとに一度、SolidWorksプロセスそのものを再起動する」という荒業を採用している。これが最も確実なメモリリーク対策となる。
③ 環境変数の活用
プリンタのプロパティをVBAで直接操作しようとするのはナンセンスだ。事前に印刷用「プリンタプロファイル(.dev)」を作成し、`PrintOut2` の引数でそれを指定する。これにより、ページサイズや給紙トレイの不一致によるエラーを極限まで減らせる。
—
結論:自動化は「エラーハンドリング」の深さで決まる
このコードを実装する上で、`On Error Resume Next` を多用してはいけない。`Err.Number` を監視し、もしロードに失敗した場合は、そのファイルパスをログに出力し、プロセスを再開できる構造にせよ。
SolidWorks VBAはレガシーと言われるが、そのAPIモデルは極めて完成度が高い。正しく扱えば、現代のどの最新ツールよりも高速に図面を捌ける。
君たちの目の前にあるのは単なる自動化ツールではない。工数という名の「コスト」を削減し、エンジニアを設計の本質へ回帰させるための武器である。健闘を祈る。
