こんにちは!SolidWorks自動化の現場で泥臭く、かつ優雅にマクロを書き続けている先輩エンジニアです。
マクロの記録ボタンを押して出てきたコードをそのまま動かしてみたものの、「あれ、モデルのサイズを変えた途端にエラーが出る…」「数値を直打ちしているから応用が利かない…」そんな壁にぶつかっていませんか?
今回は、実務で最も頻繁に使うポケット形状のくり抜き(カット)をテーマに、`BossCutExtrude2`を用いた「突き抜け(Through All)」と「サーフェスオフセット終端」の鮮やかな使い分けを伝授します。
ここをクリアすれば、あなたも単なる「マクロの記録係」から、変動に強い堅牢なプログラムを書ける「SolidWorks VBAエンジニア」へ一歩踏み出せますよ。それでは、一緒に紐解いていきましょう!
—
1. なぜ「マジックナンバー」のハードコーディングは破滅を招くのか?
まずは、マクロの記録機能が生み出すコードの現実を見てみましょう。ポケットをくり抜くとき、記録機能はこう囁きます。
‘ 【マクロの記録が吐き出す危ういコードの例】
Dim boolstatus As Boolean
boolstatus = swModel.Extension.SelectByID2(“Sketch1”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)
‘ 深さ「50mm」でカットする!
boolstatus = swFeatMgr.FeatureCut3( _
True, False, False, _
1, 0, 50, 50, _
False, False, False, False, _
1.74532925199433E-02, 1.74532925199433E-02, _
False, False, False, False, _
True, True, True, _
0, 0, False)
このコードの何が問題か分かりますか?そう、「深さ 50mm」という数字が固定されていること(ハードコーディング)です。
後からベースの板厚が 50mm から 60mm に変更された瞬間、このカットは底面を貫通しきれず、あるいは宙ぶらりんになり、モデルが崩壊します。
プロのエンジニアが目指すべきは、「モデルがどう変形しようとも、意図した通りに追従してくれる自律的なコード」です。これを実現するのが、終端条件の適切な選択なのです。
—
2. 終端条件の二大巨頭:Through All と サーフェスオフセット
API関数 `FeatureCut4`(または `BossCutExtrude2`)において、カットの終端を決定づけるパラメータは非常に重要です。実務で使い分けるべきは、次の2つです。
1. Through All(貫通)
- 特徴: スケッチ面からモデルの向こう側まで文字通り「突き抜ける」設定。
- 強み: 形状の厚みが変わろうとも、絶対に突き抜け続け、エラーが起きにくい。
- 使い所: ボルト穴や、完全に裏表を貫通させるポケット。
2. Surface OffSet(サーフェスオフセット / 指定サーフェスまで)
- 特徴: 特定の面から指定した距離(オフセット)手前でカットを止める設定。
- 強み: 「底面から 5mm 残した底肉厚のポケット」といった、高度な機械加工要件に完全追従する。
- 使い所: 金型のキャビティ・コア構造や、肉厚を一定に保ちたい軽量化ポケット。
—
3. 実践!堅牢なカット処理を実装するVBAコード
それでは、実務でそのまま使えるサンプルコードを公開します。
今回は、あらかじめ描いておいたスケッチ(`Pocket_Sketch`)を選択状態にし、「確実に貫通させるコード」と「特定の面からオフセットして止めるコード」を切り替えられる構成にしました。
‘ ==============================================================================
‘ 担当: シニアチーフアーキテクト
‘ 概要: 堅牢なカットフィーチャ生成(Through All と サーフェスオフセットの使い分け)
‘ ==============================================================================
Sub CreateRobustCutFeature()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim boolstatus As Boolean
‘ アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
Set swFeatMgr = swModel.FeatureManager
‘ ————————————————————————–
‘ 1. スケッチの選択(実務では名前で確実にキャッチする)
‘ ————————————————————————–
boolstatus = swModel.Extension.SelectByID2(“Pocket_Sketch”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “対象のスケッチが見つかりません。”, vbExclamation, “警告”
Exit Sub
End If
‘ ==========================================================================
‘ パターンA: 【突き抜け(Through All)】によるカット
‘ モデルの厚みが変わっても、絶対に貫通させたい場合はこれ一択!
‘ ==========================================================================
‘ 引数解説(主要なもの):
‘ Direction1Type: どこの終端条件か? (1 = 押し出し、6 = 貫通/Through All など)
‘ Depth: 貫通の場合は無視されますが、一応0を指定
Dim cutFeat As SldWorks.Feature
‘ FeatureCut4 を使用した堅牢な実装
‘ 第1引数: ぼかし/両方向フラグなど
‘ 第4引数 (Direction1Type): 6 = swEndCondThroughAll (貫通)
Set cutFeat = swFeatMgr.FeatureCut4( _
dataType:=True, ’ sdFeatureCutData
dir:=0, ‘ 方向に沿う
cap:=False, ‘ キャップ追加 (サーフェス用)
endCond:=6, ‘ ★ 6 = Through All (突き抜け)
numDir:=0, ‘ 深度方向
depth:=0.05, ‘ 貫通なので実質無視されるがダミー値
depth2:=0, ‘ 2方向目の深度
dir1:=False, ‘ 逆方向フラグ
dir2:=False, ‘ 2方向目の逆方向フラグ
flip:=False, ‘ 反転
angle1:=0, ‘ 抜き勾配角度1
angle2:=0, ‘ 抜き勾配角度2
useFeatScope:=True, ‘ フィーチャスコープ(全ボディに適用)
useAutoSelect:=True, ‘ 自動選択
assemblyFeature:=False, ‘ アセンブリフィーチャか
bothDirections:=False, ‘ 両方向カットか
cutWithSurface:=False, ‘ サーフェスでカットするか
offsetReverse1:=False, ‘ オフセット反転1
offsetReverse2:=False, ‘ オフセット反転2
translationTransient:=False ‘ 内部処理用
)
If Not cutFeat Is Nothing Then
Debug.Print “「突き抜け」カットフィーチャの生成に成功しました。”
Else
MsgBox “カットの生成に失敗しました。”, vbCritical
End If
End Sub
—
4. サーフェスオフセット終端を実装する際の極意
「底面から 3mm 残してポケットを止めたい」という場合は、終端条件に `Surface OffSet`(API定数的には特定の面に対するオフセット)を指定します。
このとき注意すべきなのは、「オフセットの基準となる参照面(Face)」がAPIの選択バッファに正しく保持されているかという点です。
.net
‘ 【サーフェスオフセット適用時の選択ロジックのコツ】
‘ 1. スケッチを選択する
‘ 2. 終端の基準となる「底面サーフェス」をCtrlキーを押しながら追加選択する(Append = True)
boolstatus = swModel.Extension.SelectByID2(“Pocket_Sketch”, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)
boolstatus = swModel.Extension.SelectByID2(“Face_Bottom”, “FACE”, 0, 0, 0, True, 1, Nothing, 0) ‘ 追加選択
‘ 3. この状態で FeatureCut を実行し、終端条件に「サーフェスオフセット(EndCond = 9 等)」を指定する
実務の現場では、モデルの改修によって面の名前(ID)が変わってしまうリスクがあります。そのため、プレビューや選択エラーを防ぐために、「名前で選択するのではなく、フィーチャの最後の面を取得して動的に渡す」というテクニックが、真にプロフェッショナルなSolidWorks VBAエンジニアの技となります。
—
先輩エンジニアからのエール
お疲れ様でした!
「突き抜け(Through All)」と「サーフェスオフセット」、それぞれの役割とコードの背景にある思想が伝わったでしょうか。
マクロの記録が吐き出すコードは、いわば「生まれたての赤ちゃんの足跡」のようなものです。そこから、変数を与え、条件を精査し、どんな形状変更にも耐えうる「自律的なプログラム」へと昇華させるプロセスこそが、エンジニアにとって最もエキサイティングで楽しい瞬間です。
ここをクリアしたあなたなら、どんな複雑なパーツ自動化も必ずモノにできます。
明日からのマクロ開発、ぜひ自信を持って楽しんでくださいね!質問があればいつでもエンジニアリングルームへどうぞ。
