【テクニカル・上級編】【初心者向け】図面シートサイズ変更とカスタム用紙サイズ対応のVBA自動化 – SolidWorks VBA解析バイブル

スポンサーリンク

SolidWorks VBAを掌握する極限の知見:動的シートサイズ変更とカスタム用紙サイズ制御の完全自動化

図面の標準化と肥大化への対策は、設計オートメーションにおける永遠の課題だ。A3からA2、あるいは特殊な長尺サイズやカスタム規格への変更を、手動で行うなどという非効率なワークフローは、シニアエンジニアの辞書には存在しない。

今回は、SolidWorks APIの図面(Drawing)ドキュメントにおける「シートサイズ変更」および「カスタム用紙サイズ(User Defined Size)の設定」の本質を解き明かす。
ネット上の断片的なコードをコピペして「なぜか動かない」「ビューが暴走する」「図枠が崩壊する」と悩むフェーズは、ここで終わりにする。SolidWorksのオブジェクトモデルの挙動を完全に掌握し、実務でそのまま稼働する堅牢なコードベースを提示する。

—

1. 表面的なプロパティ操作の罠:SolidWorks図面ドキュメントの構造

多くの初心者が犯す最大の過ちは、`ISheet::SetSize` メソッドを単発で呼び出すことだ。
SolidWorksの図面は、単なる2Dのキャンバスではない。背後には「シート定義(Sheet Setup)」、「標準用紙規格の列挙値(DwgPaperSizes_e)」、そして「物理的な用紙寸法(幅・高さ)」という厳密な階層構造が存在する。

規格サイズ(A4, A3, A2など)を変更する場合と、完全なカスタムサイズ(ミリ単位で指定)を指定する場合では、呼び出すべきAPIのルートが異なる。ここを混同すると、APIはエラーすら吐かずに「無視」するか、致命的なスケール崩壊を引き起こす。

—

2. 実装コード:安全かつ確実なシートサイズ変更モジュール

以下に、既存のアクティブ図面に対して、標準規格サイズへの変更、およびカスタム寸法(幅・高さ指定)への動的変更を完全に制御するプロダクションコードを提示する。

メモリリークを完全に排除するため、オブジェクトの明示的な解放(`Set … = Nothing`)を徹底している点にも注目してほしい。

Option Explicit

‘ =========================================================================
‘ モジュール名: modSheetSizeController
‘ 概要: SolidWorks 図面シートのサイズ変更およびカスタム用紙サイズ設定
‘ 著者: チーフアーキテクト
‘ =========================================================================

‘ dwgPaperSizes_e の主要な列挙値抜粋
‘ swDwgPaperA4size = 2
‘ swDwgPaperA3size = 3
‘ swDwgPaperA2size = 4
‘ swDwgPaperA1size = 5
‘ swDwgPaperA0size = 6
‘ swDwgPapersUserDefined = 12 (カスタムサイズ用)

Public Sub ExecuteSheetSizeTransformation()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDrawing As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet

Dim longRet As Long
Dim strSheetNames() As String
Dim i As Long

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

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

‘ 3. 図面ドキュメントかどうかの型安全チェック
If swModel.GetType <> swDocDRAWING Then
MsgBox “アクティブなドキュメントは図面ではありません。”, vbCritical
Exit Sub
End If

Set swDrawing = swModel

‘ 4. アクティブシートの取得
Set swSheet = swDrawing.GetCurrentSheet
If swSheet Is Nothing Then
MsgBox “アクティブシートを取得できませんでした。”, vbCritical
GoTo CleanUp
End If

‘ =========================================================================
‘ パターンA: 標準規格サイズ(例: A2サイズ)に変更する場合
‘ =========================================================================
‘ 引数: 規格, テンプレート, 幅(UserDefined用), 高さ(UserDefined用)
‘ 標準規格の場合、幅と高さは 0 を渡すのが作法である。
‘ =========================================================================
Dim targetStandardSize As Long
targetStandardSize = swDwgPaperA2size ‘ A2を指定

longRet = swSheet.SetSize(targetStandardSize, 0, 0.0, 0.0)

If longRet Then
Debug.Print “シートサイズを標準規格(A2)に変更しました。”
Else
Debug.Print “標準規格への変更に失敗しました。”
End If

