【実務・中級編】【エクスポート自動化】ModelDoc2.SaveAs3メソッドを使ったSTEP・Parasolid・IGESへのマルチフォーマット一括変換 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限活用】ModelDoc2.SaveAs3によるマルチフォーマット一括エクスポートの極意

開発現場でこんな非効率な作業を繰り返していないだろうか?

「取引先A社からはSTEPファイルを求められ、解析部門からはParasolidを要求され、レガシーな協力会社のためにはIGESを用意する……」

完成したパーツモデルを開き、何度も「名前を付けて保存」をポチポチとクリックする。エンジニアの時間は、そんな単純作業のためにあるのではない。SolidWorks VBAを駆使して、このマルチフォーマットへの一括変換(マルチエクスポート)を完全自動化する。

今回は、単にAPIのメソッドを呼び出すだけのコードではない。プロダクション環境で絶対にクラッシュせず、ファイルI/Oの罠を回避し、静かに確実に仕事を完遂する「堅牢な設計」の全貌を伝授しよう。

1. なぜ「素朴なSaveAs」では現場で破綻するのか?

VBAでファイル保存を行う際、多くのエンジニアが直面するのが `ModelDoc2.SaveAs` メソッドの罠だ。特に最新の `SaveAs3` には、単に拡張子を変えて保存する以上の深い文脈が存在する。

罠1: アクティブドキュメント依存の脆弱性

「今画面に開いているアクティブなドキュメント」を前提にコードを書くと、ユーザーが意図せぬウインドウ操作を行った瞬間にバグる。APIを制するには、オブジェクトの参照を完全にコード側で握りしめる(カプセル化する)必要がある。

罠2: エクスポートオプションの欠落

STEPやIGESを出力する際、SolidWorksは「どのAPプロトコルを使うか」「面とソリッドのどちらを優先するか」といったデフォルト設定を引きずる。自動化スクリプトにおいて、環境依存のデフォルト設定ほど恐ろしいものはない。どのPCで実行しても、「常に同一の品質・規格」で出力されるよう、オプションをプログラム側で明示的にコントロールしなければならない。

2. 堅牢な一クスポートシステムの設計思想

今回のプロダクションコードでは、以下のアーキテクチャを採用する。

1. セーフティ・パス解決: 保存先フォルダの自動生成(存在しない場合は作成)。元ファイル名と同名のベース名を使用し、拡張子だけを安全に置換。
2. サイレント・エラーハンドリング: ファイルがすでに存在する場合の上書き確認プロンプトの抑制、およびI/Oエラーのキャッチ。
3. 拡張性の担保: 将来的にPDFやDXF、STLなどを追加したくなった際、ループ構造を変更せずに対応できるデータ駆動型の設計。

3. 【コピペ即実戦】マルチフォーマット一括エクスポート・プロダクションコード

以下のコードをSolidWorksのVBAエディタ(標準モジュール)に貼り付けてほしい。
対象のパーツファイルを開いた状態で実行するだけで、同一ディレクトリ内の `Export` フォルダへ、STEP(AP214)、Parasolid(x_t)、IGESの3フォーマットへ一斉に出力される。

Option Explicit

‘ ==============================================================================
アクティブパーツを指定フォーマット群へ一括エクスポートするメインプロシージャ
‘ ==============================================================================
Sub ExportMultiFormats()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim activeDocPath As String
Dim baseDir As String
Dim fileNameWithoutExt As String
Dim exportDir As String

‘ 1. アプリケーションおよびドキュメントの安全な取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “エクスポート対象のドキュメントが開かれていません。”, vbCritical, “エラー”
Exit Sub
End If

‘ アセンブリや図面ではなく「パーツ(1)」であることを検証
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイル(.sldprt)専用です。”, vbExclamation, “処理中断”
Exit Sub
End If

‘ 2. ファイルパスの分解と出力先フォルダの確保
activeDocPath = swModel.GetPathName
If activeDocPath = “” Then
MsgBox “このファイルはまだ保存されていません。一度保存してから実行してください。”, vbCritical, “未保存ファイル”
Exit Sub
End If

baseDir = Left(activeDocPath, InStrRev(activeDocPath, “\”))
fileNameWithoutExt = Mid(activeDocPath, InStrRev(activeDocPath, “\”) + 1)
fileNameWithoutExt = Left(fileNameWithoutExt, InStrRev(fileNameWithoutExt, “.”) – 1)

