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

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

マクロ記録から「設計の守護神」へ:図面内の幾何公差を解析し、ルール違反を自動検知する極限のVBA術

こんにちは。設計自動化の世界へようこそ。

「マクロの記録」ボタンを押して、記録されたコードを眺めて「ふむふむ、こうやって動いているのか」と納得した。そこまでは素晴らしい一歩です。でも、もしあなたが「もっと複雑な判断をコンピュータにさせたい」「図面の中身を理解させたい」と願うなら、そこから先は「記録」ではなく「プログラミング」の領域になります。

今日のテーマは、単なる図面の自動生成ではありません。
「図面の中に書かれた幾何公差(GD&T)の文字列を解析し、社内の製図ルールに違反していないかを自動でスキャンする」という、極めて実戦的で、かつ高度なロジックに挑戦します。

「文字列を解析するなんて難しそう……」と身構える必要はありません。この記事を読み終える頃には、あなたはSolidWorks APIのオブジェクト構造を、まるで設計図のように透徹した目で捉えられるようになっているはずです。

さあ、一緒に「設計の守護神」を作る旅に出ましょう。

1. なぜ「マクロの記録」ではダメなのか?

まず、私たちが直面している壁を整理しましょう。

マクロの記録は、「座標(X, Y)に、この文字を書く」という結果の記録です。しかし、私たちがやりたいのは「この文字が『幾何公差のフレーム』であるかどうかを判定し、その中の数値がルール(例:0.1mm以下)に収まっているかを確認する」というプロセスの判断です。

これを実現するには、以下の3つのステップが必要になります。

1. 探索(Traversal): 図面内のすべての「ビュー」を巡り、その中にあるすべての「注記(Note)」を見つけ出す。
2. 識別(Identification): 見つけた注記が、ただの寸法なのか、それとも幾何公差のフレームなのかを判別する。
3. 解析(Parsing): 幾何公差の文字列(例:`[⌖|0.05|A]`)を分解し、記号、公差値、データムを抽出する。

この「解析」こそが、プロフェッショナルへの登竜門です。

2. SolidWorks APIの階層構造をマスターする

コードを書く前に、脳内に「オブジェクトの地図」を描いてください。SolidWorks VBAにおいて、図面を操作する際のルートは以下の通りです。

`SldWorks` (アプリ本体)
$\rightarrow$ `ModelDoc2` (開いている図面)
$\rightarrow$ `DrawingDoc` (図面特有の機能)
$\rightarrow$ `View` (各図面ビュー)
$\rightarrow$ `Note` (注記オブジェクト)
$\rightarrow$ `Annotation` (配置や表示の属性)

ここで重要な知見があります。「Noteは、中身(テキスト)を司り、Annotationは、その器(位置や表示形式)を司る」ということです。幾何公差のルールチェックでは、両方のオブジェクトを使いこなす必要があります。

3. 実装:幾何公差スキャナー

それでは、具体的なコードを見ていきましょう。
ここでは例として、「幾何公差の文字列の中に、公差値が 0.1 を超えるものがあったら警告を出す」というロジックを実装します。

※このコードは、幾何公差が `[記号|公差値|データム]` という独自の形式でテキスト入力されていることを想定したシミュレーションコードです。

Option Explicit

