[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 но отсутствуют в ГИС Оператор:
Нашёл упоминание зарезервированных семантик (в документации формата RSC) -часть из 17 семантик являются зарезервированными, а часть - нет. 13-14 страница. Или в документации не полный список зарезервированных семантик?
Каким образом ГИС Оператор получает информацию о том, какие семантики относятся к объекту, а какие нет?
Вопрос не совсем понятен, но.. Введем набор определений, чтобы не путаться:
Объект карты - существующий объект на карте Объект классификатора - описанный в классификаторе объект
Вопрос: Какие семантики относятся к Объекту карты? Ответ: Те, которые для него установлены. Странный ответ, но справедливый) Никто не запрещает добавлять к Объекту картылюбые семантики с любым кодом. Просто на рисование, поведение знаков (объектов карты) они не будут влиять. Сталкивался с этим, когда приходилось работать с картами доставшимися извне. Поэтому надеяться на то, что в объекте будут только те семантики, которые для него допустимы не приходится.
Вопрос: Как получить семантики, которые указаны для Объекта классификатора? Ответ: я использую mapGetRscSemanticObjectCount + mapGetRscSemanticObjectCodeList. далее отбираются те, у которых код семантики меньше чем код начала диапазона служебных семантик.
Вопрос: Как получить семантики, которые допустимы для всех объектов, в т.ч. не являющимися объектами классификатора (не привязанные к коду объекта классификатора) Ответ: Как-то так сложилось, что у себя я этот список единожды определяю для конкретного классификатора при помощи mapGetRscSemanticCount + mapGetRscSemanticCodeByNumber + mapGetRscSemanticExByCode с фильтрацией по Service в RSCSEMANTICEX
Вопрос: Почему списки семантик в Оператор отличатся от списков полученных в Конструктор? Ответ: Насколько я понимаю, Оператор использует более старые библиотеки (возможно аналог ГИС Конструктор 11.х.х).
С уважением, Матвеев П.В.
Изменено: Павел Матвеев - 25.02.2019 15:44:10(всё та же..)
// Заполнить структуру описания семантической характеристики
// по коду семантики
// 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, смотри предыдующие посты) получится почти как в ГИС Операторе в просмотрщике классификаторов.