Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 29-04-2019, 20:26:34

Название: Событие активации чертежа
Отправлено: Алексей Терно от 29-04-2019, 20:26:34
Решил одну проблему и получил новую )

Мой модуль создает слои и помещает на эти слои всю пользовательскую графику. Для этого я создал функцию, которая ищет слои, созданные модулем, и запоминает их ID, которые потом присваиваются создаваемым примитивам. Эту функцию я поместил, в том числе, и в событие Application.DocumentManager.DocumentActivated, но оно, по всей видимости, наступает после обработки всех Overrule. И получается, что когда я переключаюсь на другой чертеж, вначале подхватываются все Overrule и назначаются слои, а эти слои были определены в предыдущем чертеже. Есть, конечно, вариант засунут эту функцию поиска слоев в сам метод получения пользовательской графики, но я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов.

Я пробовал события Application.DocumentManager.DocumentToBeActivated и Application.DocumentManager.DocumentBecameCurrent, но они так же наступают после Overrule. Есть ли какое-нибудь событие, наступающее до переопределений, чтобы я мог получить базу данных активного чертежа?
Название: Re: Событие активации чертежа
Отправлено: Александр Ривилис от 29-04-2019, 20:34:30
Я пробовал события Application.DocumentManager.DocumentToBeActivated и Application.DocumentManager.DocumentBecameCurrent, но они так же наступают после Overrule. Есть ли какое-нибудь событие, наступающее до переопределений, чтобы я мог получить базу данных активного чертежа?
Странно это очень. О каком именно Overrule идёт речь?
Название: Re: Событие активации чертежа
Отправлено: Алексей Терно от 29-04-2019, 20:40:33
О каком именно Overrule идёт речь?
DrawableOverrule

В событиях DocumentActivated, DocumentToBeActivated и DocumentBecameCurrent я первой строчкой я написал вывод простого сообщения (точку останва тоже ставил), но до этой строчки дело не доходит - сразу фатальная ошибка. В режиме отладки, нажав на пузу, я попадаю на строчку в своем методе получения графики, который срабатывает как раз в DrawableOverrule.ViewportDraw().
Название: Re: Событие активации чертежа
Отправлено: Алексей Терно от 29-04-2019, 20:56:50
я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов
Я сделал проверку времени работы цикла из 1000 итераций этой функции. Вот результаты нескольких тестов, которые проводились подряд, один за другим:
63, 78, 96, 106, 62, 63, 61, 67, 61 - это время в миллисекундах.

В принципе, время работ приемлемое, но очень странный разброс от 106 до 61 мс, почти в два раза.
Название: Re: Событие активации чертежа
Отправлено: Александр Ривилис от 30-04-2019, 14:42:02
В принципе, время работ приемлемое, но очень странный разброс от 106 до 61 мс, почти в два раза.
Это работа в мультизадачной среде, так что ничего удивительного.
Название: Re: Событие активации чертежа
Отправлено: Дмитрий Загорулькин от 30-04-2019, 15:11:01
И получается, что когда я переключаюсь на другой чертеж, вначале подхватываются все Overrule и назначаются слои, а эти слои были определены в предыдущем чертеже. Есть, конечно, вариант засунут эту функцию поиска слоев в сам метод получения пользовательской графики, но я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов.
Можно же просто проверять - принадлежит ли ObjectId текущему чертежу. Если нет - то создать/найти слои в текущем чертеже и перезаписать переменные.
Вообще, мне не сильно нравится подход, когда такое возможно - обращение к ObjectId объектов из другого чертежа. Я бы сделал какой-то словарь, типа: Dictionary<Database, ObjectId[]> искал бы текущую БД в нём и соответствующие Id слоёв. Если нет такой БД в словаре - добавляем при первом обращении. Надеюсь, понятно описал?
Название: Re: Событие активации чертежа
Отправлено: Алексей Терно от 30-04-2019, 15:16:01
искал бы текущую БД в нём и соответствующие Id слоёв
Изначально так и задумывалось. Вопрос, в какой момент искать текущую БД?
Название: Re: Событие активации чертежа
Отправлено: Дмитрий Загорулькин от 30-04-2019, 15:20:00
В тот момент, когда нужны слои. По принципу отложенной инициализации.
Название: Re: Событие активации чертежа
Отправлено: Алексей Терно от 30-04-2019, 15:32:27
В тот момент, когда нужны слои. По принципу отложенной инициализации.
Именно так я и сделал, но изначально хотел один раз при активации чертежа.