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

Печать определенного фрагмента карты с оформлением

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Печать определенного фрагмента карты с оформлением, Как напечатать выделенный пользователем фрагмент карты, предваритильно нанеся на него рамку, подписи и др.
 
Здравствуйте,

Есть задача: дать пользователю возможность выделить определенный участок карты. Потом нанести на этот выделенный участок оформление (рамки, таблички, подписи, легенду и т.п.) и распечатать его.
Я выделяю область с помощью объекта и передаю его координаты в диалог:
    prnMapPrintEx, в поле  MAPPRINTPARMEX.PlaneFrame (PP_PLANE),
но диалог при открытии показывает весь район, а не выделенный участок.
Пробовал передать область через поле MAPPRINTPARMEX.RectMetr (тоже PP_PLANE) , но результат тот же.

Пробовал решить этот вопрос выгрузив требуемый участок карты в отдельный проект с помощью prnMapPrintSelect - проект не выгружается.

Вопросы:
1. Правильный ли подход к решению этой задачи: выделить участок, нанести временные объекты оформления и передать его в диалог prnMapPrintEx?
2. В чем может быть причина того, что prnMapPrintSelect не формирует проект с выделенным участком? Кнопка "Сохранить фрагмент карты" из диалога тоже не сохраняет - выводится сообщение, что проект создан, но на диске ничего не создается.

В приложении снимок экрана, где красный прямоугольник - выделенный пользователем фрагмент карты для печати.

Спасибо

С уважением,
Сергей Подолян
НИИСА
Скриншот.bmp (304.79 КБ)
 
Цитата
Сергей Подолян написал:
Вопросы: 1. Правильный ли подход к решению этой задачи: выделить участок, нанести временные объекты оформления и передать его в диалог prnMapPrintEx?2. В чем может быть причина того, что prnMapPrintSelect не формирует проект с выделенным участком? Кнопка "Сохранить фрагмент карты" из диалога тоже не сохраняет - выводится сообщение, что проект создан, но на диске ничего не создается.В приложении снимок экрана, где красный прямоугольник - выделенный пользователем фрагмент карты для печати.
Какие параметры устанавливаете  в структуру MAPPRINTPARMEX?
Также просьба прислать кусок текста с использованием функций печати карты (prnMapPrintEx)
 
Код:
long int   (WINAPI * F_prnMapPrintSelect)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title);
   long int   (WINAPI * F_prnMapPrintEx)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title);

   F_prnMapPrintSelect = (long int (WINAPI *)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title))
                                               mapLoadLibrary("gisu64forms.dll" , &libinst, "prnMapPrintSelect");
   F_prnMapPrintEx  = (long int (WINAPI *)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title))


MAPPRINTPARMEX printparmex;
   memset(&printparmex, 0, sizeof(printparmex));
   printparmex.Length = sizeof(printparmex);
   printparmex.Handle = hWnd;
   printparmex.Copies = 1;
   printparmex.Regime =  MPR_PRINT; //;//MPR_INITPARM;MPR_PRINTONLY
   printparmex.TypePrint = MPT_NORMAL;
   printparmex.File = 1;
   // printparmex.RectMetr = rect;
   // printparmex.FitToPage = MPF_FITTOPAGE;
   printparmex.Preview = MPV_MAP;
   // printparmex.FrameKey = inputRectNum;
   printparmex.PlaneFrame = dfarme;
   // printparmex.Scale = 1000000;

   auto res = F_prnMapPrintSelect(hMap, printer, &printparmex, &taskparm, "Print");
// auto res = F_prnMapPrintEx(hMap, printer, &printparmex, &taskparm, "Print");


Закомментированные строки - это варианты, которые тоже тестировались
dframe.PNG (3.44 КБ)
Изменено: George - 08.06.2022 16:03:22
 
Цитата
Сергей Подолян написал:
Код:long int   (WINAPI * F_prnMapPrintSelect)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title);    long int   (WINAPI * F_prnMapPrintEx)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title);    F_prnMapPrintSelect = (long int (WINAPI *)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title))                                                mapLoadLibrary("gisu64forms.dll" , &libinst, "prnMapPrintSelect");    F_prnMapPrintEx  = (long int (WINAPI *)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title))
Спасибо, вопрос передан специалисту.
 
Попробуйте использовать соответствующие режимы работы задачи:

