Приветствую!
ГИС Конструктор для Qt Designer x64 (версия 12.5.2, 13.0.0), ОС Astra Linux
В процессе переопределения функций отрисовки возникли вопросы и проблемы:
1. Возможно ли переопределение отрисовки точечных объектов?
2. "Стандартный" отрисовщик точечных объектов заполняет alpha не на всех масштабах.
3. С использованием ГИС Конструктор для Qt Designer x64 (версия13.0.0) тест правильно рисует только на масштабе 1:200 000 (видимо какие-то проблемы с габаритами карты, не разбирался)
Подробнее по второму вопросу-проблеме:
Для отрисовки использую функцию [B]mapPaintToXImageEx[/B] с erase = -2 (без заполнения XIMAGEDSC).
Сам XIMAGEDSC перед отрисовкой заполняю 0xFFFFFF00.
При отрисовке карты в режиме VT_PRINTRST получаю изображения карты с прозрачностью как с использованием отрисовщиков на Qt (из состава ГИС Конструктор) так и с использованием переопределенных отрисовщиков на cairo.
Но при отрисовке точечных объектов прозрачность остается без изменения (0), в результате точечный объект не виден на изображении, хоть RGB и заполнено.
Интересно, что на некотором масштабе (на каком именно так и не понял закономерности), прозрачность при рисовании все же заполняется.
[B]mapPaintByFrameToXImage[/B] не использую, т.к. в ней где-то на преобразовании и округлении что-то идет не так и в результате два соседних фрагмента карты иногда на "стыке" имеют дефекты. Но при ее использовании точечные объекты рисуются нормально.
Пример:
[CODE]#include <QApplication>
#include <QString>
#include <QDebug>
#include "qdmcmp.h"
#include "mapapi.h"
#include "sitapi.h"
#include "mapcreat.h"
#include "maptype.h"
void paintMapByFrame(HMAP aHMAP, int aAlpha, QString aFileName) {
DFRAME frame;
mapGetTotalBorder(aHMAP, &frame, PP_PICTURE);
int width = frame.X2 - frame.X1;
int height = frame.Y2 - frame.Y1;
if (width > 3000 || height > 3000) {
qDebug() << "large image";
return;
}
mapGetTotalBorder(aHMAP, &frame, PP_PLANE);
XIMAGEDESC desc;
memset((void*) &desc, 0, sizeof(desc));
desc.Width = width;
desc.Height = height;
desc.Depth = mapGetMapScreenDepth();
desc.CellSize = desc.Depth / 8;
desc.RowSize = desc.Width * desc.CellSize;
desc.Point = (char*) malloc(desc.Height * desc.RowSize);
mapPaintByFrameToXImage(aHMAP, &desc, &frame, width, height, aAlpha);
QImage im((const uchar*) desc.Point, desc.Width, desc.Height, desc.RowSize,
QImage::Format_ARGB32);
if (!im.save(aFileName, "PNG")) {
qDebug() << "image save error";
}
free((void*) desc.Point);
}
void fillImage(XIMAGEDESC* aImage, int aColor) {
char vals[4];
for (int i = aImage->CellSize -1;i >=0; i--) {
vals[i] = aColor & 0xFF;
aColor >>= 8;
}
int length = aImage->RowSize * aImage->Height;
for (int i =0; i<length;) {
for (int j=0;j<aImage->CellSize;j++) {
aImage->Point[i] = vals[j];
i++;
}
}
}
void paintMap(HMAP aHMAP, int aErase, QString aFileName) {
DFRAME frame;
mapGetTotalBorder(aHMAP, &frame, PP_PICTURE);
RECT rect;
rect.left = frame.X1;
rect.right = frame.X2;
rect.top = frame.Y1;
rect.bottom = frame.Y2;
if (rect.right - rect.left > 3000 || rect.bottom - rect.top > 3000) {
qDebug() << "large image";
return;
}
XIMAGEDESC desc;
memset((void*) &desc, 0, sizeof(desc));
desc.Width = rect.right - rect.left;
desc.Height = rect.bottom - rect.top;
desc.Depth = mapGetMapScreenDepth();
desc.CellSize = desc.Depth / 8;
desc.RowSize = desc.Width * desc.CellSize;
desc.Point = (char*) malloc(desc.Height * desc.RowSize);
fillImage(&desc, 0xFFFFFF00);
mapPaintToXImageEx(aHMAP, &desc, aErase, 0, 0, &rect);
QImage im((const uchar*) desc.Point, desc.Width, desc.Height, desc.RowSize,
QImage::Format_ARGB32);
if (!im.save(aFileName, "PNG")) {
qDebug() << "image save error";
}
free((void*) desc.Point);
}
// тест рисования точечных объектов в принтерно растровом виде
int main(int argc, char **argv) {
if (!QApplication::instance()) {
static int argc = 1;
static char arg[] = "test";
static char *argv[1] = { arg };
QApplication::setGraphicsSystem("native");
new QApplication(argc, argv);
}
QDMapView mv;
mapMessageEnable(0);
QString *siteName = new QString("test.sitx");
QString *rscName = new QString("operator.rsc");
CREATESITEUN cs;
memset((void*) &cs, 0, sizeof(cs));
cs.Length = sizeof(CREATESITEUN);
cs.EllipsoideKind = 9;
cs.MapType = 16;
HMAP hmap = mapCreateSiteUn((const WCHAR*) siteName->constData(),
(const WCHAR*) rscName->constData(), &cs);
if (hmap != 0) {
HOBJ hobj = mapCreateObject(hmap);
if (hobj != 0) {
if (mapDescribeObject(hobj, 3L) != 0) {
mapAppendPointGeoWGS84(hobj, 1., 1., 0);
mapCommitObject(hobj);
}
mapFreeObject(hobj);
}
hobj = mapCreateObject(hmap);
if (hobj != 0) {
if (mapRegisterObjectByKey(hobj, "009991001001") != 0) {
mapAppendPointGeoWGS84(hobj, 1., 1., 0);
mapCommitObject(hobj);
}
mapFreeObject(hobj);
}
mapSetViewType(hmap, VT_PRINTRST);
mapSetRealShowScale(hmap, 100000);
paintMap(hmap, 0, "/tmp/mapQt100.png");
paintMap(hmap, -2, "/tmp/mapQt100WithAlpha.png");
mapSetRealShowScale(hmap, 200000);
paintMap(hmap, 0, "/tmp/mapQt200.png");
paintMap(hmap, -2, "/tmp/mapQt200WithAlpha.png");
mapCloseMap(hmap);
}
}
[/CODE]Результат:
[URL=https://drive.google.com/open?id=1pk-Qi5Smt58IZMdtbOn8wvDv7jeT6iGf]без прозрачности[/URL]
[URL=https://drive.google.com/open?id=1yar4WE7taI08tFMPBQreeUYjtUTcpHyJ]с прозрачностью[/URL]
[URL=https://drive.google.com/open?id=1ezLMI_rQIEyfN_Le8eGuieFOq5eNvCUq]с прозрачностью PaintByFrame[/URL]
С уважением,
Матвеев П.В.