マクロの記録を卒業せよ:データベース駆動型「自動アノテーションエンジン」への招待
こんにちは。設計自動化の深淵へようこそ。
「マクロの記録」ボタンを押して、録画されたコードを眺めて「うわぁ、座標が `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)を取得し、そのベクトルに対して垂直な平面上に記号を配置する……。そんな数学的なアプローチが、あなたの自動化エンジンを「単なるツール」から「インテリジェントなシステム」へと昇華させます。
一歩ずつ、着実に。コードの裏側にある物理的な意味を考えながら、実装を進めてみてください。君ならできる。応援していますよ。
