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

スポンサーリンク

【SolidWorks VBA】マルチボディを個別のパーツへ一括切り出し!自動化の極意

こんにちは。SolidWorksの自動化の世界へようこそ。

「1つのパーツファイルに複数のソリッドボディを詰め込んだのはいいけれど、これを後から個別のパーツファイルとして書き出すのが面倒…」

そんな悩み、ありませんか? 手作業で「選択して、右クリックして、名前を付けて保存」を繰り返すのは、エンジニアの仕事ではありません。今回は、`SaveSelectedBodiesExternal`メソッドを駆使して、この単純作業を瞬時に終わらせる「現場直結の自動化」を伝授します。

マクロの記録ボタンを押すだけでは辿り着けない、プロのコードの書き方を一緒にマスターしましょう。

1. なぜ「SaveSelectedBodiesExternal」なのか?

SolidWorksのAPIには、ボディを個別に保存する方法がいくつかありますが、最も堅牢で高速なのがこのメソッドです。

この手法の最大の利点は、「コンテキストを維持したまま、特定のボディだけを独立したファイルに切り出せる」ことにあります。単にジオメトリをコピーするのとは違い、フィーチャの履歴や属性を適切に処理できるのが、このメソッドの特権です。

2. 実践!マルチボディ一括切り出しコード

まずは、以下のコードをコピーしてVBAエディタに貼り付けてみてください。これが、あなたの作業時間を劇的に短縮する「魔法の種」です。

Option Explicit

Sub ExportAllBodiesToParts()
Dim swApp As SldWorks.SldWorks
Dim swPart As SldWorks.PartDoc
Dim swModel As SldWorks.ModelDoc2
Dim vBodies As Variant
Dim swBody As SldWorks.Body2
Dim i As Integer
Dim savePath As String
Dim folderPath As String

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

‘ パーツドキュメント以外なら終了
If swModel.GetType <> swDocPART Then Exit Sub
Set swPart = swModel

‘ 保存先のフォルダを指定(ここではパーツと同じ場所にフォルダを作成)
folderPath = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, “\”)) & “ExportedBodies\”
If Dir(folderPath, vbDirectory) = “” Then MkDir folderPath

‘ すべてのソリッドボディを取得
vBodies = swPart.GetBodies2(swSolidBody, True)

‘ 選択をクリア(重要:選択状態が残っていると誤作動の原因になる)
swModel.ClearSelection2 True

‘ 各ボディを個別に保存
For i = 0 To UBound(vBodies)
Set swBody = vBodies(i)

‘ ボディを選択(メソッド実行には選択が必要)
swBody.Select2 True, Nothing

‘ 保存パスの定義(ボディ名を使うのが一般的)
savePath = folderPath & swBody.Name & “.sldprt”

‘ 【核心】選択したボディを別パーツとして保存
‘ 第3引数: 外部参照を維持するかどうか(Trueで維持)
swPart.SaveSelectedBodiesExternal savePath, True

‘ 次の処理のために選択を解除
swModel.ClearSelection2 True
Next i

MsgBox “全ボディの切り出しが完了しました!”, vbInformation
End Sub

3. このコードを理解するための「3つの重要ポイント」

初心者がマクロの記録から脱却するために、ぜひ知っておいてほしい「作法」を解説します。

① `GetBodies2` で対象を正確に掴む

`GetBodies2`メソッドは、パーツ内のすべてのボディを配列として返してくれます。ループ処理の基本は「配列を取得し、一つずつ取り出して操作する」こと。これだけで、複雑なアセンブリやパーツ操作も怖くありません。

② `ClearSelection2` の重要性

多くの初心者がハマる落とし穴が「選択状態の残り」です。前のループで選択したボディが選択されたまま次の処理に行くと、意図しないボディまで一緒に保存されてしまいます。「操作の前には必ずクリアする」。これがバグを未然に防ぐエンジニアの鉄則です。

③ `SaveSelectedBodiesExternal` の引数

このメソッドの第2引数に注目してください。これを `True` にすると、元のパーツファイルとのリンク(外部参照)が保持されます。将来的に元の形状を修正した際に、切り出したパーツにも変更を反映させたい場合は `True`、完全に独立させたい場合は `False` に設定します。用途に合わせて使い分けましょう。

4. 陥りやすいエラーとその回避策

  • 「ファイル名に使えない文字が含まれている」: `swBody.Name` には、稀にファイル名として不正な文字が含まれることがあります。もしエラーが出る場合は、`Replace` 関数などでファイル名から不正文字を除去する処理を1行挟むと完璧です。
  • 「保存先に同名ファイルがある」: 上記コードでは上書きされます。必要に応じて `Dir` 関数でファイルを確認し、重複時の処理(スキップや連番付与)を追加すると、より実用的になります。

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

今回紹介したコードは、あくまで「入り口」です。ここから、以下のようなカスタマイズが可能です。

  • ボディ名ではなく、カスタムプロパティの値を使ってファイル名を付ける。
  • 切り出したパーツに自動で材料設定を適用する。
  • アセンブリファイルに自動で組み込む処理を追加する。

SolidWorks VBAは、単なる「作業の効率化」を超えて、あなたの設計思想をコードに落とし込む強力な武器になります。まずは、このコードを動かして「自分だけのツール」を手に入れる喜びを味わってください。

もし分からないことがあれば、いつでも質問してくださいね。応援しています!

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