【入門編】【中級者向け】図面ビューの位置座標(X/Y)を数値指定して整然とレイアウトするVBAマクロ – SolidWorks VBA解析バイブル

スポンサーリンク

こんにちは!SolidWorks自動化の世界へようこそ。
チーフアーキテクトの私です。

マクロの記録ボタンを押して生成されたコードを眺めて、「よし、動いた!」と喜んでいた時期はもう卒業しましょう。実務の現場では、モデルの形状が変わったり、ビューのサイズが変わったりするたびに、ビューがグチャグチャに重なり合ったり、枠からはみ出したりして頭を抱えるシーンが絶えません。

「ビューを綺麗に整列させたいだけなのに、なぜ手動でマウスを動かしているのか?」

そう思ったあなたは大正解です。今回は、SolidWorks VBAの図面自動化において最も重要かつ避けて通れない「図面ビューの座標(X/Y)による位置制御の極意」を授けます。ここをクリアすれば、あなたの図面作成スピードは爆発的に跳ね上がりますよ。

—

1. なぜ「マクロの記録」だけでは図面レイアウトが破綻するのか?

まず、SolidWorksの図面ビュー(`View`オブジェクト)が持つ世界観を理解しなくてはなりません。

マクロの記録を使うと、大体次のようなコードが出力されます。

‘ マクロの記録が吐き出す典型例(絶対に使ってはいけないアンチパターン)
boolstatus = swDrawing.Extension.SelectByID2(“図面ビュー1”, “DRAWINGVIEW”, 0.1, 0.2, 0, False, 0, Nothing, 0)
‘ 何やらマウス座標っぽいものを操作しているコード…

これの何が問題か分かりますか?
マクロの記録は「ユーザーが画面上のどこをクリックしたか」を記憶しているに過ぎません。そのため、図面のサイズが変わったり、ビューの縮尺(スケール)が変わったりした瞬間に、全く意図しない場所へビューが吹っ飛んでいくのです。

プロが操る真のレイアウト制御:`View.Position` プロパティ

私たちが目指すべきは、画面上のクリック位置依存から脱却し、「図面シートの原点(左下、または用紙中心など)から何メートル離れた位置に配置するか」を数学的に計算し、`View.Position` プロパティに直接代入するアプローチです。

SolidWorksのAPIにおいて、座標はすべて「メートル(m)」で扱われます。ここが最初の罠です。図面枠でよく使う「ミリメートル」で考えてしまうと、ビューが画面の遥か彼方に小さく表示されてしまい、「マクロがバグった!」とパニックになる原因になります。

—

2. 【実践】図面ビューをグリッド状に美しく自動整列させるVBAコード

それでは、実務でそのまま使える実践コードを公開します。
このコードは、アクティブな図面シート上にあるすべての図面ビュー(親ビューである等角図などは除外する配慮を入れつつ)をスキャンし、指定した起点から一定の間隔で綺麗に並べ替える魔法のマクロです。

Option Explicit

Sub Main()
Dim swApp As SldWorks.SldWorks
Dim swModel As SldWorks.ModelDoc2
Dim swDraw As SldWorks.DrawingDoc
Dim swView As SldWorks.View

‘ アプリケーションとドキュメントの取得
Set swApp = Application.SldWorks
Set swModel = swApp.ActiveDoc

‘ アクティブドキュメントが図面(Drawing)かチェック
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

‘ 最初の子ビュー(または最初のビュー)を取得
Set swView = swDraw.GetFirstView

‘ —————————————————-
‘ レイアウトパラメータの設定(単位:メートル)
‘ —————————————————-
Dim startX As Double, startY As Double
Dim spacingX As Double, spacingY As Double
Dim currentX As Double, currentY As Double
Dim viewCount As Integer

startX = 0.1 3 ‘ 配置開始位置 X (左端から 100mm)
startY = 0.2 ‘ 配置開始位置 Y (下端から 200mm)
spacingX = 0.15 ‘ 列間のピッチ (150mm)
spacingY = 0.15 ‘ 行間のピッチ (150mm)

currentX = startX
currentY = startY
viewCount = 0

