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に魂を吹き込め。
