【SolidWorks VBA極限解説】ExtrudeFeature2の深層:方向2パラメータを制する者が「真の両方向対称押し出し」を制す
荒波のようなレガシーシステムの保守、そして秒単位の処理速度が求められる開発現場において、CADの自動化は単なる「手間の削減」ではない。それは数学的整合性と実行速度の極限の追求である。
今回は、多くのVBAエンジニアがハマる罠でありながら、使いこなせば圧倒的なコードの美しさと堅牢性を手に入れられる `ExtrudeFeature2` メソッドの「方向2(Direction 2)」パラメータ に焦点を当てる。
片側押し出しの呪縛を断ち切り、真の原点対称ボス形状をミリ秒単位で生成するアーキテクチャをここに解き明かす。
—
1. 現場の現実:なぜ「片側押し出し」の量産はシステムを崩壊させるのか
パーツファイル(`.sldprt`)の自動生成において、押し出しフィーチャ(Boss-Extrude)は最も頻出する操作だ。
しかし、初心者がマクロ記録(Macro Recorder)をそのままトレースしたコードを実務に投入すると、たちまち以下の致命的な破綻に直面する。
- 参照面の呪縛: スケッチ平面を基準にした片側押し出しでは、設計変更(パラメータの変動)に伴い、モデルの「対称中心」が崩壊する。
- 再計算(Rebuild)コストの肥大化: 無駄なオフセット面や補助ジオメトリを乱発することで、FeatureManagerのデザインツリーが肥大化し、アセンブリ組込時のコンテキスト更新でSolidWorksがフリーズする。
- COMオブジェクトのメモリリーク: 不適切な変数スコープと解放漏れにより、バックグラウンドプロセスとして `SLDWORKS.exe` の残骸がメモリ上に蓄積し、サーバーサイドでの自動バッチ処理がクラッシュする。
シニアエンジニアたる者、コードは常に「自己完結的であり、かつ幾何学的に美しくなければならない」。ここで `ExtrudeFeature2` の引数の真価を呼び覚ます。
—
2. `ExtrudeFeature2` API仕様の深層
まずは、SolidWorks APIヘルプの奥底に眠る `ExtrudeFeature2` のシグネチャを確認する。
Dim swFeat As Feature
Set swFeat = swPart.FeatureManager.ExtrudeFeature2( _
ByVal Von As Boolean, _
ByVal Flip As Boolean, _
ByVal Dir As Boolean, _
ByVal T1 As Long, _
ByVal T2 As Long, _
ByVal D1 As Double, _
ByVal D2 As Double, _
ByVal DFlag1 As Boolean, _
ByVal DFlag2 As Boolean, _
ByVal Flip1 As Boolean, _
ByVal Flip2 As Boolean, _
ByVal DraftAngle1 As Double, _
ByVal DraftAngle2 As Double, _
ByVal DMerge As Boolean, _
ByVal UseFeatScope As Boolean, _
ByVal UseAutoSelect As Boolean, _
ByVal AssemblyFeatureScope As Boolean, _
ByVal AutoSelectMultipleBodiesFunc As Boolean, _
ByVal PropagateFeatureToParts As Boolean, _
ByVal TScale As Double _
)
この中でも、両方向対称押し出し(Mid-Plane / Symmetric)を司るのが、方向1(Depth 1) と 方向2(Depth 2) のマリアージュだ。
GUI操作であれば「中点(Mid-Plane)」をワンクリックするだけで済むが、APIにおいては「方向1に全体の半分の距離、方向2に反対方向へ全体の半分の距離」を明示的に、かつ数学的矛盾なく流し込む必要がある。
—
3. 実装コード:メモリ最適化された堅牢な両方向対称押し出し
以下のコードは、単に動くだけのスクリプトではない。
COMメモリの厳格な解放、エラーハンドリング、そしてミリメートルから内部単位(メートル)への厳密な換算を網羅した、プロダクション品質のVBAコードである。
Option Explicit
‘ =================================================================================
‘ módulo: 幾何学自動生成エンジン
‘ テーマ: ExtrudeFeature2を用いた真の両方向対称押し出しの実装
‘ アーキテクト: 首席自動化エンジニア
‘ =================================================================================
Public Sub CreateSymmetricExtrudeSample()
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
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。パーツを開いてください。”, vbExclamation
Exit Sub
End If
‘ ドキュメントタイプがパーツ(Part = 1)であることを厳格に検証
If swModel.GetType() <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行可能です。”, vbCritical
Exit Sub
End If
Set swPart = swModel
‘ 2. トランザクション処理の開始(パフォーマンス向上とアンドゥ制御)
swModel.Extension.SetPickMemCheck True
On Error GoTo ErrorHandler
‘ 3. スケッチの作成(Front平面を基準に原点中心の矩形を描画)
Set swSkMgr = swModel.SketchManager
‘ Front平面を選択してスケッチモードへ移行
boolstatus = swModel.Extension.SelectByID2(“正面”, “PLANE”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then Err.Raise 1001, “Sketch”, “基準平面(正面)の選択に失敗しました。”
swSkMgr.InsertSketch
‘ 原点中心の矩形を描画(幅: 100mm, 高さ: 50mm)
‘ ※ SolidWorks APIの内部単位系は常に「メートル法 (meters)」であることを忘れてはならない
Dim rectWidth As Double: rectWidth = 0.1 ‘ 100 mm
Dim rectHeight As Double: rectHeight = 0.05 ‘ 50 mm
Dim vSkLines As Variant
vSkLines = swSkMgr.CreateCenterRectangle(0, 0, 0, rectWidth / 2, rectHeight / 2, 0)
‘ スケッチ終了
swSkMgr.InsertSketch True
‘ 4. 押し出しパラメータの設定(方向2を活用した両方向対称押し出し)
Set swFeatMgr = swModel.FeatureManager
‘ パラメータ定義
Dim sd_Von As Boolean: sd_Von = True ‘ 押し出しフィーチャ作成
Dim sd_Flip As Boolean: sd_Flip = False ‘ 方向反転フラグ(方向1)
Dim sd_Dir As Boolean: sd_Dir = False ‘ ドラフト等用方向
Dim sd_T1 As Long: sd_T1 = 0 ‘ 終端条件1: 座標系からの距離 (swEndCondBlind)
Dim sd_T2 As Long: sd_T2 = 0 ‘ 終端条件2: 座標系からの距離 (swEndCondBlind)
‘ 全体の押し出し厚さを 40mm とし、両方向に 20mm ずつ展開する
Dim totalDepth As Double: totalDepth = 0.04 ‘ 40 mm
Dim halfDepth As Double: halfDepth = totalDepth / 2 ‘ 20 mm
Dim sd_D1 As Double: sd_D1 = halfDepth ‘ 方向1の深さ (20mm)
Dim sd_D2 As Double: sd_D2 = halfDepth ‘ 方向2の深さ (20mm)
Dim sd_DFlag1 As Boolean: sd_DFlag1 = False
Dim sd_DFlag2 As Boolean: sd_DFlag2 = True ‘ ★極意: 方向2を有効化するためにはDFlag2をTrueにする必要がある
Dim sd_Flip1 As Boolean: sd_Flip1 = False
Dim sd_Flip2 As Boolean: sd_Flip2 = True ‘ 方向2の方向を反転させ、方向1とは逆側に押し出す
Dim sd_DraftAngle1 As Double: sd_DraftAngle1 = 0
Dim sd_DraftAngle2 As Double: sd_DraftAngle2 = 0
Dim sd_DMerge As Boolean: sd_DMerge = True ‘ マルチボディ合体
Dim sd_UseFeatScope As Boolean: sd_UseFeatScope = True
Dim sd_UseAutoSelect As Boolean: sd_UseAutoSelect = True
Dim sd_AssemblyFeatureScope As Boolean: sd_AssemblyFeatureScope = False
Dim sd_AutoSelectMultipleBodiesFunc As Boolean: sd_AutoSelectMultipleBodiesFunc = False
Dim sd_PropagateFeatureToParts As Boolean: sd_PropagateFeatureToParts = False
Dim sd_TScale As Double: sd_TScale = 0
‘ フィーチャ生成の実行
Set swFeat = swFeatMgr.ExtrudeFeature2( _
sd_Von, sd_Flip, sd_Dir, sd_T1, sd_T2, _
sd_D1, sd_D2, sd_DFlag1, sd_DFlag2, _
sd_Flip1, sd_Flip2, sd_DraftAngle1, sd_DraftAngle2, _
sd_DMerge, sd_UseFeatScope, sd_UseAutoSelect, _
sd_AssemblyFeatureScope, sd_AutoSelectMultipleBodiesFunc, _
sd_PropagateFeatureToParts, sd_TScale _
)
If swFeat Is Nothing Then
Err.Raise 1002, “FeatureManager”, “ExtrudeFeature2によるジオメトリ生成に失敗しました。”
End If
‘ 5. ビューの更新
swModel.ViewZoomToFit2
GoTo CleanUp
ErrorHandler:
MsgBox “致命的なエラーが発生しました [” & Err.Number & “]: ” & Err.Description, vbCritical
CleanUp:
‘ 6. COMメモリの厳格な解放 (Garbage Collection of COM pointers)
Set swFeat = Nothing
Set swFeatMgr = Nothing
Set swSkMgr = Nothing
Set swPart = Nothing
Set swModel = Nothing
‘ swAppはアプリケーションスコープのため解放しない
Exit Sub
End Sub
—
4. チーフアーキテクトが解説する:コードの急所とシステム間連携の知見
上記のコードには、単なるリファレンスには書かれていない、実戦で培った2つの極意が組み込まれている。
① `DFlag2` と `Flip2` の数学的対称性
`ExtrudeFeature2` において、方向2を正しく機能させるための最大の落とし穴は `DFlag2 = True` の指定漏れだ。
方向1がデフォルトの挙動(スケッチ平面から法線方向への深度)を司るのに対し、方向2は明示的なフラグを立てなければ無視される。さらに `Flip2 = True` と組み合わせることで、スケッチ平面を挟んで「正反対のベクトルへ正確に半分ずつ」マテリアルを盛ることが可能となる。
これにより、アセンブリの合致(Mates)で最も多用される「原点対称の基準パーツ」を完全に自動構築できる。
② メモリリークを根絶する「完全解放の作法」
VBAにおける最大の悪習は、オブジェクト変数をそのまま放置し、VBAのガベージコレクションに依存することだ。
SolidWorksのような巨大なCOMサーバーを相手にする場合、`Set swFeat = Nothing` や `Set swModel = Nothing` をスコープの脱出時に必ず手動で行わなければならない。
特に、これをWindowsサービスや外部のC#/VB.NETラッパーからCOM Interop経由で呼び出す場合、メモリの解放漏れは数回実行しただけでプロセス全体のメモリ枯渇を引き起こす。コードの末尾にある `CleanUp` ラベルは、シニアエンジニアの「防衛的プログラミング」の証左である。
—
5. 結びに代えて
SolidWorks VBAの自動化において、APIは単なるマクロの置き換えではない。それは、CADの数学的カーネル(Parasolid)と直接対話し、完璧なデジタルツインを構築するための高度なエンジニアリングだ。
「方向2」を制覇したあなたなら、もはや手動モデリングの制約に縛られることはない。
この知見をベースに、社内の設計プロセスを極限まで自動化し、真のエンジニアリング・エクセレンスを体現してほしい。
