【テクニカル・上級編】【サーフェスモデリング】FilledSurfaceやBoundSurfaceをVBAから駆使して複雑な三次元曲面を創る – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks APIの極致:複雑曲面からソリッドを生成するアルゴリズムの真髄

SolidWorksのAPI開発において、ソリッドモデリングのルーチンワークは「自動化の入り口」に過ぎない。真のエンジニアが立ち向かうべきは、不安定な境界条件、計算コストの増大、そしてメモリリークという深淵である。

本稿では、`FilledSurface`(フィルサーフェス)と`BoundarySurface`(境界サーフェス)を駆使し、非定常な曲面を生成、最終的に`CreateSolidFromSurfaces`で堅牢なソリッドへと昇華させるための、アーキテクト級の知見を授ける。

1. 境界条件の抽象化とメモリの最適化

VBA(COMインターフェース)の最大の弱点は、オブジェクトの参照カウンタ管理の甘さにある。特にサーフェスモデリングにおいて、一時的に生成される`Entity`や`Face`を適切に開放しなければ、数千回のループを回す自動生成プロセスは必ずメモリ破壊に至る。

オブジェクト解放の鉄則

`Set obj = Nothing`だけでは不十分だ。APIが返す`Dispatch`ポインタの生存期間を意識し、スコープを最小限に絞る。

‘ メモリリークを最小化するためのカプセル化パターン
Private Sub SafeRelease(ByRef obj As Object)
If Not obj Is Nothing Then
‘ COM参照カウンタを明示的に解放し、GCの介入を待たない
Set obj = Nothing
End If
End Sub

2. 境界サーフェス(BoundarySurface)生成のロジック

複雑な曲面生成において最も重要なのは、サーフェスの「連続性(G1, G2)」の制御である。UI上では単純なクリック操作も、API上では`BoundarySurfaceFeatureData`を正しく定義しなければならない。

実践的実装コード:境界サーフェスの生成

Sub CreateComplexBoundarySurface(swApp As SldWorks.SldWorks, swModel As SldWorks.ModelDoc2)
Dim swFeatMgr As SldWorks.FeatureManager
Set swFeatMgr = swModel.FeatureManager

‘ 境界サーフェス定義データ構造の初期化
Dim swBoundaryData As SldWorks.BoundarySurfaceFeatureData
Set swBoundaryData = swFeatMgr.CreateDefinition(swFeatureType_e.swFeatureTypeBoundarySurface)

‘ 選択セットの構築(事前にエッジを選択しておく必要がある)
‘ 注意:選択は可能な限りIDベースで行う。名前ベースはレガシー環境では脆弱

‘ 拘束条件の設定:G2曲率連続を保証
swBoundaryData.Direction1Constraint = swBoundaryConstraint_e.swBoundaryConstraintCurvature
swBoundaryData.Direction2Constraint = swBoundaryConstraint_e.swBoundaryConstraintCurvature

‘ 特徴の生成
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.CreateFeature(swBoundaryData)

‘ 終了後の後処理
SafeRelease swBoundaryData
SafeRelease swFeat
End Sub

3. サーフェスの縫合とソリッド化:CreateSolidFromSurfacesの深淵

サーフェスモデルがどれほど美しくとも、それが「閉じた空間」を定義していなければ、`CreateSolidFromSurfaces`はエラーを吐き、あるいは無視する。

ここで重要になるのが、「縫合(Knit)の閾値」である。デフォルトの許容差(Tolerance)は、複雑なモデルではしばしば不整合を起こす。

サーフェスからソリッドへの変換ルーチン

Public Function ConvertToSolid(swModel As SldWorks.ModelDoc2, surfaceFeatures As Variant) As Boolean
‘ 縫合サーフェスフィーチャの生成
Dim swKnit As SldWorks.Feature
‘ 許容差を明示的に指定して縫合を行うのがプロの流儀
Set swKnit = swModel.FeatureManager.InsertSewSurface(surfaceFeatures, 1, 0.00001, True, True)

‘ ソリッド化の試行
If Not swKnit Is Nothing Then
‘ 閉じたサーフェスをソリッドに変換
swModel.FeatureManager.CreateSolidFromSurfaces swKnit
ConvertToSolid = True
Else
‘ ここでエラーハンドリングを徹底する
Err.Raise vbObjectError + 1001, “SolidOptimizer”, “サーフェスの縫合に失敗しました。隙間を確認してください。”
End If
End Function

4. 伝説的アーキテクトからの忠告

レガシー環境でのAPI呼び出し

Windows API(`User32.dll`等)を併用してダイアログを制御したり、メモリマップドファイルを介して外部システムと連携する場合、「SolidWorksのメインスレッドをブロックしないこと」が鉄則だ。`DoEvents`の多用はパフォーマンスを殺す。代わりに`Sleep`関数やイベント駆動型の設計を採用せよ。

パフォーマンスの極限

  • 再構築(Rebuild)の抑制: `swModel.ForceRebuild3`は必要なタイミングでのみ発行せよ。ループ内での再構築は、計算負荷を指数関数的に増大させる。
  • 選択の最適化: `swModel.Extension.SelectByID2`は強力だが、遅い。内部的な`ISelectionMgr`と`Entity`の直接参照を優先せよ。

結びに

複雑な三次元曲面をコードで書き起こすことは、単なる自動化ではない。それは、CADという仮想空間の中に、数学的な秩序を構築する行為である。

今回紹介した手法は、SolidWorksが提供する最も強力なAPIの表面をなぞったものに過ぎない。しかし、この「オブジェクトライフサイクルの管理」と「幾何学的な厳密さ」こそが、あなたの作るシステムを「動くツール」から「壊れないインフラ」へと進化させる唯一の鍵となる。

諸君、コードを書け。そして、CADに魂を吹き込め。

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