2Dの殻を破り、3Dの魂に触れる —— DrawingからModelへ至る「双方向トラバーサル」の極意
こんにちは。技術の深淵へようこそ。
SolidWorks VBAの世界に足を踏み入れた皆さんの多くは、最初は「マクロの記録」という魔法からスタートします。ボタンを押して、何かが動く。それは素晴らしい第一歩です。しかし、ある時ふと、壁にぶつかるはずです。「図面上のこのビューから、モデル側のこの寸法を操作したいのに、どうやって辿ればいいんだ?」という壁に。
マクロの記録が生成するコードは、あくまで「その時、ユーザーがマウスで行った操作の断片」に過ぎません。オブジェクト同士の「血の繋がり(リレーションシップ)」を理解していないからです。
今日は、中級者から上級者へ脱皮するための最重要テーマ、「DrawingDoc(図面)からModelDoc2(3Dモデル)への双方向トラバーサル(探索)」について、その設計思想から実装までを伝授しましょう。ここをマスターすれば、あなたの作る自動化ツールは、単なる「記録の再生」から「知的なエージェント」へと進化します。
1. 概念の理解:図面は「窓」であり、モデルは「実体」である
まず、脳内にイメージ図を描いてください。
図面(`DrawingDoc`)は、それ自体が独立した物体ではありません。図面にある「ビュー(`View`)」は、3Dモデルという広大な宇宙を覗き込むための「窓」なのです。
多くの初心者が陥るミスは、図面を操作しようとして「図面ファイルの中」だけで解決しようとすることです。しかし、図面ビューに映っている寸法や形状の「真の所有者」は、背後にある3Dモデルです。
オブジェクトの階層構造(トラバーサルの地図)
私たちが目指すルートはこうです:
`DrawingDoc` $\rightarrow$ `Sheet` $\rightarrow$ `View` $\rightarrow$ `Referenced ModelDoc2` $\rightarrow$ `Feature/Dimension`
この `Referenced ModelDoc2` というプロパティこそが、2Dと3Dを繋ぐ「架け橋」になります。
2. 実装コード:ビューからモデルのフィーチャーを特定・ハイライトする
では、具体的なコードを見ていきましょう。
「図面上で選択したビューの背後にあるモデルを探し、そのモデル内の特定のフィーチャー(例:’Extrude1’)をハイライトする」という、実戦的なプログラムです。
Option Explicit
''' <summary>
''' 図面ビューから参照モデルを特定し、特定のフィーチャーをハイライトする
''' </summary>
Sub HighlightModelFeatureFromDrawing()
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 swRefModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim targetFeatName As String
' ターゲットとなるフィーチャー名を定義(実際はユーザー入力やリストから取得)
targetFeatName = "Extrude1"
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' --- STEP 1: コンテキストの確認 ---
' 現在開いているのが図面(Drawing)であるかを確認
If swModel Is Nothing Then Exit Sub
If swModel.GetType <> swDocDRAWING Then
MsgBox "図面ファイルを開いた状態で実行してください。", vbExclamation
Exit Sub
End If
Set swDraw = swModel
Set swSelMgr = swModel.SelectionManager
' --- STEP 2: 選択されたビューの取得 ---
' ユーザーが図面上のビューを選択していることを前提とする
Set swView = swSelMgr.GetSelectedObject6(1, -1)
If swView Is Nothing Then
MsgBox "図面上のビューを選択してから実行してください。", vbExclamation
Exit Sub
End If
' --- STEP 3: 【核心】ビューから参照モデルを逆引きする ---
' これが「双方向トラバーサル」の鍵となるプロパティです
Set swRefModel = swView.ReferencedModelDoc2
If swRefModel Is Nothing Then
MsgBox "このビューには参照モデルが存在しません。", vbCritical
Exit Sub
End If
' --- STEP 4: モデル内での操作 ---
' モデル内のフィーチャーを探す
Set swFeat = swRefModel.FirstFeature
Dim found As Boolean
found = False
' フィーチャーツリーを走査(トラバース)
Do While Not swFeat Is Nothing
If swFeat.Name = targetFeatName Then
' フィーチャーが見つかった!
found = True
' --- STEP 5: ユーザーへのフィードバック ---
' モデルをアクティブにして、見つかったフィーチャーを選択(ハイライト)する
' ※図面を表示したまま裏で操作することも可能ですが、視覚的な確認のためアクティブにします
swApp.ActivateDoc3 swRefModel.GetTitle, True, swRebuildOnActivation, 0
' モデル側でフィーチャーを選択状態にする
' Select4を使用することで、モデルのコンテキストで選択を実行できる
swFeat.Select4 False, Nothing
MsgBox "モデル内のフィーチャー '" & targetFeatName & "' を特定しました。", vbInformation
Exit Do
End If
Set swFeat = swFeat.GetNextFeature
Loop
If Not found Then
MsgBox "指定されたフィーチャー '" & targetFeatName & "' はモデル内に見つかりませんでした。", vbExclamation
End If
End Sub
3. プロの視点:ここをクリアすれば、あなたは「設計者」になれる
コードをただ写すだけでは不十分です。伝説的なエンジニアへの階段を登るために、以下の3つの「深層知識」を心に刻んでください。
① オブジェクトのライフサイクルとメモリ
上記のコードでは `swRefModel` という変数にモデルを格納しています。SolidWorks APIにおいて、参照モデルを操作する際は、そのモデルが「メモリ上にロードされているか」が極めて重要です。
`ReferencedModelDoc2` は、モデルが閉じられていても、図面が参照していればそのオブジェクトを返してくれます。しかし、そのモデルに対して重い計算(Rebuildなど)を指示する場合、モデルがバックグラウンドで開いている必要があることに注意してください。
② パフォーマンスの重み:ループの設計
コード内の `Do While Not swFeat Is Nothing` は、フィーチャーを一つずつ辿る「トラバーサル」です。
大規模なアセンブリの場合、このループは非常に重くなります。プロフェッショナルは、すべてのフィーチャーを回るのではなく、「名前が分かっているなら `swModel.FeatureByName(“名前”)` を直接叩く」、あるいは「特定のコンポーネント配下のみを探索する」といった、探索範囲の絞り込み(Pruning)を行います。
③ エラーハンドリングの哲学
`If swView Is Nothing Then` のようなチェックを「面倒だ」と感じてはいけません。
図面操作の自動化において、ユーザーの操作ミス(ビューを選んでいない、シートが間違っている等)は日常茶飯事です。「期待しない状態(Unexpected State)」をいかにエレガントに、かつ親切にユーザーへ伝えるか。 これが、ツールとしての完成度を分かつ境界線です。
最後に
図面からモデルへ、そしてモデルの深部へ。
この「道」を知ることは、SolidWorks APIという広大な大陸における、地図を手に入れることに似ています。
最初は複雑に見えるかもしれません。しかし、一つひとつのオブジェクトがどのような関係性で結ばれているかを意識しながらコードを書いていけば、必ず道は見えてきます。
「なぜこのオブジェクトが必要なのか?」
その問いを常に持ち続けてください。それが、あなたを真のエンジニアへと導く羅針盤になります。
応援していますよ。次は、さらに深い自動化の世界でお会いしましょう。
