SolidWorks VBAを掌握する極限の知見
【アセンブリ初期化の真実】設計者の癖を殺せ!新規アセンブリの表示設定をVBAで一括強制する極意
長年、大規模な3D CAD運用やレガシーなVBAシステムの構築に携わってきた者なら、誰もが一度は直面する悪夢がある。それは「設計者によってアセンブリの初期表示状態がバラバラ問題」だ。
ある者は等角投影図で保存し、ある者は謎のトリアド表示を残したまま放置し、またある者は原点を非表示にする。この細部の不統一が、図面化の自動処理、PDM連携、そして何より全社的なデザインレビューの品質を確実に蝕んでいく。
「たかが表示設定、されど表示設定」である。
今回は、新規アセンブリドキュメントが生成された瞬間、あるいは既存の混沌としたアセンブリを読み込んだ瞬間に、標準ビュー(等角投影など)や原点・プレーンの表示状態をプログラムの力で冷徹かつ一括強制する、実戦投入レベルのVBAコードと、その背後にあるAPIのライフサイクル管理の極意を授けよう。
—
1. なぜ「手動」では破綻するのか? APIのライフサイクルを知る
初心者は「テンプレートファイルを作り込めばいい」と言う。しかし、社外から持ち込まれたSTEPインポートデータや、古いバージョンからのコンバートファイルにおいて、テンプレートの強制力は無力と化す。
ここで必要となるのが、ドキュメント生成イベント(またはマクロによるラッパー実行)と、SolidWorks COMオブジェクトの厳格なライフサイクル管理である。
VBAの世界では、`SldWorks.ModelDoc2` や `SldWorks.AssemblyDoc` を安易に乱発し、適切な解放を行わないことで、メモリリークやCOMプロセスのゾンビ化が頻発する。特にアセンブリの走査やビューポートの操作を行うAPIは、裏側で膨大なグラフィックリソースを消費する。
これから提示するコードは、単なるプロパティの書き換えではない。実務の荒波に耐えうる、メモリと実行速度を極限まで最適化されたアーキテクチャだ。
—
2. 実装コード:一括表示設定強制マクロ
以下のコードは、アクティブなアセンブリドキュメントに対し、原点や軸の表示制御、表示モードの変更、そして等角投影(Isometric)への強制スナップをノーウェイトで実行する。
Option Explicit
‘ =========================================================================
‘ 模範的アセンブリ初期表示化エンジン
‘ Architecture: 伝説的チーフアーキテクト専用チューニング
‘ =========================================================================
Sub ForceAssemblyEnvironment()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swAssm As SldWorks.AssemblyDoc
Dim swView As SldWorks.View
‘ 1. セッションの取得 (GetObjectの罠を避け、安全なSldWorksインスタンスを確保)
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() <> swDocASSEMBLY Then
MsgBox “このマクロはアセンブリドキュメント専用です。”, vbCritical, “型不一致エラー”
Exit Sub
End If
Set swAssm = swModel
‘ 3. 画面描画の凍結(パフォーマンス爆速化の常道:ScreenUpdateの無効化)
swModel.Extension.UseExtraGraphics = False
swApp.CommandInProgress = True
On Error GoTo ErrorHandler
‘ — [A] 表示スタイルの強制 (Shaded with Edges = 6) —
Dim swModelDocExt As SldWorks.ModelDocExtension
Set swModelDocExt = swModel.Extension
swModelDocExt.DisplayMode = swRenderingMode_e.swVEShadedWithEdges
‘ — [B] 原点・平面・軸・スケッチ等の非表示化 (システムビジビリティ制御) —
‘ ユーザ定義のビュー設定を上書きし、クリーンな画面を強制する
‘ 引数: 1=原点, 2=平面, 3=軸, 4=カーブ, etc. (API定数または直接フラグ操作)
‘ 原点の非表示
swModel.BlankRefGeometry
‘ 基本平面の表示/非表示を強制コントロール (例: すべて非表示にする場合)
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swViewPlanes, False)
boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swViewAxes, False)
boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swDisplayOrigins, False)
boolstatus = swModel.Extension.SetUserPreferenceToggle(swUserPreferenceToggle_e.swViewCoordinateSystems, False)
‘ — [C] 標準ビュー(等角投影:Isometric)への強制スナップ —
‘ 単なるZoomToFitではなく、数学的に正確な等角投影マトリックスへアライメントする
Set swView = swModel.ActiveView
If Not swView Is Nothing Then
‘ 等角投影 (swStandardView_e.swIsometric = 7)
swModel.ShowNamedView2 “等角投影”, 7
swModel.ViewZoomtofit2
End If
‘ 4. 変更のコミットと再構築
swModel.ForceRebuild3 False ‘ 簡易リビルド
GoTo CleanUp
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “例外トラップ”
CleanUp:
‘ 5. 描画の復元とメモリの明示的解放(Destructorの概念)
swApp.CommandInProgress = False
swModel.Extension.UseExtraGraphics = True
‘ オブジェクト参照の完全抹殺(COM参照リークの徹底阻止)
Set swView = Nothing
Set swModelDocExt = Nothing
Set swAssm = Nothing
Set swModel = Nothing
Set swApp = Nothing
Debug.Print “Assembly Environment Initialization Completed.”
End Sub
—
3. チーフアーキテクトが解説するコードの急所
このコードが他の凡庸なスクリプトと一線を画す理由は以下の3点に集約される。
① `CommandInProgress` と `UseExtraGraphics` による描画リソースの保護
アセンブリの階層が深くなると、表示設定を変更するたびにSolidWorksはビューポートの再描画を試みる。これが数千パーツのモデルであれば数秒のフリーズを生む。
`swApp.CommandInProgress = True` を宣言することで、SolidWorks内部のUIイベントリスナーを一時的にスリープさせ、処理速度を限界まで引き上げる。
② レガシー環境とマルチリンガル対応への配慮
コード内の `ShowNamedView2 “等角投影”, 7` に注目してほしい。
SolidWorksの標準ビュー名は、OSの言語環境(日本語版なら「等角投影」、英語版なら「Isometric」)に依存するため、文字列だけでビューを指定すると多国籍チームでエラーを吐く。
しかし、列挙体(Enum)に紐づく標準ビュー番号(`7`)を直接指定することで、言語の壁を完全にバイパスし、グローバル共通の動作を担保している。これぞレガシーシステムを渡り歩いてきたエンジニアの知恵だ。
③ 厳格なCOMオブジェクトの解放
VBAはガベージコレクションを持たない。`Set swModel = Nothing` を省略するコードが蔓延しているが、大規模アセンブリを扱うVBAにおいてこれをサボることは、徐々にExcelやSolidWorksのメモリ空間を腐敗させる「スロードリフト」を引き起こす。
処理の最後には必ず、生成した順序とは逆の順序で `Nothing` を代立させ、COMの参照カウンタを確実にデクリメントさせよ。
—
4. システム間連携(PDM / 自動図面生成)への応用
このマクロ単体でも十分な価値があるが、真の真骨頂は 「Event(イベント)駆動による自動フック」 や 「外部バッチ処理(C# / VB.NET経由のCOM呼び出し)」 との統合にある。
例えば、PDMからチェックアウトされたアセンブリファイルに対し、タスクスケジューラからこのロジックをサイレント実行(`Visible = False`)で走らせることで、リポジトリ内のすべての3Dデータを常に「正しい見た目・正しい原点状態」に自動浄化する中央集権システムが構築できる。
設計者の「うっかり」を人間の教育で直そうとするのは愚行である。
仕組みとコードで環境を強制し、エンジニアを本質的な「設計」に集中させること。それこそが、自動化エンジニアの存在意義なのだ。
