3. Значение "вкл/выкл" функции хранится в XData чертежа???
1. Обработка события завершения команды - запоминаем нужные объекты (примитивы)Обычно всё наоборот - в событии добавления в базу запоминают объекты, а в событии завершения команды их обрабатывают.
2. Обработка события добавления объекта в БД чертежа - запомненные объекты изменяются как мне нужно
Обычно всё наоборот - в событии добавления в базу запоминают объекты, а в событии завершения команды их обрабатываютВерно. Это я просто напутал немного ))
По коду ничего сказать не могу. Тут надо сидеть с отладчикомВот тут и самая "засада" - сидел с отладчиком не один раз. Если бы проблему можно было вызвать или хотя-бы причину возникновения...
3. Значение "вкл/выкл" функции хранится в XData чертежа
Xrecord xrecord = transaction.GetObject(at, (OpenMode)1, true) as Xrecord;Да уж. И где у тебя XData???
я даже и не знаю ЧТО перестает работатьЛучше всего добавить логгирование в файл. Или запустить автокад в режиме отладки и проверить переменные.
а не факт что документ создался, и успел стать активным, т.е. привязка произошла к активному в данный момент документу предыдущего чертежаИнтересная идея. Звучит вполне разумно - буду тестить
если и так, то что тогда делать?Скорее всего подписаться на DocumentActivated
Лучше всего Алексанра Ривилиса повыспрашивать про очередность событий документов ;-)Есть четкое правило - никогда не рассчитывать на очередность событий редактора/документов.
Есть четкое правило - никогда не рассчитывать на очередность событий редактора/документов.Т.е. сначала может для чертежа сработать DocumentActivated, а потом DocumentCreated?
Что-то я принципиальной разницы с исходным вариантом не увиделА вот принципиальная разница есть! И еще какая! Но пока все толком не протестирую - точно не скажу
Не увидел, где эти объекты создаются:Для вопроса это было не суть важно) Где они создаются - стерто
И я бы не стал для своей коллекции ObjectId использовать ObjectIdCollection. Тот же List<ObjectId> гораздо удобнее.Начинал делать это очень давно. Сейчас уже и не скажу почему взял ObjectIdCollection. Скорее от отсутствия опыта) В принципе - особо роли не играет - Linq'ом пользоваться не приходится
В общем - я человек ленивый)) И разбираться с проблемами документов мне не захотелосьнет ты трудоголик, не любящий отдыхать в выходные и не любящий спать по ночам выискивая ошибки, сделанные по лени!
Ты можешь несколько раз подписать функции, и они будут срабатывать по несколько раз.
В общем - я человек ленивый)) И разбираться с проблемами документов мне не захотелосьнет ты трудоголик, не любящий отдыхать в выходные и не любящий спать по ночам выискивая ошибки, сделанные по лени!
Ты можешь несколько раз подписать функции, и они будут срабатывать по несколько раз.
В случае, если ты попереключаешься между 2 документами туда-сюда три раза, произойдут события DocumentActivated и ты попросишь программу три раза вызывать функцию CallBack_ObjectAppended при добавлении объекта в чертеже. И в итоге получишь тормоза при добавлении объекта, и возможно сбой логики программы, в зависимости от того, что делают твои функции.Кхм....... надо потестить
...не успевал дописать, кипишь на работе. Так вотПоэтому, я всегда пишу так:
в DocumentManager_DocumentActivated() ты к примеру подписываешь
e.Document.Database.ObjectAppended += CallBack_ObjectAppended;
В случае, если ты попереключаешься между 2 документами туда-сюда три раза, произойдут события DocumentActivated и ты попросишь программу три раза вызывать функцию CallBack_ObjectAppended при добавлении объекта в чертеже. И в итоге получишь тормоза при добавлении объекта, и возможно сбой логики программы, в зависимости от того, что делают твои функции.
не ленись на событиях, их сложно отлаживать.))))
В блоки catch добавлял вывод сообщений?В том-то и дело - нужно еще найти куда этот try catch расположить! В том, коде, что я пропустил - там есть. Ошибок не возникает
В общем - так я ничего и не добился. Пробовал все различные варианты, почти все оборачивал в try catch - безрезультатно. Просто после (НЕИЗВЕСТНЫХ) действий при работе автокада перестают работать обработчики событий ДОКУМЕНТА. Помогает полное закрытие документа с последующим открытием. Никаких ошибок не ловитсяне удалось полениться?))))
Выделил два слова
- неизвестных - думал, что проблема в переключении между чертежами, но сегодня произошел сбой, а работал я только с одним чертежом
- документа - сбой происходит только в одном документе. Если перейти в другой, где активны те-же события - там работает все
Also, when running the code, when the application changes from the state of command event being handled to the state of command event handler being lost, there is no exception being raised so that the application crashes.Т.е. не только я с таким столкнулся (моя проблема и по сей день актуальна). Со временем работы в автокаде обработчики просто перестают работать. При этом не возникает Exception и понять причины - практически невозможно
При этом не возникает ExceptionException возникает, но Автокад его молча проглатывает. Надо просто найти в каком месте.
Отладкой это невозможно. Нужно придумать какой-то костыль для отлова причиныПри этом не возникает ExceptionException возникает, но Автокад его молча проглатывает. Надо просто найти в каком месте.
Возможно. Дебаг - это то еще шаманство :)Невозможно в том плане, что ошибка может проявиться через 5 минут работы или через 4 часа работы. А может вообще не проявиться. Т.е. для отладки нужно знать точные события, которые к этому приводят, чтобы их можно было повторить при отладке. А вот эти события поймать - это как-раз придумать тот самый костыль
мб спустя время кто то нашел причину?Универсальной причины нет.
и если в этом событии возникает ошибкаВ каком "этом" событии?
В каком "этом" событии?XrefBeginAttached или XrefSubCommandEnd
но вот в рабочем коде, с блоком try catch даже, с дебагером все проходит гладко от начала до конца, не попадая в блок catch, но видимо где то тихо все равно рушится и событие перестает работать(при чем метод, вызываемый из события, вне событий ошибок не выдает обычно):o
метод закомментирую - все работает (не т е обработчик не слетает)Мда... При таком объёме предоставляемой информации - могу только пожелать успехов в решении проблемы. Что комментируете, где - попробуй угадай. Всё надо вытягивать наводящими вопросами.
да в этом событии обрабатывал обновленные ссылки (выгружал например если необходимо)А ты не понимаешь, что этого делать нельзя?
Ну они же уже обновились,, действие законченно, разве не могу выгрузить?Нет. Найди другое событие для этого.
В чем криминал? Работает ж по итогуГде же работает, если ты сам пишешь что перестаёт работать. Ты уж определись как-нибудь.
Какое событие его может заменить в таком случае?Тут нужно проверять. Возможно Document.CommandEnded, возможно Application.Idle
Так законно то что а накрутил?Законно всё что работает, не разваливает AutoCAD и не конфликтует с другими сторонними приложениями. Но я бы сделал так, как написал выше ибо риск всё-равно остаётся.
Нашел статью. Обработчики статические. Поэтому наверное работает?Причина не в этом.