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

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

【ミラー・パターン】FeatureCircularPattern3を用いた、回転体の位相変化に強い等配フィーチャの動的配列

インペラ、ギヤ、フランジのボルト穴――。製造業の設計現場において、回転体へのフィーチャの等配配置は日常茶飯事だ。
しかし、VBAによる自動化の文脈において、この「サーキュラーパターン(円形状パターン)」ほど開発者を泣かせる機能はない。

「仕様変更でボルト穴の数が 4 から 6 に変わった瞬間、モデルが崩壊した」
「参照していた面やエッジのID(Persistent Reference)が変わり、`FeatureCircularPattern3` がエラーを吐く」

ネットの海を漂う、ただAPIのメソッドを並べただけの無力なコードでは、こうした実務の荒波を乗り越えることはできない。
今回は、SolidWorks APIのオブジェクトのライフサイクルと位相(トポロジー)の変化を完全にコントロールし、「何度仕様が変わっても絶対に破綻しない」極限の動的配列ロジックを伝授する。

1. なぜ従来のパターン処理は失敗するのか?

多くのエンジニアが犯す最大の過ちは、「インスタンス数の変更に伴う参照切れ」「角度の除算エラー」を軽視している点にある。

サーキュラーパターンは、基準となるフィーチャ(カット穴など)を軸回りに複製する。この時、API側では「どの面を基準にパターンするか」「どの軸周りか」をメモリ上に保持している。
しかし、元のフィーチャの形状変更や、個数の動的変更(例: 3個から5個への変更)を行った際、SolidWorksの内部ID(Face ID)が再割り当てされるケース(Topology Adjacencyの喪失)が発生する。

さらに、360度を等配する場合の角度計算において、浮動小数点演算の誤差(例: `360 / 3 = 120.0000001`)が蓄積し、最終的な結合面でゼロジオメトリエラー(Zero-thickness geometry)を引き起こす原因となる。

我々は、このハードウェアの気まぐれとも言える挙動を、厳密なVBAの設計によって封じ込めなければならない。

2. 堅牢なサーキュラーパターン実装の3大鉄則

プロダクション環境に耐えうるコードを書くため、以下の設計思想を遵守する。

1. 既存パターンのスマートな検出と上書き(Idempotency)
新規に作り直すのではなく、既存のパターンフィーチャが存在すればパラメータを更新し、存在しなければ新規作成する「べき等性」を担保する。
2. 完全修飾された参照の確保
選択セット(`SelectByID2`)に頼る脆弱なコードを捨て、明確なフィーチャオブジェクトのポインタを渡す。
3. 安全な角度・インスタンス数のバリデーション
入力値がゼロ以下、あるいは不正な値である場合に即座に処理を弾くガード節を設ける。

3. 【プロダクションコード】位相変化に強い動的パターンの実装例

以下のコードは、アクティブなパーツドキュメントに対し、指定したフィーチャ名とボルト穴の個数(インスタンス数)を受け取り、エラーなく安全にサーキュラーパターンを再構築・更新する関数である。

Option Explicit

‘ ==============================================================================
‘ 領域: SolidWorks VBA
‘ テーマ: FeatureCircularPattern3を用いた等配フィーチャの動的配列制御
‘ 概要: 指定したフィーチャを軸周りに安全に等配パターン化する(べき等性確保型)
‘ ==============================================================================

Public Sub ExecuteRobustCircularPattern( _
ByVal targetFeatureName As String, _
ByVal axisEntityName As String, _
ByVal instanceCount As Integer, _
ByVal reverseDirection As Boolean)

Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swSelMgr As SldWorks.SelectionMgr
Dim swTargetFeat As SldWorks.Feature
Dim swAxisEntity As Object
Dim existingPatternFeat As SldWorks.Feature

Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

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

