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

Форум по вопросам применения и программирования в Visio
Текущее время: 22 ноя 2017, 05:51

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


Правила форума


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)



Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 26 сен 2017, 12:00 
Не в сети

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Как решить такую задачку:

Есть две фигуры, скажем, Прямоугольник и Эллипс, связанные Соединительной линией.
Нужно, чтобы при перемещении Прямоугольника вместе с ним перемещался Эллипс как единая фигура, а при перемещении Эллипса Прямоугольник оставался на своем месте.

Нечто подобное реализовано в шаблоне "Нотация Чена" в Visio 2013. Там прямоугольник-сущность перемещается вместе со своими эллипсами-атрибутами, а атрибуты-эллипсы перемещаются независимо от родителя-сущности.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 26 сен 2017, 13:15 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 990
Очков репутации: 100578

Добавить очки репутацииУменьшить очки репутации
Читайте справку по SetAtRef. Это классический пример реализации такой зависимости на уровне шейп-листа..
Естественно, это не единственный возможный вариант. Причем в штатных приложениях, как я понял, чаще пользуются другим методом - с программной поддержкой. Это несколько сложнее, но надежнее.


Вложения:
SetAtRef.vsd [13.5 Кб]
Скачиваний: 3
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 26 сен 2017, 13:20 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 990
Очков репутации: 100578

Добавить очки репутацииУменьшить очки репутации
В эллипсе добавлены две User строки и две формулы в PinX, PinY.


Вложения:
SetAtRef.jpg
SetAtRef.jpg [ 37.52 Кб | Просмотров: 197 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 26 сен 2017, 16:54 
Не в сети

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
В эллипсе добавлены две User строки и две формулы в PinX, PinY.


Понял, сердечное спасибо!


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

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

Добавить очки репутацииУменьшить очки репутации
Еще как вариант - можно "выноски" использовать.
Они специально для этого сделаны.
Цитата:
Выноски — это особые фигуры, предназначенные для описания других фигур на схеме; выноски можно связывать с фигурами. Связанная с фигурой выноска перемещается вместе с фигурой, а при копировании или удалении фигуры выноска также копируется или удаляется.
(это из документации)

Еще вот например статья:
https://blogs.technet.microsoft.com/vis ... 06/27/101/

Не подходит? В Visio куча вариантов выносок, в том числе и овальные.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 26 сен 2017, 18:09 
Не в сети

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
Еще как вариант - можно "выноски" использовать.
Они специально для этого сделаны.

Не подходит?
https://blogs.technet.microsoft.com/vis ... 06/27/101/


Спасибо, надо подумать, может быть подойдет. Выноска, как я понимаю, избавляет от необходимости как-то настраивать "включение сцепления". Требуется, чтобы "сцепление" фигур включалось в момент их соединения коннектором. Как это сделать, я еще не разобрался, буду благодарен за помощь.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 26 сен 2017, 19:48 
Не в сети
Ветеран
Аватара пользователя

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

Добавить очки репутацииУменьшить очки репутации
Валерий-М писал(а):
Спасибо, надо подумать, может быть подойдет. Выноска, как я понимаю, избавляет от необходимости как-то настраивать "включение сцепления". Требуется, чтобы "сцепление" фигур включалось в момент их соединения коннектором. Как это сделать, я еще не разобрался, буду благодарен за помощь.


У выноски, как правило, уже есть "хвост" (коннектор), который можно использовать для "прикрепления" ее к фигуре (прямоугольнику)
Отдельный коннектор не нужен.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 27 сен 2017, 06:29 
Не в сети

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Да, это я понял, мое затруднение в том, что фигуры со своими свойствами уже есть, спроектированы, и при использовании выноски потребуется перепроектировать выноску под присоединяемую фигуру. Другой вариант -- как-то включать SetAtRef в прицепляемой фигуре в момент сцепления. Что будет проще -- я еще не понял.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 27 сен 2017, 09:41 
Не в сети

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
Валерий-М писал(а):
Спасибо, надо подумать, может быть подойдет. Выноска, как я понимаю, избавляет от необходимости как-то настраивать "включение сцепления". Требуется, чтобы "сцепление" фигур включалось в момент их соединения коннектором. Как это сделать, я еще не разобрался, буду благодарен за помощь.


У выноски, как правило, уже есть "хвост" (коннектор), который можно использовать для "прикрепления" ее к фигуре (прямоугольнику)
Отдельный коннектор не нужен.


Попробовал выноски -- выяснилось, что в ассортименте все линии выносок -- прямые, а мне нужна "с коленами", т. е. "соединительная линия". Существуют ли такие выноски, уже готовые?


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 27 сен 2017, 10:17 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 990
Очков репутации: 100578

Добавить очки репутацииУменьшить очки репутации
Цитата:
Другой вариант -- как-то включать SetAtRef в прицепляемой фигуре в момент сцепления. Что будет проще -- я еще не понял.

Этот вариант потребует использования программной поддержки. Например, макросов.
Причем скорее всего придется рассматривать не только сцепление, но и расцепление.
1. Решение "в лоб" - обрабатывать события ConnectionsAdded, ConnectionsDeleted страницы. При возникновении события анализировать связанные с ним шейпы (например, по имени мастер-шейпа). Если это нужные шейпы, то записывать в ячейку одного из шейпов нужную формулу. Здесь появляются некоторые неудобства в начале работы и при переключении страниц - нужно назначить страницу, которая будет обрабатывать события.
2. Можно попробовать упрощенное решение. Например, добавить в меню команду соединения двух селектированных шейпов. При таком способе отпадает необходимость анализа соединений и типов соединяемых шейпов. Но вроде как менее "дружественно". События не нужны.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 27 сен 2017, 11:03 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 990
Очков репутации: 100578

Добавить очки репутацииУменьшить очки репутации
Посмотрите, вот из этого можно выбрать что-нибудь нужное.
Код:
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.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 27 сен 2017, 12:00 
Не в сети
Ветеран
Аватара пользователя

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

Добавить очки репутацииУменьшить очки репутации
"Кривые" выноски в отдельном стенсиле ;)
Кажется именно так и называется - выноски.

