【実務・中級編】【上級プロ向け】図面ドキュメントのオープン・クローズ速度を極限まで高める「軽量モード」制御VBA – SolidWorks VBA解析バイブル

スポンサーリンク
スポンサーリンク

【極限の高速化】巨大図面を支配する:Lightweightモード制御によるメモリと時間の最適化戦略

業務自動化の現場において、エンジニアが直面する最大の敵は「計算時間」ではない。「待機時間」だ。

数千点の部品から構成される巨大なプラントアセンブリ、あるいは数百枚のシートを持つ複雑な図面ドキュメント。これらを愚直に `OpenDoc6` で開き、すべてのフィーチャを解決(Resolve)させてから処理を開始するような実装は、プロフェッショナルとは言えない。それは単なる「スクリプト」であり、エンタープライズ級の「ソリューション」ではないからだ。

本稿では、SolidWorks VBAを用いた図面処理において、メモリ消費を最小限に抑え、オープン・クローズの速度を劇的に向上させるための「Lightweight(軽量)モード制御」という極限のテクニックを伝授する。

1. 凡庸なコードが招く「待ち時間」というコスト

多くの開発者が陥る罠がある。それは、「図面を開く = すべての情報を読み込む」という誤った前提だ。

図面ファイル(.drw)自体は比較的軽量だが、その図面が参照している「モデル(.sldprt / .sldasm)」が巨大な場合、SolidWorksはビューを生成するために、モデルの全ジオメトリをメモリ上に展開しようとする。これが、自動化ツールが「応答なし」に陥り、メモリ不足(Out of Memory)を引き起こす根本原因だ。

我々が目指すべきは、「必要な情報(プロパティやシート構成)を得るためだけに、重いジオメトリを読み込まない」という設計思想である。

2. 戦略的アプローチ:Lightweight状態の強制制御

高速化の鍵は、ドキュメントを開く瞬間の「モード」をAPIレベルで完全に掌握することにある。

制御の3原則

1. UserPreferenceの事前制御: ドキュメントを開く前に、SolidWorksのシステム設定レベルで「軽量モードで開く」設定を強制する。
2. Silent Modeの徹底: ダイアログによるユーザー介入を完全に排除し、バックグラウンド処理のオーバーヘッドを削る。
3. Resolutionの遅延: ジオメトリの解決(Resolved状態への遷移)を、必要不可欠な瞬間まで絶対に実行しない。

3. 【Production Ready】高速・堅牢な図面情報抽出エンジン

以下に、実務で使用可能なレベルまで昇華させた、軽量モード制御による図面プロパティ抽出のテンプレートコードを示す。このコードは、単に「動く」だけでなく、エラーハンドリングとメモリ管理を徹底している。

'**
' Module: modFastDrawingProcessor
' Description: 高速・軽量モード制御による図面プロパティ抽出エンジン
' Author: Chief Architect
'**

Option Explicit

' SolidWorks API Constants (Missing references fallback)
Private Const swDocDRAWING As Long = 3
Private Const swOpenDocOptions_Silent As Long = 1
Private Const swUserPreferenceIntegerValue_e_eDocumentOpenMode As Long = 110 ' Lightweight mode preference

