Список форумов www.integro.ru www.integro.ru
ЦСИ ИНТЕГРО
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Фильтр объектов при отображении слоя

 
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 сек. до следующего цикла. Ваш способ пробовал. тот же результат Sad Если убрать invalidate - То даже при отрисовке PaintXML объекты остаются на карте при перерисовке окна (но не при изменении масштаба/сдвиге, хотя мне этого и не надо).

Мне надо убедиться что Invalidate обработана и стираний не будет. Пока ищу как.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
ABWC



Зарегистрирован: 01.09.2008
Сообщения: 15
Откуда: Ростов-на-Дону

СообщениеДобавлено: Пн 09 Фев 2009 17:26    Заголовок сообщения: Ответить с цитатой

Победил! Разделил рисование и обновление. По таймеру делаю Invalidate; в скрипте модуля расширения ловлю событие "Окно карты - после отрисовки" в нем обращаюсь к функции модуля (сам он написан на C#) в которой уже и рисую все что надо. P.S. ощущение путешествия из Ростова в Сочи через Питер не покидает меня почему-то. Может все-таки есть более простой вариант? Посоветуйте хоть что-нибудь стоящее, а то надоело уже кругами ходить вокруг да около.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов www.integro.ru -> Вопросы разработчиков Часовой пояс: GMT + 5
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете добавлять приложения в этом форуме
Вы можете скачивать файлы в этом форуме


© phpBB Group
Русская поддержка phpBB