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

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

【上級プロ向け】図面ドキュメントのオープン・クローズ速度を極限まで高める「軽量モード」制御VBA

こんにちは。設計自動化の荒波へようこそ。

あなたが今、もし「マクロの記録」ボタンを連打して、生成されたコードを眺めながら「……で、これ、どうやって効率化するんだっけ?」と頭を抱えているとしたら、素晴らしい。あなたは今、「単なる操作の記録係」から「真の自動化エンジニア」へと脱皮する境界線に立っています。

今日扱うテーマは、プロの現場で必ず直面する「巨大すぎる図面ファイル」の壁を突破するためのテクニックです。
数千点のコンポーネントを含むプラント設備や、複雑なメカニズムを持つ大型アセンブリの図面。これらを通常のモードで開き、情報を抽出したり、シートを書き換えたりしようとすると、PCは悲鳴を上げ、SolidWorksはフリーズし、貴重なエンジニアの時間は失われます。

今日は、「軽量モード(Lightweight)」をVBAから自在に操り、メモリ消費を抑えながら爆速で図面を処理する極限の知見を伝授しましょう。ここをクリアすれば、あなたの作るツールは「動けばいいツール」から「現場で重宝されるプロ仕様のツール」へと昇華します。

1. なぜ、あなたのマクロは「重い」のか?

まず、本質的な理由を理解しましょう。図面(Drawing)ファイルが重いのは、図面そのものにデータがあるからではありません。図面の中に配置された「投影図(View)」が、背後にある巨大なアセンブリの幾何形状(ジオメトリ)を読み込もうとするからです。

通常、図面を開くとSolidWorksは「すべての部品を完全に解決(Resolved)した状態」で表示しようとします。

  • Resolved(解決済み): すべての面、エッジ、穴、曲面を計算。メモリを大量消費。
  • Lightweight(軽量): 部品の「外形情報(メタデータ)」だけを読み込む。計算をスキップするため、爆速。

プロのエンジニアは、「情報を抽出するだけなら、すべての面を見せる必要はない」ということを知っています。

2. 極限の高速化戦略:3つの柱

図面処理を高速化するための戦略は、以下の3つのレイヤーで行います。

1. ファイルオープン時の制御: 最初から「重い状態」で読み込まない。
2. ビュー(View)の表示モード制御: 図面内の各ビューに対し、「軽量モード」を強制する。
3. メモリの解放: 処理が終わったら、確実にドキュメントを破棄する。

これらをコードでどう実現するか、見ていきましょう。

3. 実装コード:図面高速オープン&軽量ビュー制御

以下のコードは、指定した図面ファイルを「軽量モード」を意識しながら開き、図面内のすべてのビューを軽量状態に切り替えるプロフェッショナルな雛形です。

'**
' プログラム名: HighSpeedDrawingProcessor
' 概要: 図面を軽量モードで開き、ビューの表示を抑制して高速に処理を行う
' 著作者: Legend Architect (Senior Automation Engineer)
'**

Option Explicit

