我已经为Visio创建了一个插件,可以将Visio形状的信息提取到json文件中,这样我就可以在其他应用程序中重新创建Visio绘图。现在我正在扩展以获得更多直线,所以我试图访问形状的几何的Name
属性。
我可以使用以下代码访问X和Y列:
var offsetX = shape.CellsSRC[s, r, (short)Visio.VisCellIndices.visX].ResultIU;
var offsetY = shape.CellsSRC[s, r, (short)Visio.VisCellIndices.visY].ResultIU;
我似乎无法弄清楚如何从Geometry1数据中找到Name列。因为在我想要“RelLineTo”作为输出,所以我知道是否在其他程序中绘制直线或椭圆。
更新(关于我如何尝试翻译John的建议的代码片段:
var firstComponent = (short)Visio.VisSectionIndices.visSectionFirstComponent;
var selection = Globals.ThisAddIn.Application.ActivePage.CreateSelection(VisSelectionTypes.visSelTypeByLayer, VisSelectMode.visSelModeSkipSuper, Globals.ThisAddIn.Application.ActivePage.Layers.ItemU[areaLayer]);
foreach (Visio.Shape shape in selection)
{
for (short s = firstComponent; s < firstComponent + shape.GeometryCount; s++)
{
var geoSection = shape.Section[s];
for (short r = 1; r < geoSection.Count - 1; r++) // First and last point is always the same
{
var pointType = shape.RowType[s, r];
var pointTyp = Enum.GetName(typeof(Visio.VisRowTags),pointType);
}
}
}
这是我用来查找所有X和Y值的代码,除了使用var pointType / pointTyp的最后一位。如果我能从同一个for循环中获取row-info,那将是合乎逻辑的,不是吗?不能
几何部分具有索引而不是命名行,因此您必须检查RowType以找出您正在处理的行。
这是一个示例(using LINQPad),它遍历形状的每个几何部分中的行:
void Main()
{
var vApp = MyExtensions.GetRunningVisio();
var shp = vApp.ActiveWindow.Selection.PrimaryItem;
for (short i = 0; i < shp.GeometryCount; i++)
{
var geoSectIdx = (short)(Visio.VisSectionIndices.visSectionFirstComponent + i);
var geoName = $"Geometry{i + 1}";
$"{shp.NameID}!{geoName}".Dump();
for (short r = 1; r < shp.Section[geoSectIdx].Count; r++)
{
var rowTag = shp.RowType[geoSectIdx, r];
$"Row.{r} = {Enum.GetName(typeof(Visio.VisRowTags), rowTag)}".Dump();
}
"".Dump();
}
}
这将产生以下输出(给定具有两个地理区域的形状):
Sheet.1!Geometry1
Row.1 = visTagRelMoveTo
Row.2 = visTagRelLineTo
Row.3 = visTagRelLineTo
Row.4 = visTagRelLineTo
Row.5 = visTagRelLineTo
Sheet.1!Geometry2
Row.1 = visTagMoveTo
Row.2 = visTagLineTo
Row.3 = visTagLineTo
Row.4 = visTagLineTo
Row.5 = visTagLineTo