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

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

マクロ記録を卒業する。コンフィギュレーションを自在に操る「図面自動生成」の極意

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

「マクロの記録」ボタンを押して、録画されたコードを眺めて、「なるほど、こうやって動いているのか」と理解した。そこまでは素晴らしい第一歩です。しかし、あなたが今直面しているのは、「記録したコードでは、単一の操作しか再現できない」という壁ではないでしょうか?

例えば、一つの部品に5つのコンフィギュレーション(設定)があるとき、それらすべてに対して図面を作成し、それぞれの設定を反映したビューを配置する……。これを手作業で、あるいは記録したマクロでやろうとすると、コードが膨大になり、メンテナンス不能な「スパゲッティコード」へと成り下がります。

今日は、そんな壁を軽々と飛び越えるための、「オブジェクトの階層構造を理解した、真のループ処理による図面制御」についてお話ししましょう。ここをクリアすれば、あなたのSolidWorks VBAの実力は、一気に「ツール作成者」のレベルへと昇華します。

1. 核心:SolidWorksの「視点」を理解する

自動化を成功させる鍵は、コードを書く前に「オブジェクトの親子関係」を頭の中に描けるかどうかです。

図面(Drawing)の操作において、初心者が最も陥りやすい罠は、「今、自分は何を操作しているのか?」を見失うことです。

図面ファイルにおける階層構造を整理しましょう:

1. SldWorks (アプリケーション本体)
2. DrawingDoc (図面ファイル全体)
3. Sheet (シート:A3やA4などの紙面)
4. View (ビュー:モデルを映し出す窓)
5. ModelDoc2 (ビューの向こう側にある、参照元の部品・アセンブリ)

ここで重要なのは、「ビューは、特定のコンフィギュレーションを映し出すための『窓』である」という概念です。図面ファイル自体にコンフィギュレーションがあるわけではありません。図面の中にある「ビュー」に対して、「君はどの設定を表示するのか?」と命令を与える必要があるのです。

2. 実践:全設定分を自動展開するアルゴリズム

では、具体的にどのようなロジックでプログラムを組むべきか。設計図を描いてみましょう。

自動化のフローチャート

1. モデルの取得: 現在開いている、あるいは参照している部品/アセンブリを取得する。
2. コンフィギュレーション名のリスト化: モデルに含まれる全設定の名前を配列(リスト)に格納する。
3. 図面の生成: 新しい図面ドキュメントを作成する。
4. ループ処理(ここが心臓部):

  • リストから設定名を1つ取り出す。
  • 新しいシートを作成(または既存シートを選択)する。
  • ビューを挿入する。
  • 挿入したビューに対して、取り出した設定名を割り当てる。

5. 終了処理: 画面更新を止めてパフォーマンスを上げ、保存する。

3. 魂のコード:Configuration-Driven Drawing Generator

それでは、実際に現場で使えるレベルのコードを提示します。
このコードは、「アクティブな部品/アセンブリ」を元に、全コンフィギュレーションを別々のシートに配置した図面を自動生成するものです。

Option Explicit

