【テクニカル・上級編】【質量特性の高度な活用】IMassProperty2による主軸方向・慣性モーメントの自動算出と設計検証レポート生成 – SolidWorks VBA解析バイブル

スポンサーリンク

【質量特性の高度な活用】IMassProperty2による主軸方向・慣性モーメントの自動算出と設計検証レポート生成

SolidWorks VBAの限界領域に踏み込むエンジニア諸君。標準の「ファイルプロパティ」から質量や重心を取得して満足している時代は終わった。
動的解析、振動モードの予測、あるいは回転体の動釣合(バランス調整)において、真に求められるのは「慣性テンソル」であり、「主軸方向(Principal Axes)」の厳密な幾何学的一致である。

今回は、`IMassProperty2`インターフェースを極限まで使い倒し、計算コストの重い質量特性の算出プロセスを制御下に入れ、さらにExcelへの自動レポート生成までを完結させる実務直結のアーキテクチャを提示する。

1. 現場の現実:なぜ `IMassProperty2` なのか?

標準の `IModelDoc2::Extension.CreateMassProperty` は、レガシーな `IMassProperty` を返す。これの何が問題か?
非表示コンポーネントの扱い、コンフィギュレーションの切り替え遅延、そして何より座標系(Coordinate System)の動的指定におけるメモリリークと精度の欠如だ。

`IMassProperty2` を手に入れた我々は、以下の制御が可能になる。

  • アセンブリ内の特定「座標系(CoordSys)」を基準とした慣性モーメントの即時抽出。
  • 主モーメント(Principal Moments of Inertia)と主軸方向ベクトル(Principal Axes)の数学的担保。
  • 計算プロセスの非同期に近い効率化と、COMオブジェクトの正確なライフサイクル管理。

2. アーキテクチャの要件とメモリ最適化の哲学

VBAにおけるSolidWorks API開発の最大の悪夢は、COMオブジェクトの解放漏れによるメモリ肥大化とSolidWorksプロセスのゾンビ化である。
特に質量特性の計算は、内部で膨大なメッシュ・境界計算を行うため、ラッパーオブジェクトがメモリ上に残りやすい。

以下の鉄則を遵守せよ:
1. インスタンスの局所化: 取得した `IMassProperty2` はスコープを抜けたら即座に `Set obj = Nothing` で参照を断つ。
2. エラーハンドリングの徹底: アセンブリの形状エラー(ゼロ容積、面抜け)でAPIがハングするのを防ぐため、必ず成否判定(Boolean戻り値)を評価する。

3. 実装コード:慣性テンソル・主軸算出エンジン

以下に、アクティブなモデルから `IMassProperty2` を召喚し、重心、主モーメント、主軸ベクトルを配列として抽出し、Excelへ出力するプロトタイプコードを公開する。

Option Explicit

‘ ==============================================================================
‘ 固有技術領域: SolidWorks VBA / IMassProperty2 慣性テンソル自動算出
‘ アーキテクト仕様: オブジェクトの明示的解放とエラーバリアントの完全制御
‘ ==============================================================================
Sub GenerateMassPropertyReport()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMassProp As SldWorks.MassProperty2
Dim bRet As Boolean

‘ 1. アプリケーション・ドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “有効なドキュメントが開かれていません。”, vbCritical, “致命的エラー”
Exit Sub
End If

‘ 2. 質量特性オブジェクトの生成 (IMassProperty2)
‘ 引数: 構成部品設定名(空欄=アクティブ), 選択セット使用有無(False), 座標系指定(Nothing=デフォルト)
Set swMassProp = swModel.Extension.CreateMassProperty2()

If swMassProp Is Nothing Then
MsgBox “IMassProperty2のインスタンス生成に失敗しました。”, vbCritical
Exit Sub
End If

‘ 3. 計算精度の設定 (High: True, Low: False)
swMassProp.UseSystemUnits = True
swMassProp.IncludeHiddenBodies = False ‘ 非表示ボディは除外

‘ 4. データ抽出バッファの定義
Dim dVolume As Double, dArea As Double, dMass As Double
Dim vCenterOfMass As Variant
Dim vMoments As Variant
Dim vPrinMoments As Variant
Dim vPrinAxes As Variant

On Error GoTo ErrorHandler

‘ 質量・体積・表面積
dVolume = swMassProp.Volume
dArea = swMassProp.SurfaceArea
dMass = swMassProp.Mass

‘ 重心座標 (X, Y, Z) -> Variant(Array of Doubles)
vCenterOfMass = swMassProp.CenterOfMass

