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

Форум по вопросам применения и программирования в Visio
Текущее время: 28 мар 2024, 21:18

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


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


При размещении файлов предпочтительным является формат vsd (а не vsdx/vsdm)
Размещая ваши вложения на форуме не используйте имена файлов содержащих кириллицу, в противном случае файл будет иметь имя .<расширение файла> !

Для форматирования ваших сообщений используйте BBCodes, описание используемых на форуме BBCodes.



Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Запуск макроса при перемещение фигуры на перед./зад. план
СообщениеДобавлено: 25 июн 2022, 23:30 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Возможно ли сделать запуск макроса при перемещение фигуры на передний или задний план? В кодах событий ничего похожего не нашел.

_________________
Группа в VK Фигуры электрики для Visio


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

Зарегистрирован: 02 окт 2009, 01:01
Сообщений: 5043
Откуда: оттуда
Использую Visio c: 1998
Отрасль: Интеграция системных интеграторов
Должность: Дизайнер по оформлению документации
Уровнь квалификации: Форматирование документов MS Word
Tim Umix писал(а):
В кодах событий ничего похожего не нашел.
Да, там такого события нет!
Дополнено позднее: Нашел такой кривой способ.
Добавляем строку

User-defined cells

User.Row_1

RUNMACRO("ThisDocument.MyMacro")+DEPENDSON(DisplayLevel)

 

В принципе запуск макроса работает.

Ложка дегтя: Если дважды нажать на ленте кнопку На [передний/задний] план или клавиши Ctrl+Shift+F/Ctrl+Shift+B, дальнейшие нажатия не дают вызова макроса. Надо нажать кнопку с противоположным действием, чтобы вызов макроса заработал !

_________________
База знаний ShapeSheet
Мой Youtube-канал @surrogate-tm
Мои трафареты


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

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Дополнено позднее: Нашел такой кривой способ.

Ну да, несколько кривовато... В принципе, DisplayLevel - это совсем для другого.
Я бы скорее воспользовался более нейтральной функцией Now().
Например, так, как на рисунке.
То есть запускаем макрос по каждому Now(), а внутри макроса проверяем, не изменился ли индекс шейпа. Если изменился, можно из следящего запускать уже целевой макрос.
Код:
Sub ttt(vsoShape As Visio.Shape)
    indx = vsoShape.Index
    Incell = vsoShape.Cells("User.Row_1").ResultInt(32, 0)
    If (indx <> Incell) Then
        vsoShape.Cells("User.Row_1").Formula = indx
    End If
End Sub

Вложение:
IndEvnt.PNG
IndEvnt.PNG [ 2.94 Кб | Просмотров: 594 ]


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

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Surrogate писал(а):
Нашел такой кривой способ.

Tumanov писал(а):
Я бы скорее воспользовался более нейтральной функцией Now().

Спасибо. Оба способа работают. Буду тестить какой мне лучше подойдет :D

_________________
Группа в VK Фигуры электрики для Visio


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

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

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

Dim shp As Visio.Shape

'On Error Resume Next

For Each shp In Application.ActiveWindow.Selection


    If shp.CellExists("User.Index", 0) <> 0 Then
   
        indx = shp.Index
        indx1 = Application.ActivePage.Shapes.ItemFromID(1).Index
        indx2 = Application.ActivePage.Shapes.ItemFromID(2).Index
       
            If (indx >= indx1) Then
            Application.ActiveWindow.Page.Shapes.ItemFromID(1).bringtofront
            shp.Cells("User.Index").Formula = indx
            End If

            If (indx >= indx2) Then
            Application.ActiveWindow.Page.Shapes.ItemFromID(2).bringtofront
            shp.Cells("User.Index").Formula = indx
            End If
           
    End If
   
Next shp

End Sub

Содержимое спрятано под спойлер ↓
Спойлер:
Вложение:
bringtofront.gif
bringtofront.gif [ 565.26 Кб | Просмотров: 425 ]


Вложения:
bringtofront.vsd [36.5 Кб]
Скачиваний: 44

_________________
Группа в VK Фигуры электрики для Visio
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса при перемещение фигуры на перед./зад. план
СообщениеДобавлено: 02 июл 2022, 09:59 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Сделал такой макрос. 2 треугольника должны быть всегда на переднем плане относительно квадрата.

