SolidWorks VBAを掌握する:`IMassProperty2`で導く「慣性モーメント」の自動検証術
こんにちは。SOLIDWORKSのAPIという、深く、そして広大な庭へようこそ。
「マクロの記録」ボタンを押して、生成されたコードの羅列に頭を抱えた経験はありませんか? もちろん、それは学習の第一歩です。しかし、そこから一歩踏み出し、「オブジェクトのライフサイクル」を意識できるようになれば、あなたの設計業務は劇的に変わります。
今日は、単なる「重さ」の取得を超えた、製品の挙動を左右する慣性モーメントと主軸(Principal Axes)の自動算出という、エンジニアの深淵に触れるテーマを解説します。
—
1. なぜ「質量特性」をAPIで叩くのか?
設計の現場では、重量計算はExcel、慣性モーメントは手動で再確認……そんな非効率な「転記作業」がボトルネックになりがちです。
SOLIDWORKSの`IMassProperty2`インターフェースを使えば、重心位置(Center of Mass)だけでなく、慣性テンソル(Inertia Tensor)や主軸の傾きまで、プログラムが瞬時にExcelへ引き渡してくれます。これは、回転体や動的バランスが重要な設計において、ヒューマンエラーを排除する最強の武器になります。
—
2. オブジェクトモデルの「階層」を理解する
まず、私たちが対話すべき相手を整理しましょう。
- `SldWorks`: SolidWorksアプリケーションそのもの。全ての始まり。
- `ModelDoc2`: 現在開いているドキュメント(部品やアセンブリ)。
- `IMassProperty2`: モデルの質量特性を計算する専用エンジン。
ここが重要です: `IMassProperty2`は、モデルを開いた瞬間に値を持っているわけではありません。「計算せよ」という命令を送ることで、初めてメモリ上に値がロードされるのです。
—
3. 実践:慣性モーメント取得コード
以下のコードは、アクティブなモデルの質量特性を取得し、イミディエイトウィンドウに慣性テンソルを出力する構成です。
Option Explicit
Sub GetInertiaProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMassProp As SldWorks.IMassProperty2
Dim vInertia As Variant
‘ 1. SldWorksインスタンスの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”
Exit Sub
End If
‘ 2. 質量特性オブジェクトの生成
Set swMassProp = swModel.Extension.CreateMassProperty
‘ 3. 計算実行(ここが肝!これを忘れると値が更新されません)
swMassProp.UseSystemUnits = True ‘ システム単位系を使用
‘ 4. 慣性テンソルの取得(重心を基準とした慣性モーメント)
‘ 結果は配列(0 to 8)で返される(行列形式)
vInertia = swMassProp.GetInertia(swMassPropertyInertiaFrame_PrincipalAxes)
‘ 5. 結果の確認
Debug.Print “主軸方向の慣性モーメント (Ixx, Iyy, Izz):”
Debug.Print “Ixx: ” & vInertia(0)
Debug.Print “Iyy: ” & vInertia(4)
Debug.Print “Izz: ” & vInertia(8)
End Sub
—
4. 陥りやすい「罠」と解決策
初学者が必ず突き当たる壁が2つあります。
① 「値が更新されない」問題
モデルの形状を少し変更した直後にマクロを実行すると、古い計算値が返ってくることがあります。これは`IMassProperty2`がキャッシュされた値を見ているためです。
- 解決策: 計算前に `swModel.ForceRebuild3 False` を実行するか、`swMassProp.Update` を明示的に呼び出す癖をつけましょう。
② 単位系の取り扱い
APIは内部的に「メートル・キログラム・秒」系で計算します。ドキュメント単位系と異なる場合、数値が桁違いに見えることがあります。
- 解決策: `swMassProp.UseSystemUnits = True` を設定するか、取得した値を自ら変換するルーチンを一つ噛ませることで、設計計算書との乖離を防げます。
—
5. 次のステップ:Excelとのリンク
ここまでの知見があれば、あとは `GetObject(,”Excel.Application”)` を使って、取得した慣性モーメントの配列をセルに流し込むだけです。
`vInertia(0)` から `vInertia(8)` までの9つの値は、慣性テンソル行列そのものです。これをExcel上の計算式にリンクさせれば、「設計変更→ボタン一つでExcelの強度計算書が最新化」という、夢のような自動化環境が手に入ります。
—
先輩エンジニアからのメッセージ
VBAは、単なる「退屈な事務作業の効率化ツール」ではありません。それは、SOLIDWORKSという巨大なエンジンの内部構造を操作し、設計者の意図を幾何学的計算に投影するための「魔法の杖」です。
今日学んだ `IMassProperty2` の考え方は、他のオブジェクト(`Feature` や `Component`)を扱う際にもそのまま応用できます。まずは、このコードを動かして、イミディエイトウィンドウに出力される数字の重みを感じてみてください。
さあ、次はどの機能を自動化して、エンジニアとしての時間を創造しましょうか? 応援しています。
