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

スポンサーリンク

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

開発現場のリーダーである私から、設計検証の自動化において避けて通れない「質量特性の極限活用」について話をしよう。

図面や3Dモデルの重心位置や質量を求めるだけなら、SolidWorksの標準機能や、ありふれた`.Extension.GetMassProperties`の呼び出しで十分だ。しかし、回転機械の動的バランス評価、ロボットアームの動力学シミュレーション、あるいは輸送時の耐荷重解析を行うフェーズにおいて、それらの情報だけで設計を通過させるのは「怠慢」と言わざるを得ない。

我々が求めるべきは、単なるスカラー値の質量ではない。
「慣性テンソル(慣性モーメント)」であり、さらにその物理的意味を直感的に捉えるための「主軸方向(Principal Axes)」の正確なベクトルだ。

今回は、`IMassProperty2`インターフェースを完全に手なずけ、計算コストの重いSolidWorksのCOMオブジェクトとスマートにやり取りしながら、実務に耐えうる堅牢なExcel設計検証レポートを自動生成するプロダクションコードを伝授する。

1. なぜ「普通の質量プロパティ取得」では実務で破綻するのか?

多くの初学者が犯す最大の過ちは、ドキュメントの表面をなぞっただけのコードを書き、大規模アセンブリでフリーズやメモリリークを引き起こすことだ。

陥りがちな罠

1. 暗黙の再計算(Rebuild)のコスト無視
コンフィギュレーションが切り替わった直後や、モデルが完全に解決(Resolve)されていない状態で質量特性を叩くと、SolidWorksは裏で重い再計算を走らせる。これにより、VBA側でスレッドがロックされたような挙動に陥る。
2. 配列境界の誤認(Variant型の爆弾)
`IMassProperty2::GetPrincipalMomentsOfInertia` や `GetPrincipalAxesらしきメソッド` が返す配列は、VARIANT型の0始まり動的配列だ。SAFEARRAYの安全なアンパック処理を怠ると、一発で「型が一致しません」のRuntimeエラーの餌食になる。
3. COMオブジェクトのライフサイクル管理の欠如
`IMassProperty2` オブジェクトは、モデルドキュメントから都度生成(Create)される。これを適切に解放(`Set massProp = Nothing`)せずループを回すと、SolidWorksのプロセスが肥大化し、最終的にCOM例外で落ちる。

これらを完全にクリアする「プロフェッショナルな設計」をコードで示そう。

2. プロダクションコード:IMassProperty2 抽出エンジン

以下のコードは、アクティブなSolidWorksドキュメント(部品またはアセンブリ)から、高精度な慣性テンソル、重心、主モーメント、そして主軸方向のベクトルを一網打尽にし、Excelへエレガントに出力する完全版のVBAスクリプトだ。

エディタに貼り付けてそのまま動かせるよう、エラーハンドリングとCOM解放の作法を徹底している。

Option Explicit

‘ =================================================================================
‘ módulo: ModMassPropertyValidator
‘ 概要: IMassProperty2を用いた高精度質量特性・主軸方向の自動算出とExcelレポート生成
‘ アーキテクトノート:
‘ 大規模アセンブリでの負荷を考慮し、ドキュメントの解決状態チェックと
‘ 厳密なCOMオブジェクトのライフサイクル管理を実装。
‘ =================================================================================

Public Sub GenerateDesignValidationReport()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMassProp As SldWorks.MassProperty2
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object

‘ 1. SolidWorks アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “致命的エラー”
Exit Sub
End If

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。部品またはアセンブリを開いてください。”, vbExclamation, “警告”
Exit Sub
End If

‘ ドキュメントタイプの検証 (2 = 部品, 3 = アセンブリ)
If swModel.GetType <> swDocPART And swModel.GetType <> swDocASSEMBLY Then
MsgBox “このマクロは部品(Part)またはアセンブリ(Assembly)でのみ実行可能です。”, vbCritical, “対象外ドキュメント”
Exit Sub
End If

