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

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

「手作業」を卒業せよ。複数コンフィギュレーションを自動展開する「堅牢な」図面生成アーキテクチャ

エンジニアリングの現場において、設計者が最も忌むべきは「繰り返される単純作業」だ。

一つのパーツに「Standard」「Short」「Long」といった複数のコンフィギュレーション(設定)が存在する場合、それらすべてに対して図面シートを作成し、ビューを配置し、尺度を調整する……。もし君がこれをマウス操作で行っているなら、君はエンジニアではなく、単なる「CADオペレーター」に成り下がっている。

本稿では、SolidWorks VBAを用いて、パーツ内の全コンフィギュレーションを検知し、それぞれを別々のシートへ自動展開するプロダクションレベル(実戦投入可能)な自動化ロジックを伝授する。

単なる「動くコード」ではない。エラーに強く、保守性が高く、そして何より「速い」設計思想を叩き込む。

1. 設計思想:なぜ君の自動化ツールは「使い物にならない」のか

多くの初心者が書くVBAコードには、共通の致命的な欠陥がある。それは「状態(State)への依存」だ。

`Select` メソッドや `Activate` メソッドを多用し、「今、画面で見えているもの」を操作対象にする設計は、実行時に予期せぬエラーを引き起こす。図面シートを切り替える際、あるいはビューを配置する際、APIは常に「オブジェクトの完全な参照(Explicit Reference)」を求めている。

我々が目指すべきアーキテクチャは以下の3層構造だ。

1. Discovery層: パーツファイルからコンフィギュレーション名を正確に抽出する。
2. Orchestration層: シートの生成、テンプレートの適用、シート名の管理を行う。
3. Execution層: 特定のコンフィギュレーションを指定して、ビューを幾何学的に配置する。

この分離ができていなければ、コードはスパゲッティと化し、一つの仕様変更で全てが崩壊する。

2. 実装:マルチシート図面自動生成エンジン

以下に、私が設計のベースとして推奨するコードを示す。このコードは、単にビューを置くだけではなく、オブジェクトのライフサイクルを意識した堅牢な構造になっている。

Option Explicit

' ==============================================================================
' Module: DrawingAutomationEngine
' Description: パーツの全コンフィギュレーションをスキャンし、
'              各設定を個別のシートに自動展開する。
' ==============================================================================

Sub Main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swPart As SldWorks.PartDoc
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' --- 1. 入力バリデーション ---
    ' アクティブなドキュメントが図面でない場合は終了
    If swModel Is Nothing Then Exit Sub
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いた状態で実行してください。", vbCritical
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    ' 図面に参照されているモデル(パーツ)を取得
    ' 注: 複数のモデルが参照されている複雑な図面では、設計判断が必要
    Dim swRefModel As SldWorks.ModelDoc2
    Set swRefModel = swDraw.GetReferenceModel(1) ' 最初のビューの参照モデルを取得
    
    If swRefModel Is Nothing Then
        MsgBox "図面に参照されているモデルが見つかりません。", vbExclamation
        Exit Sub
    End If
    
    ' --- 2. コンフィギュレーションの解析 ---
    Dim configNames As Variant
    configNames = swRefModel.GetConfigurationNames()
    
    If IsEmpty(configNames) Then
        MsgBox "コンフィギュレーションが見つかりません。", vbExclamation
        Exit Sub
    End If
    
    ' --- 3. メイン・オーケストレーション ---
    Dim i As Integer
    Dim currentConfig As String
    Dim sheetName As String
    Dim templateName As String
    
    ' 現在のシートのテンプレートを取得(既存のフォーマットを継承するため)
    ' 実際の実務では、特定のテンプレートパスを指定するのがベストプラクティス
    templateName = swDraw.GetCurrentSheetTemplate
    
    On Error GoTo ErrorHandler
    
    ' 画面更新を停止してパフォーマンスを向上させる
    swApp.UserControl = False
    
    For i = LBound(configNames) To UBound(configNames)
        currentConfig = configNames(i)
        sheetName = "Config_" & currentConfig ' シート名は一意にする
        
        Debug.Print "Processing Configuration: " & currentConfig
        
        ' 新しいシートを作成
        ' 引数: シート名, テンプレート名, 向き, 幅, 高さ
        ' ここでは既存のフォーマットを再利用するため、テンプレートを指定
        swDraw.NewSheet sheetName, templateName, swDwgPaperA3size, 420, 297
        
        ' --- 4. ビューの配置 (Execution) ---
        ' 特定のコンフィギュレーションを指定してビューを配置
        ' CreateDrawViewFromModelView3(モデルパス, ビュー名, X, Y, Z)
        ' ※ 座標 (X, Y) は図面上の位置。単位はメートル。
        Dim status As Boolean
        status = swDraw.CreateDrawViewFromModelView3(swRefModel.GetPathName, _
                                                   "Front", 0.1, 0.15, 0)
        
        If status = False Then
            Debug.Print "Failed to create view for: " & currentConfig
        Else
            ' 配置したビューのコンフィギュレーションを強制的に設定
            Dim swView As SldWorks.View
            Set swView = swDraw.GetFirstView ' 図面シート自体が最初のViewなので、その次が配置したビュー
            Set swView = swView.GetNextView
            
            If Not swView Is Nothing Then
                swView.ReferencedConfiguration = currentConfig
                ' 尺度の自動調整(必要に応じて)
                swView.ScaleDecimal = 1.0 
            End If
        End If
    Next i
    
    MsgBox "図面の自動展開が完了しました。", vbInformation

CleanUp:
    swApp.UserControl = True
    Exit Sub

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

3. プロフェッショナルのための「極限の知見」

コードをコピペして動いただけで満足してはいけない。実務でこのツールを運用する際、以下の3点に留意せよ。

① オブジェクトの「階層」を意識せよ

`swDraw.GetFirstView` を呼び出したとき、返ってくるのは「図面シートそのもの」だ。初心者はここで混乱し、「ビューが配置されない!」と嘆く。配置したビューにアクセスするには、必ず `GetNextView` を通じて、シートという親オブジェクトの「次」にあるビューを取得する必要がある。この階層構造の理解こそが、API操作における「重み」を知ることだ。

② パフォーマンスのボトルネック:`UserControl` と `Update`

大量のコンフィギュレーション(例えば50個以上)を処理する場合、SolidWorksが描画更新(Redraw)を繰り返すことで、処理速度が指数関数的に低下する。
`swApp.UserControl = False` を使用して、ユーザーの操作を一時的にロックし、計算資源をAPIに集中させることが、高速化の鉄則である。

③ テンプレート管理の戦略

上記のコードでは `swDraw.GetCurrentSheetTemplate` を使用して既存のフォーマットを流用している。これは賢明な判断だ。しかし、大規模なプロジェクトでは、「標準図面テンプレートの絶対パス」を外部の管理用ExcelやINIファイルから読み込む設計にすべきだ。コード内にパスをハードコードすることは、保守性の観点から「罪」である。

結びに代えて

自動化とは、単に「楽をするための手段」ではない。「人間が判断すべき領域(設計・検証)」と「機械がこなすべき領域(反復・配置)」を明確に分離する、エンジニアリングの儀式である。

今回紹介したロジックをベースに、寸法の自動記入や、BOM(部品表)の制御、さらにはPDF出力まで繋げてみたまえ。その時、君の価値は「CADを使える人間」から「エンジニアリング・プロセスを設計できるアーキテクト」へと昇華するはずだ。

Happy Coding. Keep it Robust.

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