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

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

【極限の知見】図面フォーマット(.slddrt)のガバナンスを強制する:メタデータ解析とメモリ管理の鉄則

設計現場において、図面は単なる「図」ではない。それは、企業の設計思想、品質保証のプロセス、そしてコンプライアンスの結晶である。

しかし、多くの現場では、数年前のレガシーな図面フォーマット(`.slddrt`)が、無意識のうちに使い続けられている。レイヤー構造の不整合、規定外のカスタムプロパティ、あるいは社内規定を無視したテキストスタイルの混入。これらは、設計自動化を進める上で、システム全体の整合性を破壊する「静かなる毒」となる。

本稿では、単なる「図面の作成」という初歩的な自動化を超え、既存のテンプレートが規格に準拠しているかを強制的に検証する「コンプライアンス・チェッカー」のアーキテクチャを解説する。シニアエンジニアが直面する「メモリリーク」と「実行速度の限界」をどう突破するか、その真髄に触れてほしい。

1. テンプレート・ガバナンスの設計思想

一般的な自動化エンジニアは、「新しい図面を作るコード」を書く。しかし、真のアーキテクトは「現在の資産が正しいかを検証するコード」を書く。

`.slddrt`(図面シートフォーマット)の検証において、我々がチェックすべきメタデータは以下の3点に集約される。

1. レイヤー構造の整合性: 規定のレイヤー(例: `TITLE_BLOCK`, `DIMENSION`)が存在し、色が正しく設定されているか。
2. カスタムプロパティの網羅性: 管理番号、設計者、承認日などの属性が、プロパティマネージャーに正しく定義されているか。
3. 描画要素の属性: シート内のテキスト要素が、指定されたフォントやサイズに準拠しているか。

これらを、数千個のファイルに対して、いかに低負荷で、かつ「SolidWorksのプロセスをゾンビ化させずに」実行するか。これが技術的な焦点である。

2. 実装:高信頼性コンプライアンス・スキャナー

以下に示すコードは、指定された `.slddrt` ファイルを「ヘッドレス(非表示)」状態で解析し、規格外の要素を検知するプロトタイプである。

ここでは、単にAPIを叩くだけでなく、COMオブジェクトの明示的な解放に細心の注意を払っている。これを行わない限り、バッチ処理中にメモリ消費が指数関数的に増大し、最終的にシステムはクラッシュする。

'==============================================================================
' Module: ComplianceChecker
' Description: 図面フォーマット(.slddrt)のメタデータを解析し、規格準拠を検証する
' Author: Chief Architect
'==============================================================================

Option Explicit

' 規格チェック用の定数
Private Const REQ_LAYER_NAME As String = "STANDARD_TITLE_BLOCK"
Private Const REQ_PROP_NAME As String = "PROJECT_ID"

Public Sub RunComplianceCheck(ByVal sSlddrtPath As String)
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swSheet As SldWorks.Sheet
    Dim swCustPropMgr As SldWorks.CustomPropertyManager
    Dim vLayers As Variant
    Dim i As Long
    Dim isCompliant As Boolean: isCompliant = True
    
    On Error GoTo ErrorHandler

    ' 1. SolidWorksインスタンスの取得(既存のものを利用、なければ生成)
    Set swApp = GetSolidWorksApp()
    If swApp Is Nothing Then Exit Sub

    ' 2. 解析用の一時的な図面を生成(ヘッドレス運用を想定)
    ' ※.slddrtを直接開くAPIは存在しないため、空の図面に適用して検証する
    Set swModel = swApp.NewDocument(swApp.GetUserPreferenceStringValue(swUserPreferenceStringValue_e.swDefaultTemplateDrawing), 0, 0, 0)
    If swModel Is Nothing Then GoTo ErrorHandler
    Set swDraw = swModel
    
    ' 3. 対象のシートフォーマットを適用
    ' これにより、テンプレート内のレイヤーやプロパティがモデルにロードされる
    swDraw.SetupSheet5 swDraw.GetCurrentSheet, swDwgPaperSizes_e.swDwgPaperA3size, swDwgTemplateOrientation_e.swDwgTemplateLandscape, swDwgScaleOrientation_e.swDwgScaleVertical, 0, 0, 0, sSlddrtPath
    
    ' 4. メタデータ検証フェーズ
    Set swSheet = swDraw.GetCurrentSheet
    
    ' --- 検証A: レイヤーの存在確認 ---
    vLayers = swDraw.GetLayers
    Dim layerFound As Boolean: layerFound = False
    If Not IsEmpty(vLayers) Then
        For i = 0 To UBound(vLayers)
            If vLayers(i) = REQ_LAYER_NAME Then
                layerFound = True
                Exit For
            End If
        Next i
    End If
    
    If Not layerFound Then
        Debug.Print "[-] FAILURE: Required layer '" & REQ_LAYER_NAME & "' not found."
        isCompliant = False
    End If

    ' --- 検証B: カスタムプロパティの確認 ---
    Set swCustPropMgr = swModel.Extension.CustomPropertyManager("")
    Dim propVal As String
    swCustPropMgr.Get4 REQ_PROP_NAME, False, "", propVal
    
    If propVal = "" Then
        Debug.Print "[-] FAILURE: Required property '" & REQ_PROP_NAME & "' is missing or empty."
        isCompliant = False
    End If

    ' 5. 結果出力
    If isCompliant Then
        Debug.Print "[+] SUCCESS: " & sSlddrtPath & " is compliant."
    Else
        Debug.Print "[!] WARNING: " & sSlddrtPath & " is NON-COMPLIANT."
    End If

