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

Александр Савелов (Все сообщения пользователя)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Александр Савелов
Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 ... 17 18 19 20 21 22 23 24 25 26 27 ... 69 След.
получение изображения объекта из классификатора
 
Здравствуйте!

Привожу пример отображения образцов объектов из классификатора перебором:
[CODE]#include <assert.h>
#include <iostream>

#include <QImage>

#include "mapapi.h"
#include "rscapi.h"

void PaintObject(HMAP mapHandle, HRSC rscHandle, long rscIncode)
{
 // Получить информацию по объекту из классификатора
 RSCOBJECT rscObject;
 mapGetRscObject(rscHandle, rscIncode, &rscObject);

 // Получить номер функции отображения и параметры из классификатора
 long rscObjectFunctionNumber = mapGetRscObjectFunction(rscHandle, rscIncode);
 assert(rscObjectFunctionNumber);

 const char *rscObjectParameters = mapGetRscObjectParameters(rscHandle, rscIncode);
 assert(rscObjectParameters);

 // Запросить параметры палитры карты (для отображения объекта)
 COLORREF palette[256];
 long colorCount = mapGetSiteColorsCount(mapHandle, mapHandle);
 mapGetSitePalette(mapHandle, mapHandle, palette, colorCount);

 // Выделить память для отрисовки объекта
 const int ICON_SIZE = 32;
 XIMAGEDESC ximageDesc;
 ximageDesc.Width = ICON_SIZE;
 ximageDesc.Height = ICON_SIZE;
 ximageDesc.Depth = 32;
 ximageDesc.CellSize = ximageDesc.Depth / 8;
 ximageDesc.RowSize = ximageDesc.Width * ximageDesc.CellSize;

 char *paintMemory = new char[ximageDesc.Width * ximageDesc.Height * ximageDesc.CellSize];
 ximageDesc.Point = paintMemory;
 assert(paintMemory);

 // Отрисовать образец объекта
 RECT rectDraw;
 rectDraw.left = 0;
 rectDraw.top = 0;
 rectDraw.right = ICON_SIZE;
 rectDraw.bottom = ICON_SIZE;

 char *objectText = NULL;
 long isPainted = mapPaintExampleObjectByFuncToXImage(mapHandle, &ximageDesc, &rectDraw, rscObjectFunctionNumber, (char *) rscObjectParameters, colorCount, palette, objectText, rscObject.Local);
 assert(isPainted);

 // Вывести картинку в файл
 QImage image((uchar *) (ximageDesc.Point), ximageDesc.Width, ximageDesc.Height, QImage::Format_ARGB32);
 image.save("/tmp/rsc-images/" + QString::number(rscIncode) + ".png");
}


int main()
{
 // Открыть карту
 WCHAR mapPath[MAX_PATH_LONG];
 mapPath[0] = 0;
 WcsCopy(mapPath, L"/usr/share/gisdesigner/examples/Data/Специальные\ карты/Оперативная\ обстановка/RedExample/battalion\ red/BattalionRed.sitx", sizeof(mapPath));

 HMAP mapHandle = mapOpenDataUn(mapPath);
 assert(mapHandle);

 // Открыть классификатор
 WCHAR rscPath[MAX_PATH_LONG];
 rscPath[0] = 0;
 WcsCopy(rscPath, L"/usr/share/gisdesigner/examples/Data/Специальные\ карты/Оперативная\ обстановка/RedExample/battalion\ red/operator.rsc", sizeof(rscPath));

 HRSC rscHandle = mapOpenRscUn(rscPath);
 assert(rscHandle);

 // Отрисовать образцы всех объектов в классификаторе
 for (int objectNumber = 1; objectNumber <= mapGetRscObjectCount(rscHandle); objectNumber++)
   PaintObject(mapHandle, rscHandle, objectNumber);

 mapCloseData(mapHandle);
 mapCloseMapAccess();

 return 0;
}[/CODE]
Зарамочное оформление карты через gisapi
 
Здравствуйте!

[QUOTE]Андрей Сычев написал:
1. Нет ли у вас шаблона  для 500 000 карты? В поставке Оператора для Астры он отсутствует.[/QUOTE]
На данный момент шаблон для карт масштаба 1 : 500 000 отсутствует в составе инсталляции ГИС Оператор SE для Astra Linux - мы дополним его в следующей версии.
Поскольку форматы файлов frm и rsc кроссплатформенны, то при возможности Вы можете использовать их из состава ГИС Оператор для Windows.
Если такой возможности нет, то мы можем скопировать Вам их в рабочем порядке.