''' <summary>
''' 図面内の幾何公差をスキャンし、ルール違反(公差値 > 0.1)を検出する
''' </summary>
Sub ScanGeometricTolerances()
    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
    Dim noteText As String
    Dim toleranceValue As Double
    Dim violationCount As Integer
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 1. 図面ファイルが開かれているかチェック
    If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いてから実行してください。", vbCritical
        Exit Sub
    End If
    
    Set swDraw = swModel
    Set swView = swDraw.GetFirstView ' Sheet自体を指す最初のビューを取得
    violationCount = 0
    
    Debug.Print "--- スキャン開始 ---"

    ' 2. 全てのビューをループで回る
    Do While Not swView Is Nothing
        ' 3. ビュー内の注記(Note)をループ
        Set swNote = swView.GetFirstNote
        Do While Not swNote Is Nothing
            noteText = swNote.GetText
            
            ' 4. 幾何公差のパターンが含まれているか判定 (例: "[" で始まる場合)
            ' 本来は正規表現を使うのがベストですが、ここでは分かりやすさのために標準関数を使用
            If InStr(noteText, "[") > 0 And InStr(noteText, "|") > 0 Then
                
                ' 5. 文字列の解析 (Parsing)
                ' 文字列構造: [記号|公差値|データム] を想定
                ' 例: "[⌖|0.05|A]"
                On Error Resume Next
                toleranceValue = ParseToleranceFromText(noteText)
                On Error GoTo 0
                
                ' 6. ルール判定: 公差値が 0.1 を超えていたら違反
                If toleranceValue > 0.1 Then
                    violationCount = violationCount + 1
                    ' 違反箇所を特定するために、注記の位置を取得
                    Set swAnn = swNote.GetAnnotation
                    Debug.Print "【違反発見!】"
                    Debug.Print "  テキスト: " & noteText
                    Debug.Print "  公差値: " & toleranceValue
                    Debug.Print "  位置: X=" & swAnn.GetPosition(0) & " Y=" & swAnn.GetPosition(1)
                End If
            End If
            
            Set swNote = swNote.GetNext
        Loop
        
        Set swView = swView.GetNext
    Loop
    
    ' 7. 結果報告
    If violationCount > 0 Then
        MsgBox "スキャン完了。ルール違反が " & violationCount & " 件見つかりました。" & vbCrLf & _
               "詳細はイミディエイトウィンドウを確認してください。", vbExclamation
    Else
        MsgBox "スキャン完了。違反は見つかりませんでした。完璧です!", vbInformation
    End If
    
    Debug.Print "--- スキャン終了 ---"
End Sub

''' <summary>
''' 文字列から公差値を抽出するヘルパー関数
''' </summary>
Private Function ParseToleranceFromText(ByVal txt As String) As Double
    ' 文字列を "|" で分割する
    Dim parts() As String
    Dim i As Integer
    
    ' "[" と "]" を取り除いてから分割
    txt = Replace(txt, "[", "")
    txt = Replace(txt, "]", "")
    parts = Split(txt, "|")
    
    ' parts(0) = 記号, parts(1) = 公差値, parts(2) = データム
    ' 公差値が正しく数値として取得できるか確認
    If UBound(parts) >= 1 Then
        ParseToleranceFromText = CDbl(parts(1))
    Else
        ParseToleranceFromText = 0
    End If
End Function

4. プロの視点:ここが「差」がつくポイント

コードを読み解いてくれましたか? ここで、単なるプログラマーと、設計を理解したエンジニアの差が出る「極限の知見」を伝授します。

① 文字列解析(Parsing)の落とし穴

上記のコードでは `Split` 関数を使いました。これは非常に軽量で分かりやすいですが、実務では「半角スペースが混じっている」「記号が全角になっている」といったデータの揺らぎが必ず発生します。
実戦では、`VBScript.RegExp`(正規表現)ライブラリを使い、`\[.*\|(\d+\.?\d*)\|.*\]` のようなパターンで、ノイズを排除して確実に数値を抜き出す設計にするのがプロの流儀です。

② パフォーマンスの重み

図面には数千の注記が含まれることがあります。全てのビュー、全ての注記に対して重い処理を行うと、マクロがフリーズしたように見えてしまいます。

  • 対策: `swView.GetFirstNote` の前に、そのビューが「注記を持つタイプ(例えば寸法ビュー)」かどうかを事前に判定したり、解析が必要なキーワードが含まれているか `InStr` で高速にチェックしてから、重い解析ロジックへ進むように設計します。

③ オブジェクトのライフサイクル

`Set swAnn = swNote.GetAnnotation` の部分に注目してください。`Note` オブジェクトから `Annotation` を取得することで、初めて「画面上のどこにあるか」という空間情報にアクセスできます。
「データ(値)」をチェックするフェーズと、「位置(見た目)」を操作するフェーズを分離して考えることが、バグの少ないコードを書くコツです。

5. まとめ:次の一歩へ

今回のコードは、いわば「検品ロボット」の心臓部です。

1. 階層を辿り(View $\rightarrow$ Note)
2. 中身を読み取り(GetText)
3. ルールに照らし合わせる(Parsing & Logic)

この流れは、幾何公差に限らず、「寸法値が範囲内か?」「特定のレイヤーに配置されているか?」といった、あらゆる製図ルールチェックに応用可能です。

最初はエラーが出て当たり前です。エラーメッセージは、コンピュータからの「ここが分からないよ」という愛あるアドバイスです。それを一つずつ潰していく過程こそが、SolidWorks VBAを掌握する唯一の道です。

ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
さあ、次はあなたの設計ルールを、このコードに組み込んでみてください。応援しています!

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