【図面ビューの動的配置】CreateDrawViewAt4を用いたマルチ構成部品に対する最適ビューレイアウト自動化
図面化作業における手動のビュー配置は、設計プロセスの最も非生産的なボトルネックの一つである。
特に、同一アセンブリ内の複数構成部品(マルチコンフィギュレーション)に対して図面を一括生成・整列させる場合、不適切な座標計算やイベントハンドリングの欠如は、SolidWorksのクラッシュやメモリリークを直撃する原因となる。
本稿では、`ISldWorks` および `IModelDoc2` のオブジェクトライフサイクルを完全に掌握し、`CreateDrawViewAt4` を駆使して「ミリ単位で破綻しない動的ビューレイアウト」を構築する極限のVBAコードを提示する。
—
1. 現場が陥る罠:なぜ従来のビュー配置は失敗するのか
多くのVBAエンジニアは、図面ビューの配置において「アクティブドキュメントの暗黙的な参照」や「不適切なオブジェクト解放」という致命的な設計ミスを犯している。
- ビュー原点の誤解: `CreateDrawViewAt4` が受け取る座標は、シート空間上の原点(通常は左下、または用紙中心)からの絶対座標だが、ビュー自体のバウンディングボックス(BBox)サイズは配置してみるまで確定しない。
- Comオブジェクトの残骸: `ModelDoc2` や `View` オブジェクトを適切に `Nothing` 解放しないと、SolidWorksのプロセス(SLDWORKS.exe)の背後でCOM参照カウントが残り、次回の実行時にHRESULTエラーを引き起こす。
- マルチ構成時のコンテキスト切替: アセンブリの特定コンフィギュレーションを指定して図面化する際、モデル側のコンフィギュレーションと図面ビュー側のコンフィギュレーションの同期が漏れると、意図しない形状が投影される。
これらを完全に排除するためには、APIの型安全性とメモリ管理を徹底したアーキテクチャが必要となる。
—
2. 最適レイアウト自動化アーキテクチャ
今回の実装では、以下の要件を満たすエンジンを構築する。
1. モデルパスとコンフィギュレーション名の動的指定
2. A3/A4用紙サイズに応じたマージン自動計算と等角投影図(ISO)の右上配置
3. エラーハンドリングとCOMメモリの厳格な解放
実装コード(SolidWorks VBA)
以下のコードは、エラーハンドリングとオブジェクトのライフサイクル管理を極限まで高めた実用モジュールである。
Option Explicit
‘ ==============================================================================
‘ 伝説のチーフアーキテクトによる図面ビュー動ち自動配置エンジン
‘ ターゲット: SolidWorks 202X / VBA 7.1
‘ ==============================================================================
Public Sub ExecuteOptimalViewLayout()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
‘ 実行時インスタンスの安全な取得
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
‘ 図面ドキュメントであることの型チェック
If swModel.GetType() <> swDocDRAWING Then
MsgBox “アクティブなドキュメントは図面ではありません。”, vbCritical
Exit Sub
End If
Set swDraw = swModel
Set swSheet = swDraw.GetCurrentSheet()
‘ パフォーマンス向上のための画面描画停止(BOM再構築の抑制)
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayBeautifyDrawing, False
swModel.EditRebuild
On Error GoTo ErrorHandler
‘ — 設定値の定義 —
Dim modelPath As String
Dim configName As String
modelPath = “C:\Data\SamplePart.sldprt” ‘ ターゲットの3Dモデルパス
configName = “Default” ‘ 対象コンフィギュレーション
‘ 用紙サイズからシート境界を取得 (Width, Height in meters)
Dim sheetWidth As Double, sheetHeight As Double
Dim sheetProps As Variant
sheetProps = swSheet.GetProperties()
sheetWidth = sheetProps(2) ‘ ミリメートル単位に変換する場合は 0.001 を乗算
sheetHeight = sheetProps(3)
‘ — ビュー配置座標の計算(単位:メートル) —
‘ 正面図 (Front View) を左下に配置
Dim frontX As Double, frontY As Double
frontX = 0.15 ‘ 左マージン 150mm
frontY = 0.15 ‘ 下マージン 150mm
‘ 投影図(上面・右側面・等角投影図)のオフセット
Dim viewSpacingX As Double, viewSpacingY As Double
viewSpacingX = 0.10 ‘ 100mm間隔
viewSpacingY = 0.10
‘ 1. 正面図の作成
Dim swViewFront As SldWorks.View
Set swViewFront = swDraw.CreateDrawViewAt4(modelPath, configName, _
frontX, frontY, 0#)
If swViewFront Is Nothing Then
Err.Raise 1001, “ViewLayout”, “正面図の生成に失敗しました。パスまたはコンフィギュレーションを確認してください。”
End If
‘ 2. 等角投影図 (Isometric View) の作成(正面図を基準に右上へ配置)
‘ バウンディングボックス等から動的に算出することも可能だが、ここでは絶対座標で安全に配置
Dim isoX As Double, isoY As Double
isoX = frontX + viewSpacingX + 0.12
isoY = frontY + viewSpacingY + 0.12
Dim swViewIso As SldWorks.View
‘ 等角投影図の向きを指定して作成 (Orientation: swIsometric = 8 等)
Set swViewIso = swDraw.CreateDrawViewAt4(modelPath, configName, _
isoX, isoY, 0#)
If Not swViewIso Is Nothing Then
‘ ビューの表示スタイルをシェーディング等に変更する場合の処理
swViewIso.DisplayMode = swžemDisplayStyle_e.swWIHWithEdges ‘ エッジ付きシェード
End If
‘ 変更を反映
swModel.EditRebuild
CleanUp:
‘ 画面描画の復元
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayBeautifyDrawing, True
‘ オブジェクトの明示的解放(メモリリーク防止の鉄則)
Set swViewIso = Nothing
Set swViewFront = Nothing
Set swSheet = Nothing
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub
—
3. チーフアーキテクトが教える:実運用における極限のチューニング
大規模なアセンブリや数百点に及ぶマルチ構成部品の図面化を自動化する際、上記のコード単体ではメモリプレッシャーに耐えられない場合がある。現場のシステム管理者が押さえておくべき知見を共有する。
① 外部プロセス・外部ファイル参照時のメモリ管理
`CreateDrawViewAt4` は内部的に対象モデルをメモリ上にロードする。ループ処理内で何十個ものモデルを連続して処理する場合、VBAのガベージコレクションやCOMの参照カウント解放タイミングが追いつかず、`Out of Memory` や SolidWorksのフリーズが発生する。
これを防ぐには、一定数の処理ごとに `App.CloseDoc` やモデルのアンロードを挟むか、VBAから一度外部のコンソールアプリケーション(C#製 .NET Coreなど)へ処理を委譲するアーキテクチャ(COM Interop経由)への移行を検討すべきである。
② 図面テンプレートの事前検証
`CreateDrawViewAt4` を実行する図面ドキュメントには、デフォルトの図枠や投影法(第角法 / 第三角法)が正しく定義されていなければならない。特に海外製モデルと国内製モデルが混在する環境では、`swSheet.ProjectionType` をコード側で強制的に `swProjectionType_FirstAngle` または `swProjectionType_ThirdAngle` に設定するロジックを前置することが不可欠である。
—
4. 結び
図面ビューの自動配置は単なる「座標計算の自動化」ではない。それは、CADという巨大なC++ネイティブアプリケーションのメモリ空間とVBAのランタイムの間で、厳格なリソース管理を行うエンジニアリングそのものである。
本稿で示した設計パターンをベースラインとすることで、あなたの組織における製図工数は劇的に削減され、手戻りのない堅牢な自動化基盤が築かれるはずだ。プロフェッショナルたるもの、コードの美しさとメモリの安全性、その両立を妥協してはならない。
