System.Runtime.InteropServices.COMException: «Неправильный исходный объект для этого действия». идентифицируется при извлечении связанных фигур - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь получить связанные фигуры для каждой фигуры на моей странице.Но я нахожу странное исключение COM - «Неправильный исходный объект для этого действия»

Вот мой код:

using Microsoft.Office.Interop.Visio;

class Program
{
  static void Main(string[] args)
  {
    Application visApp = new Application();
    Document visDoc = visApp.Documents.Open(filePath);

    // Get the first page in the sample drawing.
    page = visDoc.Pages[1];

    foreach (Microsoft.Office.Interop.Visio.Shape shp in page.Shapes)
    {               
        GetConnected(shp, Microsoft.Office.Interop.Visio.VisConnectedShapesFlags.visConnectedShapesOutgoingNodes, "", null, true);
    }
 }


    private static void GetConnected(Microsoft.Office.Interop.Visio.Shape shp, Microsoft.Office.Interop.Visio.VisConnectedShapesFlags whichConnectedShapes, string category, Microsoft.Office.Interop.Visio.Selection selection, bool addToSelection)
     {
        Array aryTargetIDs;

        //getting an exception here during the second iteration of for loop of Main method
        aryTargetIDs = shp.ConnectedShapes(whichConnectedShapes, category); 
     }
  }

1 Ответ

3 голосов
/ 19 марта 2019

Метод ConnectedShapes выдает это исключение для одномерных фигур (т.е. соединителей). Так что вам просто нужно включить эту проверку, либо перед вызовом вашего вспомогательного метода, либо внутри него согласно следующему:

using Visio = Microsoft.Office.Interop.Visio

private static void GetConnected(
            Visio.Shape shp, 
            Visio.VisConnectedShapesFlags whichConnectedShapes, 
            string category, 
            Visio.Selection selection, 
            bool addToSelection)
{
    if (shp is null)
    {
        throw new ArgumentNullException();
    }
    if (shp.OneD == 0)
    {   
        Array aryTargetIDs = shp.ConnectedShapes(whichConnectedShapes, category);
        Console.WriteLine($"{shp.Master.Name} ({shp.NameID}) - {String.Join(", ", aryTargetIDs.Cast<object>().ToArray())}");
    }
}

Итак, учитывая набор форм, подобных этой: enter image description here

Вывод консоли из приведенного выше кода будет выглядеть примерно так:

Start/End (Sheet.1) - 2
Decision (Sheet.2) - 4, 6
Subprocess (Sheet.4) - 
Document (Sheet.6) -
...