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

Форум по вопросам применения и программирования в Visio
Текущее время: 29 мар 2024, 03:55

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


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


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

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



Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Очередь выполнения макросов
СообщениеДобавлено: 12 июн 2019, 10:28 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Добрый день! Эта тема мною уже поднималась viewtopic.php?f=6&t=1437. Если нужно, то можно их объединить. Задача как и прежде. Есть одинаковые шейпы. У каждого шейпа есть данные "Позиция" и "Место", которые являются идентификатором для шейпа. В каждом шейпе есть ячейка которая вызывает макрос по определённому условию (изменению позиции и места) с помощью функции CALLTHIS. Макрос смотрит, есть ли ячейка в Документе с именем Позиция_Место, если нет, то нужно её создать, иначе выполнить другие функции. Вообщем всю логику расписывать не буду, так как это не предмет разговора, да и она работает как надо. Проблемы возникают когда за один раз меняю много шейпов (например у всех шейпов изменил место). При таком раскладе обрабатываются не все шейпы. Из прошлого поста было предположение что это похоже на переполнение очереди. Однако следует отметить, что в зависимости от сложности макроса (читай времени выполнения) меняется число обработанных шейпов, что наводит на мысль, что это как-то связано со временем, а не с количеством.
Вопрос в следующем, где можно почитать про это ограничение и как с ним бороться.
Я понимаю, что такая реализация выглядит, мягко сказать, кривой, и что лучше написать какой-то макрос, который будет перебирать все шейпы и делать то что нужно. Но мне нужен именно такой подход, как я описал. И если честно то я не вижу в чём разница если я массово изменю кучу шейпов (без CALLTHIS и макросов), то все формулы сработают как надо, а вот если с макросом, то вступает какое-то ограничение.
Прилагаю файл для примера. На странице "2" есть 400 абсолютно одинаковых шейпа. Для моделирования ситуации можно просто переименовать эту страницу. В ShapSheet документа в ячейке Prop.UZ2_BOX2.Prompt должна наполниться строка по типу гиперссылок 2/Sheet.1;2/Sheet.2 и т.д. для всех шейпов страницы. Но их получается у меня 138 (проверял через Excel - делил текст по разделителю ";")


Вложения:
Example.vsdm [152.48 Кб]
Скачиваний: 121
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 12 июн 2019, 11:03 
Не в сети
Administrator

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

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

За много лет никогда об таком не слышал. Скорее всего по этому вопросу ответов не будет.
Цитата:
И если честно то я не вижу в чём разница если я массово изменю кучу шейпов (без CALLTHIS и макросов), то все формулы сработают как надо, а вот если с макросом, то вступает какое-то ограничение.

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


