【テクニカル・上級編】【中級・実務】BossCutExtrude2による「突き抜け(Through All)」カットとサーフェスオフセット終端の使い分け – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見

【中級・実務】BossCutExtrude2による「突き抜け(Through All)」カットとサーフェスオフセット終端の使い分け

SolidWorks VBAの自動化において、最も頻繁に発生し、かつ最も保守性を破壊する要因となるのが「ポケット形状のカット処理」である。モデルの形状変更(親フィーチャの厚み変更やベース形状の変更)に耐えきれず、リービルドエラー(Rebuild Error)を引き起こす脆弱なマクロコードに頭を悩ませたエンジニアは数知れない。

本稿では、レガシー環境から最新のAPI仕様まで知り尽くしたチーフアーキテクトの視点から、`FeatureManager::FeatureCut4`(あるいは歴史的背景を持つ`BossCutExtrude2`)を用いた堅牢な終端条件の設定手法、特に「突き抜け(Through All)」「サーフェスオフセット(Offset From Surface)」の極限の使い分けと、実務で絶対に破綻しないコード実装の真髄を解説する。

1. 終端条件(End Condition)のアーキテクチャと選定哲学

APIを叩いてカットフィーチャを生成する際、終端条件の選定を誤ると、後工程の設計変更でモデルが完全に崩壊する。まずはAPIが要求する列挙体(`swEndConditions_e`)の挙動の本質を理解しなければならない。

突き抜け (`swEndCondThroughAll` / `swEndCondThroughAllBoth`)

  • 数学的定義: ツールボディが対象ボディのすべてのサーフェスを完全に貫通する無限の領域を定義する。
  • 実務上のメリット: 形状の厚み方向にモデルがどれだけ変化しようとも、絶対的な「突き抜け」を保証するため、最も破綻しにくい。
  • リスク: 予期せぬ裏側のフェースまで切断してしまう「巻き込み事故」が発生する可能性がある。

サーフェスオフセット (`swEndCondOffsetFromSurface`)

  • 数学的定義: 特定の参照面(またはフェース)から、法線方向に指定されたオフセット距離を持った仮想境界を終端とする。
  • 実務上のメリット: 「底面から〇〇mm手前で止める」といった機械加工上の厳密な公差や、底厚を一定に保つインダストリアルデザインにおいて唯一無二の解となる。
  • リスク: 参照するフェースがトポロジー変更(面のスプリットや削除)によって消滅した場合、容赦なくエラーを吐く。

2. 【実務コード】堅牢なBossCutExtrude実装の極限最適化

以下のコードは、単にAPIを呼び出すだけでなく、VBA特有のCOMオブジェクトのメモリ管理(RCWの解放)、エラーハンドリング、そして将来のモデル変更に追従する堅牢性を備えた実務仕様のプロシージャである。

Option Explicit

‘ =================================================================================
‘ 圧倒的な堅牢性を持つカットフィーチャ生成プロシージャ
‘ @Param swApp : SldWorks.SldWorks (ルートアプリケーション)
‘ @Param partDoc : SldWorks.ModelDoc2 (対象のパーツドキュメント)
‘ @Param isThroughAll: Boolean (TrueならThrough All, FalseならOffset From Surface)
‘ @Param offsetDist : Double (サーフェスオフセット時の距離 [m])
‘ =================================================================================
Public Sub ExecuteRobustCutFeature(ByVal swApp As SldWorks.SldWorks, ByVal partDoc As SldWorks.ModelDoc2, ByVal isThroughAll As Boolean, ByVal offsetDist As Double)

‘ 1. ガード節による事前検証
If partDoc Is Nothing Then
MsgBox “アクティブなパーツドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If

If partDoc.GetType() <> swDocumentTypes_e.swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation, “Validation Error”
Exit Sub
End If

Dim featMgr As SldWorks.FeatureManager
Set featMgr = partDoc.FeatureManager
If featMgr Is Nothing Then Exit Sub

‘ 2. パラメータの定義 (BossCutExtrude2 のシグネチャに準拠)
‘ ※環境やAPIバージョンにより FeatureCut4 への移行も視野に入れること
Dim pDir As Boolean: pDir = True T ‘ 押し出し方向 (方向1)
Dim pSingleRev As Boolean: pSingleRev = False ‘ 逆方向への切り替え
Dim pEndCond As Long ‘ 終端条件 (swEndConditions_e)
Dim pDepth As Double: pDepth = 0.01 ‘ 深度 (ブラインド等の場合)
Dim pDraft As Double: pDraft = 0 ‘ 抜き勾配角度
Dim pDraftRev As Boolean: pDraftRev = False ‘ 抜き勾配の方向
Dim pDir2Type As Long: pDir2Type = 0 ‘ 方向2の終端条件
Dim pDepth2 As Double: pDepth2 = 0 ‘ 方向2の深度
Dim pDraftRev2 As Boolean: pDraftRev2 = False ‘ 方向2の抜き勾配方向
Dim pTaperCut As Boolean: pTaperCut = False ‘ 外側へのテーパー
Dim pTranslateSurface As Boolean: pTranslateSurface = False ‘ サーフェスオフセット時の平行移動フラグ
Dim pMerge As Boolean: pMerge = True ‘ マルチボディ時の結果の合体
Dim pUseFeatScope As Boolean: pUseFeatScope = False ‘ フィーチャースコープの使用
Dim pUseAutoSelect As Boolean: pUseAutoSelect = True ‘ 自動選択

