Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
ABWC
Зарегистрирован: 01.09.2008 Сообщения: 15 Откуда: Ростов-на-Дону
|
Добавлено: Чт 29 Янв 2009 17:45 Заголовок сообщения: Фильтр объектов при отображении слоя |
|
|
Есть задача - автоматически через заданный интервал времени изменять фильтр при отображении объектов слоя. Например, в слое аварийности отображать аварийность по дням.
Как получить функциональность аналогичную "Вид-Параметры отображения"? |
|
Вернуться к началу |
|
 |
andreichernov
Зарегистрирован: 14.02.2005 Сообщения: 209 Откуда: Самара
|
Добавлено: Чт 29 Янв 2009 18:27 Заголовок сообщения: |
|
|
Никак.
мы писали свой фильтр. |
|
Вернуться к началу |
|
 |
ABWC
Зарегистрирован: 01.09.2008 Сообщения: 15 Откуда: Ростов-на-Дону
|
Добавлено: Пт 30 Янв 2009 11:45 Заголовок сообщения: |
|
|
Тогда на вскидку приходит такой механизм:
1.Выключаем фильтруемый слой
2.Создаем временный слой, делаем его выдимым
3.Из фильтруемого слоя копируем нужные объекты во временный слой
4.повторяем?
или все-таки есть возможность управлять видимостью отдельных объектов слоя? |
|
Вернуться к началу |
|
 |
andreichernov
Зарегистрирован: 14.02.2005 Сообщения: 209 Откуда: Самара
|
Добавлено: Пт 30 Янв 2009 11:50 Заголовок сообщения: |
|
|
В скрипте - отклике на сообщение о перерисовке базы данных
проверяй, что слой выключен, составляй список объекто вслоя в окне, фильтруй их по семантике и отрисовывай с помощью PaintXML
Всяко лучше чем копированием.
Либо программно меняй стили, сохранив в семантику старое значение стиля, если нужно, а потом восстанавливай. |
|
Вернуться к началу |
|
 |
ABWC
Зарегистрирован: 01.09.2008 Сообщения: 15 Откуда: Ростов-на-Дону
|
Добавлено: Пт 06 Фев 2009 15:01 Заголовок сообщения: |
|
|
Решили делать через paintXML, сделали, но теперь стал вопрос: как после отрисовки одного кадра заставить ингео перерисовать видимую часть карты? ибо paintXML при рисовании новой группы не удаляет то, что было нарисовано до этого (вполне логично). простого способа стереть имеющееся пока не нашел, неужели надо _все_ рисовать ручками? |
|
Вернуться к началу |
|
 |
Tulon

Зарегистрирован: 11.07.2006 Сообщения: 77 Откуда: Сочи
|
Добавлено: Пт 06 Фев 2009 17:10 Заголовок сообщения: |
|
|
Для временного быстрого отображения группы объектов на карте можно использовать следующую функцию: Код: | Application.ActiveDb.StyleFromID('ID стиля для отривки').PaintContour(App.MainWindow.MapWindow.Surface, Контур_который_надо_нарисовать, '') |
Стереть своё "художество" - Код: | Application.MainWindow.MapWindow.Invalidate; |
Получается намного быстрее и удобнее, чем копирование. Нарисованный контур, Ингео, пока Вы не очистите поверхность, будет исправно отрисовывать при обновлении окна карты. _________________ Нет ни чего сложнее, чем достигнуть простоты. |
|
Вернуться к началу |
|
 |
