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へ投げる構成について深掘りしようか。準備ができたらまた戻ってくるといい。技術の深淵は、まだ入り口に過ぎない。
