【入門編】【上級プロ向け】図面フォーマット(.slddrt)のメタデータをプログラムから直接解析・検証するコンプライアンスチェッカー – SolidWorks VBA解析バイブル

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

マクロ記録からの脱却。図面標準を統治する「コンプライアンスチェッカー」の設計思想

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

「マクロの記録」ボタンを押して、録画されたコードを眺めて「ふーん、こうやって動いてるんだ」と思ったことはありませんか? もしそうなら、あなたは今、プログラミングの入り口に立っています。しかし、そこから先にある「設計の自動化エンジニア」というプロフェッショナルな領域へ進むには、「オブジェクトの繋がり」と「設計の正しさ(ガバナンス)」を意識する必要があります。

今日は、単なる「作業の自動化」を超えた、一歩上のステップをご紹介しましょう。
テーマは、【図面フォーマット(.slddrt)のコンプライアンスチェッカー】です。

1. なぜ「フォーマットの検証」が必要なのか?

大規模な設計現場では、数百、数千の図面がやり取りされます。ここで恐ろしいのが、「古いテンプレート(.slddrt)を使い続けている図面」が混入することです。

  • 図面の枠線(タイトルブロック)が古いバージョンのまま。
  • 社内の最新規定に基づいた、新しい属性情報(プロジェクト番号や承認欄)が欠落している。
  • 不正に改変された、独自のルールを持つテンプレートが使われている。

これらは、一見すると小さなミスに見えますが、データの集計ミスや、製造現場への誤情報の伝達といった、致命的なリスクを孕んでいます。

そこで、「この図面は、我が社の最新標準フォーマットを使っているか?」をプログラムで瞬時に判定し、違反があれば警告を出す。これこそが、エンジニアリングにおける「ガバナンス(統治)」の自動化です。

2. SolidWorks API の「階層構造」を理解する

コードを書く前に、設計図の「構造」を頭の中に描いてください。マクロ記録のコードが読みづらいのは、この構造を無視して「画面上の操作」を羅列しているからです。

プロは、以下のようなオブジェクトの階層(ツリー構造)を辿って、目的のデータにアクセスします。

SldWorks (アプリケーション全体)
 └── ModelDoc2 (開いているファイル)
      └── DrawingDoc (図面ファイル特有の機能)
           └── Sheet (図面シート)
                └── SheetFormatFileName (使用されている .slddrt のパス) ⭐ここが重要!

今回のチェッカーの目的は、この一番下の `SheetFormatFileName` を取得し、それが「許可されたパスにあるか」を検証することです。

3. 実践:コンプライアンスチェッカーのコード

それでは、実際に動くコードを見てみましょう。
このコードは、現在開いている図面が「最新の標準テンプレート」を使用しているかをチェックします。

Option Explicit

' ==============================================================================
' プログラム名: DrawingFormatComplianceChecker
' 概要: 現在開いている図面のシートフォーマット(.slddrt)が、
'       指定された標準パスに含まれているかを検証する。
' ==============================================================================