''' <summary>
''' 図面を軽量モードで開き、特定のカスタムプロパティを高速に取得する
''' </summary>
''' <param name="filePath">対象図面ファイルのフルパス</param>
''' <param name="propName">取得したいプロパティ名</param>
''' <returns>プロパティの値。失敗した場合は空文字</returns>
Public Function GetDrawingPropertyFast(ByVal filePath As String, ByVal propName As String) As String
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swCustPropMgr As SldWorks.CustomPropertyManager
    Dim valOut As String
    Dim resOut As Long
    Dim errors As Long
    Dim warnings As Long
    
    Set swApp = Application.SldWorks
    If swApp Is Nothing Then Exit Function

    On Error GoTo ErrorHandler

    ' --- STEP 1: システム設定の最適化 (Lightweight Modeの強制) ---
    ' ドキュメントを開く前に、軽量モードで開く設定をAPI経由でセットする
    ' これにより、巨大なアセンブリ参照を持つ図面も高速に開ける
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e_eDocumentOpenMode, 1 ' 1 = Lightweight

    ' --- STEP 2: ドキュメントのサイレントオープン ---
    ' swOpenDocOptions_Silent を指定し、ユーザーへの通知を完全に遮断
    Set swModel = swApp.OpenDoc6(filePath, swDocDRAWING, swOpenDocOptions_Silent, "", errors, warnings)

    If swModel Is Nothing Then
        Debug.Print "Error: Failed to open file. Error code: " & errors
        GoTo CleanUp
    End If

    ' --- STEP 3: 軽量状態の確認 (デバッグ・検証用) ---
    ' 意図した通り軽量モードで開けているか確認。プロフェッショナルならここを怠らない。
    ' ※ すでにResolvedされている場合は、ここでの処理は無視される
    If swModel.IsLightweight = False Then
        ' 必要に応じてここで警告を出すか、あるいはそのまま処理を続行する設計判断が必要
        Debug.Print "Warning: Document opened in Resolved mode. Performance might degrade."
    End If

    ' --- STEP 4: メタデータの抽出 (ジオメトリには触れない) ---
    ' 図面のカスタムプロパティを取得
    Set swCustPropMgr = swModel.Extension.CustomPropertyManager("")
    swCustPropMgr.Get4 propName, False, valOut, resOut

    GetDrawingPropertyFast = valOut

CleanUp:
    ' --- STEP 5: 徹底したリソース解放 ---
    ' 巨大なファイルの場合、Closeを確実に行わないとメモリリークの温床となる
    If Not swModel Is Nothing Then
        swApp.CloseDoc swModel.GetTitle
    End If
    
    ' オブジェクトの参照を解除(VBAのガベージコレクションを助ける)
    Set swDraw = Nothing
    Set swCustPropMgr = Nothing
    Set swModel = Nothing
    Exit Function

ErrorHandler:
    Debug.Print "Critical Error in GetDrawingPropertyFast: " & Err.Description
    Resume CleanUp
End Function

コードの設計思想:なぜこう書くのか

1. `SetUserPreferenceIntegerValue` の活用:
多くの開発者は、ファイルを開いた後に「軽量化」しようとします。しかし、それでは遅すぎる。「開く前に、開くルールを決める」。これがアーキテクトの思考です。
2. `swModel.Extension.CustomPropertyManager`:
`swModel.GetCustomInfoString` などの古いメソッドではなく、`Extension` オブジェクトを経由する `CustomPropertyManager` を使用してください。これは、よりモダンで、かつ複雑なプロパティ(結合されたプロパティなど)に対しても堅牢な挙動を示します。
3. `CleanUp` セクションの分離:
エラーが発生しても、必ず `CloseDoc` と `Set Nothing` を通るように設計しています。大量のファイルをループ処理する場合、この「後始末」を怠ると、SolidWorksのプロセスがメモリを食いつぶし、最終的にOSごと不安定になります。

4. 運用上の致命的な落とし穴:メモリリークとプロセスの残存

この手法を実装する際に、必ず留意すべき点が2つある。

① 「部分的な解決」の罠

図面内の「一部のビュー」だけがResolved(解決済み)状態になり、他のビューがLightweightという「中途半端な状態」が発生することがある。これは、マクロ内で意図せず `swModel.EditRebuild3` やビューの操作コマンドを呼び出した時に発生する。
「メタデータ抽出フェーズ」では、絶対にRebuildを呼び出さないこと。

② データベース連携時のトランザクション

もしこのVBAを、SQL ServerやExcelデータベースと連携させて「図面情報の自動一括更新」を行う場合、図面のオープン・クローズの速度と、DBのトランザクション・ロックの整合性に注意せよ。
図面を1枚開くごとにDBへ書き込みに行くのではなく、「メモリ上に情報を集約(バッファリング)し、最後に一括でDBへCommitする」設計にすることで、全体の処理効率はさらに数倍跳ね上がる。

結論

SolidWorks VBAにおける真のプロフェッショナルとは、APIの関数を知っている者ではない。「SolidWorksが背後でどのようにリソースを消費しているか」を理解し、それをコントロール下に置ける者を指す。

Lightweightモードを戦略的に制御することで、あなたのツールは「重くて使い物にならないスクリプト」から、「大規模プロジェクトの基盤となるインフラストラクチャ」へと進化する。

さあ、コードを書き直せ。待機時間に費やす時間は、もう終わりにしよう。

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