Как читать 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