Вопрос по событиям

Автор Тема: Вопрос по событиям  (Прочитано 6394 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Вопрос по событиям
« : 16-06-2018, 10:56:28 »
Здравствуйте!

Вопрос по срабатыванию события. Есть команда которая создает и вставляет блок к чертеж. Нужно реализовать сценарий в котором при событии удаления/добавления этого блока запускается перенумерация оставшихся в чертеже блоков. Удаление/добавление блока происходит в произвольной последовательности. Т.е. было пять блоков, удален третий из последовательности, оставшиеся два (четвертый и пятый) должны быть перенумерованы и новые значения должны быть вставлены в атрибуты каждого из блоков.

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

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Вопрос по событиям
« Ответ #1 : 16-06-2018, 11:53:18 »
Да, в общих чертах именно так. Где-то в сети даже были примеры такой реализации нумераторов.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по событиям
« Ответ #2 : 16-06-2018, 14:36:59 »
То есть нужно написать команду которая стартует одновременно с открытием чертежа, все время сессии висит в фоне и обеспечивает передачу информации о наступлении события к подписчикам? Или все устроено иначе?
Нет. Команда - это команда, событие - это событие.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Вопрос по событиям
« Ответ #3 : 16-06-2018, 15:31:50 »
В общем-то да
То есть нужно написать команду которая стартует одновременно с открытием чертежа, все время сессии висит в фоне и обеспечивает передачу информации о наступлении события к подписчикам?
В фоне будет висеть не команда, а обработчики событий. Но, в целом, идея верная.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Вопрос по событиям
« Ответ #4 : 16-06-2018, 16:15:10 »
В фоне будет висеть не команда, а обработчики событий.
Глупый вопрос, но все же... Как обработчики окажутся в фоне и кто их запускает, если я пишу их внутри своей dll, а ее я запускаю сам и только руками(как lisp в автозагрузку ее не привязать)?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Вопрос по событиям
« Ответ #5 : 16-06-2018, 16:28:41 »
Есть механизм автозагрузки приложений с помощью Bundle пакета. Или если старая версия AutoCAD, то с помощью записи в реестре. В конце концов, можно и с помощью лиспа грузить свою dll.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Вопрос по событиям
« Ответ #6 : 16-06-2018, 16:37:52 »
автозагрузки приложений с помощью Bundle пакета.
То есть обработчики в фоне должен запустить все-таки я с помощью отдельной dll, загруженной до применения команд, где они участвуют, одним из приведенных Вами способов?

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Вопрос по событиям
« Ответ #7 : 16-06-2018, 16:51:20 »
Не с помощью отдельной DLL, а с помощью одного из механизмов автоматической загрузки приложений.
1. Bundle-пакет: http://adndevblog.typepad.com/autocad/2013/01/autodesk-autoloader-white-paper.html (где-то был перевод, но сходу не нашёл)
2. Запись в реестре или лисп: https://knowledge.autodesk.com/ru/support/autocad/learn-explore/caas/sfdcarticles/sfdcarticles/RUS/How-to-autoload-DLLs-with-AutoCAD.html

Чтобы сразу после загрузки выполнился код, который добавляет обработчики событий, следует реализовать интерфейс IExtensionApplication и в методе Initialize прописать нужные действия: http://through-the-interface.typepad.com/through_the_interface/2006/09/initialization_.html

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по событиям
« Ответ #8 : 16-06-2018, 17:09:58 »
Следует также учесть то, что не во всех обработчиках событий можно работать с базой данных (в плане её модификации). Т.е. в обработчике события добавления в базу нельзя выполнять "перенумерацию блоков". Это следует выполнить в каком-то другом событии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Вопрос по событиям
« Ответ #9 : 16-06-2018, 17:16:57 »
Спасибо, попробую разобраться с Bundle-пакетом.

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Вопрос по событиям
« Ответ #10 : 17-06-2018, 13:26:23 »
Или если старая версия AutoCAD, то с помощью записи в реестре
Т.е., вы хотите сказать, что через реестр это устаревший вариант?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Вопрос по событиям
« Ответ #11 : 17-06-2018, 14:53:58 »
Т.е., вы хотите сказать, что через реестр это устаревший вариант?
Дмитрий Загорулькин хочет сказать, что bundle работает начиная с AutoCAD 2012. Так что для более старых версий нужно писать в реестр.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение