はじめに:なぜ「サブアセンブリの単体STEPエクスポート」で現場は疲弊するのか
大規模な機械装置を設計していると、必ず直面する壁がある。それが「サプライヤーや他部署への特定モジュール(サブアセンブリ)の切り出し・共有」だ。
トップアセンブリを開き、不要な構成部品を一つひとつ手作業で非表示または抑制し、「名前を付けて保存」でSTEP形式を選ぶ――。
この退屈でヒューマンエラーの温床となる作業を、未だに手動で行っていないだろうか? 構成部品が数千点を超える大アセンブリにおいて、この手動オペレーションはCADのメモリを無駄に消費し、ファイル参照切れ(リンク切れ)やコンフィギュレーションの取り違えといった重大なミスを引き起こす。
我々業務自動化エンジニアに求められているのは、「指定したサブアセンブリのコンテキスト(文脈)だけを安全に抽出し、一瞬でクリーンなSTEPファイルとして吐き出す」洗練されたメカニズムの構築だ。
今回は、SolidWorks APIのメモリ管理の裏側とオブジェクトライフサイクルを熟知した者だけが書ける、実務で即座に使える堅牢なプロダクションコードを伝授する。
—
1. 堅牢な設計思想:なぜ「単に保存するだけ」では失敗するのか
VBAでアセンブリを操作する際、多くの初学者が陥る罠が「トップアセンブリを開いたまま、内部のコンポーネントを直接どうにかしようとする」ことだ。
実務レベルの堅牢性を担保するためには、以下のアーキテクチャ上の原則を遵守しなければならない。
1. メモリ上のコンポーネントと実ファイルの分離
アセンブリ内のサブアセンブリは、あくまで「参照(Component2)」に過ぎない。これを単体のSTEPとして出力するには、対象のサブアセンブリを「独立したドキュメント」としてメモリ上に正しく認識させ、適切なエクスポートオプションを適用する必要がある。
2. サイレントモード(Invisible Mode)の活用
エクスポート処理のために画面描画や余計なUIイベントを発生させてはならない。`SwApp.OpenDoc6` のオプションを制御し、バックグラウンドで高速かつ安全に処理を完結させる。
3. 完全修飾パス(Absolute Path)の絶対遵守
相対パスでのファイル操作は、カレントディレクトリの変動によって必ず破綻する。FileSystemObject (FSO) を用いて、パスの解決は常に完全修飾で行う。
—
2. プロダクションコード:サブアセンブリSTEPエクスポート・マクロ
以下のコードは、現在アクティブなアセンブリから、ユーザーが指定した名前(あるいは選択したコンポーネント)のサブアセンブリを特定し、一瞬でSTEPファイルとして出力する実用VBAプロシージャである。
Option Explicit
‘ =================================================================================
‘ 処理名: 指定サブアセンブリの独立STEPエクスポート自動化
‘ 概要: アクティブアセンブリから対象サブアセンブリを抽出し、
‘ 外部参照を断ったクリーンなSTEPファイルとして指定フォルダに保存する。
‘ =================================================================================
Sub ExportSubAssemblyToStep()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
Dim swSelMgr As SldWorks.SelectionMgr
Dim swComp As SldWorks.Component2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. ドキュメントが開かれているか、それがアセンブリか検証
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType() <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If
Set swAssm = swModel
Set swSelMgr = swModel.Extension.GetSelectionManager
‘ 2. 画面上のツリーまたはグラフィックス領域から対象コンポーネントを選択させる
‘ ※今回は「最初類選択されたコンポーネント」を対象とする実用的なアプローチ
Set swComp = swSelMgr.GetSelectedObject6(1, -1)
If swComp Is Nothing Then
MsgBox “対象となるサブアセンブリの構成部品をグラフィックス領域またはFeatureManagerで選択してください。”, vbExclamation, “選択エラー”
Exit Sub
End If
‘ 選択されたものがサブアセンブリ(または部品)のインスタンスか確認
Dim targetModelPath As String
targetModelPath = swComp.GetPathName()
If targetModelPath = “” Then
MsgBox “選択されたアイテムはファイルとして保存されていない仮想コンポーネント、または無効な部品です。”, vbCritical, “エラー”
Exit Sub
End If
‘ 3. 出力先ディレクトリの決定(元アセンブリと同じ階層の “Exported_STEP” フォルダ)
Dim fso As Object
Set fso = CreateObject(“Scripting.FileSystemObject”)
Dim parentDir As String
parentDir = fso.GetParentFolderName(swModel.GetPathName)
Dim exportDir As String
exportDir = parentDir & “\Exported_STEP”
If Not fso.FolderExists(exportDir) Then
fso.CreateFolder (exportDir)
End If
Dim baseName As String
baseName = fso.GetBaseName(targetModelPath)
Dim outputPath As String
outputPath = exportDir & “\” & baseName & “.step”
‘ 4. バックグラウンド(サイレント)でのドキュメントオープンとエクスポート処理
‘ ※トップアセンブリを汚さず、対象サブアセンブリを独立してメモリにロードする
Dim errCode As Long
Dim warnCode As Long
Dim swSubModel As SldWorks.ModelDoc2
‘ 高速化と画面ちらつき防止のため、ユーザーインターフェースをロック
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllType, True
‘ ドキュメントを開く(サイレントモード:Visible = False、ReadOnly = True)
Set swSubModel = swApp.OpenDoc6(targetModelPath, swDocASSEMBLY, swOpenDocOptions_Silent, “”, errCode, warnCode)
If swSubModel Is Nothing Then
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllType, False
MsgBox “対象のサブアセンブリを開くことができませんでした。エラーコード: ” & errCode, vbCritical, “ファイルオープンエラー”
Exit Sub
End If
‘ 5. STEPエクスポート実行
‘ AP214 または AP203の規格を指定(ここでは汎用性の高いAP214)
Dim saveStatus As Boolean
saveStatus = swSubModel.Extension.SaveAs(outputPath, 0, 0, Nothing, errCode, warnCode)
‘ 6. メモリのクリーンアップ(極めて重要:これを怠るとメモリリークを引き起こす)
swApp.CloseDoc baseName
‘ 画面表示を元に戻す
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllType, False
‘ 完了通知
If saveStatus Then
MsgBox “以下のパスにSTEPファイルを正常にエクスポートしました。” & vbCrLf & outputPath, vbInformation, “処理完了”
Else
MsgBox “STEPファイルの書き出しに失敗しました。エラーコード: ” & errCode, vbCritical, “エクスポートエラー”
End If
‘ オブジェクト解放
Set fso = Nothing
Set swSubModel = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. チーフアーキテクトが教える「現場で絶対に躓かない」ための実装ポイント
上記のコードは単なるサンプルではない。実務の現場で数百回、数千回と回しても耐えうるよう、以下の「プロの知見」が組み込まれている。
① `OpenDoc6` とサイレントオープン
アセンブリ全体をメモリにロードしたままエクスポートをかけようとすると、不要な参照関係やコンフィギュレーションの競合でマクロがフリーズすることがある。コード内では一度対象のサブアセンブリのファイルパスを特定し、`swOpenDocOptions_Silent` を用いてバックグラウンドで「単体」としてロードし直している。これにより、処理速度が劇的に向上し、メモリの消費を最小限に抑えられる。
② 明示的なメモリ解放(Garbage Collectionの補完)
VBAのランタイムは賢いが、COMコンポーネントであるSolidWorks APIのメモリ管理においては、開発者が自らライフサイクルを制御する必要がある。`OpenDoc6` で開いたドキュメントは、処理が終わったら必ず `swApp.CloseDoc` で明示的に閉じなければならない。これを怠ると、バックグラウンドプロセスに無数のSolidWorksインスタンスが残留し、PCが数分でスワップアウトを起こす(いわゆるメモリリーク地獄)。
③ `SetUserPreferenceToggle` による描画ロック
大規模アセンブリを扱う際、VBAからAPIを叩くたびにSolidWorksのグラフィックビューポートが再描画(リフレッシュ)されようとする。これが処理を数倍遅くする原因だ。処理の前後でUIの描画を抑制するトグルの切り替えを行うことで、エンジニアの貴重な時間を無駄にさせない高速化を実現している。
—
おわりに:業務自動化がもたらす設計の本質への集中
今回紹介したサブアセンブリの単体STEPエクスポートの自動化は、単なる「手作業の代替」にとどまらない。
ファイル管理の属人性を排除し、誰が実行しても「常にクリーンで正確な中間ファイル」が生成される仕組みそのものを担保することに価値がある。
定型的なファイルコンバート作業にエンジニアの貴重な脳みそを使わせてはならない。VBAによる堅牢な自動化を組織にインストールし、あなたとチームメンバーを「本来創造的であるべき設計・開発業務」へと解放してほしい。
