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

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
チーフアーキテクトの私です。

「マクロの記録」ボタンを押して図面やパーツをポチポチ操作し、生成されたコードを覗いてみたものの……そこには意味不明な数字の羅列と、大量の`Select`メソッドの嵐。「これ、ちょっとでも形状が変わったら絶対に破綻するやつだ……」と絶望した経験はありませんか?

そう、マクロの記録が吐き出すコードは、いわば「初心者が覚えたての自転車でフラフラ走っている状態」です。実務の現場で耐えうる、美しく、かつ強靭なマクロを書くためには、「選択(Select)に頼らない、APIオブジェクトの直接操作」をマスターする必要があります。

今回はその第一歩として、複雑に入り組んだ複数のボスやカット(フィーチャ)を一括で、しかも非対称にスマートミラーリングする奥義――`FeatureManager.FeatureMirrorPattern3`の完全攻略法を伝授します。

ここをクリアすれば、あなたも「マクロの記録からの卒業証書」を手にすることができますよ。さあ、一緒に扉を開きましょう!

なぜ「選択(Select)」に頼ってはいけないのか?

SolidWorks VBAで最もやりがちなアンチパターン、それはこれです。

‘ ❌ やってはいけない例(マクロ記録スタイル)
boolstatus = Part.Extension.SelectByID2(“Boss-Extrude1”, “FEATURE”, 0, 0, 0, False, 0, Nothing, 0)
boolstatus = Part.Extension.SelectByID2(“Cut-Extrude1”, “FEATURE”, 0, 0, 0, True, 0, Nothing, 0)
‘ ミラー実行…

なぜこれがダメなのか?理由は2つあります。
1. 画面の描画(画面上の選択状態)に依存するため、処理が圧倒的に遅い。
2. モデル改修でフィーチャ名が変わった瞬間(例: Boss-Extrude1 → Boss-Extrude5)、エラーで即死する。

プロの自動化エンジニアは、画面をマウスで選択させません。メモリ上でオブジェクトを直接配列にまとめ、APIのエンジンにドンと渡すのです。このアプローチこそが、爆速で安定したマクロを作るための絶対原則です。

核心に迫る:FeatureMirrorPattern3 の全貌

今回主役となるのは、`FeatureManager` インターフェースが持つ `FeatureMirrorPattern3` メソッドです。

まずは、そのメソッドが受け取る引数の重みを知りましょう。

Dim swFeature As SldWorks.Feature
Set swFeature = swFeatMgr.FeatureMirrorPattern3( _
GeometryPattern, _ [Boolean] ジオメトリパターンにするか(True/False)
FlipMirror, _ [Boolean] ミラーの向きを反転するか
SyncProperties, _ [Boolean] 元フィーチャのプロパティを同期するか
MeshAsNeeded _ [Boolean] 必要に応じてメッシュを修正するか(マルチボディ用)
)

「あれ? ミラーする対象のフィーチャや、基準面を指定する引数がないぞ?」と思いましたね?
鋭い!

実は、`FeatureMirrorPattern3` を呼び出す直前に、「ミラー対象のフィーチャ」と「ミラー基準面」をあらかじめAPI側でアクティブ(選択状態)にしておく必要があるという特殊な仕様(コンテキスト依存)を持っています。

「おいおい、さっき『Selectに頼るな』って言ったじゃないか!」と思いましたか?
そうですね。ですが、ここで言う「選択」は、人間がマウスで画面をクリックするのとは違います。コード内で一瞬だけメモリ上にターゲットをロードする「安全な選択」です。これなら実務でもビクともしません。

実践!複数フィーチャの一括非対称ミラーリングマクロ

それでは、実際の現場でそのまま使える実用コードを公開します。
このコードは、あらかじめ用意された「基準面(Plane1)」に対して、複数の特定のフィーチャ群を安全に一括ミラーリングするものです。

Option Explicit

Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swSelMgr As SldWorks.SelectionMgr
Dim swFeatMgr As SldWorks.FeatureManager
Dim swModelDocExt As SldWorks.ModelDocExtension

‘ アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
Set swApp = Application.SldWorks
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 swModelDocExt = swModel.Extension
Set swFeatMgr = swModel.FeatureManager

‘ 処理の高速化と画面ちらつき防止
swModel.EditRebuild
swModel.ClearSelection2 True

