【テクニカル・上級編】【押し出しボス徹底攻略】FeatureManager.FeatureExtrusion3メソッドのパラメータ解析と、ドラフト角度付きブラインド押し出しの実装 – SolidWorks VBA解析バイブル

スポンサーリンク

【押し出しボス徹底攻略】FeatureManager.FeatureExtrusion3メソッドのパラメータ解析と、ドラフト角度付きブラインド押し出しの実装

SolidWorks VBAの自動化において、最も頻繁に呼び出される基幹メソッドの一つが `FeatureManager.FeatureExtrusion3` である。
単なる直方体のジェネレートであれば公式レコーダーの出力をそのまま貼り付ければ事足りるが、実務の現場――特に金型設計や樹脂成形品、鍛造品の自動生成パイプラインにおいては、抜き勾配(Draft)、方向反転、終端条件の動的制御といった複雑な幾何公差をコード側で完全に掌握していなければならない。

今回は、レガシーなマクロ記録の呪縛から脱却し、`FeatureExtrusion3` の全パラメータの物理的意味を解体した上で、ドラフト角度付きブラインド押し出しを確実に成功させるための実践的コードと極限の知見を公開する。

1. 伝説的アーキテクトが暴く:`FeatureExtrusion3` の全引数完全解析

多くの開発者が挫折する理由は、引数の数が多すぎる点と、それぞれの引数が持つ「内部状態(State)」の依存関係を理解していないことにある。まずは、この巨大なメソッドの全貌を直視しよう。

Dim swFeat As Feature
Set swFeat = swModel.Extension.FeatureManager.FeatureExtrusion3( _
Bp As Boolean, _
Dir As Boolean, _
BothDir As Boolean, _
T1 As Long, _
T2 As Long, _
D1 As Double, _
D2 As Double, _
Dchk1 As Boolean, _
Dchk2 As Boolean, _
Ddir1 As Boolean, _
Ddir2 As Boolean, _
Dang1 As Double, _
Dang2 As Double, _
OffsetReverse1 As Boolean, _
OffsetReverse2 As Boolean, _
TranslateSurface1 As Boolean, _
TranslateSurface2 As Boolean, _
Merge As Boolean, _
UseFeatScope As Boolean, _
UseAutoSelect As Boolean _
)

この中でも、「ドラフト角度付きブラインド押し出し」を実装する上で生死を分ける重要パラメータを抜粋して解説する。

核心をなすパラメータ群

  • `Bp` (Boolean): ースケッチ平面からオフセットして押し出しを開始するか(通常は `False` = スケッチ平面から開始)。
  • `Dir` (Boolean): 押し出し方向の反転。`True` にすると、スケッチの法線ベクトルとは逆方向にソリッドが生成される。
  • `T1` (Long): 終端条件(End Condition)。ブラインド(片側等距離)の場合は `0`(`swEndCondBlind`)を指定する。
  • `D1` (Double): 押し出し深さ(メートル単位)。VBA内部では常にSI単位系(m)で処理されるため、ミリメートルで指定する場合は `10# / 1000#` のように換算が必須。
  • `Dchk1` (Boolean): 抜き勾配(Draft)の有効化スイッチ。`True` にすることで `Dang1` が有効になる。
  • `Ddir1` (Boolean): 抜き勾配の方向。`True` で「外向き(Draft Outward)」、`False` で「内向き(Draft Inward)」にテーパーが掛かる。
  • `Dang1` (Double): 抜き勾配の角度。ラジアン角で指定する点に強烈な注意が必要である。度数法(Degree)を `Deg Atn(1) / 45` で変換するロジックを怠ると、意図せぬ幾何エラーを引き起こす。
  • `Merge` (Boolean): マルチボディ環境下で既存のボディとマージ(合体)するか。`True` で結合、`False` で新規ボディ作成。

2. 実務の現場で直面する「罠」とメモリ管理の鉄則

SolidWorks APIを扱う上で、COMオブジェクトのライフサイクル管理とドキュメントコンテキストの維持はプロフェッショナルの絶対条件である。

オブジェクトの明示的解放

VBAのガベージコレクションは頼りにならない。特に `SelectionManager` や `Feature` オブジェクトをループ内で生成・破棄する場合、メモリリークやCOMコンテキストの崩壊を引き起こす。
処理の終端では必ず `Set obj = Nothing` を明記し、SolidWorksのプロセス空間へリソースを返還すること。

単位系(Unit)の罠

API生データは常にメートル法(MKS)で動作する。UI上の単位設定(mm, inch)に依存したコードを書くと、別環境に移した瞬間に数千倍の巨大な形状が生成されたり、マイクロ単位の目に見えないエラーが発生する。必ずコード内で明示的な単位換算(ミリメートルからメートルへの変換)を挟むこと。

3. 【実践コード】ドラフト付きブラインド押し出しの完全自動化

