【実務・中級編】【上級プロ向け】図面内幾何公差(Geometric Tolerance)フレームの構文解析と社内製図ルール違反の自動スキャンVBA – SolidWorks VBA解析バイブル

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

図面検図の自動化:幾何公差(GD&T)フレームの構文解析による製図ルール違反の自動スキャン

「図面を確認してください。公差の記号が抜けています」「データムの指定順序がルールと違います」

設計現場で繰り返されるこれらの指摘。検図者が目視で行うにはあまりにコストが高く、ヒューマンエラーの温床となっている。多くのエンジニアは「SolidWorksのAPIを使えば図面のテキストが取れる」と安易に考えるが、そこに大きな落とし穴がある。

幾何公差(GD&T)フレームは、単なる「文字列」ではない。それは構造化されたデータである。

本稿では、単なるテキスト抽出のレベルを超え、幾何公差フレームの構文を解析(パーシング)し、社内製図ルールとの適合性を判定する「堅牢な自動検図エンジン」を構築するためのアーキテクチャを伝授する。

1. なぜ「単なるテキスト抽出」では失敗するのか

初心者が陥る最大の罠は、`Note.GetText` で取得した文字列をそのまま `If text = “…” Then` と比較しようとすることだ。

幾何公差フレームは、フォント、文字間隔、あるいは特殊記号($\perp$, $\parallel$, $\bigcirc$ 等)のエンコードによって、見た目が同じでも内部的な文字列構造が異なることが多々ある。また、一つのフレームが複数のNoteオブジェクトに分割されて格納されているケースも存在する。

プロフェッショナルの設計思想:
1. 分離(Decoupling): SolidWorks APIから「生のデータ」を取り出す層と、そのデータを「意味のある構造体」に変換する層、そして「ルールを判定する」層を完全に分離せよ。
2. 正規表現(Regex)の活用: 文字列のパターンマッチングには、手書きの `Left` や `Mid` 関数ではなく、必ず正規表現エンジンを使用せよ。
3. 状態遷移(State Machine): 複雑な公差記号の並びは、単一の正規表現ですべてを解決しようとせず、トークナイザー(字句解析器)の概念を取り入れるべきである。

2. 実装アーキテクチャ:3レイヤー構造

堅牢なツールを作るために、以下の3層構造で設計する。

1. Data Acquisition Layer (SolidWorks API)

  • 図面内の全 `Note` および `Dimension` を走査し、生テキストを抽出する。

2. Parsing Layer (Logic Engine)

  • 抽出した文字列を、`ToleranceFrame` という独自のオブジェクト(クラス)に変換する。
  • 例: `[記号: 平行度, 公差値: 0.05, データム: A, B]` という構造体を作る。

3. Rule Validation Layer (Compliance Checker)

  • 作成されたオブジェクトを、社内規定(CSVやJSONで管理)と比較する。

3. プロダクションコード例

以下に、解析の核となるクラスモジュールと、メインの実行ロジックの設計例を示す。ここでは保守性を高めるため、解析ロジックをクラスに切り出している。

クラスモジュール: `clsToleranceFrame`

このクラスは、解析された公差情報を保持する。

' Class Module: clsToleranceFrame
Option Explicit

Public Symbol As String        ' 幾何公差記号 (例: PARALLELISM)
Public ToleranceValue As Double ' 公差値 (例: 0.05)
Public DatumPrimary As String  ' 第1データム
Public DatumSecondary As String ' 第2データム
Public IsValidFormat As Boolean ' 構文として成立しているか

' 構文解析メソッド
' 本来はここで正規表現を用いて、文字列を分解する
Public Sub Parse(ByVal rawText As String)
    Dim regEx As Object
    Set regEx = CreateObject("VBScript.RegExp")
    
    ' 例: 「// 0.05 A B」のような簡易的なパターンを想定
    ' 実際にはより複雑な正規表現が必要
    regEx.Pattern = "([\u2223\u2225\u25CB].*?)?\s?([\d\.]+)\s+([A-Z])\s?([A-Z])?"
    regEx.Global = False
    
    Dim matches As Object
    Set matches = regEx.Execute(rawText)
    
    If matches.Count > 0 Then
        IsValidFormat = True
        ' matches(0).SubMatches(1) -> 公差値
        ' matches(0).SubMatches(2) -> 第1データム
        ' ...以下、解析ロジックを実装
    Else
        IsValidFormat = False
    End If
End Sub

標準モジュール: `modDrawingChecker`

メインの走査ロジック。エラーハンドリングを徹底し、一つのエラーで全体を止めない。

