【SolidWorks VBA極限活用】IDrawingDoc.NewSheet と Sheet.SetProperties によるマルチシート図面動的生成の全技術
製図部門における最大の無駄は、定型的な図面シートの作成、枠の配置、そしてプロパティ(図面サイズ、尺度、投影法)の手動設定という「機械的作業」にある。特に数百点に及ぶアセンブリ構成や、派生品種を大量に抱える製造業の現場において、マルチシート図面の構築を自動化することは、単なる効率化ではなく、設計ミスを根絶するための防衛策である。
本稿では、SolidWorks APIの核心である `SldWorks.ModelDoc2` から `IDrawingDoc` へのダウンキャスト、`NewSheet` メソッドによるシートの動的生成、そして `Sheet.SetProperties` によるプロパティの完全制御を、メモリ管理とパフォーマンスの限界まで最適化した実用コードとともに解説する。
—
1. SolidWorks APIオブジェクトモデルの深層とメモリ管理の鉄則
VBAによるSolidWorks自動化で最も頻発する障害は、COMオブジェクトの解放漏れによるメモリリークと、それに起因する `COMException`(HRESULT: 0x8001010A 等のRPC_E_SERVERCALL_RETRYLATER)である。
図面ドキュメント(`DrawingDoc`)およびシート(`Sheet`)を操作する際、APIが返すラッパーオブジェクトは内部でSolidWorksのC++コアプロセスと強固に結びついている。これらをローカル変数に保持したままプロシージャを抜けると、ガベージコレクションのタイミングが制御できず、連続実行時に確実に SolidWorks がフリーズまたはクラッシュする。
鉄則:オブジェクトの即時解放(`Set obj = Nothing`)
ループ内でシートを生成・設定する処理では、取得したインターフェースはスコープごとに必ず `Nothing` を代入して参照カウントをデクリメントしなければならない。
—
2. 動的シート生成・プロパティ設定のアーキテクチャ
`IDrawingDoc::NewSheet3`(または `NewSheet5`)を使用することで、シート名、用紙サイズ、尺度、投影法(第一角法/第三角法)をプログラムから一括定義できる。
用紙サイズの定数マッピング
SolidWorks APIにおける用紙サイズ(`swDwgPaperSizes_e`)は以下の通り、数値として直値で扱うよりも明示的な列挙体(または定数)としてコード化することが保守性の観点から望ましい。
- `swDwgPaperA0Size` (0)
- `swDwgPaperA1Size` (1)
- `swDwgPaperA2Size` (2)
- `swDwgPaperA3Size` (3)
- `swDwgPaperA4Size` (4)
—
3. 実装コード:マルチシート動ikt生成エンジン
以下のコードは、外部データ(CSVや配列など)から動的にシート名とサイズ、投影法を受け取り、ミリ秒単位の無駄を削ぎ落としたマルチシート構築エンジンの実務用サンプルである。
Option Explicit
‘ ————————————————————————————————
‘ チーフアーキテクト特製: マルチシート図面動的生成プロシージャ
‘ ————————————————————————————————
Sub GenerateMultiSheetDrawing()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
‘ 実行環境の取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
‘ ガード節:ドキュメントが存在し、かつそれが図面であるか
If swModel Is Nothing Then
MsgBox “アクティブなドキュメントが存在しません。”, vbCritical, “API Error”
Exit Sub
End If
If swModel.GetType() <> swDocDRAWING Then
MsgBox “アクティブなドキュメントは図面ではありません。”, vbCritical, “API Error”
Exit Sub
End If
‘ DrawingDocインターフェースへ安全にキャスト
Set swDraw = swModel
‘ 画面描画の凍結(パフォーマンス爆発的向上とちらつき防止)
swModel.Extension.EnableAnimations = False
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, True
On Error GoTo ErrorHandler
‘ — 動的生成するシートの定義データ(実務では配列や外部DB/CSVから動的取得する) —
‘ 構造: SheetName, PaperSize(0=A0, 3=A3, 4=A4), Scale1, Scale2, FirstAngle(True=第一角/False=第三角)
Dim sheetData(2, 4) As Variant
‘ シート1: A3横、第三角法
sheetData(0, 0) = “DETAIL-A”: sheetData(0, 1) = 3: sheetData(0, 2) = 1: sheetData(0, 3) = 2: sheetData(0, 4) = False
‘ シート2: A4縦、第三角法
sheetData(1, 0) = “PARTS-LIST”: sheetData(1, 1) = 4: sheetData(1, 2) = 1: sheetData(1, 3) = 1: sheetData(1, 4) = False
‘ シート3: A3横、第一角法(海外向け等)
sheetData(2, 0) = “SCHEMATIC”: sheetData(2, 1) = 3: sheetData(2, 2) = 1: sheetData(2, 3) = 1: sheetData(2, 4) = True
Dim i As Long
Dim sheetName As String
Dim paperSize As Long
Dim scale1 As Double
Dim scale2 As Double
Dim isFirstAngle As Boolean
Dim result As Boolean
For i = LBound(sheetData, 1) To UBound(sheetData, 1)
sheetName = sheetData(i, 0)
paperSize = sheetData(i, 1)
scale1 = sheetData(i, 2)
scale2 = sheetData(i, 3)
isFirstAngle = sheetData(i, 4)
‘ 1. 新規シートの追加
‘ NewSheet5(TemplateName, PaperSize, TemplateInches, Scale1, Scale2, FirstAngle, ZoneH, ZoneV)
‘ 空文字を指定することで、デフォルトの図面テンプレート(またはドキュメント設定)を継承
result = swDraw.NewSheet5( _
sheetName, _
paperSize, _
0, _
scale1, _
scale2, _
isFirstAngle, _
“”, 0, 0, “” _
)
If result Then
‘ 2. 生成されたシートオブジェクトを取得して厳密にプロパティを再設定・確認
Set swSheet = swDraw.GetCurrentSheet()
If Not swSheet Is Nothing Then
‘ 必要に応じた追加プロパティ制御(例: ユーザー定義プロパティの同期など)
‘ swSheet.SetProperties(…) を個別に行うことも可能
End If
Else
Debug.Print “Warning: シート ‘” & sheetName & “‘ の生成に失敗しました。”
End If
‘ ループごとのメモリ解放(極めて重要)
Set swSheet = Nothing
Next i
CleanUp:
‘ 画面描画の復元
swModel.Extension.EnableAnimations = True
swApp.SetUserPreferenceToggle swUserPreferenceToggle_e.swViewDisplayHideAllTypes, False
swModel.WindowRedraw
‘ 参照の完全解放
Set swDraw = Nothing
Set swModel = Nothing
Set swApp = Nothing
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “Fatal Error”
Resume CleanUp
End Sub
—
4. チーフアーキテクトが教える「現場の罠」と回避策
罠1: テンプレートパスの迷宮
`NewSheet5` の第一引数に空文字 `””` を渡すと現在のドキュメント規定のテンプレートが使われるが、社内標準の図面枠(`.drwdot`)を強制的に切り替えたい場合は、完全パスを指定する必要がある。
ただし、ハードコーディングは環境移行時に必ず破綻する。パスは必ずレジストリやINIファイル、あるいは SolidWorks のファイルコモンロケーションから動的に取得する設計にせよ。
罠2: シート名重複によるサイレント失敗
SolidWorksにおいて、既に存在するシート名と同一の名称で `NewSheet` を実行した場合、APIは明確なエラーを返さずに処理を無視するか、予期せぬ連番(`DETAIL-A(1)` など)を勝手に付与する。
これを防ぐため、事前に `swDraw.GetSheetNames` で既存のシート名配列を取得し、重複チェックを行うバリデーションロジックを必ず前段に挟むべきである。
—
5. システム間連携への拡張(PLM/ERPとの融合)
この自動化基盤が真価を発揮するのは、単なるVBAマクロとして単体稼働するときではない。
例えば、外部のPDM/ERPシステム(Teamcenter, SmarTeam, あるいは自製Webアプリ)からJSONやCSV形式でエクスポートされた「製品構成表(BOM)」を起点とし、Windows Script Host (WSH) や .NET (VB.NET / C#) 経由で SolidWorks をヘッドレス(UI非表示)に近い形で駆動させ、一瞬にして数テンページのマルチシート図面パッケージを自動生成する。
この領域に踏み込む者にとって、今回解説した `IDrawingDoc.NewSheet` とメモリ解放の作法は、すべての自動化アーキテクチャの礎となる。妥協のないコード設計で、真のエンジニアリング・オートメーションを達成してほしい。
