【入門編】Shape.GetBoundingBoxを用いた高精度な描画エリア算出:回転された図形でも正確な外接矩形を特定するアルゴリズム – Visio VBA解析バイブル

スポンサーリンク

Visio VBAの深淵へ:回転図形も恐れない「高精度バウンディングボックス」算出術

こんにちは。現場でVisioを酷使し、数多の自動化ツールを構築してきたエンジニアです。

「マクロの記録」で生成されたコードが、いざ複雑な図面で動かなくなって絶望したことはありませんか?特に「回転させた図形の座標計算」で座標がズレ、レイアウトが崩壊する……これはVisio VBAを触る誰もが通る試練です。

今日は、Visioのオブジェクトモデルを掌握し、回転やグループ化といった「複雑な現実」を正確に計算するための『GetBoundingBox』の本質を伝授します。

1. なぜ「Shape.BoundingBox」では足りないのか?

多くの入門書では、単純な `Shape.BoundingBox` プロパティが紹介されます。しかし、このプロパティは「図形を包む最小の矩形」を返しますが、図形が回転している場合、その回転後の見た目ではなく「元の矩形領域」を基準に計算されることが多く、精度に欠けるのです。

特に、グループ化された図形や、複雑な幾何学を持つシェイプにおいて、この「誤差」は致命的です。

そこで登場するのが、より詳細なフラグ制御が可能な `Shape.GetBoundingBox` メソッド です。

2. GetBoundingBoxを操る「VisBBoxFlags」の魔法

`GetBoundingBox` は、単なる座標取得ではありません。どの範囲を計算対象にするかを、ビットフラグで細かく指定できる強力なメソッドです。

頻出のフラグ設定

  • `visBBoxDrawing` (1): ストローク(線幅)や影を含めた、実際に描画されている領域。
  • `visBBoxText` (2): 図形内のテキスト領域を含める。
  • `visBBoxUpright` (0): ここが重要! 回転を無視して、その図形を包む「正対した矩形」を取得します。

これらを組み合わせることで、私たちは「回転後、画面上で実際に占有している矩形」を正確に射抜くことができます。

3. 実践:回転図形の座標を正確に取得するコード

それでは、実際に現場で使えるコードを見てみましょう。このコードは、選択したシェイプの「見た目上の」左下と右上の座標を、単位(インチ・センチ)を考慮して取得します。

Public Sub GetPreciseBoundingBox()
Dim shp As Visio.Shape
Dim left As Double, bottom As Double, right As Double, top As Double

‘ 現在選択しているシェイプを取得
If ActiveWindow.Selection.Count = 0 Then Exit Sub
Set shp = ActiveWindow.Selection(1)

‘ GetBoundingBoxを使用して詳細な範囲を取得
‘ フラグに visBBoxDrawing を指定し、見た目の外接矩形を算出
‘ ※回転していても、このフラグなら「現在の表示領域」を計算可能
shp.GetBoundingBox visBBoxDrawing, left, bottom, right, top

‘ 結果をイミディエイトウィンドウに出力(単位はドキュメントの規定値)
Debug.Print “— 算出結果 —”
Debug.Print “左下座標: (” & left & “, ” & bottom & “)”
Debug.Print “右上座標: (” & right & “, ” & top & “)”
Debug.Print “幅: ” & (right – left) & ” / 高さ: ” & (top – bottom)
End Sub

このコードのポイント

1. `visBBoxDrawing`: これを指定することで、図形の「線幅」や「影」の厚みまで考慮した、実用的なバウンディングボックスが算出されます。
2. 型変換不要: Visioの内部単位(インチ)でそのまま取得されるため、単位変換のミスが起きません。

4. 陥りやすい「落とし穴」と対策

穴1:グループ化された図形はどうなる?

グループ図形に対してこのメソッドを使うと、「グループ全体を包む矩形」が返ってきます。もし、グループ内の「特定の子要素」の座標を知りたい場合は、`shp.Shapes(i)` といった再帰的な走査が必要です。

穴2:座標系が「ページ」か「親」か

`GetBoundingBox` で取得される座標は、基本的に「ページ基準(PinX/PinYのような)」です。もし図形がグループ化されている場合、その座標は親シェイプ内での相対値ではなく、ページ全体における絶対座標として返される点に注意してください。

5. 最後に:エンジニアとしての一歩先へ

Visioの座標計算をマスターするということは、「Visioが裏でどのように図形をレンダリングしているか」を理解することに他なりません。

今回紹介した `GetBoundingBox` を使いこなせるようになれば、動的なレイアウト調整や、自動整列ツールの作成など、手作業では到底不可能なレベルの効率化が可能になります。

「マクロの記録」から卒業し、Visioという巨大なオブジェクトの海を、コードで自在に操る。その第一歩として、このコードをぜひご自身の環境で試してみてください。

不明点や、もっと深い階層(ShapeSheetの制御など)の話が聞きたくなったら、いつでも聞いてください。あなたの自動化の旅を、全力でサポートします!

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