【SolidWorks VBA極限解説】ExtrudeBoss2でボス・押し出しを完全制圧する:実務に耐えうる堅牢な3D自動生成の極意
こんにちは。開発プロジェクトを率いるチーフアーキテクトの私だ。
これまで数多のCAD自動化案件を診てきたが、現場から最も多く寄せられる相談の一つが「VBAからのフィーチャー操作の安定化」である。
特に、スケッチを描いてボス・押し出し(`ExtrudeBoss2`)を行う処理において、「動くには動くが、モデルが変わると突然破綻する」「コンパイルエラーにはならないが、意図しない面や方向へ押し出される」といった不具合に悩まされていないだろうか?
ネット上の散見されるサンプルコードの多くは、マウス選択の座標やハードコーディングされたインデックスに依存しており、実務のバージョンアップやモデル改修の波に耐えられない。
今回は、SolidWorks APIのオブジェクトモデルの深層を紐解き、「なぜその書き方は非効率で危険なのか」「どう設計すれば100%確実に動くプロダクションコードになるのか」を、ロジカルかつシャープに伝授しよう。
—
1. 致命的なアンチパターン:なぜあなたの押し出しコードは壊れるのか?
多くのエンジニアが陥る罠は、UIの操作手順をそのままVBAに置き換えようとすることだ。
- 画面上の選択(SelectByID2)に依存する
「Face1」「Plane1」といった文字列で面を選択するコードは、モデルの履歴が変わりIDが振り直された瞬間にお陀仏だ。
- コンテキスト(ActiveDoc)の暗黙的な利用
`SldWorks.App.ActiveDoc`頼みのコードは、ユーザーが裏で別のファイルを開いた瞬間に誤作動を起こす。
- 戻り値の検証不足
APIが何を返し、失敗したときにどのメソッドでステータスを拾うべきかを無視している。
プロの自動化エンジニアが目指すべきは、「GUIに依存せず、数学的・トポロジカルに一意に特定されるオブジェクトの参照を渡す」こと、そして「トランザクション的なエラーハンドリング」を実装することだ。
—
2. ExtrudeBoss2メソッドの深層仕様と正確なパラメータ理解
ボス・押し出しを実行する `ModelDoc2::Extension::InsertExtrudeBoss2` は非常に多くの引数を持つ。まずはこのシグネチャの正体を正しく把握する必要がある。
Dim swFeat As Feature
Set swFeat = swModel.Extension.InsertExtrudeBoss2( _
DraftWhileExtrude1, _ ‘ 押し出し中のドラフト有効化 (True/False)
DraftWhileExtrude2, _ ‘ 逆方向のドラフト有効化
Dir1Type, _ ‘ 終端条件1 (swEndCond_e: 盲目=0, 貫通=1 など)
Dir2Type, _ ‘ 終端条件2
Dir1Depth, _ ‘ 押し出し深さ1 (メートル単位!)
Dir2Depth, _ ‘ 押し出し深さ2
DraftAngle1, _ ‘ ドラフト角度1 (ラジアンではなく「度」)
DraftAngle2, _ ‘ ドラフト角度2
Dir1Flip, _ ‘ 方向反転1 (True/False)
Dir2Flip, _ ‘ 方向反転2
Dir1EndCondition_Offset, _ ‘ オフセット距離1
Dir2EndCondition_Offset, _ ‘ オフセット距離2
Dir1DraftRevolveType, _ ‘ ドラフトの基準
Dir2DraftRevolveType, _
IsThinFeature, _ ‘ 薄板フィーチャーか (True/False)
ThinWallType, _ ‘ 薄板のタイプ
ThinWallThickness1, _ ‘ 薄板の厚み1
ThinWallThickness2, _ ‘ 薄板の厚み2
Merge ‘ 既存ボディとマージするか (True/False)
)
ここで絶対に忘れてはならない極意
1. 単位系は常に「メートル(MKS)」
VBA側で `10` と指定すれば、それは10メートルを意味する。実務では `swModel.Parameter` や定数変換(`0.05 1000` のように明示的に換算、あるいはドキュメント単位系に合わせた計算)を徹底すること。
2. フィーチャー作成前のスケッチ選択の確実性
押し出す「スケッチ」が選択された状態でなければこのメソッドは機能しない。
—
3. 【実践】プロダクション品質:堅牢なボス・押し出し自動生成コード
それでは、実務の現場でそのまま組み込める、極限まで最適化されたモジュールを公開しよう。
このコードは、新規パーツを作成し、正面平面(Front Plane)に長方形のスケッチを描いた上で、それを指定の厚みで確実に押し出す完全なトランザクションスクリプトである。
Option Explicit
Sub Main()
‘ — 1. アプリケーションおよびドキュメントの初期化 —
Dim swApp As SldWorks.SldWorks
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If
Dim swModel As SldWorks.ModelDoc2
‘ 新規パーツドキュメントの作成(テンプレートパスは環境に合わせて調整)
Set swModel = swApp.NewDocument(“C:\ProgramData\SolidWorks\SOLIDWORKS 2024\templates\Part.prtdot”, 0, 0, 0)
If swModel Is Nothing Then
MsgBox “パーツドキュメントの作成に失敗しました。”, vbCritical
Exit Sub
End If
‘ — 2. ターゲット平面(Front Plane)の安全な取得とアクティブ化 —
Dim swPart As SldWorks.PartDoc
Set swPart = swModel
‘ 文字列検索ではなく、フィーチャー走査による確実な平面取得
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FirstFeature
Dim swPlaneEnt As SldWorks.Entity
Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “RefPlane” Then
If swFeat.Name = “Front Plane” Or swFeat.Name = “正面” Then
Set swPlaneEnt = swFeat.GetSpecificFeature2
Exit Do
End If
End If
Set swFeat = swFeat.GetNextFeature
Loop
If swPlaneEnt Is Nothing Then
MsgBox “基準平面が見つかりません。”, vbCritical
Exit Sub
End If
‘ 平面を選択してスケッチモードに入る
Dim boolstatus As Boolean
boolstatus = swPlaneEnt.Select4(False, Nothing)
If Not boolstatus Then
MsgBox “基準平面の選択に失敗しました。”, vbCritical
Exit Sub
End If
swModel.SketchManager.InsertSketch True
‘ — 3. 2Dスケッチの動的描画(原点基準の100mm x 50mmの長方形) —
‘ 単位系注意: API内部はメートル法 (100mm = 0.1m)
Dim vSkSegments As Variant
vSkSegments = swModel.SketchManager.CreateCenterRectangle(0, 0, 0, 0.1, 0.05, 0)
‘ スケッチ終了(確定)
swModel.SketchManager.InsertSketch True
‘ — 4. スケッチの確実な再選択と押し出し実行 —
‘ 直前に作成されたスケッチ(通常はフィーチャーの末尾)を選択状態にする
boolstatus = swModel.Extension.SelectByID2(swModel.SketchManager.ActiveSketch.Name, “SKETCH”, 0, 0, 0, False, 0, Nothing, 0)
If Not boolstatus Then
MsgBox “作成したスケッチの選択に失敗しました。”, vbCritical
Exit Sub
End If
‘ ExtrudeBoss2パラメータの定義
Dim DraftWhileExtrude1 As Boolean: DraftWhileExtrude1 = False
Dim DraftWhileExtrude2 As Boolean: DraftWhileExtrude2 = False
Dim Dir1Type As Long: Dir1Type = 0 ‘ 0 = swEndCondBlind (盲目)
Dim Dir2Type As Long: Dir2Type = 0 ‘ 0 = swEndCondBlind
Dim Dir1Depth As Double: Dir1Depth = 0.025 ‘ 押し出し深さ 25mm (0.025m)
Dim Dir2Depth As Double: Dir2Depth = 0#
Dim DraftAngle1 As Double: DraftAngle1 = 0# ‘ ドラフトなし
Dim DraftAngle2 As Double: DraftAngle2 = 0#
Dim Dir1Flip As Boolean: Dir1Flip = False
Dim Dir2Flip As Boolean: Dir2Flip = False
Dim Dir1EndCondition_Offset As Double: Dir1EndCondition_Offset = 0#
Dim Dir2EndCondition_Offset As Double: Dir2EndCondition_Offset = 0#
Dim Dir1DraftRevolveType As Long: Dir1DraftRevolveType = 0
Dim Dir2DraftRevolveType As Long: Dir2DraftRevolveType = 0
Dim IsThinFeature As Boolean: IsThinFeature = False
Dim ThinWallType As Long: ThinWallType = 0
Dim ThinWallThickness1 As Double: ThinWallThickness1 = 0#
Dim ThinWallThickness2 As Double: ThinWallThickness2 = 0#
Dim Merge As Boolean: Merge = True ‘ マルチボディ結合を有効化
‘ 押し出し実行
Dim swExtrudeFeat As SldWorks.Feature
Set swExtrudeFeat = swModel.Extension.InsertExtrudeBoss2( _
DraftWhileExtrude1, DraftWhileExtrude2, _
Dir1Type, Dir2Type, _
Dir1Depth, Dir2Depth, _
DraftAngle1, DraftAngle2, _
Dir1Flip, Dir2Flip, _
Dir1EndCondition_Offset, Dir2EndCondition_Offset, _
Dir1DraftRevolveType, Dir2DraftRevolveType, _
IsThinFeature, ThinWallType, _
ThinWallThickness1, ThinWallThickness2, _
Merge)
If swExtrudeFeat Is Nothing Then
MsgBox “ボス・押し出しフィーチャーの生成に失敗しました。”, vbCritical
Exit Sub
End If
‘ — 5. ビューの再描画と完了通知 —
swModel.ViewZoomtofit2
MsgBox “ボス・押し出しフィーチャーの自動生成が正常に完了しました。”, vbInformation, “チーフアーキテクト通知”
End Sub
—
4. 保守性とパフォーマンスを高めるためのアーキテクトからの提言
このコードをベースにして、さらに大規模な自動化システム(データベース連携やExcel一括生成バッチ)へとスケールさせる際の重要ポイントを授けよう。
1. 画面描画の抑制(`Visible` / `ScreenUpdate` の制御)
大量のパーツをループ生成する場合、`swApp.Visible = False` や `swModel.EditRebuild3` の制御を適切に行い、グラフィック描画のオーバーヘッドを排除せよ。処理速度が何倍にも跳ね上がる。
2. 外部DB(Excel/SQL)連携時のバリデーション
寸法値(例: `0.025`)を外部から動的に読み込む際は、必ず数値型へのキャストと「負の値やゼロの除外」といったバリデーションをVBAの入り口で挟むこと。CADカーネルに不正な数値を渡すとSolidWorks自体がクラッシュするリスクがある。
3. エラーハンドリングの徹底
`On Error GoTo ErrorHandler` を必ず記述し、万が一APIが失敗した際には `swModel.SketchManager.InsertSketch False` 等でスケッチモードを強制解除するクリーンアップ処理を組み込むこと。これを怠ると、SolidWorksがモーダル状態に陥り、プロセスがハングする原因となる。
—
結び
SolidWorks VBAによる自動化は、単なる「マクロの記録」の延長ではない。APIオブジェクトモデルの本質を理解し、堅牢なトポロジ制御とデータバリデーションを施すことで初めて、実務の現場で真価を発揮する「エンジニアリングツール」となる。
今回のコードをあなたの開発環境にコピーし、その圧倒的な動作スピードと安定性を体感してほしい。さらなる高度な自動化への扉は、すでに開かれている。
