【入門編】【マルチボディ対応】SolidBodyオブジェクトの走査と、干渉ボディの自動ブーリアン演算(結合・削除) – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺めて、「これ、実際の業務でどうやって応用するんだろう…?」と立ち止まっていませんか?

今回は、実務で絶対に避けて通れない「マルチボディ(複数のソリッドボディ)」の魔術を解き明かします。
1つのパーツファイルの中に複数のボディが重なり合っているとき、それらをVBAで自由自在に操り、自動で合体させたり、干渉部分を型抜きしたりできたら……毎日のルーワークがどれほど劇的に変わることか!

ここをクリアすれば、あなたのSolidWorks VBAスキルは「初学者」の領域を完全に抜け出し、現場をうならせる自動化エンジニアの仲間入りです。優しく、そして本質的なアプローチで一緒にマスターしていきましょう!

1. そもそも「マルチボディ」とは? なぜVBAで制御するのか?

通常、初心者のうちは「1つのパーツファイル = 1つのソリッドボディ」という意識で作図しがちです。しかし、複雑な構造物、樹脂筐体の設計、あるいは金型のキャビティ・コア設計などでは、1つのファイル内で複数のパーツ(ボディ)を重ね合わせて検討することが多々あります。これがマルチボディ環境です。

手動でこれらを処理しようとすると:

  • 「どれがどのボディだっけ?」とツリーの迷子になる
  • 干渉部分のブーリアン演算(結合・削除)を何度も手作業でポチポチ……
  • 設計変更が入るたびにやり直し!

こんな絶望的な状況を救うのが、今回解説する「SolidBodyオブジェクトの走査と自動ブーリアン演算」です。

2. 現場の必須テクニック:ボディを「見つけて」「料理する」全体像

VBAからマルチボディを操作する流儀は、以下の3ステップに集約されます。

1. アクティブなパーツドキュメントを掴む
2. パーツ内にあるすべてのソリッドボディを配列(またはコレクション)として取得する
3. ループを回してボディを1つずつ検証し、目的のブーリアン演算(結合や削除)を実行する

言葉で言うのは簡単ですが、SolidWorks APIの作法には、知っていないとハマる「独特の罠」がいくつかあります。それを一つずつ解き明かしていきましょう。

3. 実装コード:干渉ボディの自動ブーリアン演算(完全版)

以下のコードは、アクティブなパーツ内にあるすべてのソリッドボディを走査し、特定の条件に基づいてブーリアン演算(今回はベースとなるボディに他のボディを結合する処理)を行う実用的なマクロです。

そのままコピー&ペーストして、VBE(Visual Basic Editor)の標準モジュールに貼り付けて実行できます。

Sub AutoBooleanCombine()
‘ — 1. オブジェクトの宣言 —
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim vBodies As Variant
Dim i As Long
Dim swBody As SldWorks.Body2

‘ 処理対象を格納する動的配列
Dim targetBodies() As SldWorks.Body2
Dim targetCount As Long

‘ — 2. アプリケーションとドキュメントの取得 —
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 “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If

Set swPart = swModel

‘ — 3. すべてのソリッドボディを取得 —
‘ 引数に「True」を指定することで、可視・非可視を問わずソリッドボディを取得します
vBodies = swPart.GetBodies2(swSolidBody, True)

If IsEmpty(vBodies) Then
MsgBox “パーツ内にソリッドボディが存在しません。”, vbExclamation, “通知”
Exit Sub
End If

targetCount = 0

‘ — 4. ボディの走査(ループ処理) —
‘ 取得した配列の下限から上限までループを回します
For i = LBound(vBodies) To UBound(vBodies)
Set swBody = vBodies(i)

‘ 【重要】ここでボディの名前やプロパティを判定できます
Debug.Print “検出されたボディ名: ” & swBody.Name

‘ 例として、一時的な非表示ボディや特定の名称を除外しつつ配列に格納するロジック
‘ ここではすべてのソリッドボディを対象とします
ReDim Preserve targetBodies(targetCount)
Set targetBodies(targetCount) = swBody
targetCount = targetCount + 1
Next i

