SolidWorks VBAを掌握する極限の知見
第4回:対称中心面を死守せよ!`CutExtrusion`における「Mid Plane」一括切り欠きの極意
こんにちは。開発プロジェクトの現場において、幾何学的な整合性と保守性の高いマクロ設計を追求し続けているチーフアーキテクトだ。
SolidWorks VBAの自動化において、最もフラストレーションが溜まる瞬間はどこか?
「手動では当たり前にできるフィーチャ作成が、APIを通した瞬間に崩壊する」「コンフィギュレーションや寸法変更に追従せず、リビルドエラー(黄色や赤色の爆弾マーク)の温床になる」――これらはすべて、APIの裏側にあるオブジェクトのライフサイクルと、フィーチャ定義の文脈を理解していないことから生じる人災だ。
今回は、実務で最も頻出する要件の一つである「軸対称(Mid Plane)を基準にした両方向への一括切り欠き(CutExtrusion)」を取り上げる。
ただコードを動かすだけではない。アセンブリの設計意図(Design Intent)をコードレベルで完全に担保し、バグの起きない堅牢な実装手法を伝授しよう。
—
1. なぜ「片側カットの2回実行」は悪手なのか?
実務の現場で、素人がやりがちな最悪のアンチパターンから話を始めよう。
「中心面から左右対称に溝を彫りたい」という要件に対し、以下のようなコードを書くエンジニアが後を絶たない。
- 基準面からプラス方向にカットを1回実行する。
- マイナス方向にもう一度カットを1回実行する。
論外だ。 これがなぜ実務で通用しないのか、理由は3つある。
1. フィーチャツリーの肥大化: 本来1つであるべき加工が2つのフィーチャに分裂し、ツリーの可読性が最悪になる。
2. リビルドコストの増大: APIはフィーチャが増えるたびにジオメトリの再評価(Rebuild)を行う。パフォーマンスが露骨に低下する。
3. 設計意図の崩壊: 設計変更で「中央の溝の幅」が変わった際、2つのフィーチャの数値を個別に同期させなければならず、整合性が破綻する。
我々プロフェッショナルは、「1回の `FeatureCut4`(または `FeatureCut3`)の呼び出しで、中央から両方向へ同時に突き抜ける」実装をしなければならない。それを可能にするのが、端面条件(End Condition)における `swEndCondMidPlane` の完全掌握である。
—
2. `FeatureExtrusion2` / `FeatureCut` の罠とAPIの選定
SolidWorks APIにおいて、押し出しカットを実行するメソッドは歴史的背景から複数のバージョンが存在する。
現在、中級者以上の現場で標準とすべきは、パラメータの拡張性と安定性に優れた `FeatureCut4` または最新の `FeatureExtrusion2` をカットモードで利用する方法だ。
「Mid Plane(軸対称)」を指定する際、API側には以下のパラメータを正確に渡す必要がある。
- 端面条件 (End Condition): `swEndCond_MidPlane` (数値: 6)
- 深度 (Depth): 全幅(Total Depth)を指定する。APIの仕様上、Mid Planeの場合は「入力した数値の半分がプラス方向、半分がマイナス方向」に展開される。ここを勘違いして「片側の深さ」を入れてしまうバグが非常に多い。
—
3. 【プロダクションコード】堅牢なMid Planeカット実装
それでは、実務の現場でそのままコピー&ペーストして即戦力となるコードを公開する。
このコードは、アクティブなパーツに対して、特定のスケッチ平面を選択し、中心面を基準にした両方向へのポケット切削をノーエラーで実行する。
‘ ==============================================================================
‘ Module: 業務自動化モジュール – 軸対称カット処理
‘ 概要: 選択されたスケッチをベースに、Mid Plane(軸対称)で両方向へ一括切り欠きを行う
‘ 前提: 閉じた輪郭を持つスケッチが事前にアクティブ、または選択されていること
‘ ==============================================================================
Sub ExecuteSymmetricCutPocket()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatureMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
‘ 1. アプリケーションおよびドキュメントの取得
Set swApp = Application.SldWorks
If swApp is Nothing Then Exit Sub
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If
‘ パートドキュメントであることの型チェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツファイルでのみ実行可能です。”, vbExclamation, “Validation Error”
Exit Sub
End If
‘ エラーハンドリングの開始
On Error GoTo ErrorHandler
‘ 2. 処理のパフォーマンス向上と画面描画のロック
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayRealView, False
swModel.EditRebuild3
‘ 3. 押し出しカットパラメータの設定
‘ ————————————————————————–
‘ 引数設計のポイント:
‘ 1番目: 貫通するかどうか (False = 深度指定)
‘ 2番目: 端面条件 (swEndCond_MidPlane = 6 : 軸対称)
‘ 3番目: 反転方向 (False)
‘ 4番目: 深度 (Total Depth: 50mmの場合、両側に25mmずつ展開される)
‘ 5番目: 2番目の端面条件 (盲穴等ではないため不使用)
‘ 6番目, 7番目: 抜き勾配の設定 (DraftOutward = False, DraftAngle = 0)
‘ 8番目, 9番目: 双方のオフセット有無
‘ 10番目: キャップの有無
‘ 11番目, 12番目: 2方向目のパラメータ
‘ 13番目: 薄肉フィーチャの有無 (False)
‘ 14番目~17番目: 薄肉フィーチャの詳細設定
‘ 18番目: 自動選択の有効化 (True)
‘ 19番目: 形状の合致
‘ ==========================================================================
Dim cutDepth As Double
cutDepth = 0.050 ‘ 50mm (単位はメートル法: 50mm = 0.05m)
Set swFeatureMgr = swModel.FeatureManager
If swFeatureMgr Is Nothing Then GoTo ErrorHandler
‘ フィーチャカットの実行
‘ ※SolidWorksのバージョンやタイプにより FeatureCut4 を推奨
Set swFeat = swFeatureMgr.FeatureCut4( _
Data1:=False, _
Data2:=swEndCond_MidPlane, _
Data3:=False, _
Data4:=cutDepth, _
Data5:=0, _
Data6:=False, _
Data7:=False, _
Data8:=False, _
Data9:=False, _
Data10:=False, _
Data11:=False, _
Data12:=False, _
Data13:=False, _
Data14:=0, _
Data15:=0, _
Data16:=0, _
Data17:=0, _
Data18:=True, _
Data19:=False, _
Data20:=False, _
Data21:=False, _
Data22:=False _
)
If swFeat Is Nothing Then
Err.Raise 1000, “FeatureCut”, “軸対称カットの生成に失敗しました。スケッチの閉塞状態を確認してください。”
End If
‘ 4. 正常終了処理
swModel.ClearSelection2 True
MsgBox “軸対称カットフィーチャの生成が正常に完了しました。”, vbInformation, “Success”
CleanUp:
‘ 画面描画の復元
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayRealView, True
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error Description: ” & Err.Description, vbCritical, “Fatal Error”
Resume CleanUp
End Sub
—
4. 現場で生き抜くための「データベース・ファイル連携」の注意点
実務において、このようなマクロは単体で動くものではない。多くの場合、Excel、Access、あるいはPLM/PDMデータベースから「切り欠き幅(Depth)」や「位置座標」のデータを取得して動的に流し込むことになる。
ここでエンジニアが陥りが値の罠が、「単位系の不一致(Unit Mismatch)」だ。
1. 内部データベースはミリメートル(mm)、APIはメートル(m):
Excelから取得した数値をそのまま `cutDepth = 50` として渡すと、SolidWorks側では50メートル(50,000mm)の巨大なカットが実行され、モデリング空間が崩壊するかリビルドエラーで沈黙する。必ず `0.05` のようにメートル単位へ換算するレイヤーをコード内に挟むこと。
2. コンフィギュレーション毎のパラメータ制御:
ファミリ管理されているパーツに対し、特定コンフィギュレーションでのみこのカットを有効化したい場合、`swModel.ShowConfiguration2` でターゲットのコンフィギュレーションをアクティブにしてからフィーチャを操作するか、あるいはフィーチャ自体の抑制状態(Suppression State)をAPIで制御する必要がある。
—
5. チーフアーキテクトからの総括
今回解説した「Mid Planeによる一括切り欠き」は、単なるコードのテクニックではない。
「アセンブリの親子関係や応力集中を考慮し、設計意図(Design Intent)をAPI経由で機械的に正しく継承させる」という、エンジニアリングの基本思想そのものだ。
「動けばいい」という妥協の産物は、仕様変更の嵐が吹いた瞬間に現場を地獄に変える。
常に構造を疑い、美しく、保守性の高いコードベースを構築し続けろ。君たちの手で作る自動化ツールが、現場のエンジニアたちを退屈な単純作業から解放する最強の武器となることを期待している。
