【SolidWorks自動化】SaveAsを極める:サイレント・マルチフォーマット出力の極意
SolidWorks API開発の現場で、最も頻繁に遭遇し、かつ最も「事故」が起きやすいのが「ファイル出力」の自動化だ。
「とりあえず `SaveAs` メソッドを呼べばいい」と思考停止してはいないだろうか? 現場で使われるマクロには、堅牢性(Robustness)と可読性(Readability)、そして非同期的なエラー処理への耐性が求められる。
今回は、実務で即戦力となる「パーツ保存と同時にSTEP/Parasolid/STLをサイレント出力する」ためのアーキテクチャを伝授する。
—
1. なぜ「単純なSaveAs」では現場で通用しないのか
多くの初心者が犯す過ちは、`swModel.SaveAs2` を単発で叩くことだ。これには以下のリスクが潜んでいる。
1. ダイアログの割り込み: 設定不備により保存時にプロンプトが表示され、自動化が停止する。
2. 拡張子の不整合: ファイルパスとフォーマット引数の不一致による予期せぬエラー。
3. 書き込み権限の欠如: ネットワークドライブ上のロックや、既存ファイルの上書き保護による例外処理の欠如。
これらを解決する鍵は、`ModelDocExtension` オブジェクトを使い、明示的に「保存オプション」を制御することにある。
—
2. 堅牢なプロダクションコード:MultiFormatExporter
以下のコードは、単なるスクリプトではなく、拡張性を考慮した設計だ。これをモジュールとして切り出しておけば、プロジェクトを跨いでも再利用できる。
Option Explicit
‘ 必要な定数の定義(API仕様により固定値を使用)
Private Const swSaveAsCurrentVersion As Long = 0
Private Const swSaveAsOptions_Silent As Long = 1
”’
”’
Public Sub ExportPartToMultipleFormats(swModel As SldWorks.ModelDoc2, exportDir As String)
Dim swExt As SldWorks.ModelDocExtension
Dim docTitle As String
Dim baseName As String
Set swExt = swModel.Extension
docTitle = swModel.GetTitle
‘ 拡張子を除いたファイル名を取得
baseName = Left(docTitle, InStrRev(docTitle, “.”) – 1)
‘ 出力先のディレクトリが存在するか確認(基本中の基本)
If Dir(exportDir, vbDirectory) = “” Then
Err.Raise vbObjectError + 1000, “Export”, “指定されたフォルダが存在しません。”
End If
‘ 各形式でのエクスポート処理
Call ExportFile(swExt, baseName, exportDir, “STEP”, “.step”)
Call ExportFile(swExt, baseName, exportDir, “Parasolid”, “.x_t”)
Call ExportFile(swExt, baseName, exportDir, “STL”, “.stl”)
Debug.Print “全フォーマットの出力が完了しました。”
End Sub
Private Sub ExportFile(swExt As SldWorks.ModelDocExtension, baseName As String, _
dir As String, formatType As String, ext As String)
Dim fullPath As String
Dim status As Boolean
fullPath = dir & “\” & baseName & ext
‘ SaveAsメソッドの肝:第4引数以降のオプションを正しく設定する
‘ swSaveAsOptions_Silent (1) を指定することで、ダイアログを強制抑制
status = swExt.SaveAs(fullPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, 0, 0)
If Not status Then
Debug.Print “エラー: ” & formatType & ” の出力に失敗しました。”
End If
End Sub
—
3. 開発リーダーからの「設計の勘所」
① パスの結合は `\` をハードコードしない
Windowsのパス操作において、`\` の有無を気にするのは時間の無駄だ。実務では `FileSystemObject (FSO)` を活用し、パスの整合性を常に保つ設計にすること。
② エラーハンドリングの「解像度」を上げる
上記のコードでは `status` の戻り値を見て `Debug.Print` しているが、実際のプロダクション環境では、ログファイルへの書き出しや、失敗時にどのフォーマットで何が起きたかをユーザーに通知する `MsgBox` を実装すべきだ。
③ ユーザーの「作業環境」を汚さない
`SaveAs` を実行する際、SolidWorksが裏で「別のウィンドウ」として認識してしまい、画面がちらつくことがある。`swApp.Visible = False` を安易に使うのは避け、`swApp.UserControl = False` を駆使して、プロセスをサイレントに制御するのがプロの作法だ。
—
4. 次のステップへ
このコードをベースに、以下の機能を追加することで、あなたの自動化ツールは「伝説的」なものへ進化する。
- データベース連携: `Access` や `SQL Server` と連携し、出力したファイルパスをレコードとして記録する(履歴追跡)。
- コンフィギュレーション対応: パーツ内の特定コンフィギュレーションのみをエクスポートするロジックの追加。
- バッチ処理: 指定フォルダ内の全パーツファイルをループ処理で一括変換するラッパー関数の実装。
SolidWorks VBAは古い言語と言われることもあるが、APIの深淵を理解したエンジニアにとっては、これほど強力な「製造の武器」はない。さあ、このコードをあなたの武器庫に加え、退屈な手作業を自動化の炎で焼き払ってほしい。
何か不明点があれば、コードの深層まで解説する準備はできている。遠慮なく質問してくれ。
