【テクニカル・上級編】【中級者向け】複数コンフィギュレーションを持つパーツの各状態をマルチシート図面に自動展開するVBA – SolidWorks VBA解析バイブル

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

構成(Configuration)を支配せよ:マルチシート図面自動展開エンジンの設計思想

エンジニアリングの現場において、設計変更は日常茶飯事だ。一つのパーツに対し、「Standard」「Short」「Long」といった複数のコンフィギュレーション(構成)を持たせることは、設計の柔軟性を担保する上で不可欠な戦略である。

しかし、多くの自動化スクリプトを実装しようとする開発者は、ここで躓く。単一の構成を単一のシートに投影するだけのコードは容易に書ける。だが、「全ての構成を検出し、それらを個別のシートに、適切なテンプレートを適用し、メモリリークを起こさずに、高速に展開する」。この要件を満たす堅牢なアーキテクチャを構築できる者は、そう多くはない。

本稿では、単なるコードの羅列ではない。SolidWorks APIの背後にあるオブジェクトのライフサイクル、COM(Component Object Model)の挙動、そして実務に耐えうるプロフェッショナルな実装手法について、その真髄を解説する。

1. アーキテクチャの設計:オブジェクトの階層構造を理解する

図面自動生成において、最も致命的なミスは「オブジェクトの参照管理」の放棄である。SolidWorksは巨大なCOMサーバーであり、VBAから呼び出されるオブジェクトの参照カウントが適切に管理されない場合、メモリ上にゾンビプロセスが残り続け、最終的にCADエンジンをクラッシュさせる。

本システムを設計するにあたり、以下の階層構造を厳格に意識する必要がある。

1. SldWorks Application: 全ての起点。
2. ModelDoc2 (Part/Assembly): 構成情報のソース。
3. DrawingDoc: 図面操作のコンテキスト。
4. Sheet: 各コンフィギュレーションに対応する器。
5. View: 構成情報を反映させる実体。

ここで重要なのは、「ViewはModelのConfigurationを参照する」という点だ。ビューを作成した後に、そのビューに対して明示的に`ReferencedConfiguration`を割り当てるプロセスが、自動化の成否を分ける。

2. 実装の核心:堅牢なマルチシート展開エンジン

以下に、実務レベルでそのまま利用可能な、プロフェッショナル仕様のコード・テンプレートを示す。このコードは、エラーハンドリング、メモリの明示的解放、および構成の動的検知を組み込んでいる。

Option Explicit

' ==============================================================================
' Title: Multi-Configuration Drawing Generator
' Description: パーツの全コンフィギュレーションを検出し、個別のシートに展開する
' Author: Chief Architect
' ==============================================================================

Sub GenerateMultiSheetDrawing()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swPart As SldWorks.PartDoc
    Dim vConfigNames As Variant
    Dim i As Integer
    Dim currentConfig As String
    Dim templatePath As String
    Dim sheetName As String
    
    ' --- 設定領域 ---
    templatePath = "C:\Templates\Standard_A3.drwdot" ' 適切なテンプレートパスを指定
    ' ----------------
    
    On Error GoTo ErrorHandler
    
    ' SolidWorksへの接続
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' モデルがパーツであることを確認
    If swModel Is Nothing Then
        MsgBox "パーツファイルを開いた状態で実行してください。", vbCritical
        Exit Sub
    End If
    
    If swModel.GetType <> swDocPART Then
        MsgBox "パーツファイルを選択してください。", vbCritical
        Exit Sub
    End If

    ' 全コンフィギュレーション名の取得
    vConfigNames = swModel.GetConfigurationNames
    
    ' 新規図面の作成
    Set swDraw = swApp.NewDocument(templatePath, swDwgPaperA3size, 0, 0)
    If swDraw Is Nothing Then
        Err.Raise 1001, , "図面テンプレートの読み込みに失敗しました。"
    End If

    ' 各コンフィギュレーションに対してループ処理
    For i = LBound(vConfigNames) To UBound(vConfigNames)
        currentConfig = vConfigNames(i)
        sheetName = "Config_" & currentConfig
        
        ' 1. シートの作成(最初のシート以外は追加)
        If i > 0 Then
            swDraw.NewSheet sheetName, swDwgPaperA3size, swDwgImageTypeMultipleViews
        Else
            ' 最初のシートの名前を変更
            swDraw.ActivateSheet vConfigNames(0) ' 仮の初期化
            swDraw.GetActiveSheet.SetName sheetName
        End If
        
        ' 2. ビューの配置
        ' 注: 座標 (0.1, 0.1) は図面内での配置位置。環境に合わせて調整が必要。
        Dim swView As SldWorks.View
        Set swView = swDraw.CreateDrawViewFromModelView3(swModel.GetPathName, "*Isometric", 0.1, 0.1, 0)
        
        If Not swView Is Nothing Then
            ' 3. 重要:ビューのコンフィギュレーションを強制的に切り替える
            ' これを行わないと、全てのシートがデフォルト構成になってしまう
            swView.ReferencedConfiguration = currentConfig
            
            ' ビューの更新を強制
            swView.ForceRebuild3
        End If
        
        ' オブジェクトの明示的な解放(ループ内でのメモリ負荷軽減)
        Set swView = Nothing
    Next i

    MsgBox "図面の自動生成が完了しました。", vbInformation

