【テクニカル・上級編】【ファイルコンバートの自動化】SaveAs関数を用いたPDF・STEP・IGES形式への一括変換マクロ – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの深淵:非表示一括変換がもたらす「真の自動化」の最適解

業務自動化の現場において、「ファイルを開いて名前を付けて保存する」という単純作業ほど、エンジニアの精神を摩耗させるものはない。数百のパーツやアセンブリを人手で変換するなど、21世紀のエンジニアが許容すべき作業ではない。

だが、安易なマクロはメモリリークを招き、SolidWorksを強制終了させる。本稿では、レガシーなVBA環境であっても、堅牢かつ高速にファイル変換を実行するための「アーキテクチャの要諦」を伝授する。

—

1. 破壊的な速度を生む「非表示処理」の鉄則

多くの初心者は `swApp.OpenDoc6` を使い、画面上にモデルを表示させる。これはGUIの再描画コストを支払う行為であり、数百ファイル処理する際には致命的となる。

我々が選択すべきは `swApp.OpenDoc6` における `swOpenDocOptions_Silent` フラグだ。これにより、SolidWorksはバックグラウンドでドキュメントをメモリにロードする。GUIのオーバーヘッドを排し、CPUとメモリ帯域を変換処理に全振りする。これが「プロの自動化」の第一歩だ。

2. メモリ最適化:オブジェクトの「死」を管理する

VBA(COM)において、最も恐ろしいのは「背後で生き続けるプロセス」だ。特に `ModelDoc2` オブジェクトをループ内で生成し、明示的に解放せずに次のループへ進むコードは、数分でSolidWorksをメモリ不足に追い込む。

  • 鉄則: `Set swModel = Nothing` を呼び出すだけでは足りない。
  • 対策: `swApp.CloseDoc` を確実に実行し、参照カウントをゼロに引き戻せ。

—

3. 実践コード:一括変換エンジン「Converter Core」

以下は、PDF・STEP・IGESへ一括変換する、堅牢性を重視したテンプレートだ。

Option Explicit

‘ 伝説的なチーフアーキテクトによる変換プロシージャ
Public Sub BatchConvertProcess(ByVal folderPath As String)
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim fso As Object: Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim folder As Object: Set folder = fso.GetFolder(folderPath)
Dim file As Object

Set swApp = Application.SldWorks

‘ 最適化: 変換中に警告ダイアログで停止しないよう設定
swApp.UserControl = False

For Each file In folder.Files
If LCase(fso.GetExtensionName(file.Path)) Like “sld” Then
‘ 非表示でオープン (swOpenDocOptions_Silent)
Set swModel = swApp.OpenDoc6(file.Path, swDocPART, swOpenDocOptions_Silent, “”, 0, 0)

If Not swModel Is Nothing Then
‘ PDF変換 (保存パスは適宜調整)
Call ExportToFormat(swModel, file.Path, “pdf”)
‘ STEP変換
Call ExportToFormat(swModel, file.Path, “step”)

‘ メモリ解放の神髄: 確実に閉じる
swApp.CloseDoc swModel.GetTitle
Set swModel = Nothing
End If
End If
Next

swApp.UserControl = True
End Sub

Private Sub ExportToFormat(ByVal swModel As SldWorks.ModelDoc2, ByVal filePath As String, ByVal ext As String)
Dim savePath As String
savePath = Left(filePath, InStrRev(filePath, “.”)) & ext

‘ SaveAsの引数はAPI仕様書通りだが、オプションの指定が鍵となる
‘ swSaveAsOptions_Silent: 警告を無視
‘ swSaveAsOptions_Copy: 参照を維持
swModel.SaveAs4 savePath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, Nothing
End Sub

—

4. シニアエンジニアが知るべき「落とし穴」

A. Windows APIによる監視

大規模変換を行う際、SolidWorksがハングアップしていないか監視する必要がある。`FindWindow` や `GetWindowThreadProcessId` を使い、プロセスが応答不能(Not Responding)になった場合に強制終了させる監視スレッドを別プロセスで走らせるのが、高可用性システムへの道だ。

B. 参照関係の深淵

アセンブリを変換する場合、構成部品のパスが切れていると `OpenDoc6` はダイアログを出し、処理が止まる。`swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swAutoLoadExternalReferences, False` 等を駆使し、外部参照解決の挙動を厳格に制御せよ。

C. DLL Hellとレガシーの共存

もしあなたがVB.NETへの移行を検討しているなら、VBAのコードをそのまま移植してはいけない。`.NET` の `Garbage Collector` と `COM Wrapper` の挙動はVBAと全く異なる。`Marshal.ReleaseComObject` を正しく使いこなせなければ、マネージド環境であってもメモリリークは防げない。

—

結び:自動化は「責任」である

我々が書くコードは、単なるスクリプトではない。会社の設計資産を変換し、次工程へ橋渡しする重要なインフラだ。このアーキテクチャを理解すれば、SolidWorksは単なるCADから、あなたの最強の「データ処理エンジン」へと変貌する。

コードを書く際は、常に「もし10万ファイルを処理させたらどうなるか?」を自問自答せよ。その問いに対する答えの中にこそ、伝説への道筋がある。

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