‘ — 1. ガード節:入力値の検証 —
If instanceCount < 2 Then MsgBox "インスタンス数は2以上を指定してください。", vbExclamation, "パラメータエラー" Exit Sub End If Set swFeatMgr = swModel.FeatureManager Set swSelMgr = swModel.SelectionMgr ' --- 2. ターゲットフィーチャの存在確認 --- Set swTargetFeat = GetFeatureByName(swModel, targetFeatureName) If swTargetFeat Is Nothing Then MsgBox "対象フィーチャが見つかりません: " & targetFeatureName, vbCritical, "エラー" Exit Sub End If ' --- 3. 既存パターンの有無をチェック(更新か新規作成かの判定) --- Dim patternName As String patternName = "AutoCircularPattern_" & targetFeatureName Set existingPatternFeat = GetFeatureByName(swModel, patternName) ' 選択クリア swModel.ClearSelection2 True ' ターゲットフィーチャを選択 Dim boolstatus As Boolean boolstatus = swTargetFeat.Select2(False, 1) ' 1 = Append If Not boolstatus Then MsgBox "対象フィーチャの選択に失敗しました。", vbCritical, "エラー" Exit Sub End If ' 軸または円筒面を選択 (ここでは簡易的に軸名エンティティを指定) ' 実務では軸エンティティのポインタを直接取得することを推奨 boolstatus = swModel.Extension.SelectByID2(axisEntityName, "EXTERATED_EDGE_OR_AXIS", 0, 0, 0, True, 2, Nothing, 0) ' --- 4. パターンパラメータの定義 --- Dim angleTotal As Double angleTotal = 314.159265358979 ' 2 PI (360度をラジアンで指定するのがAPIの作法) ' ※SolidWorks APIの多くはラジアンを要求するため 2 3.14159... を使用、または 360度換算 angleTotal = 6.28318530717959 ' 360deg in radians ' FeatureCircularPattern3 の引数仕様: ' Num1(InstanceCount), Ang1(TotalAngle), Reverse1(Direction), ' UseSeedGeometry(GeometryPattern), DName1(SpacingVar1), DName2(SpacingVar2), ' AlignWithSeed(Align), VaryInstance(Vary) If Not existingPatternFeat Is Nothing Then ' 【既存パターンの編集(Update)】 ' 既にパターンが存在する場合は、一度削除して再作成するのが ' ジオメトリの整合性を保つ上で最もバグが少ない(実務的知見) boolstatus = swModel.Extension.DeleteSelection2(swDeleteSelectionOptions_e.swDeleteSelection_Options_Default) End If ' --- 5. 新規サーキュラーパターンの生成 --- Dim swCreatedFeat As SldWorks.Feature ' API実行 (GeometryPattern = False: フィーチャパターンとして実行) Set swCreatedFeat = swFeatMgr.FeatureCircularPattern3( _ instanceCount, _ 6.28318530717959, _ reverseDirection, _ "", _ False, _ False, _ False, _ False) If swCreatedFeat Is Nothing Then MsgBox "サーキュラーパターンの生成に失敗しました。", vbCritical, "APIエラー" Exit Sub End If ' 生成されたフィーチャの名前を変更して識別しやすくする swCreatedFeat.Name = patternName ' 再構築の強制実行 swModel.ForceRebuild3 True Debug.Print "サーキュラーパターン更新成功: " & patternName & " (個数: " & instanceCount & ")" End Sub ' --- ヘルパー関数: 名前からフィーチャオブジェクトを取得 --- Private Function GetFeatureByName(ByVal model As SldWorks.ModelDoc2, ByVal featName As String) As SldWorks.Feature Dim swFeat As SldWorks.Feature Set swFeat = model.FirstFeature Do While Not swFeat Is Nothing If swFeat.Name = featName Then Set GetFeatureByName = swFeat Exit Function End If ' サブフィーチャやコンポーネントの走査が必要な場合はここに拡張 Set swFeat = swFeat.GetNextFeature Loop Set GetFeatureByName = Nothing End Function ---

4. チーフアーキテクトからの実務アドバイス

1. 「更新」か「削除&再作成」か

コード内でも触れたが、既存のパターンパラメータ(`Feature.ModifyDefinition`など)を直接書き換えるアプローチは、モデルが複雑化(コンフィギュレーションや外部参照を含む場合)すると、SolidWorksの内部キャッシュとの不整合を起こしやすい。
「パラメータが変わったら一度パターンを削除し、最新のトポロジーに対してクリーンに再生成する」 という設計の方が、長期的には圧倒的にバグが少ない。これが現場で揉まれたプロの選択だ。

2. データベースやExcel連携時の注意点

もしこのVBAコードをExcelマクロや外部データベース(PDMなど)からの連携で駆動させる場合、「インスタンス数の型」に注意すること。
Excelから渡される数値が `Variant` や `String` のままAPIに流れ込むと、暗黙の型変換エラーや予期せぬ型ミスマッチ(Type Mismatch)を引き起こす。必ず `CInt()` や `CLng()` で厳密に型をキャストしてからAPIへ渡すこと。

総括

SolidWorks VBAの自動化において、最もコストがかかるのは「エラーのデバッグ」であり、最も価値があるのは「仕様変更に動じない頑健性」である。
今回解説した `FeatureCircularPattern3` の制御とべき等性の確保をマスターすれば、フランジやインペラの設計変更地獄から解放される。

あなたの書くコードが、単なる「動くスクリプト」から、現場を支える「強固なエンジニアリングツール」へと昇華することを期待する。

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