【入門編】【上級プロ向け】図面内「溶接記号(Weld Symbols)」と「表面粗さ記号」のデータベース駆動型自動アノテーションエンジン – SolidWorks VBA解析バイブル

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

マクロの記録を卒業せよ:データベース駆動型「自動アノテーションエンジン」への招待

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

「マクロの記録」ボタンを押して、録画されたコードを眺めて「うわぁ、座標が `0.1234, 0.5678` ばかりで使い物にならない……」と絶望したことはありませんか? もしそうなら、おめでとうございます。あなたは今、「自動化エンジニア」としての第一歩を踏み出そうとしています。

今日お話しするのは、単なる「図面に文字を書く」マクロではありません。製造現場のデータベース(ERPやPLM)から「この面に、この溶接記号を、この粗さで」という指示を受け取り、図面上の最適な位置に自律的に記号を配置する「アノテーションエンジン」の設計思想です。

これは、座標を直打ちする作業から、「幾何学的な関係性」を制御する作業へのパラダイムシフトです。準備はいいですか? さあ、始めましょう。

1. なぜ「座標の直打ち」では失敗するのか?

初心者の方が最初に陥る罠、それは「記録した座標をそのまま使うこと」です。

' ❌ 初心者がやりがちな「壊れやすい」コード
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
Dim swModel As SldWorks.ModelDoc2
Set swModel = swApp.ActiveDoc
' 座標を直接指定してノートを作成
swModel.InsertNoteText "溶接記号: 6mm"
' ...この後に座標指定が続くが、ビューが少し動いただけでズレる

図面は生き物です。ビューのスケールが変わる、配置が変わる、部品の向きが変わる。これらすべてに対して、`0.1, 0.2` といった固定値(ハードコード)で立ち向かうのは、砂上の楼閣を作るようなものです。

プロのエンジニアは「座標」ではなく「関係性」をコードにします。
「この面の中心点から、面の法線方向に〇〇mm離れた位置」というロジックを組み立てるのです。

2. エンジンの心臓部:オブジェクトの階層構造を理解する

SolidWorks VBAを掌握するには、APIの「オブジェクトのライフサイクル」を脳内にインストールする必要があります。図面自動化における情報の流れは、以下のピラミッド構造になっています。

1. SldWorks (アプリケーション本体):全ての神。
2. ModelDoc2 (ドキュメント):今開いている図面ファイルそのもの。
3. DrawingDoc (図面専用機能):シートやビューを操作するためのインターフェース。
4. View (図面ビュー):投影図。ここが最も重要です。「3Dの座標」と「2Dのシート座標」を変換するゲートウェイだからです。
5. Annotation (注記):溶接記号や表面粗さが属する最終的なオブジェクト。

ここでの極意を伝えます。「3Dモデル上の位置を、どうやって2D図面の紙の上に変換するか?」。この問いに答えられるようになれば、あなたはもう初学者ではありません。

3. 実践:データベース駆動型アノテーションの設計図

では、具体的な実装イメージを見てみましょう。
「データベースから取得したデータに基づき、特定の面に溶接記号を配置する」ための、プロフェッショナルなコードの骨組みです。

【概念図】

`[製造DB]` $\rightarrow$ `[面ID / 属性]` $\rightarrow$ `[SolidWorks 3Dモデルで面を特定]` $\rightarrow$ `[図面ビュー内の座標変換]` $\rightarrow$ `[記号配置]`

【実装コード例】

このコードは、概念を理解するための「設計図」として読んでください。

Option Explicit