Изображение


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

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
2. Можно попробовать упрощенное решение. Например, добавить в меню команду соединения двух селектированных шейпов. При таком способе отпадает необходимость анализа соединений и типов соединяемых шейпов. Но вроде как менее "дружественно". События не нужны.


Видится как-то так: в меню "ведомой" фигуры предусмотреть пункт "Перемещать вместе с ведущей фигурой", но для этого нужно как-то узнать, к какой фигуре прикреплена "ведомая" фигура, т.е. какая фигура для нее "ведущая". Можно ли это сделать достаточно просто из "ведомой" фигуры?


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

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
"Кривые" выноски в отдельном стенсиле ;)
Кажется именно так и называется - выноски.

Изображение


Сначала обрадовался: то, что надо! Однако потом понял, что не совсем: 1) у линии выноски предусмотрено только одно "колено"; 2) выноска перемещается вместе с фигурой, к которой прикреплена, но при перемещении самой выноски последняя открепляется от фигуры и нужно снова прикреплять линию выноски к фигуре.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 27 сен 2017, 18:18 
Не в сети
Administrator

Зарегистрирован: 30 авг 2009, 11:02
Сообщений: 990
Очков репутации: 100578

Добавить очки репутацииУменьшить очки репутации
Цитата:
Видится как-то так: в меню "ведомой" фигуры предусмотреть пункт "Перемещать вместе с ведущей фигурой", но для этого нужно как-то узнать, к какой фигуре прикреплена "ведомая" фигура, т.е. какая фигура для нее "ведущая". Можно ли это сделать достаточно просто из "ведомой" фигуры?

Лучше немного по-другому.
Если селектировать нескольок шейпов, то Visio отображает контекстное меню первого шейпа. Значит привязываться лучше к ведущему. Тем более, что он один, а ведомых может быть несколько.
Поэтому в прямоугольники нужно встроить секцию Actions, из которой будет через RunMacro вызываться макрос.
Макрос анализирует коллекцию селектированных шейпов. Первый считает ведущим, остальные ведомыми. И налаживает связи. Все данные у него для этого есть. Можно селектировать только два шейпа. Порядок селектирования имеет значение. Первым должен быть ведущий, вторым (с шифтом) выбирать ведомого.
Примерно так
Код:
For i = 2 to ActiveWindow.Selection.Count
   DirectLink ActiveWindow.Selection(1), ActiveWindow.Selection(i),
Next

-----------
Со стороны ведомого шейпа тоже добраться можно. Через коннектор. Это уже не раз разбиралось на форуме.
Выбрать Connects ведомого шейпа. Из него вычислить шейп-коннектор. Найти второй конец коннектора. По нему вычислить ведущий шейп.
В этом случае, конечно, меню должно быть в ведомом шейпе.
С непривычки такой способ будет чуть посложнее. И привязывать за одну операцию можно будет только одну пару.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 27 сен 2017, 23:48 
Не в сети
Ветеран
Аватара пользователя

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

Добавить очки репутацииУменьшить очки репутации
Валерий-М писал(а):
Сначала обрадовался: то, что надо! Однако потом понял, что не совсем: 1) у линии выноски предусмотрено только одно "колено"; 2) выноска перемещается вместе с фигурой, к которой прикреплена, но при перемещении самой выноски последняя открепляется от фигуры и нужно снова прикреплять линию выноски к фигуре.

Ну блин, какой ты однако капризный :D

В принципе выноски можно самом делать, вот тут написано как
https://blogs.msdn.microsoft.com/visio/ ... isio-2010/

Там всего несколько важных ячеек:
User.msvStructureType
Controls.Association

Вот пример с несколькими "конеленами"
Изображение


Вложения:
Drawing3.vsd [20 Кб]
Скачиваний: 4
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Перемещение фигур вместе / отдельно.
СообщениеДобавлено: 28 сен 2017, 08:05 
Не в сети

Зарегистрирован: 26 сен 2017, 11:37
Сообщений: 10
Использую Visio c: 2010
Уровнь квалификации: начальный
Очков репутации: 0

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
Валерий-М писал(а):
Сначала обрадовался: то, что надо! Однако потом понял, что не совсем: 1) у линии выноски предусмотрено только одно "колено"; 2) выноска перемещается вместе с фигурой, к которой прикреплена, но при перемещении самой выноски последняя открепляется от фигуры и нужно снова прикреплять линию выноски к фигуре.

Ну блин, какой ты однако капризный :D

В принципе выноски можно самом делать, вот тут написано как
https://blogs.msdn.microsoft.com/visio/ ... isio-2010/

Там всего несколько важных ячеек:
User.msvStructureType
Controls.Association

Вот пример с несколькими "конеленами"
Изображение


То, что надо! "Дас ист фантастишь", как говорят в Вене. Сердечное спасибо.


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

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



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

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


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

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