【実務・中級編】【初心者向け】図面内の特定ビューにおける表示スタイル(シェード/隠線表示など)切替マクロ – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

【図面自動化】ビューの表示スタイルをプログラムで完全に支配する

業務自動化エンジニアの私から言わせてもらえば、図面作成作業における「ビューの表示スタイル(シェード、隠線表示など)を手動でポチポチ切り替える」という作業ほど、エンジニアの貴重な時間をドブに捨てている無駄な行為はありません。

アセンブリの変更に伴う図面の更新、コンフィギュレーションの切り替え、そして最終出図前のフォーマット統一。これらを人の手で行うこと自体が、ヒューマンエラーを生む最大の温床です。

今回は、SolidWorks VBAを用いて図面内の特定ビューの表示スタイルを動的かつ堅牢に制御するための極意を伝授します。単に動くだけのコードではなく、実務の現場で絶対に破綻しない「プロダクションコード」の書き方を叩き込みます。

—

なぜ初心者のコードは「一瞬でバグる」のか?

ネットの海を漂うサンプルコードの多くは、次のような甘い設計で作られています。

  • アクティブドキュメントを無条件で信用する
  • 選択セット(`Extension.SelectByID2`など)に依存し、画面の描画状態やフォーカスに処理が左右される
  • エラーハンドリングがなく、対象ビューが見つからないだけでマクロが沈黙する

プロの現場において、「画面が選択しているかどうか」に依存するコードは悪です。APIの本質を捉え、メモリ上のオブジェクトを直接叩くロジックを構築しなければなりません。

SolidWorks図面(DrawingDoc)において、表示スタイルを制御するのは `ISwView` オブジェクトの仕事です。このオブジェクトに対し、適切なメソッド(定数)を正確に流し込むことで、秒速のビュー制御が実現します。

—

表示スタイル制御のAPIコアメカニズム

SolidWorks VBAでビューの表示スタイルを変更するには、`IView::DisplayMode` プロパティを使用します。
ここで指定する主なAPI定数(ビューの表示状態)は以下の通りです。

| 定数名 (VBA内での値 または 型) | 状態 |
| :— | :— |
| `swWIREFRAME` (1) | ワイヤーフレーム |
| `swHIDDEN_LINES_VISIBLE` (2) | 隠線表示 |
| `swHIDDEN_LINES_REMOVED` (3) | 隠線なし |
| `swSHADED` (4) | シェード |
| `swSHADED_WITH_EDges` (5) | 縁付きシェード |

※環境やSolidWorksのバージョンによる差異を防ぐため、数値ではなく可能な限り型安全なアプローチをとるか、明示的な定数を定義して実装します。

—

【コピペ即実戦】堅牢なプロダクションコード例

それでは、実務でそのまま使えるモジュールを公開します。
このコードは、アクティブな図面シート上の特定のビュー名(または全ての図面ビュー)を走査し、一括して「隠線なし(HLR)」または「シェード」に安全に切り替えるプロシージャです。

Option Explicit

‘ =========================================================================
‘ ódulo名: modViewStyleController
‘ 概要 : 図面ビューの表示スタイルをプログラム制御で安全に切り替える
‘ 著者 : 業務自動化チーフアーキテクト
‘ =========================================================================

‘ SolidWorks 表示スタイル定数の定義(API仕様に準拠)
Private Enum swViewDisplayMode_e
swDetailViewDisplayModeAsParent = 0
swWIREFRAME = 1
swHIDDEN_LINES_VISIBLE = 2
swHIDDEN_LINES_REMOVED = 3 ‘ 隠線なし
swSHADED = 4 ‘ シェード
swSHADED_WITH_EDGES = 5 ‘ 縁付きシェード
End Enum

Sub Main_ChangeViewStyle()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim vViews As Variant
Dim swView As SldWorks.View
Dim i As Long
Dim targetStyle As Long

‘ 1. アプリケーションの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

‘ 2. アクティブドキュメントの取得と型チェック
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbExclamation
Exit Sub
End If

If swModel.GetType <> swDocDRAWING Then
MsgBox “このマクロは図面ドキュメントでのみ実行可能です。”, vbCritical
Exit Sub
End If

Set swDraw = swModel

‘ ———————————————————————
‘ 設定エリア: ここを変更することで希望のスタイルに一括変更できます
‘ 例: swSHADED_WITH_EDGES (縁付きシェード)
‘ ———————————————————————
targetStyle = swSHADED_WITH_EDGES

‘ 3. アクティブシートの取得
Set swSheet = swDraw.GetCurrentSheet
If swSheet Is Nothing Then
MsgBox “アクティブなシートが見つかりません。”, vbCritical
Exit Sub
End If

‘ 4. シート上の全ビューを取得
vViews = swSheet.GetViews
If IsEmpty(vViews) Then
MsgBox “処理対象のビューが存在しません。”, vbInformation
Exit Sub
End If

‘ 5. トランザクション処理の開始(パフォーマンス向上と一括Undoのため)
swModel.Extension.UseDropUndoReference = True
swModel.ClearSelection2 True

‘ 6. ビューの走査と表示スタイルの適用
Dim successCount As Long
successCount = 0

For i = LBound(vViews) To UBound(vViews)
Set swView = vViews(i)

‘ シート自体を表すルートビュー(通常は名前が空か特殊)は除外する
‘ ビュー名がルート名と一致しない(=通常の図面ビューである)ことを確認
If swView.GetName2 <> swSheet.GetName Then

‘ 親ビューのスタイル継承を切る必要がある場合もあるが、
‘ 強制的に指定スタイルを適用する
swView.DisplayMode = targetStyle
successCount = successCount + 1

End If
Next i

‘ 7. 画面の強制再描画(API実行後の視覚的同期)
swModel.WindowRedraw

‘ 完了ログ
MsgBox “処理が完了しました。” & vbCrLf & _
“対象ビュー数: ” & successCount & ” 件のスタイルを更新しました。”, vbInformation, “自動化完了”

End Sub

—

チーフアーキテクトが教える、現場の「罠」と回避策

このコードを実務に導入する際、シニアエンジニアとして知っておくべき「罠」が2つあります。

1. 親ビューとの連動(継承)問題

詳細図(Detail View)や断面図(Section View)を作成した場合、デフォルトでは「親ビューの表示スタイルを継承する」設定になっています。
もしコードで `swView.DisplayMode` を書き換えても変わらない場合、そのビューが親のスタイルに縛られている可能性があります。厳密に制御したい場合は、ビューのプロパティ側で継承を切る処理を挟むか、親ビュー側のスタイルを制御する必要があります。

2. 大規模アセンブリ図面でのパフォーマンス

数千点の部品を持つアセンブリの図面で、全ビューのシェードを一斉に切り替えると、SolidWorksのメモリ消費量が跳ね上がり、最悪の場合フリーズします。
プロダクション環境に組み込む際は、`swModel.EditRebuild3` や図面の軽量モード(Lightweight)の状態を考慮し、必要に応じて不要な再計算を抑止する設計を取り入れてください。

—

まとめ

たかが「表示スタイルの切替」ですが、ここにエンジニアの設計思想が宿ります。
手作業の自動化は、単なるマクロの貼り付けではなく、「いかにシステムを堕落させず、堅牢に回し続けるか」の戦いです。

今回のコードをベースに、ファイル名やプロパティと連携させた「完全自動出図システム」へと昇華させてみてください。あなたの設計業務のスピードは、文字通り「次元が変わる」はずです。

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