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

Штриховка произвольных областей

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Штриховка произвольных областей, Необходимо заштириховать область пересечения нескольких плоских фигур
 
Привет форумчане, передо мной встала задача выделить штриховкой область, получившуюся в результате пересечения нескольких окружностей, можно ли это реализовать силами Gis Tool Kit?
 
Самый простой способ - иметь нужный полигон со штриховкой в классификаторе карты и выполнять отрисовку им.

Другой способ - применение mapPaintUserObject, где соответствующим образом заполнить PAINTPARM (описание в mapgdi.h).
 
Добрый вечер, не получилось разобраться с  mapPaintUserObject.
Использовал mapDrawImageMapObject, предварительно заполнив структуры IMGHATCHSQUARE и IMGLINE для создания контура области и ее штриховки, но на карте отрисовывается лишь рамка этой области (в данном примере - четырехугольник), штриховки нет. На форуме найти пример штриховки некоторой области не получилось.
В чем может быть проблема? Использую Gis Tool Kit для ubuntu 18.
   
Код
HMAP mapHandle = this->ui->DMapView->GetMapHandle();
    objVector.push_back( mapCreateSiteObject(mapHandle, mapHandle, IDDOUBLE2, 0));


    char* parm = (char*)malloc(sizeof(IMGHATCHSQUARE)+sizeof(IMGLINE));

    IMGHATCHSQUARE* hatch = (IMGHATCHSQUARE*)parm; //заполняю данную структуру, вроде бы правильно
    hatch->Angle = 45;
    hatch->Length = sizeof(IMGHATCHSQUARE) + sizeof(IMGLINE);
    hatch->Step = PIX2MKM(4);
    hatch->Number = IMG_LINE;

    IMGLINE* hatchline = (IMGLINE*)(parm + sizeof(IMGHATCHSQUARE)); //заполняю структуру линии
    hatchline->Color = RGB(r, g, b);
    hatchline->Thick = PIX2MKM(2);

    //тем не менее, на карте отрисовывается только рамка, никакой штриховки нет

    PAINTPARM image;
    image.Image = IMG_HATCHSQUARE;
    image.Parm = parm;
    image.Mode = R2_COPYPEN;

    mapRegisterObject(objVector.back(), 0, LOCAL_SQUARE);
  
    mapAppendPointPlane(objVector.back(), x, y, 0);
    mapAppendPointPlane(objVector.back(), x, y+2*radius, 0);
    mapAppendPointPlane(objVector.back(), x+2*radius, y+2*radius, 0);
    mapAppendPointPlane(objVector.back(), x+2*radius, y, 0);

    mapDrawImageMapObject(this->ui->DMapView->hScreen, mapHandle, &image, objVector.back());

    mapCommitObject(objVector.back()); // если не коммитить объект, то даже рамка не отрисовывается 

    QDMapObj *MapObj = new QDMapObj(centralWidget(), "mapObj");
    MapObj->SetMapView(this->ui->DMapView);
    MapObj->SetObjHandle(objVector.back());
    MapObj->Center();
   
    ui->DMapView->UpdatePictureBorderForAll();
    ui->DMapView->repaint();
Изменено: Nikolay Shvets - 20.07.2019 00:41:09
 
Цитата
Nikolay Shvets написал:
Добрый вечер, не получилось разобраться с mapPaintUserObject.
Применение mapPaintUserObject позволяет выполнить рисование по произвольной области, задаваемой метрикой непосредственно в этой функции.

Если Вы работаете с объектом, то и рисовать проще самим объектом. Но для того, чтобы объект стал графическим, его надо зарегистрировать как графический - mapRegisterDrawObject, после чего можно добавить ему графическое описание - mapAppendDraw. Как его заполнить Вы уже разобрались.
Далее объект можно либо сохранить в карту (mapCommitObject) - и тогда его отрисовкой будет заниматься ГИС-ядро, либо рисовать его самостоятельно, не сохраняя, - mapPaintObject95.

Можно также пропустить шаг добавления графики объекту и устанавливать функцию отрисовки непосредственно при отображении объекта - mapPaintMapObject95.


PS
Площадной объект должен быть замкнутым (первая и последняя точки должны совпадать). Commit может исправить такую неточность, добавив в конец метрики первую точку. Но лучше позаботиться об этом самостоятельно, особенно если Вы не будете вызывать Commit.
Страницы: 1
Читают тему (гостей: 1)



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

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