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

Отображение объекта из rsc классификатора в диалоговом окне

Поиск  Пользователи  Правила  Войти
Форум » Linux » ГИС Панорама для Linux
Страницы: 1
RSS
Отображение объекта из rsc классификатора в диалоговом окне
 
Здравствуйте. Прочитал материал по данной теме на вашем форуме, но все еще возникает ошибка. Надеюсь на вашу помощь.
Необходимо отобразить объекты из rsc классификатора в диалоговом окне(ОС AstraLinux, графика на Qt). Возникла проблема при попытке использовать функцию mapPaintObject()программа каждый раз вылетает.

функция mapPaintExampleObjectByFuncToXImage(...) возвращает 1;

В качестве примера привожу мой код:
void Dialog::drawObject()
{
QPixmap *buf;

QStringfileName = QFileDialog::getOpenFileName(this, QString::null, HRSC(*.rsc)");

if (!mapCreateTempSite(fileName.toAscii().data())){
return;
   }
   HMAP hMap = mapCreateTempSite(fileName.toAscii().data());

   RECT *rect = new RECT;
rect->bottom = 0;
rect->left = 0;
rect->right = 40;
rect->top = 40;

   XCONTEXT cont;
cont.xcDisplay = ui->textBrowser->buf->x11Info().display();
cont.xcWindow = ui->textBrowser->winId();
cont.xcContext = XCreateGC(cont.xcDisplay, cont.xcWindow, 0, 0);
cont.xcPoint.X = 0;
cont.xcPoint.Y = 0;

if (!mapGetActiveSite(hMap)) {
return;
   }
   HSITE hsite = mapGetActiveSite(hMap);

if (!mapGetRscIdent(hMap, hsite)) {
return;
   }
   HRSC hrsc = mapGetRscIdent(hMap, hsite);


intobjectCount = mapGetRscObjectCount(hrsc);

   RSCOBJECT *object = new RSCOBJECT;
for (inti = 1; i<= objectCount; i++) {

mapGetRscObject(hrsc, i, object);

mapPaintObject(hMap, (unsigned long int)(&cont), rect, object->Code);
}


}
 
Код
 // Отобразить отдельный объект карты в пределах фрагмента
 // в условных знаках карты
 // Может использоваться для вывода шаблонов объектов
 // hmap - идентификатор открытых данных
 // hdc   - идентификатор контекста устройства вывода,
 // rect  - координаты фрагмента карты (Draw)
 // info - идентификатор объекта карты в памяти
 // При ошибке в параметрах возвращает ноль
 // Размер картинки, рисуемой за один вызов, не более
 // текущих размеров экрана! Иначе - см. PaintToDib,PaintToImage...

_MAPIMP long int _MAPAPI mapPaintObject(HMAP hmap, HDC hdc, RECT *rect, HOBJ info);


Последний параметр - это объект карты в памяти, а не код объекта.

Больше подойдет одна из следующих функций:

Код
 // Отобразить образец вида объекта по номеру записи      
 // в классификаторе объектов (incode)
 // hmap - идентификатор открытой карты
 // hrsc - идентификатор классификатора открытой карты
 // hdc  - идентификатор контекста устройства вывода,
 // rect - координаты клиентской области окна вывода (размер окна)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapPaintExampleRscObject(HMAP hmap, HRSC hrsc, HDC hdc, RECT *rect, long int incode);

 // Отобразить образец вида объекта по номеру записи
 // в классификаторе объектов (incode)
 // hmap - идентификатор открытых данных
 // hdc  - идентификатор контекста устройства вывода,
 // rect - координаты фрагмента карты (Draw)
 // в изображении (Picture),
 // Используется в диалогах выбора вида объекта
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapPaintExampleObject(HMAP hmap, HDC hdc, RECT *rect, long int incode);

 
Функции mapPaintExampleRscObject () и mapPaintExampleObject()  отрабатывают без ошибок, но ничего не отображается. Я попробовал сменить pixmap на DMapObj – не помогает, так же пробовал менять incode(num, obj->Code – последний параметр в функциях отображения).
В качестве примера привожу мой код:
QString fileName = QFileDialog::getOpenFileName(this, QString::null, "/home/vxuser",Maps (*.rsc)");

   HMAP hMap = mapCreateTempSite(fileName.toAscii().data());
   if(!hMap) {
       qDebug()<<tr("Карта не создана");
       return;
   }

   HSITE hsite = mapGetActiveSite(hMap);
   if(!hsite) {
       qDebug()<<tr("Нет активной пользовательской карты");
       return;
   }

   HRSC hrsc = mapGetRscIdent(hMap, hsite);
   if(!hrsc) {
       qDebug()<<tr("Нет идентификтора классификатора карты");
       return;
   }

   ui->DMapObj->SetMapView(ui->DMapView);

   RECT *rect = new RECT;
   rect->bottom = 48;
   rect->left = 0;
   rect->right = 48;
   rect->top = 0;

   XCONTEXT cont;
   cont.xcDisplay = ui->DMapObj->x11Info().display();
   cont.xcWindow = ui->DMapObj->winId();
   cont.xcContext = XCreateGC(cont.xcDisplay, cont.xcWindow, 0, 0);
   cont.xcPoint.X = 0;
   cont.xcPoint.Y = 0;

   XIMAGEDESC imagedesc;
   char array[48*48*4];
   COLORREF colorimage[256];
   int deth = 32;
   int colorcount = mapGetSiteColorsCount(hMap, hMap);
   mapGetSitePalette(hMap, hMap, colorimage, colorcount);

   imagedesc.Point = (char *)array;
   imagedesc.Width = 48;
   imagedesc.Height = 48;
   imagedesc.Depth = deth;
   imagedesc.CellSize = 4;
   imagedesc.RowSize = 192;

   int objectCount = mapGetRscObjectCount(hrsc);

   RSCOBJECT *object = new RSCOBJECT;

   for (int pos = 1; pos <= objectCount; pos++) {

       mapGetRscObject(hrsc, pos, object);

       long int num =  mapGetRscObjectCodeByNumber(hrsc,  object->Code, object->Local);

       int val = mapPaintExampleObjectByFuncToXImage(hMap, &imagedesc, rect,
mapGetRscObjectFunction(hrsc, num),
(char *)mapGetRscObjectParameters(hrsc, num),
colorcount, colorimage, 0, object->Local);

       if (!mapPaintExampleObject(hMap, (long unsigned int)&cont, rect, object->Local)) {
           qDebug()<<tr("Ошибка при отрисовке объекта карты");
       }

       if (!mapPaintExampleRscObject(hMap, hrsc, (long unsigned int)&cont, rect, object->Local)) {
           qDebug()<<tr("Ошибка при отрисовке объекта карты");
       }

   }
 
1.Экземпляр компонента
Код
ui->DMapObj
не предназначен для рисования.
2.Функция
Код
mapPaintExampleObjectByFuncToXImage
отрисовывает объект в памяти. Затем его надо перенести на компонент Qt. Алгоритм использования можно посмотреть: http://gisweb.ru/forum/messages/forum7/topic640/message2556/#message2556
3.Пример использования аналогичной функции
Код
mapPaintToXImage 
находится в каталоге примеров ГИС Конструктор ./SDK/Qt4
 
Pixmap стал закрашиваться серым фоном, но объекты из rsc классификатора по прежнему не отрисовываются.
Функции mapPaintExampleRscObject () и mapPaintExampleObject()  отрабатывают без ошибок.
В качестве примера привожу мой код:
void Dialog::drawUserMap()
{
   QPainter painter;
   painter.begin(ui->textBrowser->buf);

   QString fileName = QFileDialog::getOpenFileName(this, QString::null, "/home/vxuser",
Maps (*.rsc)");

   hMap = mapCreateTempSite(fileName.toAscii().data());
   if(!hMap) {
       qDebug()<<tr("Карта не создана");
       return;
   }

   rect->bottom = ui->textBrowser->buf->height();
   rect->left = 0;
   rect->right = ui->textBrowser->buf->width();
   rect->top = 0;

   HSITE hsite = mapGetActiveSite(hMap);
   if(!hsite) {
       qDebug()<<tr("Нет активной пользовательской карты");
       return;
   }

   hrsc = mapGetRscIdent(hMap, hsite);
   if(!hrsc) {
       qDebug()<<tr("Нет идентификтора классификатора карты");
       return;
   }

   XIMAGEDESC imagedesc;
   char array[ui->textBrowser->buf->width()*ui->textBrowser->buf->height()*4];
   COLORREF colorimage[256];
   int deth = 32;
   int colorcount = mapGetSiteColorsCount(hMap, hMap);
   mapGetSitePalette(hMap, hMap, colorimage, colorcount);

   imagedesc.Point = (char *)array;
   imagedesc.Width = ui->textBrowser->buf->width();
   imagedesc.Height = ui->textBrowser->buf->height();
   imagedesc.Depth = deth;
   imagedesc.CellSize = deth/8;
   imagedesc.RowSize = imagedesc.Width*imagedesc.CellSize; // 192

   int objectCount = mapGetRscObjectCount(hrsc);

   RSCOBJECT *object = new RSCOBJECT;

   XCONTEXT cont;
   cont.xcDisplay = ui->textBrowser->buf->x11Info().display();
   cont.xcWindow = ui->textBrowser->winId();
   cont.xcContext = XCreateGC(cont.xcDisplay, cont.xcWindow, 0, 0);
   cont.xcPoint.X = 0;
   cont.xcPoint.Y = 0;

   for (int pos = 1; pos <= 4; pos++) {

       mapGetRscObject(hrsc, pos, object);

       int num = mapGetRscObjectCodeByNumber(hrsc, object->Code, object->Local);
       
       if (!mapPaintExampleRscObject(hMap, hrsc, (long unsigned int)&cont, rect, num)) {
           qDebug()<<tr("Ошибка при отрисовке объекта карты");
       }

       int val = mapPaintExampleObjectByFuncToXImage(hMap, &imagedesc, rect,
mapGetRscObjectFunction(hrsc, num),
(char *)mapGetRscObjectParameters(hrsc, num),
colorcount, colorimage, 0, object->Local);

       int ret = mapPaintToXImage(hMap, &imagedesc, 0, 0, rect);

       QImage imj((uchar *)array, imagedesc.Width, imagedesc.Height, QImage::Format_RGB32);

       painter.drawImage(rect->left, rect->top, imj, 0, 0, imagedesc.Width, imagedesc.Height);
   }

   //FreeTheMemory(array);
   painter.end();
}
 
Предлагаю начать с использования одной функции, допустим mapPaintExampleObjectByFuncToXImage. Пример, который я предлагаю взять за основу, находится каталоге примеров ГИС Конструктор ./SDK/Qt4.
Внести следующие изменения в функцию MapScroll::drawContents
Код
//      ret = mapPaintToXImage(hMap, &Ximagedesc, 0, 0, &RectDraw);
      HRSC hrsc = mapGetRscIdent(hMap, hMap); 
      RSCOBJECT object; 
      mapGetRscObject(hrsc, 1, &object);
      int num = mapGetRscObjectCodeByNumber(hrsc, object.Code, object.Local); 
      COLORREF colorimage[256]; 
      int deth = 32; 
      int colorcount = mapGetSiteColorsCount(hMap, hMap); 
      mapGetSitePalette(hMap, hMap, colorimage, colorcount); 

      int val = mapPaintExampleObjectByFuncToXImage(hMap, &Ximagedesc, &RectDraw, 
                   mapGetRscObjectFunction(hrsc, num), 
                   (char *)mapGetRscObjectParameters(hrsc, num), 
                   colorcount, colorimage, 0, object.Local); 

В результате будет отбражаться образец объекта классификатора в виде фиолетовой линии на карте Подольска.
 
Цитата
gislinux написал:
Предлагаю начать с использования одной функции, допустим  mapPaintExampleObjectByFuncToXImage . Пример, который я предлагаю взять за основу, находится каталоге примеров ГИС Конструктор ./SDK/Qt4.
Внести следующие изменения в функцию  MapScroll::drawContents
Код
 //      ret = mapPaintToXImage(hMap, &Ximagedesc, 0, 0, &RectDraw);
      HRSC hrsc = mapGetRscIdent(hMap, hMap); 
      RSCOBJECT object; 
      mapGetRscObject(hrsc, 1, &object);
      int num = mapGetRscObjectCodeByNumber(hrsc, object.Code, object.Local); 
      COLORREF colorimage[256]; 
      int deth = 32; 
      int colorcount = mapGetSiteColorsCount(hMap, hMap); 
      mapGetSitePalette(hMap, hMap, colorimage, colorcount); 

      int val = mapPaintExampleObjectByFuncToXImage(hMap, &Ximagedesc, &RectDraw, 
                   mapGetRscObjectFunction(hrsc, num), 
                   (char *)mapGetRscObjectParameters(hrsc, num), 
                   colorcount, colorimage, 0, object.Local); 
 

В результате будет отбражаться образец объекта классификатора в виде фиолетовой линии на карте Подольска.
Я немного не пойму что необходимо изменить в данном коде, чтобы он отрисовывал пример не на карте, а например на QLable?
 
Здравствуйте!

Обсуждение данного вопроса можно посмотреть в данной ветке форума: http://gisweb.ru/forum/messages/forum2/topic10007/message75918/10007-kak-otrisovat-primer-obekta-na-...
Изменено: Александр Савелов - 08.05.2019 17:14:04
Страницы: 1
Читают тему (гостей: 1)



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

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