【テクニカル・上級編】【サーフェスモデリング】SurfaceTrim2を活用した複雑なトリム面生成と、KnitSurfacesによるソリッド化処理 – SolidWorks VBA解析バイブル

スポンサーリンク

境界なき曲面の構築:SurfaceTrim2とKnitSurfacesによるソリッド化の極意

SolidWorks APIにおけるサーフェスモデリングは、単なる「面」の操作ではない。それは、メモリ空間上に数学的な境界を定義し、それを完璧なトポロジーへと昇華させる「構築の美学」である。

多くのエンジニアが `FeatureManager` の記録に頼り、処理の不安定さに頭を抱える中、真の自動化エンジニアはモデルのトポロジー構造を直接支配する。今回は、`SurfaceTrim2` を用いた動的なトリムと、その後の `KnitSurfaces` によるソリッド化という、自動化の最難関領域を解剖する。

1. 悲劇を避けるための前提:メモリとオブジェクトのライフサイクル

VBAのガーベジコレクションを過信してはならない。特に `ISldWorks` や `IModelDoc2` のような広域オブジェクトと、`IFeature` や `IBody2` といった局所的なオブジェクトを混在させると、COM参照のリークが必ず発生する。

  • 明示的解放の鉄則: `Set obj = Nothing` を怠ることは、大規模モデルを扱う際にアプリをクラッシュさせる直結要因となる。
  • セレクションの罠: `SelectionManager` を介した選択処理は極めて低速である。可能な限り、APIの引数に直接オブジェクトを渡す `FeatureBySelection` 系ではなく、オブジェクト参照そのものをハンドリングするアーキテクチャを構築せよ。

2. 実装:SurfaceTrim2による高精度トリミング

`SurfaceTrim2` は、トリム対象のサーフェスと、それを切断するナイフとなるサーフェス(またはスケッチ)をいかに正確に `Dispatch` させるかが勝負だ。

‘ 伝説的なチーフアーキテクトによる、堅牢なトリム処理実装例
Public Sub ExecuteSurfaceTrim(swModel As ModelDoc2, targetSurf As Object, toolSurf As Object)
Dim swFeatureMgr As FeatureManager
Set swFeatureMgr = swModel.FeatureManager

‘ トリム実行時のオプション設定
‘ swSurfaceTrimType_Standard: 通常のトリム
‘ swSurfaceTrimOption_KeepSelections: 保持する領域を明示

‘ 重要: 選択セットをクリアし、必要なオブジェクトのみを確実に選択する
swModel.ClearSelection2 True
targetSurf.Select2 True, 0
toolSurf.Select2 True, 0

‘ SurfaceTrim2の実行(第4引数のKeepSelectionsは配列で渡すのが鉄則)
Dim swFeat As Feature
Set swFeat = swFeatureMgr.InsertSurfaceTrim(swSurfaceTrimType_Standard, _
True, _
False, _
Nothing, _
0)

‘ 生成されたオブジェクトの解放
Set swFeatureMgr = Nothing
Set swFeat = Nothing
End Sub

3. KnitSurfacesの落とし穴:水密性の検証

サーフェスを縫い合わせ、ソリッドへと昇華させる `KnitSurfaces` は、SolidWorksのカーネル(Parasolid)が最も神経を使う領域だ。特に「隙間(Gap)」の許容値設定を誤ると、ソリッド化に失敗し、モデルは「面」のままで放置される。

堅牢なKnitSurfaces構築ロジック

Public Sub KnitSurfacesOptimized(swModel As ModelDoc2, surfBodies As Variant)
Dim swFeatMgr As FeatureManager
Set swFeatMgr = swModel.FeatureManager

‘ 許容値(Tolerance)はモデル単位系に依存する。
‘ 自動化では GetSystemTolerance を使用して常に動的に計算せよ。
Dim tol As Double
tol = swModel.GetSystemTolerance(swSystemTolerance_Knit)

‘ 縫い合わせの実行
‘ 第4引数(True)で、結果が閉じた形状であれば自動的にソリッド化させる
Dim swKnitFeat As Feature
Set swKnitFeat = swFeatMgr.InsertSewSurface(surfBodies, _
tol, _
True, _
True, _
True, _
False)

If swKnitFeat Is Nothing Then
Err.Raise vbError, “KnitSurfaces”, “ソリッド化に失敗しました。隙間が許容値を超えています。”
End If

‘ メモリ最適化
Set swFeatMgr = Nothing
Set swKnitFeat = Nothing
End Sub

4. シニアエンジニアのための極限の知見

1. Windows APIの活用:
長時間実行されるモデリングプロセスでは、`DoEvents` を多用しすぎるとスタックオーバーフローや描画のフリーズを招く。`Sleep` 関数(kernel32)を適切に挿入し、メッセージキューを解放しながらモデルの再構築(`Rebuild`)を待機させるのがプロの作法だ。
2. レガシー保守:
古いSolidWorksバージョンと最新版が混在する環境では、`Late Binding`(Object型)を使用すべきかという議論があるが、パフォーマンスを重視するなら `Early Binding` でインターフェースを固定し、各バージョンごとの条件分岐でラッパー関数を書くのが唯一の解である。
3. システム間連携:
JSONやXMLで定義されたパラメータを読み込み、モデリングを行う場合、必ず「プレフライトチェック」を実装せよ。トリムする前に面の交差判定をAPIで行い、エラーフラグを事前に検知するルーチンが、深夜のシステムダウンを防ぐ唯一の盾となる。

結びに代えて

自動化とは、単なるコードの記述ではない。SolidWorksという巨大なブラックボックスの内部構造を理解し、その挙動を制御下におくことである。今回紹介した `SurfaceTrim2` と `KnitSurfaces` の制御は、複雑な幾何形状を扱う上での第一歩に過ぎない。

諸君が書くコードが、明日のエンジニアたちの工数を数千時間削減することを期待している。コードを慈しみ、メモリを敬い、そして何より、モデルの整合性を愛せ。

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