【テクニカル・上級編】【穴ウィザード完全制賀】HoleWizardDefの拡張パラメータ設定と、座ぐり・皿穴加工のプログラム自動生成 – SolidWorks VBA解析バイブル

スポンサーリンク

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のデータベースに動的にマッピングする手法について解説しよう。

技術に妥協するな。それが、真のアーキテクトの矜持だ。

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