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

Печать карть программным способом под операционной системой МСВС

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2 3 4 5 След.
RSS
Печать карть программным способом под операционной системой МСВС
 
Добрый день.

Александр, спасибо за пример, но пока с полями все равно проблема, они появились, но все еще обрезаются.
А еще на карте появляются какие-то артифакты.

Полученный pdf-файл прикладываю.
 
Здравствуйте!

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

_MAPIMP long int _MAPAPI mapSetMaxScreenImageSize(long int width, long int height);
Данную функцию необходимо вызвать до первого открытия карты. Например:
Код
  mapSetMaxScreenImageSize(4096, 4096);
  HMAP mapHandle = mapOpenData("/tmp/Noginsk/Noginsk.sit");
 
Цитата
Александр Савелов написал:
_MAPIMP long int _MAPAPI mapSetMaxScreenImageSize(long int width, long int height);
Данная функция, к сожалению, отсутствует в моей версии MAPAPI.
 
Цитата
Сергей написал:
Александр, спасибо за пример, но пока с полями все равно проблема, они появились, но все еще обрезаются.
Если проанализировать pdf, то там объекты не обрезаются. Поэтому можно сделать вывод, что просто у физического принтера поля больше.
Можно увеличить поля при формировании pdf настройкой класса QPrinter (https://doc.qt.io/archives/qt-4.8/qprinter.html).

Например:
Код
  QPrinter *printer = new QPrinter(QPrinter::HighResolution);
  printer->setColorMode(QPrinter::Color);
  qreal newMargin = 20.0;
  printer->setPageMargins(newMargin, newMargin, newMargin, newMargin, QPrinter::Millimeter);
 
Цитата
Александр Савелов написал:
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);
Еще, насколько я заметил в том примере, что вы дали, осуществляется попытка печати в принтерно-растровом виде.

Но, судя по вашим словам в одной из веток форума, в 11 версии отсутствует возможность отображать карту в принтерно-растровом виде.
 
Цитата
Александр Савелов написал:
Цитата
Сергей написал:
Александр, спасибо за пример, но пока с полями все равно проблема, они появились, но все еще обрезаются.
Если проанализировать pdf, то там объекты не обрезаются. Поэтому можно сделать вывод, что просто у физического принтера поля больше.
Можно увеличить поля при формировании pdf настройкой класса QPrinter ( https://doc.qt.io/archives/qt-4.8/qprinter.html ).

Например:
Код
   QPrinter *printer = new QPrinter(QPrinter::HighResolution);
  printer->setColorMode(QPrinter::Color);
  qreal newMargin = 20.0;
  printer->setPageMargins(newMargin, newMargin, newMargin, newMargin, QPrinter::Millimeter); 
Спасибо за оперативность ответов!

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


_MAPIMP long int _MAPAPI mapSetScreenImageSize(long int width, long int height);

Цитата
Сергей написал:
Еще, насколько я заметил в том примере, что вы дали, осуществляется попытка печати в принтерно-растровом виде.Но, судя по вашим словам в одной из веток форума, в 11 версии отсутствует возможность отображать карту в принтерно-растровом виде.
Да, в данной версии ГИС Конструктор отсутствовал принтерно-растровый вид - данный вызов отрабатывает "вхолостую" и отображение происходит в экранном виде. Можно закомментировать данный вызов.
 
Добрый день!

Александр, не могли бы уточнить по коду?

На примере тех исходников, что вы привели выше нигде не нашел использование ни одного из параметров структуры:
Код
ScriptParam.CutListFlag = 1;  // Одностраничная печать формат - A0
Код
ScriptParam.FormatPage = 5;    // A4

Оно в дальнейшем где-нибудь используется? И какой из них правильно заполнять, если в этом есть необходимость.

Спасибо.
 
Здравствуйте!

Значения CutListFlag и FormatPage структуры SCRIPTPARAM в процессе непосредственной печати карты участия не принимают (используются в служебных целях при работе с диалогом).
Формат печати необходимо указывать непосредственно в классе QPrinter. Например:
Код
printer->setPaperSize(QPrinter::A5);
Прикрепляю модифицированный пример с учетом данных правок:
Код
#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;
}
 
Цитата
Александр Савелов написал:
Прикрепляю модифицированный пример с учетом данных правок:
Александр, спасибо за оперативные ответы.

Положительный результат уже близок. Как закончу свои проверки, выложу более компактный пример без некоторых лишних строчек.

Спасибо.
Страницы: Пред. 1 2 3 4 5 След.
Читают тему (гостей: 1)



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

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