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

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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 180 След.
Значение параметров градиента
 
Данный примитив используется в структуре GRADIENTPARM, которая находится в библиотеке программируемых знаков (rscarmy.iml, rscarmy.iml64):
[CODE]typedef struct GRADIENTPARM // Градиентный векторный
{
 IMGVECTOREX *     Vector;    // Описание векторного (полигона)
 IMGVECTORGRADIENT Gradient;  // Параметры градиентной заливки
 int               Size;      // sizeof(GRADIENTPARM);
 int               Zero;
}
 GRADIENTPARM;[/CODE]Градиентная заливка используется для заполнения векторных знаков типа "Флаг", которые содержатся классификаторах семейства operator.rsc (входит в состав ГИС "Оператор").
Обычно основной фон полотна флага рисуется белым цветом. Цвет Color определяет цвет вертикальной штриховки полигона (полотна флага) линиями (слева направо).
Поле Left определяет степень влияния цвета Color самой левой линии (габаритов заполняемого полигона), Right - самой правой линии.
Если Left и Right равны 0, то левая и правая линии штриховки флага имеют белый цвет. Цвет средней вертикальной линии стремится к Color.
Векторный знак (Vector) должен содержать площадной примитив произвольной формы (до 128 точек).
Отображение изображений на карте
 
1. mappicex.h (gispicex64.dll)[CODE]//========================================================================
// Импорт растровых данных в файл RSW
// handle - диалог визуального сопровождения процесса обработки
// srcname        - имя входного файла (TIF, IMG, PNG, GIF, JPG, BMP, PCX)
// rstname        - имя выходного файла (*.rsw)
// retcode        - код возврата
// Приоритет изъятия параметров привязки:
//   1. Содержимое соответствующих тегов файлов TIF, IMG
//   2. Файл привязки world.file
//   3. Файл привязки TAB (MapInfo)
// Функция ищет файл привязки рядом с исходным файлом srcname,
// перебирая по приоритету типы файлов.
// При ошибке возвращает ноль
//==========================================================­==============
_PICIMP long int _PICAPI picexLoadRasterToRswUn(HMESSAGE handle,
                                               const WCHAR* srcname,
                                               const WCHAR* rstname,
                                               long int * retcode);
[/CODE]2. rstapi.h (gisacces64.dll)[CODE] // Открыть растровые данные в заданном районе работ
 // (добавить в цепочку растров)
 // Возвращает номер файла в цепочке растров
 // hMap    - идентификатор открытых данных
 // rstname - имя файла растровой карты
 // mode    - режим чтения/записи (GENERIC_READ, GENERIC_WRITE или 0)
 // GENERIC_READ - все данные только на чтение
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapOpenRstForMapUn(HMAP hMap, const WCHAR *name, long int mode);
[/CODE]3. Функции запроса и изменения положения растра rstapi.h (gisacces64.dll)[CODE] // Установить привязку растра в районе работ(в метрах)
 // hMap       - идентификатор открытых данных
 // number     - номер файла в цепочке
 // location   - координаты юго-западного угла растра(в метрах)
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapSetRstLocation(HMAP hMap, long int number, DOUBLEPOINT *location);

 // Запросить привязку растра в районе работ(в метрах)
 // hMap       - идентификатор открытых данных
 // number     - номер файла в цепочке
 // location   - координаты юго-западного угла растра(в метрах)
 // При ошибке возвращает 0

_MAPIMP long int _MAPAPI mapGetRstLocation(HMAP hMap, long int number, DOUBLEPOINT *location);
[/CODE]4. Печать выполняется стандартной функцией mapapi.h (gisacces64.dll)[CODE] // Отобразить фрагмент карты на заданном устройстве с учетом калибровки
// в текущих масштабе и составе объектов
// hmap   - идентификатор открытых данных
// rect - координаты фрагмента карты (Draw) в изображении (Picture)
// parm - параметры печати, указатель на PRINTPARM (см. prnapi.h)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapPrint(HMAP hmap, HDC hDC, RECT *rect, const char *parm);
[/CODE]
Не корректное отображение зарамочного оформления .frm
 
