Форум пользователей Visio

Форум по вопросам применения и программирования в Visio
Текущее время: 21 ноя 2017, 08:30

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Небольшая справка по соединениям фигур
СообщениеДобавлено: 15 июн 2017, 18:55 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Решил написать небольшую справку по соединениям фигур(шейпов) для новичков осваивающих 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


Последний раз редактировалось Shishok 17 июн 2017, 21:56, всего редактировалось 6 раз(а).

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Небольшая справка по соединениям фигур
СообщениеДобавлено: 17 июн 2017, 21:42 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 547
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100603

Добавить очки репутацииУменьшить очки репутации
Иллюстрации

ConnectedShapes, представляет "логическое соединение" (высокоуровневая функция, дает соединение между фигурами):
Изображение

Connects (низко-уровневая функция, дает очень детальную информацию о "точке крепления" - объект Connect).
Чтобы получить информацию, даваемую ConnectedShapes, надо просмотреть обе "точки крепления" коннектора.
Изображение

Небольшая поправка про Connects
Цитата:
Может иметь 0, 1 или 2 элемента. То есть шейп подключенный к началу коннектора и шейп подключенный к концу коннектора.

На самом деле там может быть сколько угодно. Мы на этом как-то суровый баг словили. Например, фигура Ethernet:
Изображение


Последний раз редактировалось nbelyh 17 июн 2017, 21:56, всего редактировалось 1 раз.

Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Небольшая справка по соединениям фигур
СообщениеДобавлено: 17 июн 2017, 21:56 
Не в сети
Ветеран

Зарегистрирован: 30 июл 2014, 14:28
Сообщений: 433
Использую Visio c: 2008
Очков репутации: 97

Добавить очки репутацииУменьшить очки репутации
Цитата:
На самом деле там может быть сколько угодно. Мы на этом как-то суровый баг словили. Например, фигура Ethernet:

Когда я писал об этом, то у меня были сомнения. Но примера не было. Поправил.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Небольшая справка по соединениям фигур
СообщениеДобавлено: 17 июн 2017, 22:02 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 547
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100603

Добавить очки репутацииУменьшить очки репутации
Ага. Я тоже думал что 2 - максимум.. Но сделать больше 2 достаточно нетривиально :)


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Небольшая справка по соединениям фигур
СообщениеДобавлено: 17 июн 2017, 22:38 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 28 апр 2013, 14:03
Сообщений: 547
Откуда: Вена, Австрия
Использую Visio c: 1998
Очков репутации: 100603

Добавить очки репутацииУменьшить очки репутации
Еще комментарий - Connects/FromConnects описывают вообще ВСЕ случаи соединения, влючая 2d - 2d, привязка к направляющим, и т.д.
Они скорее описывают связь между ячейками ШШ одной фигуры и другой. Если такие детали не интересуют, лучше пользоваться ConnectedShapes.

Как там говорится - Gentoo Linux - вы можете все настроить! И вы будете все настраивать!
Аналогично с Connect - вы сможете видеть все детали соединения! И вы будете разбираться со всеми этими деталями!

Например, вот здесь у фигуры shp1 будет 3 объекта "Connect", при полном отсутствии соединительных линий вообще:
Изображение


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Вы можете создать форум бесплатно PHPBB3 на Getbb.Ru, Также возможно сделать готовый форум PHPBB2 на Mybb2.ru
Русская поддержка phpBB