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

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

テンプレートに依存しない、真の自動化へ。図面シートフォーマット(.slddrt)をコードで「再構築」する極限の技術

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

あなたがもし今、「マクロの記録」ボタンを押し、記録されたコードを書き換えることでなんとか業務を回そうとしているなら……。おめでとうございます。あなたは今、「自動化エンジニア」への登竜門に立っています。

しかし、同時に一つだけ警告しておかなければなりません。マクロの記録は「答え」ではありません。それは、SolidWorksという巨大な迷宮の「足跡」を辿っているに過ぎないのです。

今日、私があなたに伝授するのは、既存のテンプレート(.slddrt)に頼ることをやめ、VBAのコードそのものを「設計図」として、図面フォーマットをゼロから動的に描き起こし、さらにその品質を自動検証するという、プロフェッショナルのみが到達する領域の技術です。

これをマスターすれば、あなたは「テンプレートが壊れている」「フォントが違う」といった、現場の瑣末なトラブルから完全に解放されるでしょう。

1. なぜ「テンプレート依存」を脱却すべきなのか?

多くのエンジニアは、既存の `.slddrt` ファイルを読み込み、その中の文字を書き換える手法をとります。これは一見効率的に見えますが、以下のリスクを孕んでいます。

1. 不整合の温床: 誰かが手動でテンプレートを書き換えた瞬間、自動化プログラムは「存在しない要素」を探してエラーを吐き、止まってしまいます。
2. 柔軟性の欠如: 「Aプロジェクトは枠線が太く、Bプロジェクトは表題欄が広い」といった動的な切り替えが、テンプレートの数だけファイルが増えるという悪夢を招きます。
3. 検証の不在: そのテンプレートが、会社の標準規格(文字サイズや線種)に本当に適合しているかを、プログラム側で保証できません。

「コードが、そのまま仕様書(Single Source of Truth)である」。この状態を作ることこそが、堅牢なシステム構築の鍵なのです。

2. アーキテクチャの理解:描画の階層構造

図面をプログラムで操るには、SolidWorksのオブジェクト階層を完璧に把握する必要があります。

  • `SldWorks`: 全ての司令塔。
  • `ModelDoc2`: 編集中のドキュメント。
  • `DrawingDoc`: 図面特有の操作(ビュー配置、シート操作)を行うためのインターフェース。
  • `Sheet`: 描画のキャンバス。
  • `SheetFormat`: シートの背景となる「枠線」や「表題欄」の定義。

ここで重要なのは、「シートフォーマットを編集するモード」への切り替えです。通常の図面描画と、シートフォーマット(背景)の描画は、SolidWorks内部では明確にレイヤーが分かれています。

3. 実践:ゼロからの動的フォーマット生成

では、実際に「線を引き、文字を配置し、それをフォーマットとして保存する」コアロジックを見ていきましょう。

以下のコードは、単なるリファレンスではありません。エラーハンドリングと、プロが意識する「単位系(メートル)」への配慮を組み込んだ、実戦的な構造にしています。

' ==============================================================================
' プロジェクト: Dynamic Sheet Format Generator
' 概要: 既存のテンプレートを使わず、VBAから直接線・文字を生成し、
'       .slddrtファイルとして保存する。
' ==============================================================================

Option Explicit