Цитата
//-----------------------------------------------------------------
// ЗНАЧЕНИЯ ПОЛЕЙ СТРУКТУРЫ ДИАЛОГА ПЕЧАТИ КАРТЫ
//-----------------------------------------------------------------

enum MAPPRINT_REGIME         // РЕЖИМ РАБОТЫ ЗАДАЧИ "ПЕЧАТЬ КАРТЫ"
{
 MPR_PRINTONLY       = -2,  // Запуск печати карты без вызова диалога

 MPR_INITPARM        = -1,  // Загрузка диалога только для настройки
                            //  принтера и параметров печати (кнопки
                            //  "Выбрать" и "Изменить" отключены)

 MPR_PRINTALL        =  0,  // Загрузка диалога для настройки принтера,
                            //  параметров печати и запуска печати карты
                            //  с инициализацией печатаемой области по
                            //  габаритам района (RectMetr - игнорируется)

 // Эти флаги используются для загрузки диалога настройки принтера
 // параметров печати и запуска печати карты с инициализацией
 // печатаемой области из RectMetr
 MPR_PRINT           =  1,  // Печать
 MPR_SELECTFRAME     =  2,  // Выбор прямоугольной рамки
 MPR_CHANGEFRAME     =  3,  // Изменение и перемещение прямоугольной рамки
 MPR_MOVEFRAME       =  4,  // Только перемещение прямоугольной рамки
 MPR_SELECTBYOBJECT  =  5,  // Выбор объекта и установка прямоугольной рамки
                            // по габаритам объекта


 MPR_SELECTTURNFRAME = 10,  // Флаг выбора повернутого фрагмента

 // Значения, принимаемые полем Regime при нажатии на кнопки:
 // "Печать"     - MPR_PRINT;
 // "Выбрать"    - MPR_SELECTFRAME или MPR_SELECTTURNFRAME;
 // "Изменить"   - MPR_CHANGEFRAME или
 //                MPR_MOVEFRAME (при FitToPage = MPF_ACCORDTOPAGE);
 // "По объекту" - MPR_SELECTBYOBJECT.
 // После выбора, изменения или перемещения области печати можно
 // вызвать диалог повторно не изменяя значения поля Regime.
};

enum MAPPRINT_PREVIEW   // РЕЖИМ РАБОТЫ ОКНА ПРЕДВАРИТ. ПРОСМОТРА
{
 MPV_SCHEME      = 0,  // Печатаемая область на фоне схемы
 MPV_MAP         = 1,  // Печатаемая область на фоне карты
 MPV_INFO        = 2,  // Информация об устройстве печати
};

enum MAPPRINT_TYPE     // ТИП ПЕЧАТИ
{
 MPT_NORMAL      = 3,  // Нормальный
 MPT_TRANSPARENT = 4,  // Прозрачный
 MPT_CONTOUR     = 5,  // Контурный
};

enum MAPPRINT_OUTPUT    // ТИП ВЫВОДА
{
 // Используются простейшие функции WIN API (для печати)

 MPO_VECTORIAL   = 0,  // Векторный (вывод только векторных карт)
 MPO_RASTERIAL   = 1,  // Растровый (вывод карт, растров и матриц)

 // Используются макрофункции WIN API (для экспорта в PostScript-файл)

 MPO_VECTORIALEX = 4,  // Векторный специальный
};

enum MAPPRINT_ORIENT    // ОРИЕНТАЦИЯ
{
 MPN_DEFAULT     = 0,  // Взять из умалчиваемых свойств принтера
 MPN_PORTRAIT    = 1,  // Книжная
 MPN_LANDSCAPE   = 2,  // Альбомная
};

enum MAPPRINT_FITTING   // СОГЛАСОВАНИЕ
{
 MPF_SPLITTOPAGES= 0,  // Разбить постранично
 MPF_FITTOPAGE   = 1,  // Растянуть на страницу
 MPF_ACCORDTOPAGE= 2,  // По размеру страницы
 MPF_FITBYHOR    = 3,  // Растянуть по горизонтали            
                       // (на заданное количество страниц)
 MPF_FITBYVER    = 4,  // Растянуть по вертикали
};
 
