Как читать Visio Process Flow

Есть ли способ прочитать поток Visio Flow? Если у нас есть документ Visio, подобный приведенному ниже, Могу ли я прочитать такой процесс, как "От начала к процессу 1", затем от процесса 1 к решению 1. Если решение 1 - "Да", то процесс 3 иначе процесс 2. От процесса 3 до КОНЕЦ. От процесса 2 до решения 2 и т. Д.

Можно ли читать, как указано выше, используя макрос в Visio или используя C# из Visual Studio.

1 ответ

В Visio есть модель автоматизации, которая позволяет писать код, который будет делать то, что вы хотите. Visio имеет встроенный VBA (Visual Basic для приложений), поэтому вы можете быстро начать возиться с кодом. В то время как создание надстройки VSTO на C# или VB.NET требует гораздо больше усилий для начала.

Если соединители правильно приклеены к формам, вы можете проследить структуру схемы. На самом деле не совсем очевидно, как это сделать, но я могу дать несколько советов прямо из головы. По крайней мере, термины, которые я упоминаю ниже, помогут в поиске примеров кода и ссылок на API.

В Visio поля называются "2D-фигурами", а соединители - "1D". Вы можете обнаружить "одномерные" фигуры, запросив свойство shape.OneD.

У 2D-форм есть объекты "FromConnects", а у 1D-фигур - объекты "Connects". Соединяющие объекты по сути заключают в себе приклеенный конец соединителя. С помощью объекта Connects вы можете получить конец приклеенного соединителя (начало или конец) и то, к чему он приклеен (конкретная точка соединения или вся фигура).

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

Вы можете найти отправные точки, ища ящики, у которых нет входящих соединений. На языке Visio это означает, что конец коннектора не приклеен к форме. (У соединителей есть начало и конец).

Я уверен, что где-то у меня есть образцы, но сейчас я не нахожусь там, где я могу их искать. Вот примерный непроверенный код, который может помочь вам начать работу:

Public Sub AnalyzePage

  Dim pg As Visio.Page
  Set pg = Visio.ActivePage

  Dim shp As Visio.Shape
  For Each shp in pg.Shapes

    If (shp.OneD) Then
      '// This is a connector:
      '// We could examine shp.Connects to find out which
      '// boxes it is glued to.
    Else
      '// This is not a connector...a box:
      If (shp.FromConnects.Count > 0) Then
        '// FromConnects are the other side of Connects. We can look
        '// at each FromConnect object for this shape and determine if
        '// the connector is incoming or outgoing from this shape, and
        '// (with a bit of work) figure out the box on the other end
        '// of the connector.
      End If
    End If

  Next shp


End Sub
Другие вопросы по тегам