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

Переместить графический объект в другой слой

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
Переместить графический объект в другой слой
 
Создаю несколько графических объектов одного цвета на пользовательской карте в 1 слое:
Код
HOBJ hObj = mapCreateSiteObject(hMap, userMap, IDDOUBLE2);
mapRegisterDrawObject(hObj, 1, LOCAL_LINE);
Таких объектов может быть много, и они могут накладываться друг на друга. В некоторый момент времени мне необходимо "выделить" заданный объект на фоне остальных, раскрасив его в другой цвет. Изменить цвет графического объекта не проблема, однако, если поверх объекта уже был нарисован другой такой же объект, то видна только часть перекрашенного объекта. Возможно ли каким-то образом перемещать объекты в другой слой, в данном случае в слой "повыше"?
Рисуемые объекты все равнозначны, поэтому рисуются изначально в одном слое.
Код
// Версия библиотеки MapAccess// (если применяется "mapacces.h" и т.п.)
#define MAPACCESSVERSION  20160418

// Версия интерфейса MAPAPI и ядра библиотеки
#define MAPAPIVERSION  0x0111302
 
Вам должны помочь следующие функции:
Код
 // Переместить объект в цепочке в конец (рисуется над всеми)      // 19/02/14
 // Объекту присваивается признак "выше всех"
 // info  - идентификатор объекта карты в памяти
 // Возвращает новый последовательный номер объекта на карте - mapGetObjectNumber()
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapUpdateObjectUp(HOBJ info);

 // Переместить объект в цепочке в начало (рисуется под всеми)     // 19/02/14
 // Объекту присваивается признак "ниже всех"
 // info  - идентификатор объекта карты в памяти
 // Возвращает новый последовательный номер объекта на карте - mapGetObjectNumber()
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapUpdateObjectDown(HOBJ info);

 // Сбросить признаки "выше всех" и "ниже всех" в объекте          // 19/02/14
 // Положение объекта в соответствии с его слоем и локализацией
 // изменится после сортировки карты
 // info  - идентификатор объекта карты в памяти
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapUpdateObjectNormal(HOBJ info);

 // Запросить флаг размещения объекта (2 - над всеми, 3 - под всеми, 1 - не задано)
 // info  - идентификатор объекта карты в памяти
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapObjectUpDownState(HOBJ info);         // 28/04/16 
 
Спасибо! То, что нужно!
 
Правда, есть один момент. Иногда при вызове функции mapUpdateObjectNormal графический объект исчезает c карты, т.е. не отрисовывается. Надёжного повторения такого поведения у меня не получилось добиться, однако подозреваю, что это происходит из-за того, что я не делаю сортировку карты. Что за сортировка имеется в виду в описании этой функции? Это набор функций MapSorting* ?
 
Здравствуйте!

