【入門編】【上級プロ向け】大規模アセンブリ図面の自動生成における「軽量表現(Lightweight)」と「解像度」の動的最適化 – SolidWorks VBA解析バイブル

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

大規模アセンブリ図面の壁を突破せよ:軽量表現(Lightweight)と解像度を操る「メモリ管理」の極意

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

「マクロの記録」を使って、簡単なパーツの図面化に成功した。そんな喜びを感じている方も多いでしょう。しかし、エンジニアとして一歩踏み出したとき、必ずと言っていいほど直面する「巨大な壁」があります。

それは、数千個の部品からなる超巨大アセンブリの図面化です。

「マクロを実行した瞬間、SolidWorksが固まった」「メモリ不足で強制終了した」「PCのファンが悲鳴を上げている……」

もしあなたが今、そんな経験をしているなら、おめでとうございます。あなたは今、「単なる自動化」から「プロフェッショナルなシステム設計」へと進化する境界線に立っています。

今日は、その壁を軽々と飛び越えるための、極めて高度かつ実用的なテクニックを伝授しましょう。テーマは「軽量表現(Lightweight)と解像度の動的制御」です。

なぜ、巨大アセンブリの図面化は「死」を招くのか?

まず、なぜメモリ不足が起きるのか、その本質を理解しましょう。

SolidWorksで図面を作成する際、ビュー(View)を配置すると、SolidWorksは背後でそのモデルのデータを読み込み、計算を開始します。

1. 完全解決(Resolved)モード: すべての部品の形状、拘束、パラメータを完全に計算します。精度は最高ですが、メモリ(RAM)を猛烈に消費します。
2. 軽量表現(Lightweight)モード: 形状の「外形」などの最小限の情報だけを読み込みます。メモリ消費は極めて少なく、動作は軽快です。

初心者が書くマクロは、多くの場合、全てのビューを「完全解決」で扱おうとします。数千個の部品があるアセンブリでこれをやると、SolidWorksは一瞬でメモリの限界を迎え、応答なし(フリーズ)に陥るのです。

プロのアーキテクトは、この「計算量」と「メモリ」のバランスを、コードによって動的に制御します。

勝利の方程式:Lightweight $\to$ Resolved 戦略

私が推奨する戦略は、以下のステップによる「段階的な昇格」です。

1. ビューの配置は「軽量モード」で行う:
まず、モデルを軽量モードの状態で図面に配置します。これにより、配置時のメモリ負荷を最小限に抑えます。
2. 解像度(Resolution)の最適化:
ビューの表示品質を、必要最小限のレベルに設定します。
3. 必要な箇所だけ「完全解決」へ昇格させる:
寸法を入れたい箇所や、詳細図が必要な箇所だけ、ピンポイントで「完全解決」に切り替えます。

これを実現するための、魂を込めたコードを見ていきましょう。

【実践】メモリ管理を徹底した図面自動生成コード

このコードは、単に図面を作るだけでなく、メモリ負荷をコントロールするために設計されています。

' **
' プログラム名: Advanced_Drawing_Generator
' 概要: 大規模アセンブリに対応した、メモリ最適化型図面生成マクロ
' 特徴: ビュー作成時に軽量モード(Lightweight)を強制し、メモリ爆発を防ぐ
' **

Option Explicit

