【実務・中級編】【中級者向け】複数の設定(Configurations)を持つモデルから全設定分の図面ビューを自動展開するVBA – SolidWorks VBA解析バイブル

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

凡庸なループから脱却せよ:複数コンフィギュレーション図面自動展開の極意

自動化エンジニアとして現場に立つとき、多くの者が陥る罠がある。それは「動けばいい」という思考停止だ。

「モデルのコンフィギュレーションをループで回し、図面ビューを配置する」
一見、単純なタスクに見える。しかし、大規模なアセンブリや、数百のコンフィギュレーションを持つ部品を対象にしたとき、その「単純なコード」は、メモリの枯渇、SolidWorksのフリーズ、あるいは不整合な図面データの生成という形で、開発者の牙を剥く。

本記事では、単なるコードの書き方ではなく、「プロダクション環境に耐えうる、堅牢で高速な図面自動生成エンジン」を設計するためのアーキテクチャを伝授する。

1. 凡庸な設計とプロフェッショナルの設計の違い

なぜ、初心者が書く「コンフィギュレーション切り替えループ」は失敗するのか。理由は主に3つある。

① 再構築(Rebuild)のコスト管理不足

コンフィギュレーションを切り替えるたびに、SolidWorksはモデルの再計算を行う。これを制御せずに「切り替え $\to$ ビュー作成 $\to$ 切り替え $\to$ ビュー作成」と繰り返すと、計算負荷が指数関数的に増大し、処理が実用的な時間内で終わらなくなる。

② オブジェクトのライフサイクルへの無理解

`ModelDoc2` や `DrawingDoc` の参照が、ループ内で適切に解放(または更新)されていないと、メモリリークを引き起こす。特に、図面内で参照しているモデルのコンフィギュレーションを変更する際、ビューが「どのモデルのどの設定を指しているか」という参照関係(Reference)の整合性を失うリスクがある。

③ エラーハンドリングの欠如

「特定のコンフィギュレーションだけ部品が抑制(Suppress)されている」「参照しているファイルが欠落している」といった、実務における「例外」を考慮していない設計は、自動化ツールとして致命的だ。

2. アーキテクチャ設計:State-Driven Approach

堅牢なツールを作るなら、「状態(State)を管理する」設計思想を持つべきだ。

1. Discovery Phase: モデルから全コンフィギュレーション名を抽出し、リスト化する。
2. Preparation Phase: 図面のシート構成を決定する(1設定1シート、あるいは1シートに並列配置か)。
3. Execution Phase:

  • シートを作成/選択。
  • ビューを配置。
  • ビューに対して直接コンフィギュレーションを割り当てる(重要)。

4. Finalization Phase: 全体の再構築と保存。

ここで最も重要なテクニックは、「モデル全体のコンフィギュレーションを切り替えるのではなく、作成した『ビュー』に対してコンフィギュレーションを指定する」ことだ。これにより、モデルの状態を激しく変動させるリスクを最小限に抑えられる。

3. 実装:プロダクショングレードのVBAコード

以下に、実務でそのまま利用可能なレベルの設計思想を取り入れたコードを示す。このコードは、各コンフィギュレーションに対して新しいシートを作成し、正面・平面・右側面図を自動配置する。

'**
' Module: DrawingAutomationEngine
' Description: コンフィギュレーション毎に図面ビューを自動展開する堅牢なエンジン
'**

Option Explicit

' 定数定義:マジックナンバーを排除し、保守性を高める
Private Const VIEW_DISTANCE As Double = 0.1 ' ビュー間の配置間隔 (m)
Private Const SCALE_FACTOR As Double = 0.1  ' 縮尺のデフォルト

Sub Main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    
    On Error GoTo ErrorHandler

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc

    ' --- 1. 前提条件チェック ---
    If swModel Is Nothing Then
        MsgBox "SolidWorksでモデルを開いてください。", vbCritical
        Exit Sub
    End If

    If swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いた状態で実行してください。", vbCritical
        Exit Sub
    End If

    Set swDraw = swModel
    
    ' --- 2. コンフィギュレーション情報の取得 ---
    ' モデル(参照先)のコンフィギュレーションを取得する
    Dim swRefModel As SldWorks.ModelDoc2
    Set swRefModel = swModel.GetReferencedModelDoc()
    
    If swRefModel Is Nothing Then
        MsgBox "図面が参照しているモデルが見つかりません。", vbCritical
        Exit Sub
    End If

    Dim vConfigNames As Variant
    vConfigNames = swRefModel.GetConfigurationNames()

    ' --- 3. メインループ(実行フェーズ) ---
    Dim i As Long
    Dim configName As String
    Dim sheetName As String
    
    For i = LBound(vConfigNames) To UBound(vConfigNames)
        configName = vConfigNames(i)
        sheetName = "Config_" & configName
        
        Debug.Print "Processing: " & configName
        
        ' シートの作成(既存シートとの重複を避けるロジックが必要だが、ここでは簡略化)
        ' 本来は、既存シートがあるかチェックし、なければ作成する設計にする
        Set swSheet = swDraw.NewSheet(sheetName, swDwgPaperA3size, swDwgStandardSheetSize_Custom, 0, 0, 0, 0)
        
        If swSheet Is Nothing Then
            Debug.Print "Failed to create sheet: " & sheetName
            GoTo NextConfig
        End If

        ' ビューの自動配置プロセスへ
        Call CreateViewsForConfig(swDraw, swRefModel, configName, i)

