【入門編】【ミラー・パターン】FeatureManager.FeatureCircularPattern3を用いた、回転体の位相変化に強い等配フィーチャの動的配列 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorksの自動化の世界へようこそ。
今回は、設計現場で本当によくあるお悩み——「インペラの羽やフランジのボルト穴の個数を変えた途端、パターンのせいでモデルが崩壊する・エラーで黄色や赤色になる」という問題に、VBAのコードでスマートに決着をつける方法を伝授します。

マクロの記録をそのまま使うだけでは、個数を変更したときに硬直してしまい、現場の急な設計変更についていけません。
ここをクリアすれば、あなたも「マクロの記録の呪縛」から完全に解放され、現場で一目置かれる自動化エンジニアの仲間入りです。一緒に本質をマスターしていきましょう!

なぜ「サーキュラーパターン」はモデル変更でエラーを起こすのか?

インペラ(羽根車)やフランジのボルト穴を等配(円周上に均等に配置)するとき、私たちは無意識に`FeatureCircularPattern3`を使います。

手動操作であれば、エラーが出たら「あ、参照面が変わっちゃったな」とマウスで直せますが、VBAで自動化しているときにエラーで止まると、プログラム全体がクラッシュしてしまいます。
特に「個数の増減」「基準角度の変更」を行う際、従来の静的なコード(固定値の埋め込み)では、SolidWorksの内部トポロジー(面やエッジのID)の変動についていけず、破綻してしまうのです。

堅牢なパターン制御の3大原則

1. マジックナンバーを排除し、計算式でドライブする(個数から角度を動的に算出)
2. FeatureManagerのメソッドを正しく呼び出す(引数の多さに怯えない)
3. エラーハンドリングと再構築(Rebuild)のタイミングを支配する

実践!動的サーキュラーパターン制御マクロ

それでは、実際に動くコードを見てみましょう。
今回は、アクティブなパーツドキュメントに対し、指定したベースフィーチャ(例:一つの穴、または一つの羽根)を指定した「個数」で綺麗に等配円周パターン化する関数を作成します。

このコードは、単に命令を流し込むだけでなく、「個数が変わっても絶対に破綻しない数学的アプローチ」を取り入れています。

Option Explicit

‘ ==============================================================================
‘ 【メイン処理】円周パターンの動的生成プロシージャ
‘ ==============================================================================
Sub ExecuteRobustCircularPattern()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim targetCount As Long
Dim targetAngle As Double
Dim isSuccessful As Boolean

‘ 1. アプリケーションとドキュメントの取得
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

‘ — 【パラメータ設定エリア】 —
‘ ここを外部CSVやフォーム、あるいはセルの値から動的に受け取るように拡張できます
targetCount = 8 ‘ 配置したい個数(例:8個)
targetAngle = 360.0 ‘ 全体の配置角度(通常は360度)
‘ —————————-

‘ 2. パターン処理の実行(関数呼び出し)
‘ ※前提条件として、あらかじめ “Cut-Extrude1” などのベースフィーチャと、
‘  回転軸となる円柱面や軸がモデルに存在している必要があります。
isSuccessful = CreateDynamicCircularPattern(swModel, “Cut-Extrude1”, targetCount, targetAngle)

If isSuccessful Then
MsgBox “サーキュラーパターンの動的生成に成功しました!”, vbInformation, “完了”
Else
MsgBox “パターンの生成に失敗しました。ベースフィーチャ名や軸を確認してください。”, vbCritical, “エラー”
End If

End Sub

‘ ==============================================================================
‘ 【コア関数】FeatureCircularPattern3を用いた堅牢なパターン生成
‘ ==============================================================================
Function CreateDynamicCircularPattern(ByVal model As SldWorks.ModelDoc2, _
ByVal baseFeatureName As String, _
ByVal count As Long, _
ByVal totalAngle As Double) As Boolean

Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Dim patternFeat As SldWorks.Feature

Set swFeatMgr = model.FeatureManager

‘ 念のため、対象のベースフィーチャを選択状態にする(APIの文脈依存対策)
Dim bRet As Boolean
bRet = model.Extension.SelectByID2(baseFeatureName, “BODYFEATURE”, 0, 0, 0, False, 1, Nothing, 0)

If Not bRet Then
CreateDynamicCircularPattern = False
Exit Function
End If

‘ — 引数の設計(ここがプログラミングの肝です!)—
‘ FeatureCircularPattern3 の引数は多岐にわたりますが、本質は以下の通りです。

