【入門編】【フィーチャー履歴の深掘り】GetFirstSubFeatureとGetNextFeatureによる複雑なツリー構造の再帰的解析 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksマクロの世界へようこそ。
マクロの記録ボタンを押して生成されたコードを眺める日々から、「そろそろ自分の手で本格的な自動化ツールを作りたい!」と一歩を踏み出したあなたへ。

今回は、SolidWorks VBAの真髄であり、多くの開発者が最初に壁を感じる「フィーチャー履歴の深掘りとツリー構造の再帰的解析」について、徹底的に分かりやすく解説していきます。

ここをクリアすれば、単なる「操作の再生」ではない、モデルの構造を理解して自律的に判断するスマートなマクロが書けるようになりますよ。しっかりついてきてくださいね!

1. なぜ「フィーチャーツリーの巡回」が必要なのか?

SolidWorksのモデル画面の左側にある「FeatureManagerデザインツリー」。
ここには、ベースとなるスケッチから、押し出し、フィレット、パターン、そしてアセンブリの構成に至るまで、設計の歴史(履歴)が美しい階層構造で詰まっていますよね。

例えば、こんな業務を自動化したいと思ったことはありませんか?

  • 「このモデルの中に、特定の名前を持つ特定のフィレットがいくつ含まれているか数えたい」
  • 「特定のカットフィーチャーの中に、隠れたサブフィーチャー(子フィーチャー)がぶら下がっているか判定したい」

人間であればツリーを目で見て「あ、ここにあるな」と分かりますが、VBAなどのプログラムにこれをやらせるためには、APIを使ってツリーの「親・子・兄弟」の関係を正しく辿るアルゴリズムを組む必要があります。

ここで登場するのが、`GetFirstSubFeature``GetNextFeature` という、ツリー探索の必須コンビです。

2. ツリー構造を紐解くためのAPIオブジェクトの基礎

SolidWorks APIでは、モデル(`ModelDoc2`)からフィーチャー(`Feature`)を取得し、そのフィーチャーを起点にして網の目のようにツリーを辿っていきます。

ここで知っておくべき「ツリーの歩き方」のルールは2つだけです。

1. 「兄弟(横のつながり)」を探す:`GetNextFeature`
同じ階層にある次のフィーチャーへ移動します。
2. 「子供(下の階層)」を探す:`GetFirstSubFeature`
あるフィーチャーの傘下にあるサブフィーチャー(子)の先頭を取得します。子を見つけたら、そこからさらに兄弟を辿ることで、どこまでも深い階層(再帰構造)に潜ることができます。

イメージとしては、「まず自分の隣の部屋(兄弟)を覗き、もし階段(子供)があれば地下室に降りて、そこでまた隣の部屋を順に覗いていく」という探偵の捜査手法に似ています。

3. 実践!フィーチャー履歴を再帰的に解析するVBAコード

百聞は一見に如かず。アクティブなドキュメントのフィーチャー履歴を根こそぎスキャンし、イミディエイトウィンドウに階層構造(インデント付き)で出力する実用的なマクロコードをプレゼントします。

そのままVBAエディタ(Alt + F11)に貼り付けて実行してみてください。

‘ ==============================================================================
‘ 【マクロ名】FeatureTreeRecursiveScanner
‘ 【概要】SolidWorksのフィーチャー履歴を再帰的に巡回し、構造を解析・出力する
‘ ==============================================================================
Sub FeatureTreeRecursiveScanner()

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2

‘ 1. アプリケーションとアクティブドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “エラー”
Exit Sub
End If

Debug.Print “=== フィーチャーツリー解析開始: ” & swModel.GetTitle & ” ===”

‘ 2. モデルの「最初のフィーチャー」を取得して再帰処理をキック
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FirstFeature

‘ ルートレベルの巡回関数を呼び出す
Call TraverseFeatures(swFeat, 0)

Debug.Print “=== フィーチャーツリー解析終了 ===”
MsgBox “フィーチャーの解析が完了しました。イミディエイトウィンドウを確認してください。”, vbInformation, “完了”

End Sub