[QUOTE]Михаил Федосеев написал (в письме):
С этого момента обсуждение существенно не продвинулось. Мне было предложено воспользоваться методом  frmCreateBorderPro. Однако существуют 2 проблемы:
- во первых метод отказывается принимать HSITE, созданный в обсуждаемом нами примере. HSITE основной карты принимается, но никакого зарамочного оформления не отображается.
- во вторых параметры данного метода не подразумевают указания области карты, для которой нужно создать зарамочное оформление, что является для нас критичным. Возможно указать только номер листа карты.
[/QUOTE]
1. Полное зарамочное оформление может быть построено только по карте, открытой в отдельный HMAP (preprint\frmbuild.cpp):
[CODE] // Вид карты: -1 - SIT c рамкой
     mapregex.FlagRealPlace = -1;

     HMAP fmap = mapCreateMapPro(RotateSit, rscfilename, &mapregex, &listreg,
                            &sheet, sheetname, 0, 0);
[/CODE]2. Карта зарамочного оформления создается отдельно в виде безразмерного листа:
[CODE] // Вид карты: 1 - SIT (безразмерный лист)
    mapregex.FlagRealPlace = 1;

    HMAP fmap = mapCreateMapPro(FrameSit, rscfilename, &mapregex, &listreg,
                            &sheet, sheetname, 0, 0);
    if (fmap != 0)
      {
       // Установить параметры DATUM и Ellipsoid
       mapSetSiteDatum(fmap, fmap, &datum);
       mapSetSiteEllipsoidParameters(fmap, fmap, &ellipsoid);

       mapSaveSite(fmap, fmap, 1);
       mapCloseData(fmap);
      }[/CODE]3. Вычислить угол поворота карты (для топокарт):
[CODE] if (RegionCheckBox->Checked == true)
  {
   angle = 0.;

   // Откроем главную карту повёрнутого листа RotateSit
   HMAP hSheet = mapOpenDataUn(RotateSit);
   if (hSheet != 0)
     {
      // Вычислить угол поворота для нового листа
      frmGetRotateAngle(hSheet, 1, &angle);

      // Копирование и поворот объектов на RotateSit
      TurnSheetRegion(angle, rsit);

      mapCloseSiteForMap(Hmap, rsit);

      // Добавим карту зарамочного оформления
      frmsit = mapOpenSiteForMapUn(hSheet, FrameSit, 0);

      if (frmsit)
       {
       frmCreateBorderPro(hSheet,1,frmsit,frmsit,FrameTemp,0,LogFile,0);

       mapCloseSiteForMap(hSheet, frmsit);
       }

      // Установка FlagRealPlace = 1, чтобы после поворота пересчитались габариты листа(всего района)
      if (mapGetSiteInfoPro(hSheet, hSheet, &mapregex, &listreg, &sheet,1) != 0)
        {
         mapregex.FlagRealPlace = 1;
         mapUpdateSiteInfoEx(hSheet, hSheet, &mapregex, &listreg, 1, &datum, &ellipsoid, 0);
        }
      // Закрыть документ
      mapCloseData(hSheet);
     }
  }

[/CODE]4. Повернуть карту:
[CODE] if (frmTurnSheet(TaskParm, Hmap, i, angle, rsit) == 0)
   {
    mapCloseSiteForMap(Hmap, rsit);  // 15/12/17
    mapCloseSiteForMap(Hmap, frmsit);
    break;
   }
[/CODE]5.
[CODE] // НАНЕСТИ ЗАРАМОЧНОЕ ОФОРМЛЕНИЕ
  if (CreateBorder(Hmap, i, rsit, frmsit, angle) == 0)
   {
    mapCloseSiteForMap(Hmap, rsit);  // 15/12/17
    mapCloseSiteForMap(Hmap, frmsit);
    break;
   }
[/CODE][CODE]int TFormFrameBuild::CreateBorder(HMAP hmap, int sheet, HSITE rotsit, HSITE frmsit, double angle) // 15/12/17
{

if (MessageCheck->Checked == true)
  return frmCreateBorderPro(Hmap,sheet,rotsit,frmsit,FrameTemp,angle,LogFile,2);
return frmCreateBorderPro(Hmap,sheet,rotsit,frmsit,FrameTemp,angle,LogFile,0);
}
[/CODE]
6. Нанести легенды...
Печать карты, Проблема настройки цветности слоев печати
 
