Visio надстройка найти имя строки геометрии - PullRequest
0 голосов
/ 03 сентября 2018

Я создал надстройку для Visio, которая извлекает информацию из фигур Visio в файл json, чтобы я мог воссоздать чертежи Visio в других приложениях. Сейчас я работаю над расширением, чтобы получить больше, чем прямые линии, поэтому я пытаюсь получить доступ к свойству Name геометрии фигуры.

The Geometry Section of a shape

Я могу получить доступ к столбцам 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 в качестве выходных данных, например, поэтому я знаю, следует ли рисовать прямую линию или эллипс, например, в других программах.

ОБНОВЛЕНИЕ (фрагмент кода о том, как я пытаюсь перевести предложение от Джона:

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, не так ли? Не могу

1 Ответ

0 голосов
/ 03 сентября 2018

Разделы геометрии имеют индексированные, а не именованные строки, поэтому вам нужно проверить RowType , чтобы выяснить, с какой вы имеете дело.

Вот пример ( с использованием 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
...