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

Не корректное отображение зарамочного оформления .frm

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: Пред. 1 2 3 4 5 След.
RSS
Не корректное отображение зарамочного оформления .frm
 
Могут ли в приведённом выше примере не выводиться надписи, если масштаб карты 1:900 000? При том, что поддерживается 1:1 000 000?
 
Цитата
Михаил Федосеев написал:
dfarmeFrm = new DFRAME;
   dfarmeFrm->X1 = paperPP_TL.X;
   dfarmeFrm->Y1 = paperPP_TL.Y;
   dfarmeFrm->X2 = paperPP_BR.X;
   dfarmeFrm->Y2 = paperPP_BR.Y;
   mapCloseSiteForMap(hMap, hSite);
   QString rscFileName = "frm"+QString::number(scale)+".rsc";
   QString frmFileName = QString::number(scale)+".frm";
   hSite = mapCreateAndAppendTempSite(hMap, rscFileName.toStdString().c_str());
   if (!mapAddMarginalRepresentationSite(hMap, hSite, frmFileName.toStdString().c_str(), dfarmeFrm)) {
       QMessageBox::information(nullptr, "Ошибка","Не удалось загрузить шаблон frm") ;
   }

Карту Вы закрыли. Потом создаете и открываете временную карту.

Во-первых, она открылась успешно? Рекомендую добавить проверку возвращаемого значения от mapCreateAndAppendTempSite.
Во-вторых, в зарамочное оформление выносятся данные из паспорта указанной карты. В основном из структуры LISTREGISTEREX, которая для временных карт вообще не заполняется.
Но часть параметров берется из структуры MAPREGISTEREX, который при некоторый условиях копируется во временную карту из основной, но не всегда.

При создании временной карты параметры датума, эллипсоида, проекции и часть сведений из паспорта копируются из основной карты - той, что была первой, когда Вы получили hMap.
Если основная карта - это не карта, а, например, геопортал, либо карта, но чтение паспорта для которой запрещено (при открытии с ГИС Сервера с соотв. полномочиями), - тогда во временную карту будут заполнены только параметры СК и проекции, а все метаданные паспорта останутся пустыми.

Паспорт вновь созданной карты Вы самостоятельно не заполняете.

Отсюда можно сделать вывод, что весьма мала вероятность успешного построения зарамочного оформления по временной карте, которая для Вас является по сути "черным ящиком", а заполнение ее паспорта весьма вариативно и зависит от целого ряда условий.

Поэтому я бы не рекомендовал использовать временную карту в качестве исходной для формирования зарамочного оформления.
 
Цитата
Поэтому я бы не рекомендовал использовать временную карту в качестве исходной для формирования зарамочного оформления.
Если я правильно понимаю, нужно создать пользовательскую карту с помощью метода

_MAPIMP HSITE _MAPAPI mapCreateAndAppendSiteForMap(HMAP hmap,                                             const char * mapname, const char * rscname);

Верно?
 
Зависит от той логики, которую Вы хотите реализовать.

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

Но, если это так необходимо, то да, карту лучше создать реальную (не временную) - как минимум на время отладки Вашего приложения.
Так Вы сможете хотя бы посмотреть паспорт этой карты в ГИС Панорама и убедится, что все параметры, которые подлежат переносу на рамку, заполнены.

Теоретически можно использовать как постоянную, так и временную карту, если корректно заполнить структуры MAPREGISTEREX и LISTREGISTER.
Функция mapCreateAndAppendSiteForMap также заполняет не все параметры.

Скорее всего, для корректного заполнения зарамочного оформления придется внести параметры MAPREGISTEREX и LISTREGISTER с помощью mapUpdateSiteInfo


Зарамочное оформление изначально предназначено для оформления рамки номенклатурных листов. Поэтому информация о листе карты имеет важное значение. А в пользовательских картах (SIT, SITX, SITZ) это не является необходимым условием при создании, поэтому LISTREGISTER заполняется не всегда.

Чтобы заполнить LISTREGISTER сразу при создании карты SIT, можно воспользоваться mapCreateMapProEx.


Подробное описание параметров шаблона зарамочного оформления см. в документации
 
Большое спасибо за информацию!

Вообще задача следующая:

Есть основная карта. Необходимо распечатать её часть - прямоугольную область, выбранную мышкой заданного стандартного размера с зарамочным оформлением, сеткой координат и т.д. Должна быть задана возможность двигать область мышкой. Соответственно её надо перерисовывать. Объекты, составляющие шаблон зарамочного оформления я получить не могу, чтобы их уничтожить. Поэтому необходим "слой", на котором я отображаю прямоугольник и, при необходимости перерисовки, просто его уничтожаю и создаю заново.

Логика примерно такая.
 
