2012-07-28 92 views
1

我正在使用办公自动化将visio文件转换为指定的xml格式流程图,并且我需要将swimlane数据用作工作流程过程的容器。所以我怎样才能得到workflow shapes and swimlane之间的关系?如何从Visio自动化中获取泳道形状对象中的形状?

CODE

IVisio.Shape shape = o as IVisio.Shape; 

double width = shape.Cells["Width"] 
     .Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters]; 
double height = shape.Cells["Height"] 
     .Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters]; 
double pinX = shape.Cells["PinX"] 
     .Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters]; 
double pinY = shape.Cells["PinY"] 
     .Result[Microsoft.Office.Interop.Visio.VisUnitCodes.visMillimeters]; 

回答

0

要找到容器关系可以通过API使用这种方法:

public class ShapeWrapper 
{ 
    public IVisio.Shape Shape { get; set; } 

    private List<ShapeWrapper> children = new List<ShapeWrapper>(); 
    public List<ShapeWrapper> Children { get { return this.children; } } 

    public ShapeWrapper(IVisio.Shape shape) 
    { 
     Shape = shape; 
    } 
} 

private void FindChildren(ShapeWrapper shapeWrapper, 
           List<IVisio.Shape> addedShapes) 
{ 
    IVisio.Selection children = shapeWrapper 
     .Shape.SpatialNeighbors[ 
      (short)IVisio.VisSpatialRelationCodes.visSpatialContain, 
      0, 
      (short)IVisio.VisSpatialRelationFlags.visSpatialFrontToBack]; 

    foreach (IVisio.Shape child in children) 
    { 
     if (!addedShapes.Contains(child)) 
     { 
      //MessageBox.Show(child.Text); 
      ShapeWrapper childWrapper = new ShapeWrapper(child); 
      shapeWrapper.Children.Add(childWrapper); 

      FindChildren(childWrapper, addedShapes); 
     } 
    } 
} 
+0

如果正确,请标记此答案! :d – Jones 2012-08-04 16:33:46

2

是与传入和传出连接相关联的形状的返回的ID。

using Visio = Microsoft.Office.Interop.Visio; 
visioObj = (Visio.Application)     
    System.Runtime.InteropServices.Marshal.GetActiveObject("Visio.Application"); 

Array ids = shape.ConnectedShapes(Visio.VisConnectedShapesFlags 
     .visConnectedShapesAllNodes, ""); 

// Using first item and get name 
string name = visioObj.ActivePage.Shapes[ids.GetValue(0)].Name; 
+0

谢谢@jones,我找到了解决办法。你的方法可能会获得由动态连接器连接的形状。 – liurongwei 2012-07-29 21:37:56

+0

@liurongwei张贴您的方法 – Jones 2012-07-29 21:40:19

-1

您创建了的PackagePart数据的XML文档。您需要特别注意管理您创建的特定类型的XML文档的架构的XML名称空间。 您创建一个新文件来包含XML并将文件保存到包中的某个位置。 您可以在新的PackagePart和Package或其他PackagePart对象之间创建必要的关系。 您可以更新任何需要引用新零件的现有零件。例如,如果向文件添加新的页面内容部件(新页面),则还需要更新页面索引部分(/visio/pages/pages.xml文件)以包含有关新页面的正确信息。