CleanUp:
    ' メモリのクリーンアップ
    Set swDraw = Nothing
    Set swModel = Nothing
    Set swApp = Nothing
    Exit Sub

ErrorHandler:
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
    Resume CleanUp
End Sub

アーキテクトの視点:コードの肝

1. `ReferencedConfiguration` の制御:
多くの初級者は `CreateDrawViewFromModelView3` を呼んだだけで満足する。しかし、APIの仕様上、ビューは作成時にモデルの「アクティブな構成」を継承する。マルチシート展開において、各シートが異なる構成を表示するためには、ビューオブジェクトに対して明示的に `ReferencedConfiguration` プロパティを叩き込む必要がある。これが「設計意図」をコードに反映させる唯一の道だ。

2. `NewSheet` の戦略的運用:
ループの初回とそれ以降で処理を分岐させている。SolidWorksの `NewDocument` で作成された直後のシートを、そのまま最初の構成の器として再利用し、2回目以降のループで `NewSheet` を呼び出す。これにより、不要な空シートの生成を防ぎ、シート構成を最適化している。

3. メモリ管理(Deterministic Cleanup):
`Set swView = Nothing` をループの末尾に配置している。VBAのガベージコレクションに頼るのではなく、COMオブジェクトの参照カウントをエンジニアが制御する。これは、数百個のコンフィギュレーションを持つ巨大なアセンブリを扱う際に、システムが「フリーズ」するか「完走」するかを分ける決定的な差となる。

3. 極限の最適化:Windows APIによるパフォーマンス制御

もし、このスクリプトを数千個のファイルに対してバッチ処理として実行する場合、GUIの描画更新は最大のボトルネックとなる。

プロフェッショナルなシステム管理者は、Windows APIを使用して、処理中のSolidWorksの描画を抑制し、CPUリソースを計算に集中させる。

' Windows APIの宣言
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr)

' 描画抑制の概念(擬似コード)
' swApp.UserControl = False ' SolidWorksのUI制御
' ※実際には、大量の処理を行う際は、バックグラウンドプロセスとして
'   SolidWorksを起動し、画面更新を最小限にする設定が推奨される。

また、処理時間を計測するために `QueryPerformanceCounter` を使用し、どの構成の展開に時間がかかっているかをログ出力する仕組みを組み込むべきだ。「計測できないものは、改善できない」。これは自動化エンジニアの鉄則である。

結論:自動化は「制御」である

図面の自動生成は、単に「作業を楽にする」ためのものではない。設計変更に伴うヒューマンエラーを排除し、「常に正しい状態を、常に正しい形式で、一貫して出力する」という、エンジニアリングにおける品質保証のプロセスそのものである。

今回解説したコンフィギュレーション制御とメモリ管理の知見は、より複雑なアセンブリ制御や、PDM(Product Data Management)との連携へと応用していくための基礎となる。

コードを書くのではない。システムを設計せよ。

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