【テクニカル・上級編】【ミラー・パターン】FeatureManager.FeatureMirrorPattern3を用いた複数フィーチャの一括非対称ミラーリング制御 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見:`FeatureMirrorPattern3`による複数フィーチャ一括非対称ミラーリング制御

SolidWorks VBAの自動化において、真のエンジニアリングが試されるのは、単純な押し出しやカットの自動生成ではない。複雑に絡み合う既存のフィーチャ群を解析し、意図したトポロジーを崩さずに一括して幾何学的な対称性を担保する領域——すなわち「ミラー・パターン」の極限制御である。

本稿では、単一フィーチャのミラーリングという初歩的なアプローチを捨て、複数フィーチャの同時操作、さらには非対称性(Geometry Pattern vs Feature Pattern)を完全にプログラムからコントロールするための秘技を公開する。

1. 現場が直面する罠:なぜ従来のミラー処理は破綻するのか?

実務で複雑なパーツを扱う際、以下のような壁にぶつかったことはないだろうか。

  • 複数のボス、リブ、カットアウトを個別にミラーしようとして、親フィーチャの参照切れ(External Reference Error)を起こす。
  • `FeatureManager.FeatureMirrorPattern3` の引数の多さと厳密な型制約により、想定外のエラー(戻り値 `Nothing`)に悩まされる。
  • 形状パターン(Geometry Pattern)とフィーチャパターン(Feature Pattern)の使い分けを誤り、リビルド時間が幾何学的に増大する。

レガシーなマクロ記録をそのまま引き写したコードは、モデルのコンフィギュレーション変更やコンテキストの変動に対してあまりにも脆弱だ。APIの内部仕様、すなわちオブジェクトのライフサイクルと評価順序(Evaluation Order)を理解した者だけが、堅牢な自動化システムを構築できる。

2. アーキテクチャの核心:`FeatureMirrorPattern3` の全貌

複数フィーチャの一括非対称ミラーリングを成功させるためには、`FeatureManager` インターフェースのメソッド群、特に `FeatureMirrorPattern3` の仕様を完全に把握する必要がある。

核心的なAPIシグネチャの理解

このメソッドは、単に平面に対してジオメトリを反転させるだけでなく、ボディの合流(Merge)、形状パターンの適用、そして非対称な挙動の制御を一度のトランザクションで実行する。

ここで最も重要なのは、「あらかじめミラー対象となるフィーチャをFeatureTree上で正しく選択状態(SelectionList)にしておくこと」、そして「ミラー基準面を適切にコンテキスト解決すること」である。

3. 実装コード:堅牢性を極めた複数フィーチャ一括ミラーリング

以下のコードは、エラーハンドリング、メモリの明示的解放、そしてSolidWorksの非同期的なリビルドに対する防衛策を網羅した、実務投入可能なプロダクションコードである。

Option Explicit

‘ =================================================================================
‘ 伝説のチーフアーキテクトによる実装
‘ テーマ: FeatureMirrorPattern3を用いた複数フィーチャ一括非対称ミラーリング制御
‘ =================================================================================

Sub ExecuteAdvancedMirrorPattern()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swSelMgr As SldWorks.SelectionMgr
Dim swTargetFeature1 As SldWorks.Feature
Dim swTargetFeature2 As SldWorks.Feature
Dim swMirrorPlane As SldWorks.Feature
Dim swMirroredFeat As SldWorks.Feature

‘ 1. アプリケーションおよびドキュメントの取得(COMコンテキストの安全なバインド)
Set swApp = Application.SldWorks
If swApp Is Nothing Then Exit Sub

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical
Exit Sub
End If

‘ パフォーマンス向上のための画面描画・自動再計算一時停止
swModel.Extension.Use précision = True
swModel.EditRebuild

Set swFeatMgr = swModel.FeatureManager
Set swSelMgr = swModel.SelectionMgr

‘ 2. 選択バッファの完全クリア(迷走参照の防止)
swModel.ClearSelection2 True

‘ 3. ミラー基準面の取得(ここでは “Front Plane” を想定。必要に応じて名前やタイプで動的取得)
Set swMirrorPlane = GetFeatureByName(swModel, “Front Plane”)
If swMirrorPlane is Nothing Then
MsgBox “指定されたミラー基準面が見つかりません。”, vbCritical
GoTo CleanUp
End If

‘ 4. ミラー対象となる複数のフィーチャを取得(例: “Boss-Extrude1”, “Cut-Extrude1″)
Set swTargetFeature1 = GetFeatureByName(swModel, “Boss-Extrude1”)
Set swTargetFeature2 = GetFeatureByName(swModel, “Cut-Extrude1”)

If swTargetFeature1 Is Nothing Or swTargetFeature2 Is Nothing Then
MsgBox “ミラー対象のフィーチャが特定できません。”, vbCritical
GoTo CleanUp
End If

