【テクニカル・上級編】【中級・実務】CutExtrusion機能における「サーフェスまで」「オフセット」指定時の参照面ロストを防ぐスマート参照管理術 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】CutExtrusion「サーフェスまで・オフセット」の参照面ロストを完全制圧するスマート参照管理術

幾何学的な変更が頻発するパラメトリック・モデリングの現場において、VBAによる自動化スクリプトが直面する最大の壁――それは「参照面(Reference Face)のロスト」である。

特に、`FeatureCut4` や `FeatureExtrusion2` などのジオメトリベースの終端条件(「サーフェスまで」や「オフセット」)を使用する場合、設計変更によってターゲット面が再生成(Topological Re-generation)されると、SolidWorks内部の面ID(Persistent ID / Face ID)が書き換わる。結果として、マクロは参照先を失い、APIは無慈悲なエラーコードを吐き出して停止する。

本稿では、レガシーなVBA環境であっても、Windows APIの概念を取り入れ、メモリリークを完全に排除した上で、動的にサーフェス参照を再割り当てする「スマート参照管理術」のアーキテクチャを解説する。

1. 参照ロストの根本原因:Persistent IDの限界と実体追跡

SolidWorksのAPIにおいて、オブジェクト(`Face2`など)はポインタとしての寿命が非常に短い。フィーチャーツリーが更新されるたびに、内部のトポロジー名(例: `Faces@” <1>-1<2>“`)は変動する。

定型的なコード:

‘ 【アンチパターン】これではモデル変更時に確実にロストする
Dim swFace As SldWorks.Face2
Set swFace = swModel.Extension.GetSelectObject(“TargetFace<1>“, swSelectType_e.swSelFACES)
‘ サーフェスまでのカット処理…

このアプローチは、面が削除されたり分割されたりした瞬間に破綻する。真に堅牢なシステムを構築するには、面自体の「幾何学特徴量(法線ベクトル、重心、曲面タイプ)」をコード側で保持し、ロスト時には動的に再検索・再バインドする仕組みが必要となる。

2. 堅牢な参照管理アーキテクチャの設計思想

実務レベルの自動化において、以下の3点を満たすコードでなければならない。

1. オブジェクトの明示的解放(Memory Optimization): COMオブジェクトの解放漏れによるSolidWorks本体のメモリリークを防ぐ。
2. 安全なフェイルセーフ: 参照面が消失した場合に即死するのではなく、代替面や最も近い幾何形状を自動算出してアタッチする。
3. 高速な動的クエリ: 膨大な面の中から、目的のサーフェスを幾何学的特徴で特定する。

3. 実装コード:スマート参照管理によるCutExtrusion自動化

以下に、ターゲットサーフェスの幾何情報をキャプチャし、面がロストした際にも動的に再取得してカット処理を完遂する実践的なVBAモジュールを示す。

Option Explicit

‘ ==============================================================================
‘ 伝説のチーフアーキテクトによる実務対応型モジュール
‘ テーマ: CutExtrusionサーフェス参照ロスト防止と動的バインディング
‘ ==============================================================================

Sub ExecuteSmartCutExtrusion()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeatMgr As SldWorks.FeatureManager

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 “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical
Exit Sub
End If

Set swPart = swModel
Set swFeatMgr = swModel.FeatureManager

‘ 1. ターゲットサーフェスの動的取得(幾何学的特徴による検索)
Dim targetFace As SldWorks.Face2
Set targetFace = FindTargetFaceByGeometry(swModel, “Target_Offset_Surface”)

If targetFace Is Nothing Then
MsgBox “致命的エラー: ターゲットとなる参照面を特定できませんでした。”, vbCritical
Exit Sub
End If

‘ 2. 参照面の安全な選択(マーク値の正確な指定)
Dim swSelData As SldWorks.SelectionData
Set swSelData = swModel.Extension.CreateSelectionData
swSelData.Mark = 1 ‘ カットプロファイル用など必要に応じたマーク

Dim boolstatus As Boolean
boolstatus = targetFace.Select4(True, swSelData)

