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

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 13-09-2019, 13:50:29

Название: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Алексей Терно от 13-09-2019, 13:50:29
Всем привет!

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

Разве так и должно быть? Как можно обойти повторный вызов метода DrawableOverrule.ViewportDraw()?
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Александр Ривилис от 13-09-2019, 13:55:18
После этого отрабатывается метод, назначенный на событие завершения команды:
Код - C# [Выбрать]

    doc.CommandEnded
А что в этом методе? Может что-то модифицируешь в чертеже?
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Дмитрий Загорулькин от 13-09-2019, 13:55:32
Чистый Автокад? Какой объект?
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Алексей Терно от 13-09-2019, 14:10:34
Александр, в данном конкретном случае - нет. Для чистоты эксперимента, я сейчас закомментирую все тело этого метода и еще раз проверю.

Дмитрий, это Сивил 2018. Работаю с полилинией.
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Александр Ривилис от 13-09-2019, 14:12:59
Александр, в данном конкретном случае - нет. Для чистоты эксперимента, я сейчас закомментирую все тело этого метода и еще раз проверю.
Возможно не в этом коде, а в каком-то другом, который тоже выполняется в одном из событий (в твоём другом коде, в коде Civil 3D, в коде другого приложения).
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Алексей Терно от 13-09-2019, 14:21:55
Закомментировал метод - изменений нет.

Возможно не в этом коде, а в каком-то другом, который тоже выполняется в одном из событий (в твоём другом коде, в коде Civil 3D, в коде другого приложения).
Я отслеживал в режиме отладки и в методе DrawableOverrule.ViewportDraw() у меня стояла точка останова и я попадал туда только после завершения метода обработки завершения команды. Как отследить выполнение других функций и методов, на которые не попасть в режиме отладки, я не знаю :(
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Александр Ривилис от 13-09-2019, 14:23:44
Как отследить выполнение других функций и методов, на которые не попасть в режиме отладки, я не знаю
Никак. Но я не понимаю в чем проблема. Ну вызывается ViewportDraw многократно. Ну и что?
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Алексей Терно от 13-09-2019, 14:33:57
Но я не понимаю в чем проблема. Ну вызывается ViewportDraw многократно. Ну и что?
Дело в том, что дважды выполняется вычерчивание объектов, и на это затрачивается в два раза больше времени, чем надо. При работе с большими объектами это очень сказывается на скорости работы с чертежом. В моем случае переключение с модели на лист или любая регенерация чертежа выполняется около 30 секунд. Для пользователей это крайне неудобно, вот и была поставлена задача оптимизировать модуль.
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Александр Ривилис от 13-09-2019, 14:35:12
Дело в том, что дважды выполняется вычерчивание объектов, и на это затрачивается в два раза больше времени, чем надо.
Зачем ты их рисуешь по два раза? Отмечай у себя, что уже их нарисовал и не рисуй повторно.
P.S.: А может быть ты в DrawableOverrule.ViewportDraw модифицируешь базу и из-за этого повторно вызывается DrawableOverrule.ViewportDraw ?
Название: Re: Двойное выполнение DrawableOverrule.ViewportDraw
Отправлено: Алексей Терно от 13-09-2019, 18:35:26
А может быть ты в DrawableOverrule.ViewportDraw модифицируешь базу и из-за этого повторно вызывается DrawableOverrule.ViewportDraw ?
Хм... убрал
Код - C# [Выбрать]
  1. polyline.RecordGraphicsModified(true);
и повторный вызов пропал

Спасибо!