Вложения:
chain.gif
chain.gif [ 131.96 Кб | Просмотров: 594 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 12 июн 2019, 11:30 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

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

Наверное стоит задать этот вопрос в Microsoft, может они разъяснят.
Если кто знает куда писать, подскажите пожалуйста.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 12 июн 2019, 11:35 
Не в сети
Administrator

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

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


Вложения:
Cap.JPG
Cap.JPG [ 42.18 Кб | Просмотров: 581 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 12 июн 2019, 11:37 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

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

Странно у меня такого не было. Пойду гуглить что такое stack space


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

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

Добавить очки репутацииУменьшить очки репутации
DoEvents кажется решает проблему.
Просто добавть в test и test3 перед End Sub:
Код:
  ...
   DoEvents
End Sub

Не уверен что именно ты пытаешься сделать, но формулы в ШШ выглядят достаточно безумно - зачем так мучить Visio (вызвать VBA для получения значений ячеек - плохая идея) :mrgreen:

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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 18 июн 2019, 08:33 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
nbelyh
Спасибо за ответы во всех моих трех связанных постах. Но в моём случае DoEvents никак не повлияло на поведение. В Visio Professional 2016 (и 2019) просто не обрабатываются все шейпы, а в Visio 2016 Standart вылазит ошибка "Out of Stack Space"


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

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

Добавить очки репутацииУменьшить очки репутации
Я пробовал на 2010 - с DoEvents переполнения стека не стало. Проверю у себя на 2019.

Может проблема быть вызвана тем, что ты модифицируешь ячейки шейпа из функции, которая сама используется для вычисления значения ячейки шейпа (в ШШ)?
Похоже это может вызывать зацикливание в пересчете ячеек. Но может быть я и не прав.

Может быть можно сделать то, что ты делаешь, как-то по-другому, без вызова кода VBA для вычисления значения ячейки?
Или не менять в этом макросе другие ячейки? Я посмотрел по истории сообщений, но не нашел исходного, где было бы написано, для чего это нужно.

Кажется просто обновляешь данные фигур из Excel?
Есть какая-то причина делать не так, как обычно это делают, то есть, синхронизовать с "внешним" Excel файлом, встроенными средствами Visio ("Связь с данными")?
Встроенные средства как правило быстрее и удобнее

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


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

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Модифицируются только ячейки Документа. Смысл в том, у шейпа есть позиция и место, вмести они дают однозначное описание (читай идентификатор). В документе должна быть ячейка со свойством Prop.Позиция_Место. Если её нет, то макрос должен создать её, если больше нет шейпов в документе с подобной комбинацией позиции и места, то макрос должен удалить эту строку из Документа.
То есть макрос запуститься только при изменении Позиции, Места или переименовании Страницы


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

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

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


Данные уже обновляю не из Excel. Раньше планировал делать так, но там тоже очень много подводных камней. Одна из проблем - очень часто приходилось бы нажимать обновить данные, что бы происходила синхронизация на всех листах. А когда данных много (а их будет много), то процесс этот не быстрый, так как обновляются все данные глобально, а не отдельная, изменившаяся строка данных. Поэтому решил сделать более "реактивный" подход. Каждый объект имеет свою позицию и место. В документе для каждой комбинации позиции и места есть строка данных с разделителями. С помощью сложных формул с Index, Substitute и SetAtRef идёт связь между всеми элементами с одинаковыми позицией и местом


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

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

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

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


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

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
Позиция - это позиционное обозначение прибора/аппарата, например SF1
Место - это место установки этого прибора, например шкаф ШУ1
Документ - имеется ввиду ShapSheet Документа.
Допустим есть строка в Документе Prop.UZ2_BOX2 - которая содержит данные для блока питания с позицией UZ2, который расположен в BOX2
Данные, допустим выглядят ╎D1╎5╎D2╎Блок питания╎ - Тег D1 имеет значение 5, ТЕГ D2 имеет значение Блок питания.
На разных листах есть шейпы у которых Позиция равна UZ2 и место равно BOX2. Также эти шейпы содержат данные с ТЕГами D1 и D2.
В каждом поле с данным забита формула вида:
Код:
=INDEX(SUBSTITUTE(LOOKUP(Prop.Row_1.Label,User.DataLine,User.DEL),-1,-2)+1,SETATREF(User.DataLine,
SETATREFEVAL(SUBSTITUTE(User.DataLine,User.DEL&Prop.Row_1.Label&User.DEL&
INDEX(SUBSTITUTE(LOOKUP(Prop.Row_1.Label,User.DataLine,User.DEL),-1,-2)*1+1,
User.DataLine,User.DEL,"Err")&User.DEL,User.DEL&Prop.Row_1.Label&User.DEL&SETATREFEXPR("5")&User.DEL))),User.DEL,"Err")

Эта формула обеспечивает двустороннюю связь с между всеми объектами с одинаковой позицией и местом установки.
Таким образом, если в Документе нет нужной строки при изменении позиции или места у любого шейпа, то нужно её создать.
Когда делаешь это для небольшого кол-ва шейпов, то всё работает как надо. Но когда выделил кучу шейпов и изменил у них, допустим место, то возникают описанные выше проблемы


Последний раз редактировалось Machestro 18 июн 2019, 10:53, всего редактировалось 1 раз.

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

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
Позиция - это позиционное обозначение прибора/аппарата, например SF1
Место - это место установки этого прибора, например шкаф ШУ1

Я имел в виду, что вообще система делает? Я так понял, есть оборудование (приборы), у них есть маркировка (код), который называется "позиция", есть шкафы, в которых это оборудование расположено, и для каждого прибора задается шкаф (место). Также у приборов могут быть дополнительные данные (D1, D2), такие как название например.
Правильно?

А что должен делать документ Visio (то есть, для чего тут Visio?) Графически показывает что в каком шкафу находится? Ведет учет оборудования? Генерирует отчеты?

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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 18 июн 2019, 10:32 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

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


В целом правильно. Visio будет использоваться для электрических схем. Нужен двусторонний обмен данными между всеми элементами на всех страницах (такое на моем опыте умеет только visio и Revit). Подобная система будет также применена для электрических контактов (нужно синхронизировать номера проводов и др. данных). Но контакты будут иметь свой идентификатор Позиция_Место_НомерКонтакта.


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 18 июн 2019, 10:53 
Не в сети
Administrator

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

Добавить очки репутацииУменьшить очки репутации
Цитата:
А что должен делать документ Visio (то есть, для чего тут Visio?) Графически показывает что в каком шкафу находится? Ведет учет оборудования? Генерирует отчеты?

Цитата:
В целом правильно. Visio будет использоваться для электрических схем. Нужен двусторонний обмен

Пример различия в подходе айтишника и инженера. Одному для решения задачи нужен весь облик системы, второй сосредотачивается на конкретике. Типичная проблема при отсутствии системщиков в проекте.
Помнится, еще в совсем древних версиях Visio для иллюстрации синхронизации документа с источником данных предлагалась "система бронирования мест в кинотеатре". Вот пример системного подхода. Потом шли ниже и добирались до мелочей - какие данные куда и по каким событиям передаются.
В обсуждаемом решении видно, что попытки что-то подправить на нижнем уровне не получаются. Везде встречаются трудности. А подсказать другой подход никто не может, потому как глобальная задача не показана, неизвестна.


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

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

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

Извиняюсь если задаю тупые вопросы. Просто хотелось бы прояснить общую картину, возможно удастся найти альтернативное решение.

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


Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Очередь выполнения макросов
СообщениеДобавлено: 18 июн 2019, 12:13 
Не в сети
Постоянный участник

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
nbelyh писал(а):
То есть, если допустим я меняю для прибора номер шкафа, он должен поменяться во всех местах (на всех страницах), где этот прибор присутствует.?


Не совсем так. Но такой вариант тоже нужен будет, но его отдельно буду решать. Сейчас его не рассматриваю
Допустим на одном листе я создал шейп с определённой позицей и местом. Он содержит данные, и эти данные есть в ShapeSheet документа.
Затем на другом листе я вытаскиваю новый шейп из набора элементов - у него пока позиция и место пустые. Допустим я задаю ему позицию и место как у шейпа с первого листа, тогда он должен подхватить все данные из того шейпа (в моей реализации это будет строка данных из ShapeSheet документа, так как она является источником данных). Теперь у этих шейпов есть двусторонняя связь между всеми данными, кроме позиции и места.
Допустим я захотел поменять позицию у одного шейпа - система должна сработать следующим образом:
1. Если уже есть прибор с такой же комбинацией позиции и места, то просто взять данные из него и установить двустороннюю связь
2. Если нет таких шейпов, то нужно создать в ShapeSheet Документа строку с этой комбинацией Позиции и Места. Засунуть в него строку данных и создать в шейпе связь между данными и строкой документа.
3. Так же нужно отслеживать если шейп был последним с уникальной комбинацией позиции и места, и мы у него изменили или позицию или место, то есть в документе больше нет такой комбинации, а в ShapeSheet документа строка осталась, то её нужно удалить.

Повторюсь, что всё работает как я и задумал, за исключением, когда я меняю много шейпов сразу, так как они все сразу пытаются вызвать макрос через CallThis


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

Зарегистрирован: 16 окт 2016, 12:41
Сообщений: 99
Использую Visio c: 2016
Очков репутации: 4

Добавить очки репутацииУменьшить очки репутации
И да решение для массового изменения шейпов я думаю что нашёл, о чём написал в теме viewtopic.php?f=6&t=1471. Осталось только проверить


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

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

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


Вложения:
s400.gif
s400.gif [ 330.8 Кб | Просмотров: 475 ]
Events.png
Events.png [ 41.27 Кб | Просмотров: 473 ]
Пожаловаться на это сообщение
Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

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



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

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


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

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