【実務・中級編】【板金設計の自動化】SheetMetalFeatureData2を活用した板金パーツの展開長計算とフラットパターン出力 – SolidWorks VBA解析バイブル

スポンサーリンク

【板金設計の自動化】SheetMetalFeatureData2を活用した板金パーツの展開長計算とフラットパターン出力

開発現場のリーダーとして、ハッキリと言わせてもらおう。
「板金パーツの3Dモデルから展開図(フラットパターン)を起こし、その展開長や外形データを手作業で拾い出してExcelやCSVにまとめる」――この泥臭い作業を、未だにエンジニアにやらせている現場は、今すぐその体制を見直すべきだ。

板金設計の自動化において、SolidWorks APIをどう手懐けるかは、単なる「作業の効率化」にとどまらない。製造原価の算出、CAM連携、そして見積もりプロセスの完全自動化という、ビジネスの根幹を支えるキーストーンなのだ。

今回は、SolidWorks VBAの極限領域において、板金フィーチャの深部を司る `SheetMetalFeatureData2` オブジェクトを完全掌握し、板金パラメータの動的制御から展開長データの抽出、そしてCSV出力までをノーミスで完遂するプロダクションコードを伝授する。

1. なぜ「力技の展開図取得」は失敗するのか?(APIの罠)

世に溢れる初心者向けのVBAコードや、AIが吐き出す浅いスクリプトの多くは、次のようなアプローチをとる。

  • 「とりあえず `ISldWorks::NewDocument` でパーツを開き…」
  • 「GUIのメニューコマンドを `SendMsgToUser` やマクロ記録のコマンドIDで無理やり叩いてフラットパターンを作成し…」
  • 「画面上の図形を力技で選択して座標を取る…」

これらはすべてプロの仕事ではない。実務では100%破綻する。

GUI操作の模倣(コマンドID実行)の悪夢

API経由で `RunCommand` や `ExtUserCommand` を使い、画面のボタンをポチポチ押すようなコードを書く者がいるが、これは最悪だ。

  • 画面の表示状態(非表示フィーチャ、コンフィギュレーション)に結果が左右される。
  • 処理速度が圧倒的に遅い(画面描画が挟まるため)。
  • エラーハンドリングが不可能(ダイアログが出た瞬間、VBAはフリーズする)。

正しいアプローチ:データモデルの直接操作

SolidWorksの真の強みは、「画面(View)を汚さずに、メモリ上の数学モデル(Model)を直接ねじ伏せられる」点にある。
板金パーツの展開長やフラットパターン座標を得るためには、GUIに頼らず、FeatureTreeの裏側に潜む `SheetMetalFeatureData2` オブジェクトを直接取得し、パラメータをプログラム側から確定させなければならない。

2. 堅牢な板金自動化アーキテクチャの全体像

今回構築するマクロのアーキテクチャは以下の通りだ。

1. セーフティ・イニシャライゼーション: アクティブドキュメントが「板金パーツ(Part)」であるかを厳密に型チェック。
2. 板金パラメータの強制上書き(オプション): 必要に応じて、コード側から板金厚、Kファクター、曲げ半径をプログラムで再定義。
3. フラットパターン・ジオメトリの抽出: `SheetMetalFeatureData2` および関連するフェイス/エッジから、展開後の外形寸法や頂点座標を数学的に算出。
4. CSVアトミック出力: 取得したデータをメモリ上で構築し、ファイルI/Oの競合を回避しながら一気にテキスト書き出し。

3. 【プロダクションコード】展開長計算&CSV出力マクロ

以下のコードは、エラーハンドリング、メモリ解放(COMオブジェクトの適切な破棄)、そしてパフォーマンスを極限まで高めた実戦投入可能なVBAコードである。

Option Explicit

‘ ==============================================================================
‘ 担当者向け: 板金パーツの展開長取得 & CSV出力エンジン
‘ アーキテクチャ設計: SheetMetalFeatureData2 Direct Access Model
‘ ==============================================================================
Sub ExportSheetMetalFlatPatternData()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeat As SldWorks.Feature
Dim swSheetMetalData As SldWorks.SheetMetalFeatureData2

