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

Не отображается карта на Астра Линукс

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 След.
RSS
Не отображается карта на Астра Линукс, При попытке отобразить карту на Астре возникает проблема с Х11
 
Здравствуйте!

Возникла проблема с отображением карты на Астре(x64).
На МСВС(x32) карта отображается нормально.
Вот код приложения:
Код

#include "ui_mainwindow.h"
#include "mainwindow.h"
#include <QPainter>
#include <QX11Info>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->resize(800,600);

    image =new QPixmap(800,600);
    image->fill(QColor(100,0,0));
    mapRect.top=0;
    mapRect.bottom=mapRect.top+600;
    mapRect.left=0;
    mapRect.right=mapRect.left+800;


    ll=(double)mapRect.top;
    lr=(double) mapRect.bottom;
    bl=(double)mapRect.left;
    br=(double)mapRect.right;


    gContObj.hMap=mapOpenData("/ksa/wing/var/map/worldmap/8_mln.map",  GENERIC_READ );
    if(!gContObj.hMap) {
        qDebug()<<"LOAD MAP ERROR";
    }else{
        double  XNorthWest,YNorthWest;
        MAPREGISTER   mapreg;
        LISTREGISTER  listreg;
        mapGetMapInfo(gContObj.hMap, 11, &mapreg, &listreg);
        XNorthWest=listreg.XNorthWest; YNorthWest=listreg.YNorthWest;
        gContObj.Scale=mapreg.Scale;
        gContObj.br=listreg.BNorthWestCoordinate; gContObj.lr=M_PI;
        long xc,yc;
        mapSetViewScale(gContObj.hMap,&xc,&yc,gContObj.Scale);

        mapPictureToPlane(gContObj.hMap,&bl,&ll);
        mapPictureToPlane(gContObj.hMap,&br,&lr);
        mapPlaneToGeo(gContObj.hMap,&bl,&ll);
        mapPlaneToGeo(gContObj.hMap,&br,&lr);

        drawMap();
    }
}

void MainWindow::paintEvent( QPaintEvent * ){
    drawMap();
}

void MainWindow::resizeEvent ( QResizeEvent * re ){
    update();
}

void MainWindow::drawMap()
{
    if(!gContObj.hMap) return;

    QPainter painter;
    painter.begin(this);
    painter.drawPixmap(0, 0, *image);

    XCONTEXT FxDC;

    FxDC.xcDisplay = image->x11Info().display();
    FxDC.xcWindow= image->handle();
    FxDC.xcContext = XCreateGC(FxDC.xcDisplay, FxDC.xcWindow,  0 , NULL);
    HDC hdc = HDC(&FxDC);
    FxDC.xcPoint.X=0;
    FxDC.xcPoint.Y=0;
    mapPaint(gContObj.hMap,hdc,1,&mapRect);
    XFreeGC( FxDC.xcDisplay,FxDC.xcContext );

    painter.end();
}


MainWindow::~MainWindow()
{
    delete ui;
    delete image;
    mapCloseData(gContObj.hMap);
}



Ошибка выдаваемая на Астре:
Код
X Error: BadDrawable (invalid Pixmap or Window parameter) 9
  Major opcode: 55 (X_CreateGC)
  Resource id:  0x0
X Error: BadGC (invalid GC parameter) 13
  Major opcode: 60 (X_FreeGC)
  Resource id:  0x0


Приложение не падает, но и карту не рисует, только фон.
На вашем форуме нашел вот такой комментарий по похожей ошибке http://gisweb.ru/forum/messages/forum7/topic731/message3046/#message3046
Цитата

По предлагаемой ошибке предположу, что текущая глубина экрана не соотвествует глубине экрана библиотеки libqdmapacces.so
Допустим текущая глубина экрана = 24 бит-на-пиксел , а глубина экрана библиотеки libqdmapacces.so = 16.
Подскажите в чем еще может быть проблема?
Или проблема действительно именно в глубине цветов?
Глубину экрана на Астре поменять пока не получается.
Возможно ли проверить глубину экрана библиотеки libmapacces.so?

