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

スポンサーリンク

SolidWorks APIの「負の遺産」を一掃せよ:カスタムプロパティを完全制御するデータガバナンス術

こんにちは。現場でSolidWorks APIと格闘している皆さん、お疲れ様です。

図面やモデルを開いたとき、プロパティ欄が「謎のゴミデータ」で埋め尽くされているのを見て溜息をついたことはありませんか?「以前の設計者が残した残骸」や「コピー&ペーストで増殖した重複項目」。これらは、将来的にPLM(製品ライフサイクル管理)システムと連携する際に致命的なエラーを引き起こす地雷となります。

今回は、マクロの記録を卒業し、「APIでオブジェクトを直接操作する」というエンジニアの第一歩として、カスタムプロパティのクレンジング手法を伝授します。

1. なぜ「手作業」ではなく「コード」なのか?

SolidWorksのカスタムプロパティは、ただのテキストボックスではありません。内部的には`CustomPropertyManager`という非常に強力なオブジェクトによって管理されています。

手作業で削除するのは簡単ですが、数百・数千のファイルに対してそれを行うのは非現実的です。また、誤ったプロパティを一つでも残せば、PDMやPLMの連携時にデータ不整合が発生します。

「プログラムで定義した正解のリスト以外は、すべて消し去る」

この強気な姿勢こそが、堅牢なデータガバナンスの第一歩です。

2. 核心オブジェクト:CustomPropertyManager

SolidWorks APIにおいて、プロパティを操作する際の主役は以下のオブジェクトです。

  • `ModelDoc2`: 今開いている部品や図面。全ての起点です。
  • `CustomPropertyManager`: プロパティの門番。このオブジェクトを通じて、読み取り(`Get`)、書き込み(`Set`)、削除(`Delete2`)を行います。

陥りがちな罠:`.Delete` と `.Delete2` の違い

APIには古い`.Delete`メソッドが存在しますが、現在は非推奨です。必ず `.Delete2` を使用してください。 `.Delete2` は成功したかどうかの戻り値(Boolean)を返し、処理の成否を正確にハンドリングできるため、堅牢なコードを書く上で必須となります。

3. 実践:カスタムプロパティ完全クレンジングマクロ

それでは、不要なプロパティを根こそぎ削除するコードを見ていきましょう。このコードでは「社内で許可されたプロパティ名」以外を全て消去する戦略をとります。

Option Explicit

‘ 許可するプロパティ名のリスト(ここを社内規定に合わせて変更してください)
Private Const ALLOWED_PROPS As String = “図面番号,品名,材質,設計者”

Sub CleanUpCustomProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim vPropNames As Variant
Dim i As Long
Dim propName As String

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then MsgBox “ファイルを開いてください”: Exit Sub

‘ プロパティマネージャの取得(Configurationを指定しない場合はデフォルト)
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

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

If IsEmpty(vPropNames) Then MsgBox “プロパティは空です”: Exit Sub

‘ 後ろからループ(削除時にインデックスがズレるのを防ぐため)
For i = UBound(vPropNames) To LBound(vPropNames) Step -1
propName = vPropNames(i)

‘ 許可リストに含まれていないか判定
If InStr(1, ALLOWED_PROPS, propName, vbTextCompare) = 0 Then
‘ 削除実行(Delete2は成功時にTrueを返す)
If swCustPropMgr.Delete2(propName) Then
Debug.Print “削除成功: ” & propName
Else
Debug.Print “削除失敗: ” & propName
End If
End If
Next i

MsgBox “クレンジング完了!”
End Sub

4. コードの解説:ここが「プロ」の流儀

1. `UBound` から `LBound` への逆順ループ:
配列の中身を削除しながらループする場合、前から回すとインデックスがずれてエラーやスキップが発生します。配列操作の基本中の基本ですが、これを徹底するだけでバグの9割は防げます。
2. `GetNames` の威力:
プロパティ名が不明な場合でも、このメソッドを使えば全てのキーを配列として取得できます。これにより、どんなにカオスな図面でも対応可能です。
3. `vbTextCompare`:
`InStr`関数の第4引数にこれを指定することで、大文字・小文字を区別しない比較を行っています。`”PARTNO”`と`”PartNo”`を同一視するための、ちょっとした配慮です。

最後に:自動化の先にあるもの

このマクロをベースに、`SldWorks.Application`の`GetDocuments`などを組み合わせて、特定のフォルダ配下の全ファイルを一括処理するツールに拡張してみてください。

「面倒な手作業」を「コードによる確実なルール」に置き換える。これこそが、SolidWorks APIを操るエンジニアの醍醐味です。ここをクリアできれば、あなたはもう初心者ではありません。

何か分からないことや、さらに高度な条件分岐(コンフィギュレーションごとの削除など)が必要な場合は、いつでも聞いてください。設計者の時間を守るためのコード、一緒に育てていきましょう!

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