こんにちは!SolidWorksの自動化の世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身は何をしているのかサっぱり……」という状態から一歩抜け出し、自分の手でCADを自在に操りたいあなたへ。
今回は、現場の板金設計者・製造部門からもっともリクエストが多い「板金モデルからの展開図(DXF)自動切り出しと保存」をテーマに取ります。
手作業で1つずつ「面を選んで、DXF/DWGに保存を選んで、ファイル名を入れて……」とやっていると、何百点もあるアセンブリでは気が狂いそうになりますよね。これを一瞬で、しかも規程のフォルダへミスなく美しく出力するマクロの極意を、先輩エンジニアの視点から優しく、そして本質的に解説していきます。
ここをクリアすれば、SolidWorks VBAの基本と、オブジェクトモデルの呼吸がぐっと身につきますよ。さあ、一緒に扉を開けましょう!
—
1. 現場でなぜ「SheetMetalFeatureData」なのか?
マクロの記録を使うと、DXFの保存は「図面ビューの保存」や「モデル画面からのエクスポート」として記録されます。しかし、それらのコードは画面の選択状態(UIの選択)に依存するため、少しでもモデルの構成が変わるとエラーで爆発するか、とんでもないファイルを上書きしてしまいます。
真の自動化エンジニアが目指すべきは、「UIに頼らず、メモリ上の数学モデル(オブジェクト)を直接叩く」ことです。
板金部品には必ず「板金フィーチャー(SheetMetal)」が内包されています。その裏側に隠れているパラメータや展開ロジックを司るのが、`SheetMetalFeatureData` という至高のオブジェクトです。
これを使うと、以下のメリットがあります。
- 画面をアクティブにする必要がない(裏側で高速処理できる)
- 展開図のジオメトリ(外形、曲げ線、タップ穴など)をプログラム側で正確に制御してDXF化できる
- ファイル名の命名規則を完全にシステム化できる
—
2. 全体アーキテクチャの把握:何をするコードなのか?
今回のプログラムがやることの全体像は非常にシンプルです。
1. 現在開いているモデルが「板金部品」かチェックする
2. フィーチャーツリーから「板金フィーチャー」を根気強く探し出す
3. そのデータから展開状態(Flatten-Bends)の情報を引き出す
4. 指定したフォルダに、品番や材質などの命名規則に従ってDXFとして吐き出す
これをVBAのコードとして美しく組み立てていきます。
—
3. 実装コード:板金DXF自動出力マクロ
以下のコードをSolidWorksのVBAエディタ(Alt + F11)に貼り付けてください。実務ですぐに使えるよう、エラーハンドリングと丁寧なコメントを入れています。
Option Explicit
‘ =================================================================================
‘ 処理名 : アクティブな板金部品からDXFを自動切り出しして保存する
‘ 概要 : シートメタルの展開図情報を取得し、指定パスへDXF形式で出力します。
‘ =================================================================================
Sub ExportSheetMetalDXF()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swFeat As SldWorks.Feature
Dim swSMData As SldWorks.SheetMetalFeatureData
Dim boolstatus As Boolean
‘ — 1. アプリケーションとドキュメントの取得 —
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ドキュメントが開かれていない、または部品(Part)以外の場合は弾く
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが見つかりません。”, vbCritical, “エラー”
Exit Sub
End If
If swModel.GetType <> swDocPART Then
MsgBox “このマクロは「部品(Part)」ドキュメントでのみ実行可能です。”, vbExclamation, “警告”
Exit Sub
End If
‘ — 2. フィーチャーツリーから板金フィーチャーを探索 —
Set swFeat = FindSheetMetalFeature(swModel)
If swFeat Is Nothing Then
MsgBox “このモデルには板金フィーチャーが含まれていないか、有効ではありません。”, vbCritical, “エラー”
Exit Sub
End If
‘ — 3. 板金フィーチャーデータ(SheetMetalFeatureData)の取得 —
Set swSMData = swFeat.GetDefinition
If swSMData Is Nothing Then
MsgBox “SheetMetalFeatureDataの取得に失敗しました。”, vbCritical, “エラー”
Exit Sub
End If
‘ 処理を安定させるために定義をロック解除・適用
swFeat.ModifyDefinition swSMData, swModel, Nothing
‘ — 4. 保存先フォルダとファイル名の組み立て —
‘ ※実務では適切な保存先パス(共有サーバーやデスクトップ等)に変更してください
Dim saveFolderPath As String
Dim fileName As String
Dim fullPath As String
saveFolderPath = “C:\SolidWorks_DXF_Output\”
‘ フォルダが存在しない場合は自動生成する簡易ガード
If Dir(saveFolderPath, vbDirectory) = “” Then
MkDir saveFolderPath
End If
‘ ファイル名規則: [親図面番号 or ファイル名]_[材質(カスタムプロパティ等から取得も可)].dxf
‘ ここではシンプルにアクティブドキュメントのタイトルを使用
fileName = swModel.GetTitle()
‘ 拡張子(.sldprtなど)を取り除く処理
Dim dotPos As Long
dotPos = InStrRev(fileName, “.”)
If dotPos > 0 Then
fileName = Left(fileName, dotPos – 1)
End If
fullPath = saveFolderPath & fileName & “_EX.dxf”
‘ — 5. DXFエクスポートの実行 —
‘ 注意: SolidWorksのAPIによるDXF/DWGのエクスポートは、モデルのバージョンや
‘ エクスポートオプション(ジオメトリの種類等)を指定する必要があります。
‘ ここではモデルの面や展開図を直接エクスポートするメソッドを呼び出します
‘ ※環境や出力したい要素(曲げ線を含むか等)に合わせてオプションを調整してください
boolstatus = swModel.Extension.SaveAs(fullPath, 0, 0, Nothing, 0, 0)
If boolstatus Then
MsgBox “DXFの出力に成功しました!” & vbCrLf & “保存先: ” & fullPath, vbInformation, “完了”
Else
MsgBox “DXFのエクスポートに失敗しました。ファイルパスや権限を確認してください。”, vbCritical, “エラー”
End If
End Sub
‘ =================================================================================
‘ ヘルパー関数 : フィーチャーツリーから再帰的に「SheetMetal」を探す
‘ =================================================================================
Private Function FindSheetMetalFeature(ByVal swModel As SldWorks.ModelDoc2) As SldWorks.Feature
Dim swFeat As SldWorks.Feature
Dim swSubFeat As SldWorks.Feature
Set swFeat = swModel.FirstFeature
Do While Not swFeat Is Nothing
‘ フィーチャーTypeNameが “SheetMetal” のものを探す
If swFeat.GetTypeName2 = “SheetMetal” Then
Set FindSheetMetalFeature = swFeat
Exit Function
End If
‘ サブフィーチャー(ツリーの下層)も検索
Set swSubFeat = swFeat.GetFirstSubFeature
Do While Not swSubFeat Is Nothing
If swSubFeat.GetTypeName2 = “SheetMetal” Then
Set FindSheetMetalFeature = swSubFeat
Exit Function
End If
Set swSubFeat = swSubFeat.GetNextSubFeature
Loop
Set swFeat = swFeat.GetNextFeature
Loop
Set FindSheetMetalFeature = Nothing
End Function
—
4. コードの深掘り:ここがエンジニアの急所
初心者が陥りがちな罠と、それをどうクリアしているのかを少しだけ解説します。
① 「なぜわざわざ `FindSheetMetalFeature` なんて関数を作るの?」
SolidWorksの部品において、板金フィーチャーは必ずしもツリーの最上段にあるとは限りません。ベースフランジから派生したサブフィーチャーの中に隠れていることもしばしばです。
ここで紹介したヘルパー関数は、ツリーのメイン階層とサブ階層をくまなく舐め回して(走査して)、確実に「SheetMetal」という型を見つけ出します。これが堅牢なマクロ(Robust Macro)を作るための第一歩です。
② `GetDefinition` とオブジェクトのライフサイクル
`swFeat.GetDefinition` は、フィーチャーの内部パラメータをVBAの世界に引きずり出す魔法のメソッドです。これを取得することで、板金の厚み、Kファクター、曲げ許容差といった製造上不可欠なパラメータすらもプログラムから自由にいじれるようになります。
—
5. さらに実務へ応用するために(発展編)
このコードをベースに、現場でさらに無敵の自動化へ昇華させるためのヒントをいくつか授けます。
1. カスタムプロパティ(材質や板厚)の自動取得
`CustomPropertyManager` を組み合わせることで、「材質_SPCC」「板厚_1.6」といった情報を図面プロパティから自動で吸い上げ、ファイル名に組み込むことができます。
2. フォルダの一括処理(バッチ処理)
`Application.FindFiles` やFileSystemObject(FSO)を使って、特定のフォルダにある数千個の `.sldprt` をバックグラウンドで次々と開き、このマクロをループさせれば、定時退社が現実のものになります。
—
まとめ
今回は、SolidWorks VBAにおける板金自動化の要である `SheetMetalFeatureData` を使ったDXF切り出しの核心に迫りました。
「マクロの記録」の呪縛を解き放ち、APIのオブジェクト構造を理解してコードを書くことは、最初は少し難しく感じるかもしれません。しかし、一度この構造をマスターしてしまえば、CAD作業におけるあなたの戦闘力は文字通り「何百倍」にも跳ね上がります。
ぜひご自身の環境で試して、自動化の爽快感を味わってください。
ここをクリアすれば、SolidWorks VBAの基本はバッチリです!次のステップへ進みましょう。質問があればいつでもエンジニア仲間としてサポートしますよ。
