На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

использование функции mapViewSelect

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 4 5 6 След.
RSS
использование функции mapViewSelect, прикладная задача для ГИС Панорама12
 
  Здравствуйте. Подскажите пожалуйста в интерактивной программе ГИС Панорама , в основном классе задачи по нажатию на кнопку, происходит запуск моего диалога, т.е выполнение команды происходит без обработчика. В процессе работы я формирую контекст условий поиска/отображения HSELECT и потом выделяю объекты на карте функцией mapViewSelect(HMap, hwndMain, &WindowPoint, hSelect, color, PP_PLANE); , объекты выделяются, но при прокрутке и масштабировании выделение стирается, как этого избежать? Создавать отдельный обработчик и в OnPaint отрисовывать их? Но хотелось бы чтобы после закрытия моей панели объекты были все еще выделены.  
 
Вам нужно вызвать функцию
_MAPIMP long int _MAPAPI mapSetSiteSeekSelect(HMAP hMap, HSITE hSite, HSELECT hSelect);

и установить флаг выделения
Еще надо установить этот флаг:

// Установить признак выделения объектов по обобщенным
// условиям поиска
// hMap - идентификатор открытой карты,
// flag = 0 - отключить выделение объектов на карте,
// иначе - выделять объекты по условиям поиска при перерисовке
// Никакого действия кроме сохранения значения не производит
// Применяется для связи между различными модулями

_MAPIMP void _MAPAPI mapSetTotalSelectFlag(HMAP hMap, long int flag);
 
Здравствуйте. Не могу понять, что делаю не так: 1) с помощью вызова диалога selSetViewStaff устанавливаю фильтр отображения объектов карты;
2) создаю контекст условий поиска отображения и запрашиваю состав отображаемых объектов;
3) проверяю, что объект подходит мне, и если это не так, то отключаю его с помощью mapSelectObject
4) в итоге, почему-то выделяются все объекты, которые отображаются на карте после фильтра?
Подскажите пожалуйста, в чем ошибка?
Код
   HSITE hSite = mapGetActiveSite(HMap);
   HRSC hRsc = mapGetRscIdent(HMap, hSite);
   
   HSELECT hSelect = mapCreateMapSelectContext(HMap);
   mapGetSiteViewSelect(HMap, hSite, hSelect);
   
   if (mapCheckLocal(hSelect, LOCAL_SQUARE) == 0)
      return 0;

       // Создать пустой объект для обработки выделенных
        HOBJ hObj = mapCreateObject(HMap);
        if (!hObj) return 0;

      int flag = WO_FIRST;
   
   while (mapTotalSeekObject(HMap, hObj, flag) != 0)
   {
      flag = WO_NEXT;
      if (mapIsMultiPolygon(hObj) != 0)
      {
      if (mapObjectLocal(hObj) == LOCAL_SQUARE)
      {
        mapSelectObject(hSelect, mapGetRscObjectIdentIncode(hRsc,hObj), 1);
      }
      else mapSelectObject(hSelect, mapGetRscObjectIdentIncode(hRsc, hObj), 0);
      }
      else { 
         mapSelectObject(hSelect, mapGetRscObjectIdentIncode(hRsc, hObj), 0);
      
      }
   }

   mapSetTotalSelectFlag(HMap, 1);
   mapSetSiteSeekSelect(HMap, hSite, hSelect);
   mapClearSelectContext(hSelect);
    MapWindow->Invalidate();
 
Функция mapSelectObject, судя по ее описанию, на вход принимает порядковый номер объекта карты (внутренний код - индекс на карте). Это не внутренний код условного знака в классификаторе.
Порядковый номер объекта на карте можно получить функцией mapGetObjectNumber

Код
  // Установить доступ к объектам c заданным индексом
  // (внутренним кодом)
  // select - контекст условий поиска
  // object - индекс объекта карты, начинается с 1,
  // если равен -1 (0xFFFFFFFF), то устанавливается
  // доступ ко всем объектам сразу;
  // check  - доступность объекта (0 - нет доступа, != 0 - есть)
 
  _MAPIMP void _MAPAPI mapSelectObject(HSELECT select, long int object,
                               long int check);


Судя по тексту, Вы хотите оставить в контексте поиска только мультиполигоны.
Тогда, чтобы не делать лишнюю проверку, можно сразу в контекст поиска установить условие по локализации LOCAL_SQUARE (и перебирать будет меньше), а перебирая сами объекты достаточно просто выключить ненужные (включать нужные не требуется, так как Вы перебираете уже результаты поиска - они там есть). Тогда Ваш цикл можно упростить до:
Код
   while (mapTotalSeekObject(HMap, hObj, flag) != 0)
   {
      flag = WO_NEXT;
      if (mapIsMultiPolygon(hObj) == 0)
       mapSelectObject(hSelect, mapGetObjectNumber(hObj), 0);
   } 
 
  Здравствуйте. Спасибо за ответ. Поменяла код так как у вас написано, все равно выделяются все площадные.
 
