マクロ記録から卒業しよう:図面ビューの表示モードを「一括制御」する極意
こんにちは。設計業務の自動化、楽しんでいますか?
「マクロの記録」ボタンを押して、操作を記録し、それを少し書き換える……。実は、多くのエンジニアがここからスタートします。でも、ある時必ず壁にぶつかります。
「記録されたコードが複雑すぎて、どこをどう直せばいいのかさっぱり分からない!」
「実行するとエラーが出て止まってしまう……」
もしあなたが今、そんな風に感じているなら、おめでとうございます。あなたは今、単なる「操作の録画」から、真の「プログラミング(API制御)」へと脱皮する境界線に立っています。
今日は、図面作成における「あるある」な悩み——「図面ビューの隠線表示がバラバラで、手作業で直すのが苦痛」という問題を、VBAでエレガントに解決する方法を伝授します。
このコードをマスターする頃には、SolidWorksの「オブジェクトの構造」が手に取るように分かるようになっているはずですよ。
1. なぜ「マクロ記録」ではダメなのか?
マクロの記録機能は、非常に便利ですが、致命的な弱点があります。それは、「あなたが画面上で何を選択したか」という、非常に不安定な情報に基づいていることです。
例えば、ビューの表示モードを変えるとき、記録されたコードは `SelectByID2` という命令を多用します。「”View1@Drawing1″ を選択せよ」といった指示です。しかし、ビューの名前が変わったり、別の図面で動かそうとした瞬間に、このコードは無力化します。
プロのエンジニアは、名前(String)で対象を探すのではなく、「オブジェクト(Object)」そのものを直接掴みに行きます。 これが、今回学ぶ「オブジェクトモデル」の考え方です。
2. 攻略の鍵:SolidWorksの「階層構造」を理解する
SolidWorks VBAを操るには、図面がどのような「入れ子構造」になっているかを知る必要があります。これを理解せずにコードを書くのは、地図を持たずに樹海に入るようなものです。
図面ファイルの中身は、以下のようなピラミッド構造になっています。
1. SldWorks (アプリケーション本体):全ての始まり。
2. ModelDoc2 (ファイルそのもの):開いている図面ファイル。
3. DrawingDoc (図面ドキュメント):図面特有の機能(シート操作など)を持つ。
4. Sheet (シート):紙。1つの図面には複数のシートがある。
5. View (ビュー):紙の上に配置された、3Dモデルの投影図。← 今回操作したいのはここ!
今回のミッションは、「全てのシートを巡回し、その中にある全てのビューに対して、『隠線消去(Hidden Lines Removed)』を強制適用する」ことです。
3. 実践:隠線消去を強制する最強のスクリプト
それでは、コードを見ていきましょう。初心者の方でも迷わないよう、徹底的にコメントを入れました。
Option Explicit
' ==============================================================================
' プログラム名:ForceHiddenLinesRemoved
' 概要:図面内の全てのシート、全てのビューに対して「隠線消去」を強制適用する。
' 作成者:Legendary Chief Architect
' ==============================================================================
Sub ForceHiddenLinesRemoved()
' --- 1. 変数の宣言 (型を明示するのがプロの作法) ---
Dim swApp As SldWorks.SldWorks ' SolidWorksアプリケーション
Dim swModel As SldWorks.ModelDoc2 ' 開いているドキュメント
Dim swDraw As SldWorks.DrawingDoc ' 図面ドキュメントとしての機能
Dim swSheet As SldWorks.Sheet ' 現在のシート
Dim swView As SldWorks.View ' 現在のビュー
Dim vSheetNames As Variant ' 全シート名のリスト
Dim i As Integer ' ループ用カウンタ
' --- 2. オブジェクトの取得 (ここが心臓部) ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 図面ファイルが開かれていない場合は終了
If swModel Is Nothing Then
MsgBox "図面ファイルを開いてから実行してください。", vbCritical
Exit Sub
End If
' モデルが図面(Drawing)であることを確認
If swModel.GetType <> swDocDRAWING Then
MsgBox "このマクロは図面ファイル専用です。", vbCritical
Exit Sub
End If
' 図面ドキュメントとして操作できるようにキャスト(型変換)
Set swDraw = swModel
' --- 3. 全シートをループ処理 ---
' 全てのシート名を配列として取得
vSheetNames = swDraw.GetSheetNames
For i = 0 To UBound(vSheetNames)
' シートを切り替える(これをしないと、そのシートのビューにアクセスできない)
swDraw.ActivateSheet vSheetNames(i)
Set swSheet = swDraw.GetCurrentSheet
' --- 4. 各シート内のビューをループ処理 ---
' GetFirstView は、最初のビュー(実は「シート自体」のビュー)を取得する
Set swView = swDraw.GetFirstView
' GetFirstView で取得される最初のビューは「Sheet View」なので、
' 次のビュー(実際のモデル投影図)へ進む必要がある
Set swView = swView.GetNextView
Do While Not swView Is Nothing
' --- 5. 表示モードの変更 ---
' swDrawingViewMode_e.swDrawingViewMode_HiddenLinesRemoved = 1
' ここで「隠線消去」を強制適用する
swView.SetDisplayMode3 swDrawingViewMode_e.swDrawingViewMode_HiddenLinesRemoved, 0, 0
' 次のビューへ移動
Set swView = swView.GetNextView
Loop
Next i
' --- 6. 画面の更新と終了処理 ---
swModel.ForceRebuild3 True ' 図面を再構築して表示を確定させる
MsgBox "全てのビューの隠線消去を完了しました!", vbInformation
End Sub
4. ここが重要!エンジニアが教える「落とし穴」解説
コードをただコピーするだけでは、あなたはまだ「マクロ使い」です。「エンジニア」になるために、以下の3つのポイントを魂に刻んでください。
① `Set` キーワードの重要性
VBAにおいて、数値や文字列などの「値」を代入するときは `a = 10` と書きますが、オブジェクト(ViewやSheetなど)を代入するときは必ず `Set swView = …` と書かなければなりません。
これは、「変数に値を入れるのではなく、メモリ上のオブジェクトの『住所』を指し示す」という操作だからです。これを忘れると、`Object variable not set` というエラーの嵐に襲われます。
② 「最初のビュー」は「シート」である
ここが最大の落とし穴です。`swDraw.GetFirstView` を実行したとき、最初に返ってくるのは「モデルが投影されたビュー」ではなく、「紙(シート)そのもののビュー」です。
シートに対して「隠線消去」を命令しても意味がありません。だから、コードの中で `Set swView = swView.GetNextView` と書いて、一つ飛ばして「本当のビュー」から処理を開始しているのです。
③ `ForceRebuild3` を忘れない
APIでプロパティを書き換えただけでは、画面上の見た目がすぐに変わらないことがあります。これはSolidWorksが「計算コストを抑えるために、表示更新を後回しにしている」からです。
最後に `ForceRebuild3` を呼ぶことで、「さあ、新しい設定で描き直せ!」と強制的に命令を出します。これが、ユーザーに「動いた!」と思わせるプロの仕上げです。
最後に:一歩ずつ、確実に
いかがでしたか?
「マクロの記録」で出てきた、呪文のような長いコードが、実は「ファイル ➔ シート ➔ ビュー」という整然とした階段を降りているだけのことだと気づけたはずです。
最初はエラーが出ても、落ち込まないでください。エラーメッセージは、SolidWorksがあなたに送っている「ここが違うよ」という親切なヒントです。
この「階層を辿る」という感覚さえ掴めば、あなたはもう、SolidWorksを自由自在に操る自動化エンジニアへの道を歩み始めています。
さあ、次の自動化へ挑戦しましょう!応援していますよ。
