【実務・中級編】【実務中級】アセンブリ図面(Drawing)自動生成への布石:コンポーネントの部品番号(Balloon)とVBA連携 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

【実務中級】アセンブリ図面自動生成への布石:コンポーネントの部品番号(Balloon)とVBA連携

開発プロジェクトの現場で、アセンブリのモデリングが終わったあとの「図面作成・バルーン(部品番号)付与・部品表(BOM)の整備」という泥臭い作業に、どれだけの時間を溶かしているだろうか?

「設計変更が入るたびに部品番号がズレる」
「カスタムプロパティの入力漏れせいで、BOMの品名が空白になる」
「手作業での図面化地獄から抜け出したい」

この課題を根本から解決するためには、「図面を描く前に、3Dアセンブリ側でデータの整合性を完璧に担保する」というアプローチが不可欠だ。図面自動生成の成否は、実はアセンブリ段階でのメタデータ(カスタムプロパティ)の仕込み方で9割が決まる。

今回は、アセンブリ内の全コンポーネントを巡回し、図面連携の要となるカスタムプロパティ(部品番号や名称など)をVBAで一括整備・同期する「実務で即戦力となるプロダクションコード」を授与する。

—

1. なぜ「手作業」と「安易なVBA」は破綻するのか?

多くの初学者が陥る罠が、`Component2` オブジェクトから直接プロパティをいじろうとして迷子になることだ。あるいは、アセンブリのコンポーネント構造(アセンブリの中にサブアセンブリがあり、その中にパーツがある…というツリー構造)の深さを考慮せず、ルート直下の部品しか処理できない欠陥コードを書いてしまう。

堅牢な設計のための3大原則

1. 再帰処理(Recursive)の徹底: 何階層深くネストしたサブアセンブリであっても、もれなく末端のパーツ(Part)まで到達する設計にする。
2. 参照の安全な取得: `Component2` から、その実体である `ModelDoc2`(ファイル)を正しく引き出し、ドキュメントのコンフィギュレーションを意識してプロパティを書き込む。
3. トランザクションとエラーハンドリング: 途中でファイルが読み取り専用だったり、アクセス権がない場合にマクロがクラッシュしないガードを入れる。

—

2. 【プロダクションコード】コンポーネント一括プロパティ整備マクロ

以下のコードは、アクティブなアセンブリの全構成部品を再帰的に走査し、指定したカスタムプロパティ(例:「P_No(部品番号)」や「Description(名称)」)を一括設定・更新するマクロだ。

コピペしてそのままSolidWorksのVBAエディタ(Module)に貼り付け、実務の基盤として活用してほしい。

Option Explicit

‘ ==============================================================================
‘ 処理名: アセンブリ構成部品 カスタムプロパティ一括整備ツール
‘ 概要 : 階層構造を無視して全パーツ/サブアセンブリを走査し、プロパティを強制同期する
‘ ==============================================================================
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssocDoc As SldWorks.AssemblyDoc

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ 1. 実行時バリデーション(アセンブリが開かれているか)
If swModel Is Nothing Then
MsgBox “ドキュメントが開atていません。”, vbCritical, “エラー”
Exit Sub
End If

If swModel.GetType() <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If

Set swAssocDoc = swModel

‘ 処理開始のパフォーマンス最適化(画面描画停止)
swModel.Extension.EnableSounds = False
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayRealView, False

Dim startTime As Double
startTime = Timer

‘ 2. 再帰処理の実行(ルートコンポーネント群を取得)
Dim vComps As Variant
vComps = swAssocDoc.GetComponents(True) ‘ True = トップレベルのみではなく全コンポーネント

If IsEmpty(vComps) Then
MsgBox “構成部品が存在しません。”, vbExclamation, “警告”
Exit Sub
End If

Dim processedCount As Long
processedCount = 0

Dim i As Long
Dim swComp As SldWorks.Component2
Dim swCompModel As SldWorks.ModelDoc2

For i = LBound(vComps) To UBound(vComps)
Set swComp = vComps(i)

‘ 非表示コンポーネントや軽量状態の考慮
‘ 確実にプロパティを叩くためにモデルを取得(必要に応じて解決状態にする)
Set swCompModel = swComp.GetModelDoc2()

