【実務・中級編】【形状検証・検査】IMeasure.GetTotalSurfaceAreaとMassPropertiesによる設計変更後の重心・表面積の自動モニタリング – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API】設計変更の「見えない綻び」を排除する:重心・表面積のリアルタイム検証メカニズム

設計変更のたびに「質量特性」ウィンドウを開き、電卓を叩いてエクセルに転記する……そんな原始的な作業は今日で終わりにしよう。

我々のような自動化エンジニアにとって、設計変更は単なる形状の更新ではない。「質量・体積・表面積」という幾何学的アイデンティティが、許容範囲内に収まっているかを即座に検証するフェーズである。

本稿では、SolidWorks APIを叩き、設計の整合性を守るための「堅牢な検証エンジン」の構築手法を伝授する。

1. なぜ「単純な更新」ではバグが生まれるのか

多くのエンジニアが陥る罠は、`swModel.ForceRebuild3` を呼び出した直後に `IMassProperty` を取得しようとすることだ。

SolidWorksの再構築(Rebuild)は非同期的な要素を含んでおり、特に複雑なアセンブリや外部参照を持つパーツでは、再構築完了前にプロパティの取得処理が走り、「前回の計算結果」を掴んでしまうケースが多発する。

これを防ぐための鉄則は以下の3点だ。

1. Rebuildの完了を待機する: `ForceRebuild3` の戻り値を必ず確認する。
2. オブジェクトの解放: `IMassProperty` や `IMeasure` はCOMリファレンスを掴み続けるため、ループ内での生成はメモリリークを招く。明示的に `Nothing` を代入せよ。
3. 妥当性の検証: 計算値が 0 になっている場合は再構築失敗と見なし、例外を投げるべきだ。

2. 実装:堅牢な設計検証マクロ

このコードは、アクティブなパーツの質量特性を抽出し、設計要件と比較する「検知器」のコアロジックである。

Option Explicit

‘ 設計許容値(定数として管理)
Const TARGET_MASS As Double = 1.50 ‘ kg
Const TOLERANCE As Double = 0.05 ‘ 5%の許容誤差

Sub ValidatePartGeometry()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMass As SldWorks.MassProperty
Dim swModelDocExt As SldWorks.ModelDocExtension

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

If swModel Is Nothing Then Exit Sub
If swModel.GetType <> swDocPART Then MsgBox “パーツファイルを開いてください”: Exit Sub

‘ 1. 完全な再構築を実行
swModel.ForceRebuild3 False

‘ 2. 質量特性オブジェクトの生成
Set swModelDocExt = swModel.Extension
Set swMass = swModelDocExt.CreateMassProperty

‘ 3. 計算の実行と検証
If swMass.UseSystemUnits = False Then swMass.UseSystemUnits = True

Dim currentMass As Double
currentMass = swMass.Mass

‘ 結果の判定とフィードバック
If Abs(currentMass – TARGET_MASS) / TARGET_MASS <= TOLERANCE Then Debug.Print "検証OK: 質量 " & Round(currentMass, 3) & " kg" Else MsgBox "【警告】設計許容範囲外です!" & vbCrLf & _ "現在値: " & currentMass & " kg", vbCritical End If ' メモリ解放の徹底(重要) Set swMass = Nothing Set swModelDocExt = Nothing End Sub ---

3. 現場で生き残るための「設計上の注意点」

データベース連携の罠

取得した値をCSVやSQL Serverへ飛ばす際、必ず「単位系」を固定すること。`swMass.UseSystemUnits = True` は便利だが、ファイル設定次第で「g」になったり「kg」になったりする。APIを通す際は、必ず `swMass.Mass` を取得した後に `swMass.GetMass` 等で値を固定し、単位をプログラム内で正規化して記録するのがプロの流儀だ。

パフォーマンスを最適化する

もしこれが「100個のパーツを順次開いて検証する」ようなバッチ処理であれば、`swModel.Visible = False` でバックグラウンド処理を行うこと。GUIの描画コストを省くだけで、処理速度は数倍向上する。

ログの残し方

エラーが発生した際、単に「エラーです」と出すのは素人だ。

  • どのフィーチャが失敗しているか
  • 最後に成功した計算値はいくらか
  • タイムスタンプ

これらをテキストファイル(ログ)に出力し、トレーサビリティを確保せよ。

最後に:エンジニアとしての心構え

自動化ツールは「書いたら終わり」ではない。モデルのフィーチャツリーが複雑化すれば、計算負荷は増大する。

今回紹介したコードは、あくまで「検証の基盤」だ。今後は、このロジックをクラスモジュールにカプセル化し、`PartAnalyzer` クラスとしてライブラリ化することをお勧めする。そうすることで、他のプロジェクトでも「検証エンジン」をプラグアンドプレイで使い回せるようになるからだ。

泥臭い手作業を自動化の力で絶滅させ、我々エンジニアは「本来考えるべき設計の本質」に集中しよう。それが、このコードを託す最大の理由だ。

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