【テクニカル・上級編】【フィーチャー操作の自動化】ExtrudeBoss2を使ったボス・押し出しフィーチャーのプログラム制御 – SolidWorks VBA解析バイブル

スポンサーリンク

【SolidWorks VBA極限解説】ExtrudeBoss2が織り成す3Dモデル動的生成の深淵とメモリ管理の鉄則

シニアエンジニアおよび社内CADインフラを統括するシステム管理者諸君。
日々の設計自動化において、レガシーなVBAコードが肥大化し、メモリリークや謎のCOM例外(HRESULT)に頭を悩ませていないだろうか。

SolidWorks APIの根幹をなす `SldWorks` および `ModelDoc2` オブジェクトのライフサイクル、そしてフィーチャー操作の最重要メソッドである `ExtrudeBoss2` の挙動を完全に掌握していなければ、真の堅牢な自動化システムは構築できない。

本稿では、ボス・押し出しフィーチャーのプログラム制御を題材に、単なるAPIのリファレンス的解説にとどまらず、プロセス間通信のオーバーヘッド削減、オブジェクトの適切な解放、そして実務で直面する例外処理の極意を、技術至上主義の視点から淡々と、しかし徹底的に解き明かす。

1. SolidWorks APIオブジェクトモデルの重量とライフサイクルの真実

VBAからSolidWorksを操作する場合、背後ではCOM(Component Object Model)サーバーが稼働し、プロセスの境界を越えたMarshalling(マーシャリング)が発生している。

[VBA Runtime] –(COM Interop / RPC)–> [SolidWorks.exe (Out-of-Process)]

このアーキテクチャの最大の罠は、「VBA側で変数を解放したつもりでも、COM参照カウンタが内部で維持され、CADプロセスがメモリ上に残存する(ゾンビプロセス化する)」という現象である。

鉄則:オブジェクト変数の明示的解放(`Nothing`代入)

ループ処理や一連のフィーチャー生成シーケンスにおいて、取得した `Feature` や `Body2`、`SelectionMgr` などのインターフェースは、スコープを抜ける前に必ず `Set obj = Nothing` によって参照を断ち切らなければならない。これを怠ると、数回の実行でSolidWorksのレスポンスが著しく低下し、最悪の場合はクラッシュに至る。

2. `ExtrudeBoss2` の仕様とパラメータの罠

ボス・押し出しをコードから生成する際、長年使われてきたのが `Extension.InsertExtrudedBoss2`(または `FeatureManager.FeatureExtrusion2`)である。
しかし、このメソッドは引数が極めて多く、一つでも型やフラグを誤ると、サイレントエラー(戻り値が `Nothing` になり原因不明の失敗となる)を引き起こす。

主要パラメータの全貌

  • Sd (Boolean): 押し出し深さの方向を反転させるか(True/False)
  • Flip (Boolean): スケッチに対する押し出しの方向反転
  • Dir (Boolean): ドラフトの方向(内外)
  • T1 (Long): 終端条件1(`swEndCondTypes_e` 参照:例 `swEndCondBlind` = 0)
  • T2 (Long): 終端条件2(両側押し出しの場合)
  • D1 (Double): 押し出し深さ1(単位:メートル)
  • D2 (Double): 押し出し深さ2
  • DraftAng1 (Double): ドラフト角度1(ラジアンではなく度数法であることに注意)
  • DraftAng2 (Double): ドラフト角度2
  • D1Rev (Boolean): 終端条件1の方向反転
  • D2Rev (Boolean): 終端条件2の方向反転

3. 実践:堅牢性を極めたボス・押し出し自動生成コード

以下のコードは、アクティブなドキュメントに対し、指定した平面(または既存のスケッチ)を起点として、メモリリークを完全に排除したセーフティな設計でボス・押し出しを生成する実用プロシージャである。

Option Explicit

‘ ———————————————————————————
‘ @Title: 堅牢型ボス・押し出し自動生成プロシージャ
‘ @Description: オブジェクトの明示的解放とエラーハンドリングを徹底したSolidWorks VBAの実装例
‘ ———————————————————————————
Sub ExecuteRobustExtrudeBoss()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swSelMgr As SldWorks.SelectionMgr
Dim swFeat As SldWorks.Feature

‘ 1. アプリケーションインスタンスの安全な取得
Set swApp = Application.SldWorks
If swApp Is Nothing Then
MsgBox “SolidWorksが起動していません。”, vbCritical
Exit Sub
End If

Set swModel = swApp.ActiveDoc
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical
Exit Sub
End If

