Программа аварийно завершается при попытке отобразить образец iml-значка из классификатора, со всеми с остальными значками проблем нет. ОС Astra Linux, ГИС Конструктор для Qt Designer, имеющий сертификат МО.
// Версия библиотеки MapAccess // (если применяется "mapacces.h" и т.п.) #define MAPACCESSVERSION 20130912
// Версия интерфейса MAPAPI и ядра библиотеки #define MAPAPIVERSION 0x111015
Создаю образец, как описано в этом сообщении. При указанных параметрах, если код функции равен IMG_LIBRARY, то происходит вылет.
В попытках найти способ отрисовать значок без вылета хотел воспользоваться функцией imlPaintExample из <mapgdiex.h>, программа собирается без ошибок. Но при попытке обращения к этой функции тоже аварийно завершается с ошибкой "undefined symbol: imlPaintExample". Возникли мысли что именно из-за этого программа падает и при отрисовке вышеуказанным способом. Или подскажите, что я делаю не так?
Например при попытке отрисовки из violit2016.iml знака 0099950033010106 Разгран. линии между группир.
Отрисовка образца условного знака, использующего iml, с точки зрения программирования ничем не отличается от отрисовки образца обычного знака. ГИС-ядро само определяет все необходимые параметры отображения исходя из порядкового номера объекта в классификаторе.
Привожу исходный код примера отрисовки iml-знака "Разграничительная линия между батальонами" из классификатора operator.rsc (проверено на текущей версии ГИС Конструктор 12 для ОС Astra Linux SE). Данный пример может быть применен для отрисовки образца любого знака из классификатора.
Код
#include <assert.h>
#include <iostream>
#include <QImage>
#include "mapapi.h"
int main()
{
// Открыть карту
HMAP mapHandle = mapOpenData("/usr/share/gisdesigner/examples/Data/Специальные\ карты/Оперативная\ обстановка/RedExample/battalion\ red/BattalionRed.sitx");
assert(mapHandle);
// Создать объект в памяти
HOBJ objectHandle = mapCreateObject(mapHandle);
assert(objectHandle);
// Прочитать объект с карты
int listNumber = 1;
int objectNumber = 101; // разграничительная линия между батальонами
HOBJ readObject = mapReadObjectByKey(mapHandle, mapHandle, objectHandle, listNumber, objectNumber);
assert(readObject);
// Получить номер объекта в классификаторе
long rscObjectNumber = mapObjectCode(objectHandle);
assert(rscObjectNumber);
std::cerr << "rsc object number: " << rscObjectNumber << std::endl;
// Получить внешний код объекта в классификаторе
long objectCode = mapObjectExcode(objectHandle);
assert(objectCode);
std::cerr << "object code: " << objectCode << std::endl;
// Получить классификатор
HRSC rscHandle = mapGetRscIdent(mapHandle, mapHandle);
assert(rscHandle);
// Получить номер функции отображения и параметры из классификатора
long rscObjectFunctionNumber = mapGetRscObjectFunction(rscHandle, rscObjectNumber);
assert(rscObjectFunctionNumber);
std::cerr << "rsc object function number: " << rscObjectFunctionNumber << std::endl;
const char* rscObjectParameters = mapGetRscObjectParameters(rscHandle, rscObjectNumber);
assert(rscObjectParameters);
// Запросить параметры палитры карты (для отображения объекта)
COLORREF palette[256];
long colorCount = mapGetSiteColorsCount(mapHandle, mapHandle);
mapGetSitePalette(mapHandle, mapHandle, palette, colorCount);
// Выделить память для отрисовки объекта
const int ICON_SIZE = 32;
XIMAGEDESC ximageDesc;
ximageDesc.Width = ICON_SIZE;
ximageDesc.Height = ICON_SIZE;
ximageDesc.Depth = 32;
ximageDesc.CellSize = ximageDesc.Depth / 8;
ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize;
char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize];
ximageDesc.Point = paintMemory;
assert(paintMemory);
// Отрисовать образец объекта
RECT rectDraw;
rectDraw.left = 0;
rectDraw.top = 0;
rectDraw.right = ICON_SIZE;
rectDraw.bottom = ICON_SIZE;
const char *objectText = NULL;
long objectLocal = mapObjectLocal(objectHandle);
long isPainted = mapPaintExampleObjectByFuncToXImage(mapHandle, &ximageDesc, &rectDraw, rscObjectFunctionNumber,
rscObjectParameters, colorCount, palette, objectText, objectLocal);
assert(isPainted);
// Вывести картинку в файл
QImage image((uchar*)(ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_ARGB32);
image.save("/tmp/out.png");
mapFreeObject(objectHandle);
mapCloseData(mapHandle);
mapCloseMapAccess();
return 0;
}
Сергей написал: HMAP mapHandle = mapOpenData("/usr/share/gisdesigner/examples/Data/Специальные\ карты/Оперативная\ обстановка/RedExample/battalion\ red/BattalionRed.sitx");
Может ли быть проблема в том, что вы открываете карту, к которой уже явно прикреплен какой-то классификатор, а я создаю временную карту только для отрисовки значков и на ней пытаюсь рисовать и возможно делаю при создании временной карты что-то не так?
Сергей написал: Программа аварийно завершается при попытке отобразить образец iml-значка из классификатора, со всеми с остальными значками проблем нет. ОС Astra Linux, ГИС Конструктор для Qt Designer, имеющий сертификат МО.
Например при попытке отрисовки из violit2016.iml знака 0099950033010106 Разгран. линии между группир.
violit2016.iml - это динамическая библиотека, разработанная не нами, с закрытыми исходными кодами и отсутствием сертификации в системе безопасности.
Она может не работать в любой версии программ.
Мы отвечаем только за применение классификатора operator.rsc и библиотек iml с открытыми исходными кодами (в sdk12.zip).
Пожалуйста, направляйте Ваши вопросы по violit2016 в ту организацию, что поставила Вам это изделие.
Oleg Belenkov написал: Мы отвечаем только за применение классификатора operator.rsc и библиотек iml с открытыми исходными кодами (в sdk12.zip).
Скачал вчера с вашего сайта версию ГИС "Оператор" взял оттуда вышеуказанный классификатор и iml-файлы, прописанные в нем, чтобы проверить код, который вы привели выше. И приложение тоже падает при попытке отрисовать iml-значок.
Но пока падает, потому что не находит функцию:
Код
rsc object number: 420
object code: 713230028
rsc object function number: 250
symbol lookup error: /<путь к приложению>/rscarmy.iml64: undefined symbol: _Z8Koi82WinPci.
Oleg Belenkov написал: Пожалуйста, направляйте Ваши вопросы по violit2016 в ту организацию, что поставила Вам это изделие.
Если открыть в той же версии ГИС "Оператор", которую я скачал с вашего сайта, ссылку на которую привел в предыдущем сообщении, то в редакторе классификатора все значки отображаются, ничего не падает. Остается понять, как сделать также, чтобы ничего не падало при работе через MAPAPI при загрузке iml-значков.
Сергей написал: Скачал вчера с вашего сайта версию ГИС "Оператор", взял оттуда вышеуказанный классификатор и iml-файлы, прописанные в нем, чтобы проверить код, который вы привели выше. И приложение тоже падает при попытке отрисовать iml-значок.
Ну это же ваша библиотека, за которую вы отвечаете? А результат пока аналогичный.
Сергей написал: Скачал вчера с вашего сайта версию ГИС "Оператор", взял оттуда вышеуказанный классификатор и iml-файлы, прописанные в нем, чтобы проверить код, который вы привели выше. И приложение тоже падает при попытке отрисовать iml-значок.
Ну это же ваша библиотека, за которую вы отвечаете? А результат пока аналогичный.
iml - это динамическая библиотека, входящая в состав конкретного изделия. Вы же из Windows не будете библиотеки копировать? В состав ГИС Конструктор уже входят файлы rsc и iml. Ничего копировать из других изделий не нужно.