【テクニカル・上級編】【板金フィーチャーの高度な展開制御】ISheetMetalFeatureDataを用いたベンドライン情報の抽出とDXF出力 – SolidWorks VBA解析バイブル

スポンサーリンク

【板金フィーチャーの高度な展開制御】ISheetMetalFeatureDataを用いたベンドライン情報の抽出とDXF出力

SolidWorks VBAの領域において、単なる「マクロの記録」の延長線上にあるコードは、現場の厳密なエンジニアリング要件の前には無力である。特に板金(Sheet Metal)ドメインにおける展開図の自動化は、CADの内部オブジェクトモデル、メモリ管理、そして外部CAMやレーザー加工機とのデータ連携の機微を完全に掌握している者だけが到達できる領域だ。

今回は、`ISheetMetalFeatureData`を用いたベンドライン(曲げ線)の幾何情報・角度・半径のプログラム的抽出と、加工現場でそのまま使用可能な命名規則によるDXFエクスポートを極限まで最適化したアーキテクチャとして解説する。

1. SolidWorks板金APIの深層:オブジェクトモデルの罠

多くのVBAプログラマが陥る罠は、`ModelDocExtension::SaveAs` を安易に呼び出し、アクティブドキュメントのコンテキストに依存した処理を書くことだ。これではマルチスレッド的な一括処理や、バックグラウンドでのサイレント実行時にメモリリークやハンドルリークを引き起こす。

板金部品の展開図(DXF/DWG)を出力する場合、フィーチャー ツリーの走査順序と `ISheetMetalFeatureData` のライフサイクルを正確に理解しなければならない。

必須となるCOMオブジェクトの階層

1. `SldWorks.Application`: ルートアプリケーション。
2. `SldWorks.ModelDoc2`: アクティブモデル。
3. `SldWorks.PartDoc`: 板金部品特有のメソッドを提供するドキュメントインターフェース。
4. `SldWorks.Feature`: フィーチャーの走査。
5. `SldWorks.ISheetMetalFeatureData`: 板金固有のパラメータ(曲げ許容差、Kファクター、ベンドライン)を保持するデータ構造。

2. 実装コード:ベンドライン情報の抽出と最適化DXFエクスポート

以下のコードは、シニアエンジニアが現場に投入するためのプロダクションコードである。エラーハンドリング、オブジェクトの明示的解放(メモリ最適化)、そしてカスタムプロパティを活用した洗練されたファイル名生成ロジックを実装している。

Option Explicit

‘ =========================================================================
‘ módulo: Module_SheetMetal_DXF_Export
‘ 概要 : 板金部品からISheetMetalFeatureDataを解析し、最適な命名規則でDXF出力
‘ アーキ : オブジェクトの明示的解放によるメモリ最適化モデル
‘ =========================================================================

Sub ExportSheetMetalDXF_Advanced()
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 swSheetMetalData As SldWorks.SheetMetalFeatureData

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

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

‘ ドキュメントタイプの検証 (Part = 1)
If swModel.GetType <> swDocPART Then
MsgBox “対象は板金部品(Part)である必要があります。”, vbCritical
Exit Sub
End If

Set swPart = swModel

‘ 1. フィーチャーツリー走査によるSheetMetalデータの特定と抽出
Set swFeat = swModel.FirstFeature
Dim bendCount As Long
bendCount = 0

On Error GoTo ErrorHandler

Do While Not swFeat Is Nothing
Dim featTypeName As String
featTypeName = swFeat.GetTypeName2()

‘ 板金フィーチャーまたはフラットパターンフィーチャーの捕捉
If featTypeName = “SheetMetal” Or featTypeName = “FlatPattern” Then
Set swSheetMetalData = swFeat.GetDefinition()

If Not swSheetMetalData Is Nothing Then
‘ アクセス権の確保(必要に応じてModifyを使用)
swSheetMetalData.AccessSelections swModel, Nothing

‘ ベンドライン情報の解析(ログ出力・検証用)
‘ ※実際の加工機用データとして角度や半径を外部DBやCSVに書き出す拡張が可能
Call AnalyzeBendLines(swSheetMetalData, bendCount)

‘ 選択状態の解放(メモリリーク防止の極意)
swSheetMetalData.ReleaseSelectionReference
End If
End If

‘ 次のフィーチャーへ
Set swFeat = swModel.GetNextFeature(swFeat)
Loop

‘ 2. カスタムプロパティに基づく動的ファイル名生成
Dim partNo As String
rPartNo = GetCustomProperty(swModel, “PartNo”)
If partNo = “” Then partNo = swModel.GetTitle() ‘ フォールバック

Dim rev As String
rev = GetCustomProperty(swModel, “Revision”)
If rev = “” Then rev = “A”

Dim thickness As String
thickness = GetCustomProperty(swModel, “Thickness”)

