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

Получение изображения объекта из классификатора с учетом семантик

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2
RSS
Получение изображения объекта из классификатора с учетом семантик, Получение изображения объекта из классификатора с учетом семантик, которые могут влиять на его отображение
 
Цитата
Сергей Гамов написал:
На чьё имя должен быть запрос?
Генеральный директор АО КБ Панорама - Кириченко Сергей Григорьевич.
 
Здравствуйте!
Привожу пример работы с функцией mapPaintExampleObjectByFuncDataToXImage
Код
 DRAWPOINT metric[2];
 metric[0].X = 10;
 metric[0].Y = 10;
 metric[1].X = 90;
 metric[1].Y = 90;

 POLYDATAEX data;
 int polyCounts = 2;
 data.Points =&metric[0];
 data.Count = 1;
 data.PolyCounts = &polyCounts;
 data.Text  = 0;

 COLORREF mapColors[256];
 memset(mapColors, 0, sizeof(mapColors));
 long mapColorsCount = mapGetSiteColorsCount(mapHandle, mapHandle);
 mapGetSiteColors(mapHandle, mapHandle, mapColors, mapColorsCount);

 int paintWidth = 100;
 int paintHeight = 100;
 int paintDepthInBytes = 4;
 int paintMemorySize = paintWidth * paintHeight * paintDepthInBytes;
 char *paintMemory = AllocateTheMemory(paintMemorySize);
 memset(paintMemory, 0xFF, paintMemorySize);

 XIMAGEDESC imagedesc;
 memset(&imagedesc, 0, sizeof(imagedesc));
 imagedesc.Point = paintMemory;
 imagedesc.CellSize = paintDepthInBytes;
 imagedesc.Depth = paintDepthInBytes * 8;
 imagedesc.Width = paintWidth;
 imagedesc.Height = paintHeight;
 imagedesc.RowSize = imagedesc.Width * imagedesc.CellSize;

 RECT rect;
 rect.left = 0;
 rect.right = paintWidth-1;
 rect.top  = 0;
 rect.bottom = paintHeight-1;

 IMGLINE lineParam;
 lineParam.Color = RGB(0,255,0);
 lineParam.Thick = PIX2MKM(5);

 mapPaintExampleObjectByFuncDataToXImage(mapHandle, &imagedesc, 0, 0, &rect,
                                         IMG_LINE, (char*)&lineParam, &data, mapColorsCount, mapColors);

 QImage image((uchar *)paintMemory, paintWidth, paintHeight, QImage::Format_RGB32);
 image.save("/tmp/test.bmp");

 
Цитата
Эдуард Портнягин написал:
Привожу пример работы с функцией mapPaintExampleObjectByFuncDataToXImage
Извините, но создаётся впечатление, что этот пример рисует какую-то произвольную линию, а не условный знак из классификатора, такой, чтобы его вид был пользовательским и зависел бы от значений семантик. Лучше всего - на примере условного знака из классификатора operator.rsc, именно об этом идёт речь в этом топике.
 

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

Привожу пример кода рисования образца объекта из классификатора, вид которого зависит от семантики.

   

Код
QString FileName= QString::fromUtf16(WTEXT("/usr/share/gisdesigner/examples/Data/Специальные карты/Оперативная обстановка/RedExample/battalion red/BattalionRed.sitx"));
HMAP mapHandle = mapOpenDataUn(FileName.utf16());
if(!mapHandle)
  return;

HOBJ hobj = mapCreateObject(mapHandle);
if(!hobj)
  return;

mapReadObjectByKey(mapHandle, mapHandle, hobj, 1, 53); // Танк

//Найти семантику "Государственная принадлежность" (код 1100)
int semanticNumber = 0;
for(int number = 1; number < mapSemanticAmount(hobj); number++)
{
  long int code = mapSemanticCode(hobj, number);
  if(code == 1100)
  {
    semanticNumber = number;
    break;
  }
}

if(!semanticNumber)
  return;

int clipheight = 150;
int clipwidth = 200;

DFRAME objectFrame;
if(!mapObjectFrame(hobj, &objectFrame))
  return;

double objectCenterX = (objectFrame.X1 + objectFrame.X2)/2.0;
double objectCenterY = (objectFrame.Y1 + objectFrame.Y2)/2.0;
mapPlaneToPicture(mapHandle, &objectCenterX, &objectCenterY);