Есть такой вариант (на примере классификатора map500.rsc):

1. Создать копию классификатора map500.rsc -> map500_gray.rsc.
2. Заменить цвета в классификаторе map500_gray.rsc на серые (нажать ПКМ на цвете, установить Оттенок = 0 и Контраст = 0).
3. Сохранить карту в SXF.
4. Загрузить карту из SXF с классификатором map500_gray.rsc.
5. Добавить к черно-белой карте пустую карту с цветным классификатором map500.rsc.
6. Выделить объекты, которые должны быть цветными.
7. Скопировать выделенные объекты на пустую карту.
Не корректное отображение зарамочного оформления .frm
 
Функция mapAddMarginalRepresentationSite используется для формирования простого зарамочного оформления. Обрабатывает ограниченный набор ключевых слов: ".RSCLINE", ".RSCFRAME", ".GEOTEXT", ".RSCTEXT", ".DIRECTION".
Для получения расширенного зарамочного оформления необходимо использовать функцию frmCreateBorderPro. Текст данной функции доступен в виде исходных текстов (frmapi\frmapim.cpp), пример использования в файле (preprint\frmbuild.cpp).

Данные тексты выложены в виде архива [URL=http://gisinfo.ru/download?id=229]sdk13.zip[/URL] и доступны для скачивания на странице: [URL=https://gisinfo.ru/download/download.htm]https://gisinfo.ru/download/download.htm[/URL]
Не корректное отображение зарамочного оформления .frm
 
ТУТ ОШИБКА:
   CREATESITE *cs = new CREATESITE;
   cs->Length              = mapreg->Length            ;

ДОЛЖНО бЫТЬ:
cs->Length = sizeof(CREATESITE);

Размеры структур CREATESITE и MAPREGISTEREX отличаются.

P.S. К сожалению архив содержит только паспорт карты. Отсутствуют файлы, записанные паспорте: K362.hdr, K362.dat, K362.sem, K362.gra, ...
Вызов паспорта карты двойным кликом мышью по её названию в легенде., Завершение редактирования паспорта карты Ctrl+Enter
 
[QUOTE]Андрей Ильин написал:
1) Часто приходится редактировать паспорт карты.[/QUOTE]
Планируется добавить вызов Паспорта карты, выбранной в Легенде (Список карт), по кнопке F8. Двойной клик может быть задействован для включения и отключения отображения карты.
Сейчас Паспорт карты открывается при выборе предпоследней кнопки "Параметры проекции" в меню закладки "Карты".
Редактор классификатора. Разные иконки (пиктограммы), горячие клавиши на редактор классификатора
 
1. Иконки будут приведены к единому виду (в том числе и иконка "Классификатор" в диалоге выбора объекта). Изображение иконки скорее будет иметь вид, используемый в легенде.
2. Добавление быстрых комбинаций вызова редактора классификатора не планируется.
Печать без вывода диалога печати, Не печатается катра без вывода диоалога печати
 
1. Для печати нескольких страниц необходимо в INI-файл карты в раздел "PRINT" записать список номеров печатаемых страниц "PagesCollect" (при отсутствии записи печатается страница 1):

[PRINT]
PagesCollect=1,2,4,5

mapGetMapIniName(hMap) - запросить имя INI-файла.

2. IMGTEXT_SCALE       // Признак растягивания по метрике - высота вычисляется исходя из длины отрезка [x; y] - [x+1000; y+1000] (в масштабе печатаемой карты). Если 1000 заменить на 2000, то подпись увеличится в 2 раза.
При выборе флага IMGTEXT_SCALE параметр parmText.Text.Height игнорируется.

Разница размера шрифта может объясняться разными масштабами печати (printparm.Scale) - в диалоге масштаб печати может изменяться автоматически - зависит от выбранных настроек.
Признак "Не сжимать", который устанавливается функцией mapSetObjectPress, на подписи, растягиваемые по метрике (IMGTEXT_SCALE), не действует.
функция mapCreateObjectsCross()
 
