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

Использование ActiveObject, SelectObject

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Использование ActiveObject, SelectObject, прикладная задача для ГИС Панорама12
 
  Здравствуйте. Подскажите пожалуйста нет ли примера использования функции ActiveObject в интерактивной задачи к Панорама 12. Не совсем понятно как ее использовать, мне необходимо выбрать объект, чтобы он выделился красным пунктиром, это происходит  после функции SelectObj, затем при выборе других объектов одним кликом, я хочу получить их список HOBJ, это делает функция ActiveObject, но при этом она перерисовывает экран и первый выделенный объект перестает быть выделенным. Так же непонятно с методами MapWindow->NextActiveObject() и MapWindow->PrevActiveObject() так как их нет у данного класса.
 
Для перехода к следующему\предыдущему объекту необходимо отправить сообщение окну карты:
DocHandle - идентификатор окна карты
MS_NEXTOBJECT - команда перехода между объектами
Параметр WPARAM:
0 - переход к следующему объекту;
1 - переход к предыдущему объекту.

Параметр LPARAM:
Info - идентификатор объекта карты, в который записывается результат.
Код
if (::SendMessage(DocHandle, MS_NEXTOBJECT, 0, Info) != 0)
 {
    // Обработка возвращаемого объекта, если нужно
  ...
 }
 
 Здравствуйте! Спасибо за ответ. А по поводу перерисовки экрана? Хотелось бы чтобы первый выбранный объект отображался всегда. При этом если в функции ActiveObject пытаюсь отображать объекты, выбранные с помощью mapViewMapObjec, то они все равно перерисовываются и мое выделение пропадает, хотя я и отрисовываю их в функции Paint.?
 
 // Отобразить произвольный объект в пределах фрагмента
// в условных знаках пользователя
// image - описание вида объекта (см. MAPGDI.H),
// Координаты объекта заданы в дискретах в листе
// При ошибке в параметрах возвращает ноль
// alpha - флаг использования альфа канала 0 - не использовать 1 - использовать
// filename  - полное имя создаваемого файла формата png


_MAPIMP long int _MAPAPI mapPaintMapObject95(HMAP hMap, HDC hdc,
                                     RECT * rect,
                                     PAINTPARM * image,
                                     HOBJ object);
Пример:

После обновления карты нарисовать требуемые объекты (например сплошной линией указанным цветом  color)
Код
      PAINTPARM image;
      IMGLINE   line;
      image.Image = IMG_LINE;
      image.Parm  = (char*)&line;
      image.Mode  = R2_COPYPEN;

      line.Color  = color;
      line.Thick  = PIX2MKM(1);                     // 19/04/10

      mapPaintMapObject95(hmap, hdc, rect, &image, info);
 
При обновлении карты это когда? В функции Paint?
Код
int CInsertInMultipolygon::ActiveObject(HOBJ info)
{
   DOUBLEPOINT WindowPoint = *GetMapWindowPoint();
   mapMapToPlane(HMap, &WindowPoint.X, &WindowPoint.Y);
   HWND handle = Task->MapWindow->GetHandle();
   mapViewMapObject(Task->HMap, GetMapWindowHandle(), &WindowPoint, &ObjView, mainHOBJ, PP_PLANE);

   stObjects[nObj].hObj = info;
   nObj++;
   
   return flIsActiveObj;
}
int CInsertInMultipolygon::SelectObject(HOBJ info)
{
   // Проверим локализацию объета
   if (mapObjectLocal(info) != LOCAL_SQUARE)
   {
      mapFreeObject(info);
      MapWindow->SetMessage(" ");
      return 0;
   }
   else {
      MapWindow->SetMessage(" ");

      if (mapIsMultiPolygon(info) != 0)
      {
         stObjects = new STHOBJ[200];
         flIsActiveObj = 0;
         mainHOBJ = info;

      }
      
      
   }

   return 0;

}
int CInsertInMultipolygon::Paint(THDC& dc, bool erase, TRECT& rect)
{
   DOUBLEPOINT WindowPoint = *GetMapWindowPoint();
   mapMapToPlane(HMap, &WindowPoint.X, &WindowPoint.Y);
   if (mainHOBJ != NULL)
   {
         mapViewMapObject(Task->HMap, GetMapWindowHandle(), &WindowPoint, &ObjView, mainHOBJ, PP_PLANE);
   }
   if (stObjects != NULL)
   {
      for (int i = 0; i < nObj; i++)
      {
         
         if (stObjects[i].hObj != 0)
         {// Нарисовать объект
             mapPaintMapObject95(HMap, dc.operator HDC(), &rect, &ObjView1, stObjects[i].hObj);
         }
      }

   }
   return 0;
}
делаю так, но рисуется только последний выбранный объект? остальные становятся просто не выделенными.
Изменено: Дарья Лунченко - 05.09.2017 16:02:07
 

