「マクロの記録」を卒業しよう。複数コンフィギュレーションをマルチシート図面に自動展開する、真の自動化設計。
こんにちは。設計自動化の世界へようこそ。
「マクロの記録」ボタンを押して、自分の操作をコードに変換する。そこから一歩踏み出し、「自分でロジックを組み立てて、複雑な業務を丸ごと自動化したい」……そう思った瞬間、あなたはエンジニアとして大きな転換期を迎えています。
今日お話しするのは、単なるコードの書き方ではありません。SolidWorksの「オブジェクトの繋がり」を理解し、複数のコンフィギュレーション(設定)を持つ部品を、まるで魔法のように複数の図面シートへ自動展開する、実戦的なテクニックです。
「Standard」「Short」「Long」……。部品の設定が変わるたびに、手作業でシートを増やし、ビューを配置し、設定を切り替える。そんな作業は、今日で終わりにしましょう。
1. 核心:図面とモデルの関係性を「掌握」する
まず、コードを書く前に、SolidWorksの内部構造を頭の中に描いてください。ここを間違えると、どんなに優れたコードも動かない「迷宮」に入り込んでしまいます。
多くの初学者が陥る罠があります。それは、「図面(Drawing)を操作しているのか、モデル(Part)を操作しているのか」の境界線が曖昧になることです。
図面ファイルは、いわば「窓」です。窓の向こう側にある「モデル」を、特定の角度から、特定のコンフィギュレーション(設定)で覗き込んでいる状態です。
- Part(モデル): コンフィギュレーションの集合体。
- Drawing(図面): モデルを「参照」する入れ物。
- View(図面ビュー): モデルの特定の「設定」を、特定の「向き」で表示するフィルター。
今回のゴールは、「モデル内の全コンフィギュレーションをスキャンし、図面側に新しいシートを作り、そのシートのビューに対して『君は、このコンフィギュレーションを表示しなさい』と命令を送る」ことです。
2. 実装:マルチシート自動展開マクロ
それでは、魂を込めて書いたコードを見ていきましょう。このコードは、現在開いている図面が参照しているモデルを自動検知し、そのすべての設定を別々のシートに展開します。
' **
' Title: Multi-Configuration Drawing Generator
' Description: 参照モデルの全コンフィギュレーションを、個別のシートに自動展開します。
' Author: Legendary Chief Architect
' **
Option Explicit
Sub main()
' --- オブジェクトの宣言 ---
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swRefModel As SldWorks.ModelDoc2
Dim swPart As SldWorks.PartDoc
Dim configNames As Variant
Dim i As Integer
Dim currentConfig As String
Dim swSheet As SldWorks.Sheet
Dim swView As SldWorks.View
Dim vPos As Variant
' --- 初期化 ---
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc
' 1. 図面が開かれているかチェック
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
' 2. 図面が参照しているモデル(パーツ)を取得
' ここが重要!図面自身ではなく、その「中身」を操作対象にします。
Set swRefModel = swDraw.GetReferencedModelView.ReferencedModel
If swRefModel Is Nothing Then
MsgBox "図面が参照しているモデルが見つかりません。", vbCritical
Exit Sub
End If
' 3. モデルのコンフィギュレーション一覧を取得
configNames = swRefModel.GetConfigurationNames
' 画面更新を止めてパフォーマンスを向上させる(エンジニアの嗜み)
swApp.ScreenUpdating = False
' --- メインループ:各コンフィギュレーションを処理 ---
For i = LBound(configNames) To UBound(configNames)
currentConfig = configNames(i)
' A. 新しいシートを追加
' 引数: シート名, テンプレートパス(空なら現在の設定), 投影法, 幅, 高さ
' ここではシンプルに、既存のシート形式を引き継ぐ形で追加します。
swDraw.NewSheet currentConfig, "", swIsometric, 0, 0
' B. ビューを配置する座標を設定 (中心付近)
' 0,0 はシートの原点付近です。
vPos = Array(0.1, 0.1)
' C. ビューを作成
' 引数: モデル, 表示するビュー名(Front等), X座標, Y座標, Z座標
' ここで「どのモデルの」「どのビュー」を使うかを指定します。
Set swView = swDraw.CreateDrawViewFromModelView3(swRefModel.GetPathName, "*Front", vPos(0), vPos(1), 0)
If Not swView Is Nothing Then
' D. 【最重要】ビューが参照するコンフィギュレーションを書き換える
' これを忘れると、すべてのシートが「アクティブな設定」を表示してしまいます。
swView.ReferencedConfiguration = currentConfig
' ビューのスケールを調整したい場合はここで行う
' swView.ScaleRatio = Array(1, 1)
End If
Next i
' 画面更新を再開
swApp.ScreenUpdating = True
MsgBox "完了しました! " & UBound(configNames) + 1 & " 個のシートを展開しました。", vbInformation
End Sub
3. プロの視点:なぜこのコードが「動く」のか
マクロの記録で作ったコードと、このコードの決定的な違いを解説します。ここを理解すれば、あなたはもう「記録」に頼る必要はありません。
① `GetReferencedModel` の魔法
マクロの記録では、自分自身(図面)を操作することしか想定していません。しかし、我々は「図面の中にあるモデル」を操作したい。`swDraw.GetReferencedModelView.ReferencedModel` を使うことで、図面からモデルへと「アクセス権」を渡しているのです。
② ライフサイクルの管理:`ReferencedConfiguration`
ここが最大の急所です。
`CreateDrawViewFromModelView3` メソッドを実行した直後のビューは、モデルの「現在アクティブな設定」を表示しています。
もし、ループの中で設定を切り替えていないなら、すべてのシートが同じ見た目になってしまいます。
「ビューを作った後に、そのビューに対して `ReferencedConfiguration` を個別に指定する」。このステップこそが、マルチシート展開の心臓部です。
③ パフォーマンスへの配慮:`ScreenUpdating`
大量のシートを生成する際、SolidWorksが毎回画面を書き換えると、処理時間は数倍に膨れ上がります。`swApp.ScreenUpdating = False` は、エンジニアが現場で必ず使う「おまじない」ではなく、「リソース管理」という名のプロの技術です。
4. 陥りやすいエラーと対策(トラブルシューティング)
実戦では、必ず予期せぬ事態が起こります。以下のポイントをチェックしてください。
- 「ビューが真っ白になる!」
- 原因:コンフィギュレーション名が正しく渡っていないか、モデルが完全にロードされていない可能性があります。
- 対策:`swView.ReferencedConfiguration` に代入する文字列が、`swRefModel.GetConfigurationNames` から取得したものと完全に一致しているか確認してください。
- 「シートが重なってしまう!」
- 原因:`vPos`(座標)がすべて同じです。
- 対策:ループ変数 `i` を使って、配置する座標を少しずつずらすロジックを追加しましょう。
- 「マクロが途中で止まる」
- 原因:参照しているモデルが「読み取り専用」であったり、ファイルパスが壊れている場合に発生します。
- 対策:`If swRefModel Is Nothing Then` のようなエラーハンドリングを徹底しましょう。
結びに代えて
いかがでしたでしょうか。
「マクロの記録」は、素晴らしい第一歩です。しかし、その先にある「オブジェクトの構造を理解し、ロジックで制御する」世界は、あなたの設計業務を劇的に、そしてエレガントに変えてくれます。
今回紹介したコードは、あくまで基礎です。ここから「シートのサイズをコンフィギュレーションごとに変える」「特定のビューだけ配置する」といったカスタマイズを加えていってください。
コードを書き、エラーに悩み、それを解決したとき、あなたのエンジニアとしての筋肉は確実に鍛えられています。
さあ、次はあなたが、世界を自動化する番です。
