質量という「物理的真実」をコードで縛る:IMeasureを超越した設計統制の極致
設計現場において、3Dモデルは単なる幾何学の集合体ではない。それは「質量」という動かしがたい物理的制約を背負った実体である。
多くの若手エンジニアは、SolidWorksの画面上で「質量特性」ボタンをクリックして満足する。しかし、我々シニアアーキテクトが構築すべきは、そのような牧歌的な手作業ではない。設計者が意識せずとも、あるいは意識を逸らした瞬間に、システムが冷徹に「重量オーバー」を突きつける自動検閲機構である。
今回は、`IMeasure`インターフェース、あるいはより洗練された`MassProperty` APIを駆使し、SolidWorks VBAにおける質量算出と、設計上限値の監視を自動化する「品質管理の防波堤」の実装について詳述する。
—
1. 幾何計算のライフサイクルとパフォーマンスの相克
SolidWorks APIにおいて質量特性を取得する際、初心者が陥る最大の罠は「リビルド(再構築)」の軽視である。
幾何形状が変更された直後、あるいはフィーチャが抑制(Suppress)された状態でAPIを叩いても、返ってくる数値は「過去の遺物」に過ぎない。
‘ 禁忌:リビルドを怠った状態でのプロパティ取得
‘ 常に最新のジオメトリをメモリ上に展開させなければならない
swModel.ForceRebuild3 True
しかし、大規模アセンブリや複雑なパーツにおいて`ForceRebuild3`は極めて重い処理だ。これをループ内で無秩序に呼び出せば、システムは容易にハングアップする。我々プロフェッショナルは、「Dirtyフラグ(変更フラグ)」を監視し、真に必要なタイミングでしか再計算を許さない設計思想を持つべきだ。
2. IMeasureからMassPropertyへの昇華
テーマには`IMeasure.CalculateMassProperties`とあるが、システム構築の観点からは`ModelDocExtension::GetMassProperties2`(または`MassProperty`オブジェクト)の使用を推奨する。これは、精度の制御や、特定の座標系に基づいた慣性モーメントの取得において、より柔軟で堅牢なインターフェースを提供するためだ。
また、SolidWorks APIの戻り値は常に SI単位系(メートル、キログラム) である。これを設計現場の単位(mm, グラム)へ変換する際の「浮動小数点演算の精度」にも細心の注意を払わねばならない。
—
3. 極限の質量監視マクロ:実装コード
以下のコードは、単なる数値取得に留まらず、Windows APIを用いたユーザー通知、およびCOMオブジェクトの明示的解放を組み込んだ、プロダクション環境に耐えうる設計となっている。
Option Explicit
‘ Windows API: 警告音の制御
Private Declare PtrSafe Function MessageBeep Lib “user32″ (ByVal uType As Long) As Long
Private Const MB_ICONHAND As Long = &H10
”’
”’
Public Sub ValidatePartMassConstraints()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModExt As SldWorks.ModelDocExtension
Dim swMass As SldWorks.MassProperty
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. オブジェクトの存在確認
If swModel Is Nothing Then Exit Sub
If swModel.GetType <> swDocPART Then
MsgBox “パーツドキュメントを開いてください。”, vbCritical
Exit Sub
End If
‘ 2. ジオメトリの整合性確保(リビルド)
‘ パフォーマンス向上のため、Dirtyフラグが立っている場合のみ実行するロジックを推奨
swModel.ForceRebuild3 False
Set swModExt = swModel.Extension
Set swMass = swModExt.CreateMassProperty
‘ 3. パラメータ設定
‘ 精度を最高レベルに設定(計算コストと精度のトレードオフ)
swMass.AccuracyLevel = 3
‘ 4. 物理量の取得(SI単位系: kg, m^2, m^3)
Dim massValue As Double
Dim volumeValue As Double
Dim surfaceArea As Double
Dim centerOfMass As Variant
massValue = swMass.Mass
volumeValue = swMass.Volume
surfaceArea = swMass.SurfaceArea
centerOfMass = swMass.CenterOfMass ‘ 戻り値はx,y,zの配列
‘ 5. 判定ロジック:設計上限値(例: 5.0kg)の検証
Const MAX_ALLOWED_MASS As Double = 5.0 ‘ kg
If massValue > MAX_ALLOWED_MASS Then
TriggerViolationAlert swModel.GetTitle, massValue, MAX_ALLOWED_MASS
Else
Debug.Print “Mass check passed: ” & Round(massValue, 3) & ” kg”
End If
‘ 6. メモリの明示的解放(重要:SolidWorksのゾンビプロセス化を防ぐ)
Set swMass = Nothing
Set swModExt = Nothing
Set swModel = Nothing
End Sub
”’
”’
Private Sub TriggerViolationAlert(ByVal docName As String, ByVal currentMass As Double, ByVal limit As Double)
‘ 警告音の送出
MessageBeep MB_ICONHAND
Dim msg As String
msg = “【設計規約違反】” & vbCrLf & _
“ファイル: ” & docName & vbCrLf & _
“現在の質量: ” & Format(currentMass, “0.000”) & ” kg” & vbCrLf & _
“許容上限値: ” & Format(limit, “0.000”) & ” kg” & vbCrLf & vbCrLf & _
“直ちにジオメトリまたは材料設定を見直してください。”
MsgBox msg, vbCritical Or vbMsgBoxSetForeground, “Quality Guard System”
End Sub
—
4. アーキテクトが語る「運用の勘所」
材料定義の厳格化
質量算出の根拠は「体積 × 密度」である。VBAで質量を監視する以前に、モデルに適切な「材料(Material)」が定義されているかをチェックするロジックを先行させるべきだ。材料が未定義(密度1.0)のまま算出された質量には、何の工学的価値もない。
Windows APIによる非同期性の検討
本稿では簡便のため`MsgBox`を使用したが、真に洗練されたシステムでは、モードレスなユーザーフォームや、Windowsのトレイ通知(Balloon Tip)を検討すべきである。設計者の作業フローを止めずに警告を視認させる。それが「使われるツール」の条件だ。
レガシー環境と64bit化の壁
`Declare PtrSafe`の記述に気づかれただろうか。多くの設計現場ではいまだに古いVBA資産が眠っているが、SolidWorksは64bit環境が標準である。ポインタ操作やAPI呼び出しにおいて、`LongPtr`を正しく使い分ける知識は、我々シニアエンジニアにとっての「免許証」と言える。
結び:コードは品質の番人である
自動質量算出マクロは、単なる省力化ツールではない。それは、設計者の主観や「うっかり」を排除し、組織としての設計品質を物理法則の名の下に強制するためのガバナンス(統治)である。
オブジェクト一つひとつのライフサイクルを意識し、メモリを汚さず、かつ冷徹に数値を監視する。このストイックなコードの積み重ねこそが、世界最高峰の設計環境を支える礎となる。
