2017-02-15 5 views
0

Je ne peux pas obtenir les informations de la méthode SpartialNeighbors sur une forme "Package (expanded)".Visio: Comment obtenir les formes contenues dans une forme?

Normalement, j'utiliser ce code:

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 

Et cela fonctionne parfaitement bien pour les formes comme dans le pochoir UML par défaut (NameU = « Vue d'ensemble »)

Je sais que je pourrais regrouper les formes, mais ça augmente l'effort.

Un autre point, lorsque j'analyse d'autres formes, je vois avec "MemberOfContainers" que la forme est contenue dans "Package (développé)". Il doit donc être possible d'obtenir l'information de l'autre côté sans passer par toutes les formes.

Ici vous pouvez voir le « paquet » et des formes de « interface » Extract of the diagram

Répondre

1

Si une forme est un récipient, il est ContainerProperties propriété sera peuplée (non nulle). Vous pouvez ensuite interoguer cela pour récupérer un tableau d'ID de forme de membre.

Ce qui suit est une version légèrement adaptée de quelques exemples de code trouvé dans le SDK téléchargement - basé sur un document qui ressemble à ceci:

Visio Container Shapes

Vous pouvez saisir les formes membres comme celui-ci:

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 

Cela se traduira par la sortie suivante (en notant que 'InterfaceThree' ne sont pas inclus):

Interface  Text = InterfaceOne 
Interface.30 Text = InterfaceTwo