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

Сборка прикладных задач под linux

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2
RSS
Сборка прикладных задач под linux, Итересует кто как собирает прикладные задачи под Linux
 
Цитата
Александр Савелов написал:
Хотел еще уточнить, под linux вы используете MessageHandler а в windows реализации также или используете функционал Send/PostMessage в прикладных задачах на PanApi?

Обычно да. Те функции, которые имею параметр типа HMESSAGE или HWND и в описании к функции сказано, что этот параметр используется для отправки сообщений диалогу, то в Windows этот параметр используется как идентификатор окна и ему будут посылаться сообщения посредством Send/PostMessage. Об этом должно быть указано в описании к функции вместе с кодом сообщения которое отсылается.

При этом и в Windows могут быть MAPAPI-функции, которые используют callback-функции для уведомления о своем состоянии (как в Linux).
Но об этом всегда указывается в описании функции.

Например:
Цитата

// Построение зоны затопления по набору отметок уровня воды.
// В результате построения формируется матрица качеств, элементы
// которой содержат глубины в зоне затопления.
// Габариты матрицы качеств определяются координатами точек с
// отметками уровня воды (массив pointArray) и величиной расширения
// габаритов области (areaExtension).
// hMap    - исходная карта для построения зоны,
// mtqName - полное имя создаваемой матрицы качеств,
// pointArray - адрес массива точек с отметками уровня воды
//   Координаты точек (pointArray->X,pointArray->Y) и значения уровня
//   (pointArray->H) задаются в метрах в системе координат векторной
//   карты,
// pointCount - число точек в массиве pointArray
//   Размер в байтах массива, заданного адресом pointArray, должен
//   быть не менее pointCount * sizeof(XYHDOUBLE), в противном случае
//   возможны ошибки работы с памятью,
// areaExtension - положительное число, задающее величину
//   расширения габаритов области в метрах,
// minDepth - положительное число, задающее минимальную глубину
//   зоны затопления в метрах (глубины, меньшие minDepth в матрицу
//   качеств не заносятся),
// isFloodZoneAbs - признак того, что во входных данных заданы абсолютные
//   высоты (!=0), если 0, то высоты относительные (функции *ZoneAbs*
//   используют абсолютные высоты на входе);
// handle - идентификатор окна диалога, которому посылаются
// сообщения о ходе процесса :
//   0x0581 - сообщение о проценте выполненных работ (в WPARAM),
//   если процесс должен быть принудительно завершен, в ответ
//   должно вернуться значение 0x0581.
// fcallback  - функция обратного вызова для сообщения статуса выполнения (процентов),
//   это функция типа EVENTCALL (см. описание в maptype.h), первым параметром
//   в нее будет возвращено значение eventparam, вторым - код сообщения (0x0581),
//   в третьем параметре  - процент выполненной обработки
//   в четвертом параметре - адрес строки с названием выполняемого этапа
//   Если процесс должен быть принудительно завершен, в ответ
//   должно вернуться значение 0x0581.
// eventparam - параметр, передаваемый в функцию обратного вызова для идентификации
//   отклика на вызывающей стороне.
// При отправке сообщения WM_ERROR в первом параметре содержится целочисленный код ошибки,
// во втором параметре передается указатель на текст описания ошибки.
// Если handle (или fcallback) равно нулю - сообщения не посылаются.
// Текст передается в кодировке Unicode (UTF16).

long int MTREXPORT mtrBuildFloodZone(HMAP hMap,
                                    const char *mtqName,
                                    XYHDOUBLE  *pointArray,
                                    long int    pointCount,
                                    double      areaExtension,
                                    double      minDepth,
                                    HMESSAGE    handle);

long int MTREXPORT mtrBuildFloodZoneCallback(HMAP hMap,
                                    long int     isFloodZoneAbs,
                                    const WCHAR *mtqName,
                                    XYHDOUBLE   *pointArray,
                                    long int     pointCount,
                                    double       areaExtension,
                                    double       minDepth,
                                    EVENTCALL    fcallback,
                                    void        *eventparam
);
 
Цитата
Александр Савелов написал:
Вы имеете в виду расширение SDK для ГИС Оператор под Linux задачами из SDK для ГИС Панорама для Windows?Если Вы используете ГИС Конструктор, то можете использовать набор примеров, входящих в его состав.
Да, все правильно, но сейчас столкнулись с проблемой, что диалоги ГИС Конструктора по функционалу отличаются или отстают от windows, выбор объектов нет кнопки "выделить", выбор объекта в точке и т.д. Я понимаю, что наработана большая база под C Builder задач, но у Вас, похоже, таже проблема сейчас, что и у нас, это различные по реализации ветки, которые надо сопровождать и развивать, и они развиваются немного по разному. Примеры представленные в ГИС Конструктор слишком мелкие и не отражают правила и подходы при разработке прикладных задач большей сложности.
Изменено: Максим Казаровец - 30.04.2020 09:16:27
 