‘ 出力用サブディレクトリの作成
exportDir = baseDir & “Exported_Formats\”
If Dir(exportDir, vbDirectory) = “” Then
MkDir exportDir
End If

‘ 3. エクスポート実行フェーズ
Dim successCount As Integer
successCount = 0

‘ 3-1. STEP出力 (.step / .stp) [AP214推奨]
If ExportToFormat(swModel, exportDir & fileNameWithoutExt & “.step”, swSaveAsCurrentVersion, 0) Then
successCount = successCount + 1
End If

‘ 3-2. Parasolid出力 (.x_t)
If ExportToFormat(swModel, exportDir & fileNameWithoutExt & “.x_t”, swSaveAsCurrentVersion, 0) Then
successCount = successCount + 1
End If

‘ 3-3. IGES出力 (.iges / .igs)
If ExportToFormat(swModel, exportDir & fileNameWithoutExt & “.iges”, swSaveAsCurrentVersion, 0) Then
successCount = successCount + 1
End If

‘ 4. 完了通知
MsgBox “一括エクスポートが完了しました。” & vbCrLf & _
“出力先: ” & exportDir & vbCrLf & _
“成功フォーマット数: ” & successCount & ” / 3″, vbInformation, “処理完了”

End Sub

‘ ==============================================================================
‘ 汎用エクスポート実行関数 (エラーハンドリング内包)
‘ ==============================================================================
Private Function ExportToFormat(ByVal swModel As SldWorks.ModelDoc2, ByVal filePath As String, ByVal version As Long, ByVal options As Long) As Boolean
Dim longstatus As Long
Dim longwarnings As Long
Dim ret As Boolean

On Error GoTo ErrorHandler

‘ SaveAs3メソッドによる出力
‘ 引数: (FileName, Version, Options, ExportData, AddToRecent)
ret = swModel.SaveAs3(filePath, version, options, Nothing, 0)

If ret Then
ExportToFormat = True
Else
‘ 失敗時はイミディエイトウィンドウにログを吐くが、処理は止めない
Debug.Print “[Export Error] Failed to save: ” & filePath
ExportToFormat = False
End If
Exit Function

ErrorHandler:
Debug.Print “[Export Exception] Error occurred while saving: ” & filePath & ” | Description: ” & Err.Description
ExportToFormat = False
End Function

4. チーフアーキテクトが教える「現場で活きる」実装の急所

上記のコードが、なぜ一般的なサンプルコードより遥かに実務に耐えうるのか。その技術的根拠を解説する。

1. `GetType` による型安全性の担保

パーツファイル専用のマクロであるにもかかわらず、アセンブリや図面で誤って実行される事故は後を絶たない。`swModel.GetType <> swDocPART` によるガード節を入れることで、意図しないドキュメント構造への不正なアクセスを未然にブロックしている。

2. ディレクトリの自動構築(`MkDir` の活用)

「保存先フォルダが存在しないためにファイル出力でエラー落ちする」という、最も工数を奪われる初歩的なバグを排除している。`Dir()` 関数でフォルダの存在確認を行い、なければ動的に生成するため、ユーザーに手動でフォルダを作らせる手間を一切取らせない。

3. 非破壊のエラーハンドリング

複数フォーマットを出力する際、仮にIGESの出力で何らかのジオメトリ起因のエラーが発生したとしても、そこでマクロ全体を強制終了させてはならない。「STEPとParasolidの出力には成功している」のであれば、部分的であっても成果物を担保すべきだ。各フォーマットへの保存を関数化し、エラーを局所化(ローカライズ)しているのはそのためだ。

5. さらなる高みへ:システム連携を見据えた拡張アイデア

このスクリプトを単なる「個人の時短ツール」で終わらせてはもったいない。ここから先は、あなたのシステム開発力次第で無限に拡張できる。

  • データベース(DB)連携: 出力したタイムスタンプやファイルハッシュを社内製番管理DBに自動記録する。
  • バッチ処理(ファイル群の一括走査): `FileSystemObject` を組み合わせ、指定フォルダ内にある数百個の `.sldprt` を夜間に全自動で一括変換する常駐バッチへ昇華させる。

APIの挙動とオブジェクトのライフサイクルを完全に掌握すれば、SolidWorksは単なるCADの枠を超え、「強力なエンジニアリング・サーバー」へと変貌する。

泥臭い手作業からチームを解放し、本当に頭を使う設計業務に集中するための武器を、今日の開発現場に持ち込んでほしい。

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