【SolidWorks VBA極限解説】BossCutExtrude2が生む「モデル崩壊」を断ち切れ!貫通とサーフェスオフセットの完全制御術
設計変更のたびにモデルが崩壊し、黄色や赤色のエラーマーク(いわゆる「エラーの爆弾」)に頭を抱えた経験はないだろうか。
特に、ポケット形状やザグリ加工をくり抜く「カット押し出し(Cut Extrude)」において、終端条件の選定ミスは、下流のアセンブリや図面をも巻き込む致命的な手戻りを引き起こす。
SolidWorks VBAの自動化において、マクロ記録をそのまま吐き出したようなコードは、実務の現場では「使い捨てのオモチャ」でしかない。
本記事では、APIである `BossCutExtrude2` を完全に手懐け、「Through All(貫通)」と「Surface Offset(サーフェスオフセット)」をモデルの文脈に応じて自在に使い分け、100%破綻しない堅牢なパーツ生成コードを構築する極意を伝授する。
—
1. なぜ「Blind(盲穴)」や安易な「Through All」が実務で嫌われるのか?
業務自動化ツールを開発する際、最も陥りがちな罠が「とりあえず深い数値を指定してぶ抜く(Blind)」、あるいは「思考停止でThrough Allを使う」というアプローチだ。
- Blind(深さ指定)の呪縛:
将来的にベースプレートの厚みが変更された瞬間、カット深さが足りなくなって底が抜けたり、逆に深すぎて意図しない形状まで削り込んだりする。
- Through All(貫通)の暴走:
対称形状や複数に分岐したボディにおいて、予期せぬ反対側の面まで穴を貫通させてしまい、トポロジー(位相)の変化によるエラーを引き起こす。
実務で求められるのは、「設計意図(Design Intent)をコードの引数に翻訳すること」だ。
ここからは、APIの内部挙動を理解した上で、2つの究極の選択肢をコードに落とし込んでいく。
—
2. APIの核心:`BossCutExtrude2` のシグネチャを暴く
まず、SolidWorks APIにおける押し出し・カットの主力メソッドである `Extension.CreateExtrudedCut` または古くから使われている `FeatureManager.FeatureExtrusion2` / `BossCutExtrude2` の設計思想を理解する必要がある。
実務で最もコントロールしやすい `FeatureManager.FeatureExtrusion2`(または `BossCutExtrude2`)の引数は以下の構造を持っている。
‘ 概念的なメソッドシグネチャの理解
Dim swFeat As Feature
Set swFeat = swModel.FeatureManager.FeatureExtrusion2( _
DraftOutward1, _ ‘ 抜き勾配の外向きフラグ
vFlipSideToCut, _ ‘ 削る側の反転(サーフェス/ボディカット用)
vIsThin, _ ‘ 薄板フィーチャかどうか
vDir1Type, _ ‘ 【最重要】終端条件 (swEndCond_e)
vDir2Type, _ ‘ 第2方向の終端条件
vDir1Depth, _ ‘ 深さ1
vDir2Depth, _ ‘ 深さ2
vDraft1, _ ‘ 抜き勾配1
vDraft2, _ ‘ 抜き勾配2
vD1LocDir, _ ‘ 勾配の方向1
vD2LocDir, _ ‘ 勾配の方向2
vCacheMerge, _ ‘ マルチボディ時のマージ
vCacheAutoSelect, _ ‘ 自動選択
vCommonFace1, _ ‘ 面指定時の参照面1
vCommonFace2, _ ‘ 面指定時の参照面2
vShim1, _ ‘ シム値1
vShim2 ‘ シム値2
)
この中の `vDir1Type` に渡す定数(`swEndCond_e`)こそが、堅牢性を左右するトリガーとなる。
- `swEndCondThroughAll` (1) : 貫通
- `swEndCondOffsetFromSurface` (9) : サーフェスからのオフセット
—
3. 【プロダクションコード】破綻ゼロのカットフィーチャ自動生成
ここからは、実務の現場でそのままコピペして使える、極めて堅牢なVBAコードを提示する。
このコードは、アクティブなパーツに対してスケッチ平面から「貫通(Through All)」、および特定のオフセット面までの「サーフェスオフセット」を切り替えて実行できる構造化プロシージャだ。
Option Explicit
‘ ==============================================================================
‘ 処理名: 堅牢なカット押し出し実行プロシージャ
‘ 概要 : 指定した終端条件に応じて、モデル変更に追従するカットフィーチャを生成する
‘ ==============================================================================
Public Sub ExecuteRobustCut()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントの存在・タイプチェック(パーツであること)
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If
Set swFeatMgr = swModel.FeatureManager
‘ ————————————————————————–
‘ パラメータ設定(実務ではデータベースや外部CSV、UIフォームから動的に取得)
‘ ————————————————————————–
Dim isThroughAll As Boolean
isThroughAll = True ‘ True: 貫通(Through All) / False: サーフェスオフセット
Dim cutDepth As Double
cutDepth = 0.025 ‘ 25mm (Blindやオフセット時の数値用)
‘ トランザクション処理の開始(パフォーマンスとロールバック担保)
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewUpdateFeatureNameDirectly, False
On Error GoTo ErrorHandler
If isThroughAll Then
‘ — パターンA: 堅牢な「貫通(Through All)」 —
‘ 特徴: 形状の厚みが変わっても完全に抜け続ける。マルチボディ時は注意が必要。
Set swFeat = swFeatMgr.FeatureExtrusion2( _
False, _ ‘ 抜き勾配外向き
False, _ ‘ 反転
False, _ ‘ 薄板
swEndCondThroughAll, _ ‘ 【終端条件】貫通 (1)
swEndCondBlind, _ ‘ 第2方向(未使用)
cutDepth, _ ‘ 深さ1(ThroughAll時は無視されるがダミー値)
0#, _ ‘ 深さ2
0#, 0#, _ ‘ 抜き勾配
False, False, _ ‘ 勾配方向
True, _ ‘ マージ (Auto-select / Merge result)
True, _ ‘ 自動選択
0#, 0#, 0#, 0#, _ ‘ 参照面パラメータ
False ‘ 終了サーフェス反転
)
Debug.Print “カットフィーチャ生成 [Through All] 成功”
Else
‘ — パターンB: 最強の設計追従性「サーフェスオフセット終端」 —
‘ 特徴: 複雑な形状や、特定のオフセット(例: 底面から2mm手前まで)を維持したい場合に最適。
‘ ※実務では事前にターゲットとなる面(Face)をポインティングしておく必要があります。
Dim swSelMgr As SldWorks.SelectionMgr
Set swSelMgr = swModel.SelectionManager
‘ ここでは例として事前に選択されている面をターゲットにする
Dim swTargetFace As SldWorks.Face2
If swSelMgr.GetSelectedObjectCount2(1) > 0 Then
If swSelMgr.GetSelectedObjectType3(1, 1) = swSelectableFaces Then
Set swTargetFace = swSelMgr.GetSelectedObject6(1, 1)
End If
End If
If swTargetFace Is Nothing Then
MsgBox “サーフェスオフセット終端を指定するには、ターゲットとなる面を選択してください。”, vbExclamation, “操作警告”
Exit Sub
End If
‘ 面をコンテキストとして渡すためのマーク付加選択
‘ swEndCondOffsetFromSurface を使用する場合、面が適切に参照されている必要がある
Set swFeat = swFeatMgr.FeatureExtrusion2( _
False, False, False, _
swEndCondOffsetFromSurface, _ ‘ 【終端条件】サーフェスオフセット (9)
swEndCondBlind, _
cutDepth, _ ‘ オフセット距離 (例: 25mm手前、またはマイナス方向)
0#, 0#, 0#, False, False, _
True, True, _
0#, 0#, 0#, 0#, _ ‘ Shim parameters
False ‘ 終了サーフェスの反転フラグ
)
Debug.Print “カットフィーチャ生成 [Surface Offset] 成功”
End If
‘ 再描画とモデル更新
swModel.EditRebuild3
MsgBox “カットフィーチャの生成が正常に完了しました。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
End Sub
—
4. チーフアーキテクトが教える:実務で絶対に外せない「3つの鉄則」
現場で何百人ものエンジニアが使うマクロや、自動設計ツールを組み上げる際、上記のコード片だけでは不十分だ。プロフェッショナルとして担保すべき実務上の知見を授ける。
① 形状の「コンテキスト(文脈)」をコードにハードコーディングするな
コード内で面やエッジを `swModel.Extension.SelectByID2` で名前ベース(例: `”Face1@Part1″`)で指定するアプローチは、設計変更によってサーフェスIDが振り直された瞬間に破綻する。
自動化ツールを構築する場合は、ユーザーに手動で面を選択させるか、レイヤー名・属性(Attribute)を用いた動的なポインティングロジックを必ず挟むこと。
② `EditRebuild3` の適切なタイミング
APIでフィーチャを連続生成する際、ループの都度 `EditRebuild3` を呼び出すのはパフォーマンスの観点から最悪の悪手である(画面のちらつきと莫大な処理時間の原因になる)。
一連のジオメトリ生成が終わった最後の1回だけリビルドをかける設計にし、かつ `swModel.ViewUpdateFeatureNameDirectly` などを活用して画面描画を抑制するのが高速化の定石だ。
③ マルチボディ環境における `swCacheMerge` の罠
マルチボディ(複数のソリッドボディが1つのパーツファイル内に混在する状態)でカット押し出しを行う際、`vCacheMerge`(マージフラグ)を適当に設定していると、意図しないボディまで削り取られるか、「どのボディを削っていいか分からない」というエラー(エラーコード:Feature failed to cut)が発生する。
マルチボディ環境では、`vCacheAutoSelect = True` とするだけでなく、対象となるボディを事前に配列等で明確に指定する `FeatureExtrusion3` などの上位APIへの移行を視野に入れた設計が望ましい。
—
5. おわりに
SolidWorks VBAによる自動化は、単なる「作業の肩代わり」ではない。
「設計意図をコードという言語で完全武装し、何度仕様変更が来ようとも微動だにしないデジタルアセットを構築すること」、それがチーフアーキテクトとしての我々の使命である。
今回解説した `BossCutExtrude2` における終端条件の制御、そして文脈に依存した堅牢な設計思想をあなたのプロジェクトに組み込み、エラーの絶えない地獄から脱却してほしい。
