【SolidWorks API】設計の「質量限界」を自動監視せよ:IMeasureによる品質ガードレールの実装
設計の現場で最も悲惨な事故の一つが、「気づかぬうちに設計許容質量を超過し、後工程のコストと納期を破壊する」ことだ。特に軽量化が求められる航空宇宙や精密機器において、質量は単なる数値ではなく、製品の生存権そのものである。
手動での質量確認を設計者の「善意」に委ねるのはエンジニアリングではない。システムで強制的に監視する。今日は、SolidWorks APIの `IMeasure` を用いて、設計変更のたびに質量をリアルタイム検証し、限界を超えたら即座に開発をストップさせる「品質ガードレール」の実装術を伝授する。
—
なぜ `IMeasure` なのか? なぜ「甘い実装」が死を招くのか
多くの初心者は `IModelDocExtension::GetMassProperties` を用いるが、ここには落とし穴がある。「再構築(Rebuild)」のタイミングと、計算対象の「構成(Configuration)」の整合性を厳密に制御しないと、古いキャッシュ値を拾って誤判定を引き起こすからだ。
今回の設計の肝は以下の3点だ。
1. 強制再構築の保証: 質量計算前に必ず `ForceRebuild3` を叩く。
2. 単位系の一貫性: ドキュメントの単位系に依存せず、常にSI単位系(kg)で算出する。
3. ガード節(Guard Clause)の実装: 無効なジオメトリやエラー発生時に、握り潰さず即座に例外を投げる。
—
プロダクション実装:質量監視モジュール
このコードは、単なる質量取得ではない。設計者が許容値をオーバーした瞬間に、業務を中断させるための「安全装置」だ。
Option Explicit
‘ 設計許容質量の定数(kg)
Private Const MAX_ALLOWABLE_MASS As Double = 5.5
Public Sub CheckMassProperties_Production()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swModelExt As SldWorks.ModelDocExtension
Dim swMeasure As SldWorks.Measure
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. ドキュメントの存在チェック
If swModel Is Nothing Then Exit Sub
If swModel.GetType <> swDocPART Then Exit Sub
Set swModelExt = swModel.Extension
‘ 2. 強制再構築を実行(計算の前提条件)
swModel.ForceRebuild3 False
‘ 3. Measureオブジェクトの生成
Set swMeasure = swModelExt.CreateMeasure
‘ 4. 質量計算の実行
‘ IMeasureは設定項目を正しく渡さないと計算精度が落ちるため注意
If swMeasure.CalculateMassProperties Then
Dim currentMass As Double
currentMass = swMeasure.Mass
‘ 5. 判定とアラート(品質ゲート)
If currentMass > MAX_ALLOWABLE_MASS Then
MsgBox “【警告】設計質量超過!” & vbCrLf & _
“現在値: ” & Format(currentMass, “0.000”) & ” kg” & vbCrLf & _
“許容値: ” & MAX_ALLOWABLE_MASS & ” kg” & vbCrLf & _
“直ちに設計を見直してください。”, vbCritical, “品質管理アラート”
Else
Debug.Print “質量チェックOK: ” & currentMass & ” kg”
End If
Else
Err.Raise vbObjectError + 1001, “MassCheck”, “質量計算に失敗しました。ジオメトリに欠陥がある可能性があります。”
End If
End Sub
—
堅牢な運用のためのアーキテクトからの助言
このコードを「動いた」で終わらせてはいけない。現場で使い倒すためには、以下の運用設計が不可欠だ。
1. ファイルプロパティとの連携
質量を判定した結果は、必ずカスタムプロパティ(例: `”CHECKED_MASS”`)に書き出すこと。これにより、PDMシステム側で「質量が更新されていない古い図面」を自動検知するフィルタリングが可能になる。
2. アセンブリ展開時のパフォーマンス
本記事ではパーツを対象としているが、アセンブリでこれをやる場合は注意が必要だ。`IMeasure` は構成部品が多いと極端に重くなる。その際は `Configuration::GetMassProperties` を利用し、あらかじめ計算済みの値(軽量設定)を使うなどの最適化を行え。
3. データベース(外部連携)の罠
もしこの質量を外部のデータベースやERPに送信する場合、「計算が成功した証跡」をログとして残せ。計算値だけでなく、計算した時刻、パーツのレビジョンID、計算時の単位設定をセットで記録しないデータは、将来的に「何をもってその質量と判断したのか」というトレーサビリティの崩壊を招く。
最後に:エンジニアの矜持として
自動化とは、単に工数を削減することではない。「人間に依存していた品質保証のプロセスを、計算機という絶対的な論理に置き換えること」だ。
このマクロを導入した瞬間、君のチームから「質量計算ミス」という言葉は消滅する。コードをコピペするだけでなく、それがなぜその現場で必要とされるのか、その背景までを設計しきってほしい。
健闘を祈る。
