【脱・マクロ記録】図面ビューの接線一括制御:オブジェクト階層を理解して自動化の扉を開く
こんにちは。設計現場の自動化を支えるエンジニアの皆さん。
日々、CADの前で「これ、一つずつクリックして設定を変えていたら日が暮れるな……」と感じることはありませんか?
特に図面作成において、モデルの形状が複雑になればなるほど、「接線(Tangent Edges)」の表示が画面を埋め尽くし、図面がまるで蜘蛛の巣のように見づらくなってしまうことがあります。これを一つひとつのビューに対して手動で「接線を非表示」に設定していく作業……。これは、エンジニアが本来集中すべき「設計」の時間ではなく、単なる「クリック作業」です。
今日は、そんな煩わしい作業を一瞬で終わらせるマクロを題材に、「マクロの記録」から卒業し、SolidWorks APIの本質を掴むための第一歩を一緒に踏み出しましょう。
1. 「マクロの記録」の限界を知る
多くの初学者が最初に通る道が、SolidWorksの「マクロの記録」機能です。
ボタンを押して、操作を行い、記録を止める。これだけでコードは生成されます。しかし、記録されたコードには致命的な弱点があります。
「その時、画面に見えていたものしか操作できない」
記録されたコードは、いわば「録画ビデオ」です。「1番目のビューをクリックして、設定を変える」という手順は書けますが、「図面内にあるすべてのビューを探して、順番に設定を変える」という論理的な判断はできません。
真の自動化とは、ビデオを再生することではなく、「図面という構造(オブジェクト)を理解し、プログラムに命令を下すこと」なのです。
2. SolidWorksの「階層構造」をイメージしよう
コードを書く前に、SolidWorksがどのようにデータを管理しているかを理解しましょう。これを「オブジェクトモデル」と呼びます。
図面ファイルは、以下のような入れ子構造(ツリー構造)になっています。
1. SldWorks (アプリケーション全体)
- DrawingDoc (開いている図面ファイル)
- Sheet (図面シート)
- View (図面ビュー:投影図、詳細図など) $\leftarrow$ ここを操作したい!
今回のミッションは、「DrawingDocの中から、すべてのViewを見つけ出し、それぞれの接線表示設定を書き換える」ことです。
3. 実践:全ビューの接線を一括非表示にするコード
それでは、魂を込めたコードを見ていきましょう。このコードは、単に動くだけでなく、エラーを防ぎ、後から読み返しても意味がわかるように設計しています。
Option Explicit
''' <summary>
''' 図面内のすべてのビューに対して、接線の表示を「なし」に設定するマクロ
''' </summary>
Sub Main()
' --- 1. 変数の宣言 (メモリの準備) ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
Dim swSheet As SldWorks.Sheet
' エラーハンドリング(予期せぬ事態で止まらないように)
On Error GoTo ErrorHandler
' --- 2. SolidWorksへの接続とドキュメントの取得 ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 図面ファイルが開かれているかチェック
If swModel Is Nothing Then
MsgBox "図面ファイルを開いてから実行してください。", vbExclamation
Exit Sub
End If
' 選択されたファイルが「図面(Drawing)」であるかチェック
If swModel.GetType <> swDocDRAWING Then
MsgBox "このマクロは図面ファイル専用です。", vbExclamation
Exit Sub
End If
' 図面ドキュメントとして扱うためのセット
Set swDraw = swModel
' --- 3. ビューの巡回 (ここが自動化の心臓部) ---
' GetFirstView は「最初のビュー」を取得します。
' 注意:図面において「最初のビュー」は、実は「シート自体」を指します。
Set swView = swDraw.GetFirstView
' ビューのループ処理
Do While Not swView Is Nothing
' 「シート」そのものではなく、「モデルの投影図」に対して処理を行うための判定
' シート(最初のビュー)は、通常、名前が空であったり、特定のプロパティを持ちます。
' ここでは、ビューがモデルを参照しているかを確認する手法が一般的です。
If Not swView.Name = "" Then
' 接線表示の設定を変更
' swTangentEdgeDisplay_None (0): 接線を表示しない
' swTangentEdgeDisplay_All (1): すべて表示
' swTangentEdgeDisplay_Intersection (2): 交点のみ表示
swView.SetTangentEdgeDisplay swTangentEdgeDisplay_None
' 変更を視覚的に反映させる(再描画)
swModel.GraphicsRedraw2
End If
' 次のビューへ移動(これがないと無限ループになります!)
Set swView = swView.GetNextView
Loop
MsgBox "すべてのビューの接線を非表示にしました。", vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
4. プロが教える「ここが重要!」解説
コードを読み解く際に、絶対に外してはいけないポイントが3つあります。
① `GetFirstView` と `GetNextView` のマジック
ここが初学者が最も躓くポイントです。SolidWorksのAPIでは、図面における「最初のビュー」は、実はモデルの投影図ではなく、「図面シートそのもの」なのです。
そのため、コードの中で `If Not swView.Name = “” Then` という判定を入れています。これにより、「シート自体(名前なし)」をスキップし、純粋な「投影図(名前あり)」に対してのみ命令を下すことができるのです。
② 無限ループの回避
`Do While Not swView Is Nothing` という構文を使っています。これは「ビューが存在する限り繰り返せ」という意味です。ループの最後で必ず `Set swView = swView.GetNextView` を呼び出し、「次の部屋へ移動する」命令を与えないと、プログラムは永遠に同じビューを処理し続け、SolidWorksがフリーズしてしまいます。
③ 型の判定(Defensive Programming)
`If swModel.GetType <> swDocDRAWING Then`。
これは「防御的プログラミング」と呼ばれる手法です。もしユーザーが誤って「部品(Part)」ファイルを開いたままマクロを実行しても、エラーで強制終了するのではなく、「これは図面用ですよ」と優しく教えてあげる。これが、現場で使われる「信頼されるツール」の条件です。
5. まとめ:一歩先へ進むために
今回のマクロを通じて、あなたは「オブジェクトを辿り、条件に従って、繰り返し処理を行う」という、自動化の最も基本的かつ強力なアルゴリズムを学びました。
これが理解できれば、次は「特定のシートだけを対象にする」「特定の名前のビューだけ接線を表示する」といった、より高度なカスタマイズも自由自在です。
「マクロの記録」は便利な道具ですが、それはあくまで「辞書」のようなものです。あなた自身が「文法(APIの構造)」を理解すれば、辞書を引くだけでは作れない、自分だけの強力な武器(プログラム)を構築できるようになります。
さあ、恐れずにコードを書き換えてみてください。エラーが出るのは、あなたが成長している証拠ですから。
Happy Automation!
