【テクニカル・上級編】【カスタムプロパティ操作】CustomPropertyManagerを使った材料・質量・設計者のメタデータ自動書き込み – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの深淵:CustomPropertyManagerを支配し、メタデータ管理を極限まで自動化する

SolidWorksの自動化において、`CustomPropertyManager`は避けて通れない関所だ。多くのエンジニアが「適当に書き込んで終わり」にしているが、それはPDM(Product Data Management)連携や、将来的なライフサイクル管理を放棄しているに等しい。

真の自動化エンジニアは、単に値を書き込むのではなく、「メモリ管理」「排他制御」「プロパティの整合性」という三つの柱を維持しながら、堅牢なシステムを構築する。本稿では、レガシーなVBA環境であっても、エンタープライズレベルの信頼性を実現するための秘伝を共有する。

1. なぜ「雑な実装」がシステムを崩壊させるのか

多くのスクリプトは、単に `Add` メソッドを呼ぶだけで済ませている。しかし、既存のプロパティを更新する際、`Add` を繰り返せばエラーが発生し、`Set` を使えば存在しない場合にエラーとなる。

これを回避するために「存在確認」を挟むのは定石だが、真のプロフェッショナルは`CustomPropertyManager`オブジェクトのライフサイクルを最小化する。不必要に参照を保持し続けることは、大規模なアセンブリ操作においてメモリリークやCOMオブジェクトの解放遅延を引き起こす原因となるからだ。

2. 堅牢なメタデータ注入の極意

以下は、プロパティの「追加」と「更新」を意識させず、確実にメタデータを永続化するための標準実装パターンである。

‘ —————————————————————————
‘ @brief カスタムプロパティを確実に書き込むためのラッパー関数
‘ @param swModel : SolidWorks.ModelDoc2
‘ @param propName : プロパティ名
‘ @param propValue : 書き込む値
‘ —————————————————————————
Public Sub SetCustomProperty(ByRef swModel As Object, ByVal propName As String, ByVal propValue As String)
Dim swCustPropMgr As Object
Dim res As Long

‘ モデルの構成設定(Configuration)を取得せず、あえてCustomPropertyManagerに直接アクセスする
‘ 汎用的なメタデータは、設定依存ではなくファイル全体(””を指定)に紐付けるのが鉄則
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

‘ Addメソッドは成功時にswCustomInfoAdd (1)、失敗時にswCustomInfoExists (0) を返す
‘ この戻り値の挙動を理解し、条件分岐を最小化するのが高速化の鍵
res = swCustPropMgr.Add3(propName, swCustomInfoText, propValue, swCustomPropertyReplaceValue)

‘ 明示的なオブジェクト解放
‘ VBAのガベージコレクションを待つのではなく、即座にメモリを解放する
Set swCustPropMgr = Nothing
End Sub

押さえるべき重要ポイント

  • `swCustomPropertyReplaceValue` の活用: これをオプションに含めることで、「存在すれば上書き、無ければ新規作成」という排他制御をSWエンジン側に委譲できる。自前で `If Exists Then …` と書くのは、処理コストの無駄である。
  • メモリの解放: `Set swCustPropMgr = Nothing` を怠らないこと。SolidWorksのCOMオブジェクトは強力だが、参照を掴んだままにすると、特にバッチ処理においてメモリ使用量が跳ね上がる。

3. レガシー環境における「質量(Mass)」の同期問題

設計者が最も頭を悩ませるのが、「材料を変更したのに質量プロパティが更新されない」という事態だ。これを自動化するには、`GetMassProperty` を呼んだ後に、プロパティを書き込む必要がある。

ここで重要なのは、「計算の強制」である。

‘ 質量を再計算し、カスタムプロパティに同期させるルーチン
Public Sub SyncMassProperty(ByRef swModel As Object)
Dim swMass As Object
Dim massValue As Double

‘ 質量計算の実行(必ず計算させる)
Set swMass = swModel.Extension.CreateMassProperty
swMass.UseSystemUnits = True
massValue = swMass.Mass

‘ 単位付きの文字列として整形し、メタデータに反映する
Call SetCustomProperty(swModel, “Mass”, Format(massValue, “0.00”) & ” kg”)

Set swMass = Nothing
End Sub

4. チーフアーキテクトからの助言:システム連携の先へ

大規模な開発現場では、VBAは「最終的な実行環境」であって、「設計環境」ではない。

1. バリデーション: プロパティを書き込む前に、社内の部品番号命名規則に合致しているか、`RegExp`(正規表現)で検証せよ。不正なデータをPDMに流せば、後工程の全システムが汚染される。
2. ログ記録: 誰が、いつ、どの値を書き換えたか。`FileSystemObject` を使い、簡単なテキストログを必ず残せ。問題発生時の追跡能力が、君のシステムの寿命を決める。
3. VB.NET/C#への移行準備: VBAでロジックを肥大化させるな。データ処理はクラスライブラリ(DLL)化し、VBAからは呼び出すだけにする。これが将来、SolidWorks APIが.NET Core環境へ完全移行した際に生き残る唯一の道だ。

結論:技術は「仕組み」に宿る

「動けばいい」というコードは、数年後の自分自身を苦しめる。SolidWorks APIの背後にあるアーキテクチャを感じ取り、一歩先を行く設計を心がけてほしい。

君が書いたその一行が、明日、何百もの図面を正しく管理し、設計者の手作業をゼロにする。それこそが、我々エンジニアに課せられた使命である。

何か不明点があれば、またいつでも問いかけてくれ。我々の戦場は、ここからだ。

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