Форум пользователей Visio http://visio.getbb.ru/ |
|
Небольшая справка по соединениям фигур http://visio.getbb.ru/viewtopic.php?f=39&t=1142 |
Страница 1 из 1 |
Автор: | Shishok [ 15 июн 2017, 18:55 ] |
Заголовок сообщения: | Небольшая справка по соединениям фигур |
Решил написать небольшую справку по соединениям фигур(шейпов) для новичков осваивающих 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 |
Автор: | nbelyh [ 17 июн 2017, 21:42 ] |
Заголовок сообщения: | Re: Небольшая справка по соединениям фигур |
Иллюстрации ConnectedShapes, представляет "логическое соединение" (высокоуровневая функция, дает соединение между фигурами): Connects (низко-уровневая функция, дает очень детальную информацию о "точке крепления" - объект Connect). Чтобы получить информацию, даваемую ConnectedShapes, надо просмотреть обе "точки крепления" коннектора. Небольшая поправка про Connects Цитата: Может иметь 0, 1 или 2 элемента. То есть шейп подключенный к началу коннектора и шейп подключенный к концу коннектора. На самом деле там может быть сколько угодно. Мы на этом как-то суровый баг словили. Например, фигура Ethernet: |
Автор: | Shishok [ 17 июн 2017, 21:56 ] |
Заголовок сообщения: | Re: Небольшая справка по соединениям фигур |
Цитата: На самом деле там может быть сколько угодно. Мы на этом как-то суровый баг словили. Например, фигура Ethernet: Когда я писал об этом, то у меня были сомнения. Но примера не было. Поправил. |
Автор: | nbelyh [ 17 июн 2017, 22:02 ] |
Заголовок сообщения: | Re: Небольшая справка по соединениям фигур |
Ага. Я тоже думал что 2 - максимум.. Но сделать больше 2 достаточно нетривиально |
Автор: | nbelyh [ 17 июн 2017, 22:38 ] |
Заголовок сообщения: | Re: Небольшая справка по соединениям фигур |
Еще комментарий - Connects/FromConnects описывают вообще ВСЕ случаи соединения, влючая 2d - 2d, привязка к направляющим, и т.д. Они скорее описывают связь между ячейками ШШ одной фигуры и другой. Если такие детали не интересуют, лучше пользоваться ConnectedShapes. Как там говорится - Gentoo Linux - вы можете все настроить! И вы будете все настраивать! Аналогично с Connect - вы сможете видеть все детали соединения! И вы будете разбираться со всеми этими деталями! Например, вот здесь у фигуры shp1 будет 3 объекта "Connect", при полном отсутствии соединительных линий вообще: |
Автор: | god-udach [ 16 фев 2018, 22:07 ] |
Заголовок сообщения: | Re: Небольшая справка по соединениям фигур |
Для |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |