幾何公差の「検図」を自動化せよ:構文解析による設計ルール違反の自動スキャン設計論
設計現場において、幾何公差(GD&T)の誤記は、単なる「書き損じ」では済まされない。それは、加工工程での致命的な手戻り、あるいは製品の機能不全に直結する「設計の欠陥」である。
多くの開発者が、SolidWorks VBAを用いて「図面内の注記を検索する」程度のツールを作成して満足している。しかし、それは自動化ではない。ただの「検索」だ。我々プロフェッショナルが目指すべきは、図面内の幾何公差フレームを論理的に解釈し、社内標準や設計意図に照らして「妥当性」を判定する、自動検図エンジン(Automated Inspection Engine)の構築である。
本稿では、幾何公差の構文解析と、ルール違反を自動検出するための堅牢なアーキテクチャについて、その極限の知見を共有する。
1. なぜ、あなたの自動化ツールは「使い物にならない」のか
多くの現場で失敗するツールには、共通する設計上の欠陥がある。
1.1 文字列操作への過度な依存
「公差のテキストを `Left()` や `Mid()` で切り出す」――このような実装は、設計者がスペースを一つ入れただけで崩壊する。幾何公差は、記号、許容値、データム参照という「構造化されたデータ」である。これを単なる「文字列」として扱うことは、構造化データ(JSONやXML)を正規表現だけで解析しようとする愚行と同じだ。
1.2 密結合なロジック
「APIで値を取得し、その場で `If…Then` で判定する」コードは、保守性の地獄を招く。社内ルールが変わるたびに、複雑なAPI操作が絡み合ったメインルーチンを書き換えなければならなくなるからだ。
1.3 パフォーマンスの無視
図面内の数千の注記(Note)に対して、無策に `Select` メソッドや重いプロパティアクセスを繰り返す設計は、ツールを「重くて使いにくいゴミ」へと変貌させる。
2. 勝利のアーキテクチャ:3層レイヤー設計
堅牢な検図エンジンを構築するためには、以下の3つのレイヤーを完全に分離した設計を採用すべきである。
1. Extraction Layer(抽出層): SolidWorks APIを叩き、幾何公差の「生データ」を構造化オブジェクトに変換する。
2. Logic Layer(論理層): 抽出されたデータと「設計ルール(マスター)」を比較し、違反を判定する。
3. Reporting Layer(出力層): 違反箇所を特定し、図面上の色変更やログ出力を行う。
この設計により、「ルールが変わっても、抽出ロジック(API操作)を修正する必要はない」状態を作り出す。
3. 実装の核心:幾何公差の構造化解析
幾何公差は、SolidWorksにおいては `Note` オブジェクトの一部として存在するが、その内部には特定の書式コードやデータム情報が含まれている。
以下に、プロフェッショナルが実装すべき、オブジェクト指向に基づいたVBAコードの骨格を示す。
3.1 データ構造の定義(Class Module: `clsToleranceFrame`)
まず、抽出したデータを保持するための専用クラスを作成する。これにより、APIの複雑なオブジェクトから、我々が扱いたい「意味のあるデータ」へと抽象化する。
' [Class Module: clsToleranceFrame]
Option Explicit
Public Symbol As String ' 公差記号 (例: "Parallelism")
Public ToleranceValue As Double ' 許容値 (例: 0.05)
Public DatumPrimary As String ' 第一データム
Public DatumSecondary As String ' 第二データム
Public RawText As String ' 解析前の生テキスト
Public AnnotationHandle As Object ' 違反時にハイライトするためのオブジェクト参照
' 判定結果の状態
Public IsValid As Boolean
Public ErrorMessage As String
3.2 抽出エンジン(Standard Module)
ここでは、`Select` を一切使わず、`GetNext` メソッドを用いた高速なイテレーションを行う。
' [Standard Module: modParser]
Option Explicit
''' <summary>
''' 図面内の全ビューを走査し、幾何公差を抽出する
''' </summary>
Public Sub ScanGeometricTolerances(swDoc As SldWorks.DrawingDoc)
Dim swSheet As SldWorks.Sheet
Dim swView As SldWorks.View
Dim swAnn As SldWorks.Annotation
Dim swNote As SldWorks.Note
Dim tolFrame As clsToleranceFrame
Set swSheet = swDoc.GetCurrentSheet
Set swView = swDoc.GetFirstView ' Sheet自体が最初のビュー
Do While Not swView Is Nothing
' ビュー内の全注記を走査
Set swAnn = swView.GetFirstAnnotation2
Do While Not swAnn Is Nothing
' 注記(Note)であり、かつ幾何公差の特性を持つものを特定
' ※実際にはAnnotationTypeやText内容から判定
If swAnn.GetType = swAnnotationType_e.swAnnotationType_e.swNote Then
Set swNote = swAnn.GetSpecificAnnotation
' 幾何公差特有のパターンを解析 (簡易的な実装例)
If IsGeometricTolerance(swNote.GetText) Then
Set tolFrame = ParseToleranceText(swNote)
Set tolFrame.AnnotationHandle = swAnn ' 後で赤字にするために保持
' 論理層へ渡してチェック
ValidateTolerance tolFrame
' 結果の反映
If Not tolFrame.IsValid Then
HighlightViolation swAnn, tolFrame.ErrorMessage
End If
End If
End If
Set swAnn = swAnn.GetNextAnnotation
Loop
Set swView = swView.GetNextView
Loop
End Sub
''' <summary>
''' テキストから幾何公差の構造を解析する (ここが解析の心臓部)
''' </summary>
Private Function ParseToleranceText(swNote As SldWorks.Note) As clsToleranceFrame
Dim newFrame As New clsToleranceFrame
Dim txt As String
txt = swNote.GetText
newFrame.RawText = txt
' --- ここに高度な正規表現や構文解析ロジックを実装する ---
' 例: "⏥ | 0.05 | A | B" のようなフォーマットを想定
' 本来はAPI経由でDatumのプロパティを直接取得するのが理想
' --------------------------------------------------
' 暫定的なパース例(実務では正規表現を使用せよ)
' newFrame.Symbol = ...
' newFrame.ToleranceValue = ...
Set ParseToleranceText = newFrame
End Function
''' <summary>
''' 違反箇所を赤字にする
''' </summary>
Private Sub HighlightViolation(swAnn As SldWorks.Annotation, msg As String)
' 色の変更(赤)
swAnn.Color = RGB(255, 0, 0)
' ログ出力(実務ではExcelやDBへ書き出す)
Debug.Print "Violation Found: " & msg
End Sub
4. 実務における「プロの設計」の要諦
4.1 ルールエンジンを外部化せよ
`ValidateTolerance` 関数の中に `If ToleranceValue > 0.05 Then` と直接書くことは、設計者として三流である。
プロは、ルールを Excelのマスターシート や JSONファイル に持たせる。
- `Symbol` | `MaxTolerance` | `RequiredDatums`
- `Parallelism` | `0.02` | `2`
VBAは起動時にこのマスターを読み込み、`Dictionary` オブジェクトに格納してメモリ上で高速に照合する。これにより、設計ルールが変更されても、ツールを再配布することなく運用が可能になる。
4.2 エラーハンドリングの極致
API操作、特に `GetNext` ループは、予期せぬオブジェクトの消失やメモリリークに対して極めて脆弱だ。
必ず `On Error GoTo ErrorHandler` を実装し、エラー発生時には 「どのビューの、どの注記で失敗したか」 を特定できるコンテキスト情報を保持するように設計せよ。
4.3 パフォーマンスの最適化
大量の図面をバッチ処理する場合、`swApp.Visible = False` だけでなく、`swApp.UserControl = False` を活用し、グラフィックスの更新を抑制することが、処理速度を数倍に跳ね上げる鍵となる。
結論
幾何公差の自動検図ツールは、単なる「便利ツール」ではない。それは、「設計品質をコードによって保証する」ための、エンジニアリング・インフラである。
APIを叩くことに終始せず、データの構造を理解し、ロジックを分離し、拡張性を担保する。この「設計思想」を持ってコードを書く者だけが、真に価値のある自動化を実現できる。
さあ、君のコードに、設計者の魂を込めろ。
