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

Аварийное завершение программы при отрисовке образцов iml-значков

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 3 След.
RSS
Аварийное завершение программы при отрисовке образцов iml-значков
 
Программа аварийно завершается при попытке отобразить образец 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    Разгран. линии между группир.

можно увидеть следующий call stack:

1    TSemnEdit::Access(char *, int, int)            0x7fffd6685823    
2    ImageThickLine(void *, POLYDATAEX const *, const char *, float)            0x7fffd671ce57    
3    MetLine(void *, POLYDATAEX const *, const char *, float)            0x7fffd6720dc2    
4    ScreenDraw(void *, POLYDATAEX const *, const char *, float)            0x7fffd671a280    
5    imgPaintImageEx            0x7fffd65c3c9b    
6    imgPrepareImage(POLYDATAEX const *, int, const char *, IMGCONTEXT const *, int, FRAME *)            0x7fffad20dfd9    
7    Demarkator(POLYDATAEX const *, IMGDRAW const *, IMGCONTEXT const *, int, FRAME *)            0x7fffad1fa82f    
8    imlPaintExampleEx            0x7fffad1ed737    
9    llPaintExample(int, long, IMGDRAW const *, IMGCONTEXT const *, long, const char *)            0x7fffd6624a37    
10    CallExample(void *, const char *, float, int, long, const char *)            0x7fffd66aed84    
11    TMapPaint::PaintExampleObjectDib(unsigned long, _RECT&, int, const char *, POLYDATAEX *)            0x7fffd662f903    
12    macPaintExampleObjectByFuncDataToDib(TMapAccess *, _RECT *, int, char *, POLYDATAEX *, int, int *)            0x7fffd6600602    
13    macPaintExampleObjectByFuncToDib(TMapAccess *, _RECT *, int, char *, int, int *, char *, int, float)            0x7fffd6601019    
14    mapPaintExampleObjectByFuncToXImage            0x7fffd660d3bb    
Изменено: Сергей - 31.05.2019 12:58:16
 
Здравствуйте!

Прошу прощения за задержку с ответом.

Отрисовка образца условного знака, использующего 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-значков.
 
violit2016.iml - это динамическая библиотека, разработанная не нами, с  закрытыми исходными кодами и отсутствием сертификации в системе  безопасности.

Она может не работать в любой версии программ.

Мы отвечаем только за применение классификатора operator.rsc и библиотек iml с открытыми исходными кодами (в sdk12.zip).

Пожалуйста, направляйте Ваши вопросы по violit2016 в ту организацию, что поставила Вам это изделие.
 
Цитата
Сергей написал:
Скачал вчера с вашего сайта версию  ГИС "Оператор",  взял оттуда вышеуказанный классификатор и iml-файлы, прописанные в нем, чтобы проверить код, который вы привели выше. И приложение тоже падает при попытке отрисовать iml-значок.
Ну это же ваша библиотека, за которую вы отвечаете? А результат пока аналогичный.
 
Цитата
Сергей написал:
Цитата
Сергей написал:
Скачал вчера с вашего сайта версию  ГИС "Оператор",  взял оттуда вышеуказанный классификатор и iml-файлы, прописанные в нем, чтобы проверить код, который вы привели выше. И приложение тоже падает при попытке отрисовать iml-значок.
Ну это же ваша библиотека, за которую вы отвечаете? А результат пока аналогичный.

iml - это динамическая библиотека, входящая в состав конкретного изделия. Вы же из Windows не будете библиотеки копировать?
В состав ГИС Конструктор уже входят файлы rsc и iml. Ничего копировать из других изделий не нужно.
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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