【入門編】【マルチボディ対応】Body2.GetBodyTypeとBody2.DeleteBodyを用いた、不要な接触ボディの自動判別とクリーンアップ処理 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して生成されるコードを眺める段階は、もう卒業しましたか?

今回は、SolidWorks VBA中級者へのステップアップとして、実務で猛威を振るう「マルチボディ環境における不要ボディの自動クリーンアップ処理」を解説します。

「ブーリアン演算(合体・カットなど)を行った結果、意図しない微小なデッドボディやゼロ体積のゴミが残ってしまい、下流の図面作成やアセンブリでエラーが出る…」
そんな現場の悲鳴を、たった数十行のスマートなVBAコードで綺麗に解決していきましょう。ここをクリアすれば、あなたのVBAスキルは確実に一段上のステージへ到達しますよ。

1. なぜ「デッドボディ」が発生するのか?

SolidWorksで複雑なパーツを設計しているとき、複数のソリッドボディを組み合わせる「マルチボディ」手法は非常に強力です。しかし、結合(Add)や削り取り(Cut)の演算処理を行った際、以下のような「負の遺産」が生まれがちです。

  • ゼロ体積ボディ: 面的・線的にしか接触しておらず、体積を持たない幽霊のようなボディ。
  • 微小な切り屑(スリバーボディ): 演算の端数処理で発生した、人間の目には見えないレベルのゴミボディ。

これらはファイルサイズを肥大化させるだけでなく、MassProperty(質量特性)の計算狂いや、後続のCAM・解析工程での致命的なエラーを引き起こします。これを人の手で一つずつツリーから探して削除するのは、まさに苦行です。だからこそ、APIで一網打尽に自動化する必要があるのです。

2. 攻略の鍵を握る2つのAPIオブジェクト

今回のプログラムの核心は、以下の2つのメソッドとプロパティを正しく理解し、使いこなすことにあります。

1. `PartDoc.GetBodies2`
パーツファイル内に存在するすべてのボディを一網打尽に取得する、いわば「網漁」のようなメソッドです。
2. `Body2.GetBodyType` と `Body2.DeleteBody`
取得した個々のボディ(`Body2`オブジェクト)が、本当に「ソリッド」なのかを判定し、不要であればメモリ上およびフィーチャツリーから抹殺(Delete)するための強力なツールです。

3. 実装コード:不要ボディ自動クリーンアップ・マクロ

それでは、開発環境(VBAエディタ)にそのまま貼り付けて即座に実行できる、実用的なコードを公開します。コード内のコメントをしっかりと読み込んで、APIの動きをイメージしてください。

Option Explicit

‘ ==============================================================================
‘ 担当:チーフアーキテクト
‘ テーマ:マルチボディ環境における不要ボディの自動検出とクリーンアップ
‘ 概要:パーツ内の全ボディを走査し、ソリッド以外のゴミや、
‘ 意図しないゼロ体積のデッドボディを自動判別して削除します。
‘ ==============================================================================
Sub CleanUpDeadBodies()

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

‘ カウンター用
法 deletedCount As Long
deletedCount = 0

‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ ドキュメントが開かれていない、またはパーツファイル以外の場合は弾く
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType <> swDocPART Then
MsgBox “このマクロは「パーツ(Part)ファイル」でのみ実行可能です。”, vbExclamation, “対象外”
Exit Sub
End If

Set swPart = swModel

‘ 2. パーツ内の全ソリッドボディを取得 (False = 履歴に依存しない最新状態のボディを取得)
vBodies = swPart.GetBodies2(swSolidBody, False)

If IsEmpty(vBodies) Then
MsgBox “処理対象となるソリッドボディが見つかりませんでした。”, vbInformation, “情報”
Exit Sub
End If

‘ 3. 取得したボディの配列をループで総チェック
For i = LBound(vBodies) To UBound(vBodies)
Set swBody = vBodies(i)

If Not swBody Is Nothing Then
‘ 【判定ロジック】
‘ 条件A: ボディタイプがソリッドであるか?
‘ 条件B: 体積(Volume)が極端にゼロに近くないか? (例: 0.000000001 mm^3 未満をゴミとみなす)
‘ ※実務の単位系(MKS / MMGS)に合わせてしきい値を調整してください。

Dim bodyVolume As Double
bodyVolume = swBody.Volume

‘ デバッグ用イミディエイト出力(挙動を可視化)
Debug.Print “Body[” & i & “] Volume: ” & bodyVolume & ” (m^3)”

‘ ゼロ体積、あるいは微小すぎるデッドボディの判定
If bodyVolume < 0.000000001 Then ' 4. 不要ボディの削除実行 ' DeleteBodyメソッドは、対応するフィーチャをツリーから削除します Dim success As Boolean success = swPart.DeleteBody(swBody) If success Then deletedCount = deletedCount + 1 Debug.Print " -> 削除成功: 不要なデッドボディをパージしました。”
Else
Debug.Print ” -> 削除失敗: 参照関係により削除できませんでした。”
End If
End If
End If
Next i

‘ 5. モデルの再構築(グラフィックスとジオメトリの同期)
swModel.ForceRebuild3 True

‘ 完了メッセージ
MsgBox “クリーンアップが完了しました。” & vbCrLf & _
“削除された不要ボディ数: ” & deletedCount & ” 件”, vbInformation, “処理終了”

End Sub

4. ここでつまずきやすい!実務での注意点とエラー対策

このコードを現場で走らせるにあたり、プログラミング初学者が陥りがちな罠と、その回避策をいくつか伝授しておきます。

① 単位系(Unit System)の罠

APIが返す `Volume`(体積)の基本単位は、ドキュメントの設定に関わらず「立法メートル ($\text{m}^3$)」であることがほとんどです。
そのため、MMGS(ミリメートル・グラム・秒)で設計している感覚で `bodyVolume < 0.1` などと指定すると、普通の小さな部品まですべて消し飛んでしまう大惨事になります。上記のコードで `0.000000001`($10^{-9}$)という極小の値を設定しているのはそのためです。自社の設計基準に合わせてこのしきい値は必ず調整してください。

② 外部参照や他のフィーチャからの依存関係

`DeleteBody` メソッドは非常に強力ですが、もしその不要ボディが「フィレット」や「穴」などの下流フィーチャから参照されている場合、APIが削除を拒否することがあります(コード内の `success` 変数が `False` を返すケースです)。
これを回避するためには、フィーチャのロールバック構造を考慮するか、あるいは直前のブーリアン演算フィーチャのパラメータを正しくコントロールすることが王道ですが、まずは「独立したゴミボディを消す」という目的において、このマクロは抜群の効果を発揮します。

5. おわりに:ここをクリアすれば、SolidWorks VBAの基本はバッチリ!

お疲れ様でした!今回は `GetBodies2` による配列の走査、`Volume` プロパティによる条件分岐、そして `DeleteBody` によるジオメトリのクリーンアップという、実務に直結する一連の流れを解説しました。

マクロの記録では絶対に手に入らない、「条件に応じて動的に判断し、データを自律的に綺麗に保つ」というエンジニアリングの醍醐味を、少しでも感じていただけたのではないでしょうか。

このコードをベースに、会社の定型業務や、毎日のルーティンワークに合わせたフィルター条件を組み込んでみてください。あなたの設計環境は、見違えるほどスマートでストレスフリーなものに生まれ変わるはずです。

それでは、次回の高度なAPI解説でお会いしましょう。よき自動化ライフを!

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