次の方法で共有


Shape.BoundingBox メソッド (Visio)

指定した図形とその下位図形を隙間なく囲む四角形を返します。

構文

expression. BoundingBox( _Flags_ , _lpr8Left_ , _lpr8Bottom_ , _lpr8Right_ , _lpr8Top_ )

: Shape オブジェクトを表す変数。

パラメーター

名前 必須 / オプション データ型 説明
Flags 必須 Integer 最終的な境界ボックスを取得するために、図形ごとに取得される境界ボックスの状態を制御するフラグです。
lpr8Left 必須 倍精度浮動小数点型 (Double) 境界ボックスの左辺の x 座標を返します。
lpr8Bottom 必須 倍精度浮動小数点型 (Double) 境界ボックスの下端の y 座標を返します。
lpr8Right 必須 倍精度浮動小数点型 (Double) 境界ボックスの右辺の x 座標を返します。
lpr8Top 必須 倍精度浮動小数点型 (Double) 境界ボックスの上端の y 座標を返します。

戻り値

なし

解説

Shape オブジェクトの場合、BoundingBox メソッドによって、指定した図形とその下位図形を隙間なく囲む四角形が返されます。

Page オブジェクト、Master オブジェクト、または Selection オブジェクトの場合は、BoundingBox メソッドによって、指定したページ、マスター シェイプ、または選択範囲内の複数の図形とその下位図形を隙間なく囲む四角形が返されます。

BoundingBox メソッドがエラーを返す場合、または 0 個の図形を囲む四角形を返すように求められた場合、返される四角形は {left: 0、bottom: 0、right: -1、top: -1 } です。それ以外の場合、返される四角形の左が (<=) 右以下で、下が (<=) top 以下になります。 返される数値は、内部単位 (インチ) 単位です。

このメソッドによって返される各図形の境界を表す四角形は、その図形の Type プロパティによって異なります。

定数 説明
visTypePage Page.BoundingBox または Master.BoundingBox と同じです。
visTypeGroup グループとその下位図形を隙間なく囲む四角形です。
visTypeShape 四角形はフラグの値によって異なります。 次の表を参照してください。
visTypeForeignObject 四角形はフラグの値によって異なります。 次の表を参照してください。
visTypeGuide 四角形はフラグの値によって異なります。 次の表を参照してください。

オブジェクト タイプが visTypeDoc の場合はメソッドにより例外が発生します。

引数 Flags には、図形ごとに取得する境界ボックスを制御するビットが含まれます。 次の表に示すビットを複数設定すると、図形に適用される四角形は、ビットで指定した条件をすべて満たす四角形になります。

Flag 説明
visBBoxUprightWH &H1 図形の幅と高さのボックスを囲む図形の親のローカル座標系に平行な最小の四角形を返します。図形が回転しない場合、直立した幅と高さのボックスと幅と高さのボックスは同じです。 図形のジオメトリ内のパスは不要であり、多くの場合、図形の幅と高さのボックス内に完全に配置されているわけではありません。
visBBoxUprightText &H2 目的の図形のテキストを囲む親図形のローカル座標系に対して平行な、最小の四角形が返されます。
visBBoxExtents &H4 図形のジオメトリによってストロークされたパスを囲む図形の親のローカル座標系に平行な最小の四角形である四角形を返します。これは、図形の直立した幅と高さのボックスよりも大きいか小さい場合があります。 visTypeForeignObject 型の図形に対して決定されたエクステント ボックスは、その図形の直立した幅と高さのボックスと等しくなります。
visBBoxIncludeHidden &H10 非表示の座標が含まれます。
visBBoxIgnoreVisible &H20 表示されている座標は無視されます。
visBBoxIncludeDataGraphics &H10000 図形に適用された、データ グラフィックの引き出し図形 (およびそのサブ図形) が含まれます。 既定ではオフです。
visBBoxIncludeGuides &H1000 visTypeguide 型の図形のエクステントが含まれます。 既定では、 visTypeGuide 型の図形の範囲は無視されます。ガイド範囲を要求する場合は、垂直ガイドの x 位置と水平ガイドの y 位置のみが、返される四角形に影響します。 垂直ガイドが報告された場合は、無限 の y エクステントが返されます。 水平ガイドが報告された場合は、無限 x エクステントが返されます。 回転したガイドが報告された場合は、無限 の x および y エクステントが返されます。
visBBoxDrawingCoords &H2000 対象となる図形を含むページまたはマスター シェイプの図面座標系で表された数値が返されます。 既定では、対象となる図形の親のローカル座標系における図面単位で戻り値が表されます。
visBBoxNoNonPrint &H4000 印刷されない図形の範囲を無視します。 図形の [NonPrinting] セルの値が 0 以外の場合、または印刷されないレイヤーにのみ図形が属している場合は、その図形は印刷されません。

範囲の四角形は、図形のストロークの中心に基づいて決定され、ストロークの幅は考慮されません。 またその四角形には、影や線の端点マーカーによって表される領域も含まれません。 Microsoft Office Visio には、図形の "黒い点" のボックス、つまりストロークの幅、影、線の端点などを考慮して調整された範囲ボックスを作成する機能がありません。

図形には、図形によって報告される境界の四角形の外側にあるコントロール ポイントまたは接続ポイントを含めることができます。 図形のセルの結果を照会することで、コントロール ポイントと接続ポイントの位置を決定できます。

次のプロシージャは、選択した図形の境界ボックスの寸法をイミディエイト ウィンドウに出力します。 アクティブなウィンドウで複数の図形が選択された場合は、エラーを示すメッセージ ボックスが表示されます。 いずれの場合も、結果は図形が属するページまたはマスター シェイプの図面単位で返されます。 つまり、図形がグループに属する場合は、visBBoxDrawingCoords がフラグとして BoundingBox メソッドに渡されます。

