円周パターンを極める:SolidWorks APIによるフィーチャ自動生成の最適解
SolidWorks APIを扱う多くのエンジニアは、`FeatureCircularPattern2` を「単なるメソッド」として消費している。だが、大規模アセンブリや複雑なインペラの設計自動化において、このメソッドを無造作に叩くことは、メモリリークと再構築時間の肥大化を招く「時限爆弾」を仕掛けるに等しい。
真の自動化エンジニアは、APIを呼び出す前に「オブジェクトのライフサイクル」と「再構築のトリガー」を完全に制御する。本稿では、`FeatureCircularPattern2` を用いた堅牢かつ高速な円周配列の実装手法を、実務レベルの知見とともに解説する。
—
1. 破壊的な自動化を避けるための設計思想
フィーチャ操作において最も避けるべきは、ループ内での `ModelDoc2.ForceRebuild3` の乱発だ。これは SolidWorks のフィーチャツリーを毎回全走査させ、処理時間を指数関数的に増大させる。
- 自動再構築の抑制: `ModelDoc2.FeatureManager.EnableFeatureTree = False` を活用し、一連のフィーチャ生成が終わるまでツリー更新を停止させる。
- オブジェクトのスコープと解放: `Feature` オブジェクトを無駄に保持しない。`Set feat = Nothing` を明示的に呼び出すことは、VBAのガベージコレクションを待たず、メモリ占有率を即座に下げるための防衛策だ。
—
2. 実装コード:円周配列の最適化テンプレート
以下は、任意の軸を中心にフィーチャを配列するための、実戦的なプロシージャである。このコードはエラーハンドリングを包含し、大規模モデルでも安定して動作するように設計されている。
‘ 伝説的なチーフアーキテクトによる、高速・安全な円周パターン生成ルーチン
Public Sub CreateCircularPatternOptimized( _
ByVal swApp As SldWorks.SldWorks, _
ByVal swPart As SldWorks.ModelDoc2, _
ByVal seedFeatureName As String, _
ByVal numInstances As Long, _
ByVal angle As Double, _
ByVal axisEntity As Object)
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swPart.FeatureManager
‘ 再構築の停止(パフォーマンスの最適化)
swPart.FeatureManager.EnableFeatureTree = False
‘ フィーチャ選択の準備
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swPart.SelectionManager
‘ シードフィーチャの選択(再構築を最小限にするため、選択セットをクリア)
swPart.ClearSelection2 True
swPart.Extension.SelectByID2 seedFeatureName, “BODYFEATURE”, 0, 0, 0, False, 1, Nothing, 0
‘ 円周パターンの実行
‘ パラメータ:個数, 角度, 軸反転, ジオメトリパターン設定, インスタンスのスキップ設定等
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.FeatureCircularPattern2( _
numInstances, _
angle, _
False, _
False, _
False, _
True) ‘ True: ジオメトリパターンを有効化(計算負荷を劇的に低減)
‘ オブジェクトの解放と後処理
Set swFeat = Nothing
swPart.ClearSelection2 True
‘ 再構築の再開と一括更新
swPart.FeatureManager.EnableFeatureTree = True
swPart.EditRebuild3
End Sub
—
3. なぜ「ジオメトリパターン」をONにするのか
コード内の `FeatureCircularPattern2` 第6引数に注目してほしい。ここを `True` に設定することは、単なるオプションではなく「計算戦略」の転換である。
- フィーチャパターン vs ジオメトリパターン:
- 通常のフィーチャパターンは、各インスタンスごとにフィーチャ定義を再計算するため、複雑な形状では計算コストが跳ね上がる。
- ジオメトリパターンは、最初のフィーチャの「形状結果」のみをコピーして回転させる。これにより、計算時間はフィーチャの複雑さに依存せず、単なる行列演算に帰着する。これが「高速自動配列」の要諦だ。
—
4. レガシー環境とWindows API連携のヒント
大規模プロジェクトでは、VBA単体で完結しないケースも多い。例えば、外部のCSVからパラメータを読み込み、進捗をWindowsのトレイアイコンに表示するような場合だ。
その際、`Kernel32.dll` の `GetTickCount` や `Sleep` 関数を呼び出すこともあるだろう。しかし、VBAで `Sleep` を呼ぶ際は注意が必要だ。`DoEvents` を挟まないループは、Windowsから「応答なし」と判定され、プロセスの強制終了を招く。
熟練の知見:
大規模配列処理を行う際は、必ず `DoEvents` をループの適切な箇所に挿入し、かつ `GetTickCount` を使用して、「処理開始から何ミリ秒経過したか」を監視するタイムアウト機構を実装せよ。システムがフリーズした際に、無限ループでCPUを焼き切るような設計は、プロフェッショナルのコードではない。
—
結論:コードは「芸術」ではなく「エンジニアリング」である
自動化とは、ただ単にマウス操作をVBAに置き換えることではない。SolidWorksの内部エンジンであるParasolidカーネルが、どのような順序で計算を処理し、どのタイミングでメモリを開放すべきかを理解することだ。
今回紹介した手法をベースに、各現場の要件に合わせてロジックを磨き上げてほしい。優れた自動化スクリプトは、書かれた時よりも、半年後に誰かがメンテナンスする時にこそ、その真価を発揮する。
これこそが、SolidWorks VBAを掌握する唯一の道である。