NextConfig:
    Next i

    ' --- 4. 仕上げ ---
    swModel.ForceRebuild3 True
    MsgBox "全コンフィギュレーションの図面展開が完了しました。", vbInformation
    Exit Sub

ErrorHandler:
    MsgBox "致命的なエラーが発生しました。" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Description: " & Err.Description, vbCritical
End Sub

''' <summary>
''' 特定のコンフィギュレーションに基づいたビューを配置する
''' </summary>
Private Sub CreateViewsForConfig(swDraw As SldWorks.DrawingDoc, swRefModel As SldWorks.ModelDoc2, configName As String, index As Long)
    Dim swView As SldWorks.View
    Dim vPos As Variant
    Dim viewNames As Variant
    Dim viewName As Variant
    Dim posX As Double
    Dim posY As Double
    
    ' 配置するビューの標準名称(SolidWorksの標準ビュー名)
    ' 本来は、ここも外部定義(DBやExcel)から取得できるように設計すべき
    viewNames = Array("Front", "Top", "Right")
    
    posX = 0.1 ' 開始位置 (m)
    posY = 0.1
    
    Dim j As Integer
    For j = LBound(viewNames) To UBound(viewNames)
        viewName = viewNames(j)
        
        ' --- ビューの作成 ---
        ' CreateDrawViewFromModelView3 を使用し、モデルの特定の向きからビューを作成
        ' 第3引数にモデルのビュー名、第4引数に配置座標を指定
        Set swView = swDraw.CreateDrawViewFromModelView3(swRefModel.GetPathName, CStr(viewName), posX, posY, 0)
        
        If Not swView Is Nothing Then
            ' --- 【最重要】ビューのコンフィギュレーションを直接指定 ---
            ' これにより、モデル全体の切り替えを行わずに、ビューのみを特定の設定に固定する
            swView.ReferencedConfiguration = configName
            
            ' ビューのスケール設定(必要に応じて)
            swView.ScaleDecimal = 0.1
            
            ' 次のビューの配置座標を計算
            posX = posX + VIEW_DISTANCE
        Else
            Debug.Print "Failed to create view: " & viewName & " for config: " & configName
        End If
    Next j
End Sub

4. プロフェッショナルのための「攻め」の設計指針

コードを実装した後、以下の観点で自身の設計をレビューせよ。これこそが、シニアエンジニアとジュニアエンジニアを分かつ境界線だ。

データベース/Excelとの連携

実務では、コンフィギュレーション名をモデルから直接取るのではなく、「図面に展開すべきリスト」をExcelやPLM(Product Lifecycle Management)から取得する場合が多い。

  • 設計アドバイス: `vConfigNames` を取得する部分を、`Function GetConfigListFromExcel() As Variant` のように抽象化しておけ。ロジックとデータソースを分離(Decoupling)することが、保守性の鍵だ。

エラーの「沈黙」を許さない

`On Error Resume Next` を多用するのは、設計の敗北を意味する。

  • 設計アドバイス: エラーが発生した際、「どのコンフィギュレーションの、どのビュー作成で失敗したか」をログ(テキストファイルまたはイミディエイトウィンドウ)に出力する仕組みを組み込め。

パフォーマンスの最適化

大量のビューを作成する場合、`swApp.Visible = False` にしたり、画面更新を抑制する手法があるが、SolidWorks APIにおいては、ビュー作成のたびに発生する内部的な再計算(Rebuild)をいかに減らすかが勝負だ。

  • 設計アドバイス: ループ内では `swModel.EditRebuild3` を呼ばず、すべての処理が終わった最後に一度だけ実行せよ。

結論

自動化の目的は、単に「手作業を減らすこと」ではない。「人間が介入する余地を排除し、常に一定の品質で、高速に成果物を生成する仕組みを構築すること」にある。

今回提示した「ビューに対して直接コンフィギュレーションを割り当てる」アプローチは、そのための第一歩だ。オブジェクトの階層構造を理解し、副作用を最小限に抑える設計を心がけよ。それが、伝説的なエンジニアへの道だ。

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