SolidWorks VBAを掌握する極限の知見
【図面自動化の核心】図面ビューの表示スタイルをAPIで完全制御せよ
SolidWorksマクロの自動化において、3Dモデル(Part/Assembly)の生成に比べ、図面(Drawing)の制御はしばしば「ブラックボックス」扱いされがちだ。特に、配置されたビューの表示状態(隠線表示、シェード、ワイヤーフレームなど)を手動でポチポチ切り替えている現場がいかに多いことか。
シニアエンジニアや社内システム管理者であるならば、この非効率を許してはならない。図面自動化の品質は、ビューの正確な状態制御あってこそ担保される。
今回は、図面ビューの表示スタイルをVBAから動的にプログラム制御するための極限の知見を公開する。APIの背後にあるオブジェクトモデルの挙動を理解し、現場で即座に使える堅牢なコードを構築しよう。
—
1. SolidWorks図面APIの構造的理解と「罠」
ビューの表示スタイルを制御するためには、SolidWorksのドキュメント階層構造を正確に把握する必要がある。
- `SldWorks.ModelDoc2` (ドキュメント基底)
- `SldWorks.DrawingDoc` (図面特有の操作)
- `SldWorks.View` (個別の図面ビュー)
ここで多くの初学者が陥る罠が、「どのオブジェクトに対してスタイルの変更命令を発行すべきか」という点だ。表示スタイルはシート全体の設定ではなく、個々の`View`オブジェクトが保持するプロパティ、あるいはドキュメント全体のデフォルト設定に依存する。
ビューの表示スタイルをコードから強制切替するには、`IView::DisplayMode` プロパティを操作する。しかし、単純にプロパティを書き換えるだけでは画面が追従しない、あるいはメモリ上に古いレンダリングキャッシュが残るというSolidWorks特有の悪癖に直面する。ここを突破するのがチーフアーキテクトの仕事である。
—
2. 実装コード:表示スタイル動的切替マクロ
以下のコードは、アクティブな図面シート上にあるすべての図面ビュー(または特定名のビュー)を走査し、指定した表示スタイル(隠線表示なし、シェード、ワイヤーフレーム等)へ一括、あるいは個別に強制切替する実用プロシージャである。
Option Explicit
‘ ==============================================================================
‘ 担当: チーフアーキテクト
‘ 概要: 図面ビューの表示スタイルを動的に制御する実用プロシージャ
‘ 備考: オブジェクトの明示的解放と画面更新抑制による極限のパフォーマンス最適化
‘ ==============================================================================
‘ swDisplayMode_e 列挙体の定義(API定義の補完)
Private Enum swDisplayMode_e
swWIREFRAME = 0 ‘ ワイヤーフレーム
swHIDDEN_GREYED = 1 ‘ 隠線表示(淡色)
swHIDDEN = 2 ‘ 隠線表示なし
swSHADED_EDGES = 3 ‘ シェード(エッジ表示)
swSHADED = 4 ‘ シェード
‘ ※SolidWorksのバージョンにより一部数値や定義が追加される場合があります
End Enum
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View
‘ 1. セーフティなアプリケーションインスタンスの取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbExclamation
Exit Sub
End If
‘ 2. 図面ドキュメントかどうかの型安全な判定
If swModel.GetType <> swDocDRAWING Then
MsgBox “アクティブなドキュメントは図面ではありません。”, vbCritical
Exit Sub
End If
Set swDraw = swModel
‘ 3. パフォーマンス最適化:画面描画の凍結(Redrawを抑制)
swModel.Visible = False
On Error GoTo ErrorHandler
‘ 4. 最初のビュー(シートそのものを表すルートビュー)を取得
Set swView = swDraw.GetFirstView
If swView Is Nothing Then
GoTo CleanUp
End If
‘ ルートビューの名称確認(通常はシート名)
‘ Debug.Print “Root View: ” & swView.Name
‘ 5. 子ビュー(実際に配置された図面ビュー)の走査ループ
Set swView = swView.GetNextView
Do While Not swView Is Nothing
‘ ここでビュー名やスケール等によるフィルタリングも可能
‘ 例: 特定のビューのみ処理したい場合は If swView.Name = “DrawingView1” Then などで分岐
‘ ———————————————————————-
‘ 【核心】表示スタイルの設定
‘ swSHADED_EDGES (3) : シェード表示
‘ swHIDDEN (2) : 隠線表示なし
‘ swWIREFRAME (0) : ワイヤーフレーム
‘ ———————————————————————-
swView.DisplayMode = swSHADED_EDGES
‘ 次のビューへ
Set swView = swView.GetNextView
Loop
CleanUp:
‘ 6. 画面描画の復元と強制リフレッシュ
swModel.Visible = True
swModel.GraphicsRedraw2
‘ 7. オブジェクトの明示的解放(メモリリーク防止の鉄則)
Set swView = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox “図面ビューの表示スタイル切替が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
‘ 異常系ハンドリング
swModel.Visible = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
‘ エラー時も確実に解放
Set swView = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub
—
3. チーフアーキテクトが教える「現場の知見」とパフォーマンス最適化
上記のコードは単なるAPIのラッパーではない。現場で数千枚の図面を一括処理するシニアエンジニアだからこそ組み込んだ、厳格な設計思想が存在する。
① 画面描画の凍結 (`swModel.Visible = False` / `GraphicsRedraw2`)
SolidWorks VBAの実行速度を低下させる最大のボトルネックは「グラフィック描画の計算コスト」である。ビューのプロパティを書き換えるたびに画面が再描画されていては、マクロの完了を何十分も待つ羽目になる。
処理の開始時にドキュメントの可視状態を一時的に操作し、最後に `GraphicsRedraw2` で一括描画する手法は、大規模アセンブリ図面を扱う現場では必須のテクニックである。
② COMオブジェクトの明示的解放
VBAのガベージコレクションは頼りにならない。特にSolidWorks APIのCOMオブジェクト (`GetFirstView` や `GetNextView` で取得するポインタ) をループ内で回す際、変数解放を怠ると確実にメモリリーク(COM参照カウントの肥大化)を引き起こし、SolidWorks自体の強制終了やメモリ不足エラーを誘発する。
処理の最後には必ず `Set 〇〇 = Nothing` を記述し、VBAランタイムとSolidWorksプロセス間のメモリ整合性を保つこと。
③ レガシー環境とバージョン差異への備え
古いSolidWorks(例: 2010年代初頭のバージョン)から最新の2024/2025環境まで保守を続ける場合、`swDisplayMode_e` の列挙体値が予期せぬ挙動をすることがある。そのため、コード内のように明示的な数値コメントを併記するか、あるいはAPIヘルプで定数名ではなく生の値(数値)が期待されているコンテキストがないか常に警戒せよ。
—
総括
図面ビューの表示スタイル切替は、単なる見た目の変更ではない。図面自動発行システム(PDF/DXFの一括出力前処理など)において、正確なドキュメント状態を保証するための極めて重要なプロセスである。
安易なコードのコピペで満足するな。背後にあるAPIのライフサイクル、メモリ管理、そして描画エンジンの挙動を完全に見通した上で、自社の自動化パイプラインに組み込んでほしい。それこそが、真のSolidWorks VBA使いの姿である。
