混沌としたメタデータを浄化せよ: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は、単なる自動化ツールではない。貴社の製造情報の源流を整理し、未来の設計資産を保護するための「防波堤」である。
「動けばいい」というコードは、数年後に必ず自分たちを苦しめる。プロパティ一つを消すにも、その背景にあるビジネスロジックを読み解くこと。それこそが、伝説的なエンジニアが持つべき「視座」だ。
次にファイルを開く時、ただのデータとしてではなく、管理すべき生命体としてモデルと対峙してほしい。コードは、そのための最も鋭利なメスとなるはずだ。
