【入門編】【中級者向け】アセンブリ図面における「部品番号の連番(バブル)」の自動付与と並び順制御 – SolidWorks VBA解析バイブル

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

迷宮のバルーンを秩序へ:アセンブリ図面における部品番号(バブル)自動制御の極意

こんにちは。設計自動化の荒波を共に進む同志の皆さん。
今日もSolidWorksの画面と格闘していますか?

「マクロの記録」ボタンを押して、一生懸命に操作を記録した。でも、いざ実行してみると、部品の名前が変わっただけでエラーが出る。あるいは、図面のビューを少し動かしただけで、せっかく作った自動化が動かなくなる……。

もしあなたが今、そんな「記録マクロの壁」にぶつかっているとしたら、おめでとうございます。あなたは今、「単なる操作の録画」から「真のプログラミング」へと脱皮する入り口に立っています。

今日のテーマは、設計者の時間を最も奪う作業の一つ、「アセンブリ図面におけるバルーン(部品番号)の自動配置と並び順の制御」です。

バラバラに散らばったバルーンを、BOM(部品表)の順番通りに、美しく、整然と並べる。これを手作業で行うのは、もはや修行に近い苦行です。しかし、APIの「オブジェクトの階層構造」を理解すれば、これは数秒で終わるルーチンワークに変わります。

さあ、伝説のアーキテクトが教える、極限の知見を授けましょう。

1. 「記録マクロ」が失敗する理由:オブジェクトのライフサイクルを知れ

多くの初学者が陥る罠があります。それは、`SelectByID2` というメソッドを多用しすぎることです。

マクロの記録は、「ユーザーが何を選択したか」を記録します。つまり、「”部品A” という名前の部品を選択した」という情報を保存します。しかし、設計変更で部品の名前が変われば、そのコードはゴミ同然です。

プロのコードは、「名前」ではなく「関係性(階層)」を辿ります。

  • DrawingDoc(図面全体)
  • Sheet(シート)
  • View(図面ビュー)
  • Annotation(注釈:ここにバルーンが隠れている)
  • Balloon(バルーンそのもの)

この階層を、上から順番に「スキャン」していく。これが、エラーに強く、汎用性の高い自動化の鉄則です。

2. 実践:バルーンを制御するためのアルゴリズム

では、具体的なコードを見ていきましょう。
今回は、「図面ビュー内のすべてのバルーンを取得し、その部品番号(Item Number)を読み取って、特定のルールで整理する」ための基盤となるコードを提示します。

【核心のコード】バルーン・スキャナー

Option Explicit

