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

C# Visio加载项查找几何体行的名称,c#,json,visio,C#,Json,Visio,我为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.V

我为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);
            }
       }
}
var firstComponent=(短)Visio.vissectionindex.visSectionFirstComponent;
var selection=Globals.ThisAddIn.Application.ActivePage.CreateSelection(VisSelectionTypes.visseltypebayer,VisSelectMode.visSelModeSkipSuper,Globals.ThisAddIn.Application.ActivePage.Layers.ItemU[areaLayer]);
foreach(选择中的Visio.Shape)
{
用于(短s=firstComponent;s

这是我用来查找所有X和Y值的代码,除了最后一位的var pointType/pointTyp。如果我可以从同一个for循环中获取行信息,这将是合乎逻辑的,不是吗?

几何体部分不能索引而不是命名行,所以你必须检查这些行,以找出你正在处理的是哪一行

下面是一个示例(),它遍历形状的每个几何体部分中的行:

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();
    }
}

所以我的选择是这样的,
var selection=Globals.ThisAddIn.Application.ActivePage.CreateSelection(VisSelectionTypes.visseltypebayer,VisSelectMode.visSelModeSkipSuper,Globals.ThisAddIn.Application.ActivePage.Layers.ItemU[areaLayer]);
然后我用这个
foreach(选择中的Visio.Shape形状)迭代它
。这与您所做的不一样吗?据我所知,您的第一个for循环通过形状中的每个点?我将尝试用我的翻译更新我的问题,但仍然得到空白结果。事实上,这只是我的最后一行不起作用(请参阅有问题的更新)
var pointTyp=Enum.GetName(typeof(Visio.VisRowTags),pointType);
,但只要我得到同样好的索引。在查找VisRowTags'
Enum
之后,它最多只能保存195个值,而我从RelMoveTo/RelLineTo获得的输出是238/239 Hello Tom,Rel类型的分段就在那里,只是文档没有更新。如果您尝试
Enum.GetNames(typeof(Visio.VisRowTags)).Dump();
您将获得完整的集合。Rel行类型首先出现在Visio 2013中,并且,正如您所发现的,它表示相对于所属形状的宽度或高度的值。如果我正确理解您的问题,我的方法是如上所述循环行,然后检查X、Y(以及a、B、C、D、E)单元格取决于您要寻址的行的类型。是的,现在已经全部启动并运行了,我创建了自己的枚举,因为我仍然可以控制在其他平台上支持哪种类型的行,所以我发现这同样简单。感谢您,我真的很难找到有关Visio编码的好文档。
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