‘ 終端条件の動的切り替え
If isThroughAll Then
pEndCond = swEndConditions_e.swEndCondThroughAll ‘ 突き抜け
Else
pEndCond = swEndConditions_e.swEndCondOffsetFromSurface ‘ サーフェスオフセット
pDepth = offsetDist ‘ オフセット距離を代入
End If

‘ 3. トランザクション処理の開始(パフォーマンスとアトミック性の確保)
partDoc.ClearSelection2 True

Dim myFeature As SldWorks.Feature

‘ エラー監視の有効化
On Error GoTo ErrorHandler

‘ 実行:FeatureCutアーキテクチャの呼び出し
‘ ※事前にスケッチが選択されていることが前提
Set myFeature = featMgr.FeatureCut4( _
pDir, pSingleRev, pEndCond, pDepth, pDraft, _
pDraftRev, pDir2Type, pDepth2, pDraftRev2, _
pTaperCut, pTranslateSurface, pMerge, _
pUseFeatScope, pUseAutoSelect, _
False, False, False, False, 0#, 0#, False _
)

If myFeature Is Nothing Then
Err.Raise vbObjectError + 1000, “FeatureCut”, “カットフィーチャの生成に失敗しました。スケッチの閉合状態や参照面を確認してください。”
End If

‘ 正常終了時の処理
partDoc.ForceRebuild3 False

CleanUp:
‘ 4. メモリ最適化:COMオブジェクトの明示的解放
‘ VBAのガベージコレクションの遅延によるメモリリークやハンドル枯渇を防ぐ
Set myFeature = Nothing
Set featMgr = Nothing
Exit Sub

ErrorHandler:
MsgBox “致命的なエラーが発生しました: ” & Err.Description, vbCritical, “System Error”
Resume CleanUp
End Sub

3. チーフアーキテクトが教える「実務の罠」と回避策

罠そのもの:サーフェスオフセット指定時の「参照切れ(Lost Reference)」

`swEndCondOffsetFromSurface` を使用する場合、APIは「どのサーフェスからオフセットするか」という参照を必要とする。もしコード内で特定の平面(たとえば `”Plane1″`)をプログラム的に指定している場合、上流でその平面が削除・リネームされるとマクロは即座に沈黙する。

【極限の回避策】
ハードコーディングされた平面名に依存してはならない。代わって、「カットスケッチが描かれている平面(SketcchPlane)」、あるいは「ヒットした最寄りの面(Face)」を動的に取得し、それを参照サーフェスとしてAPIに渡すラッパー関数を必ず構築すること。

‘ 動的にホスト面または親平面を取得するスニペットの概念
Dim swSketch As SldWorks.Sketch
Set swSketch = mySelection.GetSpecificSelection2
‘ スケッチが所属する平面のフェースをAPI経由で特定してオフセットの起点とする

パフォーマンスの最適化:`ForceRebuild3` の濫用禁止

コードの最後にある `partDoc.ForceRebuild3 False` は、アセンブリや巨大なパーツにおいては数百ミリ秒〜数秒のオーバーヘッドを生む。
もし一連のバッチ処理(複数ポケットの連続カットなど)を実装している場合は、ループ内でのリビルドを完全に排除し、処理の最終段階で一度だけリビルドを実行するアーキテクチャに設計しなければならない。これがマクロの実行速度を10倍以上に跳ね上げる鉄則である。

4. システム間連携(外部DB / ERP連携)への拡張を見据えて

現場の生産管理システム(ERP)やPLMから、「ポケットの深さ(オフセット値)」や「貫通フラグ」をJSONやCSV経由で受け取り、自動で3Dモデルを構築する無人化ラインを構築する場合、今回解説した `BossCutExtrude2 / FeatureCut4` のパラメータ制御はそのまま中核エンジンとなる。

外部インターフェースから渡された数値をミリメートル単位からSolidWorks内部単位(メートル法: Meters)へ変換する際のスケーリング処理(`1 mm = 0.001`)を忘れないことは言うまでもない。

プロフェッショナルたるもの、動くだけのコードを書くな。「変化に耐え、保守され、エラーを自己制御する」極限まで洗練されたコードベースを現場に納品せよ。

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