【入門編】【マルチボディ対応】Body2.GetVolumeとBody2.GetCenterOfMassを用いた複数ソリッドの物理特性個別抽出エンジン – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する:マルチボディの「個」を識別し、物理特性を完全抽出する技術

こんにちは。自動化の現場で血と汗を流してきた皆さんのために、今日は少し「一歩先」へ進むための話をしましょう。

「マクロの記録」に頼りきった開発は、いつか必ず行き詰まります。なぜなら、マクロ記録は「操作の追体験」に過ぎず、SolidWorksの裏側にある「オブジェクトの階層構造」を理解していないからです。

今回は、マルチボディパーツという「複数の個性が混在する空間」から、一つひとつのボディを正確に抽出し、その物理特性(体積、重心、表面積)をリストアップするエンジンを構築します。このコードを書けるようになれば、あなたの自動化スキルは間違いなく中級者の壁を越えます。

1. マルチボディを制御する「オブジェクトの階層」を理解する

SolidWorks APIにおいて、パーツファイルは単純な一枚の板ではありません。以下のようなツリー構造を意識してください。

  • ModelDoc2(ドキュメント全体)
  • PartDoc(パーツ特有の操作)
  • Body2(個々のソリッドボディ)

マクロ記録では決して触れられないこの`Body2`オブジェクトこそ、物理特性を司る「個」の単位です。ここをループ処理で走査するのが、今回の中核技術となります。

2. 実装コード:マルチボディ物理特性抽出エンジン

以下のコードをVBAエディタに貼り付けてください。単に動かすだけでなく、コメントを読み込み「なぜそのメソッドが必要なのか」を噛み締めてください。

Option Explicit

‘ メインプロシージャ:アクティブパーツ内の全ボディを走査する
Sub ExportBodyPhysicalProperties()
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 Integer

‘ 接続の確立
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Or swModel.GetType <> swDocPART Then
MsgBox “パーツファイルを開いてください。”
Exit Sub
End If

Set swPart = swModel

‘ パーツ内の全ソリッドボディを取得(タイプ指定: swSolidBody)
vBodies = swPart.GetBodies2(swSolidBody, False)

If IsEmpty(vBodies) Then Exit Sub

Debug.Print “名前, 体積(mm^3), 表面積(mm^2), 重心X, 重心Y, 重心Z”

‘ ボディの数だけループ処理
For i = 0 To UBound(vBodies)
Set swBody = vBodies(i)

‘ 物理特性の算出
Dim volume As Double
Dim area As Double
Dim com As Variant ‘ Center of Mass

volume = swBody.GetVolume
area = swBody.GetSurfaceArea
com = swBody.GetCenterOfMass

‘ イミディエイトウィンドウに出力(必要に応じてExcel等へ転記)
Debug.Print swBody.Name & “, ” & _
Format(volume, “0.00”) & “, ” & _
Format(area, “0.00”) & “, ” & _
Format(com(0) 1000, “0.00”) & “, ” & _
Format(com(1) 1000, “0.00”) & “, ” & _
Format(com(2) 1000, “0.00”)
Next i

MsgBox “抽出完了!イミディエイトウィンドウを確認してください。”
End Sub

3. このコードの「重要ポイント」を解説

① `GetBodies2` の重要性

多くの初心者が見落とすのが「どの種類のボディを取得するか」です。`swSolidBody`を指定することで、サーフェスや構築ジオメトリを除外した「質量を持つソリッド」だけを抽出しています。これにより、計算エラーや予期せぬ挙動を防ぎます。

② `GetCenterOfMass` の罠と単位

`GetCenterOfMass`が返す座標は、SolidWorksの内部単位である「メートル(m)」です。日本の設計現場で使われる「ミリメートル(mm)」に換算するために、コード内で` 1000`を掛けている点に注目してください。ここを忘れると、計算結果が10億倍ズレるという笑えないミスに繋がります。

③ なぜ「イミディエイトウィンドウ」なのか

VBAの初心者はすぐにセルに書き込みたがりますが、開発中は`Debug.Print`でイミディエイトウィンドウに結果を出すのが鉄則です。Excelへの書き込みは処理時間を浪費するため、まずはデータ取得のロジックを完成させ、最後にセル出力のコードを追加する――これがプロの効率化です。

4. 陥りやすいエラーと対策

  • 「オブジェクト変数または With ブロック変数が設定されていません」
  • 原因の9割は`Set`のし忘れです。VBAではオブジェクトを扱う際、必ず`Set`を使ってメモリ上のアドレスを割り当てる必要があります。
  • 計算が異常に遅い
  • ボディ数が多い場合、ループの中で`swModel.ForceRebuild3`などを呼んでいないか確認してください。再構築は非常に重い処理です。物理特性の取得だけなら、再構築は不要なケースがほとんどです。

最後に:ここをクリアすれば、あなたは「自動化エンジニア」です

マルチボディの制御は、SolidWorks APIの入り口であると同時に、最も応用範囲が広い技術です。これさえマスターすれば、設計変更のたびに手作業で質量特性を確認していた時間は、すべて自動化の恩恵へと変わります。

もし行き詰まったら、一度立ち止まって「いま自分が触っているのはどの階層のオブジェクトか?」と自問してみてください。その視点を持つだけで、あなたのコードは劇的に堅牢になります。

さあ、次のスクリプトを書いてみましょう。あなたの自動化の旅を、心から応援しています。

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