Здравствуйте!

Параметр info в функции ActiveObject(HOBJ info) является контейнером. При переходе от одного объекта к другому он не изменяется.

Вам необходимо либо создавать массив номеров объектов и номеров листов, либо использовать HSELECT для создания набора объектов.

 
Насколько я понимаю, HSELECT в функциях поиска - это указатель на какую-то структуру или класс, хранящий в себе набор условий для выполнения поиска. Можно ли как-то увидеть описание этого класса/структуры и прочитать/установить его переменные напрямую без обращения к функциям настройки контекста?  
Изменено: Олег Касьянов - 05.09.2017 18:22:29
 
Цитата
Олег Касьянов написал:
Насколько я понимаю, HSELECT в функциях поиска - это указатель на какую-то структуру или класс, хранящий в себе набор условий для выполнения поиска. Можно ли как-то увидеть описание этого класса/структуры и прочитать/установить его переменные напрямую без обращения к функциям настройки контекста?  

HSELECT - это указатель на класс TMapSelect в ГИС-ядре. Из его описания никто секрета не делает, но "прочитать/установить его переменные напрямую без обращения к функциям настройки контекста" - это неправильный поход, по следующим причинам:
- класс TMapSelect - это "внутренняя кухня" разработчика, свойства и методы могут добавляться и удаляться могут по его усмотрению без уведомления пользователей, неизменность и работоспособность гарантируется только в части API методов, работающих с TMapSelect через HSELECT;
- поскольку класс физически лежит в динамической библиотеке, его использование "напрямую" накладывает сразу ряд ограничений для разработчика прикладных задач в части соблюдения стандартов библиотек, менеджера памяти и пр. (не получиться, к примеру, написать задачу на Visual Studio), использование API не накладывает таких ограничений.

Таким образом, единственным правильным решением является работа с HSELECT посредством API-функционала.
 
Тогда можна попросить разработчика добавить в контекст поиска учет наличия флага мультиполигона у объекта и соответственно функцию API для контекста по установке/сбросу этого флага. Если сделать, что по умолчанию эта переменная просто игнорируется, то это никак не повлияет на существующие приложения. А то сейчас нужно при поиске делать много лишних действий: сначала настраиваем контекст, отбираем все, затем проверяем у каждого отобранного флаг и заново формируем список.  
Изменено: Олег Касьянов - 06.09.2017 16:23:12
 
Цитата
Олег Касьянов написал:
Тогда можна попросить разработчика
Можно. Как пожелание мы этот пункт зафиксировали, но когда он будет реализован пока неизвестно.

Цитата
Олег Касьянов написал:
А то сейчас нужно при поиске делать много лишних действий: сначала настраиваем контекст, отбираем все, затем проверяем у каждого отобранного флаг и заново формируем список.  
А это как раз и есть "штатный" подход к выборке объектов, когда требуется применить условия, не охватываемые обобщенными условиями поиска.
А вот предусмотреть все возможные варианты, которые могут потребоваться пользователю (или программисту прикладных задач), невозможно физически на уровне программного кода, задающего обобщенные условия поиска.
Хочу сказать, что обобщенные условия потому так и называются, что накладывают ограничения к выборке по общим параметрам. Как только условие, по которому Вы хотите отобрать объекты, выходит за рамки "обобщенных", придется полученную выборку обработать еще раз, уже с Вашим условием.

Флаг мультиполигона в перспективе может быть внесен в обобщенные условия.
Но, пока это не реализовано на уровне ГИС-ядра, рекомендую применять описанный выше подход.
Страницы: 1
Читают тему (гостей: 1)



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

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