SolidWorks APIの深淵:CreateExtrusionFeature2を完全に掌握する
SolidWorks APIを扱うエンジニア諸君。`CreateExtrusionFeature2` は、多くの初心者にとって「とりあえず動くコード」の墓場となりがちだ。しかし、このメソッドを理解することは、自動化の精度を一段階引き上げるための「避けて通れない関門」である。
今回は、単なるメソッドの引数解説ではない。「なぜ、多くの自動化ツールは複雑な形状で破綻するのか」、そして「いかにして堅牢なジオメトリ生成を実装するか」という、実戦的かつアーキテクチャの核心に切り込む。
—
1. なぜ「CreateExtrusionFeature2」で躓くのか
多くのコードが陥る罠は、終了条件(End Condition)と押し出し深さの不整合にある。
`CreateExtrusionFeature2` は非常に強力だが、引数の型や組み合わせを誤ると、SolidWorks内部のジオメトリ計算エンジンが悲鳴を上げ、エラーを吐くか、最悪の場合は不正なフィーチャを生成する。
特に注意すべきは、`ThinFeature`(薄いフィーチャ)とドラフト(勾配)の組み合わせだ。これらを動的に制御する場合、引数のフラグ管理を疎かにしてはならない。
—
2. 堅牢な実装のためのアーキテクチャ指針
実務レベルのコードでは、以下の3原則を遵守せよ。
1. 選択の明確化: `FeatureManager`に食わせる前に、ターゲットとなるスケッチ(または面)を確実に`Select`しておくこと。API実行前の選択状態が不安定であれば、結果は推して知るべし。
2. 型定義の厳格化: 引数にはマジックナンバーを置くな。`swEndConditions_e`などの列挙型を使い、意図を明示せよ。
3. 再計算の制御: 大量生成時には `Rebuild` を都度実行するな。計算資源を食いつぶすだけの無駄だ。
—
3. 実装サンプル:あらゆる条件を制御する「押し出しマスター」
以下のコードは、終了条件を動的に切り替え、薄いフィーチャやドラフトにも対応可能なラッパー関数の雛形である。
‘ 必要な定数を宣言
Public Enum ExtrudeEndCondition
swEndCondBlind = 0
swEndCondThroughAll = 1
swEndCondMidPlane = 6
End Enum
Sub CreateSolidWorksExtrude(ByRef swApp As SldWorks.SldWorks, _
ByVal depth As Double, _
ByVal endCond As Long, _
ByVal isThin As Boolean, _
ByVal thinWidth As Double)
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Set swModel = swApp.ActiveDoc
Set swFeatMgr = swModel.FeatureManager
‘ 引数設計:APIの仕様をそのまま反映しつつ、実務的なフラグを統合
‘ 終了条件(D1), 勾配(DraftAngle), 薄いフィーチャ(Thin)を一括制御
‘ 注意:CreateExtrusionFeature2 は非常に多くの引数を取るため、可読性に注意せよ
Dim myFeat As SldWorks.Feature
Set myFeat = swFeatMgr.CreateExtrusionFeature2( _
True, ‘ bKeepSketch: スケッチを保持するか
False, ‘ bDir1Reverse: 方向反転
False, ‘ bDir2Reverse: 第2方向の反転
endCond, ‘ nDir1Type: 終了条件
0, ‘ nDir2Type: 第2方向の条件(通常は0)
depth, ‘ dDir1Depth: 第1方向の深さ
0, ‘ dDir2Depth: 第2方向の深さ
False, ‘ bDir1Draft: 第1方向のドラフト
False, ‘ bDir2Draft: 第2方向のドラフト
0, 0, ‘ dDir1DraftAngle, dDir2DraftAngle
0, 0, ‘ dDir1Offset, dDir2Offset
False, False, False, ‘ 頂点指定や面指定のオプション
isThin, ‘ bThinFeature: 薄いフィーチャか
0, ‘ nThinType: 1=片方向, 2=両方向, 0=なし
thinWidth, ‘ dThinWidth
0, 0, ‘ dThinCapThickness (キャップ厚み)
False ‘ bMerge: 結果を結合するか
)
If myFeat Is Nothing Then
Err.Raise vbObjectError + 1000, “ExtrudeEngine”, “押し出しフィーチャの生成に失敗しました。”
End If
End Sub
—
4. プロダクション環境における注意点
ファイル連携とデータベース
もし生成するパーツの寸法をデータベースから取得している場合、「バリデーション」をAPI呼び出しの直前に置け。`depth`がゼロであったり、スケッチの形状に対して不可能な`ThinWidth`を指定したりすると、SolidWorksは「フィーチャ生成失敗」という無慈悲な結果を返す。
保守性のための設計思想
本番環境では、`CreateExtrusionFeature2`を直接叩くのではなく、必ずクラスモジュールでラップすること。
「どの条件で失敗したのか」をログとして出力する仕組みを組み込むだけで、深夜のデバッグ作業が半分になるはずだ。
- エラーハンドリング: `FeatureManager`が`Nothing`を返した時、その瞬間の`ModelDoc2`の`LastError`を確認し、ログへ出力せよ。
- 計算の順序: スケッチを先に作成し、`FeatureManager`に認識させるまでの間に、一時的に`swModel.EditRebuild3`を挟むのが最も確実だ。
結びに代えて
自動化とは、単にコードを動かすことではない。「SolidWorksの計算エンジンの癖を理解し、それを手なずけること」である。
諸君が書くコードが、明日の設計者の時間を救う強力な武器となることを期待している。
次は、この押し出しを「アセンブリ内でのコンテキスト編集」に応用する方法について語ろう。あれは、また別の地獄が待っている。
