【入門編】【形状検証・検査】IMeasure.GetMassPropertiesを用いた設計変更後の自動重心計算と、許容重量超過時のポップアップ警告実装 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA】設計の「重さ」をコードで見張る:自動重心計算と品質アラートの実装術

こんにちは。設計自動化の世界へようこそ。

「マクロの記録」ボタンを押して操作をなぞるだけの日々は、今日で卒業しましょう。あなたが次に目指すべきは、「モデルが生成された瞬間に、その品質を自ら判定する自律的なプログラム」を書くことです。

今回は、設計品質を担保する上で最も重要な「重量」に焦点を当てます。設計変更のたびに手動で質量特性を開いていませんか? それを自動化し、許容値を超えたら即座にストップをかける。この「守り」のコードをあなたの武器にしましょう。

1. 物理演算の心臓部:IMassPropertyインターフェース

SolidWorks APIにおいて、重量や重心を扱うには `IMassProperty` オブジェクトを使います。これは、モデルのジオメトリを解析し、密度や体積から物理量を算出する「計算エンジン」です。

私たちがやるべきことはシンプルです。
1. 現在のモデルから `IMassProperty` を作成する。
2. 計算を実行させる。
3. 算出された値が閾値を超えていないか判定する。

2. 実装コード:設計品質を守る「番犬」マクロ

以下のコードをコピーして、VBAエディタ(Alt + F11)の標準モジュールに貼り付けてください。

Option Explicit

‘ 設計仕様:最大許容重量(kg)
Const MAX_WEIGHT_KG As Double = 5.0

Sub CheckModelWeight()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMassProp As SldWorks.MassProperty
Dim vMass As Variant
Dim currentWeight As Double

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ モデルが開かれていない場合のガード節
If swModel Is Nothing Then
MsgBox “パーツファイルを開いてから実行してください。”, vbCritical
Exit Sub
End If

‘ 1. MassPropertyオブジェクトの生成
Set swMassProp = swModel.Extension.CreateMassProperty

‘ 2. 計算の実行(Trueで計算を確定させる)
If swMassProp.Calculate(Nothing) Then
‘ 3. 質量を取得(戻り値はkg単位)
currentWeight = swMassProp.Mass

‘ 4. 判定と警告
If currentWeight > MAX_WEIGHT_KG Then
MsgBox “【警告】許容重量を超過しました!” & vbCrLf & _
“現在の重量: ” & Format(currentWeight, “0.00”) & ” kg” & vbCrLf & _
“上限値: ” & MAX_WEIGHT_KG & ” kg”, vbExclamation
Else
MsgBox “検証完了:重量は範囲内です。” & vbInformation, vbInformation
End If
Else
MsgBox “質量計算に失敗しました。ジオメトリにエラーがないか確認してください。”, vbCritical
End If
End Sub

3. なぜ「マクロの記録」ではダメなのか?

このコードを読んで、「なぜ `Extension.CreateMassProperty` なんてメソッドを使うの? マクロの記録には出てこないのに」と思ったあなたは鋭い。

「マクロの記録」は、あくまでユーザーインターフェース(ボタンクリック)を模倣する機能に過ぎません。しかし、APIによる自動化は「SolidWorksの脳内データ(メモリ)に直接アクセスする」行為です。

  • マクロの記録: 「画面上のボタンを探して押す」→ 画面が切り替わると動かなくなる。
  • APIプログラミング: 「モデルオブジェクトの物理プロパティを直接読み取る」→ 画面を表示させずに裏側で高速処理が可能。

この違いこそが、自動化エンジニアとして一歩先へ進むための境界線です。

4. 陥りやすい罠と対策

現場でよくある失敗を一つだけ共有します。それは「マテリアル(材質)が未設定」というケースです。

`IMassProperty` は、モデルに材質(密度)が割り当てられていないと、正しく計算できません。もし計算結果が `0` になる場合は、以下のチェックを追加する癖をつけましょう。

‘ 計算前に材質が設定されているか確認する例
If swModel.MaterialPropertyName = “” Then
MsgBox “注意:材質が設定されていないため、重量は0として計算されます。”
End If

5. 次のステップへ

今回のコードは、いわば「静的な検査」です。これを応用すれば、

  • モデル保存時に自動実行する(イベント駆動)
  • 設計変更の履歴をテキストファイルに書き出す
  • 重心位置(X, Y, Z座標)を取得して、特定の平面からのオフセットを判定する

といった高度な品質保証システムへと拡張できます。

自動化の本質は、「単純作業を減らすこと」ではなく、「人間が気づけないエラーをシステムが先回りして摘み取ること」にあります。このマクロをあなたの設計プロセスの「守護神」として育ててみてください。

もし、さらに深いAPIの世界や、特定のジオメトリ制約と連携させた自動修正の方法を知りたくなったら、いつでも聞いてください。設計者のためのエンジニアリングは、ここからが面白いですよ。

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