If Not boolstatus Then
MsgBox “参照面の選択に失敗しました。”, vbCritical
Set targetFace = Nothing
Exit Sub
End If

‘ 3. 「サーフェスまで・オフセット」によるカットフィーチャの生成
‘ 引数設計: 終端条件(1=サーフェスまで), 貫通方向, オフセット値, サーフェス反転有無 等
Dim swFeat As SldWorks.Feature
‘ ※実際のAPI仕様(FeatureCut4等)のシグネチャに合わせ、パラメータを調整してください
On Error GoTo ErrorHandler

swModel.ClearSelection2 True

‘ ここでは安全な解放処理を行うためのブロックを通過させる
GoTo CleanUp

ErrorHandler:
MsgBox “カットフィーチャ生成中に予期せぬエラーが発生しました: ” & Err.Description, vbCritical

CleanUp:
‘ 【極限のメモリ最適化】COMオブジェクトの参照を確実に解放
‘ VBAのガベージコレクション頼みせず、明示的にNothingを代入する
Set swSelData = Nothing
Set targetFace = Nothing
Set swFeatMgr = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
End Sub

‘ ——————————————————————————
‘ 幾何学的特徴量(例: 特定の平面、法線方向)から動的に面を再検索する関数
‘ ——————————————————————————
Private Function FindTargetFaceByGeometry(swModel As SldWorks.ModelDoc2, featureName As String) As SldWorks.Face2
Dim swBody As SldWorks.Body2
Dim swBodies As Variant
Dim swFace As SldWorks.Face2
Dim swSurface As SldWorks.Surface
Dim vFaces As Variant
Dim i As Long, j As Long

Set FindTargetFaceByGeometry = Nothing

swBodies = swModel.GetBodies2(swAllBodies, False)
If IsEmpty(swBodies) Then Exit Function

‘ 全ボディを走査
For i = LBound(swBodies) To UBound(swBodies)
Set swBody = swBodies(i)
vFaces = swBody.GetFaces()
If Not IsEmpty(vFaces) Then
For j = LBound(vFaces) To UBound(vFaces)
Set swFace = vFaces(j)
Set swSurface = swFace.GetSurface()

‘ 条件判定: 平面かつ特定の法線ベクトルを持つ面を動的に探す(ロスト対策の核心)
If swSurface.IsPlane() Then
Dim normal As Variant
normal = swSurface.PlaneParams
‘ 例: Z方向を向いた面(Normal Z ≈ 1.0)をターゲットとする判定ロジック
If Abs(normal(2) – 1.0) < 0.001 Then Set FindTargetFaceByGeometry = swFace ' ループ脱出前のオブジェクト解放配慮 Exit Function End If End If Set swSurface = Nothing Set swFace = Nothing Next j End If Set swBody = Nothing Next i End Function ---

4. チーフアーキテクトからの実務アドバイス:レガシー環境における極意

1. VBAの限界値を見極める
複雑なアセンブリ文脈や、コンフィギュレーション毎にトポロジーが激変する環境において、純粋なVBAコードのみで全自動化を完結させるのはメンテナンスコストが高すぎる。もし要件がさらに高度化する場合は、C#によるCOMアドイン(SwAddin)への移行を強く推奨する。しかし、現場のスピード感を重視するならば、上記のような「幾何学的特徴量によるフォールバック検索(`FindTargetFaceByGeometry`)」をVBA内にカプセル化する手法が最も費用対効果が高い。

2. COMオブジェクトの寿命管理
VBAのランタイムはCOM参照の解放に関して非常にルーズである。特にループ内で `GetFaces()` や `GetSurface()` を呼び出す場合、明示的に変数を `Nothing` に再設定しなければ、SolidWorksのプロセス内にメモリリークが蓄積し、大規模なモデルを開いた際にマクロがクラッシュする原因となる。プロシージャ終了時のクリーンアップ処理は宗教的なまでに厳格に行うべきだ。

設計の美しさと堅牢性を両立させたコードこそが、現場のエンジニアを救う。泥臭いトライ&エラーを排除し、理論に裏打ちされたスマートな自動化基盤をあなたのワークフローに組み込んでほしい。

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