‘ ——————————————————————————
‘ 【関数名】TraverseFeatures (再帰関数)
‘ 【引数】
‘ swFeature : 処理対象のフィーチャー
‘ depth : 階層の深さ(インデント用)
‘ ——————————————————————————
Sub TraverseFeatures(swFeature As SldWorks.Feature, ByVal depth As Integer)

‘ 循環参照やNothingの安全策
Do While Not swFeature Is Nothing

Dim featName As String
Dim featType As String
Dim indent As String

‘ インデントの生成(階層が深くなるほどスペースを空ける)
indent = String(depth 3, ” “)

‘ フィーチャーの名前とタイプを取得
featName = swFeature.Name
featType = swFeature.GetTypeName2

‘ 結果をイミディエイトウィンドウに出力
Debug.Print indent & “└─ [” & featType & “] ” & featName

‘ — 【重要】サブフィーチャー(子)が存在するか? —
Dim swSubFeat As SldWorks.Feature
Set swSubFeat = swFeature.GetFirstSubFeature

If Not swSubFeat Is Nothing Then
‘ 子が見つかった場合、階層(depth)を+1して自分自身を再帰呼び出し!
Call TraverseFeatures(swSubFeat, depth + 1)
End If

‘ — 次の兄弟フィーチャーへ移行 —
Set swFeature = swFeature.GetNextFeature

Loop

End Sub

コードのここがポイント!

  • 再帰呼び出し(Recursive Call): `TraverseFeatures` というプロシージャの中で、自分自身を呼び出しています。「子を見つけたら、その子を親に見立てて同じ処理を繰り返す」ことで、何階層の複雑なツリー構造であっても、数行のロジックで残らず網羅できます。
  • `GetTypeName2`: フィーチャーの名前(ユーザーが付けた名前)だけでなく、それが「Extrude(押し出し)」なのか「Fillet(フィレット)」なのかといったシステムの内部タイプ名を取得できます。これにより、特定のフィーチャー種別だけをピンポイントで抽出・判定できるようになります。

4. 陥りやすいエラーと知っておくべき注意点

上級者へのステップとして、現場で絶対にハマる「トラップ」についても共有しておきますね。

① `FirstFeature` と `FeatureManager` の罠

実は、SolidWorksのドキュメント直下にある `swModel.FirstFeature` は、モデリングの履歴だけでなく、材料定義や座標系、光源といった「非形状フィーチャー(システムが保持する内部データ)」も含めてすべて取得します。
もし「純粋にモデリングされた形状だけを対象にしたい」という場合は、取得したフィーチャーのタイプ名を条件分岐(`If featType = “BodyFolder”` や特定の除外処理など)で弾くフィルタリング技術が必要になってきます。

② 無限ループやメモリリークへの配慮

複雑なアセンブリや履歴の深いモデルで再帰処理を行う際、APIのオブジェクト解放(`Set swFeature = Nothing` など)を雑に扱うと、VBAのメモリ管理が追いつかずに重くなったり、最悪の場合は強制終了(クラッシュ)することがあります。
VBAではガベージコレクションが自動で行われますが、ループを抜ける際にはローカル変数を適切にクリアする意識を持つと、プログラミングのプロとしての精度がグッと上がります。

まとめ:ここをクリアすれば、SolidWorks VBAは怖くない!

今回は、`GetFirstSubFeature``GetNextFeature` を使った、フィーチャー履歴の深掘りと再帰的解析について解説しました。

  • ツリー構造は「兄弟(次)」と「子供(最初の子)」の組み合わせで全て辿れる。
  • 再帰関数を使うことで、無限に深い階層構造にもスマートに対応できる。
  • フィーチャーのタイプ名(`GetTypeName2`)を組み合わせることで、特定の条件に合致する部品や加工を自動検知できる。

このテクニックをマスターすれば、「指定した条件のフィーチャーがモデル内に存在するかチェックし、なければ自動追加する」といった、高度な設計支援マクロの骨組みが作れるようになります。

ここをクリアできれば、あなたのSolidWorks VBAスキルはもう初学者ではありません。自信を持って、次の自動化チャレンジに進んでくださいね!それでは、また次回のテック解説でお会いしましょう。バッチリ決めていきましょう!

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