''' <summary>
''' 図面ビュー内のすべてのバルーンを走査し、その情報を出力する
''' </summary>
Sub AutomateBalloonOrdering()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swView As SldWorks.View
    Dim swAnn As SldWorks.Annotation
    Dim swNote As SldWorks.Note
    Dim vAnnNames As Variant
    Dim i As Integer
    
    ' 1. SolidWorksへの接続
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 2. ドキュメントが図面であるかチェック(ここがプロの作法)
    If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いてから実行してください。", vbCritical
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    ' 3. アクティブなビュー(現在選択されている、あるいは図面全体)を取得
    ' ここでは、現在選択されているビューを対象とする
    Set swView = swDraw.GetActiveView
    
    If swView Is Nothing Then
        MsgBox "対象となる図面ビューを選択してください。", vbExclamation
        Exit Sub
    End If
    
    Debug.Print "--- バルーン走査開始: " & swView.Name & " ---"

    ' 4. ビュー内のすべての注釈(Annotation)をループで回す
    ' GetFirstAnnotationFromView は、そのビューに属する最初の注釈を返す
    Set swAnn = swView.GetFirstAnnotation
    
    Do While Not swAnn Is Nothing
        ' 5. 注釈の種類が「バルーン」かどうかを判定
        ' APIの仕様上、バルーンは Annotation の一種として扱われる
        If swAnn.GetType = swAnnotationType_e.swBalloon Then
            
            ' 6. AnnotationをNoteオブジェクトとして扱う(バルーンはNoteの特性を持つ)
            ' GetSpecificAnnotation を使うのが、APIを使いこなすコツ
            Set swNote = swAnn.GetSpecificAnnotation
            
            ' バルーンのテキスト(部品番号)を取得
            Dim itemNumber As String
            itemNumber = swNote.GetText
            
            ' バルーンの座標(配置場所)を取得
            Dim vPos As Variant
            vPos = swAnn.GetPosition
            
            ' ここで取得した情報をもとに、並び替えや配置のロジックを組む
            Debug.Print "部品番号: " & itemNumber & " | 座標: X=" & vPos(0) & " Y=" & vPos(1)
            
            ' --- ここに「BOMの順番に並べる」ロジックを記述していく ---
            ' 例: ItemNumberに基づいて座標(vPos)を再計算し、SetPositionで配置し直す
            
        End If
        
        ' 次の注釈へ移動
        Set swAnn = swAnn.GetNext
    Loop
    
    Debug.Print "--- 走査完了 ---"
    
    ' 画面の更新を促す
    swModel.GraphicsRedraw2
End Sub

3. 伝説のエンジニアが教える「ここが落とし穴」

このコードを動かす際、あるいは自分で拡張する際に、絶対に忘れてはいけない知見が3つあります。

① `Annotation` と `Note` の違いを混同するな

SolidWorks APIにおいて、バルーンは非常に特殊な存在です。見た目は「吹き出し」ですが、データ構造上は `Annotation`(注釈)という親クラスの中にあり、その中身が `Note`(テキスト情報を持つオブジェクト)として振る舞います。
`swAnn.GetType = swBalloon` でフィルタリングし、その後に `GetSpecificAnnotation` で中身を取り出す。この「型変換のステップ」を飛ばすと、実行時エラーという名の奈落に突き落とされます。

② 座標系は「図面空間」であることを意識せよ

バルーンの座標 `GetPosition` で取得できる値は、ビューの原点からの相対座標ではありません。図面シート全体の座標系です。
「ビューを動かしたらバルーンがどこかへ飛んでいった」という現象が起きるのは、ビューの座標系とシートの座標系を混同しているからです。配置を制御する場合は、必ず `swView.GetX` や `swView.GetY` といったビュー座標変換を念頭に置いてください。

③ パフォーマンスの重み:`GraphicsRedraw` は最後に一回

ループの中で毎回 `swModel.GraphicsRedraw`(画面更新)を呼び出していませんか?
それは、100ページの本を1行書くたびに表紙をめくるようなものです。非常に効率が悪く、処理が重くなります。
「計算はメモリ上で行い、画面への反映はすべての処理が終わった最後に一度だけ行う」。これが、大規模なアセンブリを扱う際の鉄則です。

4. 次のステップへ:BOMとの同期

今回のコードは「今あるバルーンを調べる」ものでした。
ここから中級者、そして上級者へ進むためのロードマップを示しておきましょう。

1. BOMの取得: `swDrawingDoc.GetBOMTableList` を使い、図面内のBOMテーブルから部品リストを配列に格納する。
2. 紐付け: バルーンの `ItemNumber` と、BOMの `Item Number` を照合する。
3. 再配置アルゴリズム:

  • 部品番号が 1, 2, 3… と増えるにつれて、バルーンの座標を「右から左へ」あるいは「上から下へ」と、一定のオフセット(間隔)を持って計算して配置する。
  • `swAnn.SetPosition` を使って、計算した座標へ一斉に飛ばす。

結びに代えて

プログラミングは、単なる「作業の代行」ではありません。それは、「設計者の思考を、論理的な秩序へと昇華させるプロセス」です。

最初はエラーに泣かされるかもしれません。しかし、オブジェクトの階層を一つずつ紐解いていく感覚を掴めれば、SolidWorksはあなたの強力な武器へと変わります。

「マクロの記録」から卒業した皆さん。
その先にある、美しく、完璧に制御された図面の世界を楽しんでください。

応援していますよ。次は、もっと複雑な「自動構成図生成」の現場でお会いしましょう。

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