図形がガイドである場合は、プロシージャから visBBoxIncludeGuides メソッドに BoundingBox が渡され、図形に範囲があると解釈されます。 図形に対して次の 3 つの長方形が返されます。

  • visBBoxUprightWH : 図形の幅と高さのボックスを囲む直立したボックス

  • visBBoxUprightText : 図形のテキスト ボックスを囲む直立ボックス

  • visBBoxExtents : 図形のパスを囲む直立ボックス

このマクロを実行するには、Visio 図面ページで必ず 1 つの図形を選択するようにします。

 
Public Sub BoundingBox_Example() 
 
 Dim vsoSelection As Visio.Selection 
 Set vsoSelection = ActiveWindow.Selection 
 vsoSelection.IterationMode = visSelModeSkipSub 
 
 If vsoSelection.Count <> 1 Then 
 MsgBox "BoundingBox_Example() expects exactly one selected shape." 
 
 Else 
 
 Dim vsoShape As Visio.Shape 
 Set vsoShape = vsoSelection(1) 
 Dim intFlags As Integer 
 intFlags = 0 
 
 If vsoShape.ContainingShape.Type = visTypeGroup Then 
 
 intFlags = visBBoxDrawingCoords 
 
 End If 
 
 If vsoShape.Type = visTypeGuide Then 
 
 intFlags = intFlags + visBBoxIncludeGuides 
 
 End If 
 
 Dim dblTop As Double 
 Dim dblBottom As Double 
 Dim dblLeft As Double 
 Dim dblRight As Double 
 
 vsoShape.BoundingBox intFlags + visBBoxUprightWH, dblLeft, dblBottom, dblRight, dblTop 
 Debug.Print "Upright WH "; _ 
 "dblLeft:" & Application.FormatResult(dblLeft, "in", "", "#0.00 u"); _ 
 "dblBottom:" & Application.FormatResult(dblBottom, "in", "", "#0.00 u"); _ 
 "dblRight:" & Application.FormatResult(dblRight, "in", "", "#0.00 u"); _ 
 "dblTop:" & Application.FormatResult(dblTop, "in", "", "#0.00 u") 
 
 vsoShape.BoundingBox intFlags + visBBoxUprightText, dblLeft, dblBottom, dblRight, dblTop 
 Debug.Print "Upright text "; _ 
 "dblLeft:" & Application.FormatResult(dblLeft, "in", "", "#0.00 u"); _ 
 "dblBottom:" & Application.FormatResult(dblBottom, "in", "", "#0.00 u"); _ 
 "dblRight:" & Application.FormatResult(dblRight, "in", "", "#0.00 u"); _ 
 "dblTop:" & Application.FormatResult(dblTop, "in", "", "#0.00 u") 
 
 vsoShape.BoundingBox intFlags + visBBoxExtents, dblLeft, dblBottom, dblRight, dblTop 
 Debug.Print "Bounding Box "; _ 
 "dblLeft:" & Application.FormatResult(dblLeft, "in", "", "#0.00 u"); _ 
 "dblBottom:" & Application.FormatResult(dblBottom, "in", "", "#0.00 u"); _ 
 "dblRight:" & Application.FormatResult(dblRight, "in", "", "#0.00 u"); _ 
 "dblTop:" & Application.FormatResult(dblTop, "in", "", "#0.00 u") 
 
 End If 
 
End Sub

次のマクロは、BoundingBox メソッドと ShapesOverlap() 関数を使用して、ある図形 (vsoShape2) がもう 1 つの図形 (vsoShape1) の上に重なって表示されているかどうかを判別します。

Public Sub OverlappingShapes_Example() 
 
 Dim vsoShape1 As Visio.Shape 
 Dim vsoShape2 As Visio.Shape 
 Dim blsIsOverlapping As Boolean 
 
 
 Set vsoShape1 = Application.ActiveWindow.Page.Drop(Application.Documents.Item("BASIC_U.VSS").Masters.ItemU("Square"), 3, 9) 
 
 Set vsoShape2 = Application.ActiveWindow.Page.Drop(Application.Documents.Item("BASIC_U.VSS").Masters.ItemU("Pentagon"), 3, 8) 
 
 blsIsOverlapping = ShapesOverlap(vsoShape2, vsoShape1) 
 
 If blsIsOverlapping Then 
 Debug.Print "Shapes overlap." 
 Else 
 Debug.Print "Shapes don't overlap." 
 End If 
 
End Sub 
 
 
Private Function ShapesOverlap(vsoShape1 As IVShape, vsoShape2 As IVShape) As Boolean 
 
 Dim dblLeft1 As Double 
 Dim dblLeft2 As Double 
 Dim dblBottom1 As Double 
 Dim dblBottom2 As Double 
 Dim dblRight1 As Double 
 Dim dblRight2 As Double 
 Dim dblTop1 As Double 
 Dim dblTop2 As Double 
 
 vsoShape1.BoundingBox Flags + visBBoxExtents, dblLeft1, dblBottom1, dblRight1, dblTop1 
 vsoShape2.BoundingBox Flags + visBBoxExtents, dblLeft2, dblBottom2, dblRight2, dblTop2 
 
 If ((dblLeft2 >= dblLeft1 And dblLeft2 <= dblRight1) Or _ 
 (dblRight2 >= dblLeft1 And dblRight2 <= dblRight1)) And _ 
 ((dblTop2 >= dblBottom1 And dblTop2 <= dblTop1) Or _ 
 (dblBottom2 >= dblBottom1 And dblBottom2 <= dblTop1)) Then 
 ShapesOverlap = True 
 Else 
 ShapesOverlap = False 
 End If 
 
End Function

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。