【SolidWorks自動化】ModelDoc2.Extension.SaveAsで実現する「ゼロ・タッチ」マルチフォーマット出力
設計の現場で、毎日何十回と繰り返される「名前を付けて保存」という単純作業。あなたはまだ、マウスをカチカチとクリックして、保存先を確認し、ダイアログと格闘しているのですか?
設計エンジニアにとっての「黄金時間」を奪うこのルーチンワークこそ、我々自動化エンジニアが真っ先に潰すべき悪の根源です。今回は、SolidWorks APIの核心である `ModelDoc2.Extension.SaveAs` を駆使し、ダイアログを一切出さず、バックグラウンドで高速かつ確実にファイルを書き出す「プロフェッショナル向け一括出力ツール」の設計思想を伝授します。
—
1. なぜ「SaveAs」の設計で躓くのか?
多くのVBA初心者が陥る罠は、`SaveAs`を単なる「保存」と考えている点です。しかし、APIの世界においてこれは「メモリ上のジオメトリを、特定の数学的定義に基づいて再変換する重いプロセス」です。
陥りがちなアンチパターン
- エラーハンドリングの欠如: ファイルパスの不整合や、書き込み禁止属性を無視して突き進むコード。
- UIの干渉: ダイアログを表示したままバッチ処理を回し、PCを長時間占有する。
- パスのハードコード: フォルダ構造の変化に弱く、保守性がゼロ。
これらを排除し、「失敗しないコード」ではなく「失敗を検知して制御できるコード」を書くことが、伝説的自動化エンジニアへの第一歩です。
—
2. 実装の要:SaveAsの引数を制する
`ModelDoc2.Extension.SaveAs` メソッドは非常に強力ですが、最も重要なのは第4〜第6引数の扱い、すなわち `SaveAsOptions` と `ExportData` です。
特に、STEPファイル出力時のコンフィギュレーションや、PDF出力時の解像度設定などを適切に渡さないと、意図しないデータが出力されます。
実務用テンプレートコード
以下のコードは、現在のパーツドキュメントから、PDFとSTEPを同一階層の「Output」フォルダへ自動生成する堅牢な構造です。
‘ プロフェッショナル仕様:マルチフォーマット出力モジュール
Public Sub ExportAsMultiFormat()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension
Dim targetDir As String
Dim fileName As String
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Exit Sub
‘ 保存先の定義:元のファイルパスから自動生成
targetDir = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, “\”)) & “Output\”
If Dir(targetDir, vbDirectory) = “” Then MkDir targetDir
fileName = Left(swModel.GetTitle, InStrRev(swModel.GetTitle, “.”) – 1)
Set swExt = swModel.Extension
‘ 1. STEP出力 (swSaveAsOptions_Silent: ダイアログ抑制)
‘ 第4引数: 0, 第5引数: 0 (デフォルト設定)
swExt.SaveAs targetDir & fileName & “.step”, 0, 0, Nothing, errors, warnings
‘ 2. PDF出力 (PDFは別途設定が必要な場合が多い)
swExt.SaveAs targetDir & fileName & “.pdf”, 0, 0, Nothing, errors, warnings
MsgBox “出力完了: ” & targetDir
End Sub
—
3. 現場で生き残るための「鉄則」
コードを動かすことと、運用に耐えることは次元が違います。以下の3点は必ず守ってください。
1. 「ActiveDoc」への過度な依存を避ける
大規模なアセンブリや複数の図面を扱う際、`ActiveDoc` は非常に不安定です。必ず `Set swModel = swApp.ActiveDoc` をした直後に `swModel` が `Nothing` でないかを確認し、`swModel.GetType` でパーツなのか図面なのかを判定するロジックを挟んでください。
2. パス・セパレータの管理
Windowsのパス操作で `\` を直接書くのはアマチュアの所業です。フォルダパスの末尾に `\` があるか判定し、なければ付与する関数を必ず用意してください。この些細なミスが、数千回に一度の確率でプログラムをクラッシュさせます。
3. 書き込み権限とロックの考慮
ネットワークドライブ上での保存は、必ず「書き込みロック」が発生します。`Err.Number` をキャッチし、ファイルが既に使用中であれば「3秒待ってリトライ」するような再帰処理を組み込むのが、現場で信頼されるエンジニアの証です。
—
4. 次のステップへ
今回のコードは、いわば「自動化の種」です。これをベースに、データベース(AccessやSQL Server)と連携し、設計変更のたびにバージョン番号を自動インクリメントして出力するシステムへと拡張してください。
自動化の本質は、プログラムを書くことではなく、「設計者がクリエイティブな思考に集中するための空白を作ること」にあります。
さあ、退屈なクリック作業は機械に任せ、あなた自身はもっと価値のある設計の本質に向き合ってください。コードに関して疑問があれば、いつでも次のステージの質問を投げかけてください。私はあなたの背中を押し続ける準備ができています。