Прошу прощения, не углубился до конца в вопрос.

При установке в hSelect-е обобщенных условий поиска, действуют именно эти условия. Можно для текущей работы с этим контекстом hSelect-а отключить какие-то объекты, но при передаче куда-либо или копировании hSelect-а эти флажки не передаются. То есть когда Вы вызываете mapSetSiteSeekSelect в условия выделения передаются только условия, заданные в исходном hSelect-е (без флажков, установленных mapSelectObject).
Исключением является список объектов, задаваемый в hSelect-е непосредственно по номерам объектов (это функции работы с Select-ом со словом Sample).

Наиболее оптимальным вариантом в Вашем случае будет:
- выполнить начальную операцию выборки объектов (Вы это делаете через диалог, насколько я понял) - получаем Select1;
- создать новый пустой Select2;
- перебирая результаты Select1 добавлять в Select2 объекты, удовлетворяющие Вашим условиям, с помощью mapSelectSample(Un) или mapFastSelectSample(Un);
- передать Select2 в mapSetSiteSeekSelect для установки выделения.

Таким образом, получаем "легкий" Select2, содержащий только нужные Вам объекты и не нагруженный лишними условиями поиска.
Есть и другие варианты, но их я бы не рассматривал, поскольку они все более "тяжелые", требуют множественных переборов и задействуют больше ресурсов.

Функции добавления объектов в список (также рекомендую посмотреть и другие функции в seepapi.h со словом SelectSample, чтобы иметь представление о том, как правильно настроить HSelect для работы со списком объектов):
Скрытый текст
 
  Здравствуйте, подскажите пожалуйста на карте был установлен контекст отображения объектов, после карта закрывается, потом при открытии хочу проверить, есть ли какие то условия поиска/отображения, делаю это так :
Код
  HSELECT hSelect = mapCreateMapSelectContext(hMAp);
  HSITE hSite = mapGetActiveSite(hMAp);
  mapGetSiteViewSelect(hMAp, hSite, hSelect);
if (mapIsSelectActive(hSelect) == 0)
     rbtnAllObj.SetCheck(BST_CHECKED);
else rbtnSingleObj.SetCheck(BST_CHECKED);
  mapClearSelectContext(hSelect);
Но функция mapIsSelectActive возвращает 0?
Изменено: Дарья Лунченко - 14.09.2017 12:58:26
 
Функция mapIsSelectActive возвращает нулевое значение при ошибке, а также в случае, когда все объекты выбираются без исключений (нет условий отбора).
После закрытия и нового открытия карты все старые идентификаторы, относящиеся к этой карте становятся недействительными.
Старые идентификаторы использовать после этого категорически нельзя!
А hSelect вновь открытой карты про условия, наложенные к карте в ее предыдущем открытии, ничего не знает.

Код
 // Запросить установлены ли условия для проверки
 // hselect - условия поиска/отображения
 // Если по условиям поиска все объекты выбираются без исключений -
 // возвращает ноль, иначе - ненулевое значение
 
_MAPIMP long int _MAPAPI mapIsSelectActive(HSELECT hselect);  



Для того, чтобы восстановить условия поиска/отображения при повторном открытии карты можно воспользоваться функциями сохранения и восстановления установленных условий.
 
  Добрый день! Делаю все так как вы сказали, но все равно не могу получить контекст условий поиска/отображения после закрытия карты, код следующий:
Код
вызываю selSaveSelect в конце работы своей функции
затем при открытии диалога:
вызываю selRestoreSelect

HSELECT hSelect = mapCreateMapSelectContext(hMAp);
HSITE hSite = mapGetActiveSite(hMAp);
mapGetSiteViewSelect(hMAp, hSite, hSelect);
if (mapIsSelectActive(hSelect) == 0)
{
//попадаю сюда
   rbtnAllObj.SetCheck(BST_CHECKED);
}
else rbtnSingleObj.SetCheck(BST_CHECKED);
mapClearSelectContext(hSelect);
return true;
Изменено: Дарья Лунченко - 19.09.2017 14:50:55
 
В тексте вопроса говорится, что действия выполняются после закрытия карты. После закрытия карты нельзя получить контекст поиска. Может вы ошиблись в тексте вопроса?
Страницы: 1 2 3 4 5 6 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности