【SolidWorks VBA極限活用】板金フランジ自動最適化:SheetMetalFeatureData2の深層とメモリ管理の鉄則
筐体設計において、板金部品のモデリング工数は製品のライフサイクルコストに直結する。特に、複数のエッジフランジに対して折り曲げ角度、長さ、そしてリリーフタイプを一括で制御・最適化する作業は、手動で行えばヒューマンエラーの温床となり、設計変更の波及に耐えられない。
今回は、SolidWorks APIの神髄である`SheetMetalFeatureData2`オブジェクト、とりわけ`GetEdgeFlangeData`を用いたエッジフランジの走査とパラメータの動的書き換え、そして「VBA特有のCOMメモリリークを完全に根絶するライフサイクル管理」について、現場の最前線で培った実用知見を余すところなく解説する。
—
1. 現場を崩壊させるVBAの罠:COMオブジェクトのライフサイクルと解放
多くのエンジニアが書くVBAコードは、SolidWorksのプロセスを徐々に蝕んでいく。`App.ActiveDoc`や`Part.Extension.GetDraftingTable`といった暗黙の参照、あるいは `Set feat = feat.GetNextFeature` で連鎖的に取得されるCOMオブジェクトは、VBAのランタイムが自動で解放してくれるとは限らない。
特に、数千〜数万回走査するようなループ処理の中でラッパーオブジェクトやFeatureDataを適切に解放しない場合、COM RCW (Runtime Callable Wrapper) のメモリリークを引き起こし、SolidWorksが突然フリーズする(あるいはメモリ不足エラーで落ちる)悲劇を引き起こす。
鉄則:参照は必ずローカル変数に受け、ループごとに `Nothing` を明示せよ
‘ 良い例:厳格なオブジェクトライフサイクル管理
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim swSmData As SldWorks.SheetMetalFeatureData2
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ … 処理 …
‘ 参照の完全解放(逆順が望ましい)
Set swSmData = Nothing
Set swFeat = Nothing
Set swModel = Nothing
Set swApp = Nothing
VBAではガベージコレクションが即時実行されないため、大規模アセンブリや複雑な板金パーツを扱うマクロでは、この解放処理がシステム安定稼働の生命線となる。
—
2. 板金フィーチャの深層:`SheetMetalFeatureData2` と `EdgeFlangeFeatureData` の連携
SolidWorksの板金モデルにおいて、ベースフランジやエッジフランジの実体データは、Featureの裏側に隠された `FeatureData` オブジェクトにカプセル化されている。
通常、フィーチャを直接操作(`ModifyDefinition`等)すると、画面の再描画(グラフィックスの更新)が発生し、処理速度が劇的に低下する。これを防ぐためには、「サイレントモードでのデータ取得・変更・一括適用(ModifyDefinitionの非表示化)」を行わなければならない。
—
3. 実装コード:板金フランジ一括最適化マクロ
以下に、アクティブな板金パーツからすべてのエッジフランジを走査し、角度、長さ、リリーフタイプをプログラム側から強制的に書き換える実用コードを示す。
このコードは、エラーハンドリングとメモリ管理、そしてSolidWorksのパフォーマンスを極限まで高めるためのAPIコール(`UserControl = True` の回避や画面更新の抑制)を実装している。
‘ ==============================================================================
‘ ódulo名: Module_SheetMetalOptimizer
‘ 概要 : SheetMetalFeatureData2を用いたエッジフランジのパラメータ一括最適化
‘ 前提 : アクティブドキュメントが板金パーツ(.sldprt)であること
‘ ==============================================================================
Option Explicit
Public Sub OptimizeEdgeFlanges()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeat As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature
Dim swSmData As SldWorks.SheetMetalFeatureData2
Dim swFlangeData As SldWorks.EdgeFlangeFeatureData
‘ 処理前準備:パフォーマンス最適化
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
Set swPart = swModel
‘ 画面描画の凍結(描画コストを排除し実行速度を最大化)
swModel.Extension.EnableGraphicsUpdate = False
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, True
On Error GoTo ErrorHandler
‘ フィーチャツリーのトップから走査を開始
Set swFeat = swModel.FirstFeature()
Do While Not swFeat Is Nothing
‘ フィーチャタイプ名が “SheetMetal” または “RefEdgeFlange” 等の判定
‘ ここでは板金関連フィーチャをターゲットにする
If swFeat.GetTypeName2() = “SheetMetal” Then
Set swSmData = swFeat.GetDefinition()
If Not swSmData Is Nothing Then
‘ アクセス権の取得(AccessSelectionsが必要)
boolstatus = swSmData.AccessSelections(swModel, Nothing)
‘ ※注意: SheetMetalFeatureData2自体には直接エッジフランジの配列がない場合があるため、
‘ 下位サブフィーチャ(SubFeature)または個別のEdgeFlangeフィーチャを走査するアプローチをとる
swSmData.ReleaseSelectionAccess
End If
Set swSmData = Nothing
End If
‘ 個別のエッジフランジフィーチャを直接狙う場合 (“EdgeFlange”)
If swFeat.GetTypeName2() = “EdgeFlange” Then
Set swFlangeData = swFeat.GetDefinition()
If Not swFlangeData Is Nothing Then
‘ 選択コンテキストのバインド
Dim accessSuccess As Boolean
accessSuccess = swFlangeData.AccessSelections(swModel, Nothing)
If accessSuccess Then
‘ — 【最適化ロジックの適用】 —
‘ 1. 折り曲げ角度を 90.0度 (Radians換算不要、API仕様に依存) に強制設定
‘ ※SolidWorks APIの単位は通常ラジアン、または度数がメソッドにより異なるため注意
swFlangeData.Angle = 1.57079632679 ‘ 90度 (PI/2)
‘ 2. フランジ長さの設定 (例: 25.0mm -> メートル単位系のため 0.025)
swFlangeData.FlangeLength = 0.025
‘ 3. リリーフタイプの変更 (例: 独自規格のリリーフ形状インデックスを指定)
‘ swSheetMetalReliefType_e の仕様に基づく
‘ swSheetMetalReliefType_Rectangular = 1, swSheetMetalReliefType_Tear = 2 等
swFlangeData.ReliefType = 1 ‘ 角リリーフ
swFlangeData.ReliefDepth = 1.5 0.001 ‘ 1.5mm
swFlangeData.ReliefWidth = 1.5 0.001
‘ 変更をフィーチャに反映(再計算を実行)
Dim modifySuccess As Boolean
modifySuccess = swFeat.ModifyDefinition(swFlangeData, swModel, Nothing)
If Not modifySuccess Then
Debug.Print “Warning: フィーチャ [” & swFeat.Name & “] の修正に失敗しました。”
End If
End If
‘ 必ずセレクションアクセスを解放する(メモリリーク・ロック防止)
swFlangeData.ReleaseSelectionAccess
End If
Set swFlangeData = Nothing
End If
‘ 次のフィーチャへ
Dim swNextFeat As SldWorks.Feature
Set swNextFeat = swFeat.GetNextFeature()
Set swFeat = swNextFeat
Set swNextFeat = Nothing
Loop
‘ 変更をモデルに反映・リビルド
swModel.ForceRebuild3 False
GoTo Cleanup
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “Fatal Error”
Cleanup:
‘ 画面描画と設定の復元(絶対に忘れてはならない)
If Not swModel Is Nothing Then
swModel.Extension.EnableGraphicsUpdate = True
End If
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, False
‘ オブジェクトの徹底的な破棄
Set swFlangeData = Nothing
Set swSmData = Nothing
Set swFeat = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
MsgBox “板金フランジの最適化処理が完了しました。”, vbInformation, “Automation Complete”
End Sub
—
4. チーフアーキテクトが教える:実運用における極限のTips
1. 単位系(Unit System)の罠に留意せよ
SolidWorks API内部の数値は、常にSI単位系(メートル、ラジアン、キログラム)で処理される。
画面上では「mm」や「度」で表示されていても、APIに渡す値は `0.025`(25mm)や `Deg (3.1415926535 / 180)` のように換算しなければ、意図しない極小・巨大モデルが生成され、ジオメトリ計算エラー(Zero-length geometry等)を引き起こす。
2. コンテキスト競合を防ぐ `AccessSelections` の作法
`GetDefinition()` で取得したFeatureDataは、対象モデルのデータベースに対する排他ロック(あるいはセレクションコンテキスト)を要求する。
処理の途中でエラートラップを抜けた場合、モデルがロックされたままになり、手動操作すら受け付けなくなる。そのため、必ず `On Error` を適切に配置し、エラー時であっても `ReleaseSelectionAccess` が実行される防御的プログラミングを徹底すること。
3. 大規模アセンブリ・コンテキスト(In-Context)での注意
パーツ単体ではなく、アセンブリの文脈(アセンブリ内編集)で板金を制御する場合、外部参照(External Reference)の更新状態やコンテキストの伝播遅延が発生する。大規模システム連携を行う際は、単体パーツを開いてバッチ処理するアーキテクチャ(ヘッドレス実行)を推奨する。
—
総括
SolidWorks VBAによる板金設計の自動化は、単なる「マクロによる手作業の代替」ではない。APIの仕様、COMのライフサイクル、そしてCADの数学的制約を完全に理解した上で構築されて初めて、現場の生産性を爆発的に向上させる基幹システムへと昇華する。
レガシーなVBAであっても、アーキテクチャの原則さえ外さなければ、現代の高速なエンジニアリングワークフローを支える強力な武器となる。あなたの設計現場でも、この極限のメモリ管理とフィーチャ操作を取り入れ、真の自動化を達成してほしい。
