幾何公差フレームの構造解析:製図ルール適合性を判定する自動スキャン・アーキテクチャ
製図の世界において、幾何公差(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. 結言
図面自動検図システムの構築は、単なる「便利ツールの作成」ではない。それは、設計思想をコードに落とし込み、人間が介在することによる「ゆらぎ」を排除する、極めて高度なエンジニアリング・プロセスである。
幾何公差の構文解析をマスターすることは、図面という名の複雑なデータ構造を掌握することと同義である。この知見を武器に、設計品質の極限への挑戦を続けてほしい。