‘ 5. SelectionListへの正確なマーク付与による登録
‘ マーク1 = ミラー対象フィーチャ
‘ マーク2 = ミラー面/軸
Dim boolstatus As Boolean
boolstatus = swTargetFeature1.Select2(True, 1)
boolstatus = swTargetFeature2.Select2(True, 1)
boolstatus = swMirrorPlane.Select2(True, 2)

‘ 6. FeatureMirrorPattern3の実行
‘ 引数の定義:
‘ UseGeometryPattern (Boolean): 形状パターンを使用するか (True = 高速だがトポロジー変更に弱い)
‘ Reorient (Boolean): 向きを維持するか
‘ KnitSurface (Boolean): サーフィンの場合につなぎ合わせるか
‘ PropagateVisualProperties (Boolean): 外観プロパティを継承するか

On Error GoTo ErrorHandler

Set swMirroredFeat = swFeatMgr.FeatureMirrorPattern3( _
UseGeometryPattern:=False, _
Reorient:=True, _
KnitSurface:=False, _
PropagateVisualProperties:=True _
)

If Not swMirroredFeat Is Nothing Then
swModel.Extension.SelectByID2 swMirroredFeat.Name, “FEATURE”, 0, 0, 0, False, 0, Nothing, 0
MsgBox “複数フィーチャの一括ミラーリングに成功しました。”, vbInformation
Else
MsgBox “FeatureMirrorPattern3の実行が拒絶されました。モデルの幾何学的整合性を確認してください。”, vbExclamation
End If

CleanUp:
‘ 7. メモリの明示的解放(COM参照のリーク防止)
Set swMirroredFeat = Nothing
Set swTargetFeature1 = Nothing
Set swTargetFeature2 = Nothing
Set swMirrorPlane = Nothing
Set swSelMgr = Nothing
Set swFeatMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
Resume CleanUp
End Sub

‘ ——————————————————————————–
‘ 補助関数: フィーチャ名から安全にFeatureオブジェクトを逆引きする
‘ ——————————————————————————–
Private Function GetFeatureByName(ByVal swModel As SldWorks.ModelDoc2, ByVal featName As String) As SldWorks.Feature
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FirstFeature

Do While Not swFeat Is Nothing
If swFeat.Name = featName Then
Set GetFeatureByName = swFeat
Exit Function
End If
Set swFeat = swGetNextFeature(swFeat)
Loop

Set GetFeatureByName = Nothing
End Function

Private Function swGetNextFeature(ByVal swFeat As SldWorks.Feature) As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature
Set swSubFeat = swFeat.GetFirstSubFeature
If Not swSubFeat Is Nothing Then
Set swGetNextFeature = swSubFeat
Exit Function
End If

Dim swNextFeat As SldWorks.Feature
Set swNextFeat = swFeat.GetNextFeature
If Not swNextFeat Is Nothing Then
Set swGetNextFeature = swNextFeat
Exit Function
End If

Set swFeat = swFeat.GetParent
Do While Not swFeat Is Nothing
Set swNextFeat = swFeat.GetNextFeature
If Not swNextFeat Is Nothing Then
Set swGetNextFeature = swNextFeat
Exit Function
End If
Set swFeat = swFeat.GetParent
Loop

Set swGetNextFeature = Nothing
End Function

4. チーフアーキテクトが教える「死角なき」メモリ管理とパフォーマンス最適化

VBA環境において、SolidWorks APIを叩く際の最大のボトルネックは、意図しないCOMオブジェクトのメモリリークと、それに起因するSolidWorksプロセスのメモリ肥大化である。

1. 参照の明示的破棄 (`= Nothing`) の徹底

VBAのガベージコレクションは参照カウント方式に依存している。特に、`FeatureManager` や `SelectionMgr` といったファクトリ系のオブジェクトは、スコープを抜けても即座にメモリから解放されないケースが多い。スクリプトの最後で必ず `Set xxx = Nothing` を記述し、下位オブジェクトから順に参照を切断すること。

2. 再計算(Rebuild)コストの制御

複数のフィーチャを一括処理する際、デフォルトでは処理ごとにモデルの評価(Evaluation)が走り、パフォーマンスが著しく低下する。
スクリプト冒頭で `ModelDocExtension` や `ModelDoc2` の抑制機能を活用し、一括処理の完了後に一度だけ `EditRebuild` を実行するアーキテクチャに設計すべきである。

5. レガシー環境・外部システム連携への応用

この `FeatureMirrorPattern3` を用いた自動化基盤は、単独のVBAマクロにとどまらない。例えば、C#やVB.NETで構築された社内PLM/ERPシステムからのCOM Interop(外部制御)においても、全く同じ概念が適用できる。

外部DBからJSON形式で「どのフィーチャをどの面で対称化するか」のメタデータを受け取り、VBA側(あるいはCOMアドイン側)で動的に選択セットを構築して一括ミラーを流し込む。このパイプラインを確立できれば、多品種少量生産におけるパーツファミリの自動生成スピードは、手動操作に比べて何百倍ものオーダーへと跳ね上がる。

妥協なきコードを書け。SolidWorksの限界は、APIの限界ではなく、それを操る我々の設計思想の限界なのだから。

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