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

スポンサーリンク

SolidWorks APIの深淵:カスタムプロパティの「完全クレンジング」でデータガバナンスを掌握せよ

SolidWorksの運用において、最も頭を抱えるのが「ゴミ溜めのようなカスタムプロパティ」だ。
図面の改訂を繰り返すたび、設計者の気まぐれなプロパティが蓄積され、PDMやPLMシステムとの連携時にエラーを吐く。あるいは、古いテンプレートから引き継がれた不要なメタデータが、BOMの正確性を損なっている。

多くのエンジニアが「プロパティを上書きする」という対症療法に終始する中、真のプロフェッショナルは「不要なメタデータの物理的抹消」によるデータガバナンスを行う。本稿では、`CustomPropertyManager`を徹底的に掌握し、堅牢なクレンジング機構を構築する手法を伝授する。

1. なぜ「上書き」ではなく「削除」なのか

多くの初学者は `Add2` や `Set2` メソッドを多用するが、それではプロパティの「ゴミ」は残ったままだ。
不要なプロパティが存在することで、以下のリスクが発生する。

  • PLM連携の競合: 必須項目と競合する名前の不要プロパティが存在し、インポートエラーが発生する。
  • メモリとパフォーマンス: 大規模アセンブリにおいて、無駄な文字列データがDocumentオブジェクトのメモリを圧迫する。
  • BOMの不整合: 意図しないプロパティが図面枠やBOMに抽出され、設計ミスの温床となる。

我々が目指すべきは、「あるべき状態(ホワイトリスト)」以外の全てのメタデータを破棄する「完全クレンジング」である。

2. 実装の要:CustomPropertyManagerのライフサイクル管理

`GetNames` で全キーを取得し、`Delete2` で抹消する。このプロセスにおける注意点はただ一つ。「イテレーション中のインデックス変化」だ。コレクションを削除しながらループを回すと、インデックスがずれて処理漏れが発生する。

堅牢なクレンジング・ロジック(プロダクション・コード)

このコードは、指定したホワイトリスト以外のプロパティを全て削除する汎用プロシージャだ。

Option Explicit

‘ —————————————————————————
‘ @brief カスタムプロパティの完全クレンジング処理
‘ @param swModel ModelDoc2オブジェクト
‘ @param vWhiteList 削除してはならないプロパティ名の配列
‘ —————————————————————————
Public Sub CleanseCustomProperties(ByRef swModel As SldWorks.ModelDoc2, ByRef vWhiteList As Variant)
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim vPropNames As Variant
Dim i As Long
Dim j As Long
Dim bKeep As Boolean

‘ コンフィギュレーション指定なし(図面または全体プロパティ)を対象とする
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

‘ 全プロパティ名を取得
swCustPropMgr.GetAll vPropNames, Empty, Empty

If IsEmpty(vPropNames) Then Exit Sub

‘ 逆順でループさせる(削除によるインデックスズレを回避するため)
For i = UBound(vPropNames) To LBound(vPropNames) Step -1
bKeep = False

‘ ホワイトリストとの照合
For j = LBound(vWhiteList) To UBound(vWhiteList)
If StrComp(vPropNames(i), vWhiteList(j), vbTextCompare) = 0 Then
bKeep = True
Exit For
End If
Next j

‘ リストに存在しなければ抹消
If Not bKeep Then
swCustPropMgr.Delete2 vPropNames(i)
Debug.Print “Deleted Property: ” & vPropNames(i)
End If
Next i
End Sub

3. 運用フェーズにおけるアーキテクトの助言

パフォーマンスの重みを知る

このコードを大規模アセンブリや、何百ものパーツが含まれるプロジェクトで実行する場合、必ず `swModel.Extension.Rebuild` を呼び出すタイミングを制御すること。プロパティ変更のたびに再計算を走らせるのは愚の骨頂だ。可能であれば、`swModel.EditSuppress` 等で再計算を抑制した状態で処理を完結させ、最後に一度だけリビルドせよ。

データベース連携の注意点

PLM連携を行う場合、このマクロを「チェックイン前」の自動トリガーとして組み込むのが定石だ。

  • ログ出力: どのプロパティが削除されたか、必ずCSV等でログを残せ。後から「必要なプロパティが消えた」と騒ぐ現場エンジニアへの防衛策となる。
  • ファイル属性: `ReadOnly` のファイルに対して実行しようとするとAPIはエラーを返す。事前に `GetFileReadOnly` で状態を確認し、必要に応じてチェックアウトを促す設計にすべきだ。

4. 最後に:エンジニアとしての矜持

VBAは「簡易ツール」と思われがちだが、SolidWorks APIを操る際、それは巨大なCOMオブジェクトのオーケストレーターとなる。
一度書いたコードが、社内の何千というファイルに対して正しく動作し、データ汚染を根絶する。この「自動化による秩序の構築」こそが、業務自動化エンジニアの真価だ。

「とりあえず動くコード」で満足するな。
「意図した通りにしか動かない堅牢なコード」を書き、手作業の泥沼から設計者を解放せよ。それが、我々に課せられたミッションである。

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