[QUOTE]Андрей Сычев написал:
2. В коде диалога формирования рамки есть флажок формирования рамки для региона (из нескольких листов). Но в Operator11 для Астры я так и не смог добиться чтобы он показывался. Это вообще возможно?[/QUOTE]
Для этого необходимо создать многолистовую карту формата map - например, с помощью импорта набора файлов sxf.
Печать карть программным способом под операционной системой МСВС
 
Здравствуйте!

Значения CutListFlag и FormatPage структуры SCRIPTPARAM в процессе непосредственной печати карты участия не принимают (используются в служебных целях при работе с диалогом).
Формат печати необходимо указывать непосредственно в классе QPrinter. Например:
[CODE]printer->setPaperSize(QPrinter::A5);[/CODE]Прикрепляю модифицированный пример с учетом данных правок:
[CODE]#include <QApplication>#include <QPrinter>

#include "qdmcmp.h"

#include "mapapi.h"
#include "struct.h"

struct BORDER
{
 DOUBLEPOINT UpLeft;
 DOUBLEPOINT UpRight;
 DOUBLEPOINT DownRight;
 DOUBLEPOINT DownLeft;
 DOUBLEPOINT UpLeftLast;
};

extern "C" {
void WINAPI SetupParam(HMAP hmap, SCRIPTPARAM *ScriptParam, DFRAME *FrameTrap);
void msInitPrintParam(MAPPRINTPARMEX *printParam, BORDER border, double frameAngle, bool isClockWise);
long int msPrintMap(HMAP hMap, SCRIPTPARAM *scriptparam, MAPPRINTPARMEX *printparam, QPrinter *printer);
}

int main(int argc, char **argv)
{
 QApplication app(argc, argv);
 QDMapView mapView;

 mapSetScreenImageSize(4096, 4096);  
 HMAP mapHandle = mapOpenData("/tmp/Noginsk/Noginsk.sit");

 struct BORDER border;
 memset(&border, 0, sizeof(border));

 DFRAME FrameTrap;
 mapGetTotalBorder(mapHandle, &FrameTrap, PP_PLANE);

 SCRIPTPARAM ScriptParam;
 memset(&ScriptParam, 0, sizeof(ScriptParam));
 strncpy(ScriptParam.NameInputPost, "/tmp/mapprint.pdf", sizeof(ScriptParam.NameInputPost));
 ScriptParam.Scale = mapGetShowScale(mapHandle);
 ScriptParam.Resolution = 300;

 MAPPRINTPARMEX printParm;
 memset(&printParm, 0, sizeof(printParm));
 printParm.PlaneFrame = FrameTrap;
 printParm.Scale = mapGetShowScale(mapHandle);

 FRAMEPRINTPARAM frameprnpar;
 memset(&frameprnpar, 0, sizeof(frameprnpar));
 frameprnpar.PlaneFrame = FrameTrap;
 frameprnpar.ExpandFrame = FrameTrap;

 QPrinter *printer = new QPrinter(QPrinter::HighResolution);
 printer->setColorMode(QPrinter::Color);
 printer->setPaperSize(QPrinter::A5);

 // Подготовить параметры к печати
 msInitPrintParam(&printParm, border, 0, true);

 // Отправить на печать на выбранный принтер
 msPrintMap(mapHandle, &ScriptParam, &printParm, printer);

 mapCloseData(mapHandle);

 return 0;
}[/CODE]
Зарамочное оформление карты через gisapi
 
Здравствуйте!

Попробуйте в скрипт запуска ГИС Оператор (/usr/Operator11/startgis.bat) добавить строку с содержимым:
[CODE]export LC_NUMERIC="C"[/CODE]Пример части итогового скрипта запуска:
[CODE]PANPATH=/usr/Operator11
export LD_LIBRARY_PATH=$PANPATH:$LD_LIBRARY_PATH
export LC_NUMERIC="C"

cd $PANPATH
/usr/Operator11/operator.exe[/CODE]
получение изображения объекта из классификатора
 
Вы не могли бы привести код заполнения значения desc.Incode - просто такое поле отсутствует в структуре RSCOBJECT, заполняемой функцией mapGetRscObject:
 [CODE] // Заполнить структуру описания объекта
 // RSCOBJECT -  структура входных данных  (см. maptype.h)
 // hRsc - идентификатор классификатора карты
 // incode - порядковый номер объекта (с 1)
 // При ошибке возвращает ноль , иначе порядковый номер объекта