Предлагаю воспользоваться набором оверлейных операций (см. crossapi.h). Пример:
[CODE] // Создать пустой объект для записи шаблона для обрезки объектов
 HOBJ templet = mapCreateSiteObject(hmap, hsite, IDDOUBLE2, 0);

 // Создать пустой объект для записи обрабатываемого объекта
 HOBJ object = mapCreateSiteObject(hmap, hsite, IDDOUBLE2, 0);

 // Создать пустой объект для записи результата
 // (для записи результата рекомендуется тип IDDOUBLE2 или IDDOUBLE3)
 HOBJ objectpart = mapCreateSiteObject(hmap, hsite, IDDOUBLE2, 0);

 // Запросить объект карты
 mapReadObjectByNumber(hmap, hsite, templet, 1, templetnumber);

 // Запросить объект карты
 mapReadObjectByNumber(hmap, hsite, object, 1, objectnumber);

 // Установить тип результирующего объекта равным типу обрабатываемого
 mapDescribeObject(objectpart, mapObjectCode(object));

 // Создать объект оверлейных операций
 HOVL hovl = ovlCreate(hmap, 1, DOUBLENULL);

 if (hovl == 0)
 {
   // Ошибка создания объекта оверлейных операций
 }
 else
 {
   // Установить шаблон для оверлейных операций
   // (по основному контуру объекта, с согласованием контура
   //  шаблона с обрабатываемыми объектами)
   int res = ovlSetTemplet(hovl, templet, 0, 1);

   if (res == 0)
   {
     // Запросить код ошибки
     if (ovlGetErrorCode(hovl) != 0)
     {
       // Запросить описание ошибки для вывода в окно или записи в журнал
       ::MessageBox(0, ovlGetError(hovl), "", MB_OK);
     }
   }
   else
   {
     int errorcode = 0;

     // Установить обрабатываемый объект и метод обработки
     // (все контура, результат - все площадные контура)
     int location = ovlSetObjectCross(hovl, object, -1, 0.0, 0, METHOD_SQUARE, 0);

     // Расположение объекта относительно шаблона
     if (location == 0)
     {
       // Запросить код ошибки
       if (ovlGetErrorCode(hovl) != 0)
       {
         // Запросить описание ошибки
         ::MessageBox(0, ovlGetError(hovl), "", MB_OK);
       }
     }
     else if (location == 1)
     {
       // Объект внутри шаблона
       // ...
     }
     else if (location == 2)
     {
       // Объект вне шаблона
       // ...
     }
     else  // location == 3 или 4 (Объект пересекается с шаблоном)
     {
       int side;

       while(1)
       {
         // Запросить очередную часть разрезаемого объекта
         side = ovlGetNextObject(hovl, objectpart);

         if (side == 0)
         {
           // Запросить код ошибки
           if (ovlGetErrorCode(hovl) != 0)
           {
             // Запросить описание ошибки
             ::MessageBox(0, ovlGetError(hovl), "", MB_OK);
             break;
           }

           // Запросить метрику основного контура шаблона, согласованного
           // с частями разрезаемого объекта
           if (ovlGetAdjustTemplet(hovl, templet, 0))
           {
             // Сохранить объект, если контур шаблона обновился
             mapCommitObject(templet);
           }
           else
           {
             // Запросить код ошибки
             if (ovlGetErrorCode(hovl) != 0)
             {
               // Запросить описание ошибки
               ::MessageBox(0, ovlGetError(hovl), "", MB_OK);
             }
           }

           // Поиск частей разрезаемого объекта закончен
           break;
         }

         // Установить разные коды объектов для результирующих объектов
         if (side == 1)
         {
           // Объект, находящийся внутри шаблона
           mapRegisterObjectByKey(objectpart, "L1000000008");
         }
         else
         {
           // Объект, находящийся вне шаблона
           mapRegisterObjectByKey(objectpart, "L1000000007");
         }

         // Сохранить объект objectpart
         mapCommitObjectAsNew(objectpart);
       }
     }
   }

   // Освободить объект оверлейных операций
   ovlFree(hovl);
 }

 // Освободить объекты
 mapFreeObject(objectpart);
 mapFreeObject(object);
 mapFreeObject(templet);[/CODE]
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 180 След.



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

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