Форум пользователей Visio http://visio.getbb.ru/ |
|
Перемещение фигур вместе / отдельно. http://visio.getbb.ru/viewtopic.php?f=29&t=1209 |
Страница 1 из 1 |
Автор: | Валерий-М [ 26 сен 2017, 12:00 ] |
Заголовок сообщения: | Перемещение фигур вместе / отдельно. |
Как решить такую задачку: Есть две фигуры, скажем, Прямоугольник и Эллипс, связанные Соединительной линией. Нужно, чтобы при перемещении Прямоугольника вместе с ним перемещался Эллипс как единая фигура, а при перемещении Эллипса Прямоугольник оставался на своем месте. Нечто подобное реализовано в шаблоне "Нотация Чена" в Visio 2013. Там прямоугольник-сущность перемещается вместе со своими эллипсами-атрибутами, а атрибуты-эллипсы перемещаются независимо от родителя-сущности. |
Автор: | Tumanov [ 26 сен 2017, 13:15 ] | ||
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. | ||
Читайте справку по SetAtRef. Это классический пример реализации такой зависимости на уровне шейп-листа.. Естественно, это не единственный возможный вариант. Причем в штатных приложениях, как я понял, чаще пользуются другим методом - с программной поддержкой. Это несколько сложнее, но надежнее.
|
Автор: | Tumanov [ 26 сен 2017, 13:20 ] | ||
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. | ||
В эллипсе добавлены две User строки и две формулы в PinX, PinY.
|
Автор: | Валерий-М [ 26 сен 2017, 16:54 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Tumanov писал(а): В эллипсе добавлены две User строки и две формулы в PinX, PinY. Понял, сердечное спасибо! |
Автор: | nbelyh [ 26 сен 2017, 17:43 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Еще как вариант - можно "выноски" использовать. Они специально для этого сделаны. Цитата: Выноски — это особые фигуры, предназначенные для описания других фигур на схеме; выноски можно связывать с фигурами. Связанная с фигурой выноска перемещается вместе с фигурой, а при копировании или удалении фигуры выноска также копируется или удаляется. (это из документации) Еще вот например статья: https://blogs.technet.microsoft.com/vis ... 06/27/101/ Не подходит? В Visio куча вариантов выносок, в том числе и овальные. |
Автор: | Валерий-М [ 26 сен 2017, 18:09 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
nbelyh писал(а): Еще как вариант - можно "выноски" использовать. Они специально для этого сделаны. Не подходит? https://blogs.technet.microsoft.com/vis ... 06/27/101/ Спасибо, надо подумать, может быть подойдет. Выноска, как я понимаю, избавляет от необходимости как-то настраивать "включение сцепления". Требуется, чтобы "сцепление" фигур включалось в момент их соединения коннектором. Как это сделать, я еще не разобрался, буду благодарен за помощь. |
Автор: | nbelyh [ 26 сен 2017, 19:48 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Валерий-М писал(а): Спасибо, надо подумать, может быть подойдет. Выноска, как я понимаю, избавляет от необходимости как-то настраивать "включение сцепления". Требуется, чтобы "сцепление" фигур включалось в момент их соединения коннектором. Как это сделать, я еще не разобрался, буду благодарен за помощь. У выноски, как правило, уже есть "хвост" (коннектор), который можно использовать для "прикрепления" ее к фигуре (прямоугольнику) Отдельный коннектор не нужен. |
Автор: | Валерий-М [ 27 сен 2017, 06:29 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Да, это я понял, мое затруднение в том, что фигуры со своими свойствами уже есть, спроектированы, и при использовании выноски потребуется перепроектировать выноску под присоединяемую фигуру. Другой вариант -- как-то включать SetAtRef в прицепляемой фигуре в момент сцепления. Что будет проще -- я еще не понял. |
Автор: | Валерий-М [ 27 сен 2017, 09:41 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
nbelyh писал(а): Валерий-М писал(а): Спасибо, надо подумать, может быть подойдет. Выноска, как я понимаю, избавляет от необходимости как-то настраивать "включение сцепления". Требуется, чтобы "сцепление" фигур включалось в момент их соединения коннектором. Как это сделать, я еще не разобрался, буду благодарен за помощь. У выноски, как правило, уже есть "хвост" (коннектор), который можно использовать для "прикрепления" ее к фигуре (прямоугольнику) Отдельный коннектор не нужен. Попробовал выноски -- выяснилось, что в ассортименте все линии выносок -- прямые, а мне нужна "с коленами", т. е. "соединительная линия". Существуют ли такие выноски, уже готовые? |
Автор: | Tumanov [ 27 сен 2017, 10:17 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Цитата: Другой вариант -- как-то включать SetAtRef в прицепляемой фигуре в момент сцепления. Что будет проще -- я еще не понял. Этот вариант потребует использования программной поддержки. Например, макросов. Причем скорее всего придется рассматривать не только сцепление, но и расцепление. 1. Решение "в лоб" - обрабатывать события ConnectionsAdded, ConnectionsDeleted страницы. При возникновении события анализировать связанные с ним шейпы (например, по имени мастер-шейпа). Если это нужные шейпы, то записывать в ячейку одного из шейпов нужную формулу. Здесь появляются некоторые неудобства в начале работы и при переключении страниц - нужно назначить страницу, которая будет обрабатывать события. 2. Можно попробовать упрощенное решение. Например, добавить в меню команду соединения двух селектированных шейпов. При таком способе отпадает необходимость анализа соединений и типов соединяемых шейпов. Но вроде как менее "дружественно". События не нужны. |
Автор: | Tumanov [ 27 сен 2017, 11:03 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Посмотрите, вот из этого можно выбрать что-нибудь нужное. Код: Private Sub DirectLink(ByVal shp As Visio.Shape, ByVal shp2 As Visio.Shape) SetUserCells shp, "FlipX,FlipY,DeltaX,DeltaY,parentX,parentY" shp.Cells("PinX").FormulaForceU = "=SETATREF(User.DeltaX,SETATREFEVAL(SETATREFEXPR()-" & shp2.NameID & "!PinX))+" & shp2.NameID & "!PinX" shp.Cells("PinY").FormulaForceU = "=SETATREF(User.DeltaY,SETATREFEVAL(SETATREFEXPR()-" & shp2.NameID & "!PinY))+" & shp2.NameID & "!PinY" shp.Cells("User.FlipX").FormulaForceU = "=IF(User.DeltaX<0,-1,0)" shp.Cells("User.FlipY").FormulaForceU = "=IF(User.DeltaY<0,-1,0)" shp.Cells("FlipX").FormulaForceU = "=User.FlipX" shp.Cells("FlipY").FormulaForceU = "=User.FlipY" End Sub Sub SetUserCells(ByVal shp As Visio.Shape, ByVal CellString As String) 'Имена в массив. Потом искать нужные из списка в этом массиве. names = Split(CellString, ",") Dim CelCnt As Integer CelCnt = UBound(names) - LBound(names) + 1 Flag = 0 If shp.SectionExists(242, 0) Then Dim sec As Visio.Section Set sec = shp.Section(242) s = "," For i = 0 To sec.Count - 1 s = s & sec.Row(i).Name & "," Next For i = 0 To CelCnt - 1 If InStr(1, s, names(i)) > 0 Then names(i) = "" 'Оставить отсутствующие Flag = Flag + 1 End If Next Else shp.AddSection 242 'Add User-section End If If Flag <> CelCnt Then CreateNamedUserRow shp, names End If End Sub Sub CreateNamedUserRow(ByVal shp As Visio.Shape, ByVal names) CelCnt = UBound(names) - LBound(names) + 1 For i = 0 To CelCnt - 1 If names(i) <> "" Then Rez = shp.AddNamedRow(242, names(i), 0) End If Next End Sub DirectLink собственно соединяет формулами два шейпа. Там еще Flip задействован. Это с учетом того, что подчиненный шейп может находиться как справа, так и слева. Две вспомогательные процедуры создают нужные ячейки, если они отсутствуют. По минимуму (если все подготовлено) - нужны только две строки из процедуры DirectLink. |
Автор: | nbelyh [ 27 сен 2017, 12:00 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
"Кривые" выноски в отдельном стенсиле Кажется именно так и называется - выноски. |
Автор: | Валерий-М [ 27 сен 2017, 17:49 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Tumanov писал(а): 2. Можно попробовать упрощенное решение. Например, добавить в меню команду соединения двух селектированных шейпов. При таком способе отпадает необходимость анализа соединений и типов соединяемых шейпов. Но вроде как менее "дружественно". События не нужны. Видится как-то так: в меню "ведомой" фигуры предусмотреть пункт "Перемещать вместе с ведущей фигурой", но для этого нужно как-то узнать, к какой фигуре прикреплена "ведомая" фигура, т.е. какая фигура для нее "ведущая". Можно ли это сделать достаточно просто из "ведомой" фигуры? |
Автор: | Валерий-М [ 27 сен 2017, 17:56 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
nbelyh писал(а): Сначала обрадовался: то, что надо! Однако потом понял, что не совсем: 1) у линии выноски предусмотрено только одно "колено"; 2) выноска перемещается вместе с фигурой, к которой прикреплена, но при перемещении самой выноски последняя открепляется от фигуры и нужно снова прикреплять линию выноски к фигуре. |
Автор: | Tumanov [ 27 сен 2017, 18:18 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
Цитата: Видится как-то так: в меню "ведомой" фигуры предусмотреть пункт "Перемещать вместе с ведущей фигурой", но для этого нужно как-то узнать, к какой фигуре прикреплена "ведомая" фигура, т.е. какая фигура для нее "ведущая". Можно ли это сделать достаточно просто из "ведомой" фигуры? Лучше немного по-другому. Если селектировать нескольок шейпов, то Visio отображает контекстное меню первого шейпа. Значит привязываться лучше к ведущему. Тем более, что он один, а ведомых может быть несколько. Поэтому в прямоугольники нужно встроить секцию Actions, из которой будет через RunMacro вызываться макрос. Макрос анализирует коллекцию селектированных шейпов. Первый считает ведущим, остальные ведомыми. И налаживает связи. Все данные у него для этого есть. Можно селектировать только два шейпа. Порядок селектирования имеет значение. Первым должен быть ведущий, вторым (с шифтом) выбирать ведомого. Примерно так Код: For i = 2 to ActiveWindow.Selection.Count DirectLink ActiveWindow.Selection(1), ActiveWindow.Selection(i), Next ----------- Со стороны ведомого шейпа тоже добраться можно. Через коннектор. Это уже не раз разбиралось на форуме. Выбрать Connects ведомого шейпа. Из него вычислить шейп-коннектор. Найти второй конец коннектора. По нему вычислить ведущий шейп. В этом случае, конечно, меню должно быть в ведомом шейпе. С непривычки такой способ будет чуть посложнее. И привязывать за одну операцию можно будет только одну пару. |
Автор: | nbelyh [ 27 сен 2017, 23:48 ] | ||
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. | ||
Валерий-М писал(а): Сначала обрадовался: то, что надо! Однако потом понял, что не совсем: 1) у линии выноски предусмотрено только одно "колено"; 2) выноска перемещается вместе с фигурой, к которой прикреплена, но при перемещении самой выноски последняя открепляется от фигуры и нужно снова прикреплять линию выноски к фигуре. Ну блин, какой ты однако капризный В принципе выноски можно самом делать, вот тут написано как https://blogs.msdn.microsoft.com/visio/ ... isio-2010/ Там всего несколько важных ячеек: User.msvStructureType Controls.Association Вот пример с несколькими "конеленами"
|
Автор: | Валерий-М [ 28 сен 2017, 08:05 ] |
Заголовок сообщения: | Re: Перемещение фигур вместе / отдельно. |
nbelyh писал(а): Валерий-М писал(а): Сначала обрадовался: то, что надо! Однако потом понял, что не совсем: 1) у линии выноски предусмотрено только одно "колено"; 2) выноска перемещается вместе с фигурой, к которой прикреплена, но при перемещении самой выноски последняя открепляется от фигуры и нужно снова прикреплять линию выноски к фигуре. Ну блин, какой ты однако капризный В принципе выноски можно самом делать, вот тут написано как https://blogs.msdn.microsoft.com/visio/ ... isio-2010/ Там всего несколько важных ячеек: User.msvStructureType Controls.Association Вот пример с несколькими "конеленами" То, что надо! "Дас ист фантастишь", как говорят в Вене. Сердечное спасибо. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |