【実務・中級編】【マルチボディ対応】SaveSelectedBodiesExternalメソッドによる複数ソリッドボディの個別パーツファイル一括切り出し – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API】マルチボディを「個別パーツ」へ一括切り出しする最適解|堅牢な自動化の極意

SolidWorksでマルチボディパーツを設計していると、必ずぶつかる壁がある。「このボディを個別のパーツファイルとして切り出したい」という要求だ。

手作業で「ボディの保存」コマンドを繰り返すのは、エンジニアの仕事ではない。今回は、`SaveSelectedBodiesExternal` メソッドを軸に、実務で「落ちない」「迷わない」ための堅牢な自動化コードを伝授する。

なぜ、単なるループ処理ではダメなのか?

多くの初心者は、単に全ボディを列挙して保存するだけのコードを書く。しかし、実務レベルでは以下のリスクを考慮しなければならない。

1. Selection(選択)の状態依存: `SaveSelectedBodiesExternal` は「選択されているボディ」を対象にする。処理前に確実に選択状態をクリアし、狙ったボディだけをアクティブにする必要がある。
2. ファイル名の一意性: ボディ名には、ファイルシステムで禁止されている文字が含まれる可能性がある。ファイル名として不正な文字をサニタイズ(浄化)する工程が必須だ。
3. メモリ管理: 多数のボディを連続処理すると、SolidWorksのプロセスが肥大化し不安定になる。適宜 `ClearSelection` を行うなど、APIの「作法」を徹底せねばならない。

実装の要諦:プロダクションコード

以下のコードは、単に動くだけのスクリプトではない。エラーハンドリングと命名規則のサニタイズを実装した、実務でそのまま使える堅牢な雛形だ。

Option Explicit

‘ 伝説的な自動化のためのメインプロシージャ
Public Sub ExportAllBodiesToParts()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim vBodies As Variant
Dim swBody As SldWorks.Body2
Dim i As Long
Dim savePath As String
Dim folderPath As String

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ パートファイル以外は弾く防御的設計
If swModel Is Nothing Or swModel.GetType <> swDocPART Then
MsgBox “パーツファイルを開いてください。”, vbCritical
Exit Sub
End If

Set swPart = swModel
folderPath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, “\”))
vBodies = swPart.GetBodies2(swBodyType_e.swSolidBody, False)

If IsEmpty(vBodies) Then Exit Sub

‘ 処理ループ
For i = LBound(vBodies) To UBound(vBodies)
Set swBody = vBodies(i)

‘ 1. 選択状態をクリーンにする
swModel.ClearSelection2 True

‘ 2. 対象ボディを選択
If swBody.Select2(False, Nothing) Then
‘ 3. ファイル名の不正文字を置換し保存パスを生成
savePath = folderPath & SanitizeFileName(swBody.Name) & “.sldprt”

‘ 4. 実行 – 第2引数は「コンフィギュレーション保持」等のフラグだが、0が基本
If Not swModel.SaveSelectedBodiesExternal(savePath, 0) Then
Debug.Print “Failed to save: ” & swBody.Name
End If
End If
Next i

swModel.ClearSelection2 True
MsgBox “全ボディの切り出しが完了しました。”, vbInformation
End Sub

‘ ファイル名として使用できない文字を削除・置換するヘルパー関数
Private Function SanitizeFileName(ByVal fileName As String) As String
Dim invalidChars As Variant
Dim i As Long
invalidChars = Array(“\”, “/”, “:”, “”, “?”, “”””, “<", ">“, “|”)

For i = LBound(invalidChars) To UBound(invalidChars)
fileName = Replace(fileName, invalidChars(i), “_”)
Next i
SanitizeFileName = fileName
End Function

実務で「失敗しない」ための運用設計

1. 依存関係の考慮(外部参照)

`SaveSelectedBodiesExternal` で切り出されたパーツは、元のパーツとリンク(外部参照)を持つ設定にすることが可能だ。もし、設計変更を親パーツに追従させたい場合は、引数を調整する必要がある。しかし、「独立したパーツ」として完結させたい場合は、リンクを切るか、保存後に派生解除を行う処理を噛ませるのが、データ管理の観点からはよりクリーンである。

2. 大規模アセンブリへの展開

このコードをさらに発展させ、切り出したパーツを自動的にアセンブリとして再構成することも可能だ。その際は、`swModel.AddComponent5` をループ内で呼び出し、座標系を揃えて配置するロジックを追加する。ただし、座標系の管理には `GetTransformation` を利用する必要があり、数学的な理解が求められる。

3. パフォーマンスの罠

SolidWorks APIは、UI上の選択状態(Selection)を逐一更新するため、処理が重くなりがちだ。`swModel.EditRebuild3` を多用せず、最後に一度だけリビルドをかけるのが高速化のセオリーである。

最後に:自動化の先にあるもの

このコードは、あなたの業務から「単純なファイル保存作業」を根絶する。だが、真の自動化エンジニアは、このコードを「単なるスクリプト」で終わらせない。

例えば、「PdmWorksや共有フォルダへの保存先を自動判定する機能」「切り出したパーツのプロパティ(材質や重量)を自動でコピーする機能」を統合することで、初めて真の効率化が達成される。

さあ、このコードを基盤に、あなたの現場に最適化した自動化ツールを組み上げてほしい。技術は、誰かの「面倒くさい」を消し去るために存在するのだから。

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