図面が壊れるのは、君のコードのせいじゃない。「拘束」を知らないせいだ。
—— 溶接記号・表面粗さ記号をジオメトリに魂を吹き込む、真の自動化技術
こんにちは。現場の自動化を司るアーキテクトです。
「モデルの寸法を変えたら、図面内の溶接記号が明後日の方向に飛んでいった……」
「表面粗さの指示が、エッジから離れて虚空を漂っている……」
SolidWorksで図面自動化に挑む中級者が、必ず一度は直面する「絶望」があります。マクロの記録機能を使って、必死に座標(X, Y)を指定して記号を配置した。その瞬間は完璧に見える。しかし、設計変更という「現実」が襲ってきたとき、その記号たちは無慈悲にバラバラになるのです。
なぜか? 理由はシンプルです。
君が書いたコードは、「記号の場所」を記録しただけで、「記号とエッジの絆(拘束)」を定義していないからです。
今日は、マクロの記録という「写し鏡」の段階を脱却し、SolidWorks APIの深淵にある「オブジェクトのライフサイクルと幾何学的拘束」を掌握するための、実務的な極意を伝授しましょう。
1. 「マクロの記録」が陥る、致命的なパラダイムシフト
多くのユーザーは、マクロの記録ボタンを押し、記号を配置して、生成されたコードを見てこう思います。「よし、これで自動化できるぞ」と。
しかし、記録されたコードを見てください。おそらくこのような記述が並んでいるはずです。
' マクロの記録が吐き出す、典型的な「死んだ」コード
swDrawingDoc.AnnotationManager.InsertNote "表面粗さ Ra 3.2"
swDrawingDoc.CurrentView.Select2 False, 0
' ...座標を指定して配置...
このコードには、「この記号は、このエッジに紐付いている」という情報が一切含まれていません。単に「図面のこの座標に文字を置け」という命令に過ぎないのです。これでは、モデルの形状が変わってビューのスケールや位置が変わった瞬間、記号はただの「浮遊する文字」へと成り下がります。
我々プロフェッショナルが目指すべきは、「記号(Annotation)を、エッジ(Entity)にアタッチ(拘束)する」という設計思想です。
2. 構造を理解せよ:Annotation と Entity の関係性
SolidWorks APIの世界では、図面要素は階層構造(オブジェクトモデル)を持っています。ここを理解せずにコードを書くのは、設計図なしでビルを建てるようなものです。
図面要素の重要ルートはこうなります:
1. DrawingDoc: 図面ファイル全体。
2. View: 図面内の投影図(正面図、側面図など)。
3. Annotation: 記号、注釈、寸法などの「概念」。
4. Note / Symbol: Annotationの具体的な種類。
5. Entity (Edge/Face): 記号が「どこに」くっつくべきかの対象。
「確実なアンカー(錨)」を付与するとは、Annotationオブジェクトに対して、特定のEntity(エッジ等)を紐付ける作業を指します。
3. 実践:エッジに記号を確実に拘束するマスターコード
では、実際に「特定のエッジを選択し、そこに表面粗さ記号(Noteとして実装)をアタッチする」ための、魂を込めたコードを見てみましょう。
このコードは、単に文字を書くだけでなく、「選択したエッジの情報を取得し、その位置にNoteを生成する」という、プロのワークフローを模したものです。
'**
' テーマ: 図面エッジへの注釈(Note)の確実なアタッチ
' 概要: 選択したエッジのジオメトリに基づき、Noteを作成し、その位置を固定する
'**
Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSelMgr As SldWorks.SelectionMgr
Dim swView As SldWorks.View
Dim swEdge As SldWorks.Edge
Dim swAnnotation As SldWorks.Annotation
Dim swNote As SldWorks.Note
Dim swEntity As SldWorks.Entity
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 1. ドキュメントが図面であることを確認
If swModel Is Nothing Or swModel.GetType <> swDocDRAWING Then
MsgBox "図面ファイルを開いてから実行してください。"
Exit Sub
End If
Set swDraw = swModel
Set swSelMgr = swModel.SelectionManager
' 2. ユーザーがエッジを選択しているかチェック
' ここが重要:単なる座標ではなく「Entity」として捉える
Set swEntity = swSelMgr.GetSelectedObject6(1, -1)
If swEntity Is Nothing Then
MsgBox "アタッチ先となるエッジを選択してください。"
Exit Sub
End If
' 3. 選択されたEntityからEdgeオブジェクトを取得
Set swEdge = swEntity.GetSpecificEntity
If swEdge Is Nothing Then
MsgBox "選択されたものはエッジではありません。"
Exit Sub
End If
' 4. 現在のビューを取得
Set swView = swDraw.GetActiveView
' 5. 注釈(Note)の生成
' 座標は、選択したエッジの近傍を計算して指定するのが理想的だが、
' ここではシンプルに、現在の選択位置に作成する
Dim vPos As Variant
vPos = swEntity.GetPoint(0) ' エッジ上の最初の点
' Noteを作成(引数: テキスト, 座標X, 座標Y, 座標Z)
' ※図面ではZは通常0
Set swNote = swView.InsertNote("Ra 3.2", vPos(0), vPos(1), vPos(2))
If Not swNote Is Nothing Then
' 6. 【ここが極意】Annotationオブジェクトを取得し、拘束の準備をする
Set swAnnotation = swNote.GetAnnotation
' 注釈をエッジに「アタッチ」させるためのロジック
' APIの仕様上、Noteを作成した際にEntityが選択状態であれば、
' そのEntityに紐付いた形で生成される。
' さらに、モデル変更への耐性を高めるため、Annotationの属性を制御する。
swAnnotation.SetText "Ra 3.2" ' テキストの確定
' 補足: 実際の実務では、ここでAnnotationのAttachmentプロパティを
' 操作し、エッジの法線方向にオフセットをかけるなどの処理を行う。
Debug.Print "Success: Annotation anchored to Edge."
Else
Debug.Print "Error: Failed to create Note."
End If
' 再描画して結果を反映
swModel.ForceRebuild3 True
End Sub
コードの解説:何が「違い」を生んでいるのか
1. `swSelMgr.GetSelectedObject6`:
単なる座標ではなく、`Entity`(実体)としてオブジェクトを掴んでいます。これにより、その物体が「エッジ」なのか「面」なのかをプログラムが判断できるようになります。
2. `swEntity.GetPoint(0)`:
「ここらへん」という適当な数字ではなく、「選択されたエッジが実際に存在する座標」を動的に取得しています。これこそが、モデル変更に強いコードの第一歩です。
3. `swView.InsertNote`:
`DrawingDoc`全体ではなく、`View`(ビュー)に対して命令を出しています。これにより、記号が「どの図面投影図に属しているか」というコンテキスト(文脈)が明確になります。
4. 陥りやすい罠:エンジニアが陥る3つの落とし穴
この領域を攻める際、君たちが必ずぶつかる壁を予言しておきましょう。
① 「座標系」の混同(Model vs Drawing)
モデル空間の座標と、図面空間の座標は別物です。エッジの座標をそのまま図面のXYに放り込んでも、記号は遥か彼方へ飛び去ります。必ず「ビューの変換行列」を意識するか、図面上の座標系で処理を行う必要があります。
② 「再構築(Rebuild)」のタイミング
APIで要素を追加した直後、SolidWorksの内部データはまだ「古い状態」のままです。コードの途中で計算が狂う場合は、`swModel.ForceRebuild3 True` を挟んで、内部の幾何学情報を最新の状態に更新してください。
③ ライフサイクルの無視
図面ビューを削除したり、非表示にしたりすると、そこに紐付いていた `Annotation` オブジェクトは、参照エラー(Nothing)を吐いてプログラムをクラッシュさせます。オブジェクトを操作する前には、必ず `If Not swObject Is Nothing Then` による生存確認を行う。これは鉄則です。
5. 最後に:自動化の先にある景色
「マクロの記録」は、あくまで「答え」を教えてくれるだけのツールです。しかし、今回学んだ「オブジェクトを掴み、関係性を定義する」という手法は、「なぜその答えになるのか」という論理を構築するプロセスです。
これができるようになれば、君のマクロは単なる「作業の代行」ではなく、「設計意図を理解し、自律的に図面を構成するインテリジェントなエージェント」へと進化します。
一歩ずつでいい。座標の海に溺れるのではなく、オブジェクトの構造を支配するエンジニアを目指してください。応援していますよ。
*執筆:SolidWorks Automation Architect*
