【テクニカル・上級編】【ミラー・パターン】FeatureManager.FeatureLinearPattern2で大量のフィーチャを高速複製するコツ – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks API極致】FeatureLinearPattern2を極める:数千のフィーチャを秒速で捌くメモリ最適化の戦術

SolidWorks APIを扱うエンジニアにとって、`FeatureLinearPattern2`は「諸刃の剣」だ。数個のパターンであれば何の問題もない。しかし、数千、数万のインスタンスを生成しようとした瞬間、SolidWorksは重い沈黙を守り、やがて応答なしに陥る。

なぜか?それは多くのエンジニアが「UIスレッドの描画」と「オブジェクトのメモリリーク」を放置しているからだ。今日は、表面的なAPIリファレンスをなぞるような甘い話はしない。現場で生き残るための、泥臭くも洗練された「極限のチューニング」を伝授する。

1. 描画と再計算の呪縛を断ち切る

まず大前提だ。`swApp.Visible = False`や`swApp.UserControl = False`は基本中の基本だが、それだけでは足りない。パターン作成の裏側で行われる「フィーチャの再構築(Rebuild)」こそが最大のボトルネックである。

これを制御するには、`ModelDocExtension.SuspendRebuild` を使用する。パターン生成中にいちいちジオメトリを再計算させてはならない。

‘ 処理の冒頭で再構築を凍結する
swModel.Extension.SuspendRebuild = True

‘ 【重要】処理後に必ず解除する。これを忘れるとモデルが破壊されたままになる
‘ 実務では Error Handling で確実に False に戻すこと

2. FeatureLinearPattern2の「地雷」を回避せよ

`FeatureLinearPattern2`メソッドは強力だが、引数が多く、ミスを誘発しやすい。特に「どのフィーチャをパターン化するか」を指定する際、選択セット(SelectionManager)に依存するのは素人のやり方だ。

プロはオブジェクトを直接渡す。`ISelectionMgr`を介さずに、フィーチャ名から直接`IFeature`オブジェクトを特定し、それを配列として渡すのが最も高速かつ安全である。

高速化のためのコード実装例

Public Sub HighSpeedLinearPattern(swModel As SldWorks.ModelDoc2, targetFeature As SldWorks.Feature)
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swModel.FeatureManager

‘ 描画と再計算の抑制
swModel.Extension.SuspendRebuild = True

‘ パターン対象を単一のフィーチャとして選択セットに含める(または直接配列指定)
‘ ※大量の場合は、あらかじめFeature配列を構築しておくこと
targetFeature.Select2 False, 0

‘ LinearPattern2のパラメータ設定
‘ パフォーマンスの鍵は「GeometryPattern」をTrueにすること。
‘ これにより、フィーチャ一つ一つを再計算せず、ジオメトリのコピーとして処理されるため、
‘ 数千個のインスタンス生成でも驚異的な速度が出る。
Dim swPattern As SldWorks.Feature
Set swPattern = swFeatMgr.FeatureLinearPattern2( _
2, 0.05, 5, 0.02, False, False, “NULL”, “NULL”, False, _
True, False, False, False, False, False, False, True, True) ‘ GeometryPatternをTrueに!

‘ 再計算の再開
swModel.Extension.SuspendRebuild = False
swModel.ForceRebuild3 True
End Sub

3. メモリ解放の美学:オブジェクトを放置しない

VBAはガベージコレクションが甘い。特にCOMオブジェクトをループ内で生成し続けると、メモリリークは必至だ。

  • `Set obj = Nothing` をループ外へ: ループ内で生成した`IFeature`や`IComponent2`は、ループを抜ける直前に明示的に解放せよ。
  • Windows APIの活用: 数千のフィーチャを扱う際、もし処理がフリーズしかけるなら、`Sleep`や`DoEvents`でOSに制御を戻す「呼吸」が必要な場合がある。ただし、`DoEvents`の乱用は禁物だ。あくまでメモリの断片化を防ぐための「間」を作る目的でのみ使用する。

4. シニアエンジニアへ贈る「真の最適化」の心得

大量のフィーチャパターンを作成する場合、APIの呼び出し回数自体を減らす工夫が重要だ。

1. パターンをネストする: 1000個を一度に作るのではなく、10個のパターンを100回コピーする方が、SolidWorksの計算エンジンの負荷は分散される。
2. サプレッションの活用: 複雑なフィーチャを作成する際は、一度抑制(Suppress)状態にしてからパターン化し、最後に一括解除する。これにより、パターン作成中の演算コストを最小化できる。

最後に:自動化は「儀式」ではない

コードを書くことは、SolidWorksの内部エンジンと対話することだ。APIの戻り値をチェックし、エラー発生時に「モデルが死んだ状態」で終了させない防衛的なプログラミングを徹底してほしい。

もし、貴君が数万のパターンを生成してなお、SolidWorksを軽快に動かしたいのであれば、それはもはやVBAの領域ではない。C++(SolidWorks API SDK)への移行を検討する時期だ。しかし、VBAであっても「メモリのライフサイクル」と「演算の重み」を意識すれば、標準機能では到達できない領域へ行ける。

健闘を祈る。貴君の自動化システムが、今日から数倍の速度で駆動することを期待している。

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