Сообщество программистов Autodesk в СНГ
ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 16-06-2018, 10:56:28
-
Здравствуйте!
Вопрос по срабатыванию события. Есть команда которая создает и вставляет блок к чертеж. Нужно реализовать сценарий в котором при событии удаления/добавления этого блока запускается перенумерация оставшихся в чертеже блоков. Удаление/добавление блока происходит в произвольной последовательности. Т.е. было пять блоков, удален третий из последовательности, оставшиеся два (четвертый и пятый) должны быть перенумерованы и новые значения должны быть вставлены в атрибуты каждого из блоков.
Вопрос - как я понимаю, события и их подписчики отрабатывают в пределах команд где они записаны, но если команда не вызвана то информация о наступлении события к подписчику не придет. То есть нужно написать команду которая стартует одновременно с открытием чертежа, все время сессии висит в фоне и обеспечивает передачу информации о наступлении события к подписчикам? Или все устроено иначе?
-
Да, в общих чертах именно так. Где-то в сети даже были примеры такой реализации нумераторов.
-
То есть нужно написать команду которая стартует одновременно с открытием чертежа, все время сессии висит в фоне и обеспечивает передачу информации о наступлении события к подписчикам? Или все устроено иначе?
Нет. Команда - это команда, событие - это событие.
-
В общем-то да
То есть нужно написать команду которая стартует одновременно с открытием чертежа, все время сессии висит в фоне и обеспечивает передачу информации о наступлении события к подписчикам?
В фоне будет висеть не команда, а обработчики событий. Но, в целом, идея верная.
-
В фоне будет висеть не команда, а обработчики событий.
Глупый вопрос, но все же... Как обработчики окажутся в фоне и кто их запускает, если я пишу их внутри своей dll, а ее я запускаю сам и только руками(как lisp в автозагрузку ее не привязать)?
-
Есть механизм автозагрузки приложений с помощью Bundle пакета. Или если старая версия AutoCAD, то с помощью записи в реестре. В конце концов, можно и с помощью лиспа грузить свою dll.
-
автозагрузки приложений с помощью Bundle пакета.
То есть обработчики в фоне должен запустить все-таки я с помощью отдельной dll, загруженной до применения команд, где они участвуют, одним из приведенных Вами способов?
-
Не с помощью отдельной 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
-
Следует также учесть то, что не во всех обработчиках событий можно работать с базой данных (в плане её модификации). Т.е. в обработчике события добавления в базу нельзя выполнять "перенумерацию блоков". Это следует выполнить в каком-то другом событии.
-
Спасибо, попробую разобраться с Bundle-пакетом.
-
Или если старая версия AutoCAD, то с помощью записи в реестре
Т.е., вы хотите сказать, что через реестр это устаревший вариант?
-
Т.е., вы хотите сказать, что через реестр это устаревший вариант?
Дмитрий Загорулькин хочет сказать, что bundle работает начиная с AutoCAD 2012. Так что для более старых версий нужно писать в реестр.