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

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

幾何公差フレームの構造解析:製図ルール適合性を判定する自動スキャン・アーキテクチャ

製図の世界において、幾何公差(GD&T)は設計意図を伝える「究極の言語」である。しかし、その言語が正しく記述されているかを、熟練の設計者が一つずつ目視で確認しているとしたら、それはエンジニアリングにおける敗北を意味する。

大規模なプロジェクトにおいて、図面内の幾何公差フレーム(Tolerance Frame)の記述ミス、データム記号の欠落、あるいは社内規定に反する公差値の入力は、製造工程での致命的な誤解を招く。我々自動化エンジニアに課せられた使命は、単に「図面を作る」ことではない。「図面の品質を、数学的・論理的に保証する」ことにある。

本稿では、SolidWorksの図面(Drawing)ドキュメント内から幾何公差情報を抽出し、その構文(Syntax)を解析して、社内製図ルールへの適合性を判定する、極限まで最適化されたVBAアーキテクチャについて詳説する。

1. 幾何公差オブジェクトの正体と解析の困難性

SolidWorksにおいて、幾何公差は多くの場合 `Note` オブジェクト、あるいは特定の `Annotation` オブジェクトとして存在している。しかし、これらは単なる「文字列」として格納されていることが多く、その内部構造(公差記号、公差値、データム記号の順序)は、テキストとしてのパターンに依存している。

一般的なマクロ作成者が陥る罠は、`Note.GetText` で取得した文字列を単純に比較しようとすることだ。しかし、フォント、改行コード、特殊文字(Unicode)の扱い、さらには「公差値の後にデータムが続くべきか」といったセマンティクス(意味論)の検証には、単純な文字列比較では到底足りない。

我々は、文字列を「構造化されたデータ」として捉え、正規表現(Regular Expressions)を用いて、トークン化(Tokenization)を行う必要がある。

2. 高速・堅牢な解析エンジンの設計指針

数千個のアノテーションが存在する巨大なアセンブリ図面をスキャンする場合、パフォーマンスの低下とメモリリークは避けられない。以下の3つの原則を実装に組み込む。

1. COMオブジェクトのライフサイクル管理: `Set obj = Nothing` による明示的な解放を徹底し、参照カウントの増大を防ぐ。
2. 正規表現による構文解析: `VBScript.RegExp` を活用し、複雑な公差フレームのパターン(例:`[記号][公差値][データム]`)を高速に抽出する。
3. Windows APIによるプロセス制御: 大規模スキャン中にSolidWorksが「応答なし」状態になるのを防ぐため、OSレベルでメッセージループを処理するか、プロセスの優先度を制御する。

3. 実装:GD&T Compliance Scanner

以下に、幾何公差フレームを解析し、特定のルール(例:「位置度公差には必ずデータムが付随していること」)を検証するコア・ロジックを示す。

'---------------------------------------------------------------------------------------
' Module: GDnT_Compliance_Engine
' Author: Legendary Chief Architect
' Description: 図面内の幾何公差フレームを解析し、製図ルール違反を検出する
'---------------------------------------------------------------------------------------

Option Explicit

' Windows API: プロセスのメッセージを処理し、UIのフリーズを防止する

If VBA7 Then

Declare PtrSafe Sub DoEvents Lib "vbscript" ' 実際にはDoEventsで十分な場合が多いが、高度な制御には必要

Else

Declare Sub DoEvents Lib "vbscript"

End If