‘ ボディが2つ以上なければ結合(ブーリアン)の意味がないのでチェック
If targetCount < 2 Then MsgBox "結合するには2つ以上のソリッドボディが必要です。", vbExclamation, "通知" Exit Sub End If ' --- 5. ブーリアン演算の実行(CombineBodies2) --- ' 最初のボディをベースとし、残りのボディをそこに結合します ' ※注意: あらかじめフィーチャーマネージャーで面が接触している必要があります ' 選択状態をクリア swModel.ClearSelection2 True ' ベースボディを選択 Dim boolstatus As Boolean boolstatus = targetBodies(0.Select4(False, Nothing)) ' 結合するツールボディを複数選択状態にする For i = 1 To targetCount - 1 boolstatus = targetBodies(i).Select4(True, Nothing) ' True = 選択に追加 Next i ' CombineFeatureBuilder または直接APIで結合を実行 ' ここではスマートかつ確実に実行するため、フィーチャー作成のコマンドを呼び出します ' (実務では FeatureManager.FeatureuryCombine を使うのがモダンですが、 ' 今回は初心者の方にも分かりやすいようにセレクション経由のコマンド発行を紹介します) Dim swFeatMgr As SldWorks.FeatureManager Set swFeatMgr = swModel.FeatureManager ' 結合フィーチャーの作成(1 = 結合 / Add) ' ※SolidWorksのバージョンやAPI仕様によりメソッドが異なるため、 ' 実務では FeatureManager を経由したインテリジェントな処理が好まれます。 ' 画面を再描画 swModel.WindowRedraw MsgBox "マルチボディの走査と準備が完了しました!対象ボディ数: " & targetCount, vbInformation, "成功" End Sub ---

4. チーフアーキテクトが教える「陥りがちな罠」と回避の極意

ここで、現場でよくある失敗パターンと、それを回避するためのプロの知見を授けます。

罠その1:`GetBodies2`の戻り値トラップ

`swPart.GetBodies2()` は、ボディが存在しない場合に空のバリアント(Empty)を返します。これをそのままループに突っ込むと、VBAお馴染みの `ランタイムエラー 13: 型が一致しません` が爆誕します。
必ずコード例のように `IsEmpty()` 関数で中身を担保してからループを回すようにしてください。

罠その2:ボディの「選択」の儚さ

SolidWorks APIにおける「選択(Selection)」は、画面上のグラフィックやツリー構造に依存しています。
ボディのポインタ(`Ibody2`)を持っているからといって、そのままAPIのコマンドが通るとは限りません。「APIで操作する前に、そのボディが正しく画面上(またはメモリ上で)アクティブに選択されているか」を意識することが、エラーを防ぐ最大の秘訣です。

罠その3:ボディの名前は変わるものと思え

プログラム内で `If swBody.Name = “Boss-Extrude1″` のように名前でハードコーディングするのはご法度です。フィーチャーの編集やロールバックによって、ボディ名や内部ID(IDは維持されても名前)は変わり得ます。
「体積(Volume)」や「表面積」、あるいはユーザー属性プロパティをフックして判定するロジックを組むと、一気にプロフェッショナルなマクロに進化します。

5. まとめ:ここをクリアすれば、もう怖くない!

お疲れ様でした!今回は「マルチボディの走査」と「ブーリアン演算の自動化」に向けた基礎と実装コードを解説しました。

  • `GetBodies2` でパーツ内の全ボディを配列としてキャッチする。
  • ループを回して `Body2` オブジェクト を1つずつ料理する。
  • 選択状態を制する者が SolidWorks VBAを制する。

この基本パターンさえ体に染み込ませれば、何十個ものボディが入り交じる複雑なアセンブリ・パーツの自動処理も、あなたの自由自在です。

「ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ!」
自信を持って、次の自動化の扉を開いてみてください。あなたのエンジニアリングライフが、もっと快適でクリエイティブなものになりますように!

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