Уточнение. Нужно, чтобы макрос работал или чтобы треугольники были всегда впереди квадрата? Это разные цели.
Вторая очень легко решается без макроса. Только с помощью DisplayLevel. Он для этого и создан.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса при перемещение фигуры на перед./зад. план
СообщениеДобавлено: 02 июл 2022, 14:41 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Первая задача тоже решается, но несколько сложнее.
До оптимизации я не добрался, но принцип вроде работает.
Причина отказа при многократном нажатии скорее всего в том, что Visio очень долго выполняет перестановку шейпов. И во время перестановки оператор успевает нажать на кнопку еще раз. А некоторые шейпы уже переставлены. Но и предыдущий процесс не закончен.
Я предлагаю просто запустить макрос несколько раз. Для этого делаем следующее:
Если макрос почувствовал, что что-то нужно переставить, то начинаем отслеживать событие NoEventsPending. Причем отслеживаем его 3 раза, а потом уничтожаем переменную Dim WithEvents a As Visio.Application.
Код:
Dim WithEvents a As Visio.Application
Dim PendCount As Integer
Sub SetA()
    PendCount = 3
    Set a = ActiveDocument.Application
End Sub
Private Sub a_NoEventsPending(ByVal app As IVApplication)
    Debug.Print "Pending " & Timer()
    If PendCount > 0 Then
        PendCount = PendCount - 1
        Module1.ttt
    Else
        Set a = Nothing
    End If
End Sub

А если макрос видит, что перестановка не нужна, то он не обращается к Sub SetA() и тем самым не ставит процесс на счетчик.
То есть все должно быстро вертеться до тех пор, пока порядок не станет нормальным.
По ходу экспериментов я разделил макрос на две части - проверка и исполнение. Но скорее всего можно обойтись и без этого. Код макроса:
Код:
Public Col As Collection
Sub ttt()
Dim shp As Visio.Shape
'On Error Resume Next

For Each shp In Application.ActiveWindow.Selection


    If shp.CellExists("User.Index", 0) <> 0 Then
        Set Col = New Collection
        indx = shp.Index
        Col.Add shp
        indx1 = Application.ActivePage.Shapes.ItemFromID(1).Index
        indx2 = Application.ActivePage.Shapes.ItemFromID(2).Index
        Debug.Print "before " & CStr(shp.Index) & _
            " " & CStr(ActivePage.Shapes.ItemFromID(1).Index) & _
            " " & CStr(ActivePage.Shapes.ItemFromID(2).Index)
       
            If (indx >= indx1) Then
            s = Timer()
            Col.Add Application.ActiveWindow.Page.Shapes.ItemFromID(1)
            'Application.ActiveWindow.Page.Shapes.ItemFromID(1).bringtofront
            'shp.Cells("User.Index").Formula = indx
            Debug.Print s & " " & Timer()
            End If

            If (indx >= indx2) Then
            s = Timer()
            Col.Add Application.ActiveWindow.Page.Shapes.ItemFromID(2)
            'Application.ActiveWindow.Page.Shapes.ItemFromID(2).bringtofront
            'shp.Cells("User.Index").Formula = indx
            Debug.Print s & " " & Timer()
            End If
       
        Debug.Print "after  " & CStr(shp.Index) & _
            " " & CStr(ActivePage.Shapes.ItemFromID(1).Index) & _
            " " & CStr(ActivePage.Shapes.ItemFromID(2).Index)
           
    End If
   
Next shp

    If Col.Count > 1 Then
        ThisDocument.SetA
        tttExe
    End If
End Sub

Sub tttExe()
    If Col.Count > 1 Then
        indx = Col(1).Index
        For i = 2 To Col.Count
            Col(i).bringtofront
            Col(1).Cells("User.Index").Formula = indx
        Next
        Set Col = New Collection
    End If
End Sub

Еще раз повторю, что оптимизацией не занимался, только хотел проверить принцип.
Отладочный мусор с функцией Timer() и Debug.Print убирать не стал.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса при перемещение фигуры на перед./зад. план
СообщениеДобавлено: 02 июл 2022, 14:45 
Не в сети
Administrator

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

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


