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

Отображение площадного объекта при создании

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Отображение площадного объекта при создании
 
ГИС Конструктор 12 для Astra Linux
Частично код динамического отображения создаваемого площадного объекта посмотрел в виндусовом TMapCreateObject, но создаваемый объект при движении мыши мелькает и опять пропадает.
Последовательность отрисовки такая:
1) При нажатии кнопки "Создать зону:
Код
mapAction=maCreateSquareObject;
newObj=mapCreateSiteObject(hMap,hSiteNet, IDDOUBLE2, 0);
mapRegisterObject(newObj,CODE_RZM_ZONE,LOCAL_SQUARE);
mapSetObjectSpline(newObj,50);

FxDC.xcDisplay = QX11Info::display();
FxDC.xcWindow = vMap->GetMapViewAcces()->winId();
FxDC.xcContext = XCreateGC(FxDC.xcDisplay, FxDC.xcWindow, 0, NULL);
FxDC.xcPoint.X = 0;
FxDC.xcPoint.Y = 0;

FImgObj.Color    = IMGC_NOMARK;
FImgObj.Incode   = mapObjectCode(newObj);
FImgObj.Excode  = CODE_RZM_ZONE;
FImgObj.Local   =   IMGL_SQUARE;
FImage.Image     = IMG_OBJECT;
FImage.Mode      = R2_COPYPEN;
FImage.Parm      = (char*)&FImgObj;
2) При нажатии кнопки мыши:
Код
if (mapAction==maCreateSquareObject){
       vMap->GetMapLeftTop(&valx, &valy);
      valx+=x;
      valy+=y;
        double dx=valx;
        double dy=valy;
        mapPictureToPlane(hMap,&dx,&dy);
        mapAppendPointPlane(newObj,dx,dy);
        //vMap->Repaint();//нет эффекта отрисовки
        this->update();//что-то мелькает на экране
    }

3)  При движении мыши
Код
if (mapAction==maCreateSquareObject){
        //vMap->Repaint();//нет эффекта отрисовки
        this->update();//что-то мелькает на экране
        return;
    }
4) При получении сигнала SignalAfterPaint
Код
if (mapAction==maCreateSquareObject){
        //Эллипс чисто для проверки отображения
        p->setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap));
        p->setBrush(QBrush(Qt::red, Qt::SolidPattern));
        p->drawEllipse(100, 50, 50, 50);

        DOUBLEPOINT pt;
        pt.x=cx;
        pt.y=cy;
        mapViewMapObject(hMap,(HWND)&FxDC,&pt,&FImage,newObj,PP_PICTURE);
    }
5) При двойном нажатии мыши (завершить)
Код
if (mapAction==maCreateSquareObject){
        mapCommitObject(newObj);
        mapFreeObject(newObj);
        vMap->Repaint();

        XFreeGC(FxDC.xcDisplay,FxDC.xcContext);
        memset(&FxDC,0,sizeof(XCONTEXT));
        mapAction=maNone;
    }
Объект на карте создается нормально, только вот хотелось бы тотображения в процессе создания.
А вот красный эллипс отображается нормально и исчезает после завершения операции.
 

Мерцание на экране происходит при вызове this->update(), который выполняет полную перерисовку карты. В Вашем случае для отображения динамического объекта нужно перерисовывать только часть экрана, занимаемую объектом. Технология отображения динамического объекта с исключением мерцания описана в документе «ГИС Конструктор для Qt Designer SE ПАРБ.00008-02 Руководство программиста», п.3.8.8 «Отображение подвижных объектов». Ссылка для скачивания документа: https://gisinfo.ru/download/doc.htm#28

Пример реализации технологии двойной буферизации можно посмотреть в исходных текстах класса QDMapViewWindow — родительского класса компонента QDMapView, входящего в состав ГИС Конструктора (модуль qdmwina.cpp, метод QDMapViewWindow::PaintOfMapAcces).

 
Я наверно не правильно выразился, мерцание - это значит объект рисуется и тут же стирается до нового движения мыши
 

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

Для проверки описанного Вами поведения программы с отрисовкой динамического объекта прошу сформировать минимальный тестовый пример, демонстрирующий проблему, и прислать его с тестовыми данными на нашу почту: panorama@gisinfo.ru. Спасибо!

 

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

Спасибо за присланный тестовый пример.

Необходимо исключить вызов функции DrawObject() в MainWindow::vMap_SignalAfterPaint — в этом случае мерцание при перемещении мыши не наблюдается. И еще можно исключить вызов this→update() в MainWindow::vMap_SignalMouseMove — он ни на что не влияет.  

 
Конечно, если убрать DrawObject() , то не будет мерцаний, потому что не будет выполняться попытка отображения объекта средствами ГИС.
Останется только простое отображение линиями на канве, а это задача тривиальная.
Смысл вопроса был - как отобразить объект в его "настоящем виде", потому что если задавать площадной объект как описывающий сплайн, то его конечное отображение не будет совпадать с просто нарисованным многоугольником.
Получается, что функция mapViewMapObject работает как-то непонятно, отображая объект какими-то урывками. Такое ощущение, что после отображения карта опять перерисовывается.
Кому интересно, обсуждаемый пример здесь:https://disk.yandex.ru/d/_SUnyOkElZuNBA
Можно, конечно попробовать поставить Конструктор 14, без ключа карта Ногинска же откроется?
 
Цитата
Валерий Парусов написал:
Можно, конечно попробовать поставить Конструктор 14, без ключа карта Ногинска же откроется?
Да, карта Ногинска должна открыться без ключа.
Страницы: 1
Читают тему (гостей: 1)



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

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