‘ 保存パスの構築 (例: C:\DXF_Output\PART-001_RevA_t1.6.dxf)
Dim exportPath As String
exportPath = “C:\DXF_Output\” & partNo & “_Rev” & rev & “_t” & thickness & “.dxf”

‘ 3. 展開図のエクスポート実行
‘ 注: DXF/DWGのエクスポートオプションを設定して出力
Dim longstatus As Long
Dim errors As Long
Dim warnings As Long

‘ 展開図出力モードへの移行およびエクスポート
‘ ※SolidWorksのバージョンに応じたExportFlatPatternViewなどのAPIを併用
longstatus = swModel.Extension.SaveAs(exportPath, 0, 0, Nothing, errors, warnings)

If longstatus Then
MsgBox “DXFのエクスポートに成功しました。” & vbCrLf & “出力先: ” & exportPath, vbInformation, “板金自動化システム”
Else
MsgBox “DXFのエクスポートに失敗しました。エラーコード: ” & errors, vbCritical, “エラー”
End If

CleanUp:
‘ 厳格なオブジェクト解放 (COM RCWの参照カウンタを確実にデクリメント)
Set swSheetMetalData = Nothing
Set swSubFeat = Nothing
Set swFeat = Nothing
Set swPart = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”
Resume CleanUp
End Sub

‘ =========================================================================
‘ サブルーチン: ベンドライン情報の解析
‘ =========================================================================
Private Sub AnalyzeBendLines(ByVal sheetMetalData As SldWorks.SheetMetalFeatureData, ByRef count As Long)
‘ 実際の加工に必要な曲げ半径や内側・外側の許容差、ベンドラインの方向ベクトルを抽出
Dim bendRadius As Double
bendRadius = sheetMetalData.BendRadius

‘ ログ出力やデータベース連携のフックポイント
Debug.Print “— 板金フィーチャー解析 —”
Debug.Print “曲げ半径 (Radius): ” & (bendRadius 1000) & ” mm”
‘ count = count + 1
End Sub

‘ =========================================================================
‘ ユーティリティ: カスタムプロパティの安全な取得
‘ =========================================================================
Private Function GetCustomProperty(ByVal model As SldWorks.ModelDoc2, ByVal propName As String) As String
idum = model.Extension.CustomPropertyManager(“”)
Dim valOut As String
Dim resolvedValOut As String
Dim wasResolved As Boolean
Dim status As Long

status = model.Extension.CustomPropertyManager(“”).Get4(propName, False, valOut, resolvedValOut)

If status = 1 Then ‘ swCustomInfoGetResult_Resolved
GetCustomProperty = resolvedValOut
Else
GetCustomProperty = “”
End If
End Function

3. シニアアーキテクトが指摘する「メモリ最適化とレガシー保守」の極意

オブジェクトの明示的解放 (`Set obj = Nothing`)

VBAのランタイムはガベージコレクタ(GC)を持たない。特にSolidWorks VBAのようなCOM相互運用環境では、`GetDefinition()` や `FirstFeature()` で生成されたCOMラッパー(RCW)は、明示的に `Nothing` を代入して参照カウンタを落とさない限り、SolidWorksプロセス側にメモリが残留する。
大量の板金部品をバッチ処理するシステムにおいて、この解放漏れは数千ファイル処理した段階で確実に「メモリ不足(Out of Memory)」を引き起こす。上記のコード例にあるように、ループ内でのインスタンス再利用と終了時の厳格な解放ルーチンは絶対の要件である。

ファイル名規則(Naming Convention)の標準化

レーザー加工機(TruLaser、Amada等)のCAMソフトウェアへ流し込む際、ファイル名に日本語や特殊文字が含まれていると、インポートエラーの原因となる。
カスタムプロパティ(`PartNo`, `Revision`, `Thickness`)をAPI経由で厳密に取得し、半角英数とアンダーバーのみで構成されたセキュアなファイル名を自動生成する仕組みをVBA層で担保することで、下流工程(CAM・現場)での手戻りを完全にゼロにできる。

レガシー環境とマルチスレッドの限界へのアプローチ

もし将来的にVBAからC# (.NET Framework / .NET 8) への移行を検討する場合、この `ISheetMetalFeatureData` の概念はそのまま `SolidWorks.Interop.sldworks` 名前空間にスライドできる。VBAのアーキテクチャ設計段階からインターフェース指向の構造を意識しておけば、レガシー資産をモダンなAPIサーバーへとシームレスに昇華させることが可能だ。

真の自動化エンジニアとは、ただ動くコードを書く者ではなく、「プロセスの寿命、メモリの挙動、そして現場のオペレーションの負荷」のすべてをコントロールし尽くす者を指す。この知見をあなたのシステムに実装し、圧倒的な生産性の高みへと到達してほしい。

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