【入門編】【カスタムプロパティ操作】CustomPropertyManager.Set2を用いた材質・質量情報の外部データベース連携と自動同期 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは! SolidWorks自動化の現場で泥臭く、かつ優雅に設計効率化を追求しているシニアエンジニアです。

マクロの記録ボタンを押して出てきたコードをそのまま動かしてみたものの、「なんだか不安定だな」「実務で使うには一歩足りないな」と感じていませんか?

今回は、設計現場で必ず直面する「パーツの物理特性(質量や材質)を自動取得し、カスタムプロパティ経由で外部システムや図面枠と完全同期させる」という、実務直結の極意を伝授します。

ここをクリアすれば、単なる「おもちゃのマクロ」から脱却し、全社をあっと言わせる「本物の業務自動化エンジニア」への階段を確実に登ることができますよ。しっかりついてきてくださいね!

なぜ「カスタムプロパティの自動同期」が設計の命綱なのか?

パーツの材質を変えたり、形状を削ったりしたとき、図面枠にある「質量(MASS)」や「材質(MATERIAL)」の欄を毎回手入力していませんか?
手入力である以上、設計変更のたびにヒューマンエラー(図面と3Dモデルの数値違い)が忍び込むリスクがつきまといます。

これをAPIの力で完全自動化します。
流れとしてはこうです。

1. SolidWorksの3Dモデルから最新の「質量」と「材質」をプログラムで計算・取得する
2. `CustomPropertyManager` を使って、指定したカスタムプロパティへ確実に書き込む
3. (将来的には)このプロパティをPDMやExcel、外部DBへ流し込む

この一連の流れをVBAで構築します。それでは、具体的なコードの世界へ飛び込みましょう!

実装の全体像:マクロの記録では絶対に辿り着けないコード

まずは、今回使用する完成版のVBAコードをお見せします。
「なんだか難しそう…」と思うかもしれませんが、一つひとつ丁寧に解説するので安心してください。VBAエディタ(Alt + F11)を開き、標準モジュールに貼り付けてそのまま実行できる実用コードです。

Option Explicit

‘ ==============================================================================
‘ 【極限の知見】パーツの物理特性とカスタムプロパティを完全同期させるマクロ
‘ ==============================================================================
Sub SyncMassAndMaterialToCustomProperties()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swCustPropMgr As SldWorks.CustomPropertyManager

‘ アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ ドキュメントが開かれていない、またはパーツ以外の場合は処理を中断
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType <> swDocPART Then
MsgBox “このマクロは「パーツ(Part)ファイル」でのみ実行可能です。”, vbExclamation, “対象外”
Exit Sub
End If

Set swPart = swModel

‘ ————————————————————————–
‘ 1. 材質(Material)情報の取得
‘ ————————————————————————–
Dim matName As String
Dim dbName As String
matName = swPart.GetMaterialName(dbName)

If matName = “” Then
matName = “未設定”
Else
matName = matName & ” (” & dbName & “)”
End If

‘ ————————————————————————–
‘ 2. 質量(Mass)情報の取得(単位系や密度を反映した正確な値)
‘ ————————————————————————–
Dim swMassProp As SldWorks.MassProperty
Set swMassProp = swModel.Extension.CreateMassProperty

If swMassProp Is Nothing Then
MsgBox “質量特性の取得に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If

‘ 質量計算を実行(kg単位で取得するために調整、標準はグラムの場合が多いので注意)
Dim massValue As Double
massValue = swMassProp.Mass ‘ デフォルトはkg (ドキュメント単位系に依存)

‘ 小数点第2位までの文字列に整形(例: “1.25 kg”)
Dim massString As String
massString = Format(massValue, “0.00”) & ” kg”

‘ ————————————————————————–
‘ 3. CustomPropertyManager を用いたプロパティの書き込み(ここが本丸!)
‘ ————————————————————————–
‘ コンフィギュレーション非依存の「設定なし(””)」のプロパティ領域を取得する場合
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)

Dim Result As Long
‘ 引数: (FieldName, LinkStatus, Value)
‘ swCustomInfoAdd: 新規追加または上書き
Result = swCustPropMgr.Set2(“SW_MATERIAL”, swCustomInfoText, matName)
Result = swCustPropMgr.Set2(“SW_MASS”, swCustomInfoText, massString)