Цитата
Сергей Подолян написал:
Код:long int   (WINAPI * F_prnMapPrintSelect)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title);    long int   (WINAPI * F_prnMapPrintEx)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title);    F_prnMapPrintSelect = (long int (WINAPI *)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title))                                                mapLoadLibrary("gisu64forms.dll" , &libinst, "prnMapPrintSelect");    F_prnMapPrintEx  = (long int (WINAPI *)(HMAP hmap, HPRINTER printer, MAPPRINTPARMEX* printparm, TASKPARM* parm, char* title))
Уточните, пожалуйста в какой среде разработки написано приложение.
     
Написали тест. В версии 12.7.2 - все работает·    

 // Загрузить принтер

HPRINTER printer = 0;

MAPPRINTPARMEX printparm;

memset(&printparm,0,sizeof(printparm));

printparm.Length = sizeof(MAPPRINTPARMEX);

printparm.Regime = MPR_PRINT;

printparm.Handle = Handle;

printparm.File = 1;

printparm.PlaneFrame.X1 = 3959715.118994;

printparm.PlaneFrame.Y1 = 1681165.384177;

printparm.PlaneFrame.X2 = 9734145.156760;

printparm.PlaneFrame.Y2 = 6318431.450312;

printparm.TypeOutput = MPT_NORMAL;

printparm.FitToPage = MPF_FITTOPAGE;

printparm.Preview = MPV_MAP;



HINSTANCE libinst = 0;

HPRINTER (WINAPI * prnLoadPrinter)() = NULL;

long int (WINAPI * prnMapPrintEx)(HMAP hmap, HPRINTER printer,

MAPPRINTPARMEX* printparm,

TASKPARM* taskparm, char* title) = NULL;

long int (WINAPI * prnFreePrinter)(HPRINTER printer) = NULL;

prnLoadPrinter = (HPRINTER (WINAPI * )())

mapLoadLibrary("gisu64forms.dll",&libinst,"prnLoadPrinter");

prnMapPrintEx = (long int (WINAPI * )(HMAP hmap, HPRINTER printer,

MAPPRINTPARMEX* printparm,

TASKPARM* taskparm, char* title))

::mapGetProcAddress(libinst,"prnMapPrintEx");

prnFreePrinter = (long int (WINAPI * )(HPRINTER printer))

::mapGetProcAddress(libinst,"prnFreePrinter");

if (prnLoadPrinter)

printer = prnLoadPrinter();

if (printer == 0)

{

if (libinst) FreeLibrary(libinst);

return;

}
·        
// Вызвать диалог печати

// (печать выбранного фрагмента карты производится
// автоматически при нажатии кнопки "Печать")
TASKPARM parm;
memset(&parm, 0, sizeof(parm));
HMAP hMap = mapOpenDataUn(L"c:\\Users\\Public\\Documents\\Panorama\\Panorama12\\Data\\demo­.sitx");
if (prnMapPrintEx && hMap)
prnMapPrintEx(hMap, printer, &printparm, &parm, "");

if (hMap) mapCloseData(hMap);

if (prnFreePrinter)
prnFreePrinter(printer);

if (libinst)
FreeLibrary(libinst);

Изменено: Елена Кузнецова - 19.08.2019 11:12:02
 
Здравствуйте Елена,

У меня тоже все заработало.
Похоже проблема была в том, что я передавал в printparm.PlaneFrame координаты левой-верхней и правой-нижней точки, а надо было левой-нижней и правой-верхней (т.е. чтобы иксы и игреки росли от первой точки до третьей).
Ваш код помог понять.

Большое спасибо!

С уважением,
Сергей Подолян
 
Здравствуйте,

Скажите, пожалуйста, а есть ли в GIS Tool какие-нибудь средства для отрисовки рамки карты с километровыми засечками, багета и другого зарамочного оформления?

Спасибо

С уважением,
Сергей Подолян
 
Цитата
Сергей Подолян написал:
Скажите, пожалуйста, а есть ли в GIS Tool какие-нибудь средства для отрисовки рамки карты с километровыми засечками, багета и другого зарамочного оформления?

Штатно в GIS ToolKit такая возможность не предусмотрена. Компонента для работы с зарамочным оформлением нет.
Есть небольшой набор функций ГИС-ядра, доступный на уровне MAPAPI-интерфейса: см. Функции создания зарамочного оформления.
Шаблоны зарамочного оформления в GIS ToolKit также не включены. Можно их позаимствовать из состава ГИС Панорама x64 или ГИС Оператор.
Страницы: 1
Читают тему (гостей: 1)



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

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