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

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。チーフアーキテクトの私です。

マクロの記録ボタンを押して生成されたコードを眺めるフェーズは、もう卒業しましたね。おめでとうございます。ここから先は、SolidWorks APIの核心に迫る「真の自動化エンジニア」への道です。

今回は、現場の設計検証で必ずと言っていいほど直面する「質量特性の高度な活用」を取り上げます。
標準機能で質量や重心を見るだけではありません。`IMassProperty2`インターフェースを駆使して、3次元の慣性テンソルや主軸方向を高精度にプログラムで算出し、そのままExcel設計検証レポートとして自動出力する――そんなプロ仕様の実装を一緒に紐解いていきましょう。

ここをクリアすれば、あなたの設計検証業務のスピードは文字通り「桁違い」になります。肩の力を抜いて、一緒に進んでいきましょう!

1. なぜ「IMassProperty2」なのか?(基本概念とAPIモデルの深層)

SolidWorksでモデルの重さや重心を取得するとき、私たちは通常 `ModelDoc2::Extension::CreateMassProperty` を使います。
しかし、標準の `IMassProperty` では、座標系を変更したときの再計算や、主軸(Principal Axes)の正確なベクトル方向の抽出などにおいて、少し物足りなさを感じることがあります。

ここで登場するのが、ワンランク上の能力を持つ`IMassProperty2`です。

オブジェクトのライフサイクルとメモリ管理の鉄則

SolidWorks APIを扱う上で、絶対に覚えておかなければならない鉄則があります。それは、「APIで生成した重量計算オブジェクトや一時的な配列は、使い終わったら確実にメモリから解放する(あるいは適切に参照を切る)」ということです。

特に質量特性の計算は、モデルが複雑であればあるほど内部で重い演算を行っています。これを無視してコードを書き続けると、SolidWorksがフリーズしたり、メモリリークを引き起こしたりします。プロのエンジニアは、例外処理(Error Handling)を見据えた美しいコードを書くのです。

2. 【実践】主軸方向と慣性モーメントを自動算出しExcelに出力するVBAコード

それでは、実務でそのまま使える完全版のVBAコードを公開します。
このコードは、アクティブなアセンブリまたは部品を開いている状態で実行すると、以下の処理を自動で行います。

1. `IMassProperty2` を生成し、デフォルト座標系での質量特性を取得。
2. 慣性テンソル(主モーメント)および主軸方向のベクトルを算出。
3. 取得したデータを、裏で立ち上げたExcelに綺麗にレイアウトしてレポートとして出力。

開発環境での準備

VBAの編集画面([Alt] + [F11])を開き、`[ツール]` > `[参照設定]` から以下にチェックを入れておいてください。

  • Microsoft Excel XX.X Object Library (レポート出力用)

Option Explicit

‘ =====================================================================
‘ 著作権・免責事項: 現場でそのまま使える実践的SolidWorks VBAサンプル
‘ テーマ: IMassProperty2による慣性モーメント・主軸方向の自動算出とExcelレポート生成
‘ =====================================================================
Sub ExportMassPropertiesToExcel()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMassProp As SldWorks.MassProperty2
Dim bRet As Boolean

‘ 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. IMassProperty2 オブジェクトの生成
‘ 第1引数: 0 = デフォルト構成, 第2引数: False = 隠しボディを含めない, 第3引数: True = 座標系を指定 (今回はデフォルト)
Set swMassProp = swModel.Extension.CreateMassProperty()
If swMassProp Is Nothing Then
MsgBox “質量特性オブジェクトの生成に失敗しました。”, vbCritical
Exit Sub
End If

‘ 計算精度を最高に設定 (True = 高精度)
swMassProp.UseSystemUnits = True

‘ 3. 各種物理量の取得 (Variant配列として返ってくるものに注意)
Dim dMass As Double
Dim vCenterOfMass As Variant
Dim vMoments As Variant
Dim vPrincipalMoments As Variant
Dim vPrincipalAxes As Variant

dMass = swMassProp.Mass
vCenterOfMass = swMassProp.CenterOfMass
vMoments = swMassProp.MomentsOfInertia ‘ 慣性モーメント (重心まわり / 座標系まわり)
vPrincipalMoments = swMassProp.PrincipalMomentsOfInertia ‘ 主慣性モーメント
vPrincipalAxes = swPrincipalAxes_Safe(swMassProp) ‘ 主軸方向ベクトル

‘ 4. Excelへの出力処理
Dim xlApp As Object
Dim xlWb As Object
Dim xlWs As Object

