混沌とした図面を、一瞬で「設計者の意志」が宿るレイアウトへ。
〜等角投影図(Iso View)の一括統制術〜
こんにちは。図面作成の自動化という、果てなき、しかし最高にエキサイティングな旅へようこそ。
「マクロの記録」を使って、ようやく一つのビューを動かすことに成功した。そんな喜びを感じているあなた。素晴らしい一歩です。しかし、実際の設計現場では、そんな「一回限りの操作」では太刀打ちできない壁が立ちはだかります。
アセンブリ図面を作成したとき、バラバラの縮尺で、あちこちに配置された等角投影図(アイソメ図)。それらを一つずつマウスでドラッグし、プロパティを開いて縮尺を打ち直す……。そんな作業に、あなたの貴重なエンジニアとしての時間は使えません。
今日は、「図面内の特定のビューをプログラムで探し出し、その性質(縮尺や位置)を強制的に統制する」という、中級者への登竜門となる技術を伝授しましょう。ここをクリアすれば、あなたは「操作を記録する人」から「システムを構築する人」へと進化できます。
1. 「マクロの記録」の限界と、APIの真髄
まず、大切なマインドセットの話をさせてください。
「マクロの記録」は、いわば「録画ビデオ」です。あなたがクリックした座標、選んだボタンの動作をそのまま記録します。しかし、ビデオは「次に何が起きるか」を予測して動くことはできません。
もし、図面の中に新しいアイソメ図が追加されたら? あるいは、既存のビューのサイズが変わってしまったら? 録画されたマクロは、無力です。
プロフェッショナルなVBAエンジニアは、ビデオではなく「地図(オブジェクトモデル)」を使います。
SolidWorksのAPIは、図面を以下のような階層構造(オブジェクトのツリー)として捉えています。
1. SldWorks (Application) :SolidWorksそのもの
2. DrawingDoc (Document) :開いている図面ファイル
3. Sheet (Sheet) :図面の中の「シート」
4. View (View) :シートの上に配置された「ビュー」
私たちがやるべきことは、「図面の中を探索し、『等角投影図』という属性を持つViewオブジェクトを見つけ出し、そのプロパティを書き換える」という、論理的なプロセスなのです。
2. 実践:等角投影図を狙い撃ちするコード
では、魂を込めて書いたコードを見てみましょう。このコードは、現在開いている図面のすべてのシートを巡回し、等角投影図を見つけたら、指定した縮尺と位置に整列させます。
Option Explicit
' ======================================================================================
' テーマ: 図面内の全ての等角投影図(Isometric View)を、指定の縮尺と位置に一括制御する
' ターゲット: 中級者向け(オブジェクトの走査と型判定の習得)
' ======================================================================================
Sub Main()
' --- 1. 変数宣言(型を明示することは、プロの作法です) ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swSheet As SldWorks.Sheet
Dim swView As SldWorks.View
' 制御用の変数
Dim vSheetNames As Variant
Dim i As Integer
Dim targetScale As Double
Dim targetPosX As Double
Dim targetPosY As Double
' --- 2. 設定値(ここを書き換えるだけで、レイアウトが変わります) ---
targetScale = 0.5 ' 縮尺を 1:2 に設定
targetPosX = 0.1 ' 配置X座標 (単位はメートル! 100mm = 0.1m)
targetPosY = 0.1 ' 配置Y座標 (単位はメートル! 100mm = 0.1m)
' --- 3. 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
' --- 4. 全シートの巡回プロセス ---
' 全てのシート名を取得
vSheetNames = swDraw.GetSheetNames
For i = 0 To UBound(vSheetNames)
' シートをアクティブにする
swDraw.ActivateSheet vSheetNames(i)
Set swSheet = swDraw.GetCurrentSheet
' --- 5. ビューの走査プロセス ---
' GetFirstViewは「シートそのもの」を返すというAPIのクセに注意!
Set swView = swDraw.GetFirstView
' シートそのもの(最初のView)をスキップして、実際のビューへ
Set swView = swView.GetNextView
Do While Not swView Is Nothing
' 【ここが核心】ビューのタイプを確認する
' swIsometric は等角投影図を指す定数です
If swView.Type = swViewIsometric Then
' --- 6. プロパティの書き換え(ここが自動化の心臓部) ---
' 縮尺の設定
swView.Scale = targetScale
' 配置位置の設定(座標系はシートの原点からの距離)
' Positionは (X, Y) の配列のような扱いではなく、
' 内部的には座標としてセットします。
swView.Position = Array(targetPosX, targetPosY)
' ログ出力(デバッグ用)
Debug.Print "シート [" & vSheetNames(i) & "] 内のアイソメ図を制御しました。"
End If
' 次のビューへ移動
Set swView = swView.GetNextView
Loop
Next i
' --- 7. 仕上げ ---
' 変更を画面に反映させる(これを行わないと、見た目が更新されないことがあります)
swModel.ForceRebuild3 True
MsgBox "全ての等角投影図のレイアウト制御が完了しました!", vbInformation
End Sub
3. 伝説のアーキテクトが教える「陥りやすい罠」
このコードを動かすとき、あるいは自分でカスタマイズするとき、初心者が必ずと言っていいほど踏んでしまう「地雷」が3つあります。これを知っているかどうかで、あなたのデバッグ時間は劇的に変わります。
① 単位の罠:SolidWorksは「メートル」で生きている
これが最大の落とし穴です。
あなたが「100mmの位置に置きたい」と思って `swView.Position = 100` と書くと、SolidWorksは「100メートル」の位置にビューを飛ばしてしまいます。図面の遥か彼方へ消えたビューを探して、画面を何度もズームしてはいけません。
「APIの世界では、常にメートル(m)を使う」。これを呪文のように唱えてください。
② `GetFirstView` の正体:シートは「最初のビュー」である
SolidWorksのAPIの設計は少し独特です。`swDraw.GetFirstView` を呼び出したとき、返ってくるのは「図面上の最初のビュー」ではなく、実は「シートそのもの」なのです。
そのため、実際のビューを操作するには、必ず一度 `.GetNextView` を呼び出して、シートという「殻」を脱ぎ捨てる必要があります。これを忘れると、ループが空振りしたり、意図しないエラーを招いたりします。
③ パフォーマンスの罠:`ForceRebuild` のタイミング
ループの中で、ビューを動かすたびに `swModel.ForceRebuild3`(再構築)を呼び出さないでください。
再構築は非常に重い処理です。100個のビューがあるときに毎回再構築すると、マクロが終わる頃にはコーヒーが冷めてしまいます。「すべての操作が終わった最後に、一度だけ再構築する」。これが、爆速マクロを作る鉄則です。
4. 次のステップへ
おめでとうございます。あなたは今、「特定の条件(等角投影図)に合致するオブジェクトを、階層を辿って探し出し、一括で制御する」という、高度なプログラミング技術を手に入れました。
このコードをベースに、以下のような改造に挑戦してみてください。
- 「特定の名前のビューだけを動かす」(`swView.Name` を判定に使う)
- 「アイソメ図の向き(表示角度)も一括で変える」
- 「縮尺を、ビューのサイズに合わせて自動計算する」
一歩ずつ、しかし確実に。
APIという強力な武器を使いこなせば、あなたの設計業務は「作業」から「創造」へと変わるはずです。
また次の講義でお会いしましょう。Happy Coding!
