如何迭代Visio几何行

时间:2018-06-13 06:37:36

标签: c# visio

我有兴趣从Visio中的形状中找到几何数据(如下所示),以便我可以将其导出到我可以在其他项目中使用的内容中。

This is the data I want to export

问题是我希望能够在Visio中绘制内容,导出几何数据,然后以不同的格式/应用程序重用这些图像。

到目前为止,我已经设法从我的自定义功能区中提取每个形状的一些数据,但我似乎无法掌握我真正想要的数据。基本上这可以通过反复试验(以及大量的智能感知)找到。

        foreach (Visio.Shape shape in Globals.ThisAddIn.Application.ActivePage.Shapes)
        {
            lstShapes.Items.Add(shape.Text + " (" + shape.Name + ") Type: " + shape.Type + " - Section: " + shape.get_Section(1) + " - GeoCount:" + shape.GeometryCount + " - LayerCount: " + shape.LayerCount);
        }

现在我正在研究如何找到所有选定的形状而不是文档中的所有形状,不确定这是否有用。我一直在浏览Visio.Shape的各种属性,但似乎根本没有几何数据。

1 个答案:

答案 0 :(得分:2)

要获取所选形状,您可以使用Selection上的Window属性。一旦你得到了它,你可以用这样的东西遍历形状,部分和行(注意I'm using LINQPad here,但唯一的区别是你如何掌握应用程序):

var vApp = MyExtensions.GetRunningVisio();

var firstComponent = (short)Visio.VisSectionIndices.visSectionFirstComponent;

foreach (Visio.Shape shp in vApp.ActiveWindow.Selection)
{
    for (short s = firstComponent; s < firstComponent + shp.GeometryCount; s++)
    {
        var geoSection = shp.Section[s];
        for (short r = 1; r < geoSection.Count; r++)
        {
            var rt = shp.RowType[s, r];
            Enum.GetName(typeof(Visio.VisRowTags), rt).Dump();
            //You now have the shape, section and row and, if you want to,
            //you can get to cells by using CellsSRC syntax:
            //var someCellValue = shp.CellsSRC[s, r, (short)Visio.VisCellIndices.visX].ResultIU;
            //How you address the cell will depend on the row type that you're targeting.
        }   
    }
}

如果您要将其用于导出,那么您可能还希望将文档另存为SVG。以下是一些选项:

另一种选择可能是查看Shape的Paths / PathsLocal属性。例如,在foreach形状内:

for (int x = 1; x <= shp.Paths.Count; x++)
{
    Visio.Path p = shp.PathsLocal[x] as Visio.Path;
    p.Points(0.1, out Array pntsArr);
    pntsArr.Dump();
}