【SolidWorks VBA極限解説】FeatureManager.FeatureMirrorPattern3で挑む!複数フィーチャの一括非対称ミラーリング制御
開発現場のリーダーである私に、よくこんな相談が持ち込まれる。
「単一のボスならミラーできるが、複数のボスやカットが入り組んだ複雑な形状群を一括で、しかも非対称やオプション制御を含めて綺麗にミラーリングできない。コードが途中で破綻する」と。
ネットを検索すれば、`Extension.SelectByID2`を並べ立てた場当たり的なコードや、フィーチャの選択順序依存で平気でクラッシュする脆弱なマクロが溢れている。これらは業務自動化において「百害あって一利なし」だ。
今回は、SolidWorks APIの真髄である `FeatureManager.FeatureMirrorPattern3` を完全掌握し、実務の現場で絶対に破綻しない「堅牢かつ高速な複数フィーチャ一括ミラーリング制御」の極意を伝授する。
—
1. なぜ従来のミラーリング手法は実務で破綻するのか?
多くの初学者や中級プログラマが陥る罠は、「画面上の選択(UI操作のエミュレーション)」に依存したコード設計にある。
- `SelectByID2` をループさせてフィーチャを次々と選択する。
- 選択解除のタイミングを誤り、意図しないエンティティが選択セットに残る。
- フィーチャーツリーの並び順(Reorder)が変わった途端にインデックスがズレてバグる。
これらはすべて「プログラミング」ではなく「マクロの記録の延長」に過ぎない。
プロの業務自動化エンジニアが目指すべきは、「APIの内部オブジェクト構造を直接操作し、UIの選択状態に依存しないアトミック(不可分)な実行」である。
ここで鍵となるのが、`FeatureManager.FeatureMirrorPattern3` メソッドだ。このメソッドの引数の意味と、背後にあるSolidWorksのトポロジー計算の重みを知り尽くせば、複雑なマルチフィーチャのミラーも一撃で制御できるようになる。
—
2. FeatureMirrorPattern3 のアーキテクチャと設計思想
`FeatureMirrorPattern3` は、単に形状を反転させるだけではない。以下の強力な制御をコード側から一元管理できる。
1. 複数フィーチャの配列指定:
個別選択の必要はなく、対象となる `Feature` オブジェクトの配列を渡すだけで処理が完結する。
2. ジオメトリパターン(Geometry Pattern)の活用:
フィーチャ全体を再計算するのではなく、面やボディの形状のみをコピーする「ジオメトリパターン」を有効化することで、処理速度を劇的に向上させることができる(複雑なモデルでは数倍の差が出る)。
3. 境界ボックスやネストされたフィーチャへの耐性:
ミラー面に対して正しく参照を持つため、下流のフィーチャへの悪影響を最小限に抑えられる。
—
3. 【プロダクションコード】実務で使える堅牢なミラーリングマクロ
以下のコードは、指定した複数のフィーチャ(例: 複数のボスとカット穴)を、特定の基準面(例: “Front Plane”)に対して一括でミラーリングする完全版のVBAスクリプトである。
エラーハンドリング、オブジェクトのライフサイクル管理、選択セットのクリーンアップを完璧に網羅している。そのまま現場のシステムに組み込んで即戦力として利用してほしい。
Option Explicit
‘ ==============================================================================
‘ 業務自動化プロフェッショナル向け SolidWorks VBA テンプレート
‘ テーマ: FeatureManager.FeatureMirrorPattern3 による複数フィーチャ一括非対称ミラー
‘ ==============================================================================
Sub ExecuteAdvancedMirrorPattern()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swSelMgr As SldWorks.SelectionMgr
‘ 1. アプリケーションおよびドキュメントの取得
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
‘ パーツドキュメントかどうかの型チェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行可能です。”, vbExclamation, “対象外”
Exit Sub
End If
Set swFeatMgr = swModel.Extension.FeatureManager
Set swSelMgr = swModel.SelectionManager
‘ 処理の高速化と画面描画のロック(フリッカ防止)
swModel.Extension.EnableAnimations = False
swModel.EditRebuild3
On Error GoTo ErrorHandler
‘ 2. ミラーリング対象のフィーチャ名を定義(実務では外部DBや設定ファイルから動的取得を推奨)
Dim targetFeatureNames(1) As String
targetFeatureNames(0) = “Boss-Extrude1” ‘ 1つ目の対象フィーチャ
targetFeatureNames(1) = “Cut-Extrude1” ‘ 2つ目の対象フィーチャ
Dim swFeatArray() As SldWorks.Feature
ReDim swFeatArray(UBound(targetFeatureNames))
Dim i As Long
Dim foundCount As Long
foundCount = 0
‘ 3. フィーチャ名からFeatureオブジェクトの参照を安全に解決
Dim swTempFeat As SldWorks.Feature
For i = 0 To UBound(targetFeatureNames)
Set swTempFeat = swModel.FeatureByName(targetFeatureNames(i))
If Not swTempFeat Is Nothing Then
Set swFeatArray(foundCount) = swTempFeat
foundCount = foundCount + 1
Else
MsgBox “警告: 指定されたフィーチャが見つかりません -> ” & targetFeatureNames(i), vbExclamation, “スキップ”
End If
Next i
If foundCount = 0 Then
MsgBox “有効なミラー対象フィーチャが一つも存在しません。”, vbCritical, “処理中断”
GoTo Finally
End If
‘ 実際の有効数に配列をリサイズ
If foundCount – 1 < UBound(swFeatArray) Then
ReDim Preserve swFeatArray(foundCount - 1)
End If
' 4. ミラーリング基準面(例: Front Plane)の選択
' UIに依存せず確実に選択状態を作るために SelectByID2 を使用
swModel.ClearSelection2 True
Dim mirrorPlaneName As String
mirrorPlaneName = "Front Plane"
Dim bRet As Boolean
bRet = swModel.Extension.SelectByID2(mirrorPlaneName, "PLANE", 0, 0, 0, False, 1, Nothing, 0)
If Not bRet Then
MsgBox "基準面が見つかりませんでした: " & mirrorPlaneName, vbCritical, "エラー"
GoTo Finally
End If
' 5. 対象フィーチャをあらかじめ選択バッファに安全にロードする
' FeatureMirrorPattern3 の仕様上、ミラー面と対象フィーチャの適切なマーク付けが必要
For i = 0 To UBound(swFeatArray)
' マーク 4 はフィーチャ選択を示す標準的なフラグ
bRet = swFeatArray(i).Select2(True, 4)
Next i
' ==============================================================================
' 6. FeatureMirrorPattern3 の実行(極限の核心部分)
' ==============================================================================
' 引数詳細:
' UseGeometryPattern As Boolean (True = 高速なジオメトリパターン)
' ReSelect As Boolean (False = 再選択不要)
' KeepBodies As Boolean (False = フィーチャパターンとして実行)
' ==============================================================================
Dim swMirrorFeat As SldWorks.Feature
Set swMirrorFeat = swFeatMgr.FeatureMirrorPattern3( _
False, _ ' UseGeometryPattern (非対称や複雑な結合がある場合はFalseでフィーチャ再計算を担保)
False, _ ' ReSelect
False ' KeepBodies
)
If Not swMirrorFeat Is Nothing Then
swModel.GraphicsRedraw2
MsgBox "複数フィーチャの一括ミラーリングが正常に完了しました。", vbInformation, "成功"
Else
MsgBox "FeatureMirrorPattern3 の実行に失敗しました。トポロジーエラーを確認してください。", vbCritical, "APIエラー"
End If
Finally:
' 7. クリーンアップ処理
swModel.ClearSelection2 True
swModel.Extension.EnableAnimations = True
Exit Sub
ErrorHandler:
MsgBox "予期せぬエラーが発生しました。" & vbCrLf & _
"Error No: " & Err.Number & vbCrLf & _
"Description: " & Err.Description, vbCritical, "致命的エラー"
Resume Finally
End Sub
---
4. プロジェクトリーダーが教える「現場でハマる罠」と回避策
このコードを実際の業務システムや大規模アセンブリ・複雑パーツに組み込む際、以下のポイントを抑えていないと必ず痛い目を見る。
① フィーチャ名のハードコーディングを避ける
プロダクション環境では、`targetFeatureNames(0) = “Boss-Extrude1″` のように名前を直接書き込むのは御法度だ。モデルの改修やコンフィギュレーションの変更によってサフィックス(数字)は容易に変わる。
- 解決策: ユーザー定義属性(Custom Properties)や、特定のフィーチャタイプ(例: `swFeatTypeExtrude`)を走査して動的に配列に格納する設計に昇華させること。
② ジオメトリパターン (`UseGeometryPattern`) の選択基準
コード内ではあえて `False`(フィーチャパターン)にしている。
もし対象のフィーチャ群が「他のフィーチャとの依存関係(エンティティの端面参照など)を一切持たず、単に形状をコピーするだけ」であれば、ここを `True` にすることで処理速度を劇的に短縮できる。しかし、非対称ミラーや微小なフェイスの干渉がある場合は `False` にしてフィーチャの再計算を行わせるのが、エラーを出さないための鉄則である。
③ 選択セットの汚染(Selection Contamination)
SolidWorks VBAにおいて、前段階の選択がメモリ(セレクションマネージャ)に残ったままAPIを叩くと、意図しないジオメトリが巻き込まれて大爆発を起こす。
必ず実行前の `swModel.ClearSelection2 True` と、実行後のクリーンアップをセットで記述すること。
—
5. 総括
SolidWorks VBAにおける自動化の質は、「APIの仕様をどれだけ深く理解し、予期せぬ例外をコードレベルでねじ伏せているか」で決まる。
今回解説した `FeatureMirrorPattern3` の適切なオブジェクトハンドリングと堅牢なエラーハンドリングの構築手法は、単なるミラーリングだけに留まらず、あらゆるパターンフィーチャ(円形パターン、曲線パターン)の自動化にもそのまま応用できる。
貴殿のプロジェクトにおける自動化ツールの品質が、一段上のステージへと引き上げられることを期待する。