If Not swCompModel Is Nothing Then
‘ 3. カスタムプロパティの書き込み処理
‘ 例として「MTRL_NO」というプロパティにコンフィギュレーション名やファイル名を書き込む
Call SetCustomProperty(swCompModel, swComp, “P_NO”, “AUTO-” & Format(processedCount + 1, “000”))
Call SetCustomProperty(swCompModel, swComp, “CHECKED_BY”, “VBA_AUTOMATION”)

processedCount = processedCount + 1
End If
Next i

‘ 画面描画の復元
swModel.Extension.EnableSounds = True

MsgBox “処理完了: ” & processedCount & ” 件のコンポーネントを更新しました。” & vbCrLf & _
“処理時間: ” & Format(Timer – startTime, “0.00”) & ” 秒”, vbInformation, “完了”

End Sub

‘ ==============================================================================
‘ サブルーチン: カスタムプロパティの設定(コンフィギュレーション別対応)
‘ ==============================================================================
Private Sub SetCustomProperty(swModel As SldWorks.ModelDoc2, swComp As SldWorks.Component2, propName As String, propValue As String)
Dim swCustPropMgr As SldWorks.CustomPropertyManager
Dim configName As String

configName = swComp.ReferencedConfiguration

‘ 【重要】アクティブコンフィギュレーション固有のプロパティとして書き込む場合
‘ 図面のBOMがコンフィギュレーション名を拾う場合、コンフィギュレーション別プロパティが必須となる
Set swCustPropMgr = swModel.Extension.CustomPropertyManager(configName)

If Not swCustPropMgr Is Nothing Then
‘ すでに存在する場合は上書き、なければ追加
Dim res As Long
‘ Add3 引数: 1=Text, 2=Value
res = swCustPropMgr.Add3(propName, swCustomInfoText, propValue, swCustomPropertyAddOption_ReplaceValue)
End If

‘ ※もし「ファイル標準(要約情報・カスタム)」に書き込みたい場合は以下を使用
‘ Set swCustPropMgr = swModel.Extension.CustomPropertyManager(“”)
‘ swCustPropMgr.Add3 propName, swCustomInfoText, propValue, swCustomPropertyAddOption_ReplaceValue

End Sub

—

3. チーフアーキテクトが教える「実務でのハマりどころ」と対策

このコードを現場に導入する際、必ず直面する壁と、その回避策を共有しておこう。

① 「軽量(Lightweight)」コンポーネントの罠

SolidWorksの大規模アセンブリでは、メモリ節約のために部品が「軽量状態」でロードされることがある。この状態の `Component2` から `GetModelDoc2()` を呼ぶと、場合によっては `Nothing` が返ってくるか、プロパティマネージャーにアクセスできない。

  • 対策: 大規模アセンブリを扱う場合は、事前に `swComp.SetSolveMode()` や `swComp.Resolve()` を噛ませて完全に解決(Resolve)状態にしてからプロパティを叩くこと。

② 親子関係(コンフィギュレーション)の不一致

アセンブリAの中で使われているボルト(Part1)と、アセンブリBの中で使われているボルト(Part1)で、長さを変えている(コンフィギュレーションで切り替えている)場合がある。
ここで「ファイルのカスタムプロパティ」を書き換えてしまうと、すべてのボルトのデータが書き換わり、大惨事になる。

  • 対策: コード内でも解説している通り、必ず `swComp.ReferencedConfiguration` を取得し、「コンフィギュレーション固有のカスタムプロパティ(Configuration-specific Custom Properties)」に対して値を書き込むこと。これが図面化の自動化における最大の生命線だ。

—

4. 次のステップ:図面自動生成(Drawing Automation)へ

今回整備したカスタムプロパティ(`P_NO` や `CHECKED_BY`)は、次回構築する 「Drawing ドキュメント自動生成マクロ」 において、部品表(BOM)の列データや、図面枠の表題欄(Title Block)、そして自動バルーン(`AutoBalloon` API)の紐付けキーとしてそのまま利用される。

手作業による「図面の番号付けミス」や「プロパティ抜けによるリビジョン差し戻し」は、エンジニアの創造的な時間を奪う癌でしかない。
APIとVBAを掌握し、アセンブリのデータ構造を完璧にコントロール下に置くこと。それこそが、真の業務自動化エンジニアの仕事だ。

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