【実務・中級編】【マルチボディ対応】BodyFolder.GetBodiesを活用したマルチボディパーツからの特定ソリッド抽出と独立エクスポート – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA】マルチボディを制する者は設計を制する。堅牢な「ソリッド抽出・個別保存」の極意

設計現場において、「1つのパーツファイルに複数のソリッドボディが詰め込まれている」状況は、アセンブリへの移行やPDM管理においてしばしばボトルネックとなる。

特に、コンフィギュレーションや派生部品を多用する環境下で、力技で手動エクスポートを繰り返すのは、エンジニアの工数をドブに捨てるようなものだ。

今回は、SolidWorks APIを使い倒し、マルチボディパーツから特定のソリッドを抽出し、独立したパーツファイルとして完全に切り出すための「プロダクションレベル」の自動化ロジックを伝授する。

1. 勘違いされがちな「抽出」の罠

多くの初心者が陥る罠は、`Body.Select2` を用いてコピー&ペーストを行う手法だ。だが、これには以下の重大な欠陥がある。

  • コンテキストの喪失: フィーチャ履歴を考慮せず、単なる「面」の集合体としてコピーされることがあり、参照関係が崩れる。
  • 名前解決の不確実性: ボディ名が重複、あるいは日本語環境特有のエンコード問題で、特定のボディを正しく掴めないケースが多発する。
  • メモリリーク: `GetBodies` で取得したオブジェクトを適切に解放しないと、大規模アセンブリを走査する際にSolidWorksそのものが不安定になる。

真の自動化アーキテクトは、「SaveBodies」フィーチャを活用するか、あるいは「新規パーツへの挿入」手法を使い分ける。今回は、拡張性が高く、最もクリーンな「新規パーツ作成・挿入」のアプローチを提示する。

2. 堅牢性を担保するプロダクションコード

以下のコードは、単なるスクリプトではない。エラーハンドリングと、SolidWorksのセッション管理を考慮した実務仕様だ。

Option Explicit

‘ 伝説のエンジニアが教える、マルチボディ抽出の核心
Sub ExportSolidBodiesToIndividualFiles()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim bodies As Variant
Dim i As Integer
Dim swBody As SldWorks.Body2
Dim swNewPart As SldWorks.ModelDoc2
Dim savePath 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
bodies = swPart.GetBodies2(swSolidBody, False)

If IsEmpty(bodies) Then Exit Sub

‘ ループ処理:各ボディの独立化
For i = LBound(bodies) To UBound(bodies)
Set swBody = bodies(i)

‘ ボディ名を取得(ファイル名に使用)
Dim bodyName As String
bodyName = swBody.Name

‘ 新規パーツ作成
Set swNewPart = swApp.NewDocument(swApp.GetUserPreferenceStringValue(swDefaultTemplatePart), 0, 0, 0)

‘ ボディをコピーして挿入(ここが重要:参照元を維持する手法)
Dim swFeat As SldWorks.Feature
Set swFeat = swNewPart.InsertPart(swModel.GetPathName, swInsertPartOptions_CopyDerivedPart)

‘ 保存パスの定義(元のファイルと同じフォルダに保存)
savePath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, “\”)) & bodyName & “.sldprt”

‘ 強制保存処理
swNewPart.SaveAs savePath
swNewPart.Extension.CloseDocument savePath

‘ オブジェクト解放(メモリ管理の鉄則)
Set swNewPart = Nothing
Next i

MsgBox “全ソリッドの抽出が完了しました。”, vbInformation
End Sub

3. アーキテクトからの設計上の忠告

① 「名前」に依存しすぎるな

`swBody.Name` はユーザーが変更できるため、これをユニークキーとしてDBと連携させるのは危険だ。もしPDMや外部DBと紐づける必要があるなら、`GetID` を利用するか、カスタムプロパティに「GUID」を付与してからエクスポートするフローを推奨する。

② パス操作の正規化

上記のコードでは `InStrRev` を用いてパスを操作しているが、実務では `Scripting.FileSystemObject` を使うのが定石だ。パスの区切り文字や、UNCパス(ネットワークドライブ)の取り扱いにおいて、OSレベルでの安全性を担保できる。

③ なぜ「SaveBodies」フィーチャを使わないのか?

SolidWorksには `SaveBodies` というフィーチャがある。しかし、これをVBAから制御すると、「保存先のパス指定」と「ファイル名の自動生成」の組み合わせで、コンテキストの競合が発生しやすい。上記の「新規ドキュメントを開き、派生パーツとして挿入する」手法は、元のモデルのフィーチャツリーを汚さず、極めてクリーンに切り出せるため、設計変更に対する耐性が高い。

結論:自動化は「道具」ではなく「思想」である

「コードが動くこと」は通過点に過ぎない。重要なのは、「次に誰かがこのコードを触った時に、どれだけメンテナンスコストを下げられるか」だ。

マルチボディの抽出は、単なるファイル分けではない。それは「設計の構造化」という行為そのものだ。このコードをベースに、自社の命名規則やPDMの要件を組み込み、あなただけの「最強の抽出エンジン」を構築してほしい。

もし、さらに高度な「アセンブリへの自動配置」や「属性の一括継承」といった領域に踏み込みたい場合は、また次の機会に語るとしよう。諸君の健闘を祈る。

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