SolidWorks APIの真髄:MassPropertyを制し、モデル検証を「一瞬」で終わらせる技術
SolidWorks APIを扱うエンジニアの多くが陥る罠がある。それは「オブジェクトをただ呼び出すだけ」のコードだ。APIの仕様書をなぞるだけのコードは、モデルが複雑化した瞬間にメモリーリークや予期せぬクラッシュを引き起こす。
今回は、設計品質を担保するための「質量特性抽出」を題材に、実務で戦える堅牢なアーキテクチャを伝授する。
—
1. なぜ「そのコード」ではダメなのか
多くの初心者が書くコードは、`ModelDoc2` から直接値を読み取ろうとする。これは間違いではないが、設計としては脆い。
- 再計算の保証がない: モデルのフィーチャーが抑制されていたり、再構築が必要な状態であれば、取得する値は「前回の保存時」のものになる。
- 単位系の罠: SolidWorks内部の単位(SI単位系)と、Excel側で求められる単位(mm, kgなど)の変換を疎かにすると、致命的な計算ミスを招く。
- ライフサイクルの管理不足: `MassProperty` オブジェクトを適切に開放しなければ、大量のモデルをループ処理する際にメモリーを食いつぶす。
現場で信頼されるツールを作るなら、「再構築の強制」→「単位変換の抽象化」→「確実にオブジェクトを破棄する」。この3ステップが必須だ。
—
2. 堅牢な質量特性抽出コード
以下に、実務でそのまま運用可能なプロフェッショナル・コードを示す。`swMassProp` オブジェクトを適切に管理し、エラーハンドリングを組み込んでいる。
Option Explicit
‘ 必要な定数の定義
Private Const SW_UNIT_MM As Long = 0
Private Const SW_UNIT_KG As Long = 0
Sub ExportMassPropertiesToExcel()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMassProp As SldWorks.MassProperty
Dim vCenter As Variant
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ 1. モデルが開かれているか確認
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If
‘ 2. 再構築の強制(常に最新の値を保証する)
swModel.ForceRebuild3 False
‘ 3. MassPropertyオブジェクトの作成
Set swMassProp = swModel.Extension.CreateMassProperty
‘ 4. 単位設定(明示的にMKSを指定するのが鉄則)
swMassProp.UseSystemUnits = False
‘ 5. データ取得
vCenter = swMassProp.CenterOfMass
‘ — 以下、Excelへの出力処理のイメージ —
Debug.Print “重心 X: ” & vCenter(0) 1000 & ” mm”
Debug.Print “重心 Y: ” & vCenter(1) 1000 & ” mm”
Debug.Print “重心 Z: ” & vCenter(2) 1000 & ” mm”
Debug.Print “体積: ” & swMassProp.Volume 1000000000# & ” mm^3″
Debug.Print “表面積: ” & swMassProp.SurfaceArea 1000000# & ” mm^2″
‘ 6. メモリー開放の重要性
Set swMassProp = Nothing
MsgBox “抽出完了”, vbInformation
End Sub
—
3. 実務で勝つための「設計の勘所」
① 単位系をコードにハードコードしない
上記のコードでは、` 1000` などのマジックナンバーで単位変換を行っているが、これはあくまで簡易版だ。本来は、`swModel.Extension.GetUserPreferenceDouble` を使い、ドキュメントごとの単位設定を動的に取得するのが、真に堅牢なエンジニアの流儀である。
② ファイル連携の作法
Excelへの出力を行う際、`CreateObject(“Excel.Application”)` を多用してはいけない。すでに開かれているExcelインスタンスがある場合はそれを取得し、ない場合のみ新規作成する。さらに、処理終了後には `Nothing` を代入するだけでなく、`Quit` メソッドを呼び出すことも忘れてはならない。
③ エラーハンドリングの徹底
「モデルに面がない」「質量が計算できない複雑な曲面」が存在する場合、APIはエラーを吐く。
On Error GoTo ErrorHandler
‘ — 処理 —
Exit Sub
ErrorHandler:
MsgBox “致命的なエラー: ” & Err.Description
Set swMassProp = Nothing
このブロックを入れないコードは、生産現場では「未完成品」として扱われるべきだ。
—
結び:自動化は「信頼」をコードにする作業
SolidWorksの自動化は、単なる作業の代行ではない。設計者の意図をシステムに翻訳し、誤判定を排除する「品質の門番」を作る作業だ。
今回紹介した MassProperty の抽出は、自動化の入り口に過ぎない。しかし、この「正しいオブジェクトのライフサイクル管理」を身につけたあなたは、より高度なアセンブリ構成の解析や、PDM連携といった難題にも必ず立ち向かえるようになる。
さあ、退屈な手作業をコードに置き換え、より創造的な設計の時間を取り戻そう。何かわからないことがあれば、またこの門を叩くといい。
