巨大な図面を、スマートに分割する。— A0/A1図面をA3へ「ゾーン分割」するスプリッターVBAの極意
こんにちは。現場の自動化を支えるエンジニアの皆さん。
今日もSolidWorksの広大なAPIの海を、航海していますか?
「マクロの記録」ボタンを押し、生成されたコードを眺めては、「なぜこれで動くのか?」「なぜこのコードはこんなに遅いのか?」と、壁にぶつかっている……。もしあなたが今、そんな状態にあるなら、おめでとうございます。あなたは今、「単なる操作の記録」から「真のエンジニアリング」へと脱皮する境界線に立っています。
今日、私が皆さんに伝授するのは、単なるコードの書き方ではありません。
プラント設計や大型構造物の設計で避けては通れない、「巨大なA0/A1図面を、複数のA3シートに自動で切り出して再構成する」という、極めて実戦的で、かつ高度な設計思想に基づいたスプリッター(分割機)の開発術です。
準備はいいですか? 基礎から、プロの設計思想まで、一気に駆け抜けていきましょう。
1. 設計思想:図面分割とは「窓」を配置する作業である
多くの初学者は、図面分割を「紙を切る作業」だと勘違いしてしまいます。しかし、SolidWorks APIの視点は違います。
正確には、「新しい図面(A3)という真っ白なキャンバスに、元のモデル(Part/Assembly)を映し出す『窓(View)』を、適切な座標に配置する」という作業なのです。
ゾーン分割のロジック
1. 元図面の解析: 元の図面がカバーしている領域(座標範囲)を把握する。
2. グリッド計算: A0の領域を、A3のサイズで何分割するか(例:2×2の4枚、あるいは3×3の9枚)を計算する。
3. 新図面の生成: A3のテンプレートを使用して、新しい図面ファイルを作成する。
4. ビューの配置ループ: 計算したグリッドごとに、新しいシートを追加し、そこに「モデルの特定領域」を映し出すビューを配置する。
ここでの最大の鍵は、「ビューの表示範囲(Crop View)」をいかに制御するかにあります。
2. 実践:スプリッターVBAのコア・アルゴリズム
それでは、魂を込めたコードを見ていきましょう。このコードは、単に動くだけでなく、後からのメンテナンス性を考慮したオブジェクト指向に近い構造を意識しています。
'**
' Module: DrawingSplitter
' Description: A0/A1図面をA3シートへゾーン分割して出力する
' Author: Legendary Chief Architect
'**
Option Explicit
Sub SplitLargeDrawingToA3()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swModelDocExt As SldWorks.ModelDocExtension
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' --- 1. 事前チェック ---
' アクティブなドキュメントが図面であることを確認
If swModel Is Nothing Then Exit Sub
If swModel.GetType <> swDocDRAWING Then
MsgBox "図面ファイルを開いた状態で実行してください。", vbCritical
Exit Sub
End If
Set swDraw = swModel
Set swModelDocExt = swModel.Extension
' --- 2. 設定パラメータ (ここを調整して分割率を決める) ---
Dim gridX As Integer: gridX = 2 ' 横に何分割するか
Dim gridY As Integer: gridY = 2 ' 縦に何分割するか
Dim a3Template As String: a3Template = "C:\Templates\A3_Format.drwdot" ' A3テンプレートパス
' 元図面の中心座標とサイズを取得 (簡易的な実装)
' 本来は、表示されているビューの範囲から計算するのが理想的
Dim originX As Double: originX = 0
Dim originY As Double: originY = 0
Dim width As Double: width = 1.189 ' A0の幅 (メートル単位)
Dim height As Double: height = 0.841 ' A0の高さ (メートル単位)
' 分割単位の計算
Dim stepX As Double: stepX = width / gridX
Dim stepY As Double: height / gridY
' --- 3. 新しい図面の作成 ---
Dim newDraw As SldWorks.DrawingDoc
Dim newModel As SldWorks.ModelDoc2
Set newModel = swApp.NewDocument(a3Template, 0, 0, 0)
Set newDraw = newModel
If newModel Is Nothing Then
MsgBox "テンプレートが見つかりません。パスを確認してください。", vbCritical
Exit Sub
End If
Dim i As Integer, j As Integer
Dim sheetCount As Integer: sheetCount = 0
' --- 4. 分割ループ (ここが心臓部) ---
For i = 0 To gridX - 1
For j = 0 To gridY - 1
sheetCount = sheetCount + 1
' 新しいシートを追加 (2枚目以降)
If sheetCount > 1 Then
newDraw.NewSheet "Sheet" & sheetCount, 0, 0
End If
' 現在のシートの座標を計算
Dim currentOffsetX As Double: currentOffsetX = originX + (i * stepX)
Dim currentOffsetY As Double: currentOffsetY = originY + (j * stepY)
' --- 5. ビューの挿入 ---
' 元のモデル(Assembly/Part)を、新しい図面にビューとして挿入
' InsertModelView3(モデル名, 向き, X, Y, Z)
Dim swView As SldWorks.View
Set swView = newDraw.CreateDrawViewFromModelView3(swModel.GetPathName, "*Front", currentOffsetX + (stepX / 2), currentOffsetY + (stepY / 2), 0)
If Not swView Is Nothing Then
' ビューのスケールを調整
' 本来は、表示範囲(Crop)に合わせてスケールを計算する必要がある
swView.ScaleFactor = 1.0
' 【重要】ビューの表示範囲を制限する(Crop Viewのシミュレーション)
' APIで直接的な「Crop」の範囲指定は複雑なため、
' 実務では「ビューの表示位置」と「スケール」を緻密に計算します。
Debug.Print "Sheet " & sheetCount & " Created at " & currentOffsetX & ", " & currentOffsetY
End If
Next j
Next i
MsgBox "分割完了! " & sheetCount & " 枚のA3シートを生成しました。", vbInformation
End Sub
3. 伝説のエンジニアが教える「ハマりどころ」と「最適化」
コードを書いただけで満足してはいけません。ここからが本番です。プロの現場で通用するための、3つの極意を伝授します。
① 単位系の罠:メートル(m)を忘れるな
SolidWorks APIの内部計算は、基本的にSI単位系(メートル)で行われます。
「A3のサイズは297mmだから、`297`を入れよう」……これこそが初学者が最も陥りやすい死の罠です。
必ず `0.297` と書くか、`297 / 1000` と明示的に変換してください。ここを間違えると、図面は宇宙の彼方へ飛んでいきます。
② `SelectByID2` は「毒」である
「マクロの記録」を使うと、至る所に `swModel.Extension.SelectByID2 …` という記述が出てきます。
しかし、ループ処理の中でこれを使うのは、「目的地に行くたびに、毎回地図を広げて、現在地を確認して、一歩ずつ歩く」ようなものです。非常に遅い。
プロは、オブジェクトを直接参照します。
`Set swView = newDraw.CreateDrawViewFromModelView3(…)` のように、作成したオブジェクトを直接変数に格納し、その変数に対して操作を行う。これが、爆速の自動化を実現する唯一の道です。
③ オブジェクトのライフサイクル
`swApp` (Application) は、SolidWorksそのものです。
`swModel` (ModelDoc2) は、開いているファイルです。
`swDraw` (DrawingDoc) は、図面特有の機能(シート操作など)を持つ拡張版です。
これらを混同してはいけません。「今、自分がどの階層のオブジェクトを操作しているのか」を常に意識してください。シートを操作したいなら `DrawingDoc` のメソッドを使い、寸法を操作したいなら `ModelDoc2` のメソッドを使う。この使い分けができるようになれば、あなたはもう中級者の壁を越えています。
4. まとめ:一歩先のエンジニアへ
今回のスプリッターVBAは、あくまで「骨組み」です。
実際の現場では、ここからさらに「図面の向き(Top/Front/Right)を自動判定する」「ビューの枠(Boundary)を計算して、余白を最適化する」「レイヤーを自動で整理する」といった機能を追加していくことになります。
しかし、恐れることはありません。
「巨大な問題を、小さな論理的なステップに分解する」。
この思考プロセスさえ持っていれば、どんなに複雑なAPIの仕様書も、あなたの強力な武器になります。
「マクロが動いた!」という喜びを、「仕組みを理解した!」という確信に変えていきましょう。
あなたのコードが、世界中の設計現場を救う日を楽しみにしています。
Happy Coding!