‘ 慣性モーメント (重心まわり、あるいは座標系まわり)
‘ 引数 0: 慣性テンソル(重心基準), 引数 1: 座標系基準
vMoments = swMassProp.GetMomentOfInertia(0)

‘ 主慣性モーメント (Principal Moments of Inertia: Ixx, Iyy, Izz)
vPrinMoments = swMassProp.PrincipalMomentsOfInertia

‘ 主軸方向ベクトル (3×3 行列として取得される)
vPrinAxes = swMassProp.PrincipalAxesOfInertia

‘ 5. Excelレポートの動的生成
Call ExportToExcel(swModel.GetTitle(), dMass, dVolume, dArea, vCenterOfMass, vMoments, vPrinMoments, vPrinAxes)

‘ 6. 正常終了時のオブジェクト解放
Set swMassProp = Nothing
Set swModel = Nothing
Set swApp = Nothing

MsgBox “設計検証レポートの生成が正常に完了しました。”, vbInformation, “完了”
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “例外トラップ”
‘ 異常終了時も確実なメモリ解放
Set swMassProp = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

‘ ==============================================================================
‘ Excel連携プロシージャ: 構造化データのマッピング
‘ ==============================================================================
Private Sub ExportToExcel(DocTitle As String, Mass As Double, Volume As Double, Area As Double, _
CM As Variant, Moments As Variant, PrinMoments As Variant, PrinAxes As Variant)

Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object

‘ Excelの遅延バインディング(バージョン依存性の排除)
Set xlApp = CreateObject(“Excel.Application”)
xlApp.Visible = True
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “設計検証レポート”

With xlWs
.Cells(1, 1).Value = “SolidWorks 質量特性・主軸検証レポート”
.Cells(2, 1).Value = “対象モデル:”
.Cells(2, 2).Value = DocTitle

.Cells(4, 1).Value = “物理特性”
.Cells(5, 1).Value = “質量 (kg)”
.Cells(5, 2).Value = Mass
.Cells(6, 1).Value = “体積 (m^3)”
.Cells(6, 2).Value = Volume
.Cells(7, 1).Value = “表面積 (m^2)”
.Cells(7, 2).Value = Area

.Cells(9, 1).Value = “重心座標 (m)”
.Cells(10, 1).Value = “X”: .Cells(10, 2).Value = CM(0)
.Cells(11, 1).Value = “Y”: .Cells(11, 2).Value = CM(1)
.Cells(12, 1).Value = “Z”: .Cells(12, 2).Value = CM(2)

.Cells(14, 1).Value = “主慣性モーメント (kgm^2)”
.Cells(15, 1).Value = “I1 (最大)”: .Cells(15, 2).Value = PrinMoments(0)
.Cells(16, 1).Value = “I2 (中間)”: .Cells(16, 2).Value = PrinMoments(1)
.Cells(17, 1).Value = “I3 (最小)”: .Cells(17, 2).Value = PrinMoments(2)

.Cells(19, 1).Value = “主軸方向ベクトル”
.Cells(20, 1).Value = “Axis X”: .Cells(20, 2).Value = PrinAxes(0): .Cells(20, 3).Value = PrinAxes(1): .Cells(20, 4).Value = PrinAxes(2)
.Cells(21, 1).Value = “Axis Y”: .Cells(21, 2).Value = PrinAxes(3): .Cells(21, 3).Value = PrinAxes(4): .Cells(21, 4).Value = PrinAxes(5)
.Cells(22, 1).Value = “Axis Z”: .Cells(22, 2).Value = PrinAxes(6): .Cells(22, 3).Value = PrinAxes(7): .Cells(22, 4).Value = PrinAxes(8)
End With

‘ オブジェクト解放
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
End Sub

4. チーフアーキテクトからの実践的提言

1. 単位系(Units)の罠
`IMassProperty2` が返す値は、SolidWorksドキュメント側のドキュメント単位系(IPS, MKSなど)に依存する。厳密なCAE連携やPLMシステムへのアップロードを行う場合は、必ず `swMassProp.UseSystemUnits = True` を明示し、SI単位系(kg, m)へ強制的に正規化するロジックを挟むこと。
2. 大規模アセンブリにおけるパフォーマンス
数万点を抱えるアセンブリでこれを無策に実行すると、UIスレッドがロックされる。もしバックグラウンドでのバッチ処理(タスクスケジューラ連携など)を行う場合は、`swModel.Visible = False` の状態でドキュメントをサイレントロードし、メモリ消費量を極限まで抑えた上で本ルーチンを適用せよ。

型安全性を担保し、COMのライフサイクルを支配するものだけが、真のSolidWorks自動化を制する。コードの海で溺れるな、常にメモリとポインタの先を見据えよ。

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