SolidWorks APIの真髄:CustomPropertyManagerを支配し、メタデータ地獄から脱却する
SolidWorksで設計業務を自動化しようと試みたエンジニアが、まず最初にぶち当たる壁。それが「カスタムプロパティの制御」だ。
「とりあえず値を書き込めればいい」という甘い考えでコードを書くと、後々、PDM連携でのエラー、図面枠の表記崩れ、そして何より「なぜかプロパティが更新されない」という不可解なバグに時間を浪費することになる。
今日は、数千の部品を管理する大規模環境でも破綻しない、堅牢なカスタムプロパティ操作の極意を伝授する。
—
1. なぜ「力技」ではいけないのか?
多くの入門書は、単純なプロパティへの代入を推奨する。しかし、SolidWorksのオブジェクトモデルにおいて、カスタムプロパティを扱うには`CustomPropertyManager`を介した正しいライフサイクル管理が不可欠だ。
陥りやすい「3つの死の罠」
1. 構成部品(Configuration)の混同: モデルの「全体」に書き込むべきか、「現在の構成」に書き込むべきかを意識していない。
2. 存在チェックの欠如: プロパティが存在しない状態で無理に書き込もうとする、あるいは空文字で上書きしてメタデータを破壊する。
3. リフレッシュの怠慢: プロパティを更新した直後にモデルを再構築(Rebuild)せず、UIや図面が古い情報を表示し続ける。
これらを解決するための「プロダクション品質」のコードを見ていこう。
—
2. 堅牢なプロパティ管理のための実装パターン
以下のコードは、単に値をセットするだけでなく、プロパティの存在を確認し、なければ作成し、あれば値を更新する「Upsert(Update or Insert)」のロジックを備えている。
‘ SolidWorksカスタムプロパティ操作の決定版
Public Sub SetCustomProperty(ByVal swModel As SldWorks.ModelDoc2, _
ByVal propName As String, _
ByVal propValue As String, _
Optional ByVal configName As String = “”)
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim res As Long
‘ 構成指定がない場合は、モデル全体(空文字)を対象とする
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(configName)
‘ 核心:Add3メソッドの戻り値を利用する
‘ Add3は、存在しない場合は作成し、存在するなら何もせずエラーを返す(こともある)ため
‘ Set2メソッドを主軸に使うのが最も安全
res = swCustPropMgr.Set2(propName, propValue)
‘ エラー処理: 0は成功、それ以外は失敗(値が長すぎる等)
If res <> 0 Then
Debug.Print “Error: プロパティ設定に失敗しました – ” & propName
End If
‘ 最後に再構築をかける(図面やPDM連携への即時反映のため)
swModel.ForceRebuild3 False
End Sub
なぜこの実装なのか?
- `swModel.Extension.CustomPropertyManager`: `GetCustomInfoValue`のような古いAPIは使うな。`Extension`経由のアクセスが現在のSolidWorks APIにおける標準であり、メモリ効率・安定性が格段に高い。
- `Set2`メソッドの活用: 単純に値を更新する際、最もシンプルかつ副作用の少ないメソッドだ。
- 構成(Configuration)の明示: 引数に`configName`を設けることで、部品固有のプロパティと、全構成共通のプロパティを意図的に切り替えられる設計にしている。
—
3. 実務で勝つための運用戦略
コードを書くだけでは「エンジニア」ではない。「アーキテクト」は運用まで見通す。
1. プロパティ名(キー)の定数化
コード内で文字列(”材質”など)を直接書くのは厳禁だ。必ずプロジェクトの先頭で定数として定義しろ。将来的にプロパティ名が変わったとき、修正箇所が1箇所で済む。
Public Const PROP_MATERIAL As String = “材質”
Public Const PROP_DESIGNER As String = “設計者”
2. PDMとの整合性
SolidWorks PDMを使用している場合、メタデータの更新には「チェックアウト」が必須だ。APIで書き込む前に、`swModel.IsReadOnly`を確認するチェックロジックを必ず挟むこと。書き込み権限がないファイルに無理やり書き込もうとして、SolidWorksがフリーズするのは、よくある光景だ。
3. バッチ処理時のパフォーマンス
数百のファイルを一括処理する場合、`swApp.Visible = False`(バックグラウンドモード)で開き、各ファイルで`Set2`を実行したら即座に保存・閉じるというループを徹底すること。メモリリークを防ぐため、`swModel`オブジェクトをループのたびに確実に開放(`Set swModel = Nothing`)することを忘れるな。
—
結論:自動化は「防衛」から始まる
自動化ツールの価値は、いかに速く処理するかよりも、「いかにしてエラーをゼロにするか」で決まる。今回紹介した`CustomPropertyManager`の扱いは、SolidWorks APIを使いこなす上での「土台」だ。
この土台が揺らぐと、どんなに高度な自動化コードを組んでも、最終的に人手による修正が入り、信頼性を失う。
さあ、あなたの書いたコードで、設計者の本来の仕事である「創造」の時間を奪っているメタデータ入力の手間を、跡形もなく消し去ってやってほしい。
それができるのは、この技術を理解した、あなただけなのだから。
