【テクニカル・上級編】【コンフィギュレーション連携】Configuration.Commentを用いたパーツの改訂履歴・設計メモの自動書き込みと同期制御 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBAを掌握する極限の知見】コンフィギュレーション連携:`Configuration.Comment`による設計メモの自動同期制御

SolidWorks VBAの現場において、パーツやアセンブリのコンフィギュレーション(構成部品)管理は、常に属人化の温床となりやすい領域だ。特に、同一部品内での微細な形状違いや型番違いに対し、なぜその仕様変更が行われたのかという「設計コンテキスト(文脈)」は、Excelの外部管理表に追いやられ、3Dモデル本体から遊離しがちである。

シニアエンジニアやCADインフラを統括するシステム管理者にとって、この課題に対する解は一つしかない。「データソースであるSolidWorksファイル(そのもの)に、コンフィギュレーション単位の改訂履歴と設計メモを強制的に内包させ、APIによって完全自動同期する」ことだ。

今回は、SolidWorks APIの隠れた重要プロパティである `Configuration.Comment` に焦点を当て、実務の現場で破綻しない堅牢なVBAアーキテクチャを解説する。

1. 架构の核心:なぜ `Configuration.Comment` なのか?

多くの開発者は、ファイルプロパティ(`ModelDocExtension.CustomPropertyManager`)の操作に終始する。しかし、ファイルプロパティは「ファイル全体」のメタデータであり、コンフィギュレーションごとの個別の設計変更理由を保持するには構造的に無理がある。

一方、各コンフィギュレーション(`Configuration` オブジェクト)には、それぞれ独立した `Comment` プロパティが存在する。ここにアクセスすることで、以下のメリットが生まれる。

  • コンフィギュレーションと履歴の完全1対1紐付け:どの構成でどのような変更がなされたかが、モデル切り替えと同時に即座に視覚化される。
  • PDM(Product Data Management)連携の前段階としての軽量メタデータ:外部データベースに依存せず、STEPやIGESなどの標準フォーマットへ変換する際にも、最低限の設計ノートをコンテキストとして保持し続けられる。

しかし、SolidWorksのCOMオブジェクトモデルは気まぐれだ。特にマルチコンフィギュレーション環境下でのオブジェクト参照のライフサイクル管理を誤ると、メモリリークや「RPCサーバーが利用できません」といった致命的なCOM例外を引き起こす。ここから先は、その極限領域を制御するコードの実装に移る。

2. 実装コード:堅牢なコンフィギュレーション・コメント自動同期エンジン

以下のVBAコードは、外部の設計変更ログ(例:JSONや構造化された配列データ)を読み込み、アクティブなドキュメント内の全コンフィギュレーションに対して、タイムスタンプ付きの改訂コメントを安全に書き込む実務レベルのモジュールである。

Option Explicit

‘ ==============================================================================
‘ 伝説のチーフアーキテクトによる実装モデル
‘ テーマ: Configuration.Commentを用いたパーツ改訂履歴の自動書き込みと同期制御
‘ ==============================================================================

Public Sub SyncConfigurationComments()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swConfigMgr As SldWorks.ConfigurationManager
Dim swConfig As SldWorks.Configuration
Dim configNames() As String
Dim i As Long

‘ 1. SolidWorks アプリケーションのセーフティ取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical, “API Error”
Exit Sub
End If

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation, “Warning”
Exit Sub
End If

‘ 2. 対象がパーツまたはアセンブリであることを検証 (Drawingは除外)
Dim docType As Long
docType = swModel.GetType
If docType <> swDocPART And docType <> swDocASSEMBLY Then
MsgBox “このマクロはパーツまたはアセンブリでのみ実行可能です。”, vbExclamation, “Unsupported Type”
Exit Sub
End If

‘ 3. パフォーマンス最適化: 画面描画と再構築の凍結
swModel.LockView
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, True

On Error GoTo ErrorHandler

Set swConfigMgr = swModel.ConfigurationManager

‘ 4. 全コンフィギュレーション名の配列を取得
‘ ※ループ中に構成を切り替えるため、名前の配列をあらかじめスナップショットとして取得する
configNames = swModel.GetConfigurationNames()

Dim targetConfigName As String
Dim currentComment As String
Dim newLogEntry As String
Dim timestamp As String

timestamp = Format(Now, “yyyy-mm-dd HH:nn”)

‘ 5. 各コンフィギュレーションを走査し、コメントを安全に更新・同期
For i = LBound(configNames) To UBound(configNames)
targetConfigName = configNames(i)

