SolidWorks VBAの深淵:`CreateExtrusionFeature2`による押し出し制御の極致
諸君、SolidWorksの自動化において「なんとなく動くコード」で満足してはいないか?
APIを叩くことは、単なる関数呼び出しではない。SldWorksのカーネル(Parasolid)と対話する行為だ。特に`CreateExtrusionFeature2`は、その広大な引数リストの背後にSolidWorksのジオメトリ生成ロジックが凝縮されている。
今回は、このメソッドを完全に制御下に置き、単なる自動生成を超えた「堅牢なフィーチャ生成アーキテクチャ」を構築するための知見を共有する。
—
1. `CreateExtrusionFeature2`の真実
多くの初学者は、このメソッドを「適当に値を詰めて投げるもの」と勘違いしている。しかし、真のエンジニアは、このメソッドが内部的に「フィーチャの再構築順序(Rebuild Sequence)」にどう介入するかを理解している。
終了条件(End Conditions)の完全掌握
`swExtrusionEndCondition`列挙体は単なるオプションではない。特に`swEndCondThroughAll`(貫通)や`swEndCondMidPlane`(中間)を選択する際、`D1`(押し出し距離)が無視されるわけではない。内部的なデータ整合性を保つため、VBA側でダミー値であっても適切な型を渡さなければ、メモリリークや不正終了のトリガーとなる。
2. 実装コード:堅牢な押し出し生成モジュール
以下に、メモリ管理とオブジェクトのライフサイクルを考慮した実装例を示す。
Option Explicit
‘ メモリ最適化:オブジェクト参照を明示的に解放するパターン
Public Sub CreateSolidExtrusion(ByVal swApp As SldWorks.SldWorks, _
ByVal depth As Double, _
ByVal endCond As Long)
Dim swModel As SldWorks.ModelDoc2
Dim swFeatureMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Set swModel = swApp.ActiveDoc
Set swFeatureMgr = swModel.FeatureManager
‘ 念のための選択解除:フィーチャ作成時の予期せぬ挙動を防ぐ
swModel.ClearSelection2 True
‘ CreateExtrusionFeature2引数の詳細:
‘ bool IsDirection1, bool IsDirection2, bool IsFlipSide1, bool IsFlipSide2,
‘ int Dir1Type, int Dir2Type, double D1, double D2,
‘ bool Draft1, bool Draft2, double DraftAngle1, double DraftAngle2,
‘ bool ThinWall, bool ThinWallType, double WallThickness1, double WallThickness2,
‘ int ThinWallType
‘ ここでは「ブラインド押し出し」かつ「薄いフィーチャ」の制御例を示す
Set swFeat = swFeatureMgr.CreateExtrusionFeature2( _
True, False, False, False, _
endCond, 0, depth, 0, _
False, False, 0, 0, _
False, False, 0, 0, _
0, 0, 0, 0, 0, 0, 0, 0, False)
‘ オブジェクトの明示的解放:VBAのガベージコレクションを待たない
Set swFeat = Nothing
Set swFeatureMgr = Nothing
Set swModel = Nothing
End Sub
3. シニアエンジニアが知るべき「罠」
メモリとパフォーマンスの境界
SolidWorks APIは、COMオブジェクトのラッパーである。`swModel.FeatureManager`をループ内で無造作に呼ぶのは最悪の悪手だ。変数にキャッシュし、処理が終了したら即座に`Set = Nothing`で参照を断つ。大規模なアセンブリ構成や、数千のフィーチャを動的生成する場合、この「解放の作法」がシステム全体の安定性を左右する。
Windows APIとの連携
もし「押し出しが完了するまで次の処理を待機したい」といった高度な同期制御が必要なら、`PostMessage`等のWindows APIを用いてSolidWorksのメインウィンドウメッセージを監視する必要がある。`swApp.SendMsgToUser`のような同期を妨げる手法は論外だ。
Thin Feature(薄いフィーチャ)の落とし穴
`ThinWall`引数を`True`にする場合、`ThinWallType`(外向き、内向き、中央)の設定を誤ると、ジオメトリエラー(自己交差)が発生する。これをVBAで制御する際は、事前に`CheckModelErrors`メソッドを呼び出し、生成後のモデルが破綻していないかを確認する「ガード節」を実装するのが、プロの仕事だ。
4. 総括:レガシーと未来の架け橋
VBAは古臭い言語と言われる。だが、SolidWorksのカーネルと直接対話できるこのインターフェースは、他のモダン言語(Pythonの`win32com`など)よりも遥かに低レイヤーで挙動を制御できる。
重要なのは「どのメソッドを使うか」ではない。「いかにしてSolidWorksの内部状態(State)を汚染せず、かつ確実に意図したフィーチャを刻むか」だ。
次に諸君がコードを書くときは、単に引数を埋めるのではなく、その背後にある`Parasolid`の計算コストを想像してほしい。そうすれば、自ずと美しいコードが書けるようになるはずだ。
以上だ。現場に戻りたまえ。