' Standard Module: modDrawingChecker
Option Explicit

Sub Main()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swView As SldWorks.View
    Dim swNote As SldWorks.Note
    Dim swAnn As SldWorks.Annotation
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 1. 図面ファイルかどうかのガード節
    If swModel Is Nothing Then Exit Sub
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いてください。", vbCritical
        Exit Sub
    End If
    
    Set swDraw = swModel
    Set swView = swDraw.GetFirstView ' Sheet自体を取得
    
    Debug.Print "--- 検図開始 ---"
    
    ' 2. ビューの走査
    Do While Not swView Is Nothing
        ' 3. ビュー内の注釈(Note)を走査
        Set swNote = swView.GetFirstNote
        Do While Not swNote Is Nothing
            On Error GoTo ErrorHandler ' 個別の注釈エラーで止まらないようにする
            
            ProcessNote swNote
            
            Set swNote = swNote.GetNext
        Loop
        
        Set swView = swView.GetNextView
    Loop
    
    Debug.Print "--- 検図完了 ---"
    Exit Sub

ErrorHandler:
    Debug.Print "Error encountered in Note: " & Err.Description
    Resume Next
End Sub

Private Sub ProcessNote(ByRef swNote As SldWorks.Note)
    Dim rawText As String
    Dim frame As New clsToleranceFrame
    
    rawText = swNote.GetText
    
    ' 幾何公差特有の文字列パターンが含まれているか判定(簡易判定)
    ' 実際には特定の記号の有無や、特定の文字長でフィルタリングする
    If IsPotentialTolerance(rawText) Then
        frame.Parse rawText
        
        If frame.IsValidFormat Then
            ' 4. ルール照合 (Rule Validation)
            ValidateAgainstRules frame
        Else
            Debug.Print "[警告] 構文エラー: " & rawText
        End If
    End If
End Sub

Private Function IsPotentialTolerance(ByVal txt As String) As Boolean
    ' 幾何公差フレーム特有のパターン(記号やデータムの並び)を判定
    ' ここでは例として、特定の記号が含まれているかを確認
    ' 実際には正規表現で「数字 + アルファベット」のパターンを探す
    IsPotentialTolerance = (InStr(txt, " ") > 0) ' 簡易的な判定
End Function

Private Sub ValidateAgainstRules(ByRef frame As clsToleranceFrame)
    ' ここに「社内ルール」を記述する
    ' 例:公差値が0.01未満は禁止、など
    If frame.ToleranceValue < 0.01 Then
        Debug.Print "[ルール違反] 公差値が小さすぎます: " & frame.ToleranceValue
    End If
    
    ' データムの欠落チェックなど
    If frame.DatumPrimary = "" Then
        Debug.Print "[ルール違反] 第1データムが指定されていません。"
    End If
End Sub

4. 実務における「極限の知見」

このコードをプロダクション環境に投入する際、以下の3点に留意せよ。

① 外部設定ファイル(Single Source of Truth)の導入

`ValidateAgainstRules` 内に `If frame.ToleranceValue < 0.01 Then` とハードコーディングするのは、二流の仕事だ。ルールは常に変化する。 ルールは CSV または JSON ファイルとして外部に保持し、実行時に読み込む設計にせよ。これにより、エンジニアがVBAコードを書き換え、再コンパイル・再配布するという無駄なプロセスを排除できる。

② パフォーマンスの重み

数千個のアノテーションを持つ大規模図面において、すべての `Note` に対して重い正規表現を回すと、SolidWorksがフリーズしたかのような挙動を示す。
まず、`swNote.GetText` で取得した文字列の「長さ」や「特定の文字の有無」で高速なフィルタリング(Short-circuit evaluation)を行い、疑わしいオブジェクトに対してのみ、重い解析ロジック(Regex)を適用するのが鉄則だ。

③ データの「確からしさ」の管理

APIで取得したテキストは、あくまで「表示されている文字列」に過ぎない。
もし、幾何公差が「寸法(Dimension)」の付帯情報として埋め込まれている場合、`Note` オブジェクトではなく `Dimension` オブジェクトを辿らなければならない。
「どこにデータが格納されているか」というオブジェクトのライフサイクルと階層構造を完全に把握しておくことが、バグのない堅牢なツールへの唯一の道である。

結論

自動検図ツールの真価は、単にミスを見つけることではなく、「設計者が意図したルールに基づいているかを、機械的に証明すること」にある。

今回示した「解析レイヤーの分離」と「正規表現による構造化」の設計思想を武器に、単なる便利ツールを超えた、エンジニアリング・インフラとしての自動化ツールを構築してほしい。

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