SolidWorks自動化の真髄:SaveAsによる「無言の」高精度エクスポート戦略
SolidWorksの自動化において、最も避けるべきは「UIのオーバーヘッド」と「ゾンビプロセス」だ。特にSTEPやParasolidといった変換処理は、設計現場の生産性に直結する。
多くのエンジニアが陥る「ダイアログが勝手に立ち上がり、メモリを食いつぶしたまま止まる」という悪夢。これを回避し、堅牢なデータ変換パイプラインを構築するための「極限の知見」を共有する。
—
1. なぜ「ModelDocExtension.SaveAs」なのか?
`ModelDoc2.SaveAs` はレガシーだ。現代のSolidWorks APIにおいて、エクスポートの制御は `ModelDocExtension.SaveAs` 一択である。
このメソッドの肝は、`swSaveAsOptions_Silent` を指定することにある。だが、単にフラグを立てるだけでは不十分だ。エクスポート精度(特に曲率データ)や、構成部品の依存関係を制御するためには、`UserPreference` や `ExportData` の設定を個別に構築しなければならない。
2. 鋼鉄のVBA実装:セーフ・エクスポート・アーキテクチャ
以下のコードは、メモリリークを許さず、エラーハンドリングを徹底した実務スペックのテンプレートだ。
Option Explicit
‘ 伝説のアーキテクトによるエクスポート・モジュール
Public Sub ExportToNeutralFormat(ByVal swDoc As SldWorks.ModelDoc2, ByVal savePath As String)
Dim swExt As SldWorks.ModelDocExtension
Set swExt = swDoc.Extension
‘ 変換オプションの制御定数
‘ swSaveAsOptions_Silent: ダイアログ抑制
‘ swSaveAsOptions_Copy: 参照を維持
Dim saveOptions As Long: saveOptions = swSaveAsOptions_Silent Or swSaveAsOptions_Copy
‘ エクスポートデータの取得
Dim swExportData As SldWorks.ExportPdfData ‘ ※形式に応じ適宜キャスト
‘ 注意: STEP/Parasolidの場合、これらはModelDocExtension経由の引数で直接制御する
Dim errors As Long, warnings As Long
Dim success As Boolean
‘ 厳密なファイル形式の選択
‘ STEP AP214: 30 / AP242: 32 / Parasolid: 10
success = swExt.SaveAs(savePath, swSaveAsCurrentVersion, saveOptions, Nothing, errors, warnings)
If Not success Then
Call HandleExportError(errors)
End If
‘ オブジェクトの明示的解放(VBAのGCに頼らない)
Set swExt = Nothing
End Sub
Private Sub HandleExportError(ByVal errCode As Long)
‘ 致命的なエラーログを記録し、システム管理者へ通知する
Select Case errCode
Case swFileSaveError_ReadOnly: Debug.Print “Error: Read-only access.”
Case swFileSaveError_FileNameEmpty: Debug.Print “Error: Invalid path.”
Case Else: Debug.Print “Error Code: ” & errCode
End Select
End Sub
3. シニアエンジニアが意識すべき「メモリとプロセスの規律」
SolidWorksのAPIはCOMベースである。VBAのガベージコレクションは「遅延的」であり、大規模アセンブリを連続処理すると、あっという間にシステムリソースが枯渇する。
オブジェクトライフサイクルの管理
- 明示的Nothingの代入: ループ内で生成した `SldWorks.ModelDoc2` や `Component2` は、必ず `Set obj = Nothing` で解放すること。これを行わないと、SolidWorksのバックグラウンドプロセスが肥大化し、メモリリークの温床となる。
- ゾンビプロセスの監視: Windows APIの `PostMessage` を使用して、長時間応答のないSolidWorksプロセスを強制終了させるウォッチドッグ・タイマーを別途実装するのが、高可用性システムの常識だ。
STEP/Parasolidのバージョン制御
`swSaveAsCurrentVersion` は便利だが、サプライチェーンの要件が「AP203のみ」「Parasolid v28固定」といったレガシー環境を要求する場合、`ISldWorks::SetUserPreferenceIntegerValue` を用いて、システム設定を一時的に書き換えるテクニックが必要となる。
- 重要: 設定を書き換えた後は、必ず元の値に復元すること(`Try…Finally` 構文のないVBAでは、エラーハンドラ内に復元処理を記述するのが鉄則だ)。
4. 最後に:自動化の先にあるもの
「一括変換」は単なる作業効率化に過ぎない。真の自動化エンジニアが目指すべきは、変換エラーをトリガーとした「設計品質の自動フィードバックループ」だ。
エクスポートしたParasolidが特定のモデルで異常に肥大化した場合、それを検知して設計者にアラートを飛ばす。そんな「インテリジェントなデータ管理」の入り口が、このコードには詰まっている。
コードをコピペして満足するな。その先のシステムアーキテクチャを設計せよ。それが、このコードを扱う者に課せられた責務である。
