【SolidWorks API】設計の手戻りを物理演算で封殺せよ:重心・重量の自動リアルタイム検知ロジック
設計現場において、「設計変更が積み重なった結果、気づけば許容重量を大幅にオーバーしていた」という事態ほど悲劇的なものはない。手戻りのコストは、検知が遅れるほど指数関数的に増大する。
我々業務自動化エンジニアにとって、設計者の「うっかり」をシステムで物理的にブロックするのは義務だ。今回は、SolidWorks APIの核心である`IMassProperty`を叩き、設計変更の瞬間に重量をシビアに監視・警告する「堅牢な品質保証マクロ」の実装論を伝授する。
—
1. なぜ「単純なループ」ではいけないのか?
多くの初学者が陥る罠は、フィーチャを更新するたびに無防備に`GetMassProperties`を呼び出すことだ。これはパフォーマンスを著しく損なうだけでなく、「計算が追いついていない状態(Dirty state)」で値を読み取り、誤った判定を下すリスクがある。
堅牢なツールを作るための鉄則は以下の3点だ。
1. 計算の強制更新: `ModelDoc2.ForceRebuild3`を適切に差し込み、最新のジオメトリを確定させること。
2. 単位系の一致: SolidWorksの内部単位系(SI: メートル・キログラム)と、設計仕様(mm・g)の変換ミスを排除すること。
3. 例外処理の徹底: 形状が破綻(Rebuild Error)している状態で計算を強行しないこと。
—
2. 実装コード:重量監視エンジン
このコードは、モジュールとして切り出し、設計者向けツールのコアエンジンとしてそのまま使用できる設計にしている。
Option Explicit
‘ 定数:許容重量(グラム単位)
Private Const MAX_WEIGHT_GRAMS As Double = 5000.0
Public Sub ValidatePartMass()
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
‘ 1. ドキュメントチェック
If swModel Is Nothing Then Exit Sub
If swModel.GetType <> swDocPART Then Exit Sub
‘ 2. ジオメトリの完全再構築(必須)
‘ これを怠ると、変更直前の古い重量を拾うリスクがある
swModel.ForceRebuild3 False
‘ 3. MassPropertyオブジェクトの取得
Set swMassProp = swModel.Extension.CreateMassProperty
‘ 4. 計算実行
‘ 使用可能な全ボディを対象にする
swMassProp.UseSystemUnits = False ‘ SI単位系を明示的に制御
If swMassProp.Mass = 0 Then
MsgBox “解析不能:モデルが空か、エラーが発生しています。”, vbCritical
Exit Sub
End If
‘ 5. 単位変換(SW内部はkg、今回はgで判定)
currentWeight = swMassProp.Mass 1000
‘ 6. 判定と警告
If currentWeight > MAX_WEIGHT_GRAMS Then
MsgBox “【警告】設計仕様違反” & vbCrLf & _
“現在の重量: ” & Format(currentWeight, “0.0”) & “g” & vbCrLf & _
“許容値: ” & MAX_WEIGHT_GRAMS & “g”, vbCritical, “重量過多アラート”
Else
MsgBox “重量チェック完了: ” & Format(currentWeight, “0.0”) & “g (正常)”, vbInformation
End If
End Sub
—
3. 現場で「生き残る」ための設計哲学
このコードをただコピペして満足してはいけない。実務で運用する際には、以下の設計思想を組み込むことだ。
A. データベース連携の罠
重量データをExcelやPDMへ書き出す場合、「計算時刻」と「リビジョン情報」を必ずメタデータとして付与せよ。どの時点での計算結果か不明なログは、トラブル時に責任の所在を曖昧にする。
B. 単位系の自律管理
APIの`UseSystemUnits = False`は諸刃の剣だ。あえて「キログラム」として取得し、コード内で明確に「グラム」へ変換する計算式を書くことで、SolidWorksのドキュメント設定(ドキュメント単位系)が変更されても、マクロ側の判定ロジックが崩壊しないように保護している。
C. パフォーマンスの最適化
もしアセンブリ全体でこの監視を行う場合、`GetMassProperties`は非常に重い処理となる。その場合は、`swModel.ConfigurationManager.ActiveConfiguration`を使って必要なコンポーネントのみを抽出するか、計算のトリガーを「保存時(App_FileSaveNotify)」に限定するイベント駆動型の設計に変更すべきだ。
—
結論:エンジニアの役割とは
我々が作るツールは、単なる「計算機」ではない。設計者の思考を補完し、防げたはずのミスを未然に遮断する「ガードレール」であるべきだ。
このマクロを導入することで、あなたのチームは「重量オーバーを設計の最終工程で見つける」という悪夢から解放される。次は、この重量監視をアセンブリの階層構造に対応させ、重心位置(COG)の偏りまで自動判定するロジックへ拡張してみるといい。
SolidWorks APIを掌握せよ。そして、設計というクリエイティブな戦いに集中できる環境を、自らの手で作り上げろ。
