Visio имеет модель автоматизации, которая позволяет вам писать код, который будет делать то, что вы хотите. Visio имеет встроенный VBA (Visual Basi c для приложений), поэтому вы можете быстро начать работать с кодом. Принимая во внимание, что создание надстройки VSTO в C# или VB. NET требует гораздо больше усилий для начала работы.
Пока соединители правильно приклеены к фигурам, вы можете проследить структуру диаграммы. Не совсем очевидно, как это сделать, но я могу предложить несколько советов от макушки головы. Если ничего другого, то термины, которые я упоминаю ниже, помогут в поиске примеров кода и ссылок API.
Боксы называются «2D» фигурами в Visio, а соединители называются «1D». Вы можете обнаружить "1D" фигуры, запросив свойство shape.OneD.
2D-фигуры имеют объекты "FromConnects", а 1D-фигуры имеют объекты "Connects". Соединяемые объекты по существу инкапсулируют склеенный конец соединителя. С помощью объекта Connects вы можете получить конец склеиваемого коннектора (Begin или End) и то, к чему он приклеивается (конкретная точка соединения или вся форма).
Таким образом, вы Можно создать список соединений, которые отмечают исходный блок и конечный блок, и, таким образом, вы можете понять структуру диаграммы.
Начальные точки можно найти, выполнив поиск блоков, которые не имеют входящих соединений. На языке 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