' 定数定義: 判定結果 Private Const STATUS_OK As String = "PASS" Private Const STATUS_ERROR_MISSING_DATUM As String = "FAIL: Missing Datum" Private Const STATUS_ERROR_INVALID_FORMAT As String = "FAIL: Invalid Syntax" ''' <summary> ''' 図面内の全ノートをスキャンし、幾何公差のルール違反を報告する ''' </summary> Public Sub ScanGeometricTolerances(swApp As SldWorks.SldWorks) Dim swModel As SldWorks.ModelDoc2 Dim swDraw As SldWorks.DrawingDoc Dim swSheet As SldWorks.Sheet Dim swView As SldWorks.View Dim swNote As SldWorks.Note Dim swAnn As SldWorks.Annotation Dim vNotes As Variant Dim i As Long Set swModel = swApp.ActiveDoc If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then MsgBox "図面ファイルを開いてください。", vbCritical Exit Sub End If Set swDraw = swModel Debug.Print "--- GD&T Compliance Scan Started ---" ' 全シートをループ Dim vSheetNames As Variant vSheetNames = swDraw.GetSheetNames Dim sheetName As Variant For Each sheetName In vSheetNames swDraw.ActivateSheet CStr(sheetName) Set swSheet = swDraw.GetCurrentSheet Debug.Print "Scanning Sheet: " & sheetName ' ビューをループ(図面内の全ビューを走査) Set swView = swDraw.GetFirstView ' FirstViewはシート自体を指す Do While Not swView Is Nothing ' ビュー内のノートを取得 vNotes = swView.GetNotes If Not IsEmpty(vNotes) Then For i = 0 To UBound(vNotes) Set swNote = vNotes(i) Set swAnn = swNote.GetAnnotation ' 幾何公差のパターンを持つノートを解析 ' ここでは簡易的に、特定の記号を含むものを対象とする If IsGeometricTolerance(swNote.GetText) Then AnalyzeToleranceFrame swNote End If ' メモリ最適化: 明示的な解放 Set swNote = Nothing Set swAnn = Nothing Next i End If Set swView = swView.GetNextView ' 大規模図面におけるUIフリーズ防止 DoEvents Loop Next sheetName Debug.Print "--- Scan Completed ---" End Sub ''' <summary> ''' ノートのテキストが幾何公差フレームの形式であるかを判定する ''' </summary> Private Function IsGeometricTolerance(ByVal txt As String) As Boolean ' 実際の運用では、ここに幾何公差特有のUnicode文字や記号の判定ロジックを記述 ' 例: 位置度記号のUnicode範囲などをチェック ' 今回はデモとして、特定のキーワードが含まれているかで判定 IsGeometricTolerance = (InStr(txt, "⌖") > 0 Or InStr(txt, "⌖") > 0) ' 位置度記号の例 End Function ''' <summary> ''' 公差フレームの構文を解析し、ルール適合性を判定する ''' </summary> Private Sub AnalyzeToleranceFrame(swNote As SldWorks.Note) Dim txt As String txt = swNote.GetText ' 正規表現オブジェクトの生成 (Microsoft VBScript Regular Expressions 5.5 参照が必要) Dim regEx As Object Set regEx = CreateObject("VBScript.RegExp") With regEx .Global = True .IgnoreCase = True ' パターン例: [記号][公差値][データム] を想定した正規表現 ' ここでは簡略化のため、記号の後に数値が続き、その後にデータム記号があるかをチェック .Pattern = ".*[0-9\.]+(?!\s[A-Z]).*" ' 数値の後に英字(データム)がないパターンを検出 End With Dim result As String Dim isViolation As Boolean ' --- ルール判定ロジック --- ' ルール1: 位置度(⌖)の場合、必ずデータム記号(A, B, C等)が末尾に存在すること If InStr(txt, "⌖") > 0 Then ' 正規表現で「数値の後にアルファベットが続いていない」ケースを検知 ' 実際にはもっと複雑なパースが必要 If Not regEx.Test(txt) Then result = STATUS_ERROR_MISSING_DATUM isViolation = True Else result = STATUS_OK isViolation = False End If Else result = STATUS_OK isViolation = False End If ' 結果の出力 If isViolation Then Debug.Print "[VIOLATION] Text: [" & txt & "] -> " & result Else Debug.Print "[PASS] Text: [" & txt & "]" End If ' メモリ解放 Set regEx = Nothing End Sub

4. アーキテクトの視点:メモリとパフォーマンスの極限

このコードを実用レベルに引き上げるには、単なるロジック以上の「配慮」が必要だ。

4.1. COMインターフェースのオーバーヘッド

`swView.GetNotes` は、ビュー内のノートを配列として一度に取得するため、個別に `GetFirstNote` を繰り返すよりも高速である。しかし、戻り値の `Variant` 配列はメモリ上にコピーを作成するため、数万個のノートを扱う場合は、メモリ消費量に注意しなければならない。

4.2. 正規表現のコンパイルコスト

`AnalyzeToleranceFrame` の中で毎回 `CreateObject(“VBScript.RegExp”)` を行うのは、プロフェッショナルとしては許されない。正規表現オブジェクトは、クラスモジュールのプライベート変数として一度だけインスタンス化し、再利用(Reuse)すべきである。これにより、ループ内でのオブジェクト生成コストを劇的に削減できる。

4.3. 64bit環境への適合性

現代のSolidWorksはほぼ100% 64bit環境である。Windows APIを使用する場合、`Declare PtrSafe` を用いた記述を徹底し、ポインタサイズ(`LongPtr`)を意識した設計にしなければ、レガシーな32bit環境からの移行時にシステムを崩壊させることになる。

5. 結言

図面自動検図システムの構築は、単なる「便利ツールの作成」ではない。それは、設計思想をコードに落とし込み、人間が介在することによる「ゆらぎ」を排除する、極めて高度なエンジニアリング・プロセスである。

幾何公差の構文解析をマスターすることは、図面という名の複雑なデータ構造を掌握することと同義である。この知見を武器に、設計品質の極限への挑戦を続けてほしい。

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