アセンブリの「部分エクスポート」を極める:SolidWorks APIの真髄
SolidWorksでアセンブリのサブアセンブリだけを抽出し、STEP形式で書き出す。この単純に見えるタスクこそ、APIの「オブジェクトのライフサイクル」と「メモリ管理」の理解度が如実に現れる領域です。
多くのエンジニアは、単にドキュメントをアクティブにして名前をつけて保存(SaveAs)するコードを書き、結果として「メモリリーク」や「ゾンビプロセス」に悩まされます。今日は、業務自動化の現場で生き残るための、堅牢で効率的なアーキテクチャを伝授します。
—
1. なぜ「SaveAs」だけでは不十分なのか
サブアセンブリを個別にエクスポートする際、陥りやすい罠が2つあります。
1. コンテキストの汚染: アセンブリ全体をメモリにロードしたまま個別のエクスポートを繰り返すと、APIのハンドラが正しく解放されず、SolidWorksが不安定になります。
2. 参照の不整合: プログラムが「どの構成部品」を指しているのか、メモリ上のオブジェクトとファイルシステム上のパスを混同すると、意図しない部品がエクスポートされるバグが発生します。
結論: サブアセンブリをエクスポートする際は、「その部品を一時的に独立した環境として認識させ、処理後に確実に破棄する」というライフサイクル管理が不可欠です。
—
2. 堅牢な実装コード(VBA)
以下のコードは、選択したサブアセンブリをSTEPとして書き出すためのプロダクションコードです。ポイントは `IModelDocExtension::SaveAs` を使用し、処理後に `SldWorks::CloseDoc` で確実にメモリを解放している点です。
Option Explicit
‘ 伝説的なチーフアーキテクトによる、堅牢なサブアセンブリエクスポート関数
Public Sub ExportSelectedSubAssemblyToStep()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swComp As SldWorks.Component2
Dim swSubModel As SldWorks.ModelDoc2
Dim exportPath As String
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. 選択チェック:サブアセンブリが選択されているか確認
Set swSelMgr = swModel.SelectionManager
Set swComp = swSelMgr.GetSelectedObject6(1, -1)
If swComp Is Nothing Then
MsgBox “対象のサブアセンブリを選択してください。”
Exit Sub
End If
‘ 2. コンポーネントからモデルを取得
Set swSubModel = swComp.GetModelDoc2
If swSubModel Is Nothing Then
MsgBox “対象のモデルが見つかりません。一度開いてください。”
Exit Sub
End If
‘ 3. エクスポート先の定義(保存場所は適宜変更)
exportPath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, “\”)) & _
swComp.Name2 & “.step”
‘ 4. エクスポート実行(SaveAsは堅牢なAPIを使用)
Dim status As Boolean
Dim errors As Long, warnings As Long
‘ STEPエクスポート設定(必要に応じてオプションを追加可能)
status = swSubModel.Extension.SaveAs(exportPath, _
swSaveAsVersion_e.swSaveAsCurrentVersion, _
swSaveAsOptions_e.swSaveAsOptions_Silent, _
Nothing, errors, warnings)
If status Then
Debug.Print “エクスポート成功: ” & exportPath
Else
MsgBox “エクスポート失敗。エラーコード: ” & errors
End If
‘ 5. メモリ保護:明示的にオブジェクトを解放
Set swSubModel = Nothing
Set swComp = Nothing
End Sub
—
3. 実務で「詰まない」ための設計指針
A. データベース連携時の注意点
エクスポートしたファイルをPLMや共有サーバーに自動転送する場合、「ファイルが完全に書き込まれるまで待機する」処理を必ず入れてください。`SaveAs` が完了した直後にファイルを読みに行くと、ロックがかかっていてI/Oエラーが発生します。`Dir()` 関数等を用いたファイル存在確認のループを挟むのが最も確実です。
B. バージョン管理とパスの正規化
ファイルパスには必ず `FileSystemObject` を使い、パスの区切り文字を適切に処理してください。特にアセンブリがネットワークドライブ上にある場合、UNCパス(`\\Server\…`)の扱いでエラーが出ることがあります。`GetAbsolutePathName` を活用し、常にフルパスで制御するのが定石です。
C. ユーザー体験(UX)の向上
エクスポート処理はバックグラウンドで走らせつつ、`swApp.UserControl = True` を適切に切り替えることで、処理中のフリーズを防ぎ、ユーザーに「今、処理中であること」をプログレスバー等でフィードバックしてください。
—
最後に:エンジニアとしての心構え
自動化ツールを書くことは、単にコードを動かすことではありません。「誰が使っても、どんなデータが来ても壊れない強靭なパイプラインを構築すること」です。
今回紹介した「モデルの取得、処理、解放」のサイクルをマスターすれば、アセンブリだけでなく、図面のエクスポートや属性情報の抽出など、あらゆる自動化タスクに応用が効くようになります。
コードは嘘をつきません。正しく設計されたロジックこそが、あなたの業務を劇的に加速させる唯一の武器になるのです。次のステップとして、このコードを `Dictionary` オブジェクトと組み合わせて、アセンブリ内の全サブアセンブリを一括抽出するバッチ処理に挑戦してみてください。
健闘を祈ります。
