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

[MAPAPI] Получение семантик, относящихся к конкретному объекту

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
[MAPAPI] Получение семантик, относящихся к конкретному объекту, Как получить список семантик объекта идентичный списку из редактора классификатора с помощью mapapi
 
Здравствуйте.

Я сейчас пишу редактор обстановок.
Для редактирования объекта мне необходимо из классификатора получить список семантик, которые можно (или обязательно) добавлять к создаваемому/редактируемому объекту.

Я использую следующие функции из rscapi.h:

Код
_MAPIMP  long int  _MAPAPI mapGetRscSemanticObjectCount( HRSC hRsc,long int incode,
                                                  long int importance);

_MAPIMP long int _MAPAPI mapGetRscSemanticObjectCode(HRSC hRsc,long int incode,
                                                     long int number,long int importance); 

Для примера открываю классификатор в Гис Оператор, выбираю один объект и сравниваю список семантик в ГИС Оператор с списком семантик, получаемый с помощью выше указанных функций из rscapi (для ALL_SEMANTIC или POSSIBLE + MUST).
И эти списки не идентичны.
Двух семантик, показываемых в ГИС Оператор не хватает в списке из rscapi (32798 32799)
17 (!) семантик есть в списке из rscapi но отсутствуют в ГИС Оператор:
Код
 32801, 32802, 32803, 32804, 32805, 32809, 32810, 32811, 32812, 32850, 32851, 32852, 32853, 32854, 32855, 32856, 32857
Нашёл упоминание зарезервированных семантик (в документации формата RSC) -часть из 17 семантик являются зарезервированными, а часть - нет. 13-14 страница. Или в документации не полный список зарезервированных семантик?

Каким образом ГИС Оператор получает информацию о том, какие семантики относятся к объекту, а какие нет?
 
Приветствую!

Вопрос не совсем понятен, но..
Введем набор определений, чтобы не путаться:

Объект карты - существующий объект на карте
Объект классификатора - описанный в классификаторе объект

Вопрос: Какие семантики относятся к Объекту карты?
Ответ: Те, которые для него установлены. Странный ответ, но справедливый) Никто не запрещает добавлять к Объекту картылюбые семантики с любым кодом. Просто на рисование, поведение знаков (объектов карты) они не будут влиять. Сталкивался с этим, когда приходилось работать с картами доставшимися извне. Поэтому надеяться на то, что в объекте будут только те семантики, которые для него допустимы не приходится.

Вопрос: Как получить семантики, которые указаны для Объекта классификатора?
Ответ: я использую mapGetRscSemanticObjectCount + mapGetRscSemanticObjectCodeList. далее отбираются те, у которых код семантики меньше чем код начала диапазона служебных семантик.

Вопрос:  Как получить семантики, которые допустимы для всех объектов, в т.ч. не являющимися объектами классификатора (не привязанные к коду объекта классификатора)
Ответ: Как-то так сложилось, что у себя я этот список единожды определяю для конкретного классификатора при помощи mapGetRscSemanticCount + mapGetRscSemanticCodeByNumber + mapGetRscSemanticExByCode  с фильтрацией по Service в RSCSEMANTICEX

Вопрос: Почему списки семантик в Оператор отличатся от списков полученных в Конструктор?
Ответ: Насколько я понимаю, Оператор использует более старые библиотеки (возможно аналог ГИС Конструктор 11.х.х).


С уважением,
Матвеев П.В.
Изменено: Павел Матвеев - 25.02.2019 15:44:10 (всё та же..)
 
Спасибо.
Цитата
код начала диапазона служебных семантик

А где его взять, не подскажете?
Он где-то задефайнен или описан в документации ?

А то я нашёл кучу макросов в maptype.h, Вы про EXTSEMANTIC ??
Код
#define EXTSEMANTIC        31001  // НАЧАЛО ДИАПАЗОНА СЕРВИСНЫХ СЕМАНТИК
Или всё что больше 32800 ?
Код
#define OBJEXCODEINSEMANTIC 32800  // КЛАССИФИКАЦИОННЫЙ КОД ОБЪЕКТА
#define SEMOBJEXCODE        32800  // КЛАССИФИКАЦИОННЫЙ КОД ОБЪЕКТА
 
Приветствую!

У меня в версии 12.5.0 в  maptype.h строка 2940:

#define SEMHIDEFIRST 32798

С уважением,
Матвеев П.В.
 
Нашёл, спасибо.

Там правда диапазоны указаны:
Код
// СЛУЖЕБНЫЕ СЕМАНТИКИ НЕ РЕДАКТИРУЮТСЯ !
#define SEMHIDEFIRST        32798  // НАЧАЛО ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК
#define SEMHIDELAST         32800  // КОНЕЦ  ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК


Код
// СЛУЖЕБНЫЕ СЕМАНТИКИ НЕ РЕДАКТИРУЮТСЯ !
#define SEMHIDEFIRST2       32850  // НАЧАЛО ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК
#define SEMHIDELAST2        32855  // КОНЕЦ  ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК

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

Когда Вы используете функцию :
Код
  // Заполнить структуру описания семантической характеристики
  // по коду семантики
  // hRsc - идентификатор классификатора карты
  // code - внешний код семантики
  // структура RSCSEMANTICEX описана в maptype.h
  // При ошибке возвращает ноль

_MAPIMP  long int _MAPAPI mapGetRscSemanticExByCode(HRSC hRsc,RSCSEMANTICEX * semtype,
                                                    long int code);
то получаете общее описание семантики, без привязки к объекту (в параметрах же объект классификатора не указан).

То есть если Вам надо получить список семантик конкретного объекта и для каждой семантики знать, является ли она обязательной, влияет ли она на внешний вид объекта, или является возможной  (поле Enabled структуры RSCSEMANTICEX), то нужно дополнительно вызвать функцию:
Код
  // Запросить использование семантики для данного объекта -
  // incode - внутренний код (порядковый номер)объекта
  // semanticcode - код семантики
  // hRsc - идентификатор классификатора карты
  // Возвращает значимость семантики  см. maptype.h (SEMANTIC_FOR_OBJECT )

_MAPIMP  long int  _MAPAPI mapGetRscSemanticObjectUsed(HRSC hRsc,long int incode,
                                      long int semanticcode);

В итоге для конкретного объекта получается связка mapGetRscSemanticObjectCount(ALL_SEMANTICS) -> mapGetRscSemanticObjectCodeList -> mapGetRscSemanticExByCode(для каждой семантики из списка) и mapGetRscSemanticObjectUsed (чтобы вычислить поле Enabled у структуры RSCSEMANTICEX).
С фильтрацией всех служебных семантик (у которых код > SEMHIDEFIRST, смотри предыдующие посты) получится почти как в ГИС Операторе в просмотрщике классификаторов.
Страницы: 1
Читают тему (гостей: 1)



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

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