‘ シート自体のバックグラウンドビュー(”\\Sheet”など)をスキップするためループを回す
Set swView = swView.GetNextView

Do While Not swView Is Nothing
‘ シート名を保持しているルートビュー等はスキップ
If swView.GetName2() <> “” Then

‘ 【超重要】View.Position は 2要素の Double型配列(X座標, Y座標)で渡す
Dim pos(1) As Double
pos(0) = currentX
pos(1) = currentY

‘ 座標を代入してビューを移動
swView.Position = pos

‘ 次の配置位置を計算(簡易的な2列グリッド配置の例)
viewCount = viewCount + 1
currentX = currentX + spacingX

‘ 2列を超えたら次の行へ折り返す
If viewCount Mod 2 = 0 Then
currentX = startX
currentY = currentY – spacingY ‘ 下方向へ改行
End If

End If

‘ 次のビューへ
Set swView = swView.GetNextView
Loop

‘ 画面を強制再描画してレイアウトを確定
swModel.WindowRedraw

MsgBox “図面ビューの整列が完了しました!”, vbInformation, “自動レイアウト”
End Sub

—

3. コードのキモ:ここだけは押さえろ!3つの技術的ポイント

初心者から一歩抜け出すために、上記のコードに込めた「エンジニアのこだわり」を解説しておきます。

① 単位は「メートル(m)」であるという絶対の掟

コード内で `startX = 0.1` と指定しています。これはミリメートル換算で 100mm を意味します。
「あれ? 画面いっぱいに広がるはずが、点にしか見えないぞ?」と思ったときは、大体この単位換算(mとmmの混同)が原因です。常に脳内をメートルに変換してコーディングする癖をつけましょう。

② `View.Position` は配列でデータを渡す

SolidWorks APIの仕様として、ビューの位置座標は `X` と `Y` がセットになった 2要素の配列(Double型) で受け渡しをします。

Dim pos(1) As Double
pos(0) = currentX ‘ X座標
pos(1) = currentY ‘ Y座標
swView.Position = pos

この作法を知らないと、「型が一致しません」というVBAお馴染みのエラーに悩まされることになります。

③ ループの最初にある「シート背景ビュー」のトラップ

`swDraw.GetFirstView` で取得できる最初のビューは、実は図面の図形ではなく、図面枠(フォーマット)やシートそのものを管理する親玉のようなビュー(ルートビュー)です。これを誤って動かそうとすると、図面全体が崩壊するかエラーになります。
そのため、コード内では `GetNextView` を使って実際の図面ビュー(モデルビュー)から処理を始めるようにガードをかけています。この配慮ができるかどうかが、プロとアマの分かれ道です。

—

4. 陥りやすいエラーとトラブルシューティング

  • エラー: 「オブジェクト変数または With ブロック変数が設定されていません。」
  • 原因: 開いているドキュメントがアセンブリやパーツのままで、図面(Drawing)を開いていない状態でマクロを実行したときに発生します。
  • 対策: コード内の `swModel.GetType() <> swDocDRAWING` による型チェックが正しく機能しているか確認してください。
  • 現象: ビューが重なって配置されてしまう
  • 原因: 登録されている図面ビューのスケール(縮尺)がバラバラで、ビュー自体のバウンディングボックス(外形サイズ)が大きい場合に起因します。
  • 対策: `spacingX` や `spacingY` の値を、対象となるモデルの大きさに合わせて適切に広げるか、あらかじめビューのスケールを統一する処理をマクロの最初に入räておくと完璧です。

—

最後に:ここをクリアすれば、SolidWorks VBAの基本はバッチリですよ

お疲れ様でした!
今回学んだ「オブジェクトの特性を理解し、座標を数学的にコントロールする手法」は、図面自動化だけでなく、3Dモデルの配置やアセンブリの合致制御など、あらゆる自動化の基盤となる考え方です。

「マウス操作の奴隷」から解放され、コードで空間を支配する快感――。
ぜひご自身の開発環境でこのコードを動かし、その手で体感してみてください。あなたの設計業務が劇的にスマートになることを、私は確信しています。

それでは、次回の高度な自動化の世界でお会いしましょう。ハッピー・コーディング!

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