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

MapAPI - как позиционировать изображение?

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
MapAPI - как позиционировать изображение?
 
Здравствуйте!
Тема - в продолжение соседней темы о удалении объектов и обновлении картинки.
Итак я получаю объект с ключом 84, его рамку, по рамке определяю центр объекта, пересчитываю центр в пикселы и пытаюсь вывести объект в центр окна:
Код
  HOBJ info = mapCreateObject(FMap, 1, IDFLOAT2, 0);
  hObj = mapSeekObjectInList(FMap, FMap, info, 1, 84);
  mapObjectFrame(hObj, &hFrame);
  mapFreeObject(info);
  //-------------------------------------------------------------------------
  double cx = (hFrame.X1 + hFrame.X2) / 2;
  double cy = (hFrame.Y1 + hFrame.Y2) / 2;
  mapPlaneToPicture(FMap, &cx, &cy);
  int x = cx;
  int y = cy;
  mapSetViewScale(FMap, &x, &y, 50000.0);  // вот тут никакой реакции
  RedrawMap(); // это PostMessage...

Я никак не могу сообразить, как увязать пиксельный центр объекта с самим окном документа. Его параметры известны
Код
  ::GetWindowRect(FParm->DocHandle, &winRect);  // абсолютные на дисплее
  ::GetClientRect(FParm->DocHandle, &docRect);  // относительные
и с размерами самой картинки.
 
Получается вот что:
Код
  HOBJ info = mapCreateObject(FMap, 1, IDFLOAT2, 0);
  hObj = mapSeekObjectInList(FMap, FMap, info, 1, 2089);
  mapObjectFrame(hObj, &hFrame);
  mapFreeObject(info);
  //-------------------------------------------------------------------------
  double cx = (hFrame.X1 + hFrame.X2) / 2;
  double cy = (hFrame.Y1 + hFrame.Y2) / 2;
  mapPlaneToPicture(FMap, &cx, &cy);
  // новый левый верхний угол относительно нового центра
  // лишние переменные - это для отладки
  int x = cx - (mapRect.left + mapRect.right) / 2;
  int y = cy - (mapRect.top + mapRect.bottom) / 2;
  DOUBLEPOINT dp;
  dp.x = x;
  dp.y = y;
  mapView(FMap, FParm->DocHandle, 1, &dp, PP_PICTURE);
Я вижу, что картинка сместилась! (Надо таки учесть само положение mapRect на дисплее). НО - при движении окном моей задачи картинка затирается, восстанавливается предыдущее изображение. А если просто послать сообщение на перерисовку - вижу мелькание и восстановление старой картинки. :(
Такое впечатление, что новая картинка рисуется и выводится, но некий сигнал на то, что произошёл некий сдвиг, я не посылаю. Скроллеры окна карты остаются на старых местах. Потому и репайнт восстанавливает старое, а не обновляет.
Изменено: Газонокосильщик - 01.12.2010 22:30:25
 
Пляска с бубном (изучение mapview.rh) принесла первые результаты - ::PostMessage(FParm->DocHandle, MT_MAPWINPORT, MWP_SCROLLBY, (int)&p);
Осталось разобраться как правильно установить p.x и p.y...
*старые грабли с адресами/указателями...*
Код
  int x = -10;  // на самом деле это dx, dy от "исходного" изображения
  int y = 10;
  POINT *p = new POINT;
  p->x = x;
  p->y = y;
  ::PostMessage(FParm->DocHandle, MT_MAPWINPORT, MWP_SCROLLBY, (int)p);

Картинка смещается по диагонали ОК!
И вопрос - как определить ГДЕ Я перед вызовом позиционирования.
В терминах GTK - как определить MapLeft и MapTop?
Изменено: Газонокосильщик - 02.12.2010 11:37:42
 
Попробовал ::PostMessage(FParm->DocHandle, AW_MOVEDOC, (int)p, PP_PICTURE);Независимо от координат в точке р и их флага картинка позиционируется в левый верхний угол карты, а в самом углу (0, 0) начинает мигать крест-курсор, точнее та его часть, которая правее и ниже нуля окна карты (документа).
Поправка - если передать координаты в метрах картинка наоборот позиционируется в левый нижний угол.
Изменено: Газонокосильщик - 02.12.2010 13:49:29
 
Дошаманился...
Этот код сдвигает картинку в северо-западном направлении до упора, хотя сдвиги - НУЛЕВЫЕ (4 часа назад я был рад и счастлив. Почти...)!
Код
void __fastcall TFDllForm::BPostClick(TObject *Sender) {
  POINT *p = new POINT;
  p->x = 0; // !!!
  p->y = 0; // !!!
  ::PostMessage(FParm->DocHandle, MT_MAPWINPORT, MWP_SCROLLBY, (int)p);
  delete p;
}
а вот этот исправно двигает картинку по диагонали
Код
void __fastcall TFDllForm::BSendClick(TObject *Sender) {
  POINT *p = new POINT;
  p->x = -10;
  p->y = -10;
  ::SendMessage(FParm->DocHandle, MT_MAPWINPORT, MWP_SCROLLBY, (int)p);
  delete p;
}
Изменено: Газонокосильщик - 02.12.2010 14:51:08
 
Если модераторы посчитают предыдущие посты мусором и удалят их - я не обижусь.
В maptype.h нашёл всё, что нужно - ИДЕНТИФИКАТОРЫ СООБЩЕНИЙ (окну из прикладной задачи).
 
Узать текущие координаты верхнего левого угла
// Запросить координаты левого верхнего угла карты
function GetPicturePoint : PTPOINT;
 
В инклюдах SDK её нет. Судя по типу данных точки - и быть не может. Порылся в хэлпе - так и есть - PanAPI. Буду знать на будущее - спасибо! :)
 
В SDK она есть в применрах написания программ для запуска из нашей ГИС оболочки (протокол PanApi, как Вы заметили). Различные варинаты написания доступа к картографическим объектоам описаны в Руководстве программсита. И они отличаются иногда принципиально. Есть программы запускаемые из под оболочки нашей ГИС, а есть автономные, написанные на чистом MapApi, на чистом GIS ToolKIt, или их смешанных варинатах.
В последних случаях, масу вопросв Вы контролируете сами (перерисовка, открытие, ...). В случае запуска из под ГИС - надо учитывать и ее функциональные интересы и идеологию.
 
Ну меня-то интересует именно прикладная задача (F12), запускаемая именно из-под Панорамы.
Цитата
Andrey Gheleznyakov пишет:
В последних случаях, масу вопросв Вы контролируете сами
Пока только пытаюсь, кое-что уже получается! :)
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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