SolidWorks VBAの深淵:HoleWizardFeatureDataの完全制御とメモリ管理の極致
SolidWorks APIを使いこなす上で、多くのエンジニアが「穴ウィザード」という壁に突き当たる。標準GUIからの手動操作であれば誰でもできる。だが、JIS規格の枠を超え、設計意図をプログラムで完遂させるには、`IFeatureManager::HoleWizard5` が要求する不透明なデータ構造を完全に掌握せねばならない。
今日は、小手先のメソッド呼び出しではなく、メモリレイアウトとオブジェクトのライフサイクルを意識した「穴ウィザードの完全自動生成」の真髄を説く。
—
1. HoleWizardFeatureDataの正体と落とし穴
`HoleWizardFeatureData` は、単なるパラメータの入れ物ではない。これはSolidWorksのフィーチャツリーにおける「状態定義」そのものである。
多くの中級者は `ISldWorks::CreateFeature` を使い、その後に定義をいじるという非効率な手順を踏む。これでは再計算(Rebuild)のオーバーヘッドが二重に発生し、大規模アセンブリでは致命的なパフォーマンス低下を招く。
真のアーキテクトは、フィーチャ作成前にパラメータを確定させる。
押さえるべき設計原則
- 非同期的な設定: フィーチャ生成後に `ModifyDefinition` を呼ぶのは最終手段とせよ。
- 型定義の厳格化: `FeatureData` オブジェクトを取得した後、必ず `ISwHoleWizardFeatureData` への適切なキャストとプロパティ設定を順序立てて行う。
- メモリの解放: VBAは参照カウンタ方式だ。オブジェクトをループ内で生成し続けると、メモリリークが即座に発生する。`Set obj = Nothing` の徹底は、もはや義務ではなく呼吸と同じだ。
—
2. 実装:特殊座ぐり加工の自動生成
以下のコードは、標準的な呼び出しを超え、`HoleWizardFeatureData` を直接操作して座ぐり加工を生成する極限のテンプレートである。
‘ 伝説的なチーフアーキテクトによるHoleWizard生成ロジック
Public Sub CreateCustomCounterbore(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2)
Dim swFeatMgr As SldWorks.FeatureManager
Dim swHoleData As SldWorks.WizardHoleFeatureData2
Dim swFeat As SldWorks.Feature
Set swFeatMgr = swModel.FeatureManager
‘ 1. HoleWizardFeatureDataの生成(メモリ確保)
Set swHoleData = swFeatMgr.CreateDefinition(swFtrType_HoleWiz)
‘ 2. 穴の定義(規格外の数値を直接注入)
‘ 注意: ここでの値はメートル法ベースのSI単位系(m)で扱うこと
With swHoleData
.HoleData = Array(swWzdCounterbore, _
swStandardJis, _
swTypeCounterbore, _
“M8”, _
swEndCondBlind, _
0.025, _ ‘ 深さ: 25mm
0.0, _
0.015, _ ‘ 座ぐり径: 15mm
0.008, _ ‘ 座ぐり深さ: 8mm
0#, 0#, 0#, 0#, 0#, 0#, 0#, 0#, 0#) ‘ 拡張パラメータ
End With
‘ 3. フィーチャの確定(ここで初めてジオメトリが計算される)
Set swFeat = swFeatMgr.CreateFeature(swHoleData)
‘ 4. 明示的なメモリ解放(VBAのガーベジコレクションを待たない)
Set swHoleData = Nothing
Set swFeat = Nothing
Set swFeatMgr = Nothing
End Sub
—
3. レガシー環境におけるパフォーマンス最適化の鉄則
大規模システム連携において、VBAは「遅い」と蔑まれることが多い。それはVBAの責任ではなく、エンジニアがWindows APIの呼び出しを怠っているからだ。
パフォーマンスを極限まで引き上げるための3つのヒント
1. Rebuildの抑制:
`ModelDoc2::EditRebuild3` をループ内で叩くな。すべてのフィーチャ生成が終わった後に一度だけ `ForceRebuild3` を実行せよ。それが大規模アセンブリを数秒で構築する秘訣だ。
2. Windows APIによるプロセス監視:
SolidWorksのプロセス状態を監視し、応答がない場合は `Sleep` 関数でCPUを休ませる。
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
これをループ内に適宜配置するだけで、OSのメッセージキューを圧迫せず、システム全体の安定性が劇的に向上する。
3. オブジェクトのキャッシュ:
`FeatureManager` や `SelectionManager` へのアクセスをループ内で行ってはならない。これらは重いCOMメソッドをラップしている。最初に変数へ格納し、それを通せ。
—
結論:コードは「芸術」ではなく「構造」である
穴ウィザードの自動化は、単なる機能実装ではない。SolidWorksの内部データモデル(Brep)を理解し、その構築順序を制御するという、極めて高度な知的な営みだ。
もし貴殿の書くコードが「動けばいい」レベルで留まっているのなら、今日でその思想を捨てよ。メモリのライフサイクルを制御し、再計算のオーバーヘッドを計算し、APIの奥底にあるデータ構造を見通すこと。それこそが、伝説と呼ばれるための第一歩である。
次は、`ISwHoleWizardFeatureData` のさらなる拡張と、独自規格をSolidWorksのデータベースに動的にマッピングする手法について解説しよう。
技術に妥協するな。それが、真のアーキテクトの矜持だ。
