Событие активации чертежа

Автор Тема: Событие активации чертежа  (Прочитано 5889 раз)

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Решил одну проблему и получил новую )

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

Я пробовал события Application.DocumentManager.DocumentToBeActivated и Application.DocumentManager.DocumentBecameCurrent, но они так же наступают после Overrule. Есть ли какое-нибудь событие, наступающее до переопределений, чтобы я мог получить базу данных активного чертежа?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие активации чертежа
« Ответ #1 : 29-04-2019, 20:34:30 »
Я пробовал события Application.DocumentManager.DocumentToBeActivated и Application.DocumentManager.DocumentBecameCurrent, но они так же наступают после Overrule. Есть ли какое-нибудь событие, наступающее до переопределений, чтобы я мог получить базу данных активного чертежа?
Странно это очень. О каком именно Overrule идёт речь?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Событие активации чертежа
« Ответ #2 : 29-04-2019, 20:40:33 »
О каком именно Overrule идёт речь?
DrawableOverrule

В событиях DocumentActivated, DocumentToBeActivated и DocumentBecameCurrent я первой строчкой я написал вывод простого сообщения (точку останва тоже ставил), но до этой строчки дело не доходит - сразу фатальная ошибка. В режиме отладки, нажав на пузу, я попадаю на строчку в своем методе получения графики, который срабатывает как раз в DrawableOverrule.ViewportDraw().

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Событие активации чертежа
« Ответ #3 : 29-04-2019, 20:56:50 »
я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов
Я сделал проверку времени работы цикла из 1000 итераций этой функции. Вот результаты нескольких тестов, которые проводились подряд, один за другим:
63, 78, 96, 106, 62, 63, 61, 67, 61 - это время в миллисекундах.

В принципе, время работ приемлемое, но очень странный разброс от 106 до 61 мс, почти в два раза.

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Событие активации чертежа
« Ответ #4 : 30-04-2019, 14:42:02 »
В принципе, время работ приемлемое, но очень странный разброс от 106 до 61 мс, почти в два раза.
Это работа в мультизадачной среде, так что ничего удивительного.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие активации чертежа
« Ответ #5 : 30-04-2019, 15:11:01 »
И получается, что когда я переключаюсь на другой чертеж, вначале подхватываются все Overrule и назначаются слои, а эти слои были определены в предыдущем чертеже. Есть, конечно, вариант засунут эту функцию поиска слоев в сам метод получения пользовательской графики, но я боюсь, что это может увеличить работу модуля, если в чертеже будет создано несколько сотен или тысяч объектов.
Можно же просто проверять - принадлежит ли ObjectId текущему чертежу. Если нет - то создать/найти слои в текущем чертеже и перезаписать переменные.
Вообще, мне не сильно нравится подход, когда такое возможно - обращение к ObjectId объектов из другого чертежа. Я бы сделал какой-то словарь, типа: Dictionary<Database, ObjectId[]> искал бы текущую БД в нём и соответствующие Id слоёв. Если нет такой БД в словаре - добавляем при первом обращении. Надеюсь, понятно описал?

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Событие активации чертежа
« Ответ #6 : 30-04-2019, 15:16:01 »
искал бы текущую БД в нём и соответствующие Id слоёв
Изначально так и задумывалось. Вопрос, в какой момент искать текущую БД?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Re: Событие активации чертежа
« Ответ #7 : 30-04-2019, 15:20:00 »
В тот момент, когда нужны слои. По принципу отложенной инициализации.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Re: Событие активации чертежа
« Ответ #8 : 30-04-2019, 15:32:27 »
В тот момент, когда нужны слои. По принципу отложенной инициализации.
Именно так я и сделал, но изначально хотел один раз при активации чертежа.