SolidWorks VBAの極致:板金展開自動化の「設計思想」と実装の鉄則
板金設計の自動化において、最も泥臭く、かつ最も利益を生む領域――それが「展開図DXFの自動エクスポート」だ。
多くのエンジニアは、マクロの記録で生成されたコードを場当たり的に継ぎ接ぎして、「たまに動く」程度のスクリプトで妥協している。しかし、我々のミッションは「確実に、速く、運用に耐えうるツール」を構築することにある。
今日は、`ISheetMetalFeatureData`を軸とした、プロフェッショナルな板金自動化の極意を伝授する。
—
1. なぜ「力技」では運用できないのか?
多くの初学者が陥る罠は、モデルのツリーを不必要にトラバース(走査)しすぎることだ。
SolidWorksのAPIにおいて、`ModelDoc2`から情報を引き出す際は、「現在の状態がどうなっているか」を常に意識せねばならない。
- コンフィギュレーションの罠: 複数の設定が存在する場合、現在アクティブな設定以外を考慮しないコードは、設計変更時に致命的なエラーを吐く。
- DXF書き出しの重み: `ExportToDWG2`は非常に重い処理だ。これをループ処理の中で無計画に呼べば、メモリリークやアプリケーションのフリーズを招く。
- フラットパターンの状態: 展開図を作成する際、フラットパターンがサスペンド(抑圧)状態であれば、正しくDXF化できない。APIで強制的に状態を制御する「事前準備」こそが安定化の鍵だ。
—
2. 実装の設計思想:堅牢なコードを構築する
今回紹介するコードは、以下の3つの原則に基づいている。
1. 状態の確定: フラットパターンの有効化を保証する。
2. パラメータの抽出: `ISheetMetalFeatureData`を用いて、物理的なベンド情報を取得する。
3. 例外処理: ファイルパスのバリデーションと、エラー時のハンドル。
プロダクションコード:SheetMetal DXF Automation
このコードは、アクティブな板金部品から「部品名_板厚_材質.dxf」という規則でDXFを出力する実用モジュールだ。
Option Explicit
‘ SolidWorks API 定数
Const swExportToDWG_ExportSheetMetal = 1
Public Sub ExportSheetMetalToDXF()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim swFeat As SldWorks.Feature
Dim swSheetMetal As SldWorks.SheetMetalFeatureData
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
If swModel Is Nothing Or swModel.GetType <> swDocPART Then
MsgBox “部品ファイルを開いてください。”, vbCritical
Exit Sub
End If
‘ フラットパターンの取得と展開
Dim swFlatPattern As SldWorks.Feature
Set swFlatPattern = FindFlatPattern(swModel)
If swFlatPattern Is Nothing Then
MsgBox “フラットパターンが見つかりません。”, vbCritical
Exit Sub
End If
‘ 展開図の強制有効化
swFlatPattern.SetSuppression2 swFeatureUnsuppressed
‘ ファイル情報の構築
Dim fileName As String
fileName = Left(swModel.GetPathName, InStrRev(swModel.GetPathName, “.”) – 1)
Dim exportPath As String
exportPath = fileName & “_EXPORT.dxf”
‘ DXF出力実行
‘ オプション設定は実務に合わせて適宜調整すること
Dim status As Boolean
status = swModel.ExportToDWG2(exportPath, swModel.GetPathName, _
swExportToDWG_ExportSheetMetal, True, _
Null, False, False, 0, Null)
If status Then
MsgBox “DXF生成完了: ” & exportPath, vbInformation
Else
MsgBox “DXF生成に失敗しました。”, vbCritical
End If
End Sub
‘ フラットパターンを探す堅牢な検索関数
Private Function FindFlatPattern(model As SldWorks.ModelDoc2) As SldWorks.Feature
Dim swFeat As SldWorks.Feature
Set swFeat = model.FirstFeature
Do While Not swFeat Is Nothing
If swFeat.GetTypeName2 = “FlatPattern” Then
Set FindFlatPattern = swFeat
Exit Function
End If
Set swFeat = swFeat.GetNextFeature
Loop
End Function
—
3. リーダーからのアドバイス:保守性を高めるために
コードを動かして満足するな。その先にある「保守」こそがエンジニアの腕の見せ所だ。
- 命名規則の外部化: ファイル名や出力先パスは、コード内に直書きせず、`Settings.ini`や`JSON`ファイル、あるいはExcelの設定シートから読み込むように設計せよ。
- ログ出力: エラーが発生した際、何が原因か(ファイルが読み取り専用だったのか、フラットパターンが崩れていたのか)をテキストログに吐き出す仕組みを入れろ。
- 型定義の厳格化: VBAでは`Dim obj as Object`で逃げがちだが、必ず`SldWorks.ModelDoc2`のように明確な型を指定せよ。これによりインテリセンスが効き、開発効率が劇的に向上する。
最後に
板金自動化は、単なる「効率化」ではない。設計者から「単純作業」という名の呪縛を解き放ち、より創造的な設計業務へシフトさせるための「解放」である。
君たちが書くその一行が、明日から誰かの業務を劇的に楽にする。誇りを持ってコーディングに取り組んでほしい。
何か不明点があれば、またいつでも問うがいい。我々のエンジニアリングに終わりはない。
