Подключите формы Visio в списке - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь соединить пару фигур, используя этот код:

Visio.Master ConnectionMaster = _masters.get_ItemU(connectorShapeName);
Visio.Shape Connector = _activePage.Drop(ConnectionMaster, 1, 1);

// get the start cell of connector
var b1 = (short) Visio.VisSectionIndices.visSectionObject;
var b2 = (short) Visio.VisRowIndices.visRowXForm1D;
var b3 = (short) Visio.VisCellIndices.vis1DBeginX;
Visio.Cell beginXCell = Connector.get_CellsSRC(b1, b2, b3);

// and the end one
var e1 = (short) Visio.VisSectionIndices.visSectionObject;
var e2 = (short) Visio.VisRowIndices.visRowXForm1D;
var e3 = (short) Visio.VisCellIndices.vis1DEndX;
Visio.Cell endXCell = Connector.get_CellsSRC(e1, e2, e3);

// get start point from first shape
var bt1 = (short) Visio.VisSectionIndices.visSectionObject;
var bt2 = (short) Visio.VisRowIndices.visRowXFormOut;
var bt3 = (short) Visio.VisCellIndices.visXFormPinX;
var toBegin = fromShape.get_CellsSRC(bt1, bt2, bt3);

// get start point of second shape
var et1 = (short) Visio.VisSectionIndices.visSectionObject;
var et2 = (short) Visio.VisRowIndices.visRowXFormOut;
var et3 = (short) Visio.VisCellIndices.visXFormPinX;
var toEnd = toShape.get_CellsSRC(et1, et2, et3);

// connect 
beginXCell.GlueTo(toBegin);
endXCell.GlueTo(toEnd);

Этот код отлично работает для фигур, которые были добавлены в Visio Doc с помощью этого кода:

Visio.Master shapeToDrop = _masters.get_ItemU(name);
Visio.Shape shape = _activePage.Drop(shapeToDrop, x, y);

Ноесли фигура была добавлена ​​в документ, а затем добавлена ​​в список, например:

var shape = _activePage.DropIntoList(shapeToDrop, target, position);

Я получаю сообщение об ошибке: «Произошло исключение».в этом коде:

var toBegin = fromShape.get_CellsSRC(bt1, bt2, bt3);

Итак, как правильно соединить фигуры в списке?Что я делаю не так?

Заранее спасибо!

1 Ответ

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

Я подозреваю, что ваша проблема связана не с подключением, а с обеспечением соответствия категорий при удалении элемента в список.Вот краткий пример для демонстрации проблемы (начиная с пустого рисунка в Visio):

void Main()
{
    //Run this code against a blank drawing in Visio
    var vApp = MyExtensions.GetRunningVisio();

    var vDoc = vApp.ActiveDocument;
    var stencilDoc = vDoc.Application.Documents.OpenEx("wfctrl_m.vssx",
                                                       (short)Visio.VisOpenSaveArgs.visOpenRO
                                                       + (short)Visio.VisOpenSaveArgs.visOpenDocked);
    var vPag = vApp.ActivePage;

    var diagramServices = vDoc.DiagramServicesEnabled;
    vDoc.DiagramServicesEnabled = (int)Visio.VisDiagramServices.visServiceVersion140 
                                + (int)Visio.VisDiagramServices.visServiceVersion150;
    var shpList = vPag.Drop(stencilDoc.Masters.ItemU["List box"], 2.25, 9.5);
    var itemMaster = stencilDoc.Masters.ItemU["List box item"];

    // Drop two items in - this works because the item
    // shapes have the correct required categories ('Grid')
    vPag.DropIntoList(itemMaster, shpList, 1);
    vPag.DropIntoList(itemMaster, shpList, 1);

    // Now set the list's required categories to someting else
    shpList.CellsU["User.msvSDListRequiredCategories"].FormulaU = $"\"Bob\"";

    // Note an error is thrown here because the list item being
    // inserted does not contain the category 'Bob'
    try
    {           
        vPag.DropIntoList(itemMaster, shpList, 1);
    }
    catch (COMException ex) when (ex.ErrorCode == -2032465763)
    {
        //Inappropriate source object for this action.
        Console.WriteLine($"{ex.Message} - check matching categories in List and ListItem shapes");
    }

    vDoc.DiagramServicesEnabled = diagramServices;
}

Вы, вероятно, должны написать быструю проверку, где вы читаете ячейку User.msvShapeCategories в форме элемента, а затем проверьте, еслиони входят в число обязательных категорий в форме списка (User.msvSDListRequiredCategories).См. Раздел « Управление членством в контейнере » этого поста: Пользовательские контейнеры, списки и выноски в Visio 2010 для получения дополнительной информации.

Просто добавьте, что если вы хотите соединить фигуры в списке, вы можете использовать свой метод, описанный выше, или что-то подобное, в зависимости от того, какой уровень контроля вам нужен:

var item = vPag.DropIntoList(itemMaster, shpList, 1);
var target = vPag.DrawRectangle(4, 9, 6, 7.5);
item.AutoConnect(target, Visio.VisAutoConnectDir.visAutoConnectDirNone);
...