SolidWorks APIの深淵:マルチボディの物理特性を「完全に」掌握する
SolidWorksで複数のソリッドボディが混在するパーツを扱う際、多くの開発者が突き当たる壁がある。それは「アセンブリなら統計情報が取れるのに、パーツ内の個別のボディ特性をどう正確に抽出するか」という問題だ。
`GetMassProperties`を安易に使うのは素人だ。あれはモデル全体を舐めるものであり、マルチボディ環境においては「木を見て森も見ていない」状態になる。真にエンジニアリングで活用できるのは、`IBody2`オブジェクトを直接叩き、個々のメモリ領域から物理特性を抽出する手法だ。
今回は、生産管理や品質検査の現場で即戦力となる、「マルチボディ物理特性抽出エンジン」の設計思想と実装を授ける。
—
1. なぜ「力技のループ」は破綻するのか
多くの初心者は、FeatureManagerからフィーチャを辿り、そこからボディを特定しようとする。これは間違いだ。フィーチャ履歴は設計意図の集積であり、物理演算の結果ではない。
正しいアプローチは以下の通りだ。
1. `IPartDoc`から`GetBodies2`を叩く: これが唯一にして絶対の入り口。
2. `IBody2`のライフサイクル管理: SolidWorksのCOMオブジェクトは強力だが、解放を怠ればメモリリークの温床となる。
3. 座標系の正規化: `GetCenterOfMass`はモデル原点基準で返る。アセンブリ配置や加工基準を考慮するなら、この数値をどう扱うかまで設計に含める必要がある。
—
2. 堅牢な物理特性抽出エンジン:実装コード
このコードは、単に体積を出すだけでなく、エラーハンドリングを徹底し、実務でのデータ連携(CSV出力等)を見据えた構造にしている。
Option Explicit
‘ 物理特性抽出用の構造体(データ管理の要)
Private Type BodyProperty
Name As String
Volume As Double
SurfaceArea As Double
CoM(2) As Double
End Type
Sub ExportBodyProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim vBodies As Variant
Dim swBody As SldWorks.Body2
Dim swMassProp As SldWorks.MassProperty
Dim i As Long
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocPART Then
MsgBox “パーツファイルを開いてください。”, vbCritical
Exit Sub
End If
Set swPart = swModel
vBodies = swPart.GetBodies2(swAllBodies, False)
If IsEmpty(vBodies) Then Exit Sub
‘ 結果出力用のバッファ(実務ではここにファイルI/Oを組み込む)
Debug.Print “BodyName, Volume(m^3), Area(m^2), CoM_X, CoM_Y, CoM_Z”
For i = 0 To UBound(vBodies)
Set swBody = vBodies(i)
‘ MassPropertyオブジェクトの生成(重い処理なのでループ内で生成・解放を徹底)
Set swMassProp = swModel.Extension.CreateMassProperty
swMassProp.AddBodies swBody
‘ 単位系注意: SolidWorksの内部単位はSI(m, kg, s)
Dim vol As Double: vol = swMassProp.Volume
Dim area As Double: area = swMassProp.SurfaceArea
Dim com As Variant: com = swMassProp.CenterOfMass
Debug.Print swBody.Name & “, ” & vol & “, ” & area & “, ” & _
com(0) & “, ” & com(1) & “, ” & com(2)
‘ 参照解放(メモリリーク対策の鉄則)
Set swMassProp = Nothing
Set swBody = Nothing
Next i
End Sub
—
3. 実務で「詰まない」ための3つの知見
① 単位系(Unit)の罠
`GetVolume`などが返す値は、SolidWorksの内部単位である「メートル法(SI)」だ。図面上でミリメートルを使っているからといって、そのままExcelに貼り付けると10億倍の誤差が生じる。必ず計算段階で `10^9` を乗ずるなどの変換処理を挟むこと。
② モデルの再構築(Rebuild)の強制
コード実行前に `swModel.ForceRebuild3` を呼ぶことを強く推奨する。マルチボディパーツでは、寸法変更後に物理特性が更新されていない状態でAPIを叩くと、古い計算結果を平然と返してくる。「信頼できない数値はゴミと同じ」である。
③ データベース連携のベストプラクティス
このデータをCSVに書き出す際、`FileSystemObject` を使うのは良いが、ファイルパスには必ず日付時刻を含めよ。また、ボディ名(`swBody.Name`)はユーザーが変更可能であるため、データベースと連携する際はボディの「ID」や「コンフィギュレーション名」を複合キーとして管理し、トレーサビリティを確保すること。
—
終わりに:伝説への一歩
このスクリプトは、単なる自動化ツールではない。品質検査工程において「人間の目」を介在させず、設計と物理特性をダイレクトに紐づけるための強力なパイプラインだ。
VBAは古臭いと言われることもあるが、SolidWorksのAPIを直接叩ける唯一無二の言語であることに変わりはない。このアーキテクチャを理解すれば、君の自動化ツールは「動けばいいもの」から「止まらない基幹システム」へと進化する。
次は、これをアセンブリ対応へ拡張するか、あるいはPDMへの自動チェックイン機能と統合するか。道は無限だ。健闘を祈る。
