【入門編】【中級者向け】図面内の特定レイヤーに対して寸法やアノテーションを自動振り分けするVBAマクロ – SolidWorks VBA解析バイブル

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

【脱・マクロ記録】図面の視認性を劇的に変える!アノテーションのレイヤー自動振り分け術

こんにちは。設計自動化の世界へようこそ。

「マクロの記録」ボタンを押して、録画されたコードを眺めては、「これじゃあ、複雑なことはできないな……」と壁にぶつかっている。そんな経験はありませんか? もしそうなら、おめでとうございます。あなたは今、「単なる操作の記録」から「プログラミングによる設計」へと進化する境界線に立っています。

今日、私たちが挑戦するのは、図面作成における「地味だけど、最も精神を削る作業」の自動化です。それは、寸法、中心線、注記といったアノテーション(注記要素)を、あらかじめ決めたレイヤーへ自動的に整理・振り分けるツールの構築です。

これをマスターすれば、あなたの図面は一瞬でプロフェッショナルな美しさを手に入れ、手作業によるレイヤー変更のミスはゼロになります。さあ、設計の「理(ことわり)」を解き明かしに行きましょう。

1. 図面データの「階層構造」を理解する

プログラミングにおいて、最も重要なのは「コードを書く前」にデータの形をイメージすることです。SolidWorksの図面データは、決して平坦なリストではありません。まるでマトリョーシカのような「階層構造(オブジェクトツリー)」を持っています。

レイヤーを操作するためには、以下のルートを辿って目的の要素に辿り着く必要があります。

1. DrawingDoc (図面ドキュメント):図面ファイル全体
2. Sheet (シート):図面内の各ページ
3. View (ビュー):図面内の各投影図(正面図、平面図など)
4. Annotation (アノテーション):寸法、注記、中心線などの「要素」そのもの

多くの初心者は、いきなり「寸法を操作しよう!」として躓きます。しかし、寸法は「ビュー」の中に存在し、さらにその中に「アノテーション」として格納されている。この「親から子へ」と辿っていく感覚こそが、APIを使いこなすエンジニアの必須スキルです。

2. 実践:レイヤー自動振り分けマクロ

それでは、核心に触れていきましょう。
以下のコードは、図面内のすべてのビューをスキャンし、要素の種類(寸法なのか、注記なのか、中心線なのか)を判定して、指定したレイヤーへ自動的に割り当てるものです。

'**
' プログラム名: AnnotationLayerAssigner
' 概要: 図面内のアノテーションを種類別に指定レイヤーへ自動振り分けする
'**
Option Explicit

Sub Main()
    ' SolidWorksのアプリケーションオブジェクトを取得
    Dim swApp As SldWorks.SldWorks
    Set swApp = Application.SldWorks
    
    ' 現在開いているドキュメントを取得
    Dim swModel As SldWorks.ModelDoc2
    Set swModel = swApp.ActiveDoc
    
    ' ドキュメントが図面(Drawing)でない場合は終了
    If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いた状態で実行してください。"
        Exit Sub
    End If
    
    Dim swDraw As SldWorks.DrawingDoc
    Set swDraw = swModel
    
    ' --- 設定エリア: ここでレイヤー名を指定します ---
    Const LAYER_DIM As String = "DIMENSION_LAYER"   ' 寸寸法用
    Const LAYER_NOTE As String = "NOTE_LAYER"       ' 注記用
    Const LAYER_CENTER As String = "CENTER_LAYER"   ' 中心線用
    ' ----------------------------------------------

    ' シートのループ
    Dim vSheets As Variant
    vSheets = swDraw.GetSheetNames
    
    Dim i As Integer
    For i = 0 To UBound(vSheets)
        swDraw.ActivateSheet vSheets(i)
        
        ' ビューのループ
        Dim swView As SldWorks.View
        Set swView = swDraw.GetFirstView ' Sheet自体が最初のViewとして返るため
        
        ' 最初のView(Sheet)の次は、実際の投影図(Drawing View)を辿る
        Set swView = swView.GetNextView
        
        Do While Not swView Is Nothing
            ' ビュー内のアノテーションを走査
            Dim swAnn As SldWorks.Annotation
            Set swAnn = swView.GetFirstAnnotation
            
            Do While Not swAnn Is Nothing
                ' アノテーションの種類を判定
                Dim annType As Long
                annType = swAnn.GetType
                
                ' 判定に基づきレイヤーを適用
                Select Case annType
                    Case swAnnotationType_e.swAnnotationType_Dimension
                        ' 寸法の場合
                        swAnn.Layer = LAYER_DIM
                        
                    Case swAnnotationType_e.swAnnotationType_Note
                        ' 注記の場合
                        swAnn.Layer = LAYER_NOTE
                        
                    Case swAnnotationType_e.swAnnotationType_Centerline
                        ' 中心線の場合
                        swAnn.Layer = LAYER_CENTER
                        
                    ' 他のタイプ(寸法線、補助線など)が必要ならここに追加
                End Select
                
                ' 次のアノテーションへ
                Set swAnn = swAnn.GetNextAnnotation
            Loop
            
            ' 次のビューへ
            Set swView = swView.GetNextView
        Loop
    Next i

    ' 画面を更新して完了を表示
    swModel.GraphicsRedraw
    MsgBox "レイヤーの振り分けが完了しました!"
End Sub

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

コードをコピペして動かすだけでは、あなたはまだ「マクロ利用者」です。ここからは「エンジニア」として、エラーを防ぎ、パフォーマンスを最適化するための知見を共有します。

① 「Select」を使わない勇気

マクロの記録を使うと、必ず `swModel.Extension.SelectByID2 …` というコードが出てきます。これは「マウスでその要素をクリックする」という操作をシミュレートしているものです。
しかし、大量の要素を処理する際に `Select` を繰り返すと、画面がチカチカと点滅し、処理速度が劇的に低下します。
プロは `Select` せず、オブジェクト(`swAnn` など)に対して直接プロパティ(`.Layer`)を書き込みます。 これが「高速で安定したツール」を作るための鉄則です。

② レイヤーが存在しないリスク

上記のコードは、「あらかじめ指定した名前のレイヤーが図面内に存在すること」を前提としています。もし存在しないレイヤー名を指定すると、SolidWorksはエラーを出すか、無視してデフォルトレイヤーに戻してしまいます。
実用的なツールにするなら、`swDraw.CreateLayer` メソッドを使って、レイヤーがない場合に自動生成するロジックを組み込むのが一流の仕事です。

③ アノテーションの「型」を見極める

`swAnn.GetType` で返ってくる値は、列挙型(Enumeration)と呼ばれるものです。

  • `swAnnotationType_e.swAnnotationType_Dimension`
  • `swAnnotationType_e.swAnnotationType_Note`

これらは単なる数字(1や2など)ではなく、意味を持った名前です。コードを読むとき、数字ではなくこの「名前」を見る癖をつけてください。そうすることで、コードの可読性(読みやすさ)が劇的に向上します。

まとめ:次は「設計のルール」をコードに落とし込もう

お疲れ様でした。今日学んだことは、単なる「レイヤー変更マクロ」の作り方ではありません。
「階層を辿り、型を判定し、直接プロパティを操作する」という、あらゆる業務自動化に応用できる黄金のパターンです。

「この寸法の色も、自動で変えられないかな?」
「この注記のフォントサイズを、一括で変更できないかな?」

そう思った瞬間、あなたのエンジニアとしての進化が始まります。SolidWorks VBAは、あなたの想像力を形にするための強力な武器です。

一歩ずつ、着実に。次の自動化の旅でお会いしましょう!

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