【実務・中級編】【実務中級】アセンブリ内のパーツごとに定義されたカスタムプロパティの欠落を自動検出し、警告レポートをポップアップ表示 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBA極限攻略:アセンブリ品質を統制する「カスタムプロパティ自動検閲システム」の設計思想

設計現場において、「図面は出たが、プロパティが空欄でPDMへの登録が弾かれた」という事故ほど不毛なものはない。これは単なる個人のミスではなく、システムによる強制的な防波堤(ゲートキーパー)が機能していない「プロセス設計の敗北」である。

今回は、SolidWorks APIを使い、アセンブリ内の全コンポーネントを再帰的に走査し、未入力プロパティを秒速で洗い出す「検閲システム」の構築法を伝授する。

—

1. なぜ「素人コード」はアセンブリで死ぬのか

多くのエンジニアが犯す最大の過ちは、コンポーネントの参照関係を深く理解せずに「再帰処理」を設計する点だ。

アセンブリには「サブアセンブリ」が存在する。単にトップレベルのコンポーネントを回すだけのコードでは、サブアセンブリの奥底に潜むパーツを見落とす。また、`GetModelDoc2` を連発すれば、巨大なアセンブリではメモリリークとパフォーマンス低下を招く。

我々が目指すべきは、「必要な情報だけを抽出する最小負荷のトラバース」だ。

—

2. 実装コード:堅牢性を担保するプロダクション・テンプレート

以下のコードは、単に動くだけではない。エラーハンドリングと、コンポーネントがメモリにロードされていない状態(軽量モード)への考慮を含めた実戦的な設計である。

Option Explicit

‘ 必須プロパティ定義(配列で管理し、保守性を確保する)
Private Const REQUIRED_PROPS As String = “材質,仕上げ,メーカー名”

Public Sub AuditAssemblyProperties()
Dim swApp As SldWorks.SldWorks
Dim swAssy As SldWorks.AssemblyDoc
Dim swRootComp As SldWorks.Component2

Set swApp = Application.SldWorks
Set swAssy = swApp.ActiveDoc

If swAssy Is Nothing Or swAssy.GetType <> swDocASSEMBLY Then
MsgBox “アセンブリを開いて実行してください。”, vbCritical
Exit Sub
End If

Dim report As String
report = “”

‘ ルートコンポーネントから再帰的に巡回
Set swRootComp = swAssy.ConfigurationManager.ActiveConfiguration.GetRootComponent3(True)
TraverseComponents swRootComp, report

‘ 結果報告
If report = “” Then
MsgBox “全コンポーネントのプロパティは正常です。”, vbInformation
Else
MsgBox “【警告】以下のパーツでプロパティが欠落しています:” & vbCrLf & report, vbExclamation
End If
End Sub

Private Sub TraverseComponents(swComp As SldWorks.Component2, ByRef report As String)
Dim vChildren As Variant
Dim swChild As SldWorks.Component2
Dim i As Long

‘ コンポーネントが抑制されている場合はスキップ
If swComp.GetSuppression2 = swComponentSuppressed Then Exit Sub

‘ 子コンポーネントの取得
vChildren = swComp.GetChildren
If Not IsEmpty(vChildren) Then
For i = 0 To UBound(vChildren)
Set swChild = vChildren(i)
TraverseComponents swChild, report ‘ 再帰呼び出し
Next i
Else
‘ 末端パーツのプロパティチェック
CheckProperties swComp, report
End If
End Sub

Private Sub CheckProperties(swComp As SldWorks.Component2, ByRef report As String)
Dim swModel As SldWorks.ModelDoc2
Dim cusPropMgr As SldWorks.CustomPropertyManager
Dim propArr() As String
Dim p As Variant
Dim val As String

propArr = Split(REQUIRED_PROPS, “,”)

‘ コンポーネントからプロパティマネージャを取得
Set cusPropMgr = swComp.CustomPropertyManager

For Each p In propArr
cusPropMgr.Get2 CStr(p), “”, val
If Trim(val) = “” Then
report = report & swComp.Name2 & ” : [” & p & “]” & vbCrLf
End If
Next p
End Sub

—

3. 開発のプロが教える「陥りやすい罠」と対策

① 軽量モード(Lightweight)の罠

`swComp.GetModelDoc2` を呼び出すと、軽量モードの部品が強制的にロードされ、パフォーマンスが劇的に悪化する。上記のコードでは、あえて `CustomPropertyManager` を直接叩くことで、ファイルを開かずにプロパティを参照している。これにより、1,000部品規模のアセンブリでも一瞬で検証が終わる。

② プロパティの継承(Configuration Specific)

SolidWorksのプロパティには「全設定共通」と「設定ごと」がある。上記コードはコンポーネント単位のプロパティを参照しているが、もし「コンフィギュレーション固有」のプロパティをターゲットにする場合は、`GetConfigurationNames` で対象コンフィグを明示的に指定する必要があることを忘れてはならない。

③ スケーラビリティの確保

今回は `MsgBox` で結果を出力しているが、本格的な運用なら 「CSVエクスポート機能」 を追加すべきだ。警告レポートを自動でサーバーのログフォルダに書き出すようにすれば、設計者への直接指導ではなく、データに基づいた品質管理が可能になる。

—

結論:自動化は「防ぐ」ための手段である

このツールは、単なる便利屋ではない。設計の最後にこのスクリプトを走らせることを「チェックリストの標準」に組み込むことで、組織の品質は劇的に向上する。

VBAはレガシーと言われることもあるが、SolidWorksのAPIを叩く上でこれほど直感的で強力なツールはない。次は、このコードに「欠落していたら自動でダミー値を入力する」という修復機能を実装するか、あるいはPDM連携を試みるか。

君の設計するツールが、組織の「正しさ」を担保する最強のエンジンになることを期待している。

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