【问题标题】:How to iterate over Visio Geometry rows如何迭代 Visio 几何行
【发布时间】:2018-06-13 17:34:44
【问题描述】:

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

问题是我希望能够在 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 的各种属性,但似乎根本不存在几何数据。

【问题讨论】:

    标签: c# visio


    【解决方案1】:

    要获得选定的形状,您可以使用Window 上的Selection 属性。一旦你知道了,你可以像这样循环遍历形状、部分和行(注意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();
    }
    

    【讨论】:

    • 现在看这个,似乎很有趣。在 LINQPad 中尝试这一点,因为 VS 没有 Dump() 功能,所以这将留给未来的工作。
    • 我使用了 System.Windows.Forms.Application,但是它不包含 ActiveWindow 的定义。您是否为 Application 使用了其他命名空间(在 MyExtensions 中)?
    • 现在我有一长串说 visTagRelLineTo 和 visTagRelMoveTo 的字符串。到达某个地方,现在只是提取那些 X/Y 值。没关系,最后一条评论,我不得不将其更改为 Visio.Application(以防其他人卡住)
    • 是的,抱歉,Dump() 可以通过包装在 Console.WriteLine 或 Debug.WriteLine 中来代替 - 我只是展示一些可读的东西,这样你就可以看到枚举而不是 int/short .
    • 您仍然需要检查您是在处理 rel 行类型还是标准行类型,然后采取相应措施。如果它是 rel (相对于形状的大小)类型,则必须根据形状的宽度或高度来计算该值,具体取决于您是在 X 单元格还是 Y 单元格中。因此,您可能希望在 foreach 形状循环内获取 Width 和 Height 单元格。如果它是非 rel 行类型,那么您可以直接获取单元格结果,这将在本地坐标中。
    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2013-07-24
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多