Спасибо.
Изменено: Артем Семиков - 19.02.2015 10:19:02
 
смог поменять глубину цветов, правда тестил на Астра СЕ 1.2, не помогло...

В чем может быть еще проблема?
 
Текст ошибки связан с корректностью вызова XCreateGC.
Игры с разрядностью видеокарты давно закончились. Сейчас все отображается в TrueColor.

Попробуйте поиск по форуму с текстом PaintToXImage.
Это более простой способ.
А в принципе нужно скачать ГИС Конструктор и ознакомиться с примерами.
 
Спасибо, обязательно попробую, к сожалению только во вторник.
 
Измнил код drawMap(), чтоб рисовал через mapPaintToXImage.
Код
   
void MainWindow::drawMap()
{
 if(!gContObj.hMap) return;

    int cx = 0;
    int cy = 0;
    int cw = 800;
    int ch = 600;


    QPainter p;
    int x, y;

    p.begin(this);
    qDebug()<<"mapGetMapScreenDepth = "<<mapGetMapScreenDepth();
    int mapdepth = 32;
    XIMAGEDESC Ximagedesc;

    // Дополнительный параметр mapdepth байт
    long allignwidth = cw * (mapdepth / 8 );
    long size = allignwidth*ch;
    char * bits = ::AllocateTheMemory(size);
    int ret;

    if (!bits) return;
    memset(bits, 0x0, size);

    Ximagedesc.Point = bits; // Адрес начала области пикселов
    Ximagedesc.Width = cw; // Ширина строки в пикселах
    Ximagedesc.Height = ch; // Число строк
    Ximagedesc.Depth = mapdepth; // Размер элемента в битах (8,15,16,24,32)
    Ximagedesc.CellSize = mapdepth / 8; // размер элемента(пиксела) в байтах
    Ximagedesc.RowSize = cw * Ximagedesc.CellSize;// Ширина строки в байтах

    RECT RectDraw;
    RectDraw.left = cx ;
    RectDraw.top = cy ;
    RectDraw.right = cx + cw;
    RectDraw.bottom = cy + ch;

    // Отобразим фрагмент карты в памяти
    ret = mapPaintToXImage(gContObj.hMap, &Ximagedesc, 0, 0, &RectDraw);

    QImage image((uchar *)bits, cw, ch, QImage::Format_RGB32);
    p.drawImage(cx, cy, image, 0, 0, cw, ch);
    qDebug()<<"mapPaintToXImage";
    FreeTheMemory(bits);
    p.end();
}

