テンプレートの腐敗を防げ:SolidWorks 図面フォーマット(.slddrt)の整合性を強制するコンプライアンス・アーキテクチャ
設計現場において、自動化エンジニアが直面する最大の敵は、バグでも、遅いAPIでもない。「現場で勝手に改変された、規格外の図面フォーマット(.slddrt)」だ。
「とりあえず、この図面から寸法を抜いておいて」という要求に対し、ツールがエラーを吐く。原因は、図面内のタイトルブロックのノート(Note)が、本来のプロパティリンクではなく「手入力のテキスト」に書き換えられていたことにある。このような「テンプレートの腐敗(Template Drift)」は、大規模な設計プロジェクトにおいて、自動化ツールの信頼性を根底から破壊する。
本記事では、単なる「ファイル名チェック」に留まらない、図面フォーマットのメタデータを深層まで解析し、社内標準への準拠を強制する「コンプライアンス・チェッカー」の設計思想と、その実装方法を伝授する。
1. 凡庸な設計と、プロフェッショナルな設計の決定的な違い
多くの開発者は、以下のような実装で妥協する。
- 「図面のプロパティを見て、特定の文字列が含まれているか確認する」
- 「`SheetFormatFile` のパスが、指定のフォルダ内にあるか確認する」
これは「検知」ではあっても「検証」ではない。プロフェッショナルが構築すべきは、「図面フォーマットの構造的整合性(Structural Integrity)」を検証する仕組みだ。
検証すべき3つのレイヤー
1. パス・ガバナンス: 使用されている `.slddrt` が、承認済みのマスター・リポジトリから取得されたものか?
2. プロパティ・リンクの整合性: タイトルブロックの各要素(図番、版数、設計者など)が、手入力ではなく、正しい `Custom Property` と動的にリンクしているか?
3. レイヤー・属性の標準化: 線種やレイヤー、注釈のフォントサイズが、最新の社内規格に準拠しているか?
これらを「一括で、かつ高速に」判定するためのアーキテクチャが必要となる。
2. 高速かつ堅牢な解析アルゴリズムの設計
図面ファイルを一つずつ開き、全てのノートをループで回す手法は、パフォーマンスの観点から極めて劣悪だ。特に数百枚の図面をスキャンする場合、APIのオーバーヘッドが致命傷になる。
設計の要諦:オブジェクト・ライフサイクルの管理
SolidWorks APIにおいて、`DrawingDoc` や `Sheet` オブジェクトは、その背後にあるメモリリソースを大量に消費する。解析を行う際は、「最小限のオブジェクト参照」で済ませ、検証が終わった瞬間に参照を解放(Nothingを代入)する。これが、長時間稼働するガバナンスツールにおける「メモリリーク」を防ぐ鉄則だ。
実装戦略:データ駆動型バリデーション
ルールをコード内にハードコードしてはいけない。検証ルール(例:「図番ノートは `$PRP:”SW-File Name”` であること」)は、外部のJSONやCSV、あるいはデータベースから取得する「データ駆動型」に設計せよ。これにより、規格変更時にソースコードを再コンパイルすることなく、ルールをアップデートできる。
3. プロダクション・コード:コンプライアンス・チェッカーの実装例
以下に、図面シート内のノートが、正しいプロパティリンクを使用しているかを検証する、実戦的なクラスモジュール構造のコードを示す。
Module: `modComplianceChecker`
Option Explicit
' 検証結果を格納するための型定義
Public Type ValidationResult
IsCompliant As Boolean
ErrorMessages As String
TargetSheet As String
End Type
''' <summary>
''' 図面ファイルのコンプライアンスを検証するメインエントリポイント
''' </summary>
''' <param name="swModel">検証対象のSolidWorksモデル(DrawingDoc)</param>
''' <returns>検証結果の構造体</returns>
Public Function CheckDrawingCompliance(swModel As SldWorks.ModelDoc2) As ValidationResult
Dim result As ValidationResult
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim swView As SldWorks.View
Dim swNote As SldWorks.Note
Dim swAnnotation As SldWorks.Annotation
Dim i As Integer
' 初期化
result.IsCompliant = True
result.ErrorMessages = ""
' 型チェック
If swModel Is Nothing Then Exit Function
If swModel.GetType <> swDocDRAWING Then
result.IsCompliant = False
result.ErrorMessages = "対象ファイルが図面ではありません。"
Exit Function
End If
Set swDraw = swModel
' 1. シートフォーマット・パスの検証 (Path Governance)
' ※本来はここを外部マスターリストと比較する
Set swSheet = swDraw.GetCurrentSheet
result.TargetSheet = swSheet.GetName
' 2. シート上の要素(ノート)の構造的検証 (Structural Integrity)
' 図面ビューではなく、シートフォーマットそのものに属する要素を走査する
' Viewの階層構造を利用して、Sheetレベルの注釈を取得する
Set swView = swDraw.GetFirstView ' FirstViewは通常、Sheetそのものを指す
Do While Not swView Is Nothing
' Viewに紐づく注釈を取得
Set swAnnotation = swView.GetFirstAnnotation2
Do While Not swAnnotation Is Nothing
' 注釈が「ノート」である場合のみ解析
If swAnnotation.GetType = swAnnotationType_e.swNote Then
Set swNote = swAnnotation.GetSpecificAnnotation
' --- ここにビジネスルールを適用 ---
' 例: 「図番」という名前のノートが、プロパティリンクを使用しているか?
If IsTitleBlockElement(swNote, "Drawing Number") Then
If Not IsPropertyLinked(swNote) Then
result.IsCompliant = False
result.ErrorMessages = result.ErrorMessages & _
"[" & result.TargetSheet & "] Error: 'Drawing Number' is not linked to property." & vbCrLf
End If
End If
' ----------------------------------
End If
Set swAnnotation = swAnnotation.GetNextAnnotation
Loop
Set swView = swView.GetNextView
Loop
' オブジェクトの明示的な解放(メモリ管理の鉄則)
Set swDraw = Nothing
Set swSheet = Nothing
Set swView = Nothing
CheckDrawingCompliance = result
End Function
''' <summary>
''' 指定したノートが特定の役割(タイトルブロック要素)を持つか判定する
''' </summary>
Private Function IsTitleBlockElement(swNote As SldWorks.Note, targetName As String) As Boolean
' 実務では、ノートの座標や、特定のレイヤー、またはノート内のテキスト内容で判定する
' ここでは簡略化のため、テキスト内容で判定
Dim txt As String
txt = swNote.GetText
IsTitleBlockElement = (InStr(txt, targetName) > 0)
End Function
''' <summary>
''' ノートがプロパティリンク($PRP等)を使用しているか検証する
''' </summary>
Private Function IsPropertyLinked(swNote As SldWorks.Note) As Boolean
Dim swText As SldWorks.TextAnnotation
Set swText = swNote
' LinkToPropertyがTrueであれば、それは動的なプロパティリンクである
' これにより、手入力による「値の書き換え」を確実に検知できる
IsPropertyLinked = swText.LinkToProperty
End Function
4. 実務における実装の落とし穴と対策
このツールをプロダクション環境にデプロイする際、以下の3点に注意せよ。
① 「Sheet-Level」と「View-Level」の混同
SolidWorks APIにおいて、図面フォーマット(.slddrt)の要素は、図面ビュー(Drawing View)の中ではなく、「最初のビュー(GetFirstView)」、すなわちシートそのものの階層に存在している。ここを間違えると、いくらループを回してもタイトルブロックのノートに辿り着けない。
② データベース連携時のトランザクション
このツールを「不適合図面のリストアップ」として使い、結果をSQL Server等のデータベースに書き込む場合、「エラー発生時にデータベースの状態を不整合にしない」設計が必須だ。VBAからADO/ADODBを使用する場合は、必ず `BeginTrans` と `CommitTrans` を使い、エラー時には `RollbackTrans` を実行する堅牢なエラーハンドリングを組み込め。
③ ユーザーへのフィードバック
「エラーです」とだけ表示するツールは、現場から嫌われる。
「どのシートの、どの要素が、なぜ規格外なのか」を、具体的かつ修復可能な指示として提示せよ。
- ❌ 「フォーマット不正」
- ⭕ 「Sheet1の『図番』ノートがプロパティリンクになっていません。カスタムプロパティ `$PRP:”SW-File Name”` を割り当ててください。」
結論
自動化エンジニアの真の価値は、単に「作業を速くすること」ではない。「組織の標準を、システムによって強制し、品質のバラツキをゼロにすること」にある。
今回紹介したコンプライアンス・チェッカーの設計思想を、君のプロジェクトに組み込んでほしい。それは、単なるスクリプトを、企業の資産を守る「ガバナンス・ツール」へと昇華させる第一歩となるはずだ。
