SolidWorks APIの深淵:MassPropertyを制し、モデル検証を「一瞬」で終わらせる技術
設計現場における「質量特性の転記」ほど、エンジニアの貴重な時間を浪費する無意味な作業はない。GUIをポチポチとクリックし、Excelに数値を打ち込む。この作業に費やされる年間数百時間を、我々エンジニアは自動化という名の知的なハックで排除すべきだ。
本稿では、SolidWorks APIの核心である`MassProperty`オブジェクトを扱い、メモリを浪費させず、かつ堅牢にデータを抽出する「アーキテクト級」の実装手法を伝授する。
—
1. 勘違いされたAPI設計からの脱却
多くの初心者は、`ModelDoc2`のメソッドを闇雲に呼び出す。しかし、真のエンジニアは「オブジェクトのライフサイクル」を管理する。
`GetMassProperties`は、単に数値を返すだけの関数ではない。計算負荷の高い「ジオメトリ解析」を伴う重い処理だ。これをループ内で安易に叩けば、複雑なアセンブリではメモリリークや計算エラーを引き起こす。
我々が取るべき戦略は以下の3点だ。
1. オブジェクトの明示的解放: `Nothing`代入によるガベージコレクションの誘発。
2. エラーハンドリングの徹底: 抑制状態の構成部品や、再構築が必要なモデルを検知する。
3. Early Bindingの採用: `Object`型による遅延バインディングは、パフォーマンスとデバッグの敵である。必ず参照設定で `SolidWorks 20xx Type Library` を追加せよ。
—
2. 実装:MassProperty抽出の最適解
以下のコードは、アクティブなドキュメントから質量特性を抽出し、Excelへ書き出すための堅牢なテンプレートだ。
Option Explicit
‘ 伝説的なエンジニアは、変数スコープを極限まで絞る
Public Sub ExportMassPropertiesToExcel()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swMassProp As SldWorks.MassProperty
Dim vCenter As Variant
‘ 1. SldWorksインスタンスの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then Exit Sub
‘ 2. MassPropertyオブジェクトの生成
Set swMassProp = swModel.Extension.CreateMassProperty
‘ 重要: 再計算の強制。これがなければ古いデータが返る
swMassProp.UseSystemUnits = False ‘ メートル法(SI)で取得し、後で変換するのが定石
‘ 3. データの抽出
vCenter = swMassProp.CenterOfMass
‘ 4. Excelへの出力ロジック
Call WriteToExcel(swModel.GetTitle, swMassProp.Volume, swMassProp.SurfaceArea, vCenter)
‘ 5. メモリ解放の儀式
Set swMassProp = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
Private Sub WriteToExcel(fileName As String, vol As Double, area As Double, center As Variant)
‘ 業務自動化の鉄則:Excelアプリの生成は最小限に
Dim xlApp As Object
Set xlApp = CreateObject(“Excel.Application”)
‘ … 以下、セルへの書き込み処理を記述
‘ 注意: ここでもSet xlApp = Nothingを忘れないこと
End Sub
—
3. シニアエンジニアが知るべき「罠」
再構築(Rebuild)の呪縛
`MassProperty`は、モデルが「再構築」されていない場合、最新のジオメトリを反映しない。システムを組む際は、必ず `swModel.ForceRebuild3` を実行するか、`swModel.EditRebuild3` を呼び出し、モデルがクリーンな状態であることを保証せよ。これを行わない自動化は、単なる「誤情報の量産ツール」に過ぎない。
単位系(Units)の罠
APIが返す値は、SolidWorksのシステム設定に依存する場合がある。浮動小数点演算の精度を保つため、内部的には常にSI単位系(メートル、キログラム)で計算し、表示段階で変換するアーキテクチャを組むのが、レガシー環境でも揺るがないシステム構築の定石だ。
大規模アセンブリのパフォーマンス対策
アセンブリの全構成部品をループして集計する場合、`MassProperty`を毎回生成しては破棄する処理はオーバーヘッドが大きい。一度 `GetMassProperties` を呼び出し、必要な情報を構造体にキャッシュする等の工夫が必要になる。
—
最後に:自動化は「守り」ではない、「攻め」である
今回提示したコードは、あくまで「基礎」だ。ここから先は、あなたの環境に合わせて、`FileSystemObject`を用いたログ出力、あるいはSQL Serverへの直接書き込みへと拡張していくべきだ。
コードを書くことは、作業を自動化することと同義ではない。「エンジニアが本来向き合うべき複雑な設計課題」に集中するための時間を生み出すことこそが、我々自動化エンジニアの真の職務である。
VBAはレガシーと言われることもあるが、SolidWorksの深層にこれほど直結できる言語は他にない。このAPIを掌握し、設計現場の風景を変えてやろう。それが、伝説を作るということだ。
