SolidWorks APIの深淵:CustomPropertyManagerによるメタデータ統制の極意
SolidWorksのAPIを扱う際、多くのエンジニアが「なんとなく」のコーディングで泥沼にはまるのが `CustomPropertyManager` の扱いだ。しかし、ここを制する者は、製品開発のライフサイクル全体を掌握したも同然である。
本稿では、単なるプロパティの読み書きを超え、外部DBとの同期を前提とした、堅牢かつ高効率なアーキテクチャの構築手法を伝授する。
—
1. オブジェクトライフサイクルの真実
多くのコードが `Dim swApp As SldWorks.SldWorks` をグローバルに配置し、終了処理を怠っている。これはメモリリークの温床であり、特に大規模なアセンブリ処理を行う際にSolidWorksを不安定化させる主因となる。
メモリと参照の最適化
`CustomPropertyManager` は、`ModelDoc2` から動的に生成される一時的なオブジェクトだ。これを無造作に繰り返すと、COM参照のガベージコレクションが追いつかない。
‘ 悪い例:ループ内で何度も呼び出す
‘ For i = 0 to 100: swModel.Extension.CustomPropertyManager(“”).Set … : Next
‘ 良い例:参照をキャッシュし、明示的に解放する
Dim swExt As SldWorks.ModelDocExtension
Set swExt = swModel.Extension
Dim swCustProp As SldWorks.CustomPropertyManager
Set swCustProp = swExt.CustomPropertyManager(“”) ‘ コンフィグレーション指定なしは共通プロパティ
‘ 処理終了後
Set swCustProp = Nothing
Set swExt = Nothing
—
2. 実践:外部DB連携を見据えた一括読込・書込エンジン
外部DB(SQL ServerやSQLite)と同期を取る場合、プロパティの「値」だけでなく「解決後の値(Resolved Value)」の取得が不可欠だ。設計者が手入力した数式やリンクを含む値は、そのままではDBに格納できないからだ。
高速アクセスを実現するラッパー関数
`Get` と `Set` を汎用的なプロシージャにカプセル化し、エラーハンドリングを一元管理する。
Public Function GetCustomProp(ByRef swModel As SldWorks.ModelDoc2, ByVal PropertyName As String) As String
Dim swExt As SldWorks.ModelDocExtension
Dim valOut As String, resolvedValOut As String
Dim status As Long
Set swExt = swModel.Extension
‘ 解決後の値を取得する。これがDB連携の際の正解データとなる
status = swExt.CustomPropertyManager(“”).Get4(PropertyName, False, valOut, resolvedValOut)
GetCustomProp = resolvedValOut
End Function
Public Sub SetCustomProp(ByRef swModel As SldWorks.ModelDoc2, ByVal PropertyName As String, ByVal PropertyValue As String)
Dim swExt As SldWorks.ModelDocExtension
Set swExt = swModel.Extension
‘ プロパティが存在しない場合は追加、存在する場合は上書き
‘ swMbSiteCustomProperty: 0 = 共通, 1 = コンフィグレーション個別
swExt.CustomPropertyManager(“”).Add3 PropertyName, swCustomInfoText, PropertyValue, swCustomPropertyReplaceValue
End Sub
—
3. レガシー環境を生き抜くためのWindows API活用
大規模な自動化処理において、SolidWorksのダイアログが裏に隠れたり、プログレスバーが応答なしになったりすることがある。これを回避し、システム間の同期を円滑にするには、Windows APIによる「イベントの強制処理」が必須だ。
If VBA7 Then
Private Declare PtrSafe Function DoEvents Lib “user32” () As Long
Else
Private Declare Function DoEvents Lib “user32” () As Long
End If
‘ 大量ファイル処理時のメインループ内
Public Sub ProcessBatch(files As Collection)
For Each filePath In files
‘ SolidWorksの応答を維持
DoEvents
‘ 処理ロジック…
Next
End Sub
—
4. アーキテクトからの提言:DB連携の「土台」
外部DB(例えばPDM以外で管理している部品台帳)と同期させる際、重要なのは「どちらがマスターか」を明確にすることだ。
1. プロパティの正規化: `CustomPropertyManager` に保存するキー名は、DBのカラム名と完全に一致させること。
2. チェックサムの活用: 頻繁な書込はファイルサイズを肥大化させる。値に変更があった場合のみ `Set` を実行するロジックを必ず挟め。
3. トランザクションの意識: 複数のプロパティを更新する際は、一つでも失敗した場合はロールバックできるようなステート管理をVBA側に実装すること。
最後に
SolidWorks APIは、単なる自動化ツールではない。貴方の設計データを資産に変えるための「インターフェース」だ。
`CustomPropertyManager` を使いこなすことは、CADデータを「図面」から「構造化データ」へ昇華させる第一歩である。
このコードをただのテンプレートとして使うな。自身の環境におけるボトルネックを計測し、このコードをベースに「自分だけの最適解」を設計せよ。それが、真のエンジニアリングというものだ。
