【テクニカル・上級編】【中級・実務】CutExtrusion機能における「軸対称(Mid Plane)」カットと複数方向への一括切り欠き実装 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見:軸対称(Mid Plane)カットの深層と堅牢なフィーチャ自動生成

SolidWorksマクロの自動化において、パーツの形状変更、とりわけ「押し出しカット(CutExtrusion)」の制御は、日々の設計プロセスの効率を左右する心臓部である。

世の中の解説記事は、マクロ記録のコードをそのまま貼り付けただけの脆弱なスニペットに終始している。しかし、実務の現場――数千部品を抱える大規模アセンブリや、設計変更の嵐に晒されるパラメトリックモデルにおいて、そんなコードは一瞬で破綻する。

今回は、中級から上級へステップアップするエンジニアに向け、「軸対称(Mid Plane)カット」を用いた複数方向への一括切り欠き生成において、整合性を完全に維持し、メモリリークを排除した極限の実装手法を詳解する。

1. 現場を崩壊させる「盲点」:なぜ記録マクロのコードは実務で使えないのか

SolidWorksの「マクロ記録」機能は初学者には便利だが、APIの裏側にある「選択コンテキスト(Selection Context)」への過度な依存を生む。

`swModel.Extension.SelectByID2` を乱発するコードは、以下の致命的な問題を抱えている。

  • ビューポートの描画状態やグラフィックメモリへの依存:非表示コンポーネントやコンフィギュレーションの切り替え時に選択が失敗する。
  • 一意性の欠如:フィーチャ名や面IDが設計変更で変わった途端、マクロは沈黙するか、全く意図しない形状を破壊する。
  • COMオブジェクトの隠れたメモリリーク:VBAの背後で動作するCOMラッパーが解放されず、SolidWorks自体を不安定化させる。

これを克服するには、「早期バインディング(あるいは厳密な型定義)」「ポインタとオブジェクトのライフサイクル管理」、そして「フィーチャデータの構造体を直接操作するAPIファーストの思想」が不可欠となる。

2. 軸対称(Mid Plane)カットのAPIアーキテクチャ

「軸対称(Mid Plane)」によるカットは、対称面を維持したままフィーチャの厚みを増減できるため、アセンブリの合致(メイト)構造において極めて有利である。しかし、API側からこれを制御する場合、単に「方向を両側にする」だけでは不十分だ。

`FeatureManager.FeatureExtrusion2`(または最新の `FeatureExtrusion3`)メソッドを使用する際、終了条件(End Condition)のパラメータに `swEndCondMidPlane`(通常は `値: 3`)を指定し、ドラフト角度やオフセット値を正確に渡す必要がある。

さらに、複数方向への一括切り欠きや、盲穴・貫通の組み合わせを同時に処理する場合、`FeatureData` オブジェクトを明示的に取得し、トランザクションを安全に完結させなければならない。

3. 【実践コード】堅牢性を極めたMid Planeカット自動生成プロシージャ

以下に、実務の現場で即座に利用できる、オブジェクト解放とエラーハンドリングを徹底したVBAコードを示す。このコードは、指定されたスケッチをベースに、中央対称面から両方向へ正確に指定深度のカットを実行する。

Option Explicit

‘ =================================================================================
‘ 圧倒的な堅牢性を持つSolidWorks VBA 抽出カット自動化モジュール
‘ Theme: 軸対称(Mid Plane)カットによる高精度ポケット生成
‘ =================================================================================

Public Sub ExecuteMidPlaneCut()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeatMgr As SldWorks.FeatureManager
Dim swFeat As SldWorks.Feature
Dim myCutFeat 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

‘ パートドキュメントであることの型チェック
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbExclamation
Exit Sub
End If

‘ エラーハンドリングの有効化(COMリーク防止の要)
On Error GoTo ErrorHandler

‘ パフォーマンス向上と描画フリーズ防止
swModel.EditRebuild

Set swFeatMgr = swModel.FeatureManager
If swFeatMgr Is Nothing Then GoTo ErrorHandler

‘ 2. 押し出しカットのパラメータ設定
‘ 引数の詳細:
‘ VIsThin : 薄板フィーチャかどうか (False)
‘ VReverseDirection : 方向を反転するか (False)
‘ VBothDirections : 両方向へ展開するか (Mid Plane使用時は実質両方向)
‘ VT0 : 終了条件1 (swEndCondMidPlane = 3)
‘ VT1 : 終了条件2 (未使用時は0)
‘ Depth : 押し出し深さ (メートル単位: ここでは 0.02m = 20mm)
‘ Depth2 : 第2方向の深さ
‘ DrafAng : 抜き勾配角度
‘ DrafAng2 : 第2方向の抜き勾配角度
‘ VFlip : 抜き勾配の方向反転
‘ VTranslate : サーフェスからのオフセット等
‘ Offset : オフセット距離1
‘ Offset2 : オフセット距離2
‘ Normal : 通常カット