Cортировку можно выполнить с помощью набора функций из mapapi.h, а также функции MapSortProcess из vecexapi.h:
Код
  // Сортировка отдельной карты документа
  //  mapname - сортируемая карта
  //  flags   - Флажки обработки карты :
  //   0 - сортировать все листы,
  //   1 - только несортированные,
  //   2 - сохранять файлы отката,
  //   4 - повысить точность хранения,
  //   8 - нормальная точность хранения (FLOAT).
  //  16 - повысить точность хранения, формат - см
  //  32 - повысить точность хранения, формат - мм
  //  64 - повысить точность хранения, формат - радианы
  // hEvent - адрес функции обратного вызова для уведомлении о процессе
  // eventparam - параметры функции обратного вызова
  // outpath - адрес строки для записи нового пути к отсортированной карте,
  //           если адрес строки не задан, то карта обновляется на месте
  // size    - размер строки для записи пути
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI MapSortingWithEvent(const char *mapname,
                                             long int flags,
                                             EVENTCALL hEvent,
                                             void *eventparam,
                                             char *outpath,
                                             long int size);

  // Сортировка отдельной карты документа
  // mapname - сортируемая карта
  // flags   - Флажки обработки карты :
  //   0 - сортировать все листы,
  //   1 - только несортированные,
  //   2 - сохранять файлы отката,
  //   4 - повысить точность хранения,
  //   8 - нормальная точность хранения (FLOAT).
  //  16 - повысить точность хранения, формат - см
  //  32 - повысить точность хранения, формат - мм
  //  64 - повысить точность хранения, формат - радианы
  // handle     - идентификатор окна, которому посылаются сообщения WM_LIST и WM_OBJECT,
  //              если не задан параметр hEvent
  // hEvent     - адрес функции обратного вызова для уведомления о проценте выполнения,
  //              если параметр не задан, то посылаются сообщения WM_LIST и WM_OBJECT
  // eventparam - параметр, передаваемый функции обратного вызова
  // outpath    - буфер для записи пути к папке, куда сохранили отсортированную карту,
  //              если задан этот параметр, то исходная карта не обновляется,
  //              папка создается автоматически в программе сортировки
  // size       - длина буфера в байтах
  // format - управление форматом карты :
  //  0 -  не менять,
  //  1 -  установить формат SITX (на входе может быть SIT или MAP с одним листом),
  // -1 -  установить формат SIT (на входе может быть SITX или MAP с одним листом),
  // code - управление шифрованием карты :
  //  0 - не менять,
  //  1 - шифровать данные с помощью пароля из параметра password (формат SITX),
  // -1 - снять шифрование данных
  // password - пароль для шифрования данных, когда code = 1, или 0
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI MapSortingWithEventPro(const WCHAR *mapname, long int flags,
                                                HWND handle, EVENTCALL hEvent, void *eventparam,
                                                WCHAR *outpath, long int size,
                                                long int format, long int code,
                                                const WCHAR *password);

_MAPIMP long int _MAPAPI MapSortingSitePro(HMAP hmap, HSITE hsite, long int flags,
                                           HWND handle, long int format, long int code,
                                           const WCHAR *password);

_MAPIMP long int _MAPAPI MapSortingWithEventUn(const WCHAR *mapname, long int flags,
                                               HWND handle, EVENTCALL hEvent, void *eventparam,
                                               WCHAR *outpath, long int size);
Код
// Сортировка всех карт, входящих в документ
 // hmap   - идентификатор сортируемого документа
 // handle - идентификатор окна диалога процесса обработки (HWND)
 // mode   - комбинация флагов способа обработки карты:
 //   0 - сортировать все листы,
 //   1 - только несортированные;
 //   2 - сохранять файлы отката;
 //   4 - повысить точность хранения в метрах, число знаков максимальное;
 //  16 - повысить точность хранения в метрах, формат - см  (2 знака);
 //  32 - повысить точность хранения в метрах, формат - мм  (3 знака);
 //  64 - повысить точность хранения в радианах, число знаков максимальное;
 // При ошибке возвращает ноль

_VECIMP long int _VECAPI MapSortProcess(HMAP hmap, HMESSAGE handle, long int mode);
 
Я пробовал вызывать MapSortingSitePro(hMap, hSite, 1 или 0 неважно,  0, 0,  0,  0) сразу после вызова mapUpdateObjectNormal, однако объекты пользовательской карты стали вообще пропадать. Я так полагаю надо дождаться пока отработает сортировка и только потом перерисовывать карту? Как это узнать, используя MapSortingSitePro?
 
При вызове Сортировки объекты не должны пропадать.
Если Сортировка вызывается не в потоке, то по ее окончании можно перерисовать карту.

Сортировка не нужна, чтобы увидеть результат перемещения порядка вывода объекта.
После вызова функции mapUpdateObjectNormal можно выполнить перерисовку карты.
Не ясно как Вы перерисовываете объект. Нужно перерисовывать всю карту.
Поскольку после вызова функции типа mapUpdateObjectNormal объект удаляется (на своем месте)
и создается НОВЫЙ объект с теми же параметрами, но в новой позиции вывода.
Страницы: 1
Читают тему (гостей: 1)



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

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