‘ =========================================================================
‘ パターンB: カスタム用紙サイズ(例: 幅 594mm, 高さ 420mm の独自A2変則など)に変更する場合
‘ =========================================================================
‘ 注意: 寸法は「メートル(m)」単位で指定するのがSolidWorks APIの鉄則である。
‘ 594 mm = 0.594 m
‘ 420 mm = 0.420 m
‘ =========================================================================
Dim customWidth As Double
Dim customHeight As Double

customWidth = 0.594 ‘ 594 mm
customHeight = 0.420 ‘ 420 mm

‘ 第1引数に swDwgPapersUserDefined (12) を指定し、第3・第4引数にメートル単位の寸法を渡す
longRet = swSheet.SetSize(swDwgPapersUserDefined, 0, customWidth, customHeight)

If longRet Then
Debug.Print “シートサイズをカスタムサイズ (594×420) に変更しました。”
Else
Debug.Print “カスタムサイズへの変更に失敗しました。寸法やライセンスを確認してください。”
End If

‘ 5. ビューの再描画とモデルの更新
swModel.WindowRedraw
swModel.EditRebuild

CleanUp:
‘ =========================================================================
‘ 【極限の知見】メモリ最適化とオブジェクト解放
‘ VBAのCOMラッパーはガベージコレクションを過信してはならない。
‘ 明示的な Nothing 代在地獄を防ぐための確実な解放処理。
‘ =========================================================================
Set swSheet = Nothing
Set swDrawing = Nothing
Set swModel = Nothing
Set swApp = Nothing

MsgBox “シートサイズの動的変更プロセスが完了しました。”, vbInformation
End Sub

—

3. シニアエンジニアが押さえるべき「3つの技術的急所」

上記のコードを実務の巨大なアセンブリ図面や社内PDM連携システムに組み込む際、以下の3点を理解しているか否かで、システムの堅牢性が劇的に変わる。

① 単位系の罠(ミリメートル vs メーター)

SolidWorks APIの内部処理は、例外なく「SI単位系(メートル・キログラム・秒)」を基準として動いている。画面上では「mm」で設計されている図面であっても、APIに渡す数値はすべて「メートル(m)」に換算しなければならない。カスタムサイズの指定時に `594` のような数値をそのまま渡すと、地球を覆うような巨大なキャンバスが生成され、SolidWorksがフリーズまたはクラッシュする。必ず `0.594` のように換算すること。

② 図枠(フォーマット)のスケーリング崩壊を防ぐアプローチ

用紙サイズを変更しただけでは、既存の図枠(Sheet Format)やタイトルブロックが元のサイズのまま左下に張り付いたり、引き延ばされたりする現象が発生する。
これを防ぐには、`ISheet::ReloadTemplate` メソッドを併用し、新しいサイズに対応した図枠テンプレート(`.slddrt`)を動的に再ロードする処理をシーケンスに組み込む必要がある。
単にキャンバスの大きさを変えるだけでなく、「図枠の差し替え」をセットで行うのがプロのアーキテクチャである。

③ 複数シート(Multi-sheet)環境でのイテレーション

図面ファイルに複数のシートが存在する場合、`ISweet` インターフェースの操作対象が「現在アクティブなシート」に限定されている点に注意せよ。
すべてのシートのサイズを統一、あるいはシートごとに異なるカスタムサイズを適用したい場合は、`IDrawingDoc::GetSheetNames` で全シート名を取得し、`IDrawingDoc::ActivateSheet` で明示的にシートを切り替えてから `SetSize` を実行するループ構造を構築しなければならない。

—

結びにかえて

SolidWorks VBAによる図面自動化は、単なる「手作業の置き換え」ではない。設計上流から下流工程、そして製造現場へのデータ納品に至るまで、データの整合性を担保するための極めて重要なインフラストラクチャである。

今回解説したオブジェクトのライフサイクル管理、単位系の厳密な解釈、そして適切な定数の選択をマスターすれば、いかなる複雑なレガシー図面であっても、一糸乱れぬ正確さでプログラムの配下に置くことが可能となる。
妥協なきコードで、真の設計オートメーションを構築してほしい。

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