Sub Main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    Dim filePath As String
    Dim errors As Long
    Dim warnings As Long

    ' SolidWorksへの接続
    Set swApp = Application.SldWorks
    
    ' --- 【設定】処理したい図面ファイルのパスを指定 ---
    filePath = "C:\YourPath\LargeAssemblyDrawing.SLDDRW"

    ' 1. ドキュメントのオープン
    ' OpenDoc6を使用し、メモリ負荷を考慮して開く
    ' ※ここでは通常のオープンを行いますが、後続のビュー制御で軽量化します
    Set swModel = swApp.OpenDoc6(filePath, swDocDRAWING, swOpenDocOptions_Silent, "", errors, warnings)

    If swModel Is Nothing Then
        MsgBox "ファイルを開けませんでした。パスを確認してください。" & vbCrLf & "Error Code: " & errors, vbCritical
        Exit Sub
    End If

    ' 図面オブジェクトへキャスト
    Set swDraw = swModel

    Debug.Print "--- 高速化処理開始 ---"

    ' 2. すべてのシートをループし、すべてのビューを「軽量モード」に強制する
    ' これが「マクロの記録」では決して出てこない、プロの制御です
    Dim vSheets As Variant
    vSheets = swDraw.GetSheetNames
    
    Dim i As Integer
    For i = 0 To UBound(vSheets)
        ' シートの切り替え
        swDraw.ActivateSheet vSheets(i)
        Set swSheet = swDraw.GetCurrentSheet
        
        ' 現在のシートにある最初のビュー(シート自体もViewとして扱われる)から順に取得
        ' GetFirstViewは「シート」を返し、その次のGetNextViewが「実際の投影図」を返す
        Set swView = swDraw.GetFirstView
        
        Do While Not swView Is Nothing
            ' 投影図(View)の場合のみ、表示モードを軽量化
            ' swViewDisplayMode_e.swViewDisplayMode_Lightweight を指定
            ' これにより、アセンブリの全ジオメトリ計算をスキップします
            If swView.Type <> swViewType_e.swDrawingSheet Then
                swView.SetDisplayMode swViewDisplayMode_e.swViewDisplayMode_Lightweight
                Debug.Print "View Optimized: " & swView.Name
            End If
            
            ' 次のビューへ
            Set swView = swView.GetNextView
        Loop
    Next i

    ' 3. ここで「情報の抽出」などのメイン処理を行う
    ' 例: 図面タイトルや、特定のプロパティの読み取り
    MsgBox "軽量モードでの最適化が完了しました。ここから高速に処理を実行できます。", vbInformation

    ' 4. 【重要】メモリ解放とクローズ
    ' 処理が終わったら、必ずCloseDocを行い、メモリを返却する
    ' 巨大なファイルを扱う場合、これを行わないとSolidWorksがクラッシュします
    swApp.CloseDoc swModel.GetTitle
    
    Debug.Print "--- 処理完了・メモリ解放済み ---"
End Sub

4. コードの解説と「プロの視点」

なぜ `swView.SetDisplayMode` なのか?

マクロの記録では、ビューの「見た目」を変える操作は記録されません。しかし、APIを使えば「このビューは軽量表示でいいよ」と直接命令できます。これにより、SolidWorksは重い計算(Rebuild)を回避し、図面の描画に必要な最低限の情報だけで画面を構成します。これが速度の正体です。

`GetFirstView` と `GetNextView` の罠

ここ、初心者が一番ハマるポイントです。
`swDraw.GetFirstView` が返すのは、実は「図面シートそのもの」です。そのため、ループの最初で `swView.Type` をチェックして、「シート以外の、本当の投影図だけを軽量化する」という条件分岐を入れています。これを忘れると、予期せぬエラーや動作不良の原因になります。

メモリ管理の鉄則

`swApp.CloseDoc` を忘れないでください。
大量のファイルをループ処理する自動化ツールを作る場合、`Set swModel = Nothing` とするだけでは不十分です。SolidWorksのメモリ空間(プロセス内)にデータが残り続け、最終的に「メモリ不足」で強制終了します。必ず明示的にドキュメントを閉じる。これがプロの作法です。

5. 陥りやすいエラーと回避策

現象 原因 プロの対策
`SetDisplayMode` が効かない 部品が既に「解決済み」で、かつ編集モードになっている 読み取り専用で開くか、処理の最初に `swModel.ForceRebuild3 False` を検討する
途中でSolidWorksが落ちる メモリリーク(Close忘れ) `CloseDoc` を確実に実行し、ループのたびにメモリが解放されているかタスクマネージャーで監視する
図面の寸法が変わってしまう 軽量モードでの表示変更が、稀に再構築を誘発する 幾何形状の変更(寸法書き換え)を行う場合は、軽量モードから「Resolved」に戻す工程を挟む

最後に:次のステップへ

お疲れ様でした。これであなたは、単に「操作を自動化する人」から、「システムの負荷までコントロールするエンジニア」への第一歩を踏み出しました。

「動くコード」を書くのは簡単です。しかし、「巨大なデータに耐えうる、堅牢で高速なコード」を書ける者は一握りしかいません。今回学んだ「軽量モードの制御」は、その一握りに入るための強力な武器になります。

次は、この軽量モードの状態で、「特定のプロパティだけを高速に抜き出す」あるいは「軽量モードのままPDF出力する」といった応用にも挑戦してみてください。

「コードの向こう側にある、コンピュータの挙動を感じろ」

それが、伝説のエンジニアへの道です。応援していますよ!

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