Двойное выполнение DrawableOverrule.ViewportDraw

Автор Тема: Двойное выполнение DrawableOverrule.ViewportDraw  (Прочитано 3397 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Всем привет!

Обратил внимание, что при регенерации чертежа дважды выполняется метод DrawableOverrule.ViewportDraw().
После вызова
Код - C# [Выбрать]
  1. ed.Regen();
Я сразу попадаю в метод
Код - C# [Выбрать]
  1. DrawableOverrule.ViewportDraw()
что ожидаемо и правильно.
После этого отрабатывается метод, назначенный на событие завершения команды:
Код - C# [Выбрать]
  1. doc.CommandEnded
Этот метод отрабатывает и сразу после его завершения я снова попадаю в
Код - C# [Выбрать]
  1. DrawableOverrule.ViewportDraw()

Разве так и должно быть? Как можно обойти повторный вызов метода DrawableOverrule.ViewportDraw()?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
После этого отрабатывается метод, назначенный на событие завершения команды:
Код - C# [Выбрать]

    doc.CommandEnded
А что в этом методе? Может что-то модифицируешь в чертеже?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Чистый Автокад? Какой объект?

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

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Александр, в данном конкретном случае - нет. Для чистоты эксперимента, я сейчас закомментирую все тело этого метода и еще раз проверю.

Дмитрий, это Сивил 2018. Работаю с полилинией.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр, в данном конкретном случае - нет. Для чистоты эксперимента, я сейчас закомментирую все тело этого метода и еще раз проверю.
Возможно не в этом коде, а в каком-то другом, который тоже выполняется в одном из событий (в твоём другом коде, в коде Civil 3D, в коде другого приложения).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Закомментировал метод - изменений нет.

Возможно не в этом коде, а в каком-то другом, который тоже выполняется в одном из событий (в твоём другом коде, в коде Civil 3D, в коде другого приложения).
Я отслеживал в режиме отладки и в методе DrawableOverrule.ViewportDraw() у меня стояла точка останова и я попадал туда только после завершения метода обработки завершения команды. Как отследить выполнение других функций и методов, на которые не попасть в режиме отладки, я не знаю :(

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Как отследить выполнение других функций и методов, на которые не попасть в режиме отладки, я не знаю
Никак. Но я не понимаю в чем проблема. Ну вызывается ViewportDraw многократно. Ну и что?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Но я не понимаю в чем проблема. Ну вызывается ViewportDraw многократно. Ну и что?
Дело в том, что дважды выполняется вычерчивание объектов, и на это затрачивается в два раза больше времени, чем надо. При работе с большими объектами это очень сказывается на скорости работы с чертежом. В моем случае переключение с модели на лист или любая регенерация чертежа выполняется около 30 секунд. Для пользователей это крайне неудобно, вот и была поставлена задача оптимизировать модуль.

Отмечено как Решение Алексей Терно 13-09-2019, 18:35:31

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Дело в том, что дважды выполняется вычерчивание объектов, и на это затрачивается в два раза больше времени, чем надо.
Зачем ты их рисуешь по два раза? Отмечай у себя, что уже их нарисовал и не рисуй повторно.
P.S.: А может быть ты в DrawableOverrule.ViewportDraw модифицируешь базу и из-за этого повторно вызывается DrawableOverrule.ViewportDraw ?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
А может быть ты в DrawableOverrule.ViewportDraw модифицируешь базу и из-за этого повторно вызывается DrawableOverrule.ViewportDraw ?
Хм... убрал
Код - C# [Выбрать]
  1. polyline.RecordGraphicsModified(true);
и повторный вызов пропал

Спасибо!