Dim p_IsThin As Boolean
Dim p_RevDir As Boolean
Dim p_BothDir As Boolean
Dim p_T0 As Long
Dim p_T1 As Long
Dim p_Depth As Double
Dim p_Depth2 As Double
Dim p_Draft As Double
Dim p_Draft2 As Double
Dim p_FlipDraft As Boolean
Dim p_DirOfExt As Boolean
Dim p_Offset1 As Double
Dim p_Offset2 As Double
Dim p_NormalCut As Boolean

p_IsThin = False
p_RevDir = False
p_BothDir = False ‘ Mid Plane指定時は通常False、またはAPI仕様に準拠
p_T0 = 3 ‘ 3 = swEndCondMidPlane (軸対称)
p_T1 = 0 ‘ 終了条件2 (不使用)
p_Depth = 0.025 ‘ 25mm
p_Depth2 = 0# ‘ 不使用
p_Draft = 0#
p_Draft2 = 0#
p_FlipDraft = False
p_DirOfExt = False
p_Offset1 = 0#
p_Offset2 = 0#
p_NormalCut = True

‘ トランザクション開始
swModel.ClearSelection2 True

‘ あらかじめ選択されているスケッチをベースにカットを実行
Set myCutFeat = swFeatMgr.FeatureExtrusion3( _
p_IsThin, p_RevDir, p_BothDir, _
p_T0, p_T1, _
p_Depth, p_Depth2, _
p_Draft, p_Draft2, _
p_FlipDraft, p_DirOfExt, _
p_Offset1, p_Offset2, _
p_NormalCut, False, False, False, False, _
1, 1, False)

If myCutFeat Is Nothing Then
Err.Raise vbObjectError + 512, “MidPlaneCut”, “フィーチャの生成に失敗しました。スケッチの選択状態を確認してください。”
End If

‘ 成功時の再構築
swModel.ForceRebuild3 True

MsgBox “軸対称(Mid Plane)カットの生成が正常に完了しました。”, vbInformation, “System Complete”

CleanUp:
‘ 3. メモリの明示的解放(オブジェクト参照の破棄)
Set myCutFeat = Nothing
Set swFeatMgr = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました。” & vbCrLf & _
“Error Number: ” & Err.Number & vbCrLf & _
“Description: ” & Err.Description, vbCritical, “Critical Error”
Resume CleanUp
End Sub

4. シニアエンジニアが押さえるべき「メモリ最適化」と「システム連携」の極意

オブジェクトの明示的解放(ガベージコレクションの罠)

VBAのランタイムは自動的に変数を解放するが、SolidWorksの背後にあるCOMコンポーネント(C++ベースのDLL)は別物である。`Set xxx = Nothing` を怠ると、VBAエディタを閉じた後もプロセス(SLDWORKS.exe)のメモリ空間に参照が残り続け、徐々にPCのメモリを圧迫していく。
特にバッチ処理で何百ものパーツファイルを連続処理するシステムでは、ループの各イテレーションの最後に必ずすべてのCOMオブジェクト変数を `Nothing` に初期化することが、システム安定稼働の絶対条件となる。

外部システム(ERP/PDM)との連携における整合性

基幹システム(SAPやTeamcenterなど)から渡されるJSONやCSVのパラメータを元に自動モデリングを行う場合、寸法値の単位(SI単位系:メートル法)の変換ミスは致命傷となる。
SolidWorks APIは例外なく「メートル(m)」を内部単位として要求する。ミリメートル(mm)で渡された数値をそのまま代入すると、意図した数値の1000分の1の微小な形状が生成され、ジオメトリの計算エラー(ゼロ領域エラー)を引き起こす。
必ず `Val(param) / 1000#` のような厳密な単位スケーリングをコード層で担保すること。

5. 総括

真の自動化エンジニアに求められるのは、「動くコード」を書くことではない。「どのような設計変更や環境変化が起きても沈黙せず、万が一のエラー時には安全にロールバックし、メモリリークを1バイトたりとも残さないコード」を構築することである。

今回解説した「軸対称(Mid Plane)カット」の制御とオブジェクトライフサイクル管理の思想をあなたのアーキテクチャに組み込むことで、レガシーなVBA環境であっても、エンタープライズレベルの堅牢性を手に入れることができるはずだ。妥協なきコードで、現場の自動化を次のステージへと引き上げてもらいたい。

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