Пересоздавать зарамочное оформление динамически, интерактивно меняя область и позиционирование, не есть хорошо, так как эта операция все таки требует определенных затрат.
В лучшем случае надо это делать один раз, когда пользователь уже выбрал ту область, которая должна быть оформлена.
Ну или если уж очень надо показывать зарамочное оформление в процессе выбора области, то делать это не в процессе перемещения или редактирования области, а хотя бы в момент отпускания мыши.
Для ускорения работы тут как раз можно посоветовать использовать временную карту, причем в памяти:
Цитата
 // Создать временную пользовательскую карту по открытой карте
 // hmap -  идентификатор открытых данных
 // rscname - полное имя файла ресурсов, если не задано - выбирается
 // из карты
 // Файлы карты размещаются в рабочей директории системы
 // и имеют уникальные имена, генерируемые автоматически
 // При закрытии пользовательской карты все файлы данных автоматически удаляются
 // Возвращает идентификатор открытой пользовательской карты
 // При ошибке возвращает ноль
_MAPIMP HSITE _MAPAPI mapCreateAndAppendTempSitePro(HMAP hMap, const WCHAR *rscname, long int inmemory);
Но заполнить параметры, который переносятся в зарамочное оформление, в паспорт этой карты всё равно придётся.
 
В данный момент, если я перебираю все листы и применяю соответствующие паспорта на пользовательской карте, прямоугольник зарамочного оформления перестаёт рисоваться совсем. Он отображается только если я "масштабирую" карту с помощью колесика мышки. И отображается только начиная с определённого масштаба. И по прежнему не рисуется ничего кроме рамки.


В данный момент код выглядит так:

   dfarmeFrm = new DFRAME;
   dfarmeFrm->X1 = paperPP_BR.x;
   dfarmeFrm->Y1 = paperPP_TL.y;
   dfarmeFrm->X2 = paperPP_TL.x;
   dfarmeFrm->Y2 = paperPP_BR.y;
   if (!mapCloseSiteForMap(hMap, hSite)) {
       qDebug() << "ОШИБКА! Пользовательская карта корректно не закрылась!";
   }
   QString rscFileName = "frm"+QString::number(/*scale*/500000)+".rsc";
   QString frmFileName = QString::number(/*scale*/500000)+".frm";


   qDebug() << "Имена файлов классификатора и формы " << frmFileName << rscFileName;


   const WCHAR *rsc = rscFileName.toStdWString().c_str();


   hSite = mapCreateAndAppendTempSitePro(hMap,rsc, 0);
   if (!mapGetDocProjection(hMap, &mapRegTemp, &mapDatumTemp, &mapEllTemp)) {
       qDebug() << "ОШИБКА! Не получены реквизиты паспорта основной карты (MAPREGISTEREX, DATUMPARAM, ELLIPSOIDPARAM)";
   }
   for (int i = 1; i<mapGetListCount(hMap)+1; i++){
       if (!mapGetMapInfoPro(hMap, i, &mapRegTemp, &listRegTemp, &sheetNameTemp)) {
           qDebug() << "ОШИБКА! Не получены реквизиты паспорта основной карты (MAPREGISTEREX, LISTREGISTER, SHEETNAMES)";
       }


       if (!mapUpdateSiteInfoEx(hMap, hSite, &mapRegTemp, &listRegTemp, i, &mapDatumTemp, &mapEllTemp, 0)) {
           qDebug() << "ОШИБКА! Данные паспорта основной карты не перенесены на пользовательскую карту для печати";
       }
   }
   if (hSite) {
       if (!mapAddMarginalRepresentationSite(hMap, hSite, frmFileName.toStdString().c_str(), dfarmeFrm)) {
           QMessageBox::information(nullptr, "Ошибка","Не удалось загрузить шаблон frm") ;
       }
   }
   else {
       qDebug() << "ОШИБКА! Пользовательская карта для отображения зарамочного оформления и печати не создана";
   }


   //    inputRectNum = mapCommitObject(inputRectObj);
   hView->Repaint();
Изменено: Михаил Федосеев - 14.02.2020 10:26:34
 
Раз вы пользуетесь mapGetMapInfoPro, значит имеется многолистовая карта формата map.
Далее в созданный временный sit вы переносите паспортные данные из последнего листа (нашли в цикле, не понял зачем в цикле).
А прямоугольник у вас для габаритов последнего листа, или на всю многолистовую карту?
 
Да, у меня есть многолистовая карта. Я создаю временный sit. sit, если я правильно понимаю, охватывает всю карту. Так как функция mapUpdateSiteInfoEx(hMap, hSite, &mapRegTemp, &listRegTemp, i, &mapDatumTemp, &mapEllTemp, 0)) принимает номер листа, я передал реквизиты всех листов, составляющих базовую карту. В частности координаты углов этих листов.

Прямоугольник у меня меньше листа и может располагаться в любом месте карты, затрагивать несколько листов. Мне необходимо добавить зарамочное оформление для куска карты, входящего в этот прямоугольник и распечатать полученный фрагмент карты. Кроме этого должна быть предусмотрена возможность передвигать прямоугольник.
Изменено: Михаил Федосеев - 14.02.2020 13:57:27
 
Map - многолистовая карта. К map можно добавить несколько sit. Sit и лист карты не одно и тоже. Зачем вообще переносить параметры в sit? mapCreateAndAppendTempSitePro создает sit с параметрами основной карты.
Страницы: Пред. 1 2 3 4 5 След.
Читают тему (гостей: 9)



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

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