SolidWorks APIの深淵:CreateThickenFeatureを完全制御し、ジオメトリ破綻を回避する
SolidWorks APIを操るエンジニア諸君。`ISldWorks`と`IModelDoc2`の海を渡り歩いてきた者なら、一度は`CreateThickenFeature`で苦汁を舐めた経験があるはずだ。
「なぜ厚み付与でフィーチャがエラーを吐くのか」「なぜマイナス方向への生成が不安定なのか」。
表面的なヘルプの記述をなぞるだけでは、複雑な曲面を扱うプロダクション環境での自動化は不可能だ。今日は、この泥沼を回避し、堅牢なサーフェス・ソリッド変換システムを構築するための「極限の知見」を共有する。
—
1. CreateThickenFeatureの構造的罠を解剖する
`IFeatureManager.CreateThickenFeature`は、単なる数値入力ではない。このメソッドは、バックエンドでParasolidカーネルに対するトポロジー再計算を強制する。
ここで最も陥りやすい罠が、「サーフェスの法線ベクトルとオフセット方向の不一致」だ。API側で指定する`Thickness`引数に負の値を渡せば反転するが、単に数値をいじるだけでは、サーフェスの法線が予測不能な向きにある場合、再計算でトポロジーの整合性が取れず、フィーチャは沈黙する。
解決策:法線ベクトルの動的解析
厚みを付ける前に、対象となるサーフェスの法線ベクトルを算出し、目的のソリッド化方向との内積を取る必要がある。これを行わず「勘」で数値を指定するのは、プロの仕事ではない。
—
2. 堅牢な実装:メモリ解放と例外ハンドリング
VBAにおいて、`ISurfaceBody`オブジェクトや`IFeature`の扱いはメモリリークの温床だ。特にループ処理内でインスタンスを乱造すれば、SolidWorksのプロセスは確実に不安定化する。
以下のコードは、単なる実装例ではない。再計算のオーバーヘッドを最小化し、メモリを確実に解放するプロトタイプだ。
‘ 伝説的なチーフアーキテクトによるThicken実装のテンプレート
Public Sub RobustThicken(swModel As ModelDoc2, swSurfaceBody As SurfaceBody, dThickness As Double, iDir As Integer)
Dim swFeatMgr As IFeatureManager
Dim swFeat As IFeature
‘ 1. オブジェクトの明示的参照
Set swFeatMgr = swModel.FeatureManager
‘ 2. パフォーマンス向上のための更新一時停止
swModel.FeatureManager.EnableFeatureTree = False
‘ 3. Thicken実行:iDir(1=外側, 2=両側, 3=内側)
‘ 内部的にはAPIが再構築を行うため、エラーハンドリングは必須
On Error GoTo ErrorHandler
Set swFeat = swFeatMgr.CreateThickenFeature(dThickness, iDir, True)
‘ 4. 成功チェック:フィーチャが生成されたかを確認
If swFeat Is Nothing Then
Err.Raise vbObjectError + 1001, “RobustThicken”, “サーフェスの厚み付与に失敗しました。”
End If
CleanExit:
‘ 5. メモリ解放:VBAのGCを過信しない
Set swFeat = Nothing
Set swFeatMgr = Nothing
swModel.FeatureManager.EnableFeatureTree = True
Exit Sub
ErrorHandler:
Debug.Print “Critical Error: ” & Err.Description
Resume CleanExit
End Sub
—
3. レガシー環境とWindows APIの活用
大規模な自動化システムでは、SolidWorksの応答待ちでGUIがフリーズすることがある。`DoEvents`で凌ぐのは三流のやり方だ。
Windows APIの`Sleep`関数や、`GetQueueStatus`を用いて、SolidWorksのイベントループを阻害せずにCPU負荷を制御せよ。また、生成したフィーチャが意図した体積を持っているか、`IMassProperty`を使用して、生成直後に計算を行い、許容範囲外であれば即座にロールバックする検証ロジックを組み込むこと。これが、設計変更に強いシステムを作る唯一の道だ。
—
4. チーフアーキテクトからの提言
サーフェスからソリッドへの変換は、単なる「厚み付け」ではない。それは、「数学的な連続性を物理的な質量へ変換する行為」だ。
- 法線反転の回避: `IFace2.Normal`を用いて法線ベクトルを事前に計算せよ。
- ゼロ厚みの阻止: 許容値(通常1e-9m程度)を算出し、それ以下の厚みを指定しないバリデーションを実装せよ。
- 履歴の管理: 不要なフィーチャを量産せず、可能であれば`DeleteBody`や`InsertThicken`を使い分け、モデルのフットプリントを最小化せよ。
SolidWorks VBAは、決して「書かされている」言語ではない。あなたが制御の主導権を握り、カーネルの挙動を予測し、メモリの最後の一滴まで管理したとき、初めてあなたのコードは「プロダクション・クオリティ」という称号を授かる。
諸君、コードを書け。ただし、ただ動くものを作るな。「壊れない」ものを作れ。
