【テクニカル・上級編】【カスタムプロパティの高度なメタデータ管理】CustomPropertyManager.GetNamesとDelete2を活用したプロパティの完全クレンジング – SolidWorks VBA解析バイブル

スポンサーリンク

混沌としたメタデータを浄化せよ:CustomPropertyManagerによる「完全クレンジング」の極意

SolidWorksのモデルデータに数十年蓄積された「ゴミ」を見たことがあるか?
手動編集の残骸、旧PLMシステムの遺物、そして開発者の気まぐれで増殖した重複プロパティ。これらは単なる無駄ではない。PDM(Product Data Management)連携時や、BOM自動生成のフェーズで致命的なデータ汚染を引き起こす「技術的負債」そのものだ。

本稿では、`CustomPropertyManager`を徹底的に掌握し、散乱したメタデータを一掃、PLMへ適正なデータを流し込むための「外科手術級のクレンジング・アーキテクチャ」を伝授する。

1. なぜ「GetNames」と「Delete2」でなければならないのか

多くのエンジニアは`Delete`メソッドを安易に使い、プロパティが存在しない場合に発生するエラーハンドリングに追われる。しかし、真のアーキテクトは「状態」を制御する。

  • GetNamesの真実: このメソッドは、単なるプロパティ名の配列を返すだけではない。システム内でのプロパティの「生存確認」を行うための最初の門番だ。
  • Delete2の優位性: 単なる`Delete`との決定的違いは、コンフィギュレーション特有のオーバーライド状態をクリアする能力にある。特に大規模アセンブリや複雑なコンフィギュレーションを持つモデルでは、このメソッドの挙動を理解しているか否かが、処理速度の分水嶺となる。

2. 極限のクレンジング・アーキテクチャ:実装コード

以下は、不要なプロパティを物理的・論理的に排除し、PLMに適合しない項目を抹消する堅牢な実装だ。

Option Explicit

‘ 伝説的なチーフアーキテクトによる、完全クレンジング・ルーチン
Public Sub CleanseCustomProperties(ByRef swModel As SldWorks.ModelDoc2)
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim vNames As Variant
Dim i As Long
Dim propName As String

‘ プロパティ管理オブジェクトを取得 (コンフィギュレーション指定なしでドキュメントレベル)
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

‘ 全プロパティ名を取得
vNames = swCustPropMgr.GetNames

If IsEmpty(vNames) Then Exit Sub

‘ 削除対象のホワイトリスト(これ以外はすべて抹消する極端なガバナンス)
Dim validProps As Variant
validProps = Array(“PART_NUMBER”, “DESCRIPTION”, “MATERIAL”, “AUTHOR”)

For i = LBound(vNames) To UBound(vNames)
propName = vNames(i)

If Not IsInArray(propName, validProps) Then
‘ Delete2は戻り値で成功/失敗を返すが、型管理を厳密に行うこと
‘ 第1引数に名前を渡す。戻り値: 0=Success
If swCustPropMgr.Delete2(propName) = 0 Then
Debug.Print “Purged: ” & propName
End If
End If
Next i

‘ 終了後のメモリ最適化:明示的な解放
Set swCustPropMgr = Nothing
End Sub

Private Function IsInArray(val As String, arr As Variant) As Boolean
Dim i As Long
For i = LBound(arr) To UBound(arr)
If StrComp(val, arr(i), vbTextCompare) = 0 Then
IsInArray = True
Exit Function
End If
Next i
End Function

3. パフォーマンスとメモリの深淵

VBA環境において、`swModel.Extension.CustomPropertyManager`をループ内で再生成するのは愚策だ。オブジェクトのインスタンス生成には相応のオーバーヘッドが伴う。

  • キャッシュの戦略: 大量のアセンブリをバッチ処理する場合、`CustomPropertyManager`の取得はループの最外層で行い、必要に応じて再利用する。
  • メモリの解放: VBAのガベージコレクションを信じてはいけない。`Set obj = Nothing`は「おまじない」ではない。参照カウントを確実にデクリメントし、OSレベルでのハンドル解放を促す。特に数千ファイルに及ぶ大規模マイグレーションでは、この数行の有無が「プロセス生存時間」を左右する。

4. システム間連携を見据えた「データガバナンス」

PLMシステムへデータを送り込む際、最も恐ろしいのは「空白」ではなく「意図しない型の誤認」だ。`CustomPropertyManager.Get`で取得できるのはあくまで文字列としてのプロパティである。

もし、貴社のシステムが型を厳密に要求する場合、削除だけでなく、「プロパティの再定義」までセットで行うべきだ。`Add3`メソッドを使い、既存のプロパティを上書きするフローを組み込め。

最後に:エンジニアへの提言

SolidWorksのAPIは、単なる自動化ツールではない。貴社の製造情報の源流を整理し、未来の設計資産を保護するための「防波堤」である。

「動けばいい」というコードは、数年後に必ず自分たちを苦しめる。プロパティ一つを消すにも、その背景にあるビジネスロジックを読み解くこと。それこそが、伝説的なエンジニアが持つべき「視座」だ。

次にファイルを開く時、ただのデータとしてではなく、管理すべき生命体としてモデルと対峙してほしい。コードは、そのための最も鋭利なメスとなるはずだ。

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