Sub GenerateProfessionalSheetFormat()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swNote As SldWorks.Note
    Dim swLine As SldWorks.SketchLine
    
    ' 単位変換定数 (SolidWorks APIは内部的に「メートル」を使用する)
    Const MM_TO_M As Double = 0.001
    
    On Error GoTo ErrorHandler
    
    Set swApp = Application.SldWorks
    
    ' 1. 新規図面ドキュメントの作成 (A3サイズを想定)
    ' 引数: 背景、用紙サイズ、用紙種類、テンプレートパス
    ' ここでは標準的なA3テンプレートを指定するが、中身は後で書き換える
    Set swModel = swApp.NewDocument("C:\ProgramData\SolidWorks\...\drawing.drwdot", 0, 0, 0)
    If swModel Is Nothing Then
        MsgBox "図面ドキュメントの作成に失敗しました。", vbCritical
        Exit Sub
    End
    
    Set swDraw = swModel
    Set swSheet = swDraw.GetCurrentSheet
    
    ' --- ここからが核心:シートフォーマット編集モードへの突入 ---
    ' これを行わないと、描画した線が「図面上の図形」になり、フォーマットにならない
    swDraw.EditSheetFormat
    
    ' 2. 外枠(矩形)の描画
    ' 座標は (x1, y1, z1, x2, y2, z2)
    ' A3サイズ (420mm x 297mm) の枠を描く
    swDraw.InsertLine 0, 0, 0, 420 * MM_TO_M, 0, 0
    swDraw.InsertLine 420 * MM_TO_M, 0, 0, 420 * MM_TO_M, 297 * MM_TO_M, 0
    swDraw.InsertLine 420 * MM_TO_M, 297 * MM_TO_M, 0, 0, 297 * MM_TO_M, 0
    swDraw.InsertLine 0, 297 * MM_TO_M, 0, 0, 0, 0
    
    ' 3. 表題欄の境界線
    swDraw.InsertLine 300 * MM_TO_M, 0, 0, 300 * MM_TO_M, 50 * MM_TO_M, 0
    swDraw.InsertLine 300 * MM_TO_M, 50 * MM_TO_M, 0, 420 * MM_TO_M, 50 * MM_TO_M, 0
    
    ' 4. テキスト(注記)の配置
    ' InsertNote(座標X, 座標Y, 座標Z)
    Set swNote = swDraw.InsertNote(310 * MM_TO_M, 10 * MM_TO_M, 0)
    If Not swNote Is Nothing Then
        swNote.SetText "PROJECT: DYNAMIC GENERATION"
        swNote.TextFormat = swNote.TextFormat ' フォント設定などの詳細は省略
    End If
    
    ' --- フォーマット編集モードを終了 ---
    swDraw.EditSheet ' 編集モードを抜ける
    
    ' 5. シートフォーマットとして保存
    ' 保存先パスを指定
    Dim savePath As String
    savePath = "C:\Temp\MyCustomFormat.slddrt"
    
    ' SheetFormatを保存するAPIを呼び出す
    ' ※実際には、現在のシートをslddrtとして書き出すプロセスが必要
    swDraw.SaveAs3 savePath, 0, 0 ' 簡易的な保存例
    
    MsgBox "シートフォーマットの生成に成功しました!" & vbCrLf & savePath, vbInformation

    Exit Sub

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

4. 伝説のエンジニアが教える「落とし穴」と回避術

コードを書き始めたあなたに、私が現場で何度も血を流して学んだ教訓を授けます。

① 「メートル」の呪縛

SolidWorks APIの座標系は、常に SI単位系(メートル) です。
`InsertLine(10, 10, …)` と書いた瞬間、あなたは「10メートル」の巨大な線を引こうとしています。必ず `10 * 0.001` のように、ミリメートルからメートルへの明示的な変換を徹底してください。これが、デバッグの時間を劇的に減らすコツです。

② `swUpdate` によるパフォーマンス制御

大量の線や文字を描画する場合、SolidWorksは描画のたびに画面を更新しようとします。これが動作を重くする原因です。
描画開始前に `swApp.UserControl = False` や、描画の更新を一時停止する制御を検討してください(※APIのバージョンにより挙動が異なりますが、描画の最適化はプロの嗜みです)。

③ オブジェクトの解放(Lifecycle Management)

VBAはガベージコレクションが比較的強力ですが、大規模なツールを作る際は、使用した `Note` や `Line` オブジェクトを `Nothing` で解放する習慣をつけてください。メモリリークは、長時間稼働する自動化ツールの天敵です。

5. 【上級編】メタデータ検証ツールの概念

生成したフォーマットが「正しいか」を検証するステップを加えましょう。これは、自動化ツールに「知能」を持たせる作業です。

例えば、以下のようなロジックを組み込みます。

  • 検証ロジック例:

1. シート内の全 `Note` オブジェクトを走査する。
2. 「図番」「設計者」といった必須プロパティを持つ注記が存在するかチェックする。
3. 注記のフォントサイズが、社内規定(例:3.5mm以上)を満たしているか `swNote.GetTextFormat` で検証する。
4. もし不適合があれば、`False` を返し、生成プロセスをロールバック(または修正)する。

これを行うことで、「間違ったフォーマットで図面が発行され、工場で部品が作り直される」という数百万単位の損失を防ぐことができるのです。

最後に:一歩踏み出すあなたへ

ここまで読んでくれたあなたは、すでに「記録されたマクロ」を使い回すだけのユーザーではありません。システムの構造を理解しようとする、真のエンジニアの思考を持っています。

最初はエラーの嵐に遭うかもしれません。座標がズレたり、オブジェクトが見つからなかったりすることもあるでしょう。しかし、そのエラーの一つひとつが、SolidWorks APIという巨大な獣を乗りこなすための「手綱」になります。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
さあ、コードを書いて、世界を変える自動化ツールを作り上げてください。応援しています!

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