И могу ли я использовать mapDrawImageMapObject для отображения объекта в  прикладной задаче, HIMAGE планирую получать так HIMAGE buf =  dc.operator HDC()?
 
HIMAGE это тип для отображения карты с двойной буферизацией.

HDC это по-сути XCONTEXT - системный тип X11.

Думаю, что если оно не упадет, то хотя бы точно не нарисует как планировалось.
 
Цитата
Vladimir Letov написал:
Думаю, что если оно не упадет, то хотя бы точно не нарисует как планировалось.
Немного не так, планирую в событие OnPaintActionEx в качестве HDC в классе MapWindow передать HIMAGE, OnPaintActionEx(display->hScreen, erase, point, rect);, по суте это же long int, только пока не знаю как буфер вывести из задачи в экран, для отображения  карты использую такой же подход как и в ГИС Кострукторе, только отказался от компонентов, реализовал их своими классами через PanAction. Что вернут функции mapGetImageDC и mapGetImageObjectDC на Linux, 0? Как в PanAction вы рисуете, уже вообще думаю указатель на структуру какую передовать в задачи, хотелось бы отрисовать максимально просто?

// Запросить контекст буфера окна  // himage - идентификатор буфера окна
 // При ошибке возвращает ноль

_MAPIMP HDC _MAPAPI mapGetImageDC(HIMAGE image);

 // Запросить контекст буфера окна для отображения объектов
 // himage - идентификатор буфера окна
 // При ошибке возвращает ноль

_MAPIMP HDC _MAPAPI mapGetImageObjectDC(HIMAGE image);
Изменено: Максим Казаровец - 30.04.2020 15:48:14
 
Обе эти функции вернут 0, потому что в Линукс не используются контексты для буферизации. Второй Ваш вопрос я не понял.
 
Цитата
Vladimir Letov написал:
Второй Ваш вопрос я не понял.
Более подробно, как правильно отрисовать перемещение объекта в прикладной задачи на PanApi? Интересует какие функции использовать, чтобы отрисовать под Linux и Windows? Если использовать функции с отрисовкай в XImage каким образом отобразить перемещенный объект без сохранения на карту? Можно пример?
 
Поскольку Вы пишете автономное ГИС-приложение на основе ГИС Конструктор, то для интерактивного взаимодействия с окном карты необходимо использовать обработчики, реализующие интерфейс QDGtkAction (qdmact.h). Например:
- обработчик выбора точки QDGetMapPoint (qdmactpt.h);
- обработчик выбора линии QDMapActionLine (qdmactline.h);
- обработчик выбора прямоугольной области QDMapSelectRect (qdmrect.h).

При этом отображение поверх карты будет производиться в функции MapAfterPaint().
Любой из данных обработчиков Вы можете взять за основу и реализовать собственный функционал.

Исходные тексты компонентов ГИС Конструктор (включая обработчики) доступны в составе инсталляции (/usr/share/gisdesigner/examples/Sources/).
Также примеры использования обработчиков можно посмотреть в контрольных примерах (/usr/share/gisdesigner/examples/) - например, myfirst.

При необходимости отобразить объект поверх карты без предварительного его нанесения (например, на временную карту) можно отрисовать его в память функцией mapPaintExampleObjectByFuncDataToXImage (mapapi.h), а затем нарисовать полученный образ с помощью QPainter в MapAfterPaint():
Код
  // Вывести изображение карты в XImage (массив)
  // hmap  - идентификатор открытых данных
  // imagedesc - параметры области для размещения изображения
  // Описание структуры XIMAGEDESC в maptype.h
  // erase - признак очистки области изображения (если равен -2, то изображение рисуется
  //         поверх имеющегося рисунка без очистки)
  // x,y - координаты левого верхнего угла внутри
  // битовой области XImage для размещения изображения
  // rect - фрагмент для вывода отображения
  // func - функция отображения объекта
  // parm - параметры изображения
  // data - метрика для отображения
  // colors - количество цветов
  // palette - палитра
  // При ошибке в параметрах возвращает ноль

_MAPIMP long int _MAPAPI mapPaintExampleObjectByFuncDataToXImage(HMAP hMap, XIMAGEDESC *imagedesc,
                                                                 long int x, long int y,
                                                                 RECT *rect, long int func,
                                                                 const char *parm, POLYDATAEX* data,
                                                                 long int colors, COLORREF *palette);
Страницы: Пред. 1 2
Читают тему (гостей: 1)



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

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