RECT rect;
rect.left = objectCenterX - clipwidth/2;
rect.top = objectCenterY - clipheight/2;
rect.right = objectCenterX + clipwidth/2;
rect.bottom = objectCenterY + clipheight/2;

QImage tempImage(clipwidth, clipheight, QImage::Format_RGB32 );

char semanticValue[MAX_PATH_LONG];

// Установка гос.принадлежности "Свой"
strcpy(semanticValue, "1");
if(!mapSetSemanticValue(hobj, 1, semanticValue, sizeof(semanticValue)))
  return;

// Отрисовка объекта
if(!mapPaintMapObjectToDib(mapHandle, (char*)tempImage.bits(), tempImage.width(),
                           tempImage.height(), &rect, 0, hobj ))
  return;
tempImage.save("/tmp/0000_tank1.png");

// Установка гос.принадлежности "Противник"
strcpy(semanticValue, "2");
if(!mapSetSemanticValue(hobj, 1, semanticValue, sizeof(semanticValue)))
  return;

// Отрисовка объекта
if(!mapPaintMapObjectToDib(mapHandle, (char*)tempImage.bits(), tempImage.width(),
                           tempImage.height(), &rect, 0, hobj ))
  return;
tempImage.save("/tmp/0000_tank2.png");

Изменено: Эдуард Портнягин - 22.03.2022 15:08:29
 
Цитата
Эдуард Портнягин написал:
Привожу пример кода рисования образца объекта из классификатора, вид которого зависит от семантики.
Слушайте, ну это уже издевательство какое-то. Ув. тов. Олег Беленков ясно сказал, что можно использовать функцию mapPaintExampleObjectByFuncDataToXImage для отрисовки изображения объекта классификатора с учётом значения семантик. Я попросил у него рабочий пример кода с этой функцией, используемой для этой цели. Вместо этого мне отвечаете Вы и то какую-то ненужную линию рисуете с помощью этой функции, то совершенно другую функцию используете.

Если не знаете, как на заданный вопрос ответить, то и не отвечайте. Если знаете, что ответа не существует - так и напишите, ошибся ув. тов. Олег Беленков.
 
Цитата
Илья Аникин написал:
Цитата
Oleg Belenkov написал:
Примеры формирования есть в коде IMLAPI (см. sdk13.zip\imlapi)s57navy\imlmain.cpp  Код_IMLIMP long int _IMLAPI imlPaintExampleEx(long int type, const IMGDRAW * parm, const IMGCONTEXT * context,
                                          HRSC hrsc, const char * semantic)
  ...
  POLYDATAEX  data;

                              // Ident    Length    Code  Type Scale  Value
  unsigned char Semantic[] = { 0xFF, 0x7F,  16, 0,  136, 0,  2,   0,   100, 0, 137, 0,  2,   0,   170, 0};

  data.Semantic   = (char*)semantic;
Насколько я понял, в вашем пример берется конкретная семнатика { 0xFF, 0x7F,  16... }. Откуда мне взять все эти циферки для семантики, которая интересует меня "Гос. принадлежность" код 1300?

Если нужно отрисовать в окошке отдельно реальный объект с учетом его семантик, то функции типа PaintExample не для этого.
Если нужен пример знака, но с учетом некоторых семантик, то нужно задать запись семантики.
Для ее формирования есть классы, описанные в sdk14.zip\include\semdef.h и  mapsem.h. Реализация в sdk14.zip\mapacces\semdef.cpp и  mapsem.cpp.

