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

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

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

Способ №1 Использование библиотек  QT

Код
// создаем принтер
 printer = new QPrinter( QPrinter::ScreenResolution);
 HDC      FmapDC;
 RECT      mapRect;
 QPainter *p;
 p = new QPainter();
// создаем изображение равное по размеру области вывода карты
QPixmap * pixmap = new QPixmap(MAP->viewport()->width(),MAP->viewport()->height());

if (MAP -> hMap) // если карта открыта заполняем созданное изображение 
   {                           //изображением карты отображенной на экране
       
        FxDC.xcDisplay = pixmap -> x11AppDisplay();
        FxDC.xcWindow = pixmap -> handle();
        FxDC.xcContext = XCreateGC(FxDC.xcDisplay, FxDC.xcWindow, 0, NULL);
      FxDC.xcPoint.X =   MAP->viewport()->x();
      FxDC.xcPoint.Y =   MAP->viewport()->y(); 
   FmapDC = HDC(&FxDC);
   mapRect.left = MAP->viewport()->x() + MAP->contentsX();
   mapRect.top  = MAP->viewport()->y() + MAP->contentsY() ;
   mapRect.right  = MAP->viewport()->x() + MAP->viewport()->width() + MAP->contentsX();
   mapRect.bottom = MAP->viewport()->y() + MAP->viewport()->height() + MAP->contentsY();
   mapPaint95( MAP->hMap,FmapDC,1,&mapRect);
   XFreeGC( FxDC.xcDisplay,FxDC.xcContext );  

    printer->setFullPage( TRUE );
   // запускаем стандартный диалог печати
    if ( printer->setup(this) ) {               // printer dialog
        qDebug("start printing");
       if( !p -> begin( printer ) ) {               // paint on printer
            qDebug( "Printing aborted");
            return;
        }
   // распечатываем полученное изображение
      p->drawTiledPixmap(0,0,MAP->viewport()->width(),MAP->viewport()->height(),*pixmap,0,0);
   }

}
  delete(p); 
  delete(pixmap);
  delete(printer);

Достоинства данного способа:
1. Используются только функции QT и функции содержащиеся в библиотеке libmapacces.so
2. Возможности дополнительного редактирования и совершенствования

Недостатки:
1. При использовании данного примера на печать выводится только область карты видимая на экране.
2. Размер выводимого изображения не превышает размеров экрана, в связи с этим нет возможности детальной печати изображения на листах большого формата (A3-A0 и более)
Но указанные недостатки могут быть устранены при использовании достоинства №2.


Способ № 2. Печать с использованием функций MapApi. (Пример взят из файла prnapi.h)
Код
  // Загрузить принтер
  HPRINTER printer = prnLoadPrinter();
  // Вызвать диалог печати
  // (печать выбранного фрагмента карты производится
  //  автоматически при нажатии кнопки "Печать")

  ret = prnMapPrint(hmap, printer, printparm, taskparm);
 
 // При успешном выполнении диалога возвращаемое значение не равно 0
  if (ret != 0)
  {
    // Закрытие диалога при помощи кнопки "Выбрать"
    if (printparm->Regime == MPR_SELECTFRAME)
    {
      // Вызвать пользовательскую функцию выбора прямоугольной области
      // ...
    }
    // Закрытие диалога при помощи кнопки "Изменить"
    if (printparm->Regime == MPR_CHANGEFRAME)
    {
      // Вызвать пользовательскую функцию изменения прямоугольной области
      // ...
    }
  }
   // Освободить принтер
  prnFreePrinter(printer);

Более подробно см. prnapi.h

Недостатки:
Данный способ под МСВС реализовать не удалось, так как не удалось найти аналога библиотекам mapprint.dll, gisforms.dll  для операционной системы МСВС.
Вопрос администрации:
Реализована ли подсистема печати при помощи вышеописанных функций?
Если да, то в каких библиотеках они размещаются?
В изолированной системе ​энергия системы остается постоянной, возможны лишь переходы одного ​вида энергии в другой.
 
