【SolidWorks VBA極限解説】意図せぬ面を削り殺すな!CutExtrusionにおける「局所的フィーチャ貫通」の完全制御と安全防壁の構築
開発現場のエンジニア諸君、こんにちは。
日夜、SolidWorksのAPIと格闘し、複雑なパラメトリックモデルの自動化に挑んでいることと思う。
さて、パーツの自動生成マクロを組んでいて、こんな悪夢に直面したことはないだろうか?
- 「テスト時は完璧だったのに、製品バリエーション違いのモデルに適用したら、反対側の壁面までえぐり取ってパーツが崩壊した」
- 「非対称の押し出しカットを入れた際、参照すべき面(Face)がモデル変更で消滅し、マクロがエラー吐きして止まった」
- 「`swEndCondThroughAll`(両方向貫通など)を安易に使った結果、アセンブリのコンテキストで予期せぬ干渉を引き起こした」
素人が書いたVBAコードは、決まって「魔法の定数」と「決め打ちの数値」で満たされている。しかし、我々プロの自動化エンジニアが目指すべきは、「設計変更の嵐(イテレーション)に耐えうる、自己防衛機能を持った堅牢なジオメトリ生成コード」だ。
今回は、中級者から一歩抜け出し、実務の現場で絶対にバグを出さないための「CutExtrusion(押し出しカット)における局所的フィーチャ貫通と非対称カットの安全なコード制御」を、容赦ないエンジニアリング視点で徹底解説する。
—
1. なぜ「貫通(Through All)」の多用は素人臭いのか?
多くの開発者は、カットフィーチャを実装する際、手っ取り早く `swEndCondThroughAll` を指定しがちだ。
だが、考えてみてほしい。実務のパーツモデリングにおいて、「パーツの果てまですべてを切り裂く」仕様がどれほど存在るだろうか? ほとんどないはずだ。
複雑なアセンブリ文脈や、局所的なリブ、ボスの追加などによって、モデルのトポロジー(面や辺の繋がり)は常に変化する。その状態で「全貫通」を指示することは、「時限爆弾をジオメトリに埋め込む行為」に等しい。
実務で求められる「安全な終了条件」の選択基準
1. UpToSurface(指定面まで): 最も安全だが、対象の「面(Face)」がモデル改修で消滅・ID変更(Persistent IDの喪失)した際のリスクヘッジが必要。
2. OffsetFromSurface(面からのオフセット): 局所的貫通を防ぐ最強の武器。特定の面から「数ミリ手前で止める」ことで、意図せぬ裏面への干渉を完全にシャットアウトする。
3. 非対称カットの制御: 方向に依存せず、Direction1とDirection2を個別のロジックで制御する。
—
2. 堅牢なCutExtrusionを実装するための設計思想
SolidWorks APIにおける `FeatureManager.FeatureExtrusion2`(または `FeatureExtrusion3`)は、引数が非常に多いことで悪名高い。
しかし、恐れる必要はない。各引数が持つ「意味」と「ライフサイクル」を理解すれば、完全にコントロールできる。
特に重要なのは、「どの面を基準にして、どの方向へ、どの条件で削るか」をAPIに明確に伝えることだ。ターゲットとなる面(Face)をプログラム側で動的に特定し、もし面が見つからない場合は安全に処理を中断する(あるいはフォールバックする)エラーハンドリングを必ず組み込む必要がある。
—
3. 【プロダクションコード】局所的貫通・非対称カット制御の実装例
以下のコードは、特定の基準面から開始し、ターゲットとなる面の手前で正確に止まる(あるいはオフセットを持たせる)、非対称な押し出しカットを行う実務レベルのVBAプロシージャだ。
コピペしてそのまま現場のモジュールに組み込めるよう、徹底的なコメントとエラー対策を施している。
Option Explicit
Sub ExecuteSafeCutExtrusion()
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
‘ パーツドキュメントかどうかの型チェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “エラー”
Exit Sub
End If
Set swFeatMgr = swModel.FeatureManager
‘ =========================================================================
‘ 【事前準備】スケッチが選択されている、または事前に作成されている前提
‘ 実務ではここで動的なスケッチ平面の選択や、面のエッジ取得ロジックが入る
‘ =========================================================================
‘ 押し出しカットのパラメータ設定(極限の安全性確保)
‘ 引数の詳細設計:
‘ 1. 貫通切断か? (False = 通常の押し出し条件)
‘ 2. 逆方向か? (False = スケッチnormal方向)
‘ 3. 自動切断か? (False)
‘ 4. 終了条件 1 (swEndCondUpToSurface = 指定面まで)
‘ 5. 終了条件 2 (swEndCondBlind = 方向2はブラインド)
‘ 6. 深さ 1 (UpToSurfaceの場合、実質無効だが0以外を設定)
‘ 7. 深さ 2 (方向2のブラインド深さ: 例 0.01m = 10mm)
‘ 8. テーパー角 1
‘ 9. テーパー角 2
‘ 10. 逆テーパー 1?
‘ 11. 逆テーパー 2?
‘ 12. 矢印の向き反転
‘ 13. 翻訳オフセット 1
‘ 14. 翻訳オフセット 2
‘ 15. 翻訳オフセットからの方向反転
‘ 16. ジオメトリパターン
‘ 17. 薄板フィーチャ有効
‘ 18. 薄板タイプ
‘ 19. 薄板厚さ 1
‘ 20. 薄板厚さ 2
‘ =========================================================================
Dim sdNormalCut As Boolean: sdNormalCut = False
Dim sdReverse As Boolean: sdReverse = False
Dim sdTranslateEval As Boolean: sdTranslateEval = False
‘ 終了条件の定数 (swEndConditions)
‘ swEndCondBlind = 0
‘ swEndCondThroughAll = 1
‘ swEndCondThroughAllBoth = 2
‘ swEndCondUpToSurface = 3
‘ swEndCondUpToBody = 4
‘ swEndCondMidPlane = 5
‘ swEndCondUpToVertex = 6
‘ swEndCondOffsetFromSurface = 7
Dim endCond1 As Long: endCond1 = swEndCondOffsetFromSurface ‘ 局所貫通を防ぐため「面からのオフセット」を推奨
Dim endCond2 As Long: endCond2 = swEndCondBlind
Dim depth1 As Double: depth1 = 0.005 ‘ オフセット距離 (5mm手前で止める)
Dim depth2 As Double: depth2 = 0.015 ‘ 方向2のブラインド深さ (15mm)
Dim draft1 As Double: draft1 = 0
Dim draft2 As Double: draft2 = 0
Dim revDraft1 As Boolean: revDraft1 = False
Dim revDraft2 As Boolean: revDraft2 = False
Dim dir1Assem As Boolean: dir1Assem = False
Dim dir2Assem As Boolean: dir2Assem = False
Dim offset1 As Double: offset1 = 0.005 ‘ オフセット値
Dim offset2 As Double: offset2 = 0
‘ トポロジー変更によるエラーをキャッチするためのトラップ
On Error GoTo ErrorHandler
‘ 実行
Dim swFeat As SldWorks.Feature
Set swFeat = swFeatMgr.FeatureExtrusion3( _
sdNormalCut, _
sdReverse, _
sdTranslateEval, _
endCond1, endCond2, _
depth1, depth2, _
draft1, draft2, _
revDraft1, revDraft2, _
dir1Assem, dir2Assem, _
offset1, offset2, _
False, False, False, False, False, _
0, 0, False)
If swFeat Is Nothing Then
Err.Raise 9999, “CutExtrusion”, “FeatureExtrusion3の実行に失敗しました。スケッチの閉領域、またはターゲット面を確認してください。”
End If
‘ 再構築の強制(ジオメトリの確定)
swModel.EditRebuild3
MsgBox “非対称カットフィーチャの生成に成功しました。”, vbInformation, “完了”
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“エラー番号: ” & Err.Number & vbCrLf & _
“詳細: ” & Err.Description, vbCritical, “致命的エラー”
‘ 必要に応じたログ出力やロールバック処理をここに記述
End Sub
—
4. プロジェクトリーダーからの実践的アドバイス:実務連携の注意点
このコードを実際の社内システムや外部データベース(Excel / ERP)連携の自動化パイプラインに組み込む際は、以下の3点を必ず死守してほしい。
1. Persistent ID(永続ID)の活用
アセンブリや複雑なパーツにおいて、`SelectByID2` で面を指定するのは素人のやり方だ。モデルが改修されると面の名前(Face1, Face2…)は平気で変わる。確実な自動化を目指すなら、面やエッジの Persistent Reference(永続参照) をバイナリとして保持し、API側でそれをデコードして選択させる設計に昇華させよ。
2. トランザクション的思考(ロールバックの担保)
マクロ途中でジオメトリエラーにより不正な状態のままパーツが保存されることが最悪のシナリオである。エラー発生時には `Undo` を実行するか、一時ファイルを破棄する防衛的プログラミングを徹底すること。
3. 単位系(Unit System)の罠
SolidWorks APIは、内部データとして常に 「メートル法(MKS: メートル・キログラム・秒)」 で処理を行う。UI側がミリメートル(mm)であっても、APIに渡す数値(`depth1 = 0.005` など)は必ずメートルに換算されていることを忘れるな。これを怠ると、意図した数値の1000倍の削り込みが発生し、モデルが爆発四散する。
—
5. 結び
SolidWorks VBAの自動化において、コードの美しさはそのまま「製品の品質」に直結する。
場当たり的なコードでごまかす時代は終わった。
今回解説した「終了条件の厳密なコントロール」と「非対称カットの安全制御」をマスターし、どんな設計変更が来ても微動だにしない、真にプロフェッショナルな自動化システムを君の手で構築してほしい。
健闘を祈る。