''
' @description: アクティブなモデルの全コンフィギュレーションを
'               新しい図面の各シートに自動展開する。
' @author: Legendary Architect
''
Sub GenerateDrawingsForAllConfigs()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swView As SldWorks.View
    
    Dim vConfigNames As Variant
    Dim configName As Variant
    Dim i As Integer
    
    ' 1. SolidWorksへの接続と現在のモデル取得
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' モデルが開かれていない、または図面が開かれている場合はエラー終了
    If swModel Is Nothing Then
        MsgBox "モデルを開いてから実行してください。", vbCritical
        Exit Sub
    End If
    
    If swModel.GetType = swDocDRAWING Then
        MsgBox "図面ファイルではなく、部品またはアセンブリを開いてください。", vbCritical
        Exit Sub
    End If
    
    ' 2. コンフィギュレーション名のリストを取得
    ' GetConfigurationNamesは、モデル内の全設定名をVariant配列で返します
    vConfigNames = swModel.GetConfigurationNames
    
    ' 3. 新しい図面を作成 (テンプレートのパスは環境に合わせて変更してください)
    ' ここでは標準的なA3図面テンプレートを指定する例
    Dim templatePath As String
    templatePath = swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplateDrawing)
    
    Set swDraw = swApp.NewDocument(templatePath, 0, 0, 0)
    If swDraw Is Nothing Then
        MsgBox "図面の作成に失敗しました。", vbCritical
        Exit Sub
    End If
    
    ' 高速化のためのTips: 画面更新を一時停止(大量処理時の必須テクニック)
    swApp.UserControl = False 
    
    On Error GoTo ErrorHandler
    
    ' 4. コンフィギュレーションごとのループ処理
    i = 0
    For Each configName In vConfigNames
        
        ' --- A. シートの管理 ---
        ' 最初のループ(i=0)は、NewDocumentで作られた最初のシートを使う
        ' 2回目以降は新しいシートを追加する
        If i > 0 Then
            swDraw.NewSheet CStr(configName), swDwgPaperA3size, swDwgPortraitOrientation, 0, 0, 0, 0
        End If
        
        Set swSheet = swDraw.GetCurrentSheet
        swSheet.SetName CStr(configName) ' シート名を設定名と同じにする
        
        ' --- B. ビューの挿入 ---
        ' CreateDrawViewFromModelView を使用して、モデルの特定のビュー(例: Front)を呼び出す
        ' 引数: モデルのフルパス, ビュー名, X座標, Y座標
        Set swView = swDraw.CreateDrawViewFromModelView3(swModel.GetPathName, "正面", 0.1, 0.1, 0)
        
        If Not swView Is Nothing Then
            ' --- C. 【最重要】ビューにコンフィギュレーションを紐付ける ---
            ' ここを忘れると、すべて「デフォルト」の設定が表示されてしまいます
            swView.ReferencedConfiguration = CStr(configName)
            
            ' ビューのスケール調整(必要に応じて)
            swView.ScaleRatio = 0.5 ' 例として半分に縮小
        Else
            Debug.Print "ビューの作成に失敗しました: " & configName
        End If
        
        i = i + 1
    Next configName
    
    ' 5. 後処理
    swApp.UserControl = True ' 画面更新を再開
    MsgBox "完了しました! " & i & " 個の設定を処理しました。", vbInformation
    
    Exit Sub

ErrorHandler:
    swApp.UserControl = True
    MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub

4. プロが教える「陥りやすい罠」と回避術

このコードをベースに、あなたが現場で「もっと使いやすく」するための知見を授けます。

① 「SelectByID2」を多用しない

マクロの記録を見ると、`swModel.Extension.SelectByID2 “View1@Drawing1”, …` のようなコードが並んでいるはずです。これは「名前で対象を探して選択する」という非常に重い処理です。
今回のように、`Set swView = swDraw.CreateDrawViewFromModelView3(…)` と、メソッドの戻り値として直接オブジェクトを受け取る書き方を徹底してください。これがパフォーマンスと堅牢性の違いを生みます。

② ビューの配置座標(

② ビューの配置座標($0,0$ の呪い)

,0$ の呪い)

コード内で `0.1, 0.1` と座標を指定していますが、これはメートル単位です。図面のサイズやテンプレートの原点設定によっては、ビューが紙面の外に飛び出してしまうことがあります。
実用的なツールにするなら、`swSheet.GetProperties` などを用いてシートのサイズを取得し、中央に配置する計算式を入れるのが「プロ」の仕事です。

③ エラーハンドリングの重要性

コンフィギュレーションの中に、破損したデータや、参照している部品が欠落している設定が含まれていることがあります。
`On Error GoTo ErrorHandler` を入れておくことで、マクロが突然クラッシュしてSolidWorksごと落ちるのを防ぎ、ユーザーに「何が起きたか」を優しく伝えることができます。

最後に

いかがでしたか?
「記録」から「設計」へ。単なる操作の自動化ではなく、「オブジェクトの構造を理解し、論理的に制御する」。これができるようになると、SolidWorks VBAはあなたの強力な武器になります。

最初はエラーが出るかもしれません。座標がズレるかもしれません。でも、それはあなたが「正解のロジック」に近づいている証拠です。

一歩ずつ、コードの深淵を楽しんでください。応援していますよ。

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