【入門編】【中級者向け】複数コンフィギュレーションを持つアセンブリの全状態をマルチシート図面に自動展開するVBA – SolidWorks VBA解析バイブル

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

コンフィギュレーションの壁を突破せよ:マルチシート図面自動生成の極意

こんにちは。設計業務の自動化に取り組む皆さん、日々の設計業務お疲れ様です。

「アセンブリに10個のコンフィギュレーションがある。それぞれの図面を、手作業で作っていたら日が暮れてしまう……」

そんな溜め息をついたことはありませんか? マクロの記録機能を使って「ビューを置く」操作を記録することはできますが、「コンフィギュレーションの数を検知して、その数だけシートを増やし、それぞれの構成を反映させる」という動的な処理は、記録機能だけでは絶対に到達できません。

今日は、マクロの記録から一歩踏み出し、SolidWorksのオブジェクトモデルを「支配」するための、中級者向けの実践的なテクニックを伝授します。これをマスターすれば、あなたの設計スピードは劇的に進化するはずですよ。

1. 核心:オブジェクトの「階層構造」を理解する

プログラミングが苦手だと感じる方の多くは、「何に対して命令を出しているのか」を見失いがちです。SolidWorks VBAを掌握する鍵は、オブジェクトの親子関係(階層)を脳内に描くことです。

今回のミッションを分解すると、以下の階層構造を辿ることになります。

1. SldWorks (アプリケーション):全ての司令塔
2. ModelDoc2 (アセンブリ):情報のソース(コンフィギュレーション情報の持ち主)
3. DrawingDoc (図面):作業の舞台
4. Sheet (シート):描画のキャンバス
5. View (図面ビュー):実際に表示される「窓」

「アセンブリからコンフィギュレーション名を取り出し、それを図面のシート名にコピーし、各ビューにそのコンフィギュレーションを紐付ける」という流れを、この階層に沿って記述していくことになります。

2. 実装:全コンフィギュレーション展開マクロ

それでは、実際に使えるコードを見ていきましょう。このコードは、現在開いているアセンブリを読み取り、新しい図面ファイルを作成して、全てのコンフィギュレーションに対してシートとビューを自動展開するものです。

Option Explicit

' ==============================================================================
' テーマ: 複数コンフィギュレーションの図面自動展開
' 概要: 開いているアセンブリの全構成を検知し、各構成ごとのシートとビューを作成する
' ==============================================================================

Sub Main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swAssy As SldWorks.AssemblyDoc
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    
    Dim configNames As Variant
    Dim i As Integer
    Dim assemblyPath As String
    Dim drawingTemplate As String
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' --- [Step 1: 入力チェック] ---
    ' アセンブリが開かれているか確認
    If swModel Is Nothing Then
        MsgBox "アセンブリを開いてから実行してください。", vbCritical
        Exit Sub
    End If
    
    If swModel.GetType <> swDocASSEMBLY Then
        MsgBox "アセンブリファイルを選択してください。", vbCritical
        Exit Sub
    End If
    
    Set swAssy = swModel
    assemblyPath = swModel.GetPathName
    
    ' --- [Step 2: コンフィギュレーション名の取得] ---
    ' アセンブリ内の全コンフィギュレーション名を配列として取得
    configNames = swAssy.GetConfigurationNames
    
    ' --- [Step 3: 図面の新規作成] ---
    ' ※ここでは標準の図面テンプレートパスを指定してください
    ' 環境に合わせて書き換えるか、ユーザーに選択させるのがプロの仕事です
    drawingTemplate = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplateDrawing)
    
    ' 新規図面を作成
    Set swDraw = swApp.NewDocument(drawingTemplate, swDwgPaperSizes_e.swDwgPaperA3size, 0, 0)
    If swDraw Is Nothing Then
        MsgBox "図面テンプレートの作成に失敗しました。", vbCritical
        Exit Sub
    End If
    
    ' --- [Step 4: ループ処理によるシート生成とビュー配置] ---
    ' 画面更新を停止してパフォーマンスを向上させる(擬似的な処理)
    ' SolidWorks APIには直接のScreenUpdatingがないため、再構築を最小限にする戦略を取ります
    
    For i = 0 To UBound(configNames)
        Dim currentConfig As String
        currentConfig = configNames(i)
        
        ' 1. 新しいシートを追加 (i=0のときは最初のシートがあるので、条件分岐が必要)
        If i = 0 Then
            ' 最初のシートの名前を変更し、モデルを紐付ける
            Set swSheet = swDraw.GetCurrentSheet
            swSheet.SetName currentConfig
        Else
            ' 2枚目以降は新規作成
            Set swSheet = swDraw.NewSheet(currentConfig, swDwgPaperSizes_e.swDwgPaperA3size, swDwgTemplateFormatOption_e.swDwgTemplateFormatOption_None)
        End If
        
        ' 2. シートにアセンブリモデルを紐付ける
        ' これにより、このシートのビューは特定のアセンブリを参照する準備ができる
        swDraw.SetupSheet5 swSheet.GetName, swDwgPaperSizes_e.swDwgPaperA3size, swDwgTemplateFormatOption_e.swDwgTemplateFormatOption_None, 0, 0
        
        ' 3. ビューの配置 (正面図)
        ' CreateDrawViewFromModelView3(モデルパス, ビュー名, X, Y, Z)
        Set swView = swDraw.CreateDrawViewFromModelView3(assemblyPath, "*Front", 0.1, 0.15, 0)
        
        If Not swView Is Nothing Then
            ' 【重要】ここがプロの技:ビューが参照するコンフィギュレーションを明示的に指定する
            swView.ReferencedConfiguration = currentConfig
        End If
        
        ' 4. ビューの配置 (平面図)
        Set swView = swDraw.CreateDrawViewFromModelView3(assemblyPath, "*Top", 0.1, 0.05, 0)
        If Not swView Is Nothing Then
            swView.ReferencedConfiguration = currentConfig
        End If
        
        ' 5. ビューの配置 (側面図)
        Set swView = swDraw.CreateDrawViewFromModelView3(assemblyPath, "*Right", 0.2, 0.15, 0)
        If Not swView Is Nothing Then
            swView.ReferencedConfiguration = currentConfig
        End If
        
        ' 各シートの処理が終わるごとに再構築してメモリと表示を安定させる
        swModel.ForceRebuild3 True
    Next i
    
    MsgBox "全てのコンフィギュレーションの図面展開が完了しました!", vbInformation
