【SolidWorks VBA極限解説】CustomPropertyManager.Set2を用いた材質・質量情報の外部データベース連携と自動同期
長年、製造業のCAD/PDMインフラを支えてきたエンジニアであれば、誰もが一度は直面する課題がある。それは、「CAD上の3Dモデルが持つ物理特性(質量や材質)と、基幹システム(ERP/PLM)や図面枠上のメタデータとの乖離」だ。
設計変更のたびに、手動でカスタムプロパティを更新し、質量を再計算し、図面を更新する――。この泥臭い作業は、ヒューマンエラーの温床であり、手戻りの最大の原因となる。
今回は、SolidWorks VBAの底力を限界まで引き出し、パーツの物理特性から質量を動的に取得・確定させ、`CustomPropertyManager.Set2`を用いてカスタムプロパティへ完璧に書き戻す、外部DB連携の自動同期アーキテクチャを解説する。
レガシーなVBAの限界を見据え、メモリリークの排除、APIの戻り値の厳密なハンドリング、そして外部システムとのシームレスな統合を実現する極限の知見をここに公開する。
—
1. 現場を崩壊させる「暗黙の罠」:なぜ通常のプロパティ操作は失敗するのか
多くのプログラマブルなVBAコードは、以下のような素朴な実装から始まる。
‘ 【アンチパターン】よくある脆弱なコード例
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
swModel.CustomPropertyManager(“”).Set “Mass”, swModel.GetMassProperties.Mass
このコードは、小規模なテストでは動くかもしれないが、実務の巨大なアセンブリや複雑なパーツにおいては完全に破綻する。その理由は以下の3点に集約される。
1. 質量プロパティの遅延評価と未更新(Stale Data):
ジオメトリが変更された直後のモデルは、質量プロパティがキャッシュされた古い状態のまま保持されている場合がある。明示的に再計算を強制しなければ、ゴミデータをDBやプロパティに書き込むことになる。
2. コンフィギュレーションコンテキストの曖昧さ:
`ModelDoc2.CustomPropertyManager` はアクティブなコンフィギュレーションを暗黙的に対象とするが、コンフィギュレーション特有のプロパティ(Configuration-Specific)と、すべてのコンフィギュレーション共通のプロパティ(Default)の区別がついていないと、PDM連携時にデータが欠落する。
3. `Set2` APIの戻り値無視:
`CustomPropertyManager.Set2` は成功・失敗を示す列挙値(`swCustomInfoAddResult` / `swCustomInfoModifyResult`)を返す。これを無視してエラーハンドリングを怠ると、プロパティがロックされている環境や読取専用ファイルでサイレントエラーを引き起こす。
—
2. アーキテクチャ設計:堅牢なメタデータ同期フロー
真に信頼できるシステム連携を実現するためには、以下のライフサイクルを厳守する必要がある。
[SolidWorks Model]
↓ (1. ジオメトリ・材質の強制的再評価)
[MassProperties 取得]
↓ (2. 単位系の正規化 [kg / mm])
[CustomPropertyManager.Set2]
↓ (3. 戻り値の厳密な評価 & 変更フラグ制御)
[外部DB / ERP / PDM 連携]
特に、材質名(Material)に関しては、SolidWorks内の材質データベース(sldmat形式)の名称と、外部ERP側のマスタコードが一致している必要がある。これをコード側で仲介するロジックも含めて実装する。
—
3. 実装コード:極限まで最適化された同期モジュール
以下に、実務の現場でそのまま稼働させられる、堅牢性とパフォーマンスを極限まで高めたVBAコードを示す。オブジェクトの明示的な解放と、APIのエラーハンドリングを徹底している。
Option Explicit
‘ ==============================================================================
‘ 処理名 : SyncMassAndMaterialToCustomProperties
‘ 概要 : パーツの最新物理特性(質量・体積・重心)と材質を再計算し、
‘ カスタムプロパティへ確実に同期した上で、外部DB連携用データを生成する。
‘ ==============================================================================
Public Sub SyncMassAndMaterialToCustomProperties()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim swMassProp As SldWorks.MassProperties
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If
‘ 対象がパーツであることを強制(アセンブリの場合は拡張が必要)
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行可能です。”, vbExclamation, “Validation Error”
Exit Sub
End If
Set swPart = swModel
On Error GoTo ErrorHandler
‘ 1. 材質名の取得(マテリアルデータベースからの正確な名称抽出)
Dim matName As String
Dim matDB As String
matName = swPart.GetMaterialName(matName)
‘ ※ 簡易的にアクティブコンフィギュレーション名も取得
Dim configName As String
configName = swModel.ConfigurationManager.ActiveConfiguration.Name
‘ 2. カスタムプロパティマネージャーの取得(コンフィギュレーション固有プロパティを対象とする場合)
‘ 引数にコンフィギュレーション名を渡すことで、グローバルとローカルを厳密に制御
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(configName)
‘ 3. 質量プロパティの強制的再計算と取得
Set swMassProp = swModel.Extension.CreateMassProperties()
If swMassProp Is Nothing Then
Err.Raise 1000, “MassProps”, “質量プロパティオブジェクトの生成に失敗しました。”
End If
‘ 精度設定(高精度計算を強制)
swMassProp.IncludeSweetHole = True
Dim rawMass As Double
Dim massKg As String
rawMass = swMassProp.Mass ‘ 単位は通常 kg (ドキュメント設定依存)
‘ 小数点以下3桁にフォーマット(必要に応じて調整)
massKg = Format(rawMass, “0.000”) & ” kg”
‘ 4. CustomPropertyManager.Set2 による書き込みと戻り値の検証
Call SetPropertyRobust(swCustPropMgr, “SW_MASS”, massKg)
Call SetPropertyRobust(swCustPropMgr, “SW_MATERIAL”, IIf(matName = “”, “未設定”, matName))
Call SetPropertyRobust(swCustPropMgr, “SW_SYNC_DATE”, Format(Now, “YYYY-MM-DD HH:NN:SS”))
‘ 5. モデルの強制リビルド・変更フラグの付与
swModel.ForceRebuild3 False
‘ 6. 外部データベース(例: SQL Server / REST API等)への送信処理のフック
Call PostToExternalDatabase(swModel.GetPathName(), massKg, matName)
‘ クリーンアップ
MsgBox “材質・質量情報の同期が正常に完了しました。”, vbInformation, “Success”
GoTo CleanUp
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “Critical Error”
CleanUp:
‘ オブジェクトの明示的解放(メモリリーク防止の鉄則)
Set swMassProp = Nothing
Set swCustPropMgr = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
‘ ==============================================================================
‘ 内部関数 : SetPropertyRobust
‘ 概要 : Set2の戻り値を監視し、追加(Add)と変更(Set)を安全に吸収するラッパー
‘ ==============================================================================
Private Sub SetPropertyRobust(custPropMgr As SldWorks.CustomPropertyManager, propName As String, propValue As String)
const swCustomInfoAddSuccess = 1
const swCustomInfoModifySuccess = 2
Dim result As Long
‘ Set2の第2引数: 0 = 既存を上書き / 独自定義タイプに応じた処理
result = custPropMgr.Set2(propName, propValue)
Select Case result
Case swCustomInfoAddSuccess, swCustomInfoModifySuccess
‘ 成功
Case Else
‘ 失敗時のフォールバック(読取専用やロック時)
Debug.Print “Warning: カスタムプロパティ [” & propName & “] の書き込みに失敗しました。Result Code: ” & result
End Select
End Sub
‘ ==============================================================================
‘ 外部連携スタブ : PostToExternalDatabase
‘ 概要 : 外部DBやPDMへデータを非同期、あるいはトランザクション処理で送信
‘ ==============================================================================
Private Sub PostToExternalDatabase(filePath As String, mass As String, material As String)
‘ 実運用ではここで WinHTTP (MSXML2.ServerXMLHTTP.6.0) や ADODB を用いて
‘ 外部Web APIエンドポイントへ JSON 페이로드をPOSTする。
Debug.Print “[DB Sync] Path: ” & filePath & ” | Mass: ” & mass & ” | Material: ” & material
End Sub
—
4. シニアエンジニアが押さえるべき「実務の急所」
上記のコードを現場に投入する際、チーフアーキテクトとして特筆すべき注意点がいくつか存在する。
メモリ管理とCOMインターフェースの解放
VBAはガベージコレクションの挙動がブラックボックスである。SolidWorks APIを使用する際、`CreateMassProperties` や `CustomPropertyManager` などのCOMオブジェクトをローカル変数として大量に生成・放置すると、SolidWorks本体のメモリ空間リークを引き起こし、数時間の連続稼働でCADがクラッシュする原因になる。
コードの最後で必ず `Set xxx = Nothing` を明示し、スコープを抜ける際の参照カウントを確実にデクリメントさせることが、プロフェッショナルの条件だ。
パフォーマンスの最適化:大規模アセンブリへの展開
今回はパーツ(Part)を対象としたが、これをアセンブリ(Assembly)に応用する場合、軽量コンポーネント(Lightweight Components)の扱いがボトルネックになる。軽量状態のコンポーネントは質量プロパティを正確に返さないため、API側で強制的に解決(Resolve)させるか、あるいはトップレベルのMassPropertiesに依存する設計上のトレードオフを考慮しなければならない。
—
総括
SolidWorks VBAは、単なる「マクロの記録」の延長ではない。正しくAPIのライフサイクルを理解し、COMの挙動とメモリモデルを掌握すれば、市販の高価なPIM/PDMアドインに匹敵する、あるいはそれを凌駕するカスタム自動化基盤を構築できる。
`CustomPropertyManager.Set2` と物理特性エンジンの融合は、CADと基幹システムを繋ぐ最強のパイプラインだ。この知見を武器に、あなたの設計現場を真のデジタルツインへと導いてほしい。