‘ 変更をモデルに強制反映(リビルド)
swModel.ForceRebuild3 False

MsgBox “カスタムプロパティの同期が完了しました!” & vbCrLf & _
“・材質: ” & matName & vbCrLf & _
“・質量: ” & massString, vbInformation, “成功”

End Sub

コードの核心:プログラミング初学者が押さえるべき3つのポイント

ここからは、コードの裏側で何が起きているのかを、エンジニアの視点で分かりやすく紐解いていきます。

1. `ModelDocExtension` との付き合い方

昔のSolidWorks APIでは、ドキュメントの操作に `swModel.GetCustomInfo` などの古いメソッドが使われていました。しかし、近年のモダンなAPIでは、あらゆる拡張機能(Extension)は `ModelDocExtension` というオブジェクトを挟むのが作法です。
カスタムプロパティを司る `CustomPropertyManager` を呼び出す際も、`swModel.Extension.CustomPropertyManager(“”)` のように取得します。この「ワンクッション挟む構造」を体に叩き込んでおきましょう。

2. なぜ `Set2` メソッドを使うのか?

カスタムプロパティに値を書き込む際、`Set` ではなく `Set2` を使っています。

  • `Set` : 古いAPI。環境によっては挙動が不安定になることがあります。
  • `Set2` : 戻り値(Long型)を返し、プロパティが正常に追加・上書きされたかどうかをコード側でハンドリングできる現行の標準メソッドです。

実務のコードでは、エラーハンドリングを強固にするために必ず `Set2` を採用しましょう。

3. 物理特性(MassProperty)のライフサイクル

質量を取得しているこの部分に注目してください。

Set swMassProp = swModel.Extension.CreateMassProperty

このオブジェクト、実は「重い」です。複雑なアセンブリやソリッドボディを持つパーツでこれを乱発すると、マクロの動作が急激に重くなります。
今回は単体のパーツなので問題ありませんが、「使うときだけ生成し、使い終わったらメモリから解放する」というオブジェクト指向の基本を意識してください(VBAでは変数のスコープを抜ければ自動解放されますが、不要になったら `Set swMassProp = Nothing` と明示的に捨てる習慣もプロの証です)。

陥りやすい罠とエラー回避の知見

現場でこのマクロを運用し始めると、必ずと言っていいほど次のような壁にぶつかります。先回りして解決策をお伝えしておきますね。

罠その1:質量が「0」または「とんでもない数値」になる

原因: 3Dモデルのマテリアル(材質)が未設定、あるいは密度が正しく定義されていない場合、質量は正しく計算されません。また、ドキュメントの単位系(ミリメートル・グラム・秒=MGSなのか、メートル・キログラム・秒=MKSなのか)によって、`swMassProp.Mass` が返す単位が変わります。
対策: あらかじめパーツテンプレート側で材質と単位系をデフォルト設定しておく運用ルールを徹底しましょう。

罠その2:図面枠(図面プロパティ)に値が反映されない

原因: コード側でカスタムプロパティ名(例: `SW_MASS`)を書き込んでも、図面側のノート(テキストボックス)が正しいプロパティを参照していなければ意味がありません。
対策: 図面側のテキストで「カスタムプロパティモデル」から該当のプロパティ名(`SW_MASS`など)を正しく紐付け、「ユーザー定義」ではなく「図面ビューで指定されたモデルから」の値を取るように設定しておきましょう。

おわりに:ここをクリアすれば、あなたはもう初心者ではない!

お疲れ様でした! 今回は、パーツの物理特性とカスタムプロパティを `CustomPropertyManager.Set2` で同期させる極意を解説しました。

「マクロの記録」の枠を飛び出し、SolidWorksの内部データ構造(ExtensionやMassProperty)を直接操作する感覚は掴めましたか?
この技術をベースに、次は「フォルダ内の全パーツを一括処理するバッチプログラム」や「外部データベース(AccessやSQL Server)への自動書き出し」へと応用範囲を広げていってください。

あなたの設計自動化ライフが、より快適で知的でエキサイティングなものになることを応援しています。それでは、次の現場でお会いしましょう!

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