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

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

【脱・マクロ記録】SolidWorks VBAで図面レイヤーを支配する:オブジェクト指向への第一歩

「マクロの記録ボタンを押して、あとはコードを書き換えるだけ……」

もしあなたがそう考えているなら、おめでとうございます。あなたは今、自動化エンジニアとしての「最初の門」に立っています。しかし、同時に非常に危険な領域にも足を踏み入れています。

マクロの記録が生成するコードは、いわば「決め打ちの台本」です。
「Aという図面を開き、Bという座標にあるCという寸法を選択する」
そんな台本は、図面の構成が少し変わった瞬間に、音を立てて崩れ去ります。

今日は、その「決め打ち」から脱却し、図面の中身を自律的に判断して、寸法は「寸法レイヤー」へ、中心線は「中心線レイヤー」へ……と、要素の正体を見破って自動で整理する、真の自動化へのステップを歩んでいきましょう。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。

1. 思考の転換: 「操作」ではなく「構造」を捉える

マクロの記録から脱却するために必要なのは、プログラミングの技術以前に「SolidWorksのデータの持ち方(オブジェクトモデル)」を理解することです。

図面ファイルは、以下のような入れ子構造(階層構造)になっています。

DrawingDoc (図面ドキュメント)
 └── Sheet (シート)
      └── View (図面ビュー)
           └── Annotation (アノテーション:寸法、注記、中心線など)

私たちがやりたいことは、「図面の中にある全てのアノテーションを一つずつ調べ、その種類(Type)に応じて、適切なレイヤーを割り当てる」という作業です。

これを実現するには、「ループ(繰り返し処理)」と「条件分岐(If文)」、そして「オブジェクトの型判定」という3つの武器が必要になります。

2. 実践: 要素の種類を見極めてレイヤーを振り分ける

それでは、具体的なコードを見ていきましょう。
このコードは、図面内の全てのビューをスキャンし、アノテーションの種類を判別してレイヤーを自動変更するものです。

Option Explicit

''' <summary>
''' 図面内のアノテーションを種類別にレイヤー分けするメインルーチン
''' </summary>
Sub OrganizeAnnotationsByLayer()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    Dim swAnn As SldWorks.Annotation
    Dim swDispDim As SldWorks.DisplayDimension
    
    ' 設定:使用するレイヤー名を定義(あらかじめ図面に作成しておく必要があります)
    Const LAYER_DIMENSION As String = "寸法レイヤー"
    Const LAYER_CENTERLINE As String = "中心線レイヤー"
    Const LAYER_NOTE As String = "注記レイヤー"

    ' SolidWorksへの接続
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    ' 図面ドキュメントが開かれているかチェック
    If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いた状態で実行してください。", vbExclamation
        Exit Sub
    End If

    Set swDraw = swModel
    
    ' --- 処理開始 ---
    ' 1. 最初のビュー(シート自体を表すビュー)を取得
    Set swView = swDraw.GetFirstView
    
    ' 2. 全てのビューをループ処理
    Do While Not swView Is Nothing
        
        ' 3. ビュー内の最初のアノテーションを取得
        Set swAnn = swView.GetFirstAnnotation2
        
        ' 4. アノテーションを一つずつループ処理
        Do While Not swAnn Is Nothing
            
            ' --- ここからが「型判定」の肝 ---
            ' アノテーションのタイプを確認して、レイヤーを割り当てる
            Select Case swAnn.GetType
                
                Case swAnnotationType_e.swAnnotationType_Dimension
                    ' 寸法の場合
                    ' AnnotationオブジェクトをDisplayDimensionにキャスト(型変換)して操作
                    Set swDispDim = swAnn
                    swDispDim.Layer = LAYER_DIMENSION
                    
                Case swAnnotationType_e.swAnnotationType_ centerline ' 中心線の場合
                    ' 注意:中心線は種類によって判定が分かれる場合があります
                    swAnn.Layer = LAYER_CENTERLINE
                    
                Case swAnnotationType_e.swAnnotationType_Note
                    ' 注記(テキスト)の場合
                    swAnn.Layer = LAYER_NOTE
                    
            End Select
            ' ------------------------------

            ' 次のアノテーションへ
            Set swAnn = swAnn.GetNextAnnotation2
        Loop
        
        ' 次のビューへ
        Set swView = swView.GetNextView
    Loop

    ' 再描画して結果を反映
    swModel.ForceRebuild3 True
    MsgBox "レイヤーの整理が完了しました!", vbInformation

End Sub

3. 伝説のアーキテクトが教える「ここが落とし穴」

コードを眺めて、「よし、書けそうだ」と思ったあなた。素晴らしい。
しかし、実戦では必ずと言っていいほどエラーという名の壁にぶつかります。プロは以下の3点に細心の注意を払います。

① レイヤーの「存在」を疑え

上記のコードで最も多いエラーは、「指定した名前のレイヤーが図面に存在しない」ことです。
SolidWorks APIは、存在しないレイヤー名を代入しようとすると、エラーを吐くか、あるいは静かに無視します。
実用的なツールにするなら、「もしレイヤーがなければ自動で作成する」という関数を組み込んでおくのが一流の仕事です。

② 「Annotation」と「DisplayDimension」の違い

ここが中級者への分かれ道です。
`swAnn`(Annotation型)は、図面上のあらゆる「記号」の親玉です。しかし、寸法特有のプロパティ(例えば、寸法の値を変えるなど)を操作したい場合は、より具体的な `DisplayDimension` 型として扱う必要があります。
コード内の `Set swDispDim = swAnn` という記述は、「このアノテーションは寸法として扱いますよ」という宣言(キャスト)なのです。

③ パフォーマンスの重み(ループの深さ)

図面が巨大で、ビューが数百あり、アノテーションが数千ある場合、この「二重ループ」は処理時間を要します。
`swModel.ForceRebuild3`(再描画)をループの中で呼び出さないでください。再描画は「全ての処理が終わった最後の一回」にする。これが、ユーザーを待たせないための鉄則です。

4. まとめ: 次のステージへ

今回のコードで学んだのは、単なる「レイヤー分け」ではありません。

1. 階層を辿る技術(View $\rightarrow$ Annotation)
2. 正体を見破る技術 (`GetType` による条件分岐)
3. 適切な型へ昇格させる技術(Castによる操作)

これらは、どれほど複雑な自動化ツールを作る上でも、常に使い続ける「基礎体力」となります。

マクロの記録が「点」の技術だとしたら、今回学んだオブジェクトモデルの理解は、それらを繋いで「線」や「面」にするための技術です。

一歩ずつで大丈夫です。まずは、自分の図面でこのコードを走らせて、要素が魔法のように整列する快感を味わってみてください。そこから、あなたの自動化エンジニアとしての物語が始まります。

応援していますよ。

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