【入門編】【中級者向け】アセンブリ図面における「バルーン(部品番号)」の付与順序をパーツツリー順に完全同期 – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の知見】図面の秩序を支配する:アセンブリ図面におけるバルーン番号とツリー構造の完全同期術

こんにちは。現場の自動化を司るアーキテクトです。

「マクロの記録」ボタンを押し、記録されたコードを眺めては「なぜこれで動くのか?」「どうすればもっと賢く書けるのか?」と悩んでいる……。もしあなたが今そう感じているなら、おめでとうございます。あなたは「単なる操作の自動化」から、「エンジニアリングとしてのプログラミング」への境界線に立っています。

今日扱うテーマは、多くの設計者が一度は頭を抱える問題です。
「アセンブリ図面のバルーン(部品番号)が、部品表(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!

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