Под МСВС у нас разработан ГИС Конструктор, в состав которого входит компонент
"Формирование файла Postscript". Полученный Postscript-файл можно вывести на печать программным способом, например:
  char doprint[MAX_PATH];

  memset(doprint, 0, sizeof(MAX_PATH));
  sprintf(doprint, "lpr /tmp/mapprint.eps");
  system(doprint);
 
 Для первого способа советую применить функцию mapPaintToXImage: размер выводимого изображения может превышать размеры экрана.
 
Цитата
gislinux пишет:
Полученный Postscript-файл можно вывести на печать программным способом
Как получить путь/имя сохранённого файла?
Не нашёл методов для этого в компоненте.
 
В диалоге компонента есть поле с указанием полного пути к файлу. По умолчанию /tmp/mapview.eps Изменить поле можно только интерактивным способом через диалог.
 
Мне не нужно изменить, мне нужно знать, куда произошло сохранение. Не просить же пользователя указать расположение файла для печати после того, как он уже указал, куда сохранять?
 
Работа с данным компонентом возможна в интерактивном режиме.
Цитата
В диалоге компонента есть поле с указанием полного пути к файлу. По умолчанию /tmp/mapview.eps Изменить, указать, узнать поле можно только интерактивным способом через диалог.
 
Всем доброго дня!

При программировании под Windows я могу использовать функцию prnMapPrintEx для вывода окна печати и масштабирования. Кроме этого, в этом окне я могу разбить карту на листы. Есть ли реализация этого функционала под linux?
 
Здравствуйте!

Вызвать диалог печати можно с помощью графического компонента QDMapBuildEps (qdmdprn.h).
Пример использования данного компонента можно посмотреть в примере myfirst из состава инсталляции ГИС Конструктор.

Также исходные тексты компонентов ГИС Конструктор доступны в каталоге /usr/share/gisdesigner/examples/Sources.

Более подробную информацию по компонентам ГИС Конструктор можно посмотреть в Руководстве программиста:
http://gistoolkit.ru/download/doc/gisdesigner_prog.pdf
Расположение файлов из состава ГИС Конструктор описано в Руководстве системного программиста:
http://gistoolkit.ru/download/doc/gisdesigner_sysprog.pdf
 
Спасибо!
 
Цитата
Александр Савелов написал:
Вызвать диалог печати можно с помощью графического компонента QDMapBuildEps (qdmdprn.h).
Здравствуйте.

Версия Гис Конструктор для Qt Designer(MAPAPIVERSION = 0x111015, MAPACCESSVERSION = 20130912), Qt 5.5.1, ОС Astra Linux 1.5 SE.


Пытаюсь распечатать карту под Астрой 1.5, используя MAPAPI. За основу взял исходники компонентов из версии ГИС Конструктора 11.10.7(MAPAPIVERSION = 0x111304, MAPACCESSVERSION = 20160605), т.к. в моей вышеуказанной версии этих исходников нет, как нет и prnapi.
Поэтому объявил у себя структуру типа (описание которой находится в prnapi.h в более свежей версии) :
Код
//-----------------------------------------------------------------
// СЛУЖЕБНАЯ СТРУКТУРА ПАРАМЕТРОВ для функций построения зарамочного оформления
//-----------------------------------------------------------------

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

Описание SCRIPTPARAM взял из заголовочного файла struct.h, который имеется в составе все того же ГИС Конструктора 11.10.7.

Немного модифицировал код QDMapBuildEps, избавившись от QDMapView, и задавая идентификатор HMAP напрямую вместо этого.
Но при вызове следующего кода из QDMapBuildEps::Execute()  приложение вылетает:
Код
prnPrintMapDialog = (long int (WINAPI *)(HMAP , TMapWindow *, TASKPARM *, // 06/06/06
                                           FRAMEPRINTPARAM *, SCRIPTPARAM *))
          ::mapLoadLibrary(MAPQTFRMLIB, &libinst, "prnPrintMapDialog");


Можете подсказать, что я делаю не так или как вызвать диалог печати и распечатать карту в указанной версии ГИС Конструктора?

Спасибо.
Изменено: Сергей - 20.11.2019 06:43:37
Страницы: 1 2 3 4 5 След.
Читают тему (гостей: 1)



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

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