【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の要件を組み込み、あなただけの「最強の抽出エンジン」を構築してほしい。
もし、さらに高度な「アセンブリへの自動配置」や「属性の一括継承」といった領域に踏み込みたい場合は、また次の機会に語るとしよう。諸君の健闘を祈る。
