Тормозит видовой экран при использовании DrawJig

Автор Тема: Тормозит видовой экран при использовании DrawJig  (Прочитано 8652 раз)

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

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

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Всем привет. Столкнулся с проблемкой, буду признателен за помощь! Суть такова..
После выделения рамки в модели, плагин отправляет пользователя в лист, где необходимо указать точку вставки данного вьюпорта, ну и, конечно же, хочется, чтобы сам видовой экран "бегал за курсором", причем не просто рамка, а целиком. Так вот в этот момент и проявляются тормоза, если перетаскивать быстро (см. скринкаст). Забавно еще и то, что эффект "оставшейся рамки" наблюдается при нажатии на колесико (не знаю даже, как более точно объяснить)..

Не могу понять, в чем дело.
Есть догадки, что это связано с моим WorldDraw (возможно, не совсем корректно так обращаться к видовому экрану, как это сделал я, хотя применительно к блокам такой подход очень даже работает):
Код - C# [Выбрать]
  1. protected override bool WorldDraw(Autodesk.AutoCAD.GraphicsInterface.WorldDraw draw)
  2. {
  3.     try
  4.     {
  5.         var vPort = (Viewport)_vpRecId.GetObject(OpenMode.ForRead);
  6.         vPort.CenterPoint = new Point3d(_pt.X + _width / 2, _pt.Y + _height / 2, 0);
  7.         draw.Geometry.Draw(vPort);
  8.         return true;
  9.     }
  10.     catch (Exception)
  11.     {
  12.         return false;
  13.     }
  14. }

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

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
А не закешировать-ли vPort?

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Из каких соображений ты возвращаешь false при exception?
На всякий случай. Когда делал, не думал, что получится контролировать таким образом viewport.
И что у тебя в ViewportDraw?
Очень хороший вопрос. :)
Я читал в документации, что

Но решил, что это не мой случай. На решение повлияло еще и то, что я просто не понимаю, где он должен быть и какую конструкцию иметь.


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если честно, то я бы не парился и таскал бы прямоугольник (или какая-там форма у этого Viewport). В любом случае будут тормоза. Зависит от кучу факторов.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Максим Маркевич 15-11-2016, 23:06:57

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
А не закешировать-ли vPort?
Программно?
Код - C# [Выбрать]
  1. vPort.UpdateDisplay();
Так?
Если честно, то я бы не парился и таскал бы прямоугольник (или какая-там форма у этого Viewport). В любом случае будут тормоза. Зависит от кучу факторов.
Я бы тоже не парился, но не могу успокоиться.. Терзает меня и терзает! (

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Скорее всего будет еще больше тормозить. Смысл в том, что AutoCAD не успевает прорисовать содержимое ViewPort'а. Можешь изменить (увеличить) дельту на перемещение (т.е. расстояние между текущей точкой и предыдущей) когда перерисовывается ViewPort.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Скорее всего будет еще больше тормозить. Смысл в том, что AutoCAD не успевает прорисовать содержимое ViewPort'а.
Кстатии.. Стало просто замечательно!!

Исчезает сама рамка видового экрана, но это совсем не проблема, сейчас допишу какую-то мифическую рамку просто чтобы была:
Код - C# [Выбрать]
  1. Point3dCollection pts = new Point3dCollection();
  2. pts.Add(_pt);
  3. pts.Add(_pt + new Vector3d(_width, 0, 0));
  4. pts.Add(_pt + new Vector3d(_width, _height, 0));
  5. pts.Add(_pt + new Vector3d(0, _height, 0));
  6. pts.Add(_pt);
  7. draw.Geometry.Polygon(pts);
В общем, я доволен как слон, который после купания  :D
Хотя, конечно, хотелось бы понять, как такое произошло? )
Можешь изменить (увеличить) дельту на перемещение (т.е. расстояние между текущей точкой и предыдущей) когда перерисовывается ViewPort.
Я не совсем понимаю, как можно менять эту самую "дельту"?

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Если что-то тормозит три первых правила:
что можно закешировать;
что можно индексировать;
как убрать "каждый к каждому".
Что-бы что-то из этого найти - надо смотреть на программу "над кодом".

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: Александр Ривилис от 15-11-2016, 21:28:44

    Можешь изменить (увеличить) дельту на перемещение (т.е. расстояние между текущей точкой и предыдущей) когда перерисовывается ViewPort.

Я не совсем понимаю, как можно менять эту самую "дельту"?
Посмотри в этом примере: http://adn-cis.org/forum/index.php?topic=7167.msg21053#msg21053
Там есть такой фрагмент кода, когда принимается решение о перерисовке:
Код - C# [Выбрать]
  1.  if (CursorHasMoved())
  2.       {
  3.         _prevPoint = _currPoint;
  4.         return SamplerStatus.OK;
  5.       }
  6.       return SamplerStatus.NoChange;
  7.  
И метод CursorHasMoved:
Код - C# [Выбрать]
  1.   private bool CursorHasMoved()
  2.   {
  3.     return _currPoint.DistanceTo(_prevPoint) > Tolerance.Global.EqualPoint;
  4.   }
Так вот изменение Tolerance.Global.EqualPoint на 0.1 или даже на 1.0 даёт часто очень положительный результат даже на очень слабых PC.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
что можно индексировать;
как убрать "каждый к каждому".
Что-бы что-то из этого найти - надо смотреть на программу "над кодом".
Если бы Вы еще и пояснили вот эти строчки, то было бы просто замечательно! )
Посмотри в этом примере: http://adn-cis.org/forum/index.php?topic=7167.msg21053#msg21053
Спасибо большое, разберусь.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Если бы Вы еще и пояснили вот эти строчки, то было бы просто замечательно!
Боюсь запутаю еще больше. Я уверен, учитывая Вашу динамику, очень скоро подобные строки не будут вызывать вопросов - а может и еще пару строк добавите.