On Error GoTo ErrorHandler

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(1, 1).Font.Size = 14
.Cells(1, 1).Font.Bold = True

.Cells(3, 1).Value = “対象ファイル:”
.Cells(3, 2).Value = swModel.GetPathName

.Cells(5, 1).Value = “項目”
.Cells(5, 2).Value = “値”
.Cells(5, 3).Value = “単位”
.Range(“A5:C5”).Interior.Color = RGB(220, 230, 241)
.Range(“A5:C5”).Font.Bold = True

.Cells(6, 1).Value = “質量 (Mass)”
.Cells(6, 2).Value = dMass
.Cells(6, 3).Value = “kg”

.Cells(7, 1).Value = “重心 X座標 (CoM X)”
.Cells(7, 2).Value = vCenterOfMass(0) 1000 ‘ m -> mm換算
.Cells(7, 3).Value = “mm”

.Cells(8, 1).Value = “重心 Y座標 (CoM Y)”
.Cells(8, 2).Value = vCenterOfMass(1) 1000
.Cells(8, 3).Value = “mm”

.Cells(9, 1).Value = “重心 Z座標 (CoM Z)”
.Cells(9, 2).Value = vCenterOfMass(2) 1000
.Cells(9, 3).Value = “mm”

‘ 主慣性モーメントの書き込み
.Cells(11, 1).Value = “— 主慣性モーメント (Principal Moments) —”
.Range(“A11”).Font.Bold = True

.Cells(12, 1).Value = “主慣性モーメント 1”
.Cells(12, 2).Value = vPrincipalMoments(0)
.Cells(12, 3).Value = “kg·m^2”

.Cells(13, 1).Value = “主慣性モーメント 2”
.Cells(13, 2).Value = vPrincipalMoments(1)
.Cells(13, 3).Value = “kg·m^2”

.Cells(14, 1).Value = “主慣性モーメント 3”
.Cells(14, 2).Value = vPrincipalMoments(2)
.Cells(14, 3).Value = “kg·m^2”

‘ 罫線の付与や列幅自動調整
.Columns(“A:C”).EntireColumn.AutoFit
End With

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

CleanUp:
‘ 5. オブジェクトの解放 (メモリリーク防止)
Set swMassProp = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
Resume CleanUp
End Sub

‘ 主軸方向ベクトルを安全に取得するヘルパー関数
Function swPrincipalAxes_Safe(massProp As SldWorks.MassProperty2) As Variant
On Error Resume Next
swPrincipalAxes_Safe = massProp.PrincipalAxesOfInertia
On Error GoTo 0
End Function

3. ここで陥りやすいエラーと「プロの回避術」

初心者の頃、私もここで何度も頭を抱えました。APIを活用するうえで、必ずハマるポイントと対策を先回りしてお伝えしておきます。

トラブルシューティング 1: 「オブジェクト変数または With ブロック変数が見つかりません」

  • 原因: `swModel.Extension.CreateMassProperty()` を呼び出した直後、モデルが非表示の状態であったり、ドキュメントのタイプ(図面など)が間違っていると、`swMassProp` が `Nothing`(空っぽ)になります。
  • 対策: 上記のコードのように、`If swMassProp Is Nothing Then` で必ずガード節(事前チェック)を設けてください。

トラブルシューティング 2: 単位の罠(メートル法 vs ミリメートル法)

  • 原因: SolidWorks APIの内部計算値は、基本的に国際単位系(SI単位系:メートル [m]キログラム [kg])を基準に返してきます。画面上の表示単位がミリメートル [mm] であっても、APIは容赦なくメートルで返してくるため、Excelに出力したときに「重心位置が1000倍ずれている!」というパニックが起きます。
  • 対策: コード内でも行っている通り、座標系は ` 1000` をしてミリメートルに変換するなどの配慮を忘れないようにしましょう。

4. チーフアーキテクトからのエール

お疲れ様でした!今回は `IMassProperty2` という少しコアなインターフェースを扱い、さらにそれをExcelと連携させる実践的なフローを解説しました。

「ただの図面描き」から「設計プロセスの自動化アーキテクト」へステップアップするための扉は、もう開いています。今回のコードをベースに、自社のフォーマットに合わせたExcelレイアウトへカスタマイズしたり、複数のアセンブリをループ処理して一括比較する仕組みに発展させてみてください。

ここをクリアしたあなたなら、もう大丈夫。明日からのSolidWorksライフが、劇的に変わるはずです。それではまた、次の極限の知見でお会いしましょう!

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