End Sub

3. ここがポイント!エンジニアの視点

コードをただ貼り付けるだけでは、あなたはまだ「記録マクロの延長」にいます。このコードの「なぜこう書いているのか」という意図を理解することこそが、真の習得への道です。

① `ReferencedConfiguration` の重要性

図面ビューを作成しただけでは、SolidWorksは「デフォルトのコンフィギュレーション」を表示しようとします。
`swView.ReferencedConfiguration = currentConfig`
この一行を記述することで初めて、「このビューは、このシート用の特定の構成を表示せよ」という命令が完結します。ここを忘れると、全シートが同じ見た目になってしまうという、初学者が最も陥りやすい罠にハマります。

② オブジェクトの型(Casting)

コード内で `Set swAssy = swModel` としていますが、`swModel` は `ModelDoc2` 型です。しかし、コンフィギュレーションを取得する `GetConfigurationNames` メソッドは `AssemblyDoc` 型にしか存在しません。
このように、「今扱っているオブジェクトが、どの機能(メソッド)を持っているか」を意識して型を使い分けるのが、堅牢なコードを書くコツです。

③ パフォーマンスへの配慮

ループの中で `swModel.ForceRebuild3 True` を呼び出しています。
大量のコンフィギュレーションがある場合、毎回再構築(リビルド)を行うと時間がかかります。しかし、リビルドを全くしないと、ビューの参照が正しく更新されないエラーが発生することがあります。
「効率」と「確実性」のバランスを見極める。これがシニアエンジニアの判断基準です。

4. 陥りやすいエラーと対策

実務で運用する際、以下のエラーに遭遇するかもしれません。

  • 「テンプレートが見つかりません」エラー
  • 対策:`drawingTemplate` に指定するパスが正しいか、あるいは `swApp.GetUserPreferenceStringValue` で取得できているかを確認してください。
  • 「図面ビューが空です」エラー
  • 原因:アセンブリのコンフィギュレーション自体にエラーがあり、モデルがロードできていない可能性があります。
  • 対策:コード内で `If Not swView Is Nothing Then` を使い、ビューが正常に生成されたときのみプロパティを変更するようにガードをかけましょう。

最後に

いかがでしたでしょうか?
単に「自動で図面を作る」だけでなく、「オブジェクトの階層を意識し、コンフィギュレーションという属性を制御する」。この視点を持つことができれば、あなたはもう「マクロの記録」という檻から脱出し、SolidWorks APIという広大な大地を自由に歩き始めることができます。

一歩ずつ、コードの裏側にある設計思想を理解していってください。応援していますよ!

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