こんにちは!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解説でお会いしましょう。よき自動化ライフを!
