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の入り口であると同時に、最も応用範囲が広い技術です。これさえマスターすれば、設計変更のたびに手作業で質量特性を確認していた時間は、すべて自動化の恩恵へと変わります。
もし行き詰まったら、一度立ち止まって「いま自分が触っているのはどの階層のオブジェクトか?」と自問してみてください。その視点を持つだけで、あなたのコードは劇的に堅牢になります。
さあ、次のスクリプトを書いてみましょう。あなたの自動化の旅を、心から応援しています。
