【極限の知見】図面の秩序を支配する:アセンブリ図面におけるバルーン番号とツリー構造の完全同期術
こんにちは。現場の自動化を司るアーキテクトです。
「マクロの記録」ボタンを押し、記録されたコードを眺めては「なぜこれで動くのか?」「どうすればもっと賢く書けるのか?」と悩んでいる……。もしあなたが今そう感じているなら、おめでとうございます。あなたは「単なる操作の自動化」から、「エンジニアリングとしてのプログラミング」への境界線に立っています。
今日扱うテーマは、多くの設計者が一度は頭を抱える問題です。
「アセンブリ図面のバルーン(部品番号)が、部品表(BOM)の順序とバラバラで、設計ツリー(FeatureManager)の並びと一致しない」
これ、実はSolidWorksの仕様(BOMのソート順)と、設計者が頭の中に描いている「構造の順序」の間に、深い溝があるからなんです。この溝を埋めるための、極限の制御コードとその思考プロセスを伝授しましょう。
1. なぜ「自動バルーン」は裏切るのか?
SolidWorksの標準機能で「自動バルーン」を配置すると、プログラムは通常「部品表(BOM)に記載されている順序」に従って番号を振ろうとします。
しかし、設計現場ではこう考えます。
「一番大きなベースパーツはツリーのトップにある。だからバルーンも『1番』から始まってほしい」
「サブアセンブリは、ツリーのまとまりごとに番号が連続してほしい」
BOMが「部品番号(Part Number)」の昇順でソートされていたりすると、ツリーの構造とは無関係な番号が図面中に飛び交うことになります。これでは、図面を見た人間は混乱し、製造現場への指示も曖昧になります。
私たちが目指すのは、「ツリーの並び順(Component Order)を、図面のインデックス(Balloon Index)に強制的に流し込む」という制御です。
2. 核心:オブジェクトの階層を理解する
「マクロの記録」が教えてくれない、APIの真髄は「オブジェクトの親子関係」にあります。
今回のミッションを遂行するために、以下のオブジェクト・パスを脳内に描いてください。
1. `SldWorks`: 全ての神。アプリケーションそのもの。
2. `ModelDoc2`: 開いているファイル。
3. `AssemblyDoc`: アセンブリ特有の機能(コンポーネント操作)を持つ窓口。
4. `Component2`: ツリーに並んでいる「部品」そのもの。
重要なのは、`AssemblyDoc::GetComponents` メソッドです。これを使うと、ツリーに表示されている順番通りにコンポーネントの配列を取得できるのです。ここが、全ての秩序の出発点になります。
3. 実装:ツリー順をマスターするVBAコード
それでは、実際に「ツリーの並び順に従って、各部品のインデックスを特定する」ロジックを見ていきましょう。このコードは、そのままバルーン制御のロジックへと繋がる「基盤」となります。
Option Explicit
' ==============================================================================
' テーマ: アセンブリのツリー構造に基づいたコンポーネント順序の取得
' 目的: バルーン番号をツリー順に制御するための「マスターリスト」を作成する
' ==============================================================================
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssy As SldWorks.AssemblyDoc
Dim vComps As Variant
Dim swComp As SldWorks.Component2
Dim i As Long
' 1. SolidWorksアプリケーションへの接続
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 2. エラーチェック:ドキュメントが開いているか? アセンブリか?
If swModel Is Nothing Then
MsgBox "ファイルが開かれていません。", vbCritical
Exit Sub
End If
If swModel.GetType <> swDocASSEMBLY Then
MsgBox "アセンブリファイルを開いてから実行してください。", vbExclamation
Exit Sub
End If
' 3. AssemblyDocインターフェースへのキャスト
Set swAssy = swModel
' 4. 【重要】ツリー上のコンポーネントをすべて取得
' GetComponents(False) の False は「すべての階層を取得する」という意味
' これにより、ツリーの見た目通りの順序で配列が返ってくる
vComps = swAssy.GetComponents(False)
If IsEmpty(vComps) Then
MsgBox "コンポーネントが見つかりません。", vbInformation
Exit Sub
End If
Debug.Print "--- ツリー順序リスト開始 ---"
' 5. コンポーネントをループ処理し、順序を特定する
For i = 0 To UBound(vComps)
Set swComp = vComps(i)
' サプレス(抑制)されている部品は無視するのが実務上の定石
If swComp.IsSuppressed = False Then
' ここで「ツリー順のインデックス」と「部品名」を紐付け
' 実務では、この情報を元にBOMのソート順を書き換えるか、
' バルーンのプロパティを直接操作するロジックへ繋げる
Debug.Print "順序: " & (i + 1) & " | 部品名: " & swComp.Name2
End If
Next i
Debug.Print "--- ツリー順序リスト終了 ---"
MsgBox "ツリー順序の解析が完了しました。イミディエイトウィンドウを確認してください。", vbInformation
End Sub
💡 コードの解説:ここが「プロ」の視点
- `swAssy.GetComponents(False)`:
ここが最大のポイントです。`True`にすると「トップレベルの部品のみ」を取得しますが、`False`にすることで、サブアセンブリの中身まで、まさに人間がツリーで見ている順番通りにリストアップできます。
- `swComp.IsSuppressed` の判定:
実務において、抑制されている部品に番号を振ることはありません。これを確認せずに処理を進めると、図面上の番号と実際の部品数が食い違い、致命的なミス(誤発注など)に繋がります。
- `Debug.Print` の活用:
いきなり図面を書き換えるコードを書くのは素人です。まずは `Debug.Print` で「自分が意図した順番でデータが取れているか」をイミディエイトウィンドウで検証する。これが、デバッグ時間を劇的に減らす鉄則です。
4. 次のステップ:バルーンへの適用戦略
このコードで「ツリー順のリスト」が手に入ったら、次に何をすべきか?
中級者への階段を登るための、2つの戦略を提示します。
# 戦略A:BOMのソート順をプログラムで制御する(推奨)
図面のバルーンはBOMに従います。ならば、BOMの並び順を「ツリー順」に並べ替えるロジックを組むのが最もスマートです。BOMテーブルのセルを `swTableAnnotation` として操作し、取得したリストに従って行を入れ替えます。
# 戦略B:バルーンの「部品番号」を上書きする
もしBOMの順序を変えられない事情があるなら、バルーン自体が参照しているプロパティを、ツリー順のインデックス番号で直接書き換える手法があります。ただし、これは部品のカスタムプロパティを汚染する可能性があるため、慎重な設計が必要です。
5. まとめ:秩序はコードで作る
「自動でやってくれるはず」という期待は、時として設計者の意図を裏切ります。しかし、APIの構造を理解し、オブジェクトのライフサイクル(どのオブジェクトがどの情報を保持しているか)を掌握していれば、その裏切りすらも制御下に置くことができます。
今回学んだ「ツリー構造を配列として取得し、その順序をロジックの基軸にする」という考え方は、バルーンだけでなく、部品表の自動生成や、アセンブリの構成チェックなど、あらゆる高度な自動化に応用できる強力な武器になります。
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
さあ、次はもっと複雑な、階層構造の深い制御に挑戦してみましょう。
Happy Automation!
