Visio:如何获取一个形状中包含的形状?

时间:2017-02-15 12:24:42

标签: containers shape diagram shapes visio

我无法从"包(扩展)"中获取方法SpartialNeighbors的信息。形状。

通常我使用此代码:

 Dim s As Shape, vsoShapeOnPage As Shape
 Dim vsoReturnedSelection As Visio.Selection  

 's contains the current shape
 Set vsoReturnedSelection = s.SpatialNeighbors(visSpatialContain, 0, visSpatialIncludeContainerShapes)
        If vsoReturnedSelection.Count = 0 Then
            'No Shapes contained
        Else
            For Each vsoShapeOnPage In vsoReturnedSelection
               'Code
            Next
        End If

这适用于默认UML模板中的形状(nameU ="概述")

我知道我可以将形状分组,但它增加了工作量。

另一点,当我分析其他形状时,我会看到" MemberOfContainers"形状包含在"包装(展开)"中。因此,必须能够从其他方式获取信息而无需经历所有形状。

在这里你可以看到"包"和#34;界面"的形状 Extract of the diagram

1 个答案:

答案 0 :(得分:1)

如果形状是容器,则将填充它的ContainerProperties属性(即非空)。然后,您可以对其进行interogate以检索成员形状ID数组。

以下是SDK下载中的一些示例代码的略微改编版本 - 基于如下文档:

Visio Container Shapes

你可以抓住这样的成员形状:

Sub CheckMyPackageContainer()
    'Assumes container is selected shape in active drawing window
    Call ReportContainerShape(ActiveWindow.Selection.PrimaryItem)
End Sub


Sub ReportContainerShape(ByRef contShp As Visio.Shape)
    If Not contShp Is Nothing Then
        Dim containerProps As ContainerProperties
        Set containerProps = contShp.ContainerProperties
        If Not containerProps Is Nothing Then
            Dim lngContainerMembers() As Long
            lngContainerMembers = containerProps.GetMemberShapes(Visio.VisContainerFlags.visContainerFlagsDefault)

            Dim hostingPage As Visio.Page
            Set hostingPage = contShp.ContainingPage
            For Each varMember In lngContainerMembers
                Dim shpItem As Visio.Shape
                Set shpItem = hostingPage.Shapes.ItemFromID(varMember)
                Debug.Print shpItem.NameU, "Text = " & shpItem.Text
            Next
        End If
    End If
End Sub

这将产生以下输出(注意' InterfaceThree'不包括在内):

Interface     Text = InterfaceOne
Interface.30  Text = InterfaceTwo