我有兴趣从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
的各种属性,但似乎根本没有几何数据。
答案 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();
}