【テクニカル・上級編】【初心者向け】FeatureManagerからパーツ内のフィーチャ一覧をイミディエイトウィンドウに出力する – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの深淵:FeatureManagerを「走査」するということ

SolidWorks APIを操る者は、単にコマンドを叩くのではない。FeatureManager Design Treeという名の「オブジェクトの階層構造」を正確にナビゲートし、メモリを浪費せずに必要な情報だけを抽出する。それが、我々エンジニアに課せられた責務だ。

今回は、初心者がまず最初に直面する「フィーチャ一覧の取得」を題材に、長年現場で培ってきた「沈まないコード」の書き方を伝授する。

なぜ、単純なループではいけないのか

多くの入門書は、`GetFirstFeature`と`GetNextFeature`を使って再帰的にツリーを回れと教えるだろう。それは間違いではない。だが、大規模なアセンブリや履歴の深いパーツでそれを実行したとき、メモリリークや意図せぬ例外に悩まされたことはないか?

VBA(COM)の世界では、オブジェクトの参照を保持しすぎると、SolidWorksのプロセスを硬直させる。「掴んだら離す」。この原則を徹底しなければ、巨大な自動化システムは構築できない。

実装:FeatureManagerを走査する堅牢なコード

以下のコードは、単に名前を出すだけではない。`IFeature`オブジェクトを適切に解放し、再帰処理におけるスタックオーバーフローを避けるための構成としている。

Option Explicit

‘ 伝説的なエンジニアは、常に最小限のスコープで変数を管理する
Public Sub ExportFeatureList()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ ドキュメントが存在しない場合のガード節
If swModel Is Nothing Then Exit Sub

‘ フィーチャツリーの最上位を取得
Set swFeat = swModel.FirstFeature

Debug.Print “— Feature List Start —”

‘ 巡回処理
Do While Not swFeat Is Nothing
‘ フィーチャ名とタイプを表示
‘ GetTypeName2は内部的な定義名を返すため、UI上の表示名と混同しないこと
Debug.Print “Name: ” & swFeat.Name & ” | Type: ” & swFeat.GetTypeName2

‘ 次のフィーチャを取得
Set swFeat = swFeat.GetNextFeature

‘ 重要な知見: 巨大なツリーを回す際は DoEvents を挟むべき場合がある
‘ ただし多用はパフォーマンスを落とすため、UIのフリーズ回避目的でのみ使用せよ
Loop

Debug.Print “— Feature List End —”

‘ オブジェクトの明示的解放(VBAでは推奨される儀式)
Set swFeat = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

シニアエンジニアが押さえるべき3つの技術的要諦

1. `GetTypeName2` の重要性

`Name` プロパティはユーザーが変更可能だが、`GetTypeName2` はシステム内部で一意に定義された文字列を返す。システム連携(例えば、特定のカットフィーチャだけを抽出してDBへ送る処理)を行う際、条件分岐には必ず `GetTypeName2` を使用すること。

2. メモリ管理の「沈黙の掟」

VBAのガベージコレクションは頼りにならない。`Set swFeat = Nothing` を明示的に呼び出すことは、SolidWorksのプロセス管理を安定させるための「作法」だ。複雑な再帰構造(サブフィーチャを持つスケッチ等)を扱う場合は、参照カウンタを常に意識して設計せよ。

3. Windows APIによる「生存確認」

大規模なバッチ処理を行う際、SolidWorksがフリーズしているのか、単に計算中なのかを判断する必要がある。`GetTickCount` や `SendMessage` を用い、メインスレッドの応答を監視する仕組みを構築すれば、夜間バッチの信頼性は劇的に向上する。

最後に:自動化の真髄

「コードが動く」ことはスタートラインに過ぎない。
真のアーキテクトは、そのコードが「10年後、どんな環境で実行されてもエラーを吐かないか」を考える。

SolidWorksのバージョンアップによってAPIの仕様は細かく変わる。しかし、オブジェクトを適切に解放し、ツリーの構造を論理的に追うという本質は変わらない。

次は、このリストをJSONにシリアライズし、外部のWeb APIへ投げる構成について深掘りしようか。準備ができたらまた戻ってくるといい。技術の深淵は、まだ入り口に過ぎない。

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