_MAPIMP  long int  _MAPAPI mapGetRscObject(HRSC hRsc,long int incode,
                                   RSCOBJECT * object);[/CODE][CODE]typedef struct RSCOBJECT
{
 unsigned long Length   ; // РАЗМЕР СТРУКТУРЫ
 unsigned long Code     ; // КЛАССИФИКАЦИОННЫЙ КОД
 unsigned long Local    ; // ХАРАКТЕР ЛОКАЛИЗАЦИИ  (OBJECT_LOCAL)
 unsigned long Segment  ; // НОМЕР СЛОЯ ( НЕ БОЛЕЕ 255)
 unsigned long Scale    ; // 1 - ОБ'ЕКТ МАСШТАБИРУЕТСЯ
                          // 0 - ОБ'ЕКТ НЕ МАСШТАБИРУЕТСЯ
 unsigned long Direct   ; // НАПРАВЛЕНИЕ ЦИФРОВАНИЯ ОБ'ЕКТА (OBJECT_DIRECT)
 unsigned long Bot      ; // НИЖНЯЯ ГРАНИЦА ВИДИМОСТИ (ЗНАМЕНАТЕЛЬ МАСШТАБА)
 unsigned long Top      ; // ВЕРХНЯЯ ГРАНИЦА ВИДИМОСТИ (ЗНАМЕНАТЕЛЬ МАСШТАБА)
          char Name[32] ; // НАЗВАНИЕ ( НЕ БОЛЕЕ 30)
}
 RSCOBJECT;[/CODE]
получение изображения объекта из классификатора
 
Здравствуйте!

Уточните, пожалуйста, каким способом получается значение поля desc.Incode?
Печать карть программным способом под операционной системой МСВС
 
[QUOTE]Сергей написал:
Цитата Александр Савелов  написал:_MAPIMP long int _MAPAPI mapSetMaxScreenImageSize(long int width, long int height);Данная функция, к сожалению, отсутствует в моей версии MAPAPI.[/QUOTE]
В данной версии ГИС Конструктор можно использовать функцию mapSetScreenImageSize (mapapi.h):
 [CODE] // Установить предельные размеры буфера изображения
 // Функция должна вызываться до открытия данных
 // Чтобы оставить ширину или высоту без изменения соответствующий параметр
 // должен быть равен 0
 // Если экран компьютера, на котором выполняется программа, имеет большие
 // размеры, то установленные значения будут автоматически увеличены до
 // размеров экрана
 // При ошибке возвращает 0


_MAPIMP long int _MAPAPI mapSetScreenImageSize(long int width, long int height);[/CODE]
[QUOTE]Сергей написал:
Еще, насколько я заметил в том примере, что вы дали, осуществляется попытка печати в принтерно-растровом виде.Но, судя по вашим словам в одной из веток форума, в 11 версии отсутствует возможность отображать карту в принтерно-растровом виде.[/QUOTE]
Да, в данной версии ГИС Конструктор отсутствовал принтерно-растровый вид - данный вызов отрабатывает "вхолостую" и отображение происходит в экранном виде. Можно закомментировать данный вызов.
Печать карть программным способом под операционной системой МСВС
 
