DrawableOverrule. Проблема с метками труб и колодцев на видах профилей.

Автор Тема: DrawableOverrule. Проблема с метками труб и колодцев на видах профилей.  (Прочитано 10129 раз)

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
При перерисовке труб и колодцев столкнулся с очередной проблемой. Если выполнить полную перерисовку элемента сети на виде профиля, то теряется динамика между этим элементом и его метками. Это проявляется при изменении масштаба чертежа (что влечет за собой изменение масштаба вида профиля), при перемещении элемента на плане... В общем - при любом действии, которое вызывает изменение положение объекта на виде профиля.
Получается, что отрисовка меток колодцев и труб завязана на отрисовку геометрии колодцев и труб. А если я выполняю полную перерисовку (не вызываю в коде метода base.WorldDraw или base.ViewportDraw), то метки не перерисовываются. Регенерация не спасает. Пробовал принудительно вызывать для них методы Draw и ViewportDraw - не помогает. Пробовал переопределять методы WorldDraw и ViewportDraw в разных сочетаниях (только одно, только другое, и то и другое...) - тоже не спасает. Может быть, подкините еще какую-нибудь идею?
Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
На самом деле, я их тоже перерисовываю. Точнее сказать, дорисовываю. Максимально приближенное к нужному отображение получаю стандартно, что не получается - дорисовываю программно. Но это только те метки, которые "мои", пользователи могут создать свои дополнительные со сложной геометрией. У меток в сивиле есть стандартный конструктор, в нем можно собрать метку из линий, текстов, блоков. В тексты можно вытягивать различные параметры сетей - их несколько десятков. В общем, распознать произвольную метку и правильно ее перерисовать - это очень объемная и неблагодарная работа.
Тут надо тогда самому определять все типы меток, которые могут быть на элементах сетей и запрещать пользователям создавать свои. Но мне такое ограничение сильно не нравится. Получается решение проблемы методом создания более крупной :). Ведь всегда же, в конце-концов, можно отключить-включить перерисовку, чтобы метки встали на место. Проблема только в том, что это потребует 2 регенерации чертежа, что занимает довольно много времени на больших чертежах. Пока другого выхода не найду, можно будет использовать такой "костыль". Но есть слабая надежда, что как-то малой кровью можно побороть эту напасть :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ведь всегда же, в конце-концов, можно отключить-включить перерисовку, чтобы метки встали на место. Проблема только в том, что это потребует 2 регенерации чертежа, что занимает довольно много времени на больших чертежах.
А может быть одной будет достаточно? В обработчике изменения системной переменной CANNOSCALE или CANNOSCALEVALUE отключаешь Overrule, затем его включаешь и выполняешь регенерацию.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Помимо переменной масштаба чертежа, нужно еще отлавливать изменения труб и колодцев на виде профиля, труб и колодцев на плане и стиля вида профиля. Возможно, что еще не все учел...
Я сделал обработку всех этих событий, прописал в ней отключение-включение Overrule с регенерациями. Сейчас попробовал - недостаточно одной регенерации. Первая нужна, когда включено стандартное отображение, чтобы запустить механизм стандартной отрисовки объекта, после которой метки встают как надо. Вторая - для запуска отрисовки нужного мне отображения объекта после включения Overrule.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Первая нужна, когда включено стандартное отображение, чтобы запустить механизм стандартной отрисовки объекта, после которой метки встают как надо. Вторая - для запуска отрисовки нужного мне отображения объекта после включения Overrule.
Еще один вариант. Вместо регенерации всего чертежа, в случае когда у тебя имеется коллекция ObjectId объектов, для которых ты сделал Overrule, ты можешь:
1) Отключить Overrule
2) Открыть их все на запись, выполнить RecordGraphicsModified(true), Draw() и закрыть - в принципе это всё, что делает _REGEN для этих примитивов.
3) Включить Overrule
4) Выполнить пункт 2)
Если это сработает, то будет значительно быстрее, чем _REGEN

С другой стороны, насколько часто пользователь переключает масштабы? Думаю что не часто. Так что можно пренебречь одной лишней регенерацией.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Открыть их все на запись, выполнить RecordGraphicsModified(true), Draw() и закрыть - в принципе это всё, что делает _REGEN для этих примитивов.
Попробовал. Не работает такой метод почему-то. Заменил на регенерацию всего чертежа - работает...

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Да, колодцы сами перерисовываются, но поведение меток - как на видео.
Если интересно:
Аналог регена по Вашему способу - в методе ProfileViewPartsRegen. Заменял вызов в методе Execute2Regen.
Извините, вам запрещён просмотр содержимого спойлеров.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Открыть их все на запись, выполнить RecordGraphicsModified(true), Draw() и закрыть - в принципе это всё, что делает _REGEN для этих примитивов.
Опытным путем выяснил, что обновляется и без метода Draw(), достаточно метода RecordGraphicsModified(true). Судя по описанию метода, если true - то объект обновляется при закрытии. Возможно, Draw() нужен, если сперва было установлено RecordGraphicsModified(false)? Или Вы имели в виду, что нужно использовать либо тот, либо другой метод, а не оба сразу?

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ответ ADN:
Цитировать
Похоже, обновление метки элемента сети на виде профиля (PartProfileLabel) вызывается через отрисовку элемента сети на виде профиля (ProfileViewPart). Так что, если не вызывать base.WorldDraw (...) для ProfileViewPart, его метки не обновятся. Не удалось найти какого-то способа обойти это.
На самом деле, получилось найти приемлемый вариант. Можно воспользоваться простым трюком. Отключить в настройках стиля всю отрисовку элемента на виде профиля. И тогда, можно спокойно вызывать base.WorldDraw (...). Не смотря на то, что отрисовывать этому методу нечего, метки обновляются.
Ну и, чтобы вручную не настраивать кучу стилей, можно использовать код, типа такого:
Извините, вам запрещён просмотр содержимого спойлеров.