CleanUp:
    ' 6. 【極めて重要】メモリ管理とオブジェクトの明示的解放
    ' COMオブジェクトを適切に解放しないと、SolidWorks.exeがプロセスに残る
    If Not swDraw Is Nothing Then Set swDraw = Nothing
    If Not swModel Is Nothing Then 
        swApp.CloseDoc swModel.GetTitle
        Set swModel = Nothing
    End If
    ' swAppはアプリケーション全体を指すため、ループ内では解放しない
    Exit Sub

ErrorHandler:
    Debug.Print "[ERROR] Critical failure: " & Err.Description
    Resume CleanUp
End Sub

' SolidWorksアプリケーションへの安全な接続
Private Function GetSolidWorksApp() As SldWorks.SldWorks
    On Error Resume Next
    Dim sw As SldWorks.SldWorks
    Set sw = GetObject(, "SldWorks.Application")
    If sw Is Nothing Then
        Set sw = CreateObject("SldWorks.Application")
        sw.Visible = False ' 検証プロセスはバックグラウンドで実行
    End If
    Set GetSolidWorksApp = sw
    On Error GoTo 0
End Function

3. アーキテクトの視点:なぜこの実装なのか

3.1. 「開く」というコストの最適化

`.slddrt` 自体はバイナリ形式の特殊なファイルであり、直接テキスト解析することは極めて困難である。したがって、本コードでは「空の図面を作成し、そこにテンプレートを適用する」というアプローチをとっている。
一見、非効率に見えるかもしれないが、`swApp.NewDocument` を使用し、検証が終わるたびに `swApp.CloseDoc` で即座に破棄することで、メモリの断片化を最小限に抑えている。

3.2. COM参照カウントの制御(The Ghost Process Problem)

VBAエンジニアが最も陥りやすい罠は、`Set obj = Nothing` だけで満足することだ。
SolidWorks APIのような重厚なCOMインターフェースでは、内部的な参照カウントが残っている限り、`swApp.CloseDoc` を呼び出してもプロセスがメモリ上に居座り続ける。
大規模なバッチ処理を行う場合は、各ループの終わりに、「そのオブジェクトが本当にNothingになったか」をデバッガで監視し、必要に応じて `ReleaseComObject`(Windows API経由、あるいはVB.NETへの移行)を検討すべきだ。

3.3. スケーラビリティへの布石

もし、このチェッカーを数万件のテンプレートに対して実行する場合、VBAのシングルスレッド性能では限界が来る。その場合、アーキテクチャを以下のように昇華させる必要がある。

1. VBAを「ワーカー」として利用: 実際の制御ロジックは C# (.NET) で記述し、`Task Parallel Library (TPL)` を用いて複数のSolidWorksインスタンスを並列制御する。
2. Windows APIによるプロセス監視: `OpenProcess` および `TerminateProcess` を用い、万が一ハングアップしたSolidWorksプロセスを外部から強制回収するガバナンス機構を組み込む。

4. 結論

図面フォーマットの管理は、設計の品質を支える「見えないインフラ」である。
自動化エンジニアの真価は、単に「動くもの」を作ることではなく、「システムの整合性を維持し、長期的な運用に耐えうる堅牢な仕組み」を構築することにある。

本稿で示した、メタデータ解析と厳格なメモリ管理の組み合わせは、その第一歩に過ぎない。コンプライアンスをコードで制御し、設計の規律を自動化せよ。

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