[QUOTE]Сергей написал:
Александр, спасибо за пример, но пока с полями все равно проблема, они появились, но все еще обрезаются.[/QUOTE]
Если проанализировать pdf, то там объекты не обрезаются. Поэтому можно сделать вывод, что просто у физического принтера поля больше.
Можно увеличить поля при формировании pdf настройкой класса QPrinter ([URL=https://doc.qt.io/archives/qt-4.8/qprinter.html]https://doc.qt.io/archives/qt-4.8/qprinter.html[/URL]).

Например:
[CODE] QPrinter *printer = new QPrinter(QPrinter::HighResolution);
 printer->setColorMode(QPrinter::Color);
 qreal newMargin = 20.0;
 printer->setPageMargins(newMargin, newMargin, newMargin, newMargin, QPrinter::Millimeter);[/CODE]
Печать карть программным способом под операционной системой МСВС
 
Здравствуйте!

Артефакты возникают из-за недостаточного внутреннего буфера формирования изображения.
Его можно увеличить с помощью функции mapSetMaxScreenImageSize (mapapi.h):
[CODE] // Установить предельные размеры буфера изображения (не влияет на расчет разрешения экрана)
 // Функция должна вызываться до открытия данных
 // Чтобы оставить ширину или высоту без изменения соответствующий параметр
 // должен быть равен 0
 // Если экран компьютера, на котором выполняется программа, имеет большие
 // размеры, то установленные значения будут автоматически увеличены до
 // размеров экрана
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapSetMaxScreenImageSize(long int width, long int height);
[/CODE]Данную функцию необходимо вызвать до первого открытия карты. Например:
[CODE] mapSetMaxScreenImageSize(4096, 4096);
 HMAP mapHandle = mapOpenData("/tmp/Noginsk/Noginsk.sit");[/CODE]
Печать карть программным способом под операционной системой МСВС
 
Здравствуйте!

Спасибо за обратную связь!

На данный момент в ГИС Конструктор версии 11 реализовано то поведение полей, которое Вы описываете.

Для того, чтобы при печати добавлялись поля, мы можем предложить Вам одно из следующих решений:
- использовать функции из состава ГИС Констуктор 12 (для этого потребуется выполнить обновление);
- включить сборку обновленных функций печати в состав Вашего проекта (прилагаю необходимые файлы и обновленный тестовый пример печати в pdf).

Исходный файл с функциями печати:
[CODE]#include <cmath>

#include <qimage.h>
#include <qprinter.h>
#include <qprintdialog.h>
#include <qpainter.h>
#include <qpixmap.h>
#include <QTextCodec>

#include "mapview.rh"
#include "struct.h"

struct BORDER
{
 DOUBLEPOINT UpLeft;
 DOUBLEPOINT UpRight;
 DOUBLEPOINT DownRight;
 DOUBLEPOINT DownLeft;
 DOUBLEPOINT UpLeftLast;
};

extern "C"
{
void SetupParam(HMAP hmap, SCRIPTPARAM *ScriptParam, DFRAME *FrameTrap);
void msInitPrintParam(MAPPRINTPARMEX *printParam, BORDER border, double frameAngle, bool isClockWise);
long int msPrintMap(HMAP hMap, SCRIPTPARAM *scriptparam, MAPPRINTPARMEX *printparam, QPrinter *printer);
}

// Максимальный характерный размер "элементарной"
// страницы для печати
const int MAXPAGEWIDTH  = 4000;
const int MAXPAGEHEIGHT = 4000;

long int msPrintOneSimplePage(HMAP hMap, QPainter *p, int px, int py, int cx, int cy, int cw, int ch,
                             double printprecisionX, double printprecisionY);
long int msPrintOnePage(HMAP hMap, QPainter *p, int cx, int cy, int cw, int ch,
                             double printprecisionX, double printprecisionY);


// Инициализировать параметры печати
// printparam - структура параметров печати
// border - структура координат рамки выделения
// frameAngle - угол поворота рамки выделения
// isClockWise - признак того, что точки рамки выделения выбраны по часовой стрелке
void msInitPrintParam(MAPPRINTPARMEX *printParam, BORDER border, double frameAngle, bool isClockWise)  // 24/08/15 Савелов
{
 // Определить координаты рамки печати
 DFRAME *planeFrame = &printParam->PlaneFrame;

 // В режиме выбора прямоугольной рамки поменять местами
 // координаты точек прямоугольника
 if (printParam->TurnFrame == 0)
 {
   DFRAME tempFrame = *planeFrame;
   planeFrame->X1 = tempFrame.X2;
   planeFrame->Y1 = tempFrame.Y1;
   planeFrame->X2 = tempFrame.X1;
   planeFrame->Y2 = tempFrame.Y2;

   return;
 }

 if (frameAngle < 0)
 {
   if (isClockWise == true)
   {
     planeFrame->X1 = border.DownRight.x;
     planeFrame->Y1 = border.DownRight.y;
     planeFrame->X2 = border.UpLeft.x;
     planeFrame->Y2 = border.UpLeft.y;
   }
   else
   {
     planeFrame->X1 = border.UpRight.x;
     planeFrame->Y1 = border.UpRight.y;
     planeFrame->X2 = border.DownLeft.x;
     planeFrame->Y2 = border.DownLeft.y;
   }
 }

 // Определить угол поворота карты
 double *printAngle = &printParam->Angle;

 if (frameAngle < -M_PI/2 && frameAngle > -M_PI)
   *printAngle = fabs(frameAngle) - M_PI/2;
 else if (frameAngle < 0 && frameAngle > -M_PI/2)
   *printAngle = fabs(frameAngle) - M_PI/2;
 else
   *printAngle = -(fabs(frameAngle) - M_PI/2);
}


//-----------------------------------------------------------------
// Печать выбранного фрагмента карты
//-----------------------------------------------------------------
long int msPrintMap(HMAP hMap, SCRIPTPARAM *scriptparam, MAPPRINTPARMEX *printparam, QPrinter *printer)
{
 if (hMap == 0)
   return 0;

 QPainter p;
 QTextCodec *MainCodec = QTextCodec::codecForName("KOI8-R");

 // Установить параметры принтера
 if (strlen(scriptparam->NamePrinter) > 0)
 {
   printer->setPrinterName(MainCodec->toUnicode(scriptparam->NamePrinter));
 }
 else if (strlen(scriptparam->NameInputPost) > 0)
 {
   printer->setOutputFormat(QPrinter::PdfFormat);
   printer->setOutputFileName(MainCodec->toUnicode(scriptparam->NameInputPost));
 }
 else
   return 0;

 if ( !p.begin(printer) )
   return 0;

 // Повернуть карту
 if (printparam->TurnFrame != 0)
   mapSetupTurn(hMap, printparam->Angle, 0);

 // Запросить точный масштаб отображения карты
 double oldscale = mapGetRealShowScale(hMap);
 // Установить точный масштаб отображения карты
 mapSetRealShowScale(hMap, scriptparam->Scale);

 // Функции настройки ядра согласно данным принтера
 double oldhor = mapGetHorizontalScreenPrecision();
 double oldver = mapGetVerticalScreenPrecision();
 double printprecisionX = printer->physicalDpiX() * 1000 / 25.4;
 double printprecisionY = printer->physicalDpiY() * 1000 / 25.4;

 mapSetScreenPrecisionEx(printprecisionX, printprecisionY);

 long int x = 0, y = 0;
 mapChangeViewScale(hMap, &x, &y, 1.0);

 // Печать нескольких копий
 int copyCount = printer->copyCount();
 for (int copyId = 0; copyId < copyCount; copyId++)
 {
   if(copyId != 0)
     printer->newPage();

   int cw = 800, ch = 600, cx = 0, cy = 0;
   // Переведем в пикселы габариты печати
   double x1 = printparam->PlaneFrame.X1;
   double y1 = printparam->PlaneFrame.Y1;
   double x2 = printparam->PlaneFrame.X2;
   double y2 = printparam->PlaneFrame.Y2;

   mapPlaneToPicture(hMap, &x1, &y1);
   mapPlaneToPicture(hMap, &x2, &y2);
   int xbegin = x1;
   // Запомним левую и нижнюю границу в пикселах
   cx = x2;
   cy = y2;
   // Габариты области печати в пикселах
   cw = x2 - x1;
   ch = y2 - y1;

   // Габариты страницы формата принтера в пикселах
   QRectF rectf = printer->pageRect(QPrinter::DevicePixel);
   int wpage = rectf.width();
   int hpage = rectf.height();
   // Количество страниц по высоте
   int ss = (ch + hpage - 1) / hpage;
   // Количество страниц по ширине
   int cc = (cw + wpage - 1) / wpage;

   for (int s = 0; s < ss; s++)
   {
     y2 = y1 + hpage;
     if (y2 > cy) y2 = cy;
     x1 = xbegin;

     for (int c = 0; c < cc; c++)
     {
       if (s + c > 0) printer->newPage();

       x2 = x1 + wpage;
       if (x2 > cx) x2 = cx;
       cw = x2 - x1;
       ch = y2 - y1;

       // Печать одной страницы
       msPrintOnePage(hMap, &p, x1, y1, cw, ch, printprecisionX, printprecisionY);
       x1 = x2;
     }

     y1 = y2;
   }
 }

 p.end();
 mapSetScreenPrecisionEx(oldhor, oldver);
 mapChangeViewScale(hMap, &x, &y, 1.0);
 // Установить точный масштаб отображения карты
 mapSetRealShowScale(hMap, oldscale);
 // Инвертировать поворот карты
 if (printparam->TurnFrame != 0)
   mapSetupTurn(hMap, 0, 0);
}

//-----------------------------------------------------------------
// Печать одной страницы
// hMap - указатель на карту
// p    - указатель на текущий класс отрисовки Qt
// cx   - начало области отрисовки на карте в пикселах по x
// cy   - начало области отрисовки на карте в пикселах по y
// cw   - ширина области отрисовки на карте в пикселах
// ch   - высота области отрисовки на карте в пикселах
// printprecisionX - текущее разрешение карты для принтера по X
// printprecisionY - текущее разрешение принтера карты для по Y
//-----------------------------------------------------------------
long int msPrintOnePage(HMAP hMap, QPainter *p, int cx, int cy, int cw, int ch, double printprecisionX, double printprecisionY)
{
 // Запомнить координаты правого нижнего угла
 int cx2 = cx + cw;
 int cy2 = cy + ch;

 // Получить число "элементарных" страниц для печати
 int horSimplePagesNum = ceil((double)cw / MAXPAGEWIDTH);
 int verSimplePagesNum = ceil((double)ch / MAXPAGEHEIGHT);

 // Если размер "комплексной" страницы укладывается в одну элементарную -
 // распечатать "как есть"
 if(horSimplePagesNum == 1 && verSimplePagesNum == 1)
 {
   msPrintOneSimplePage(hMap, p, 0, 0, cx, cy, cw, ch,
                        printprecisionX, printprecisionY);
   return 0;
 }

 // Распечатать набор "элементарных" страниц
 int pageY  = cy;
 // Положение на одном листе
 int pagePY = 0;
 for(int verId = 0; verId < verSimplePagesNum; verId++)
 {
   int pageX  = cx;
   int pagePX = 0;
   for(int horId = 0; horId < horSimplePagesNum; horId++)
   {
     // Вычислить размер печатаемой страницы
     int printWidth = MAXPAGEWIDTH, printHeight = MAXPAGEHEIGHT;
     if(pageX + MAXPAGEWIDTH > cx2)
       printWidth  = cx2 - pageX;
     if(pageY + MAXPAGEHEIGHT > cy2)
       printHeight = cy2 - pageY;


     // Напечатать "элементарную" страницу
     int res = msPrintOneSimplePage(hMap, p, pagePX, pagePY, pageX, pageY, printWidth, printHeight,
                                    printprecisionX, printprecisionY);
     if(res == -1) {
       fprintf(stderr, "cannot print simple page\n");
       return -1;
     }
     // Сместиться на лист вправо
     pageX  += MAXPAGEWIDTH;
     pagePX += MAXPAGEWIDTH;
   }

   // Сместиться на лист вниз
   pageY  += MAXPAGEHEIGHT;
   pagePY += MAXPAGEHEIGHT;
 }
 return 0;
}

//-----------------------------------------------------------------
// Печать одной страницы
// hMap - указатель на карту
// p    - указатель на текущий класс отриовки Qt
// px   - начало области отрисовки на листе в пикселах по x
// py   - начало области отрисовки на листе в пикселах по y
// cx   - начало области отрисовки на карте в пикселах по x
// cy   - начало области отрисовки на карте в пикселах по y
// cw   - ширина области отрисовки на карте в пикселах
// ch   - высота области отрисовки на карте в пикселах
// printprecisionX - текущее разрешение карты для принтера по X
// printprecisionY - текущее разрешение принтера карты для по Y
//-----------------------------------------------------------------
long int msPrintOneSimplePage(HMAP hMap, QPainter *p, int px, int py, int cx, int cy, int cw, int ch, double printprecisionX, double printprecisionY)
{
 // Размер строки в байтах
 int allignwidth = cw * CELLSIZE;

 // Размер DIB в памяти
 int size = allignwidth * ch;

 // Указатель на DIB в памяти
 char *bits = AllocateTheMemory(size);
 if(bits == NULL)    // 09/02/15
   return -1;

 memset(bits, 0, size);

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

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

 long oldViewType = mapSetViewType(hMap, VT_PRINTRST);
 // Установим белый цвет фона
 COLORREF oldback = mapGetBackColor(hMap);
 mapSetBackColor(hMap, 0x0FFFFFF);

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

 mapSetBackColor(hMap, oldback);
 mapSetViewType(hMap, oldViewType);

 // Создать QImage по XImage
 QImage image((const uchar *)bits, cw, ch, allignwidth, QImage::Format_RGB32);

 // Отобразить карту на принтер средствами Qt
 p->drawImage(px, py, image, 0, 0, cw, ch);

 FreeTheMemory(bits);

 return 0;
}[/CODE]
Заголовочный файл (обновленная версия struct.h с необходимыми структурами):
[CODE]#if !defined(STRUCT_H)
#define STRUCT_H

#include "mapapi.h"

class TMapAccess;
class TMapWindow;

typedef struct
{
 double      ResolutionGor;            // метр.эл гориз
 double      ResolutionVer;            // метр.эл вертик
 double      Scale;                    // масштаб
 long int    Length;                   // размер структуры
 char        NameInputPost[MAX_PATH];  // имя выходного файла
 char NamePrinter[MAX_PATH];           // имя принтера
 char PrintPage[MAX_PATH];             // номера страниц
 long int CutListFlag;                 // 1-5 - однолистовая печать
                                       //  1 - A0;...; 5 - A4
                                       // -1-(-5) печать по листам
                                       // -1 - A0;...;-5 - A4
 long int    Resolution;               // точки на дюйм
 long int    FormatPage;               // Формат страницы:
                                       // 0 - A0; 1 - A1; 2 - A2; 3 - A3; 4 - A4
 TMapWindow *MapWindow;                // окно обрабатываемой карты
} SCRIPTPARAM;

typedef struct MAPPRINTPARMEX
{
 int Length;  // Длина структуры MAPPRINTPARM
#ifdef _M_X64
 int MapPrintZero;  // Выравнивание
#endif
 HWND Handle;         // Идентификатор окна карты
                      // 0x008
 int Scale;           // Масштаб печати (знаменатель)
 int ScaleSave;       // Масштаб печати (сохраняется при FitToPage = 1)
                      // 0x010 (16)
 RECT RectMetr;       // Прямоугольник печати в районе в метрах
                      // (Если обнулен - расчитывается по габаритам района).
                      // При заданных габаритах выбранной области
                      // (PlaneFrame) игнорируется
                      // 0x020 (32)
 int ShiftLTmm;       // Смещение (в миллиметрах)
 int ShiftUPmm;       //
                      // 0x028 (40)
 int FieldLTmm;       // Поля страницы (в миллиметрах)
 int FieldUPmm;       //
 int FieldRTmm;       //
 int FieldDNmm;       //
                      // 0x038 (56)
 int Intensity;       // Интенсивность заливки площадных (0-100)
 int Copies;          // Количество копий
                      // 0x040 (64)
 char Regime;         // Режим работы задачи (см. MAPPRINT_REGIME)
 char Preview;        // Режим работы окна (см. MAPPRINT_PREVIEW)
 char TypePrint;      // Тип печати (см. MAPPRINT_TYPE)
 char TypeOutput;     // Тип вывода (см. MAPPRINT_OUTPUT)
                      // 0x044 (68)
 char Orientation;    // Ориентация (см. MAPPRINT_ORIENT)
 char File;           // Флаг устройства вывода (1 - файл, 0 - принтер)
 char Border;         // Флаг вывода рамки (1 - есть, 0 - нет)
 char FitToPage;      // Согласование с размером страницы
                      //   (см. MAPPRINT_FITTING)
 char Black;          // Флаг черно-белой печати (1 - есть, 0 - нет)
 char Calibration;    // Флаг учета коэффициентов калибровки
                      //   (1 - учитывать, 0 - нет)
 char Mirror;         // Флаг зеркального вывода (1 - есть, 0 - нет)
 char CutLine;        // Флаг вывода линий обрезки (1 - есть, 0 - нет)
                      //   (при OverlapLT, OverlapUP,
                      //    OverlapRT или OverlapDN > 0) // 0x04C (76)
 char FileName[260];  // Имя файла печати
                      // 0x150 (336)
 int OverlapLTmm;     // Поля перекрытия изображения соседних
 int OverlapUPmm;     //       страниц (в миллиметрах)
 int OverlapRTmm;     //
 int OverlapDNmm;     //
                      // 0x160 (352)
 double PageWidth;    // Размеры печатаемой области страницы за вычетом
 double PageHeight;   // полей перекрытия (в миллиметрах)
                      // 0x170 (368)
 double Angle;        // Угол поворота карты (в радианах)
                      // 0x178 (376)
 DFRAME PlaneFrame;   // Габариты выбранной области в метрах
                      // (Если обнулен - расчитывается по габаритам района).
                      //  X1,Y1 - 1 точка прямоугольной области
                      //  X2,Y2 - 3 точка прямоугольной области
                      // При TurnFrame = 1, считать 1 и 3 точки вершинами
                      // наклонного прямоугольника, на неповернутой карте
                      // 0x198 (408)
 HSITE SiteDecor;     // Зарамочное оформление (должен быть обнулен)
                      // 0x19C (412)
 int FrameKey;        // Номер объекта карты, по которому устанавливается
                      // габариты области печати PlaneFrame
                      // (Если равен 0 или объект отсутствует,
                      //  то параметр игнорируется)
                      // 0x1A0 (416)

#ifdef _M_X64
 int MapPrintAddZero;  // Выравнивание
#endif
 char FrameList[32];          // Имя листа (номенклатура) объекта FrameKey
                              // 0x1C0 (448)
 int PaperWidth;              // Размер листа (в миллиметрах)
 int PaperHeight;             //
                              // 0x1C8 (456)
 char ReserveEx[48];          // Резерв (должен быть обнулен)
 unsigned char PageCountHor;  // Число страниц по горизонтали
                              // (используется при FitToPage = MPF_FITBYHOR)
 unsigned char PageCountVer;  // Число страниц по вертикали
                              // (используется при FitToPage = MPF_FITBYVER)
 char FileCount;              // Число формируемых файлов (используется при PostScript = 1)
                              //   (1 - файл содержит все составляющие цвета C,M,Y,K или R,G,B
                              //    4 - каждый из четырех файлов содержит одну из
                              //        составляющих цвета C,M,Y,K)
                              // 0x1FB (507)
 char ColorModel;             // Цветовая модель вывода в PostScript
                              //   (0 - RGB, 1 - CMYK)
 char PostScript;             // Флаг PostScript-вывода
 char Restore;                // Флаг необходимости восстановления параметров
                              //   из INI-файла карты (1 - есть, 0 - нет)
 char TurnFrame;              // Флаг поворота области выбора (1 - есть, 0 - нет)
 char Decoration;             // Флаг зарамочного оформления (должен быть обнулен)
}  // 0x200 (512)
MAPPRINTPARMEX;

typedef struct FRAMEPRINTPARAM
{
 int DeleteSite;      // Признак удаления Site после печати
 int TurnFrame;       // Тип рамки (0 - прямая, 1 - наклонная)
 DFRAME PlaneFrame;   // Габариты рамки повернутые
 DFRAME ExpandFrame;  // Расширенные повернутые габариты рамки
 double Angle;        // Угол наклона рамки
 HSITE SiteDecor;     // Зарамочное оформление
 int EnableSite;      // Запрет/разрешение редактирования Sit
#ifdef _M_X64
 int FramePrintZero;  // Выравнивание
#endif
} FRAMEPRINTPARAM;

#endif[/CODE]
Обновленный файл примера печати в pdf:
[CODE]#include <QApplication>
#include <QPrinter>

#include "qdmcmp.h"

#include "mapapi.h"
#include "struct.h"

struct BORDER
{
 DOUBLEPOINT UpLeft;
 DOUBLEPOINT UpRight;
 DOUBLEPOINT DownRight;
 DOUBLEPOINT DownLeft;
 DOUBLEPOINT UpLeftLast;
};

extern "C" {
void WINAPI SetupParam(HMAP hmap, SCRIPTPARAM *ScriptParam, DFRAME *FrameTrap);
void msInitPrintParam(MAPPRINTPARMEX *printParam, BORDER border, double frameAngle, bool isClockWise);
long int msPrintMap(HMAP hMap, SCRIPTPARAM *scriptparam, MAPPRINTPARMEX *printparam, QPrinter *printer);
}

int main(int argc, char **argv)
{
 QApplication app(argc, argv);
 QDMapView mapView;

 HMAP mapHandle = mapOpenData("/tmp/Noginsk/Noginsk.sit");

 struct BORDER border;
 memset(&border, 0, sizeof(border));

 DFRAME FrameTrap;
 mapGetTotalBorder(mapHandle, &FrameTrap, PP_PLANE);

 SCRIPTPARAM ScriptParam;
 memset(&ScriptParam, 0, sizeof(ScriptParam));
 strncpy(ScriptParam.NameInputPost, "/tmp/mapprint.pdf", sizeof(ScriptParam.NameInputPost));
 ScriptParam.Scale = mapGetShowScale(mapHandle);
 ScriptParam.Resolution = 300;
 ScriptParam.CutListFlag = 1;  // Одностраничная печать формат - A0

 MAPPRINTPARMEX printParm;
 memset(&printParm, 0, sizeof(printParm));
 printParm.PlaneFrame = FrameTrap;
 printParm.Scale = mapGetShowScale(mapHandle);

 FRAMEPRINTPARAM frameprnpar;
 memset(&frameprnpar, 0, sizeof(frameprnpar));
 frameprnpar.PlaneFrame = FrameTrap;
 frameprnpar.ExpandFrame = FrameTrap;

 QPrinter *printer = new QPrinter(QPrinter::HighResolution);
 printer->setColorMode(QPrinter::Color);

 // Подготовить параметры к печати
 msInitPrintParam(&printParm, border, 0, true);

 // Отправить на печать на выбранный принтер
 msPrintMap(mapHandle, &ScriptParam, &printParm, printer);

 mapCloseData(mapHandle);

 return 0;
}

[/CODE]
Страницы: Пред. 1 ... 17 18 19 20 21 22 23 24 25 26 27 ... 69 След.



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

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