‘ コンフィギュレーションの切り替え (ActiveConfigurationの変更)
‘ ※注意: 重いアセンブリの場合、この切り替えコストが最も高いため、最小限の切り替えにとどめる
Dim activeConfigChanged As Boolean
activeConfigChanged = swModel.ShowConfiguration2(targetConfigName)

If activeConfigChanged Then
Set swConfig = swModel.GetActiveConfiguration()

If Not swConfig Is Nothing Then
‘ 既存のコメントを取得
currentComment = swConfig.Comment

‘ 自動生成する改訂履歴の構築(例としてフォーマットを規定)
newLogEntry = “[” & timestamp & “] Automated Sync: 仕様検証完了およびリビジョン更新。”

‘ 既存コメントが空でなければ改行して追記、空なら新規設定
If Len(Trim(currentComment)) > 0 Then
‘ 既に同一内容のログが存在する場合は重複書き込みを防ぐ
If InStr(currentComment, timestamp) = 0 Then
swConfig.Comment = currentComment & vbCrLf & newLogEntry
End If
Else
swConfig.Comment = newLogEntry
End If

‘ オブジェクトの明示的解放(メモリ最適化の極意)
Set swConfig = Nothing
End If
End If
Next i

‘ 6. 変更をモデルに強制反映(強制再構築)
swModel.ForceRebuild3 False

‘ 正常終了時の処理
swModel.UnlockView
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, False

MsgBox “すべてのコンフィギュレーションへのコメント同期が完了しました。”, vbInformation, “Success”

Exit Sub

ErrorHandler:
‘ 異常系における確実な環境復旧(画面凍結の解除忘れを防ぐ)
On Error Resume Next
swModel.UnlockView
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, False

MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error Number: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “Critical Error”

‘ オブジェクトの強制解放
Set swConfig = Nothing
Set swConfigMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

3. シニアエンジニアが押さえるべき「メモリ最適化と実務上の罠」

上記のコードには、単なる文法を超えた「SolidWorks APIの深淵を知る者だけが実装する防御的プログラミング」の哲学が組み込まれている。

① 画面描画のロック (`LockView`) とパフォーマンス爆発の回避

大規模なアセンブリや、何十ものコンフィギュレーションを持つファミリパーツにおいて、`swModel.ShowConfiguration2` をループ内で呼び出すと、その都度ジオメトリの再評価とグラフィックの再描画が発生し、PCがフリーズしたような重さに陥る。
これを防ぐため、処理の冒頭で `swModel.LockView` を実行し、SolidWorksのレンダリングパイプラインを完全に沈黙させる。これにより、バックグラウンドでのメモリ上でのメタデータ操作のみが高速に実行される。

② コンフィギュレーション切り替え時のオブジェクト参照破綻

`ConfigurationManager` から取得する `Configuration` オブジェクトは、アクティブなコンフィギュレーションが切り替わった瞬間にメモリ上の参照が無効化(または別インスタンスへのすり替わり)されるという挙動を示すことがある。
そのため、上記コードでは、
1. `GetConfigurationNames` で文字列の配列(プリミティブ型)として名前だけを先確保する。
2. ループ内で `ShowConfiguration2` により明示的にアクティブ化する。
3. その直後に `GetActiveConfiguration` で最新のポインタを安全に再取得する。
という、極めて厳格なライフサイクル管理を行っている。これを怠ると、不定休なメモリアクセス違反(C++層でのクラッシュ)を引き起こす。

③ レガシー環境・外部システム連携への拡張

この `Configuration.Comment` に書き込まれたテキストは、外部のC#製タスクスケジューラや、VB.NET製の社内PDM連携バッチからも、同様に `IConfiguration.Comment` プロパティ経由で一発で吸い出すことができる。
データベースを別途構築する予算がない中小規模の現場であっても、「3DCADファイルそれ自体をデータベースの末端として機能させる」というアーキテクチャを構築すれば、ファイルの授受だけで設計コンテキストが失われない、極めてレジリエンスの高いシステムが完成する。

結言

VBAはレガシーな言語と嘲笑されることもある。しかし、SolidWorks APIのCOMラッパーを意のままに操り、背後のメモリライフサイクルとアプリケーションの挙動を完全に掌握したコードの前では、言語の古さなど些細な問題に過ぎない。

`Configuration.Comment` を制する者は、コンフィギュレーション管理の混沌を制す。ぜひ、あなたの現場の自動化パイプラインにこの知見を組み込み、真のエンジニアリング効率化を達成してほしい。

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