Решил написать небольшую справку по соединениям фигур(шейпов) для новичков осваивающих VBA в MS Visio.
Написал как я это все понимаю. Возможно в моем описании есть неточности. В этом случае прошу специалистов поправить или добавить.
1. МЕТОД CONNECTEDSHAPES:Работает метод ConnectedShapes в Visio 2010 и более позднем.expression.ConnectedShapes(Flags, CategoryFilter)expression - объектная переменная представляющая шейп.
Результат работы метода - массив типа
Long, содержащий
ID шейпов соединенных с искомым шейпом.
Результирующий массив не будет содержать
ID соединительных линий(коннекторов).
Первый аргумент метода,
Flags:

Второй аргумент метода,
CategoryFilter:
Тип -
String.
CategoryFilter - это определяемые пользователем строки, которые можно использовать для категоризации шейпов и тем самым ограничить членство в массиве. Можно определить категории в ячейке
User.msvShapeCategories в ShapeSheet для шейпа. Вы можете определить несколько категорий для шейпа, разделив категории двоеточием. Например ="Круг;Квадрат;Ромб". Пользователем создается строка с именем "
msvShapeCategories" в секции "
User-Defined Cells" и нужным значением.
Применение метода к одномерному шейпу или субшейпу вызывает ошибку. Если искомый шейп не имеет соединений - массив будет пуст.
Пример кода:
Код:
Sub Test_ConnectedShapes_Method()
Dim vsoShape As Visio.Shape, arrID() As Long, item As Variant
With ActiveWindow.Selection
If .Count > 0 Then ' если есть выделенный шейп
Set vsoShape = .PrimaryItem ' инициализируем объектную переменную (это будет первый выделенный шейп)
If vsoShape.OneD = 0 Then ' если шейп двумерный
arrID = vsoShape.ConnectedShapes(2, "Круг") ' выполняем метод (в данном случае только исходящие шейпы категории "Круг")
End If
End If
End With
For Each item In arrID ' перебираем массив
Debug.Print item ' выводим содержимое текущего элемента массива в окно Immediate.
Next
End Sub
Sub Test_ConnectedShapes() ' выделение входящих или исходящих шейпов
' на листе должно существовать некое множество шейпов соединенных коннекторами и
' выделен один из этих шейпов(не коннектор)
Dim id As Integer, Flag As Byte, Category As String
id = ActiveWindow.Selection.PrimaryItem.id ' присваиваем переменной ID выделенного шейпа
Flag = 2 ' только исходящие шейпы
Category = "" ' категория - все
Call ConnectedShapes(id, Flag, Category) ' вызываем основную процедуру
End Sub
Private Sub ConnectedShapes(ByVal id As Integer, Flag As Byte, Category As String) ' основная процедура
Dim arrID() As Long, item As Variant
arrID = ActivePage.Shapes.ItemFromID(id).ConnectedShapes(Flag, Category) ' выполняем метод
For Each item In arrID ' перебираем массив
ActiveWindow.Select ActivePage.Shapes.ItemFromID(item), 2 ' выделяем текущий шейп
Call ConnectedShapes(item, Flag, Category) ' рекурсия
Next
End Sub
2. КОЛЛЕКЦИЯ СОЕДИНЕНИЙ CONNECTS:Все шейпы в Visio имеют коллекцию
Connects.
2.1. ДЛЯ КОННЕКТОРОВ:Обычно имеет 0, 1 или 2 элемента. То есть шейп подключенный к началу коннектора и шейп подключенный к концу коннектора. В некоторых случаях элементов может быть и больше.
Если коннектор ни к чему не подключен то, естественно, коллекция пуста(0 элементов).
Для элементов коллекции
Connects можно использовать методы:
FROMCELL - Возвращает объект
Cell(ячейку), из которой происходит соединение. Объект Cell соответственно имеет кучу своих методов и свойств.
Пример:
Debug.Print vsoShape.Connects(1).FromCell.Name ' получаем имя ячейки.
FROMPART - Возвращает часть шейпа(целое число), из которого происходит соединение.
Возвращаемые значения для свойства
FromPart:

Пример:
Debug.Print vsoShape.Connects(1).FromPart ' получаем, например, 9. Это значит что соединение происходит из начала линии.
FROMSHEET - Возвращает объект Shape(шейп), из которого происходит соединение или соединения. Объект Shape соответственно имеет кучу своих методов и свойств.
Пример:
Debug.Print vsoShape.Connects(1).FromSheet.Name ' получаем имя подключенного шейпа.
TOCELL - Получает ячейку, к которой выполняется соединение. Описание то же что и для
FromCell.
TOPART - Возвращает часть шейпа, к которому выполняется соединение. Описание то же что и для
FromPart.
TOSHEET - Возвращает шейп, к которому сделаны одно или несколько соединений. Описание то же что и для
FromSheet.
2.2. ДЛЯ ШЕЙПОВ, НЕ КОННЕКТОРОВ:Обычно эта коллекция пуста, кроме случая когда у шейпа имеется соединительная точка с типом 1 или 2 и этот шейп подключен напрямую к другому шейпу(не коннектору).
Соединительные точки могут иметь 3 типа. Внутрь(
visCnnctTypeInward
) - 0, Наружу(
visCnnctTypeOutward
) - 1 и Внутрь и Наружу(
visCnnctTypeInwardOutward
) - 2.
3. КОЛЛЕКЦИЯ СОЕДИНЕНИЙ FROMCONNECTS:Все шейпы в Visio имеют коллекцию
FromConnects.
3.1. ДЛЯ КОННЕКТОРОВ:Обычно эта коллекция пуста, кроме случая когда у коннектора имеется соединительная точка и к этой точке подключен шейп/шейпы или коннектор/коннекторы.
Описание методов для элементов коллекции такое же как и для коллекции
Connects.
3.2. ДЛЯ ШЕЙПОВ, НЕ КОННЕКТОРОВ:Эта коллекция содержит коннекторы подключенные к шейпу(входящие и исходящие). Также может содержать шейпы напрямую подключенные к искомому, см. пункт 2.2.
Если к шейпу ничего не подключено то, естественно, коллекция пуста(0 элементов).
Описание методов для элементов коллекции такое же как и для коллекции
Connects.
4. НЕСКОЛЬКО ПРИМЕРОВ КОДА.Код:
Sub Example1() ' к каким шейпам и точкам подключен коннектор
' должен быть выделен коннектор с подключенными на концах шейпами(шейпы должны иметь именованные точки соединений)
Dim vsoShape As Visio.Shape
Set vsoShape = ActiveWindow.Selection.PrimaryItem
With vsoShape
MsgBox "Начало линии подключено к шейпу: " & .Connects(1).ToSheet.Name _
& vbNewLine & _
"к точке: " & .Connects(1).ToSheet.CellsSRC(visSectionConnectionPts, .Connects(1).ToPart - 100, visCnnctX).RowName
MsgBox "Конец линии подключен к шейпу: " & .Connects(2).ToSheet.Name _
& vbNewLine & _
"к точке: " & .Connects(2).ToSheet.CellsSRC(visSectionConnectionPts, .Connects(2).ToPart - 100, visCnnctX).RowName
End With
End Sub
Sub Example2() ' какие коннекторы подключены к шейпу
' должен быть выделен шейп с подключенными коннекторами(входящие и/или исходящие)
Dim vsoShape As Visio.Shape, i As Integer
Set vsoShape = ActiveWindow.Selection.PrimaryItem
With vsoShape
For i = 1 To .FromConnects.Count
Debug.Print .FromConnects(i).FromSheet.Name & Switch(.FromConnects(i).FromPart = 9, " > Исходящий", .FromConnects(i).FromPart = 12, " > Входящий")
Next
End With
End Sub