C# 如何迭代Visio几何体行

C# 如何迭代Visio几何体行,c#,visio,C#,Visio,我感兴趣的是从Visio中的形状中查找几何体数据(如下所示),以便将其导出到其他项目中使用的内容 问题是,我希望能够在Visio中绘制东西,导出几何体数据,然后以不同的格式/应用程序重用这些图像 到现在为止,我已经设法从我的自定义功能区中提取了每个形状的一些数据,但我似乎无法获得我真正想要的数据。基本上,这是通过反复试验(以及大量的智能感知)发现的 现在,我正在研究如何找到所有选定的形状,而不是文档中的所有形状,不确定这是否有帮助。我一直在浏览Visio.Shape的各种属性,但似乎根本不存在

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

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

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


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

要获取所选形状,您可以使用
窗口上的
选择
属性。一旦你得到了这些,你就可以用类似这样的东西在形状、部分和行之间循环(注意,但唯一的区别是你如何掌握应用程序):

var-vApp=MyExtensions.GetRunningVisio();
var firstComponent=(短)viso.vissectionindex.visSectionFirstComponent;
foreach(vApp.ActiveWindow.Selection中的Visio.Shape shp)
{
用于(短s=firstComponent;s
如果您正在使用它进行导出,那么您可能还需要考虑将文档另存为SVG。以下是一些选项:

  • 来自@Nikolay
另一种选择可能是查看形状的/属性。例如,在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();
}

for(int x=1;x要获得所选形状,您可以使用
窗口上的
选择
属性。一旦获得该属性,您就可以使用类似的内容在形状、部分和行之间循环(注意,但唯一的区别是如何获得应用程序):

var-vApp=MyExtensions.GetRunningVisio();
var firstComponent=(短)viso.vissectionindex.visSectionFirstComponent;
foreach(vApp.ActiveWindow.Selection中的Visio.Shape shp)
{
用于(短s=firstComponent;s
如果要将其用于导出,则可能还需要将文档另存为SVG。以下是一些选项:

  • 来自@Nikolay
另一种选择可能是查看形状的/属性。例如,在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();
}

for(int x=1;x)现在研究这一点似乎很有趣。在LINQPad中尝试这一点,因为VS没有Dump()功能,所以这将留待以后的工作。我使用了System.Windows.Forms.Application,但它不包含ActiveWindow的定义。您是否为应用程序使用了其他名称空间(在MyExtensions中)?现在我有一长串字符串,分别是visTagRelLineTo和visTagRelMoveTo。现在要做的就是提取那些X/Y值。不管最后的注释是什么,我必须将其更改为Visio.Application(以防其他人卡住)是的,抱歉,转储()可以替换为在Console.WriteLine或Debug.WriteLine中换行-我只是显示一些可读的内容,以便您可以看到枚举,而不是int/short。您仍然需要检查是处理rel行类型还是标准行类型,然后相应地采取行动。如果是rel(相对于trhe shape的大小)类型您必须计算形状的宽度或高度因子的值,这取决于您是在X单元格中还是在Y单元格中。因此,您可能希望在foreach形状循环中获取宽度和高度单元格。如果它是非rel行类型,则您可以直接获取单元格结果,这将在局部坐标中。查看现在,这似乎很有趣。在LINQPad中尝试这一点,因为VS没有Dump()功能,所以这将留待以后的工作。我使用了System.Windows.Forms.Application,但它不包含ActiveWindow的定义。您是否为应用程序使用了其他命名空间(在MyExtensions中)?现在我有一长串字符串,分别是visTagRelLineTo和visTagRelMoveTo。现在要做的就是提取那些X/Y值。不管最后的注释是什么,我必须将其更改为Visio.Application(以防其他人卡住)是的,抱歉,转储()可以替换为在Console.WriteLine或Debug.WriteLine中换行-我只是显示一些可读的内容,以便您可以看到枚举,而不是int/short。您仍然需要检查是处理rel行类型还是标准行类型,然后相应地采取行动。如果是rel(相对于trhe shape的大小)键入您必须计算该值作为形状的宽度或高度的一个因子,这取决于您是在X单元格中还是在Y单元格中
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();
}