【テクニカル・上級編】【エクスポート自動化】ModelDoc2.Extension.SaveAsサイレント保存を用いた、STEP・PDF・DWGのマルチフォーマット一括出力バッチ – SolidWorks VBA解析バイブル

スポンサーリンク

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をラップしたクラスライブラリの設計論について語ろう。質問があれば、いつでも歓迎する。

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