‘ 2. MassProperty2 オブジェクトの生成
‘ 第1引数: 0 = デフォルトコンフィギュレーション / 1 = 全ての設定
‘ 第2引数: False = 隠しボディを除外
Set swMassProperty = swModel.Extension.CreateMassProperty()
If swMassProperty Is Nothing Then
MsgBox “MassPropertyオブジェクトの生成に失敗しました。”, vbCritical, “API Error”
Exit Sub
End If

‘ 計算精度の強制(High): 速度より精度を優先
swMassProperty.UseSystemUnits = False ‘ SI単位系(kg, meters等)を強制する場合

‘ 3. 基本物理量の取得
Dim dMass As Double
Dim dVolume As Double
Dim dSurfaceArea As Double
Dim vCenterOfMass As Variant

dMass = swMassProperty.Mass
dVolume = swMassProperty.Volume
dSurfaceArea = swMassProperty.SurfaceArea
vCenterOfMass = swMassProperty.CenterOfMass ‘ 配列(0-2): X, Y, Z

‘ 4. 慣性テンソルの取得 (重心周りの慣性モーメント: GCS基準 / 3×3行列)
‘ 戻り値は Variant型のアレイ (0-8の9要素、または特定の形式)
Dim vMoments As Variant
vMoments = swMassProperty.GetMomentOfInertia(swMassPropertyBodyCoordinateSystem)

‘ 5. 主慣性モーメントと主軸方向の取得 (IMassProperty2の真骨頂)
Dim vPrincipalMoments As Variant
Dim vPrincipalAxes As Variant

‘ 主慣性モーメント (Ixx, Iyy, Izz)
vPrincipalMoments = swMassProperty.PrincipleMomentsOfInertia

‘ 主軸方向ベクトル (3軸分 x 各3成分 = 計9成分の配列が返る)
vPrincipalAxes = swMassProperty.GetPrincipalAxes

‘ 6. Excel レポートの生成(Late Bindingによる堅牢なExcel操作)
On Error Resume Next
Set xlApp = CreateObject(“Excel.Application”)
On Error GoTo 0

If xlApp Is Nothing Then
MsgBox “Excelの起動に失敗しました。インストール状態を確認してください。”, vbCritical, “Excel Error”
GoTo CleanUp
End If

xlApp.Visible = True
Set xlWb = xlApp.Workbooks.Add
Set xlWs = xlWb.Sheets(1)
xlWs.Name = “設計検証レポート_質量特性”

‘ 7. Excelへのデータ流し込みとフォーマット
With xlWs
.Range(“A1”).Value = “SolidWorks 高度質量特性・主軸検証レポート”
.Range(“A1”).Font.Size = 16
.Range(“A1”).Font.Bold = True

.Range(“A3”).Value = “評価対象ファイル:”: .Range(“B3”).Value = swModel.GetPathName
.Range(“A4”).Value = “コンフィギュレーション:”: .Range(“B4”).Value = swModel.ConfigurationManager.ActiveConfiguration.Name

‘ 基本特性
.Range(“A6”).Value = “【基本質量特性】”
.Range(“A7”).Value = “質量 (kg)”: .Range(“B7”).Value = dMass
.Range(“A8”).Value = “体積 (m^3)”: .Range(“B8”).Value = dVolume
.Range(“A9”).Value = “表面積 (m^2)”: .Range(“B9”).Value = dSurfaceArea

.Range(“A11”).Value = “重心位置 (m)”
.Range(“A12”).Value = “X”: .Range(“B12”).Value = vCenterOfMass(0)
.Range(“A13”).Value = “Y”: .Range(“B13”).Value = vCenterOfMass(1)
.Range(“A14”).Value = “Z”: .Range(“B14”).Value = vCenterOfMass(2)

‘ 主慣性モーメント
.Range(“A16”).Value = “【主慣性モーメント (kgm^2)】”
.Range(“A17”).Value = “主慣性 1”: .Range(“B17”).Value = vPrincipalMoments(0)
.Range(“A18”).Value = “主慣性 2”: .Range(“B18”).Value = vPrincipalMoments(1)
.Range(“A19”).Value = “主慣性 3”: .Range(“B19”).Value = vPrincipalMoments(2)