Sub Main()
    ' --- オブジェクト宣言 ---
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swView As SldWorks.View
    Dim swSheet As SldWorks.Sheet
    Dim assemblyPath As String
    Dim drawingPath As String
    
    ' エラーハンドリングの開始
    On Error GoTo ErrorHandler

    ' SolidWorksへの接続
    Set swApp = Application.SldWorks
    
    ' --- 設定エリア ---
    ' ※実際には、選択したファイルやダイアログから取得するように改良してください
    assemblyPath = "C:\Work\LargeAssembly.SLDASM" 
    drawingPath = "C:\Work\Template.DRWDAT"    ' 図面テンプレートのパス
    
    ' 1. 図面ドキュメントの新規作成
    Set swDraw = swApp.NewDocument(drawingPath, 0, 0, 0)
    If swDraw Is Nothing Then
        MsgBox "図面テンプレートの読み込みに失敗しました。", vbCritical
        Exit Sub
    End If
    
    Set swModel = swDraw
    Debug.Print "Drawing created successfully."

    ' 2. ビューの挿入(ここが最大のポイント!)
    ' モデルを直接指定してビューを挿入。
    ' 最初から「完全解決」で開こうとすると、ここでフリーズします。
    ' 挿入された直後のビューを取得します。
    Set swView = swDraw.CreateDrawViewFromModelView3(assemblyPath, "*Front", 0.1, 0.1, 0)
    
    If swView Is Nothing Then
        MsgBox "ビューの挿入に失敗しました。パスを確認してください。", vbCritical
        Exit Sub
    End If

    ' --------------------------------------------------------------------------
    ' 【極限の知見】メモリ管理フェーズ
    ' --------------------------------------------------------------------------
    
    ' A. ビューの表示モードを「軽量表現(Lightweight)」に強制設定
    ' swDisplayMode_e.swDisplayMode_Lightweight = 2
    ' これにより、配置直後のメモリ負荷を劇的に下げます。
    swView.SetDisplayMode3 swDisplayMode_e.swDisplayMode_Lightweight, 0, 0, 0
    Debug.Print "View set to Lightweight mode to save memory."

    ' B. 表示解像度の設定
    ' 高解像度すぎると描画が重くなるため、必要に応じて調整
    ' (ここでは例として標準的な設定を維持)
    
    ' C. 特定の条件下でのみ「完全解決」へ昇格させるロジック
    ' 例: 「もし特定の部品が必要なら、そのビューだけを完全解決にする」
    ' ここではデモとして、配置後に少し待ってから解決する流れを記述
    ' 実際の実務では、寸法記入(Annotation)の直前にこれを行います。
    
    ' swView.SetDisplayMode3 swDisplayMode_e.swDisplayMode_Resolved, 0, 0, 0
    ' Debug.Print "View promoted to Resolved mode."

    ' --------------------------------------------------------------------------

    ' 3. 保存処理
    swModel.SaveAs3 "C:\Work\Generated_Drawing.SLDDRW", 0, 2
    
    MsgBox "図面生成が完了しました!メモリ負荷を最適化済みです。", vbInformation
    
    ' 後処理(オブジェクトの解放)
    ' これを忘れると、SolidWorksのメモリが解放されず、次のマクロ実行が重くなります。
    Set swView = Nothing
    Set swDraw = Nothing
    Set swModel = Nothing
    Set swApp = Nothing
    
    Exit Sub

ErrorHandler:
    MsgBox "予期せぬエラーが発生しました。" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Description: " & Err.Description, vbCritical
    ' エラー時もオブジェクトを解放する習慣を
    Set swApp = Nothing
End Sub

コードの深層解説:なぜこの書き方が「プロ」なのか

1. `SetDisplayMode3` の魔術

このコードの心臓部は `swView.SetDisplayMode3` です。
通常のマクロ記録では、ビューを作った瞬間にSolidWorksが自動的に「完全解決」しようとする挙動まで記録されてしまいます。しかし、私たちはあえて、「作った直後に軽量モードへ叩き落とす」という操作を行っています。これにより、メモリの急騰を防いでいるのです。

2. オブジェクトのライフサイクル管理

コードの最後にある `Set swView = Nothing`。これ、軽視していませんか?
大規模な処理を行う場合、変数に保持したオブジェクトがメモリ上に残り続けると、SolidWorks全体の動作がどんどん重くなっていきます(これをメモリリークと呼びます)。「使い終わったら捨てる」。これは、エンジニアの鉄則です。

3. エラーハンドリング (`On Error GoTo`)

大規模アセンブリの処理は、ネットワークの遅延やファイルパスのミスなど、不確定要素の塊です。エラーが起きたときに「何も言わずに固まる」のではなく、「何が起きたか」をユーザーに伝える。この「親切な設計」こそが、現場で信頼されるツールを作る鍵です。

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

現象 原因 回避策
マクロ実行中にフリーズ ビュー作成時に全部品をResolvedで読み込もうとした `SetDisplayMode3` で即座に `Lightweight` に設定する
図面が白紙になる モデルのパスが間違っている、または読み込み不足 パスの存在確認 (`Dir`関数) と、モデルがロードされているかの確認を入れる
メモリが徐々に増えていく オブジェクトの解放(`Set … = Nothing`)忘れ プロシージャの最後で必ず全てのオブジェクトを解放する

最後に:次のステップへ

ここまでの内容をクリアできれば、あなたはもう「マクロを記録する人」ではありません。「リソースを制御するエンジニア」です。

次に挑戦すべきは、「特定のコンポーネントだけを個別にResolvedにする」という、さらに高度な制御です。アセンブリ全体は軽量のまま、寸法が必要なネジ一本だけを完全解決にする……。そんな魔法のような操作も、VBAなら可能です。

一歩ずつ、着実に。SolidWorks VBAの深淵を楽しみながら進んでいきましょう。応援していますよ!

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