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

スポンサーリンク

【SolidWorks VBA極意】マルチボディを制する!個別ソリッド抽出&独立保存の自動化術

こんにちは。SolidWorksの自動化を極める諸君。
「マクロの記録」ボタンを押すだけのエンジニアから卒業し、APIの深淵へと足を踏み入れようとしている君たちを歓迎するよ。

今回取り上げるのは、「マルチボディパーツの分解・保存」という、実務で最も要望が多く、かつ多くの初心者が挫折する難所だ。1つのファイルの中に複数のソリッドが混在しているとき、それを個別のパーツとして切り出し、命名して保存する。これができれば、君の業務効率は間違いなく10倍に跳ね上がる。

準備はいいか? 泥臭い手作業を過去のものにするための「真の自動化」を教えよう。

1. なぜ「BodyFolder」を攻略する必要があるのか?

SolidWorksのフィーチャーツリーを見ると、一番上に「ソリッドボディ」というフォルダがあるよね。APIの世界では、これを `BodyFolder` オブジェクトとして扱う。

多くの人がやってしまう失敗は、「FeatureManagerを無理やり走査して、名前を探そうとする」ことだ。これは遠回りすぎる。APIには、「そこにあるものを、ただ取り出す」ための専用の口が用意されている。それが `BodyFolder.GetBodies` メソッドだ。

ここが重要:オブジェクトのライフサイクル

SolidWorksのAPIにおいて、ソリッドボディは「メモリ上に存在する幾何学的実体」だ。これらを `Body` オブジェクトとして配列で取得し、それぞれを新しいパーツファイルに「挿入(Insert)」して保存する。この流れを理解すれば、どんな複雑なマルチボディも君の支配下に置ける。

2. 実践!マルチボディ自動抽出コード

以下に、実務でそのまま使える堅牢なコードを書き下ろした。まずはこれを自分の環境で走らせてみてくれ。

Option Explicit

‘ 伝説のエンジニアが教える:マルチボディ抽出スクリプト
Sub ExportSolidBodiesToParts()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swBodyFolder As SldWorks.BodyFolder
Dim bodies As Variant
Dim i As Integer
Dim swBody As SldWorks.Body2
Dim swNewPart As SldWorks.PartDoc

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

‘ パーツファイル以外では実行させない(エラーハンドリングの基本)
If swModel.GetType <> swDocPART Then
MsgBox “パーツファイルを開いてから実行してください。”
Exit Sub
End If

Set swPart = swModel
‘ ソリッドボディフォルダを取得
Set swBodyFolder = swPart.BodyFolder

‘ ボディ配列を取得
bodies = swBodyFolder.GetBodies

For i = 0 To UBound(bodies)
Set swBody = bodies(i)

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

‘ ボディをコピーして新規パーツに挿入(ここが肝!)
‘ Body.Copyでメモリを複製し、新しいパーツのフィーチャとして追加する
swNewPart.CreateFeatureFromBody swBody.Copy, False

‘ 保存処理(ここではデスクトップに連番で保存する例)
Dim savePath As String
savePath = Environ(“USERPROFILE”) & “\Desktop\Body_” & i + 1 & “.sldprt”
swNewPart.SaveAs savePath

‘ メモリ解放
swNewPart.CloseDoc
Next i

MsgBox “抽出完了!”
End Sub

3. コードを読み解く:エンジニアの視点

このコードの核となるポイントを3つだけ解説する。ここを理解すれば、君はもう初心者じゃない。

1. `swBody.Copy` の意味:
APIでボディを扱うとき、そのまま渡すとメモリの参照先が競合してクラッシュすることがある。`.Copy` を使うことで、独立したインスタンスを作成し、安全に別ファイルへコピーしているんだ。この「オブジェクトの複製」の作法は、API開発の基本中の基本だよ。
2. `swApp.NewDocument`:
テンプレートファイルを使用して新規パーツを生成している。ここをあえて `swApp.NewPart` としないのは、会社指定のテンプレートを反映させるためだ。実務ではこういう「細かい気遣い」が、エラーを防ぐ。
3. `UBound(bodies)`:
配列の終わりまでループする標準的な作法だが、マルチボディが0個の場合にエラーを吐かないよう、本来は `If IsEmpty(bodies) Then` でチェックを入れるのがプロの流儀だ。

4. 陥りやすい罠と解決策

  • 「名前で保存したいのに!」:

今回は簡略化のために連番で保存しているが、`swBody.Name` を取得してファイル名にすればいい。ただし、ボディ名にはファイル名に使えない記号が含まれることがある。`Replace` 関数で不正文字を排除する処理を加えるのを忘れないように。

  • 「面や線が消える!」:

`Body.Copy` はジオメトリのみをコピーする。フィーチャ履歴は引き継がれない。もし履歴が必要なら、`swPart.InsertPart` を検討する必要があるが、それはまた別の深い話だ。

最後に:君へのメッセージ

VBAは古臭い言語だと言われることもある。だが、SolidWorksの内部構造と直接対話できるこの言語は、設計者の思考を高速化させる最強の武器だ。

まずはこのコードをいじってみることだ。自分のデスクにある、一番複雑なマルチボディパーツで試してほしい。もしエラーが出たら、それは君が「さらに深く理解するためのチャンス」を得たということだ。

エラーを恐れるな。ログを読み、APIヘルプを紐解き、そしてまたコードを書く。その繰り返しこそが、伝説のエンジニアへの唯一の道だ。

分からないことがあれば、いつでもまた聞きに来るといい。君の挑戦を応援しているよ。

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