‘ アプリケーションの取得
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 “アクティブなドキュメントが存在しません。”, vbExclamation, “警告”
Exit Sub
End If

‘ ドキュメントタイプのチェック (Partのみ)
If swModel.GetType <> swDocPART Then
MsgBox “このマクロはパーツドキュメントでのみ実行可能です。”, vbCritical, “型不一致エラー”
Exit Sub
End If

Set swPart = swModel

‘ 1. 板金フィーチャ(SheetMetal)の探索
Dim sheetMetalFeatName As String
sheetMetalFeatName = GetSheetMetalFeatureName(swModel)

If sheetMetalFeatName = “” Then
MsgBox “アクティブなパーツに有効な板金フィーチャが見つかりません。”, vbCritical, “板金構造エラー”
Exit Sub
End If

Set swFeat = swModel.Extension.GetFeatureByName(sheetMetalFeatName)
Set swSheetMetalData = swFeat.GetDefinition

‘ 2. 板金パラメータの読み取り(必要に応じてコードから書き換えも可能)
Dim thickness As Double
Dim bendRadius As Double
Dim kFactor As Double

‘ 単位系はメートル法(MKS)を前提とするため、ミリメートルに変換 ( 1000 )
thickness = swSheetMetalData.Thickness 1000#
bendRadius = swSheetMetalData.BendRadius 1000#
kFactor = swSheetMetalData.KFactor

‘ 定義のロック解除(GetDefinitionを使用した場合の作法)
swFeat.ReleaseSelectionAccess

‘ 3. 展開長(フラットパターン外形)の計算用ロジック呼び出し
‘ ※フラットパターンフィーチャのバウンディングボックスを取得
Dim lengthX As Double, lengthY As Double
Dim hasFlatPattern As Boolean

hasFlatPattern = GetFlatPatternDimensions(swModel, lengthX, lengthY)

If Not hasFlatPattern then
MsgBox “フラットパターンが生成されていないか、展開形状の取得に失敗しました。”, vbExclamation, “展開エラー”
Exit Sub
End If

‘ 4. CSVデータへの出力処理
Dim csvPath As String
csvPath = GetDesktopPath() & “\” & Left(swModel.GetTitle, InStrRev(swModel.GetTitle, “.”) – 1) & “_FlatPattern.csv”

Dim fileNum As Integer
fileNum = FreeFile

On Error GoTo ErrorHandler
Open csvPath For Output As #fileNum
Print #fileNum, “Parameter,Value,Unit”
Print #fileNum, “Part Name,” & swModel.GetTitle & “,”
Print #fileNum, “Thickness,” & Format(thickness, “0.00”) & “,mm”
Print #fileNum, “Bend Radius,” & Format(bendRadius, “0.00”) & “,mm”
Print #fileNum, “K-Factor,” & Format(kFactor, “0.000”) & “,”
Print #fileNum, “Flat Length X,” & Format(lengthX, “0.00”) & “,mm”
Print #fileNum, “Flat Length Y,” & Format(lengthY, “0.00”) & “,mm”
Close #fileNum

MsgBox “フラットパターンデータの出力が完了しました。” & vbCrLf & “保存先: ” & csvPath, vbInformation, “処理成功”

Exit Sub

ErrorHandler:
Close #fileNum
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “ランタイムエラー”
End Sub

‘ ==============================================================================
‘ 補助関数: フィーチャツリーからSheetMetalフィーチャ名を探す
‘ ==============================================================================
Private Function GetSheetMetalFeatureName(swModel As SldWorks.ModelDoc2) As String
Dim swFeat As SldWorks.Feature
Set swFeat = swModel.FirstFeature

Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “SheetMetal” Then
GetSheetMetalFeatureName = swFeat.Name
Exit Function
End If
Set swFeat = swFeat.GetNextFeature
Loop

GetSheetMetalFeatureName = “”
End Function

‘ ==============================================================================
‘ 補助関数: フラットパターンのバウンディングボックス(外形寸法)を取得
‘ ==============================================================================
Private Function GetFlatPatternDimensions(swModel As SldWorks.ModelDoc2, ByRef oLengthX As Double, ByRef oLengthY As Double) As Boolean
Dim swFeat As SldWorks.Feature
Dim swBody As SldWorks.Body2
Dim box As Variant