‘ 主軸方向ベクトル
.Range(“A21”).Value = “【主軸方向ベクトル (単位系)】”
.Range(“A22”).Value = “軸1 (X, Y, Z)”: .Range(“B22”).Value = vPrincipalAxes(0): .Range(“C22”).Value = vPrincipalAxes(1): .Range(“D22”).Value = vPrincipalAxes(2)
.Range(“A23”).Value = “軸2 (X, Y, Z)”: .Range(“B23”).Value = vPrincipalAxes(3): .Range(“C23”).Value = vPrincipalAxes(4): .Range(“D23”).Value = vPrincipalAxes(5)
.Range(“A24”).Value = “軸3 (X, Y, Z)”: .Range(“B24”).Value = vPrincipalAxes(6): .Range(“C24”).Value = vPrincipalAxes(7): .Range(“D24”).Value = vPrincipalAxes(8)

‘ テーブルの体裁整え
.Columns(“A:D”).EntireColumn.AutoFit
End With

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

CleanUp:
‘ 8. 厳格なメモリ解放 (COMリーク防止の鉄則)
Set swMassProperty = Nothing
Set swModel = Nothing
Set swApp = Nothing
Set xlWs = Nothing
Set xlWb = Nothing
Set xlApp = Nothing
End Sub

3. アーキテクトが教える、実務適用のための3大注意点

このコードを実際の社内ニッチツール、あるいはPLM連携システムの一部として組み込む際、以下のポイントに直面するはずだ。先回りして対策を伝授する。

① アセンブリにおける「軽量コンポーネント(Lightweight)」の罠

大規模アセンブリの場合、デフォルトで部品が「軽量」状態でロードされていることがある。軽量状態のままで `IMassProperty2` を呼び出すと、正しい質量特性が取得できない(ゼロが返る、あるいは古いのキャッシュ値になる)という致命的なバグを生む。

  • 対策: プログラムの冒頭で、アセンブリ内の全コンポーネントを強制的に「解決済み(Resolved)」にするAPI(`swModel.Extension.ResolveAllLightWeightComponents`)を挟むか、事前にユーザーへ警告を促すガード条件を入れること。

② 配列のインデックスと型安全性

VBAの`Variant`型配列は、APIの種類によって0ベースであったり1ベースであったり、あるいはサフィックスの次元数が異なるケースがある。特に `GetPrincipalAxes` が返す9要素の1次元配列は、以下のようにマッピングされている:

  • `Index 0, 1, 2` : 第1主軸の X, Y, Z 方向余弦
  • `Index 3, 4, 5` : 第2主軸の X, Y, Z 方向余弦
  • `Index 6, 7, 8` : 第3主軸の X, Y, Z 方向余弦

この空間ベクトルをそのままCAD上の基準座標系と比較することで、「設計上の理想的な対称軸からどれだけ慣性主軸が傾いているか(偏心・偏倚の定量評価)」を自動判定するアルゴリズムへと発展させることが可能だ。

③ データベース/外部システム連携への拡張性

今回作成したExcelレポート出力は、あくまで人間が目視確認するための「ファーストステップ」に過ぎない。本物の自動化エンジニアであれば、この取得したJSON形式やCSV形式にシリアライズし、社内のSQLデータベースやPDM(Product Data Management)システムへ直接PUTリクエストを飛ばす、あるいは設計変更履歴と紐づけるアーキテクチャへと昇華させるべきだ。

総括

SolidWorks VBAの真価は、単に「手作業のマクロ化」にとどまらない。今回扱った `IMassProperty2` のような高度な数学的・物理的APIをプログラムの血肉とすることで、「人間の手では計算ミスが起きやすく、検証に数時間かかる設計品質チェック」を、一瞬かつノーミスで担保する巨大な武器へと変貌する。

プロフェッショナルとして、ただ動くだけのコードではなく、リソース管理と物理的正確性に裏打ちされたシステムを構築してほしい。君たちの設計現場の爆発的な効率化を期待している。

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