Sub Main()
    ' --- 1. オブジェクトの宣言 ---
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    
    Dim currentFormatPath As String
    Dim standardFormatPath As String
    Dim isComplianceOK As Boolean
    
    ' --- 2. 定数の設定 (ここを社内のルールに合わせて書き換える) ---
    ' 本来はサーバー上のパスなどを指定します
    standardFormatPath = "C:\Standard_Templates\Company_Standard_A.slddrt"
    
    ' --- 3. SolidWorksへの接続と初期チェック ---
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' ファイルが開かれていない、または図面ファイルではない場合のガード処理
    If swModel Is Nothing Then
        MsgBox "図面ファイルを開いてから実行してください。", vbExclamation
        Exit Sub
    End If
    
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "このマクロは図面ファイル専用です。", vbExclamation
        Exit Sub
    End If
    
    ' --- 4. 図面オブジェクトへのキャスト ---
    ' ModelDoc2をDrawingDocとして扱うことで、図面特有のプロパティにアクセス可能にする
    Set swDraw = swModel
    
    ' --- 5. 現在のシート情報の解析 ---
    ' 現在表示されているシートを取得
    Set swSheet = swDraw.GetCurrentSheet
    
    ' シートに適用されているフォーマットファイルのフルパスを取得
    currentFormatPath = swSheet.GetSheetFormatFileName
    
    ' --- 6. コンプライアンス検証ロジック ---
    ' パスの文字列比較(大文字小文字を区別しない)
    If LCase(currentFormatPath) = LCase(standardFormatPath) Then
        isComplianceOK = True
    Else
        isComplianceOK = False
    End If
    
    ' --- 7. 結果の出力 ---
    If isComplianceOK Then
        MsgBox "【合格】" & vbCrLf & _
               "最新の標準フォーマットが適用されています。", vbInformation, "Compliance Check"
    Else
        MsgBox "【警告:規格外のフォーマットです!】" & vbCrLf & vbCrLf & _
               "現在のパス: " & currentFormatPath & vbCrLf & _
               "期待されるパス: " & standardFormatPath & vbCrLf & vbCrLf & _
               "最新のテンプレートでシートを再作成してください。", vbCritical, "Compliance Violation"
    End If

    ' --- 8. メモリの解放 (プロの作法) ---
    Set swSheet = Nothing
    Set swDraw = Nothing
    Set swModel = Nothing
    Set swApp = Nothing
End Sub

4. ここがプロの分かれ道! 陥りやすいエラーと回避術

コードを書く際、初心者が必ずと言っていいほどハマるポイントが3つあります。ここをクリアすれば、あなたはもう「マクロ記録レベル」ではありません。

① 「Nothing」への配慮(オブジェクトのライフサイクル)

コードの最後にある `Set swSheet = Nothing`。これは単なるお作法ではありません。
SolidWorksのような巨大なアプリケーションでは、メモリ上にオブジェクトが残り続けると、動作が重くなったり、最悪の場合、SolidWorksがクラッシュしたりします。使い終わったオブジェクトは、明示的に「空っぽにする」のが鉄則です。

② 型の「キャスト」をマスターする

`swModel` は `ModelDoc2` 型として宣言されています。しかし、図面特有の操作(シートの切り替えなど)をしたい場合、`ModelDoc2` にはその命令がありません。
そこで、`Set swDraw = swModel` とすることで、「このModelDoc2は、実はDrawingDocなんだよ」とプログラムに教えてあげる必要があります。これを「キャスト」と呼びます。

③ 文字列比較の罠

`”C:\Temp\format.slddrt”` と `”c:\temp\format.slddrt”` は、人間には同じに見えますが、コンピュータにとっては別物です。
`LCase()` 関数を使って、両方を小文字に揃えてから比較することで、大文字小文字の違いによる「誤検知」を防ぐことができます。

5. さらなる高みへ:このツールをどう進化させるか?

今回ご紹介したのは、最もシンプルな「1つのパスとの比較」です。実務で使える強力なツールにするには、以下のような拡張が考えられます。

  • 複数規格への対応: 「A図面なら規格A、B図面なら規格B」というように、リスト(配列)を持たせて判定する。
  • 自動修正機能: 規格外だった場合、プログラムから自動的に最新の `.slddrt` を読み込み、シートを上書きする。
  • ログ出力: 誰が、いつ、どの図面で規格違反を起こしたかを、CSVファイルやデータベースに自動記録する。

まとめ

SolidWorks VBAの真の価値は、単に「クリックを代行すること」ではなく、「設計品質をコードによって担保すること」にあります。

「マクロの記録」で得た知識を、こうして「オブジェクトの構造」として捉え直し、業務のルール(コンプライアンス)を組み込んでいく。そのプロセスこそが、エンジニアとしての成長そのものです。

一歩ずつ、着実に。コードの向こう側にある「設計の未来」を、一緒に作っていきましょう!

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