【実務・中級編】【上級プロ向け】図面シートフォーマット(.slddrt)のプログラム的動的生成とテンプレートメタデータ検証ツール – SolidWorks VBA解析バイブル

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

テンプレートへの依存を捨てろ:図面シートフォーマットの動的生成とメタデータ検証の極意

業務自動化の現場において、多くのエンジニアが「テンプレートファイル(.slddrt)の管理」という、一見すると些細だが極めて厄介な技術負債に足を取られている。

「テンプレートのパスが変わった」「誰かがフォーマットを直接書き換えてしまった」「特定のプロジェクトだけ図枠の寸法が違う」――。こうした問題に直面したとき、君たちはどう対処する? 既存のファイルをコピーして、中身を微修正するコードを書くのか?

もしそうなら、君の設計は「脆い(Fragile)」。

真にプロフェッショナルな自動化エンジニアが目指すべきは、「テンプレートファイルに依存せず、コード(および外部データ)から図面フォーマットをゼロから描画し、その整合性を自律的に検証する」というアーキテクチャだ。

本稿では、SolidWorks APIの深淵に触れ、図面シートフォーマットを「データ駆動型」で制御するための、極限の設計思想と実装手法を伝授する。

1. 設計思想:テンプレートからの脱却と「Single Source of Truth」

従来の「テンプレートを読み込む」手法は、図面要素がバイナリファイルの中に隠蔽されているため、プログラムからの制御が極めて困難だ。

我々が採用すべきは、「図面フォーマットの定義を、図面ファイルではなく、外部の構造化データ(JSON, XML, もしくはデータベース)に持たせる」という設計だ。

なぜこの設計が必要なのか?

1. 検証可能性 (Verifiability): 線の一本、文字のフォントサイズ一つに至るまで、プログラムで「期待値」と比較できる。
2. 動的な柔軟性: プロジェクトの属性(顧客、規格、図面種別)に応じて、その場で最適な図枠を「生成」できる。
3. メンテナンス性: 図枠の変更が必要な際、大量の `.slddrt` ファイルを更新するのではなく、一つの定義データ(マスター)を更新するだけで済む。

2. 実装の核心:SketchManagerとNoteの精密操作

図面フォーマットをプログラムで描く際、最も重要なのは「座標系」と「単位系」の掌握だ。SolidWorks APIは内部的にメートル(m)で動作することを忘れてはならない。

以下に、堅牢な設計に基づいた、図面シートフォーマットの動的生成エンジンのプロトタイプを示す。

'**
' Module: DrawingArchitect
' Description: 図面シートフォーマットを動的に生成するプロフェッショナル・エンジン
'**

Option Explicit

' 単位変換定数 (mm -> m)
Private Const MM_TO_M As Double = 0.001

' 図面フォーマットの定義構造体(本来はDBやJSONから読み込むべきもの)
Private Type SheetLayout
    Width As Double
    Height As Double
    TitleBlockWidth As Double
    TitleBlockHeight As Double
    LineWeight As Double
End Type

''' <summary>
''' 指定されたレイアウトに基づき、新しい図面シートを動的に構築する
''' </summary>
Public Sub GenerateDynamicSheet()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swSketchMgr As SldWorks.SketchManager
    Dim swModelDocExt As SldWorks.ModelDocExtension
    
    Set swApp = Application.SldWorks
    
    ' 1. 新規図面ドキュメントの作成 (A3サイズを想定)
    ' 引数: テンプレートパス(空文字で新規作成、または最小限のベースのみ)
    Set swModel = swApp.NewDocument("", swDocDRAWING, 0, 0)
    If swModel Is Nothing Then
        Err.Raise 1001, , "図面ドキュメントの作成に失敗しました。"
    End If
    
    Set swDraw = swModel
    Set swModelDocExt = swModel.Extension
    
    ' 2. レイアウト定義のロード (ここではハードコードしているが、実務ではDBから取得)
    Dim layout As SheetLayout
    layout.Width = 420 * MM_TO_M
    layout.Height = 297 * MM_TO_M
    layout.TitleBlockWidth = 180 * MM_TO_M
    layout.TitleBlockHeight = 50 * MM_TO_M
    layout.LineWeight = 0.05 ' mm
    
    ' 3. シートの設定
    ' CreateSheet(Name, PaperSize, Width, Height, Scale1, Scale2)
    ' 注意: PaperSizeは定数を使用
    Set swSheet = swDraw.CreateSheet("Dynamic_Sheet", swDwgPaperA3size, layout.Width, layout.Height, 1, 1)
    
    ' 4. 図枠の描画プロセス
    ' ここでは SketchManager を使用して直接描画する
    Set swSketchMgr = swModel.SketchManager
    
    On Error GoTo ErrorHandler
    swApp.SetUserPreferenceIntegerValue swUserPreferenceIntegerValue_e.swUserPreferenceInteger_e.swSheetDisplayScale, 1
    
    ' 外枠の描画
    DrawRectangle swSketchMgr, 0, 0, layout.Width, layout.Height
    
    ' 表題欄の描画
    DrawRectangle swSketchMgr, layout.Width - layout.TitleBlockWidth, 0, layout.TitleBlockWidth, layout.TitleBlockHeight
    
    ' 5. メタデータの注入 (Noteの配置)
    InsertMetadata swDraw, layout.Width - layout.TitleBlockWidth + 5 * MM_TO_M, 10 * MM_TO_M, "PROJECT: ALPHA-X"
    InsertMetadata swDraw, layout.Width - layout.TitleBlockWidth + 5 * MM_TO_M, 25 * MM_TO_M, "DRAWING NO: 2023-001"

    ' 6. 検証フェーズ (後述)
    If ValidateSheetLayout(swDraw, layout) Then
        Debug.Print "Sheet Generation Successful: Metadata Validated."
    Else
        Err.Raise 1002, , "図面レイアウトの整合性検証に失敗しました。"
    End If

    swModel.ForceRebuild3 True
    Exit Sub

ErrorHandler:
    MsgBox "Critical Error: " & Err.Description, vbCritical
End Sub

''' <summary>
''' 四角形を描画するヘルパー関数
''' </summary>
Private Sub DrawRectangle(swSketchMgr As SldWorks.SketchManager, x As Double, y As Double, w As Double, h As Double)
    swSketchMgr.InsertSketch True
    ' 座標系はシートの左下を(0,0)とする設計
    swSketchMgr.CreateLine x, y, x + w, y
    swSketchMgr.CreateLine x + w, y, x + w, y + h
    swSketchMgr.CreateLine x + w, y + h, x, y + h
    swSketchMgr.CreateLine x, y + h, x, y
    swSketchMgr.InsertSketch True ' スケッチを終了