‘ Number1 : インスタンス数(個数)
‘ Spacing1 : 角度ピッチ または 全体角度
‘ FlipDir1 : 方向反転 (True/False)
‘ DName1 : 寸法名(省略可)
‘权Angles :
‘ GeometryPattern : ジオメトリパターンを使うか (True: 高速だが位相に弱い場合あり、False: フィーチャパターン)
‘ VAlign :

Dim Number1 As Long
Dim Spacing1 As Double
Dim FlipDir1 As Boolean
Dim DName1 As String
Dim
Dim GeometryPattern As Boolean
Dim VAlign As Boolean
Dim EqualSpacing As Boolean

Number1 = count
Spacing1 = totalAngle / count ‘ ★個数変更に強い「等配ピッチ角度」の自動計算!
FlipDir1 = False
DName1 = “”
EqualSpacing = True
GeometryPattern = False ‘ 確実性を重視してフィーチャパターンを選択
VAlign = False

‘ その他の不要なオプション引数にはデフォルト値(配列やFalseなど)を渡します
Dim DirectionRef As Object: Set DirectionRef = Nothing ‘ 軸や円柱面を指定する場合はここに渡す(今回はデフォルトのフィーチャ軸を利用)
Dim ReverseDirection2 As Boolean: ReverseDirection2 = False
Dim Number2 As Long: Number2 = 1
Dim Spacing2 As Double: Spacing2 = 0#
Dim FlipDir2 As Boolean: FlipDir2 = False
Dim EqualSpacing2 As Boolean: EqualSpacing2 = True
Dim DName2 As String: DName2 = “”
Dim DName3 As String: DName3 = “”
Dim DName4 As String: DName4 = “”
Dim DName5 As String: DName5 = “”
Dim
Dim
Dim

‘ 3. API実行
Set patternFeat = swFeatMgr.FeatureCircularPattern3( _
Number1, _
Spacing1, _
FlipDir1, _
DName1, _
EqualSpacing, _
DirectionRef, _
ReverseDirection2, _
Number2, _
Spacing2, _
FlipDir2, _
EqualSpacing2, _
DName2, _
DName3, _
DName4, _
DName5, _
GeometryPattern, _
False, _
False, _
False, _
False _
)

If Not patternFeat Is Nothing Then
‘ 4. 強制再構築でモデルを確定させる
model.ForceRebuild3 True
CreateDynamicCircularPattern = True
Else
CreateDynamicCircularPattern = False
End If

End Function

コードの最重要ポイント:なぜこの書き方が「強い」のか?

1. 角度のハードコーディングを排除する

初心者がやりがちなミスは、`Spacing1`(角度)に固定の「45度」などを直接代入してしまうことです。これだと、個数を「6個」に変えた瞬間に計算が合わなくなり、エラーが起きます。
上記のコードでは、
`Spacing1 = totalAngle / count`
という式を挟むことで、「ユーザーが個数をいくつに変えようとも、360度の中に綺麗に割り振る」動的なロジックを構築しています。これが位相変化に強い理由の1つです。

2. `ForceRebuild3` によるモデルの同期

APIを実行した直後のSolidWorksは、メモリ上のデータとグラフィック表示、そしてフィーチャツリーの整合性がまだ完全に同期していない瞬間があります。
処理の最後に `model.ForceRebuild3 True` を挟むことで、強制的に全再構築を走りさせ、エラーの芽をその場で摘み取ります。

陥りやすいエラーと対処法

現場でこのコードを試したときに、もしうまくいかない場合は以下のポイントを確認してください。

  • エラー:「ベースフィーチャが見つかりません」
  • `SelectByID2` で指定している `”Cut-Extrude1″` という名前が、実際のFeatureManagerのデザインツリー上の名前と一致しているか確認してください。(日本語環境であれば `”押し出し-カット1″` などになります)
  • エラー:「回転軸が特定できません」
  • サーキュラーパターンは、「何を中心に回すか」の参照が必要です。コード内の `DirectionRef` に適切な円柱面や軸エンティティを渡すことで、より強固になります(今回はデフォルトの軸を使用する簡略版になっています)。

まとめ

今回は、`FeatureCircularPattern3` を使った「個数変更に強い等配フィーチャの動的配列」について解説しました。

  • 個数からピッチ角度を割り算で自動算出する
  • マジックナンバーをコードに残さない
  • 実行後は必ず強制再構築を行う

ここをクリアすれば、インペラの枚数が変わろうが、フランジの穴が増えようが、あなたの書いたマクロはビクともしません。ぜひ、実際の業務データに応用して、設計自動化のスピードを爆発的に上げてみてくださいね。

それでは、次回の極限知見でお会いしましょう!バッチリ使いこなしてくださいね。

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