こんにちは。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. 安全な操作を選択する(削除より非表示)
この考え方は、中心マークだけでなく、「特定の文字を含む注記だけ色を変える」「不要な寸法を一括削除する」といった高度な自動化にもそのまま応用できます。
ぜひ、いろいろなプロパティを書き換えて、自分だけの最強の図面クリーンアップツールに進化させてみてくださいね。応援しています!