ABWC
Зарегистрирован: 01.09.2008 Сообщения: 15 Откуда: Ростов-на-Дону
|
Добавлено: Пн 09 Фев 2009 14:49 Заголовок сообщения: |
|
|
OnTimer()
{
app.MainWindow.MapWindow.Invalidate();
for (все нужные элементы) app.app.ActiveDb.PaintXml(...);
}
и получаю исходную карту и изредка мигающими точками. Т.е. кадр отрисовывается, все как надо, но ингео видимо не торопится делать Invalidate и выполняет эту команду после того как отрисованы все нужные мне элементы.Как заставить принудительно все перерисовать, и сбросит флаг Invalidated? что-то типа ProcessMessages или Update? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пн 09 Фев 2009 15:19 Заголовок сообщения: |
|
|
Про анимацию:
Если Вам надо, чтобы по карте что-то ползало, создайте объект и двигайте его по таймеру.
Если Вам надо, чтобы объекты пропадали/появлялись на карте, сделайте для таких объектов пустой (прозрачный) стиль и переключайте его у существующих форм.
Если Вы рисуете собственными средствами, используйте InvalidateRect - смаргивание будет минимальным. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
ABWC
Зарегистрирован: 01.09.2008 Сообщения: 15 Откуда: Ростов-на-Дону
|
Добавлено: Пн 09 Фев 2009 16:49 Заголовок сообщения: |
|
|
Михаил Власов писал(а): | Про анимацию:
Если Вам надо, чтобы объекты пропадали/появлялись на карте, сделайте для таких объектов пустой (прозрачный) стиль и переключайте его у существующих форм.
Если Вы рисуете собственными средствами, используйте InvalidateRect - смаргивание будет минимальным. |
Да, мне надо чтобы группа объектов появлялась/исчезала на карте. Проблема в том, что в слое несколько тысяч объектов, из которых в каждый кадр отбираются несколько десятков. Кроме того (так уж сложилось) у слоя уже есть 3 стиля (а может, добавятся и еще). Поэтому вариант с запоминанием нескольких тысяч значений, переключением их в другой стиль, отрисовкой, переключением в исходный мне кажется излишне ресурсоемким. Может я куда-то не туда думаю?
Сейчас я делаю как описано в прошлом посте, но натыкаюсь на такую проблему: нужные объекты нормально отрисовываются, но практически сразу же стираются. Т.е. я вижу быстрое моргание нужной картинки (а иногда и вообще ничего не вижу) и потом пустое окно. Насколько я понимаю СНАЧАЛА происходит отрисовка моих объектов функцией PaintXML, а затем они стираются функцией Invalidate. Хотя в коде программы эти функции стоят в последовательности Invalidate; PaintXML. Хотелось бы знать как заставить ингео обработать сначала Invalidate, а потом PaintXML. Если не использовать Invalidate, то все нужные объекты рисуются, в нужной последовательности, но не устраивает то, что старые объекты остаются на карте, получается "нарастающий итог".
InvalidateRect, насколько я понимаю, меня не спасет, так как все равно будет стирать только что отрисованные объекты. |
|
Вернуться к началу |
|
 |
Tulon

Зарегистрирован: 11.07.2006 Сообщения: 77 Откуда: Сочи
|
Добавлено: Пн 09 Фев 2009 16:57 Заголовок сообщения: |
|
|
А может у вас просто этот код слишком часто запускается? И поэтому они только успевают отрисоваться, а тут уже их опять стирают. Либо вы вставили этот фрагмент в месте, которое обрабатывается ДО ингеовской функции Repaint (или чего-то подобного). Попробуйте тот метод, который я описал ранее, тогда при Repaint'е объекты не стираются, а стираются только Invalidate'ом. _________________ Нет ни чего сложнее, чем достигнуть простоты. |
|
Вернуться к началу |
|
 |
ABWC
Зарегистрирован: 01.09.2008 Сообщения: 15 Откуда: Ростов-на-Дону
|
Добавлено: Пн 09 Фев 2009 17:12 Заголовок сообщения: |
|
|
Ставил интервал в 5 секунд. все равно сначала рисует объект, тут же его стирает и ждет еще 5 сек. до следующего цикла. Ваш способ пробовал. тот же результат Если убрать invalidate - То даже при отрисовке PaintXML объекты остаются на карте при перерисовке окна (но не при изменении масштаба/сдвиге, хотя мне этого и не надо).
Мне надо убедиться что Invalidate обработана и стираний не будет. Пока ищу как. |
|
Вернуться к началу |
|
 |
ABWC
Зарегистрирован: 01.09.2008 Сообщения: 15 Откуда: Ростов-на-Дону
|
Добавлено: Пн 09 Фев 2009 17:26 Заголовок сообщения: |
|
|
Победил! Разделил рисование и обновление. По таймеру делаю Invalidate; в скрипте модуля расширения ловлю событие "Окно карты - после отрисовки" в нем обращаюсь к функции модуля (сам он написан на C#) в которой уже и рисую все что надо. P.S. ощущение путешествия из Ростова в Сочи через Питер не покидает меня почему-то. Может все-таки есть более простой вариант? Посоветуйте хоть что-нибудь стоящее, а то надоело уже кругами ходить вокруг да около. |
|
Вернуться к началу |
|
 |
|