Visio 加载项查找几何行的名称

Visio Add-in find Name of Geometry row

我制作了一个 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 数据中找到名称列。例如,我想得到 "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 循环中获取行信息,那将是合乎逻辑的,不是吗?不能

几何部分有索引而不是命名行,因此您必须检查 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