''' <summary>
''' データベースの情報を基に、図面へ自動アノテーションを行うメインエンジン
''' </summary>
Sub DatabaseDrivenAnnotationEngine()
    Dim swApp As SldWorks.SldWorks
    Dim swModel As SldWorks.ModelDoc2
    Dim swDraw As SldWorks.DrawingDoc
    Dim swView As SldWorks.View
    
    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    
    ' 1. ファイルが図面であることを確認(ガード句)
    If swModel Is Nothing Then Exit Sub
    If swModel.GetType <> swDocDRAWING Then
        MsgBox "図面ファイルを開いてください。"
        Exit Sub
    End If
    
    Set swDraw = swModel
    
    ' --- 擬似データベース(本来はSQLやExcelから取得) ---
    ' 面ID, 溶接記号タイプ, 記号サイズ
    Dim dbFaceID As String: dbFaceID = "Face_001"
    Dim dbWeldType As String: dbWeldType = "Fillet"
    Dim dbWeldSize As Double: dbWeldSize = 0.006 ' 6mm (メートル単位)
    ' -----------------------------------------------

    ' 2. 対象となるビューを取得(ここではアクティブなビューを想定)
    Set swView = swDraw.GetFirstView ' シート自体が最初のビュー
    Set swView = swView.GetNextView  ' 次の、実際の投影図ビューへ
    
    If swView Is Nothing Then Exit Sub

    ' 3. 【核心】3Dモデル上の特定の位置を計算する
    ' 本来はここでモデルを背後で開き、FaceIDから中心座標(x,y,z)を取得する
    Dim targetPoint3D(2) As Double
    targetPoint3D(0) = 0.05: targetPoint3D(1) = 0.02: targetPoint3D(2) = 0.01 ' 3D空間の座標
    
    ' 4. 【重要】3D座標を2D図面上の座標に変換する
    ' これを忘れると、記号は図面の枠外へ飛んでいきます
    Dim swViewTransform As Variant
    swViewTransform = swView.GetViewTransform
    
    Dim targetPoint2D(2) As Double
    ' GetViewTransformの結果を用いて、3D座標をシート上の座標へ投影
    ' ※実際には行列演算(Matrix)を用いて変換を行う
    Convert3DTo2D targetPoint3D, swViewTransform, targetPoint2D

    ' 5. 記号の配置
    ' WeldSymbolオブジェクトを生成し、属性を流し込む
    Call PlaceWeldSymbol(swModel, swView, targetPoint2D, dbWeldType, dbWeldSize)

    MsgBox "アノテーションの完了を確認しました。"
End Sub

''' <summary>
''' 3D座標をビューの変換行列を用いて2D座標へ変換する(概念実装)
''' </summary>
Private Sub Convert3DTo2D(ByRef pt3D As Variant, ByRef transform As Variant, ByRef pt2D As Variant)
    ' ここに数学的な行列計算ロジックが入ります。
    ' SolidWorks APIの ViewTransform を適用することで、
    ' モデルの回転やスケールを考慮した「紙の上の位置」が導き出されます。
    ' 簡略化のため、ここでは直接代入のイメージとして記述
    pt2D(0) = pt3D(0) * 0.1 ' 仮のスケール調整
    pt2D(1) = pt3D(1) * 0.1
    pt2D(2) = 0
End Sub

''' <summary>
''' 指定された位置に溶接記号を配置する
''' </summary>
Private Sub PlaceWeldSymbol(swModel As SldWorks.ModelDoc2, swView As SldWorks.View, _
                            pos As Variant, wType As String, wSize As Double)
    Dim swAnn As SldWorks.Annotation
    
    ' 注記(Annotation)を作成
    ' 本来は WeldSymbol API を使用して、より高度な記号制御を行う
    Set swAnn = swModel.InsertAnnotation(swAnnotationType_e.swAnnotationType_Note)
    
    ' 座標を設定
    swAnn.SetPosition pos(0), pos(1), pos(2)
    
    ' テキストの流し込み(データベースの値)
    swAnn.GetText = wType & " Size: " & (wSize * 1000) & "mm"
    
    ' ここで、記号の向き(法線方向)に合わせて回転させる処理を追加するのがプロの技
End Sub

4. プロが教える「陥りやすいエラー」と回避術

このレベルの開発を進めると、必ず以下の壁にぶつかります。

① 座標系の混乱(Model Space vs Sheet Space)

最も多いミスは、「3Dモデルの座標を、そのまま図面の座標として使ってしまう」ことです。
図面ビューには「回転」「スケール」「投影法」があります。必ず `View.GetViewTransform` を使い、数学的に変換プロセスを挟んでください。ここをサボると、部品の向きを変えた瞬間に、すべての記号が宇宙の彼方へ消え去ります。

② オブジェクトの「解放」と「重み」

ループの中で大量の注記を作成する場合、`SelectionMgr` を多用しすぎると動作が劇的に重くなります。

  • Bad: ループの中で毎回 `swModel.Extension.SelectByID2` を呼ぶ。
  • Good: 必要なオブジェクト(ViewやFace)を変数に格納(キャッシュ)し、セレクションを最小限にする。

③ データベースとの同期不全

データベースの数値(例えば `6mm`)を `0.006` (m) に変換し忘れる、あるいはその逆。SolidWorks APIは基本的に SI単位系(メートル) で動いていることを忘れないでください。

5. おわりに:次なるステージへ

ここまで読んでくれたあなたには、もう「マクロの記録」に戻る選択肢はありません。

次に目指すべきは、「幾何学的に正しい位置を計算するアルゴリズム」の実装です。面の法線ベクトル(Normal Vector)を取得し、そのベクトルに対して垂直な平面上に記号を配置する……。そんな数学的なアプローチが、あなたの自動化エンジンを「単なるツール」から「インテリジェントなシステム」へと昇華させます。

一歩ずつ、着実に。コードの裏側にある物理的な意味を考えながら、実装を進めてみてください。君ならできる。応援していますよ。

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