以下のコードは、アクティブなパーツファイルに対し、原点を中心とした長方形のスケッチを描き、「内向き 5度の抜き勾配を持つ高さ 50mm のブラインド押し出し」を一撃で生成する実用プロシージャである。

Option Explicit

Sub CreateDraftedExtrusionSample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swSkMgr As SldWorks.SketchManager
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature

‘ 1. アプリケーションおよびドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If

‘ パーツコンテキストの確認
If swModel.GetType() <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “Context Error”
Exit Sub
End If

Set swPart = swModel
Set swSkMgr = swModel.SketchManager
Set swFeatMgr = swModel.Extension.FeatureManager

‘ 2. 処理の高速化(画面描画の凍結)
swModel.ViewZoomtoFit2
swModel.ClearSelection2 True

‘ 3. 基準平面(Front平面)の選択とスケッチモード突入
‘ 多くのトラブルは平面の選択漏れやコンテキストの不一致に起因する
Dim bRet As Boolean
bRet = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not bRet Then
MsgBox “基準平面 ‘正面’ の選択に失敗しました。”, vbCritical
Exit Sub
End If

swSkMgr.InsertSketch True

‘ 4. 2Dジオメトリの生成(中心基準の長方形: 100mm x 60mm)
‘ API内部処理のため、寸法はメートル(m)で指定する
Dim width As Double, height As Double
width = 0.1 ‘ 100mm
height = 0.06 ‘ 60mm

‘ コーポレートスタンダードに則った中心長方形描画
‘ CreateCenterRectangle(x1, y1, z1, x2, y2, z2)
Call swSkMgr.CreateCenterRectangle(0, 0, 0, width / 2, height / 2, 0)

‘ スケッチの終了
swSkMgr.InsertSketch False

‘ 5. パラメータの定義と FeatureExtrusion3 の実行
‘ 【重要】ドラフト角度はラジアンに変換すること (5度 = 5 PI / 180)
Dim draftAngleRad As Double
draftAngleRad = 5# (Atn(1) / 45#) ‘ 5度

Dim depth As Double
depth = 0.05 ‘ 50mmのブラインド押し出し

‘ 引数の完全指定による FeatureExtrusion3 の呼び出し
‘ Bp = False (スケッチ面から)
‘ Dir = False (順方向)
‘ BothDir = False (片側)
‘ T1 = 0 (swEndCondBlind)
‘ T2 = 0
‘ D1 = depth (50mm)
‘ D2 = 0
‘ Dchk1 = True (抜き勾配有効)
‘ Dchk2 = False
‘ Ddir1 = False (内向きドラフト: Draft Inward)
‘ Ddir2 = False
‘ Dang1 = draftAngleRad (5度)
‘ Dang2 = 0
‘ OffsetReverse1 / 2 = False
‘ TranslateSurface1 / 2 = False
‘ Merge = True (既存ボディに合体)
‘ UseFeatScope = True
‘ UseAutoSelect = True

Set swFeat = swFeatMgr.FeatureExtrusion3( _
False, _
False, _
False, _
0, _
0, _
depth, _
0, _
True, _
False, _
False, _
False, _
draftAngleRad, _
0, _
False, _
False, _
False, _
False, _
True, _
True, _
True _
)

‘ 6. 結果の検証とメモリ解放
If Not swFeat Is Nothing Then
swModel.GraphicsRedraw2
MsgBox “抜き勾配付きボス押し出しの生成に成功しました。”, vbInformation, “Success”
Else
MsgBox “FeatureExtrusion3の実行に失敗しました。幾何拘束を確認してください。”, vbCritical, “Geometry Error”
End If

‘ オブジェクトの明示的解放(メモリリーク防止)
Set swFeat = Nothing
Set swFeatMgr = Nothing
Set swSkMgr = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing

End Sub

4. チーフアーキテクトからの提言:さらなる高みへ

このコードをベースに、さらに堅牢なエンタープライズレベルの自動化システムへ昇華させるための指針を記す。

1. エラーハンドリングの徹底
実務のシステム連携においては、外部CSVやDBから渡される数値(幅、高さ、角度)が不正値(負数やゼロ、ゼロ割を引き起こす数値)である可能性を常に考慮し、`If` 文によるバリデーションレイヤーを前置すること。
2. トランザクション的思考
形状生成が途中で失敗した場合に備え、ドキュメントの変更をロールバックできる仕組み、あるいは一時セッション内でのエラーキャッチ機構を構築せよ。
3. 外部システム(ERP/PDM)との連携
このVBAモジュールをCOMサーバーや外部EXEから呼び出すことで、WebブラウザのUIからパラメータを入力し、裏側でSolidWorksがヘッドレス(またはバックグラウンド)で3Dモデルおよび2D図面を自動生成するパイプラインの中核へと発展させることが可能となる。

レガシーな手法に縛られず、APIの本質を見極めた者だけが、真の「一撃で動く自動化」を手に入れることができる。現場のコードを今すぐアップデートせよ。

タイトルとURLをコピーしました