‘ トランザクション処理の開始(パフォーマンス向上と一括Undoのため)
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateDuringRedraw, False

On Error GoTo ErrorHandler

‘ 2. ターゲットとなるスケッチ面またはスケッチの選択
‘ ※ここでは事前に選択されているエンティティを前提とする
Set swSelMgr = swModel.SelectionManager
If swSelMgr.GetSelectedObjectCount2(-1) = 0 Then
Err.Raise 9999, “ExtrudeModule”, “押し出しの基準となる面またはスケッチが選択されていません。”
End If

Set swFeatMgr = swModel.FeatureManager
If swFeatMgr Is Nothing Then
Err.Raise 9998, “ExtrudeModule”, “FeatureManagerの取得に失敗しました。”
End If

‘ 3. ExtrudeBoss2の実行
‘ パラメータ設定:
‘ 盲ロッド(Blind), 押し出し深さ = 50mm (0.05m), ドラフト角度 = 0度
Dim p_Sd As Boolean: p_Sd = False
Dim p_Flip As Boolean: p_Flip = False
Dim p_Dir As Boolean: p_Dir = False
Dim p_T1 As Long: p_T1 = 0 ‘ swEndCondBlind
Dim p_T2 As Long: p_T2 = 0 ‘ swEndCondBlind
Dim p_D1 As Double: p_D1 = 0.05 ‘ 50 mm
Dim p_D2 As Double: p_D2 = 0#
Dim p_DraftAng1 As Double: p_DraftAng1 = 0#
Dim p_DraftAng2 As Double: p_DraftAng2 = 0#
Dim p_D1Rev As Boolean: p_D1Rev = False
Dim p_D2Rev As Boolean: p_D2Rev = False
Dim p_UseFeatScope As Boolean: p_UseFeatScope = True
Dim p_UseAutoSelect As Boolean: p_UseAutoSelect = True
Dim p_AssemblyFeature As Boolean: p_AssemblyFeature = False
Dim p_AutoSelectMultibody As Boolean: p_AutoSelectMultibody = False
Dim p_BothDirectionCutout As Boolean: p_BothDirectionCutout = False

Set swFeat = swFeatMgr.FeatureExtrusion2( _
p_Sd, p_Flip, p_Dir, _
p_T1, p_T2, _
p_D1, p_D2, _
p_DraftAng1, p_DraftAng2, _
p_D1Rev, p_D2Rev, _
p_UseFeatScope, p_UseAutoSelect, _
p_AssemblyFeature, p_AutoSelectMultibody, _
p_BothDirectionCutout, _
1, 1, 1, 0, 0, False)

If swFeat Is Nothing Then
Err.Raise 9997, “ExtrudeModule”, “ExtrudeBoss2によるフィーチャー生成に失敗しました。スケッチの閉合状態を確認してください。”
End If

swModel.GraphicsRedraw2
MsgBox “ボス・押し出しフィーチャーの生成に成功しました。”, vbInformation

CleanUp:
‘ 4. 画面描画の復元
If Not swModel Is Nothing Then
swModel.Extension.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayUpdateDuringRedraw, True
End If

‘ 5. COMオブジェクトの明示的解放(最重要)
Set swFeat = Nothing
Set swFeatMgr = Nothing
Set swSelMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

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

4. チーフアーキテクトからの実務的助言:レガシー環境とシステム連携の極意

1. 単位系(Unit System)の厳密な管理
SolidWorks API内部の数値は、文書の設定に関わらず常にメートル法(MKS系:メートル、キログラム、秒)で処理される。ミリメートル単位の数値をそのまま渡すと、想定の1000倍の巨大な形状が生成されるか、ジオメトリエラーを引き起こす。コード上での単位換算(` 0.001`)を忘れないこと。
2. 外部システム(ERP/PDM)連携時の非同期制御
C#やVB.NET等の外部アプリケーションからCOM経由でSolidWorksを駆動し、連続してフィーチャー生成を行う場合、SolidWorks側のジオメトリ再構築(Rebuild)が完了する前に次のAPIを叩くと、必ず「COMException」が発生する。`swModel.EditRebuild3` や `swModel.ForceRebuild3` の実行後は、プロセスが完全にアイドル状態になるのを待つハンドリングを実装すべきである。

技術とは、細部に宿る。
APIの仕様の裏側にあるメモリとプロセスの挙動を看破した者だけが、止まらない、揺るがないCAD自動化システムを構築できる。現場のコードを今すぐ見直し、真の堅牢性を手に入れてほしい。

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