End Sub

''' <summary>
''' メタデータ(注釈)を挿入する
''' </summary>
Private Sub InsertMetadata(swDraw As SldWorks.DrawingDoc, x As Double, y As Double, text As String)
    ' Noteの挿入は DrawingDoc のメソッドを使用
    ' 座標はメートル単位
    swDraw.InsertNote text
    ' 挿入直後のNoteを選択して位置調整を行う(実務ではSelectionManagerを併用)
    ' 本コード例では簡略化のため、描画後の座標制御は省略
End Sub

''' <summary>
''' 生成されたシートが設計仕様を満たしているか検証する
''' </summary>
Private Function ValidateSheetLayout(swDraw As SldWorks.DrawingDoc, layout As SheetLayout) As Boolean
    ' ここで、描画された要素の数、座標、テキスト内容を走査する
    ' 例: 表題欄のテキストが空でないか、線がシートの境界を超えていないか
    ' 本来は、SelectionManagerを用いて全てのSketchEntityをループ解析する
    ValidateSheetLayout = True ' 簡易的な実装
End Function

3. プロフェッショナルが意識すべき「3つの鉄則」

コードを書くだけでは不十分だ。実務レベルのツールにするためには、以下の3点を設計に組み込め。

① SelectionManagerへの過度な依存を避ける

多くの開発者は `SelectByID2` を多用するが、これは非常に脆弱な手法だ。要素の名前が変わるだけでコードが死ぬ。
可能な限り、`swSketchManager.CreateLine` 等のメソッドが返す オブジェクトを直接保持 し、そのオブジェクトに対して操作を行うこと。これが「堅牢なコード」への第一歩だ。

② 座標系の「原点」を定義せよ

SolidWorksの図面シートにおいて、原点がどこにあるかは、使用するテンプレートや設定によって揺らぐ。
プログラムで生成する場合は、「シートの左下を (0, 0) とする」 という独自の座標系を論理的に定義し、すべての描画ロジックをそのオフセットに基づいて記述せよ。

③ メタデータ検証(Validation)の自動化

「描画して終わり」は、単なるスクリプトだ。
「描画したあと、その図枠が社内規定の余白(Margin)を確保しているか」「表題欄の文字サイズが規定以下になっていないか」を、`ValidateSheetLayout` のような関数で自動チェックする仕組みを持たせろ。これこそが、自動化ツールを「製品」へと昇華させる。

4. まとめ:次世代の自動化エンジニアへ

テンプレートファイル(.slddrt)を「神聖なもの」として扱うのをやめろ。
それらは単なる「描画結果のキャッシュ」に過ぎない。

真のマスターは、「設計思想(Data)」「描画ロジック(Engine)」「整合性検証(Validator)」を分離し、コードによって図面を完全に支配する。

このアプローチは、開発コストを最初は押し上げるかもしれない。しかし、数年後のメンテナンスコスト、そして「テンプレートが壊れた」という叫び声に怯える時間を考えれば、これほど投資対効果の高い設計はないはずだ。

さあ、ファイルに頼るな。コードで描き起こせ。

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