【SolidWorks APIの深淵】カットフィーチャ「オフセット」の罠を制する者だけが自動化を極める
SolidWorks APIを触り始めて数年、多くのエンジニアが「押し出しカット」の壁にぶつかる。特に、GUI上では当たり前に存在する「サーフェスまでオフセット」といった終了条件をVBAで記述しようとした瞬間、記録されたマクロのコードが期待通りに動かない事実に直面する。
なぜか? それは、SolidWorksのAPIが「UIの操作手順」をそのまま記録するのではなく、「数学的定義の集積」を要求するからだ。今回は、単なるリファレンスの引き写しではない、実務で死なないための「カットフィーチャ・終了条件」の真髄を伝授する。
—
1. `swEndConditions_e` の幻想と現実
多くの初心者が `swFeatureManager.FeatureCutExtrusion2` を叩く際、`EndCondition` 引数に `swEndConditions_e.swEndCondOffsetFromSurface` を指定すれば万事解決だと考える。しかし、現実は甘くない。
「オフセット」を指定するということは、単に数値を渡すだけではなく、参照面とオフセット値、そして「オフセット方向」という三位一体の情報を正しくスタックに積む必要がある。
特に注意すべきは、`Offset` 値の符号だ。API内部では常に「サーフェスから外側へ」が正の値として定義されることが多いが、形状によってはこれが反転する。ここをコードで吸収しなければ、自動化ツールは「予期せぬジオメトリエラー」で停止する。
—
2. 【極限の知見】実装コード:安定性とメモリ管理
単に動くだけのコードはゴミだ。メモリを食いつぶすCOMオブジェクトの解放、そして例外処理を組み込んだ「実務仕様」のコードを見てほしい。
‘ 伝説的な堅牢性を備えたカットフィーチャ生成のひな型
Public Sub CreateOffsetCut(swModel As SldWorks.ModelDoc2, targetFace As SldWorks.Face2, offsetValue As Double)
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
‘ 1. オブジェクトの明示的参照とエラーハンドリングの準備
On Error GoTo ErrorHandler
Set swFeatMgr = swModel.FeatureManager
‘ 2. 終了条件の定義: swEndCondOffsetFromSurface = 10
‘ 注意: 最後の引数が「オフセット値」を決定する
‘ パラメータの詳細はAPIヘルプの引数順序を「物理的・数学的」に読み解くこと
Set swFeat = swFeatMgr.FeatureCutExtrusion2( _
True, False, False, _
10, 0, _ ‘ EndCondition = 10 (Offset), Direction = 0
0.005, 0.005, _ ‘ Depth1, Depth2
False, False, _
False, False, _
0, 0, _
0, 0, _
False, False, False)
‘ 3. 正常終了後の解放処理
‘ GCに頼らない。COMオブジェクトは自らの手でNullを代入し、スタックから排除する
Set swFeat = Nothing
Set swFeatMgr = Nothing
Exit Sub
ErrorHandler:
Debug.Print “Error: ” & Err.Description
‘ 異常終了時もオブジェクト参照を破棄してメモリリークを防ぐ
Set swFeat = Nothing
Set swFeatMgr = Nothing
End Sub
—
3. APIの罠を突破する3つの鉄則
1. `FeatureManager` の再利用を避けろ
複雑なフィーチャ生成を行う際、`FeatureManager` をグローバル変数に持たせ続けるのは悪手だ。処理ごとにインスタンス化し、スコープを抜ける際に即座に `Nothing` を代入する。SolidWorksはCOMベースのアーキテクチャであり、参照カウントが残ったままのオブジェクトは、後のメモリ枯渇や「ドキュメントのフリーズ」を招く最大の要因となる。
2. `SelectByID2` への過度な依存は「死」
`SelectByID2` で面を選択してフィーチャを作る手法は、レガシーマクロによく見られるが、モデルのIDが変動した瞬間に破綻する。可能な限り `IFace2` や `IEntity` オブジェクトを直接選択状態にする手法をとること。面やエッジを特定する際は、`GetEntityName` や独自の属性IDを付与する運用を推奨する。
3. Windows APIによるウィンドウハンドルの強制制御
SolidWorksのダイアログが背面に隠れて停止するような状況は、`SetForegroundWindow` 等のWin32 APIを呼ぶことで回避できる。自動化システムにおいて「GUIが応答しなくなる」のは、システム設計者としての敗北だ。常に最前面を制御し、非同期処理の競合を監視せよ。
—
最後に:自動化とは「予測」である
「すべての面」「オフセット」といった終了条件を自動化することは、単なるプログラミングではない。設計意図をコードに落とし込み、どんな形状変更にも追従できる「ロバストなジオメトリモデル」を定義する行為だ。
VBAは古い言語かもしれない。だが、SolidWorksのエンジンを制御するその手先は、今もなお最前線にある。コードの1行1行に意味を込め、メモリの最後の一滴まで管理する。それが、我々エンジニアが守るべき美学だ。
もし貴方のコードがエラーを吐き出したなら、それはSolidWorksのバグではない。貴方の「数学的定義の解釈」が甘いだけだ。さあ、IDEに戻り、もう一度オブジェクトのライフサイクルを見つめ直してほしい。
