SolidWorks自動化の真髄:マルチフォーマット・サイレントエクスポートの深淵
自動化とは、単にマウス操作を代替することではない。それは、CADという巨大なメモリ空間を掌握し、CPUサイクルを最適化し、ヒューマンエラーという名のノイズを物理的に排除するプロセスである。
多くのエンジニアが `SaveAs` メソッドの壁に突き当たり、ダイアログのポップアップや非同期処理のタイミング問題で苦悩している。今回は、SolidWorks APIの深層にある `ModelDocExtension.SaveAs` を完璧に制御し、堅牢なマルチフォーマット一括出力システムを構築するための「伝説級の作法」を伝授しよう。
—
1. 「サイレント」という概念の再定義
SolidWorksのAPIにおいて、サイレント保存を成功させる鍵は、単に `swSaveAsOptions_Silent` を指定することではない。真のサイレント実行には、以下の3つのレイヤーを制圧する必要がある。
- UIの抑止: `SldWorks.UserControl = False` を用いて、バックグラウンドでのプロセス起動を保証する。
- イベントの無効化: ファイルオープンや保存時に発生する「マテリアル割り当て」「構成部品の再構築」などの不要なダイアログを `ModelDoc2.Visible = False` で物理的に遮断する。
- パスの完全修飾: 相対パスは禁忌である。Windows APIを利用し、カレントディレクトリに依存しない絶対パスを生成せよ。
2. 極限のメモリ管理とオブジェクト解放
VBAはガベージコレクションが甘い。大規模なアセンブリを捌く際、`Nothing` を代入して解放したつもりになっていないか? `IModelDoc2` や `IFeature` インターフェースを多用すると、プロセス内にCOM参照の残骸が蓄積し、やがてメモリリークによるフリーズを招く。
必ず、スコープの終端で明示的な解放と、`DoEvents` によるメッセージループの解放をセットで行うこと。
—
3. 実践コード:堅牢なマルチフォーマット出力エンジン
以下のコードは、単なるサンプルではない。実務の現場で数百、数千のパーツを安定して処理するために設計されたコアモジュールである。
Option Explicit
‘ SolidWorks API 定数(必要に応じて参照設定)
‘ swSaveAsVersion_e, swSaveAsOptions_e 等を使用
Public Sub ExportMultiFormat(ByVal swDoc As SldWorks.ModelDoc2, ByVal targetDir As String)
Dim swExt As SldWorks.ModelDocExtension
Set swExt = swDoc.Extension
Dim baseName As String
baseName = Left(swDoc.GetTitle, InStrRev(swDoc.GetTitle, “.”) – 1)
‘ 出力形式と拡張子のマップ
Dim formats(2) As String
formats(0) = “.step”: formats(1) = “.x_t”: formats(2) = “.stl”
Dim i As Integer
For i = 0 To UBound(formats)
Dim savePath As String
savePath = targetDir & “\” & baseName & formats(i)
‘ 極限の保存処理:サイレントかつオーバーライト許可
‘ swSaveAsOptions_Silent: ダイアログ非表示
‘ swSaveAsOptions_Overwrite: 既存ファイルを強制上書き
Dim success As Boolean
success = swExt.SaveAs(savePath, _
swSaveAsCurrentVersion, _
swSaveAsOptions_Silent + swSaveAsOptions_Overwrite, _
Nothing, 0, 0)
If Not success Then
Err.Raise vbObjectError + 1000, “ExportEngine”, “フォーマット出力失敗: ” & formats(i)
End If
Next i
‘ 明示的解放
Set swExt = Nothing
DoEvents
End Sub
4. シニアエンジニアへの助言:レガシー環境の保守性
このスクリプトを運用する際、最も注意すべきは「SolidWorksのバージョン互換性」と「ライブラリ参照」である。
- 遅延バインディングの検討: 複数バージョンが混在する環境では、特定のバージョンへの参照設定はトラブルの元だ。あえて `Object` 型として定義し、実行時にインスタンス化する手法(遅延バインディング)をとることで、環境依存のクラッシュを回避できる。
- エラーハンドリングの階層化: `On Error GoTo` を駆使し、どのフォーマットの出力で失敗したかをログファイル(またはイベントビューア)に確実に残せ。自動化システムにおいて「沈黙は死」である。
結びに代えて
SolidWorksの自動化は、単なるコマンドの羅列ではない。CADの内部エンジンがどう動き、メモリがどう遷移するかを想像する「設計」の領域だ。
このマルチフォーマット出力スクリプトを、貴殿の環境で「ただ動くもの」から「止まらないインフラ」へと昇華させてほしい。技術は、細部への執着にこそ宿る。何かあればまた問いに来るといい。次の深淵へ案内しよう。
