SolidWorks APIの深淵:マルチドキュメント一括印刷を「真の自動化」へ昇華させる技術
エンジニア諸君。SolidWorksの自動化において、最も多くの人間が陥る罠。それが「ファイルを開いて印刷する」という単純な処理のループだ。
「`OpenDoc6`で開いて`PrintOut2`を呼ぶ」。確かにこれで動く。だが、それは単なるスクリプトであり、エンジニアリングではない。図面が100枚を超えた瞬間、SolidWorksはメモリリークを起こし、プリンタスプーラはパンクし、PCはフリーズする。
今回は、「真に止まらない」バックグラウンド印刷キュー制御の設計思想と、その実装コードを伝授する。
—
1. なぜ「画面表示」が最大のボトルネックなのか
SolidWorksのGUI(`DocumentVisible`)を有効にしたまま大量のドキュメントを開閉すると、描画エンジンとリソース管理のオーバーヘッドが指数関数的に増大する。
堅牢な自動化のためには、以下の3つの鉄則を守れ。
1. 非表示処理の徹底: `swApp.DocumentVisible`を制御し、描画負荷を最小化する。
2. メモリ解放の明示: `swApp.CloseDoc`の後、GC(ガベージコレクション)を待つのではなく、強制的なリソース解放のサイクルを意識する。
3. スプーラ負荷の平滑化: `PrintOut2`を機械的に連打するな。プリンタの処理速度と同期する待機ロジックを挟むのがプロの仕事だ。
—
2. 堅牢な一括印刷のためのプロダクションコード
このコードは、ファイルリストを読み込み、バックグラウンドで静かに、かつ確実に印刷を完了させるためのコアロジックだ。
‘ —————————————————————–
‘ SolidWorks Batch Printer – High-Reliability Edition
‘ —————————————————————–
Option Explicit
Public Sub BatchPrintDrawings(filePaths As Collection)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim errors As Long, warnings As Long
Dim filePath As Variant
Set swApp = Application.SldWorks
‘ 1. 描画を抑制してパフォーマンスを最大化
swApp.DocumentVisible = False
For Each filePath In filePaths
‘ 2. メモリ保護のため、読み取り専用で高速に開く
Set swModel = swApp.OpenDoc6(filePath, swDocDRAWING, swOpenDocOptions_Silent, “”, errors, warnings)
If Not swModel Is Nothing Then
Debug.Print “Printing: ” & filePath
‘ 3. 印刷実行(詳細設定は環境に合わせて調整)
‘ PrintOut2(From, To, Copies, Collate, PrinterName, PrintToFile, PageSetup)
swModel.PrintOut2 “”, “”, 1, True, “”, False, “”
‘ 4. 確実にドキュメントを閉じる
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
‘ 5. プリンタスプーラのオーバーフローを防ぐためのクールダウン
DoEvents
Sleep 2000 ‘ API Sleep(2000)を宣言して2秒待機を推奨
End If
Next filePath
‘ 6. 最後に必ず表示を戻すこと
swApp.DocumentVisible = True
End Sub
—
3. 現場で生き残るための「設計上の注意点」
データベース連携の罠
ファイルリストをExcelやDBから取得する場合、「存在しないファイル」や「壊れた図面」が必ず混ざる。`OpenDoc6`が失敗した際のハンドリングを怠ると、ループ全体が停止する。必ず`If Not swModel Is Nothing Then`でガードせよ。
メモリの「ゴミ」を捨てる
VBAはCOMオブジェクトの管理が甘い。大規模な印刷を行う場合、20〜30ドキュメントごとに一度「SolidWorks自体を再起動する」という設計も視野に入れろ。それが「止まらないシステム」を作るための最後の防壁になる。
プリンタスプーラの同期
`PrintOut2`は非同期でスプーラに投げる。連続して100枚投げると、プリンタ側のメモリが先に尽きる。上記のコード例にある`Sleep`は「サボり」ではなく、ハードウェアへの「敬意」だ。
—
最後に:エンジニアへ告ぐ
ツールを作る目的は「楽をすること」ではない。「同じ作業を二度と人間に行わせない」ことだ。
今回紹介したバックグラウンド処理は、あくまで出発点に過ぎない。君たちが管理する図面、プリンタの性能、社内ネットワークの速度――これら全ての変数に合わせて、`Sleep`の秒数やエラーハンドリングを調整せよ。
それができれば、君はもう単なるVBAユーザーではない。SolidWorks環境を支配するアーキテクトだ。健闘を祈る。
