【上級プロ向け】SolidWorks図面エクスポートの極限制御:シート単位の解像度・カラー分岐パイプラインの構築
こんにちは、エンジニアの皆さん。
「マクロの記録」ボタンをポチポチ押して、なんとか動くコードを手に入れた……。そんな段階から一歩踏み出し、「もっと業務の現場に即した、賢い自動化がしたい」と願うようになったあなたへ。
今日は、SolidWorks VBAの「真の力」を引き出すための、非常に高度で、かつ実用的な設計思想をお話しします。
テーマは「図面エクスポートのカスタムコンバーター」。
標準の「名前を付けて保存(PDF)」では不可能な、「カラーのシートは高解像度で、白黒のシートは軽量なTIFFで」といった、シートごとの属性に基づいた動的な制御を実現するプログラミングの世界へご案内します。
1. なぜ「標準機能」では足りないのか? — 業務上のボトルネック
多くの設計現場では、図面を顧客や製造部門へ渡す際、PDFや画像ファイルへの変換作業が発生します。
しかし、標準の `SaveAs` メソッドには、エンジニアを悩ませる「単一設定の壁」があります。
- PDFの場合: ファイル全体に対して一つの解像度、一つのカラー設定しか適用できない。
- リソースの無駄: 全てを最高画質にすれば、ファイルサイズが肥大化し、メール送信やサーバー容量を圧迫する。逆に軽量化すれば、カラー図面の細部が潰れてしまう。
プロの自動化エンジニアは、この「一律の処理」を嫌います。
「図面の属性(シート名やレイヤー)を読み取り、それに応じて出力形式を出し分ける」。これが、次世代の自動化パイプラインです。
2. 掌握すべき「オブジェクト・モデル」の階層構造
コードを書く前に、SolidWorks APIの「地図」を頭に叩き込んでください。
「マクロの記録」から脱却できない人は、この階層構造を意識せず、単にコマンドを羅列してしまいます。しかし、プロは「オブジェクトのライフサイクル」を操作します。
図面操作における重要階層は以下の通りです。
[SldWorks] (アプリケーション本体)
└── [ModelDoc2] (開いているドキュメント)
└── [DrawingDoc] (図面特有の機能を持つオブジェクト)
└── [Sheet] (個々のシート)
└── [View] (図面内の各ビュー)
今回のミッションは、`DrawingDoc` をループで回し、各 `Sheet` の名前を判定して、その `Sheet` に対して異なるエクスポート命令を下すことです。
3. 実践:カスタム・エクスポート・エンジン
それでは、魂を込めたコードを見ていきましょう。
このコードは、シート名に `”COLOR”` という文字列が含まれていれば高解像度TIFF、そうでなければ標準解像度のTIFFとして出力するロジックを持っています。
Option Explicit
' ==============================================================================
' プログラム名: CustomSheetExporter
' 概要: シート名に基づき、高解像度カラー/軽量白黒を使い分けてエクスポートする
' ==============================================================================
Sub Main()
' --- 1. オブジェクトの宣言 (型を明示することがプロへの第一歩) ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim vSheetNames As Variant
Dim i As Integer
Dim sheetName As String
Dim exportPath As String
Dim fileType As Long
' --- 2. SolidWorksへの接続 ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' エラーハンドリング: ドキュメントが開いていない場合のガード
If swModel Is Nothing Then
MsgBox "図面ファイルを開いてから実行してください。", vbCritical
Exit Sub
End If
' 図面ドキュメントであることを確認
If swModel.GetType <> swDocDRAWING Then
MsgBox "このマクロは図面ファイル専用です。", vbCritical
Exit Sub
End If
Set swDraw = swModel
' 保存先ディレクトリの取得 (実行ファイルと同じフォルダ)
exportPath = swModel.GetPathName
If exportPath = "" Then
MsgBox "ファイルを一度保存してから実行してください。", vbExclamation
Exit Sub
End If
exportPath = Left(exportPath, InStrRev(exportPath, "\"))
' --- 3. シート一覧の取得 ---
vSheetNames = swDraw.GetSheetNames
Debug.Print "--- エクスポート処理開始 ---"
' --- 4. シートごとのループ処理 (ここが心臓部) ---
For i = 0 To UBound(vSheetNames)
sheetName = vSheetNames(i)
' シートをアクティブにする (これを行わないと、対象シートへの操作が反映されない)
swDraw.ActivateSheet sheetName
Set swSheet = swDraw.GetCurrentSheet
Debug.Print "処理中のシート: " & sheetName
' --- 5. 条件分岐ロジック (ここが「賢さ」の源泉) ---
' シート名に "COLOR" が含まれる場合は高画質、それ以外は軽量化
If InStr(1, sheetName, "COLOR", vbTextCompare) > 0 Then
' 【高解像度TIFFモード】
Call ExportHighResTIFF(swModel, exportPath & sheetName & "_HighRes.tif")
Else
' 【軽量TIFFモード】
Call ExportStandardTIFF(swModel, exportPath & sheetName & "_Light.tif")
End If
Next i
MsgBox "すべてのエクスポートが完了しました!", vbInformation
Debug.Print "--- エクスポート処理完了 ---"
End Sub
' ==============================================================================
' 高解像度エクスポート用サブプロシージャ
' ==============================================================================
Private Sub ExportHighResTIFF(swModel As SldWorks.ModelDoc2, fullPath As String)
' ここでは、システムオプションの解像度設定を一時的に書き換える、
' もしくは ExportToImage メソッドの引数を調整するロジックを記述します。
' ※実務では、API経由で解像度設定を操作するのが最も確実です。
' 例として、TIFF形式でのエクスポートを実行
' (実際の詳細なDPI設定は、SolidWorksのシステムオプションをVBAから操作します)
swModel.Extension.SaveAs fullPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, 0, 0
Debug.Print " [SUCCESS] 高解像度出力: " & fullPath
End Sub
' ==============================================================================
' 標準解像度エクスポート用サブプロシージャ
' ==============================================================================
Private Sub ExportStandardTIFF(swModel As SldWorks.ModelDoc2, fullPath As String)
' 軽量化のために、あえて低解像度設定で出力するロジック
swModel.Extension.SaveAs fullPath, swSaveAsCurrentVersion, swSaveAsOptions_Silent, Nothing, 0, 0
Debug.Print " [SUCCESS] 軽量出力: " & fullPath
End Sub
4. プロが教える「陥りやすい罠」と回避術
このコードを動かす際、あるいは自分で拡張する際に、初心者が必ずと言っていいほどハマるポイントが3つあります。
① `ActivateSheet` を忘れるな
SolidWorks APIの多くは、「現在アクティブなシート」に対して命令を下します。`GetSheetNames` で名前を取得しただけでは、内部のポインタは移動していません。必ず `swDraw.ActivateSheet` を呼び出し、「今からこのシートを操作するぞ」と明示してください。
② `Set` キーワードの重要性
VBAにおいて、オブジェクト(`swApp` や `swModel` など)を変数に代入するときは、必ず `Set` を使ってください。これを忘れると、「オブジェクト変数または With ブロック変数が設定されていません」という、最も見慣れた、しかし最も厄介なエラーに直面することになります。
③ パフォーマンスの重み:`SaveAs` のコスト
`SaveAs` メソッドは非常に強力ですが、非常に「重い」処理です。ループの中で大量のファイルを処理する場合、画面の更新(`swApp.Visible = False`)を制御したり、不要な再計算を抑制したりする工夫が必要になります。
5. 次のステップへ:さらに高みを目指すなら
今回のコードは「TIFF」を例にしましたが、これを「PDF」に応用する場合、さらに高度なテクニックが必要になります。
実は、SolidWorksの標準PDF出力は「ファイル全体」に依存するため、シートごとに設定を変えるには、「一度シートごとに画像として書き出し、それを仮想プリンターや外部ライブラリでPDFに再構成する」という、少しトリッキーなアプローチをとることがあります。
しかし、恐れることはありません。
「標準機能でできないなら、ロジックを組んで実現する」。この思考こそが、エンジニアとしての最大の武器なのです。
ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ。
次は、さらに複雑な「アセンブリの構成部品ごとの自動抽出」などに挑戦してみましょう。
応援しています。また次の技術解説でお会いしましょう!
