SolidWorks自動化の真髄:SaveAsによるマルチフォーマット一括出力の極意
SolidWorksの自動化において、最もコストが高く、かつ軽視されがちなのが「エクスポート処理」だ。エンジニアは往々にしてGUIの操作を記録し、それをそのままコードに落とし込む。だが、それは「動くコード」であって「堅牢なシステム」ではない。
真の自動化エンジニアは、SolidWorksのプロセスが裏側で何を消費し、どのタイミングでメモリが解放されるかを正確に制御する。今回は、`ModelDoc2.Extension.SaveAs`を核とした、エラーフリーなマルチフォーマット一括出力のアーキテクチャを伝授する。
—
1. 速度と安定性を担保する「サイレント保存」の鉄則
`SaveAs`メソッドを使用する際、多くの初心者はオプション引数を曖昧に定義する。しかし、大規模なアセンブリや複雑なパーツを扱う場合、この引数の設定こそが「クラッシュしないシステム」の生命線となる。
特に重要なのは `swSaveAsOptions_Silent` だ。これを用いることで、変換中に発生するダイアログを抑制し、処理のブロッキングを防ぐ。
実装のコア・ロジック
‘ 必要な定数の定義(APIリファレンスから抜粋)
Private Const swSaveAsOptions_Silent As Long = &H1
Private Const swSaveAsOptions_Copy As Long = &H8
Public Sub ExportDocument(ByVal swDoc As SldWorks.ModelDoc2, ByVal savePath As String)
Dim swExtension As SldWorks.ModelDocExtension
Set swExtension = swDoc.Extension
Dim errors As Long
Dim warnings As Long
‘ 重要:extension経由での保存は、ファイル拡張子に基づいたコンテキストを自動判定する
‘ ただし、必ずフルパスで指定すること
Dim status As Boolean
status = swExtension.SaveAs(savePath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, errors, warnings)
If Not status Then
‘ ここで独自のログクラスへエラーを吐き出す。MsgBoxは厳禁。
Debug.Print “Export Failed: ” & savePath & ” (Error Code: ” & errors & “)”
End If
End Sub
—
2. メモリ管理:オブジェクトのライフサイクルを支配せよ
VBA環境下において、最も避けるべきは「ゾンビ化したプロセス」だ。`SldWorks`アプリケーションや`ModelDoc2`オブジェクトを使い回す際、適切に参照を解除しなければ、バックグラウンドでSolidWorksのインスタンスが残存し、メモリリークを誘発する。
- 明示的な解放: `Set obj = Nothing` を徹底せよ。
- スコープの最小化: 関数内で生成されたオブジェクトは、その関数内で破棄する。
- イベント監視の停止: `WithEvents`を使用している場合、終了処理で必ず接続を解除すること。
—
3. 実践:マルチフォーマット一括出力バッチのアーキテクチャ
以下のコードは、単一パーツからSTEP、PDF、DWGを自動生成し、命名規則に基づいて整理する実戦的な構造だ。
Public Sub BatchExportEngine(ByVal targetFilePath As String, ByVal outputFolder As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.OpenDoc6(targetFilePath, swDocPART, swOpenDocOptions_Silent, “”, 0, 0)
If swModel Is Nothing Then Exit Sub
‘ 拡張子別に出力パスを生成
Dim baseName As String
baseName = outputFolder & “\” & Left(swModel.GetTitle, InStrRev(swModel.GetTitle, “.”) – 1)
‘ 1. STEP出力 (中立フォーマットの鉄板)
ExportDocument swModel, baseName & “.step”
‘ 2. PDF出力 (図面があればPDF化、パーツなら画像的なエクスポート)
ExportDocument swModel, baseName & “.pdf”
‘ 3. DWG出力
ExportDocument swModel, baseName & “.dwg”
‘ 終了処理: 確実にメモリを解放
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
4. シニアエンジニアへのアドバイス:レガシーとの共存
このスクリプトを運用する際、社内のファイルサーバー環境やネットワークドライブの遅延がボトルネックになることが多々ある。
- ローカルへのキャッシュ: ネットワーク上のファイルを直接操作するのではなく、一度ローカルのテンポラリフォルダにコピーしてから処理を行え。I/O待機時間を劇的に短縮できる。
- Windows APIの活用: `GetTempPath` や `PathFileExists` などのカーネル関数を併用し、VBAの貧弱なファイルシステム操作を補強せよ。
- エラーハンドリング: `On Error Resume Next` で誤魔化すのは素人仕事だ。`Err.Number` を捕捉し、独自のログファイルにスタックトレースを記録する仕組みを構築せよ。
結びに代えて
自動化とは、単に手作業を置き換えることではない。「予測不可能な状況下でも、常に一定の結果を叩き出すシステム」を作ることだ。SolidWorks APIは強力だが、その分、設計者の意図を厳密にコードへ反映させる必要がある。
この知見が、貴殿のオートメーション環境を次のステージへ引き上げる一助となれば幸いだ。次は、APIをラップしたクラスライブラリの設計論について語ろう。質問があれば、いつでも歓迎する。
