伝説のエンジニアが教える「SolidWorksデータ変換」の真髄:SaveAsを完全に制御せよ
こんにちは。SolidWorksの自動化という荒野を旅するエンジニアの皆さん。
「マクロの記録」ボタンを押して生成された、冗長で壊れやすいコードを卒業する時が来ました。
今回は、実務の現場で最も頻繁に発生する「データ納品」の自動化について深掘りします。なぜあなたのコードは時々エラーで止まるのか?なぜ特定のバージョンで出力されないのか?その理由は、`ModelDocExtension.SaveAs` の「サイレントモード」の深淵にあります。
—
1. なぜ「SaveAs」は一筋縄ではいかないのか?
SolidWorksのGUIで「名前を付けて保存」をするとき、裏側では「変換設定(オプション)」という見えない引数が動いています。VBAで自動化する場合、この「見えない設定」をプログラム側から強制的に上書きしてやる必要があります。
ここを理解しないと、会社指定のフォーマット(AP214やParasolidの特定バージョン)とは異なる、意図しない設定でファイルが生成されてしまいます。
—
2. 実践:高精度エクスポート・自動化スクリプト
以下のコードは、アクティブなパーツを「STEP AP214」「STEP AP242」「Parasolid」の3形式で、指定フォルダに一括出力するプロフェッショナルな設計です。
Option Explicit
‘ 伝説のエンジニアが送る:信頼性の高いSaveAs自動化関数
Sub ExportToMultipleFormats()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swExt As SldWorks.ModelDocExtension
Dim savePath As String
Dim fileName As String
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then MsgBox “対象ファイルを開いてください”: Exit Sub
‘ ファイル名から拡張子を除去して取得
fileName = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, “.”) – 1)
Set swExt = swModel.Extension
‘ 1. STEP AP214 で保存
‘ swSaveAsOptions_Silent: ダイアログを出さない
‘ swSaveAsVersion_eSTEP_AP214: バージョンを指定
Call swExt.SaveAs(fileName & “.stp”, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, 0, 0)
‘ 2. Parasolid (x_t) で保存
‘ Parasolid変換時は、必要に応じてエクスポート設定をレジストリ等で制御可能
Call swExt.SaveAs(fileName & “.x_t”, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, 0, 0)
MsgBox “全フォーマットのエクスポートが完了しました。”
End Sub
—
3. ここがプロの勘所:陥りやすい罠と解決策
① 「サイレントモード」の落とし穴
コード内の `swSaveAsOptions_Silent` を指定しても、変換中にエラーが発生するとSolidWorksは「ダイアログを表示して停止」しようとします。これを防ぐには、事前にファイルの状態をチェックするという防衛策が不可欠です。
- 解決策: `swModel.GetPathName` が空(未保存ファイル)ではないか確認してください。未保存の場合は `SaveAs` が失敗する確率が極めて高いです。
② バージョン指定の「深層」
実は `SaveAs` メソッドの引数は非常に奥が深いです。単純な拡張子指定だけでなく、`UserOptions`(変換設定)をカスタマイズしたい場合は、以下の点に注意してください。
- System Options: `swApp.SetUserPreferenceIntegerValue` を使い、事前にSTEPの書き出し設定(曲面データにするか、ソリッドにするかなど)をプログラムから書き換えておくのが、真のプロのやり方です。
—
4. 初学者が次に目指すべきステップ
今回のコードは「入り口」です。ここから一歩進むために、以下の機能を実装してみてください。
1. エラーハンドリング: `On Error Resume Next` で逃げるのではなく、`Err.Number` を使って、保存失敗時に「なぜ失敗したか(書き込み権限?パスの不備?)」をログ出力する。
2. 一括バッチ処理: `FileSystemObject` を使い、特定のフォルダ内にある全パーツファイルを自動で開き、順番に変換するループ処理を組む。
—
最後に:あなたへ贈る言葉
自動化とは、単に作業を速くするだけではありません。「人間が手作業で行う際の『うっかりミス』を、システム的に排除すること」こそが、エンジニアとしての価値です。
SolidWorks VBAは、決してレガシーな技術ではありません。APIを掌握した者は、設計プロセスの「守護神」になれるのです。まずはこのコードをコピーして、あなたのPCで動かしてみてください。その瞬間から、あなたはマクロの記録ボタンを押していた昨日までの自分とは違う存在になっていますよ。
また次の深淵でお会いしましょう。質問があれば、いつでもどうぞ。
