SolidWorks APIの深淵:重心解析による設計品質の自動ゲートキーパー実装
設計の現場において、CADの自動化は単なる「作業短縮」ではない。真の目的は、人間が犯すヒューマンエラーをシステムで封殺し、設計品質を担保する「動的なゲートキーパー」を構築することにある。
本稿では、SolidWorks APIの `IMeasure` インターフェースを中核に、重心・重量解析を自動化し、仕様逸脱をリアルタイムで検知する堅牢な実装手法を解説する。
—
1. なぜ「重い」のか:MassProperties APIの正体
SolidWorksで質量特性を取得する際、多くのエンジニアが犯す過ちは、単に `IModelDoc2::GetMassProperties` を呼ぶことだ。
ここでの技術的要諦は、「計算コンテキストの制御」にある。複雑なアセンブリや履歴の深いパーツでは、再計算を強制する `ForceRebuild` と、解析精度のバランスが重要だ。また、メモリリークを避けるために、解析オブジェクトのライフサイクルを厳密に管理しなければならない。
実装の要点:
- 計算単位の統一: APIは常にSI単位系(kg, m, m^3)で返却する。社内規格との変換ロジックをクラス内にカプセル化せよ。
- 明示的なオブジェクト解放: COMオブジェクトはガベージコレクション頼みではならない。`Set obj = Nothing` を徹底し、プロセス残留を防ぐ。
—
2. 実装コード:重量超過検知ゲートキーパー
以下は、パーツの質量が閾値を超えた場合にWindows APIでダイアログを強制表示する実装の雛形である。
Option Explicit
‘ Windows APIで警告音とメッセージボックスの制御を行う
Private Declare PtrSafe Function MessageBox Lib “user32” Alias “MessageBoxA” ( _
ByVal hwnd As LongPtr, ByVal lpText As String, ByVal lpCaption As String, ByVal uType As Long) As Long
‘ 定数定義
Private Const MAX_WEIGHT_KG As Double = 5.0 ‘ 許容重量閾値
Private Const MB_ICONSTOP As Long = &H10&
Public Sub ValidatePartMass()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swMass As SldWorks.MassProperty
Dim vMass As Variant
Dim dMass As Double
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ モデルがパーツか確認
If swModel Is Nothing Or swModel.GetType <> swDocPART Then Exit Sub
‘ 質量特性オブジェクトの生成
Set swMass = swModel.Extension.CreateMassProperty
swMass.UseSystemUnits = False ‘ SI単位系を明示的に強制
‘ 計算の実行
If swMass.Calculate Then
dMass = swMass.Mass
‘ 閾値判定
If dMass > MAX_WEIGHT_KG Then
Call TriggerAlert(dMass)
End If
End If
‘ メモリ解放:ここが伝説たる所以。COM参照を即座に破棄する
Set swMass = Nothing
Set swModel = Nothing
End Sub
Private Sub TriggerAlert(currentMass As Double)
Dim msg As String
msg = “【警告】設計仕様違反を検知しました。” & vbCrLf & _
“現在の重量: ” & Format(currentMass, “0.000”) & ” kg” & vbCrLf & _
“許容重量を超過しているため、保存操作を中断してください。”
‘ Windows APIによるハード警告
MessageBox 0, msg, “品質保証ゲートキーパー”, MB_ICONSTOP
End Sub
—
3. レガシー環境とシステム連携の極限知見
物理プロパティの更新タイミング
`Calculate` メソッドは、現在のモデルの状態を反映する。もし直前にフィーチャ変更を行った場合、即座に計算すると「旧形状」のデータが取れる可能性がある。大規模アセンブリや複雑パーツの場合は、`swModel.ForceRebuild3` を実行後に解析を行うのが定石だ。ただし、これは実行時間を劇的に増大させるため、`IsDirty` プロパティで変更有無を確認してから叩くのがシニアの最適化だ。
システム間連携への布石
このマクロは、単体で終わらせてはならない。重心位置(Center of Mass)を取得すれば、そのままJSON化して社内のPDMシステムや、加工部門のシミュレーションシステムへPOST送信が可能だ。
重心情報のAPI取得は以下の通りである。
Dim vCoM As Variant
vCoM = swMass.CenterOfMass
‘ vCoM(0)=X, vCoM(1)=Y, vCoM(2)=Z
これを活用すれば、「設計者が意図しない重心バランス」を持つパーツを、設計段階で排除する完全自動化ラインを構築できる。
—
4. 最後に:エンジニアへの提言
VBAという言語は、もはや「古い」のではない。「現場のOSに直結する唯一の言語」である。
あなたが書くこの数行のコードは、現場のミスを未然に防ぎ、後に続く設計者の時間を守る盾となる。SolidWorks APIの深い階層を理解し、メモリと計算コストを支配する者だけが、真の自動化エンジニアとして評価される。
コードのコピペで満足せず、自身が扱うモデルの複雑性に合わせて、`Calculate` の精度設定(`SetPrecision`)などをチューニングしてほしい。それが、「動くマクロ」を「壊れないシステム」へと昇華させる唯一の道である。