Dim status As Boolean

‘ ==========================================================
‘ 1. ミラー基準面の選択(例として “Plane1” を指定)
‘ ==========================================================
status = swModelDocExt.SelectByID2(“Plane1”, “PLANE”, 0, 0, 0, False, 1, Nothing, 0)
If Not status Then
MsgBox “指定されたミラー基準面が見つかりません。”, vbCritical
Exit Sub
End If

‘ ==========================================================
‘ 2. ミラーしたい複数のフィーチャを配列で安全に一括選択
‘ Append=True (引数マーク 4番目) にすることで、選択を「追加」していく
‘ ==========================================================
Dim targetFeatures As Variant
Dim i As Long

‘ ここにミラーしたいフィーチャ名を記述
targetFeatures = Array(“Boss-Extrude1”, “Cut-Extrude1”, “Fillet1”)

For i = LBound(targetFeatures) To UBound(targetFeatures)
‘ Mark = 4 (フィーチャ選択時の標準的なマーク)
status = swModelDocExt.SelectByID2(targetFeatures(i), “FEATURE”, 0, 0, 0, True, 4, Nothing, 0)
If Not status Then
MsgBox “フィーチャ ‘” & targetFeatures(i) & “‘ が見つかりませんでした。”, vbExclamation
‘ 選択をクリアして終了
swModel.ClearSelection2 True
Exit Sub
End If
Next i

‘ ==========================================================
‘ 3. FeatureMirrorPattern3 の実行
‘ 引数: GeometryPattern, FlipMirror, SyncProperties, MeshAsNeeded
‘ ==========================================================
Dim swMirrorFeature As SldWorks.Feature
Set swMirrorFeature = swFeatMgr.FeatureMirrorPattern3(False, False, False, False)

If Not swMirrorFeature Is Nothing Then
MsgBox “複数のフィーチャのミラーリングに成功しました!”, vbInformation
Else
MsgBox “ミラーリングの実行に失敗しました。幾何公差や干渉を確認してください。”, vbCritical
End If

‘ 選択状態のクリアとモデルの再構築
swModel.ClearSelection2 True
swModel.EditRebuild

End Sub

現場で役立つ!プロのエンジニアが教える「陥りやすい罠」と対策

1. `SelectByID2` の「マーク(Mark)」引数のトラップ

コード中の `SelectByID2` に出てくる数字(例: `1` や `4`)の意味を理解していますか?

  • 基準面を選択するときの `1` は、「これはミラーの『面』ですよ」とSolidWorksに教えるためのマークです。
  • フィーチャを選択するときの `4` は、「これはミラーする『フィーチャ』のリストですよ」というマークです。

ここを適当な数字にすると、SolidWorksは「どれが基準面で、どれが対象フィーチャなのか」が分からなくなり、`FeatureMirrorPattern3` は容赦なくエラーを返します。APIヘルプで「Selection marks」の項目を必ず確認する癖をつけましょう。

2. フィーチャの「生成順序」の呪縛

ミラー元のフィーチャ(例: `Cut-Extrude1`)が、ミラー基準面よりもフィーチャツリーの上流(過去)に存在しなければ、SolidWorksは計算できません。もしツリーの順序が逆転している場合、マクロは成功しても形状がねじれたり、エラージオメトリ(いわゆる「赤くエラーる」状態)になります。
プログラムを組む前に、手動でそのミラーが成立するかどうかを必ずフィーチャツリーの構造で検証してください。

ここをクリアすれば、SolidWorks VBAの基本はバッチリです!

お疲れ様でした!
今回学んだ「配列を使った一括ターゲットの指定」と「APIメソッドへのコンテキスト渡し」の技術は、ミラーパターンだけでなく、「サーフェスknit」「パターンフィーチャ」「アセンブリメイトの自動化」など、あらゆる高度な自動化に応用できる普遍的なテクニックです。

マクロの記録という「乳母車」を卒業し、自分の手でオブジェクトを意のままに操る快感を知ったあなたなら、どんな複雑な形状の自動化も怖くありません。

明日からの設計業務を、もっとクリエイティブでスピーディーなものに変えていきましょう。チーフアーキテクトの私は、いつもあなたのコードの成功を応援しています!

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