Ошибку иксов не выдает, но вместо карты рисует черный цвет, грешу на QImage::Format_RGB32 и int mapdepth = 32, но перебрав их комбинации результата не добился, на МСВС как всегда все рисуется отлично(
В чем теперь может быть моя проблема?
Изменено: Артем Семиков - 24.02.2015 14:10:05
 
Цитата
Oleg Belenkov пишет:
А в принципе нужно скачать ГИС Конструктор и ознакомиться с примерами.
Скачал gisdesigner, в примере  example/gisdesigner11/Sdk/Qt4 та же самая ситуация - МСВС - все ок, Астра - черный фон, пробовал открывать и свои карты и Podolsk.
Буду рад любым вашим идеям.

Ваши советы? что попробовать?
 
Спасибо, на всякий случай - лог при выборе для открытия карты на Астре:

Запуск
Код
Got bus address:  "unix:abstract=/tmp/dbus-w1lvWXRgHb,guid=006084d5ad55833625f921e854e33868"
Connected to accessibility bus at:  "unix:abstract=/tmp/dbus-w1lvWXRgHb,guid=006084d5ad55833625f921e854e33868"
Registered DEC:  true
Registered event listener change listener:  true


Выбор файла:
Код
QSpiAccessible::accessibleEvent not handled:  "6"  obj:  QMenu(0x6717a0, name = "menuFile") "menuFile"
QSpiAccessible::accessibleEvent not handled:  "7"  obj:  QMenu(0x6717a0, name = "menuFile") "menuFile"
QIcon: Cannot load icon system from theme.
QSpiAccessible::accessibleEvent not handled:  "8008"  obj:  QObject(0x0)  " invalid interface!"
QSpiAccessible::accessibleEvent not handled:  "8008"  obj:  QSidebar(0x68d130, name = "sidebar") "sidebar"
FIXME: handle dialog start.
QSpiAccessible::accessibleEvent not handled:  "8008"  obj:  QListView(0x6abdc0, name = "listView") "listView"
QSpiAccessible::accessibleEvent not handled:  "8008"  obj:  QObject(0x0)  " invalid interface!"


Нажимаем в диалоговом окне "Открыть"
Код
FIXME: handle dialog end.

Далее вместо карты загружается черный фон.
Спасибо.
 
А каким инструментарием Вы пользуетесь?
Может библиотеки для МСВС на AstraLinux проверяете?
 
Как мне кажется тогда бы ничего не собиралось, разве нет?

Все файлы .h (mapdat.h    mapold.h    mapversn.h    mtrapi.h    rscapi.h   seekapi.h    tinbase.h    mapapi.h    maperr.rh   mapsyst.h    measure.h    tin.h    mapcreat.h    mapgdi.h    maptrace.h    rstapi.h    sitapi.h      mapdata.h   mapmacro.h  maptype.h  tinapi.h )- взяты с МСВС из  старой поставки, в этом может быть проблема?

У меня есть operator.deb, я поставил Оператор на Астру СЕ 1.4, и использую библиотеку которую после установки взял из директории /usr/Operator11/libmapacces.so

В файлике readme написано

   |----------------+-----------------------------------------------------|
   |  Каталог       |               Содержание                            |
   |----------------+-----------------------------------------------------|
   | /usr/Operator11| Инсталляционный  комплект                           |
   |                | ГИС "Оператор" (версия 11.11.9, ОС Astra Linux,     |
   |                | Смоленск, релиз 1.3, Qt4)                           |
   |                | Инсталляция в файле - operator.deb                  |
   |________________|_____________________________________________________|

Карты в самом операторе на Астра СЕ 1.4 открываются нормально.

Ну да, версии Астры не сходятся для достижения цели, но на Астра СЕ 1.2 и Астра 1.3 я получаю тот же результат (черный фон), необходимо чтобы хоть где то заработало, уже будет хорошо, т.к. что то мне подсказывает что проблема одна и та же.

Все верно? или мне попробовать поставить Оператор на 1.3? брать либу оттуда? или может там дополнительно что то куда то прописывается? (на Астру СЕ 1.2 и Астру СЕ 1.3 Оператор не ставил, пользуюсь либой с 1.4)
Изменено: Артем Семиков - 25.02.2015 10:57:40
 
Для отображения карт по-умолчанию применяется так называемый принтерный вид. Он отображается
с применением библиотек Qt, которые могут отсутствовать в чистой версии ОС.
Если ГИС Оператор работает, то все необходимые библиотеки есть. Они прописаны в readme.txt в составе инсталляции
ГИС Оператор.
Применение библиотек из состава ГИС Оператор для написания приложений является нарушением технологии
разработки автономных приложений и не диагностируется.
Нормальным способом является применение библиотек из состава ГИС Конструктор.
Может проблема в том, что компонент отображения карты сам подгружает нужные библиотеки Qt и инициализирует
их, может еще в каких действиях. Это потеря времени.

В экранном виде отображения внешние библиотеки не применяются, но качество изображения хуже.
В частности, в экранном виде не поддерживается AntiAliasing.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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