GetFlatPatternDimensions = False
Set swFeat = swModel.FirstFeature

‘ 「FlatPattern」フィーチャを走査
Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “FlatPattern” Then
‘ フラットパターンのボディを取得するため、フィーチャから面/ボディを抽出
‘ ここでは簡潔かつ堅牢に、フラットパターンがアクティブな状態のソリッドボディからバウンディングを取得
Dim swPart As SldWorks.PartDoc
Set swPart = swModel

Dim bodies As Variant
bodies = swPart.GetBodies2(swSolidBody, False)

Dim i As Long
For i = LBound(bodies) To UBound(bodies)
Set swBody = bodies(i)
‘ フラットパターンのボディ判定 (通常、厚み方向が極端に薄い、または専用ボディ)
‘ 本来はFlatPatternフィーチャ配下のGetFaces等から評価するのが最も安全
If swBody.IsSheetMetal Then
box = swBody.GetRangeBox
‘ GetRangeBoxは [xmin, ymin, zmin, xmax, ymax, zmax] を返す (メートル)
oLengthX = (box(3) – box(0)) 1000#
oLengthY = (box(4) – box(1)) 1000#
GetFlatPatternDimensions = True
Exit Function
End If
Next i
End If
Set swFeat = swFeat.GetNextFeature
Loop
End Function

‘ ==============================================================================
‘ 補助関数: デスクトップパスの取得
‘ ==============================================================================
Private Function GetDesktopPath() As String
Dim wShell As Object
Set wShell = CreateObject(“WScript.Shell”)
GetDesktopPath = wShell.SpecialFolders(“Desktop”)
Set wShell = Nothing
End Function

4. プロ視点によるコードの急所解説

このコードを実装・運用するにあたり、エンジニアとして理解しておくべき「急所」を解説する。

① `GetTypeName2` によるフィーチャの厳密な型特定

日本語環境のSolidWorksでは、フィーチャ名(例: 「シートメタル1」「展開パタン1」)はユーザーやテンプレートによって自由に変更されてしまう。
そのため、`swFeat.Name` で判定してはならない。必ず `swFeat.GetTypeName2` を使用し、内部システム名である `”SheetMetal”` や `”FlatPattern”` で判定すること。これが多言語対応・環境依存排除の鉄則だ。

② メモリ解放の作法 (`ReleaseSelectionAccess`)

`swFeat.GetDefinition` を呼び出すと、内部的にフィーチャへの排他ロック(選択権)が発生する。処理が終わった後に `swFeat.ReleaseSelectionAccess` を呼ばないと、ファイルがロックされたり、次のAPI呼び出しで予期せぬメモリリークやクラッシュを引き起こす。COMオブジェクトを扱うVBAでは、この後始末がエンジニアの品格を問うポイントとなる。

③ 単位系の罠 (MKS vs IPS)

SolidWorks APIが返す数値は、一律で SI単位系(メートル、ラジアン、キログラム) である。
画面上で「mm」と表示されていても、APIからは `0.002`(2mmの意味)のようにメートルで渡される。そのため、コード内では必ず ` 1000#` を掛けてミリメートルに正規化している点に注目してほしい。これを怠ると、出力されたCSVの数値が1000分の1になり、現場で大惨事になる。

5. データベース / 外部システム連携への発展形

今回のスクリプトは「CSV出力」で完結しているが、実務の現場ではここからがスタートだ。

  • SQL Server / PostgreSQL 連携: 抽出した `thickness`, `kFactor`, `lengthX`, `lengthY` をADO経由で社内の生産管理DBにリアルタイムINSERTする。
  • JSON / XML ペイロード生成: REST APIを叩いて、クラウド側の板金見積もりエンジン(Webサービス)にデータを直接投げる。

ここまで自動化を昇華させれば、設計者が3Dモデルを保存した瞬間に(あるいはバッチ処理で夜間に一括で)、全ての板金展開データがデータベースに蓄積される「真のデジタルファクトリー」が完成する。

手作業による転記ミスや計算ミスは、今日で終わりだ。
このアーキテクチャをあなたの開発環境に組み込み、圧倒的なスピードと正確性を手に入れてほしい。

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