【入門編】【中級・実務】CutExtrusion機能における「局所的フィーチャ貫通」と非対称カット領域の安全なコード制御 – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の現場で、日々泥臭くも美しいコードを書き続けている先輩エンジニアです。

マクロの記録ボタンを押して出てきたコードをそのまま動かしてみたものの、「別のパーツで実行したら全然違うところまで削り取ってしまった……」なんて経験、ありませんか?

今回は、中級者へのステップアップとして避けて通れない「CutExtrusion(押し出しカット)における局所的フィーチャ貫通と非対称カット領域の安全なコード制御」について徹底解説します。

ここをクリアすれば、マクロの記録から完全脱却し、どんなに形状が変化する複雑なモデルでも意図した通りに削り出す「プロの自動化スキル」が手に入りますよ。バッチリ分かりやすく解説するので、ついてきてくださいね!

1. なぜ「マクロの記録」だけではカットが暴走するのか?

SolidWorksのマクロ記録機能は素晴らしいツールですが、「画面上でクリックした絶対的な位置やID」を記録してしまいます。

例えば、次のようなケースを考えてみましょう。

  • 「面Aから深さ20mmでカットする」という指示を記録した。
  • しかし、設計変更でベースパーツの厚みが変わり、面Aの位置が移動した。
  • 結果、裏側の本来残すべき大切なボス形状までごっそり削り取ってしまった!(実務では冷や汗モノの瞬間です)

これを防ぐには、APIの終了条件(End Condition)やターゲット面を動的にコードで指定・制御してあげる必要があります。

2. 安全なカット制御の核心:終了条件のパラメータ設計

SolidWorks APIで押し出しカットを司る主役が `FeatureManager.FeatureExtrusion2` メソッドです。
このメソッドには多くの引数がありますが、特に「どこまで削るか」を決定するパラメータが命取りになります。

終了条件(swEndCond_e)の主な選択肢

  • `swEndCondBlind`(指定値):盲目的に数値分だけ進む(暴走しやすいので注意)
  • `swEndCondUpToNext`(次の面まで):一番最初にぶつかった面で止まる(局所貫通を防ぐ強力な味方)
  • `swEndCondUpToSurface`(指定surfaceまで):特定の面や平面をターゲットにする(実務で一番堅牢)

非対称カットや局所的な貫通を防ぐ実務コードでは、「UpToSurface(サーフェイス指定)」「UpToNext」をVBA側から賢く指示してやることが極意となります。

3. 【実践コード】意図しない領域を削らない!安全なカット生成マクロ

それでは、現場でそのままコピペして使える実践的なVBAコードを公開します。
このコードでは、単にカットするだけでなく、「ターゲットとなる参照面をプログラムでスマートに指定し、反対側への予期せぬ貫通を防ぐ」安全設計を組み込んでいます。

Sub SafeCutExtrusionSample()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swSelMgr As SldWorks.SelectionMgr
Dim boolstatus As Boolean

‘ アプリケーションの取得
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 “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation
Exit Sub
End If

Set swFeatMgr = swModel.FeatureManager
Set swSelMgr = swModel.SelectionMgr

‘ 【ステップ1】スケッチ面やカット対象の選択をクリアして安全に開始
swModel.ClearSelection2 True

‘ ※前提:あらかじめモデル上に「Cut_Profile」というスケッチと、
‘ 貫通を防ぐためのストッパーとなる「Target_Face」が存在すると仮定します。

boolstatus = swModel.Extension.SelectByID2(“Cut_Profile”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “カット用のスケッチが見つかりません。”, vbCritical
Exit Sub
End If

‘ 【ステップ2】終了条件を動的にコントロールした押し出しカットの実行
‘ 引数の詳細:
‘ 1. 貫通切断か? (False = 通常のカット)
‘ 2. 逆方向か? (False = 順方向)
‘ 3. 終了条件 (swEndCondUpToNext = 次の面で確実に止める!暴走防止の切り札)
‘ 4. 深度1 (UpToNextの場合は無視されますが0を入れておく)
‘ 5. 深度2 (非対称の反対側用)
‘ 6-11. ドラフト角度やオフセットなどの詳細設定

Dim myFeature As SldWorks.Feature

‘ swEndCondUpToNext (2) を使うことで、形状が変化しても「次の面」で自動停止します
Set myFeature = swFeatMgr.FeatureExtrusion2( _
DrawingCut:=False, _
Reverse:=False, _
TermCond:=swEndCondUpToNext, _
Depth:=0#, _
Depth2:=0#, _
Dir1Draft:=0#, _
Dir2Draft:=0#, _
Dir1DraftOutward:=False, _
Dir2DraftOutward:=False, _
EnableDraft1:=False, _
EnableDraft2:=False, _
Offset1:=0#, _
Offset2:=0#, _
TranslateSurface1:=False, _
TranslateSurface2:=False, _
IsThin:=False, _
WallThick1:=0#, _
WallThick2:=0#, _
Merge:=True, _
UseFeatScope:=True, _
UseAutoSelect:=True, _
AssemblyScope:=True _
)

If Not myFeature Is Nothing Then
MsgBox “局所的貫通を防いだ安全なカットフィーチャの生成に成功しました!”, vbInformation
Else
MsgBox “フィーチャの生成に失敗しました。”, vbCritical
End If

End Sub

4. コードの勘所:ここが分かればエンジニアとして一皮むける!

上記のコードの中で、特に注目してほしいポイントを解説します。

1. `TermCond:=swEndCondUpToNext` の指定
これが今回のテーマのキモです。数値を固定する `swEndCondBlind` ではなく、「次の面(UpToNext)」を指定しているため、パーツの厚みや形状が後から変更されても、カットは必ず手前の壁(面)でピタッと止まります。裏側を傷つける心配がゼロになります。
2. フィーチャースコープと自動選択 (`UseFeatScope`, `UseAutoSelect`)
マルチボディパーツなどで、意図しないボディまで削ってしまうミスを防ぐために、このフラグを適切に設定しています。APIが自動で交差するボディを判断してくれるため、実務でのエラー率が劇的に下がります。

5. 陥りやすいエラーと対策

  • エラー:`FeatureExtrusion2` が `Nothing` を返し、何も作成されない
  • 原因: 指定した終了条件を満たすジオメトリ(次の面など)が、スケッチの延長線上に存在しない場合に発生します。
  • 対策: スケッチの向きや、ターゲットとなる面が正しく存在しているか、事前に `SelectByID2` などで存在確認を行うロジックを挟むと完璧です。

おわりに

今回は、CutExtrusionにおける局所的貫通を防ぐための安全なコード制御について解説しました。
「マクロの記録」の呪縛から離れ、このように終了条件やターゲットをロジカルに制御できるようになると、SolidWorks VBAの扱いは一気に自由で楽しいものになります。

「ここをこう変えたいんだけど、どうAPIを書けばいい?」といった疑問があれば、ぜひ現場の知恵を頼ってくださいね。あなたの自動化ライフを、これからも応援しています!

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