【入門編】【初心者向け】図面ビュー内の中心マーク(Center Mark)非表示設定を一括適用するVBAマクロ – SolidWorks VBA解析バイブル

スポンサーリンク

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

設計業務をしていると、「モデル側で設定した中心マークが、図面ビューに大量に自動生成されてしまって、かえって見にくい!」という状況に直面することがありますよね。一つひとつ手作業で非表示にするのは苦行でしかありません。

「マクロの記録」を使えばできそうですが、記録されたコードを見ると`SelectByID2`という命令が延々と並び、中身がブラックボックスで修正しづらい……。そんな悩みを持つあなたに、今日は「オブジェクトの階層構造」という、VBAを掌握するための最重要コンセプトを伝授します。

ここを理解できれば、中心マークだけでなく、寸法や注記の制御など、あらゆる図面自動化の基礎がバッチリ身に付きますよ。

1. 【思考法】SolidWorks図面の「入れ子構造」を理解する

プログラミング初心者が最初につまずくのは、「どの命令をどこに書けばいいか分からない」ことです。SolidWorksの図面は、以下のようなマトリョーシカのような階層構造になっています。

図面ファイル (DrawingDoc)
 ┗ シート (Sheet)
  ┗ ビュー (View)
   ┗ 注記/中心マーク (Annotation)

中心マークを消したいなら、「図面を開き」→「シートを探し」→「その中のビューを一つずつ確認し」→「ビューの中にある注記が中心マークかどうか判定して」→「非表示にする」という手順を踏む必要があります。

「マクロの記録」は、この構造を無視して「画面上のここをクリックした」という記録しか残りません。だから使いにくいのです。私たちは、この「階層を降りていく」書き方を習得しましょう。

2. 実践コード:中心マーク一括非表示マクロ

それでは、実際に動作するコードを見てみましょう。コピー&ペーストして使えますが、ぜひ後述の解説を読みながら「何が起きているか」を追いかけてください。

Option Explicit

Sub Main()
    ' ==========================================================================
    ' 目的:図面内のすべてのビューにある「中心マーク」を一括して非表示にする
    ' ==========================================================================
    
    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
    
    ' SolidWorksアプリケーションへの接続
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 【エラーチェック】ファイルが開いているか、またそれが図面ファイルかを確認
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてから実行してください。", vbCritical
        Exit Sub
    End If
    
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "このマクロは図面ファイル専用です。", vbCritical
        Exit Sub
    End If
    
    ' 図面オブジェクトとしてキャスト(型変換)
    Set swDraw = swModel
    
    ' --- 階層構造を降りていく処理 ---
    
    ' 1. 図面内の全シートをループ処理
    Dim vSheetNames As Variant
    vSheetNames = swDraw.GetSheetNames
    
    Dim i As Integer
    For i = 0 To UBound(vSheetNames)
        ' シートをアクティブにする
        swDraw.ActivateSheet vSheetNames(i)
        Set swSheet = swDraw.GetCurrentSheet
        
        ' 2. シート内の全ビューをループ処理
        ' GetFirstViewは「シート自体」を返すため、GetNextViewで最初の「図面ビュー」へ移動する
        Set swView = swDraw.GetFirstView
        
        While Not swView Is Nothing
            ' 3. ビュー内の全注記(Annotation)をループ処理
            Set swAnn = swView.GetFirstAnnotation2
            
            While Not swAnn Is Nothing
                ' 注記のタイプが「中心マーク(swAnnotationCenterMark)」であるか判定
                ' ※中心マークだけを狙い撃ちにするのがプロのやり方です
                If swAnn.GetType = swAnnotationCenterMark Then
                    ' 非表示に設定(Visible = False)
                    ' 削除ではなく非表示にする方が、後で戻せるため安全です
                    swAnn.Visible = False
                End If
                
                ' 次の注記へ移動
                Set swAnn = swAnn.GetNext
            Wend
            
            ' 次のビューへ移動
            Set swView = swView.GetNextView
        Wend
    Next i
    
    ' 最後に画面を更新して結果を反映
    swModel.GraphicsRedraw2
    MsgBox "すべての中心マークを非表示にしました。お疲れ様でした!", vbInformation
End Sub

3. 先輩エンジニアによる「ここがポイント」解説

このコードの中で、初心者がぜひ押さえてほしい「極意」を3点解説します。

① `SelectByID2` を使わずに制御する

マクロ記録ではよく見る `SelectByID2` は、「名前が一致するものを探して選択する」という命令です。しかし、中心マークに名前なんて付いていませんし、数が多いと処理が非常に重くなります。
今回のコードでは、`GetFirstAnnotation2` $\rightarrow$ `GetNext` という列挙(Enumeration)という手法を使っています。これは「リストを上から順に全部見る」方法で、漏れがなく、かつ高速です。

② 「削除」ではなく「非表示」にする

`swAnn.Visible = False` としています。
VBAでオブジェクトを完全に `Delete` してしまうと、元に戻す(Undo)ことが困難です。実務では、「やっぱりここだけは中心マークが欲しかった」という修正が必ず発生します。「消すのではなく、見えなくする」。これが現場で事故を起こさないための知恵です。

③ `While Not … Is Nothing` のリズム

VBAでSolidWorks APIを扱う際、最もよく使うのがこの構文です。
「次がある限り、処理を繰り返せ。次が Nothing(空っぽ)になったら終わりだ」という意味です。ビューや注記のように、いくつあるか事前には分からない要素を処理する際の黄金パターンですので、ぜひ指に覚え込ませてください。

4. 陥りやすいエラーと対策

もしコードが動かない場合は、ここをチェックしてください。

  • 「型が一致しません」というエラーが出る
  • `Set swDraw = swModel` の部分で発生することがあります。これは、開いているファイルが「パーツ」や「アセンブリ」のまま実行したためです。コードに入れたエラーチェック処理がそれを防いでくれますが、意識しておきましょう。
  • 一部のビューで中心マークが残る
  • シートフォーマット上の注記や、特殊な参照ビューの場合があります。基本的にはこのコードで網羅できますが、APIの仕様上、ビューに属していない注記は `swView.GetFirstAnnotation2` では拾えません。

まとめ:次のステップへ

おめでとうございます!このマクロを理解できたあなたは、単なる「記録ボタンの利用者」から、「SolidWorks APIを操るエンジニア」への第一歩を踏み出しました。

今回の学びのコア:
1. 階層構造を意識する(図面 $\rightarrow$ シート $\rightarrow$ ビュー $\rightarrow$ 注記)
2. 列挙して処理する(First $\rightarrow$ Next のループ)
3. 安全な操作を選択する(削除より非表示)

この考え方は、中心マークだけでなく、「特定の文字を含む注記だけ色を変える」「不要な寸法を一括削除する」といった高度な自動化にもそのまま応用できます。

ぜひ、いろいろなプロパティを書き換えて、自分だけの最強の図面クリーンアップツールに進化させてみてくださいね。応援しています!

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