В sdk14.zip\imlapi\shape\shapesq.cpp есть пример заполнения семантик для отрисовки примера знака (Круговая диаграмма),
с учетом кодов семантик, заданных в описании знака:
Код
// --------------------------------------------------------
// Заполнить запись семантики для отрисовки примера знака
// --------------------------------------------------------
int GetPieChart10Semantic(TLongString& buffer, const IMGDRAW* draw)
{
  buffer.Clear();

  int semcount = 0;

  struct SEMRECORD
  {
    SEMANTIC head;
    struct SEMBLOCK
    {
      unsigned short int code;
      SEMLONG  item;
    }
    block[10];
  }
  semantic;

  memset(&semantic, 0, sizeof(semantic));
  semantic.head.Clear();

  int value[10] = { 10, 5, 7, 13, 8, 12, 6, 14, 4, 6 };

  for (int i = 1; i <= 10; i++)
  {
    IMGLONG* parm = (IMGLONG*)imlDrawParm(draw, i * 2 + 2);
    if (parm)
    {
      int semcode = parm->Value;
      if (semcode)
      {
        semantic.block[i - 1].code = semcode;
        semantic.block[i - 1].item.Type = 4;
        semantic.block[i - 1].item.Value = value[i - 1];
        semcount++;
      }
      else
        break;
    }
  }

  if (semcount == 0)
    return 0;

  semantic.head.SetLength(semantic.head.GetLength() + semcount * sizeof(semantic.block[0]));
  buffer.addValue((char*)&semantic, semantic.head.GetLength());
  return 1;
}

В данном случае семантики типа Целое число (4 байта). Это не универсальный пример.

Для универсальности можно применить класс TSemnEdit. Добавить туда нужные записи и передать в структуру POLYDATAEX адрес записи (TSemnEdit::Address()).

Для исключения линковки методов класса из других библиотек нужно включать в код #include "mapmacro.h"

Код
#include "mapmacro.h"
#include "mapsem.h"

POLYDATAEX  data;
TSemnEdit semedit;

semedit.Append(1300, 3); // код - 1300 (признак цвета), 3 - зеленый ...

 data.Semantic = semedit.Address();

...
И включить в проект файлы mapsem.cpp, semdef.cpp.
 
Цитата
Oleg Belenkov написал:
Для ее формирования есть классы, описанные в sdk14.zip\include\semdef.h и  mapsem.h. Реализация в sdk14.zip\mapacces\semdef.cpp и  mapsem.cpp.
Если Вы имели ввиду архив sdk14_linux.zip, доступный для скачивания с вашего сайта по ссылке https://gisinfo.ru/download_linux/?id=150 , то ни одного из названных Вами файлов в этом архиве нет. А где, Вы говорите, поискать универсальный класс TSemnEdit?

А если файл sdk14.zip, доступный для скачивания из раздела "Программы для Windows", то вопрос здесь задан в разделе форума "Средства разработки ГИС-приложений для Linux". Вы имеете ввиду, что надо выдрать пару файлов из виндового SDK?
Изменено: Сергей Гамов - 22.03.2022 19:28:57
 
Обновили тексты в semdef.cpp и semdef.h.
Добавлен класс для формирования записи семантики - TSemanticRecord

Пример формирования семантики теперь выглядит так:
Код
// --------------------------------------------------------
// Заполнить запись семантики для отрисовки примера знака
// --------------------------------------------------------
int GetBarChart10ValueSemantic(TSemanticRecord& semrecord, const IMGDRAW* draw)
{
  int semcount = 0;
  int value[10] = { 10, 5, 7, 13, 8, 12, 6, 14, 4, 6 };

  for (int i = 1; i <= 10; i++)
  {
    IMGLONG* parm = (IMGLONG*)imlDrawParm(draw, i * 2 + 3);
    if (parm)
    {
      int semcode = parm->Value;
      if (semcode)
      {
        semrecord.Append(semcode, value[i - 1]);
        semcount++;
      }
      else
        break;
    }
  }

  if (semcount == 0)
    return 0;

  return 1;
}

Вызов функции выглядит так:
Код
   case IMG_BARCHART10VALUE:
   {
     TSemanticRecord semrecord;

     // Заполнить семантику ...
     if (GetBarChart10ValueSemantic(semrecord, parm) != 0)
       data.Semantic = (char*)semrecord.Address();

     count[0] = 1;
     points[0].x = (points[0].x + points[1].x) / 2;
     points[0].y = (points[0].y + points[1].y) / 2;
     return BarChart10Value(&data, parm, context, 0, 0);
   }
Тексты обновлены в архиве sdk14.zip

Архив для Linux будет обновлен позже.
Тексты ядра (включая semdef.cpp) являются общими для всех платформ.
 
Ок, спасибо. Согласитесь, догадаться, что для разработки программы под Linux нужно потрошить SDK под другую платформу, при наличии-то "родного" SDK, было невозможно.
Страницы: Пред. 1 2
Читают тему (гостей: 1)



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

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