Вложения:
bringtofrontV02.vsd [44.5 Кб]
Скачиваний: 49
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса при перемещение фигуры на перед./зад. план
СообщениеДобавлено: 02 июл 2022, 15:09 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
Уточнение. Нужно, чтобы макрос работал или чтобы треугольники были всегда впереди квадрата? Это разные цели.
Вторая очень легко решается без макроса. Только с помощью DisplayLevel. Он для этого и создан.

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

_________________
Группа в VK Фигуры электрики для Visio


Последний раз редактировалось Tim Umix 02 июл 2022, 15:31, всего редактировалось 1 раз.

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

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
Файл

Спасибо.

_________________
Группа в VK Фигуры электрики для Visio


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса при перемещение фигуры на перед./зад. план
СообщениеДобавлено: 02 июл 2022, 15:31 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
да треугольники всегда должны быть на переднем плане

Так назначьте треугольникам DisplayLevel больше 0. Например 100.
При этом остальные шейпы останутся на нулевом уровне.
Все перемещения в Z-порядке действуют внутри одного уровня. Значит остальные шейпы могут перемещаться вверх-вниз, но никогда не закроют треугольники.
Треугольники тоже могут перемещаться на только между собой. На уровень меньше 100 они не полезут.
Если требуется только такой эффект, то и макросов не нужно.
Такой прием используется не часто, поэтому о нем не все знают. Обычно вообще все шейпы висят на нулевом уровне, поэтому могут перемещаться как на самый верх, так и в самый низ. То есть во всем документе один уровень.


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

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Tumanov писал(а):
Цитата:
да треугольники всегда должны быть на переднем плане

Так назначьте треугольникам DisplayLevel больше 0. Например 100.
При этом остальные шейпы останутся на нулевом уровне.
Все перемещения в Z-порядке действуют внутри одного уровня. Значит остальные шейпы могут перемещаться вверх-вниз, но никогда не закроют треугольники.
Треугольники тоже могут перемещаться на только между собой. На уровень меньше 100 они не полезут.
Если требуется только такой эффект, то и макросов не нужно.
Такой прием используется не часто, поэтому о нем не все знают. Обычно вообще все шейпы висят на нулевом уровне, поэтому могут перемещаться как на самый верх, так и в самый низ. То есть во всем документе один уровень.

Не получается, как только двигаю квадрат на передний план он закрывает треугольники и без разницы какое значение стоит в DisplayLevel.

_________________
Группа в VK Фигуры электрики для Visio


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

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

Добавить очки репутацииУменьшить очки репутации
Можно попробовать заблокировать это.
В DisplayLevel написать не 0 а GUARD(0) для прямоугольника, и не 100 а GUARD(100) для треугольника.


Вложения:
display-level.vsdx [16.79 Кб]
Скачиваний: 51

_________________
Полезные инструменты для создания диаграмм Visio:
https://unmanagedvisio.com/
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Запуск макроса при перемещение фигуры на перед./зад. план
СообщениеДобавлено: 02 июл 2022, 16:56 
Не в сети
Ветеран
Аватара пользователя

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
Можно попробовать заблокировать это.
В DisplayLevel написать не 0 а GUARD(0) для прямоугольника, и не 100 а GUARD(100) для треугольника.

Так вроде работает, но суть в том, чтобы у фигур должна остаться возможность двигаться относительно других фигур, то есть на схемы может быть много разных фигур, квадрат и треугольники могут двигаться на разные планы относительно других фигур, но при этом треугольники всегда должны быть на переднем плане относительно квадрата.

_________________
Группа в VK Фигуры электрики для Visio


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

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

Добавить очки репутацииУменьшить очки репутации
Дак оно вроде так и работает, или?

_________________
Полезные инструменты для создания диаграмм Visio:
https://unmanagedvisio.com/


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

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
Дак оно вроде так и работает, или?

Работает , но не всегда. Пример на гифке.
Содержимое спрятано под спойлер ↓
Спойлер:
Вложение:
1.gif
1.gif [ 1.32 Mб | Просмотров: 342 ]

_________________
Группа в VK Фигуры электрики для Visio


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

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

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


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

Зарегистрирован: 08 мар 2020, 00:19
Сообщений: 336
Использую Visio c: 2019
Очков репутации: 4

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

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

_________________
Группа в VK Фигуры электрики для Visio


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

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



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

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


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

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