Читаю данные не сразу в ObjectModified, а позже из AcadApp_Idle. Но это не помогает. Idle вызывается мгновенно после ObjectModified, пользователь еще не кликнул на нужном слое.Читай в DocumentCollection.DocumentLockModeChanged
Вопрос в том как проигнорировать именно такие "временные" модификации объектов?А что в объекте модифицируется, если слой ещё не был задан? Почему у него вызывается событие модификации? Возможно, это модифицируется другой объект? И если так, то почему это обрабатывает кастомная палитра?
А что в объекте модифицируется, если слой ещё не был задан?Когда пользователь выбирает цвет/слой из списка, то модифицируется цвет/слой. Объект - тот самый, что выбран в чертеже и в панели свойств. Событие модификации вызывается потому что он в самом деле модифицируется, меняет цвет "на лету", без клика по конкретному слою - такая вот фича в Автокад (в клонах такого нет).
в частности некую команду PREVIEW_END до первой смены слоя и команду #PREVIEW_END, когда пользователь таки кликнет цвет/слой.У меня такого нет. Более того нет вызова ObjectModified при движении по списку. Только после выбора пользователем:
[Doc Event] : Implied Selection Changed
Command:
[Doc Mgr Event] : Document Lock Mode Will Change : Drawing1.dwg
Global Command Name :
Current Mode : NotLocked
My Current Mode : NotLocked
My New Mode : ProtectedAutoWrite
[Doc Mgr Event] : Document Lock Mode Changed : Drawing1.dwg
Global Command Name :
Current Mode : ProtectedAutoWrite
My Current Mode : NotLocked
My Previous Mode : ProtectedAutoWrite
[DB Event : 712294208] : Object Opened For Modify : <Line, 291>
[DB Event : 712294208] : Object Modified : <Line, 291>
О-как :o. Гадить-то может только мой же плагин... Значит какие-то мои же обработчики событий что-то делают... буду отсекать все лишнее. Спасибо.Попробуй посмотреть без своего плагина с помощью ARXDBG/MGDDBG какие события возникают.
Проблема в том, что при перемещении курсора по списку слоёв начинается просто спам событий модификации и последующий за ними Idle.Проверил и в AutoCAD 2019.1.2 (до того проверял в AutoCAD 2020) - и с Property Preview включенном и выключенном - только одно событие Database.ObjectModified показывает MGDDBG.
А вот MGDDBG в командную строку ничего не пишет, как будто событий не происходит.Я думаю просто потому, что в этот момент невозможен вывод в комстроку. Я посмотрел исходники MGDDBG, там просто вывод данных в комстроку при наступлении события, никаких фильтров-проверок и т.п.
Из спортивного интереса отключи аппаратное ускорение видео. Возможно это как-то связано с ним.Проверил. Разницы нет
никаких фильтров-проверок и т.п.А я так надеялся...
А я так надеялся...Ну как минимум, это значит, что если сделать метод модификации в виде команды и вызывать её через Document.SendStringToExecute с правильными аргументами, то должно будет отрабатывать нормально.
вызывать её через Document.SendStringToExecute с правильными аргументамиС правильными - это с какими? эхо отключить? true, true, false - годится?
Метода модификации у меня и нет, только считывание.Тогда попробуй без транзакции или с эмуляцией транзакции.
С правильными - это с какими? эхо отключить? true, true, false - годится?Я бы запускал в данном случае со всеми false. И еще команда должна быть с флагами NoHistory (как я писал выше) | Redraw | UsePickSet
И еще команда должна быть с флагами NoHistory (как я писал выше) | Redraw | UsePickSetUsePickSet само собой, понимаю. А флаг Redraw, судя по названию, вызовет перерисовку всего чертежа? Это же на долго. Стараюсь его не писать никогда, если и так все работает.
А флаг Redraw, судя по названию, вызовет перерисовку всего чертежа?Нет конечно:
С правильными - это с какими? эхо отключить? true, true, false - годится?Я что-то вчера пробовал - никак не получилось. Если есть модификация объекта - то такое поведение в списке слоёв никак не фиксится. SendStringToExecute точно так же работает, как и прямой вызов метода из события. Видимо, они с методом Editor.WriteMessage сильно по-разному работают.
Ну хотя бы слой пользователь теперь может выбрать.А у меня с SendStringToExecute не выбирался. Видимо, как-то влияет то, что у меня не голый Автокад, а Сивил.
А у меня с SendStringToExecute не выбирался. Видимо, как-то влияет то, что у меня не голый Автокад, а Сивил.Еще интересней. Цвет линий поменять могу - просто мельтешит, как выше писал. А вот цвет граней солида - не могу, захлопывается список цветов и применяется тот цвет, который успел попасть под мышь. или старый. В общем только отключать PROPERTYPREVIEW
Думаю, надо копать в сторону определения редактирования с помощью палитры свойств и ждать когда это редактирование закончится. Но как это сделать - не представляю.Наверное так: https://adn-cis.org/forum/index.php?topic=10109.msg46193#msg46193