Здравствуйте. Стоит задача рисовать объекты из разных классификаторов с добавлением семантики "Признак цвета объекта". Пытаюсь понять механизм работы в целом. 1. Как определить, изменится ли цвет объекта при добавлении ему семантики "Признак цвета объекта". Имеется ввиду, как программно понять, что объект "имеет" данную семантику и при ее добавлении способ его отрисовки изменится. 2. Как я понял, в "Признак цвета объекта" записывается значение из некоего списка доступных значений, в редакторе классификатора Панорамы он называется "Код из классификатора". Как программно получить этот набор значений?
Изменение цвета объекта через ввод цвета в семантику обычно применяется при плохом проектировании информационной системы. Есть служебная семантика с кодом 31002, которая меняет цвет объекта на заданный.
Условный знак должен меняться исходя из свойств объекта.
Можно подготовить серию объектов (двумерную/одномерную таблицу условных знаков), зависящую от двух семантик. Или подготовить программируемые знаки (IMLAPI), формирующие условный знак по любому алгоритму.
Примеры в классификаторах operator.rsc, dfc.rsc (аэронавигация), agro10t.rsc (сельскохозяйственный), s57navy.rsc (морские карты) и т.д.
Oleg Belenkov, делаем универсальный инструмент для рисования любыми объектами из любых классификаторов, интересует конкретно механизм работы с подобными семантиками, для примера взял Признак цвета. Ответов на заданные вопросы пока не получил.
#define EXTSEMANTIC 31001 // НАЧАЛО ДИАПАЗОНА СЕРВИСНЫХ СЕМАНТИК
#define SEMIMAGESCALE 31001 // МАСШТАБ ОТОБРАЖЕНИЯ ЗНАКА В ПРОЦЕНТАХ
#define SEMIMAGECOLOR 31002 // ЦВЕТ ОТОБРАЖЕНИЯ ЗНАКА RGB
#define SEMIMAGEHIGHT 31003 // ВЫСОТА ШРИФТА В ММ
#define SEMIMAGEFONT 31004 // НАЗВАНИЕ ШРИФТА
#define SEMIMAGETHICK 31005 // ТОЛЩИНА ЛИНИИ В ММ
#define SEMIMAGETHICK2 31006 // ТОЛЩИНА ОКОНЧАНИЯ ЛИНИИ В ММ
#define SEMCOLORWEIGHT 31007 // ВЕС ЦВЕТА ОБЪЕКТА В ПРОЦЕНТАХ
#define SEMLINETHICK 31008 // ТОЛЩИНА ЛИНИИ В ПУНКТАХ
#define SEMLINECOLOR 31009 // ЦВЕТ ЛИНИИ RGB
#define SEMLINEPATTERN 31010 // НОМЕР СИМВОЛА ЗАЛИВКИ ЛИНИИ В MAPINFOW.PEN
// (1-255)
#define SEMMARKSIZE 31011 // РАЗМЕР СИМВОЛА ЗНАКА В ПУНКТАХ (1-48)
#define SEMMARKCOLOR 31012 // ЦВЕТ ЗНАКА RGB
#define SEMFONCOLOR 31013 // ЦВЕТ ФОНА RGB (SEMBACKCOLOR)
#define SEMMARKSHAPE 31014 // НОМЕР СИМВОЛА ЗНАКА В СООТВЕТСТВУЮЩЕМ
// TRUETYPE ШРИФТЕ (БОЛЬШЕ 31),
// УКАЗАННОМ В СЕМАНТИКЕ SEMIMAGEFONT
#define SEMSQUAREPATTERN 31015 // НОМЕР СИМВОЛА ЗАЛИВКИ ПЛОЩАДИ В MAPINFOW.PEN
// (1-255)
#define SEMFONTSTYLE 31016 // СТИЛЬ ШРИФТА (СУММА ПРИЗНАКОВ:
// 0 - ОБЫЧНЫЙ, 1 - TОЛСТЫЙ, 16 - В РАМКЕ,
// 32 - С ТЕНЬЮ, 256 - БЕЛАЯ РАМКА)
#define SEMMARKANGLE 31017 // УГОЛ ПОВОРОТА ТОЧЕЧНОГО ОРИЕНТИРОВАННОГО ЗНАКА
#define PRINTFIELDLEFT 31101 // ПОЛЕ ДЛЯ ПЕЧАТИ СЛЕВА
#define PRINTFIELDRIGHT 31102 // ПОЛЕ ДЛЯ ПЕЧАТИ СПРАВА
#define PRINTFIELDTOP 31103 // ПОЛЕ ДЛЯ ПЕЧАТИ СВЕРХУ
#define PRINTFIELDBOTTOM 31104 // ПОЛЕ ДЛЯ ПЕЧАТИ СНИЗУ
#define SEMLABELTEXT 31109 // ТЕКСТ ПОДПИСИ (АНАЛОГ СЕМАНТИКИ 9 ДЛЯ СЛУЖЕБНЫХ ОБЪЕКТОВ)
#define EXTSEMANTICEND 31109 // КОНЕЦ ДИАПАЗОНА
// ЗАРЕЗЕРВИРОВАННЫЕ КОДЫ СЕМАНТИЧЕСКИХ ХАРАКТЕРИСТИК ДЛЯ АДРЕСА
// ------------------------------------------------------------------
#define ADRSEMANTIC 31201 // НАЧАЛО ДИАПАЗОНА АДРЕСНЫХ СЕМАНТИК
#define SEMADRSTREET 31201 // НАЗВАНИЕ УЛИЦЫ
#define SEMADRHOUSE 31202 // НОМЕР ДОМА
#define SEMADRTRUNK 31203 // НОМЕР КОРПУСА
#define SEMADRBUILD 31204 // НОМЕР СТРОЕНИЯ
#define SEMADRESTATE 31205 // НОМЕР ВЛАДЕНИЯ
#define SEMADRSTREETCODE 31206 // КОД УЛИЦЫ
#define SEMADRTOWN 31207 // НАЗВАНИЕ ГОРОДА (НАСЕЛЕННОГО ПУНКТА)
#define SEMADRTOWNCODE 31208 // КОД ГОРОДА (НАСЕЛЕННОГО ПУНКТА) ПО ОКАТО
#define SEMADRPOSTCODE 31209 // ПОЧТОВЫЙ ИНДЕКС
#define ADRSEMANTICEND 31209 // КОНЕЦ ДИАПАЗОНА
#define SEMLONWGS84 32201 // ДОЛГОТА В ГРАДУСАХ НА WGS-84
#define SEMLATWGS84 32202 // ШИРОТА В ГРАДУСАХ НА WGS-84
#define SEMPOINTDATE 32203 // ДАТА ОПРЕДЕЛЕНИЯ КООРДИНАТ ОБЪЕКТА
#define SEMPOINTTIME 32204 // ВРЕМЯ ОПРЕДЕЛЕНИЯ КООРДИНАТ ОБЪЕКТА
#define SEMXMETERS 32205 // КООРДИНАТА X В МЕТРАХ
#define SEMYMETERS 32206 // КООРДИНАТА Y В МЕТРАХ
#define SEMHMETERS 32207 // НОРМАЛЬНАЯ ВЫСОТА H В МЕТРАХ
#define SEMLONSGS85GMS 32208 // ГЕОДЕЗИЧЕСКАЯ КООРДИНАТА ПО ДОЛГОТЕ В ГРАДУСАХ,МИНУТАХ,СЕКУНДАХ В ПЗ-90.11
#define SEMLATSGS85GMS 32209 // ГЕОДЕЗИЧЕСКАЯ КООРДИНАТА ПО ШИРОТЕ В ГРАДУСАХ,МИНУТАХ,СЕКУНДАХ В ПЗ-90.11
#define SEMLONWGS84GMS 32210 // ГЕОДЕЗИЧЕСКАЯ КООРДИНАТА ПО ДОЛГОТЕ В ГРАДУСАХ,МИНУТАХ,СЕКУНДАХ НА WGS-84
#define SEMLATWGS84GMS 32211 // ГЕОДЕЗИЧЕСКАЯ КООРДИНАТА ПО ШИРОТЕ В ГРАДУСАХ,МИНУТАХ,СЕКУНДАХ НА WGS-84
#define SEMVELOCITY 32212 // СКОРОСТЬ ДВИЖЕНИЯ КМ/Ч
#define SEMSATCOUNT 32213 // ЧИСЛО СПУТНИКОВ
#define SEMDEPTHZERO 32767 // НУЛЬ ГЛУБИН (СПРАВОЧНИК - S57)
#define SEMDOCFILE 32768 // ССЫЛКА НА ДОКУМЕНТ
#define SEMIMAGEFILE 32769 // ССЫЛКА НА ФАЙЛ-ВСТАВКУ (УВЕЛИЧЕННЫЙ ФРАГМЕНТ ОСНОВНОГО ИЗОБРАЖЕНИЯ В ОТЧЕТЕ)
#define SEMMAPFILE 32770 // ССЫЛКА НА КАРТУ
#define SEM3DVIEWFILE 32771 // ССЫЛКА НА ФАЙЛ 3D-ВИДА
#define SEMVCLXMODEL 32772 // ИМЯ МАКЕТА УСЛОВИЙ ПОИСКА ИЗ ФАЙЛА VCLX КАРТЫ
#define SEMFIDS 32778 // ПОДРАЗДЕЛЕНИЕ ИДЕНТИФИКАЦИИ (S57)
#define SEMFIDN 32779 // НОМЕР ИДЕНТИФИКАЦИИ (S57)
// СЛУЖЕБНЫЕ СЕМАНТИКИ НЕ РЕДАКТИРУЮТСЯ !
#define SEMHIDEFIRST 32798 // НАЧАЛО ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК
#define SEMHIDELAST 32800 // КОНЕЦ ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК
// ЗАРЕЗЕРВИРОВАННЫЕ КОДЫ СЕМАНТИЧЕСКИХ ХАРАКТЕРИСТИК
// ------------------------------------------------------------------
#define OBJECTDBID 32798 // ИДЕНТИФИКАТОР ОБЪЕКТА В БАЗЕ ДАННЫХ
#define OBJECTGUID 32799 // ИДЕНТИФИКАТОР ОБЪЕКТА GUID (ObjectGUID)
#define OBJEXCODEINSEMANTIC 32800 // КЛАССИФИКАЦИОННЫЙ КОД ОБЪЕКТА
#define SEMOBJEXCODE 32800 // КЛАССИФИКАЦИОННЫЙ КОД ОБЪЕКТА
#define GROUPLEADER 32801 // ПРИЗНАК ОБЪЕКТА, ИМЕЮЩЕГО ССЫЛКУ
#define SEMGROUPLEADER 32801 // НА ПОДЧИНЕННЫЙ ОБЪЕКТ
#define GROUPSLAVE 32802 // ПРИЗНАК ОБЪЕКТА, НА КОТОРЫЙ
#define SEMGROUPSLAVE 32802 // ИМЕЕТСЯ ССЫЛКА ОТ ГЛАВНОГО ОБЪЕКТА;
#define GROUPPARTNER 32803 // ПРИЗНАК ОБЪЕКТА, ВХОДЯЩЕГО
#define SEMGROUPPARTNER 32803 // В ГРУППУ РАВНОПРАВНЫХ ОБЪЕКТОВ
#define GROUPTEXT 32804 // ССЫЛКА НА ПОДПИСЬ ОТ ОБЪЕКТА
#define SEMOBJECTTOTEXT 32804 // (КЛЮЧ ОБЪЕКТА-ПОДПИСЬ НА ТОЙ ЖЕ КАРТЕ)
#define SEMOBJECTFROMTEXT 32805 // ССЫЛКА НА ОБЪЕКТ ОТ ПОДПИСИ
// (КЛЮЧ ОСНОВНОГО ОБЪЕКТА НА ТОЙ ЖЕ КАРТЕ)
#define SEMOBJECTTOTEXTFAR 32806 // ССЫЛКА НА ПОДПИСЬ ОТ ОБЪЕКТА
// (КЛЮЧ ОБЪЕКТА-ПОДПИСЬ НА ГЛАВНОЙ КАРТЕ)
#define SEMOBJECTFROMTEXTFAR 32807 // ССЫЛКА НА ОБЪЕКТ ОТ ПОДПИСИ
// (КЛЮЧ ОСНОВНОГО ОБЪЕКТА НА ГЛАВНОЙ КАРТЕ)
#define SEMRSCNAME 32809 // ИМЯ ФАЙЛА КЛАССИФИКАТОРА RSC
#define SEMLAYERSHORTNAME 32810 // КОРОТКОЕ ИМЯ СЛОЯ ОБЪЕКТА
#define SEMOBJECTSHORTNAME 32811 // КОРОТКОЕ ИМЯ ОБЪЕКТА (КЛЮЧ)
// ЗАРЕЗЕРВИРОВАННЫЕ КОДЫ СЕМАНТИЧЕСКИХ ХАРАКТЕРИСТИК ДЛЯ ГРАФОВ
// ------------------------------------------------------------------
#define SEMNETRIB 32812 // Номер объекта-ребра (для узла)
#define SEMNETKNOTFIRST 32813 // Номер объекта-узла первой точки (для ребра)
#define SEMNETKNOTLAST 32814 // Номер объекта-узла последней точки (для ребра)
#define SEMNETNUMBER 32815 // Номер сети
#define SEMNETTOOBJECT 32816 // Ссылка на объект листа
#define SEMNETVDIRECT 32817 // Скорость прямая (для ребра)
#define SEMNETVUNDIRECT 32818 // Скорость обратная (для ребра)
#define SEMNETCOSTRIB 32819 // Вес ребра
#define SEMNETRANKRIB 32820 // Ранг ребра
#define SEMNETBAN 32821 // Номер ребра, на который запрещен переход (если ребра соединены в одном узле)
#define SEMNETTURN 32822 // Признак запрета разворота (1-в начале ребра,2-в конце,3-в начале и в конце)
#define SEMSELFID 32823 // Собственный идентификатор объекта GDF
#define SEMNETCOSTRIBBACK 32824 // Вес ребра обратный
#define SEMNETRANKRIBBACK 32825 // Ранг ребра обратный
#define SEMNETBANBEGIN 32826 // Номер ребра, на который запрещен переход из начала ребра
#define SEMNETBANEND 32827 // Номер ребра, на который запрещен переход из конца ребра
#define SEMNETINLIST 32828 // Ссылка на рамку исходной карты
#define SEMNETNOMECLATURE 32829 // Номенклатура листа
#define SEMOBJECTDATE 32850 // ДАТА СОЗДАНИЯ ОБЪЕКТА
#define SEMOBJECTTIME 32851 // ВРЕМЯ СОЗДАНИЯ ОБЪЕКТА
#define SEMOBJECTAUTHOR 32852 // ИМЯ ОПЕРАТОРА
#define SEMOBJECTREDATE 32853 // ДАТА ОБНОВЛЕНИЯ ОБЪЕКТА
#define SEMOBJECTRETIME 32854 // ВРЕМЯ ОБНОВЛЕНИЯ ОБЪЕКТА
#define SEMOBJECTREAUTHOR 32855 // ИМЯ ОПЕРАТОРА ОБНОВЛЕНИЯ
// СЛУЖЕБНЫЕ СЕМАНТИКИ НЕ РЕДАКТИРУЮТСЯ !
#define SEMHIDEFIRST2 32850 // НАЧАЛО ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК
#define SEMHIDELAST2 32855 // КОНЕЦ ДИАПАЗОНА СЛУЖЕБНЫХ СЕМАНТИК
#define SEMOBJECTIDENT 32856 // ИДЕНТИФИКАТОР ОБЪЕКТА
#define SEMOBJECTDESC 32857 // ОПИСАНИЕ ОБЪЕКТА
#define SEMABBREVIATIONS 32858 // СПИСОК СОКРАЩЕНИЙ
#define SEMDATEFROM 32859 // ДАТА НАЧАЛА ОТСЧЕТА UTC, ПРИ ЗАПРОСЕ "LONG" ВОЗВРАЩАЕТ ЧИСЛО ДНЕЙ ОТ ЭТОЙ ДАТЫ
#define SEMLONGTEXT 32860 // ТЕКСТ ПОДПИСИ UTF-32 ДЛИННЕЕ 126 СИМВОЛОВ
#define SEMOBJECTCOMMENT 32861 // КОММЕНТАРИЙ К ОБЪЕКТУ
// DATUM PARAMETERS
#define SEMDATUMDX 32871 // СДВИГ ПО X
#define SEMDATUMDY 32872 // СДВИГ ПО Y
#define SEMDATUMDZ 32873 // СДВИГ ПО Z
#define SEMDATUMRX 32874 // ПОВОРОТ ПО X
#define SEMDATUMRY 32875 // ПОВОРОТ ПО Y
#define SEMDATUMRZ 32876 // ПОВОРОТ ПО Z
#define SEMDATUMM 32877 // МАСШТАБНЫЙ ЭЛЕМЕНТ
#define SEMDATUMTYPE 32878 // ТИП ПРЕОБРАЗОВАНИЯ (0, 3, 7, 14)
#define SEMSCALEFACTOR 32879 // МАСШТАБ НА ОСЕВОМ МЕРИДИАНЕ
// USER ELLIPSOID PARAMETERS
#define SEMUSELLAXIS 32880 // SEMIMAJORAXIS
#define SEMUSELLINFL 32881 // INVERSEFLATTENING
#define SEMCRSIDENT 32882 // CRS Ident (String)
#define SEMSHEETNAME 32883 // ИМЯ ЛИСТА КАРТЫ (ГЛАВНОГО НАСЕЛЕННОГО ПУНКТА)
#define SEMNOMENCLATURE 32884 // НОМЕНКЛАТУРА ЛИСТА КАРТЫ
#define SEMMAINNAME 32885 // НАЗВАНИЕ РАЙОНА
#define SEMDATAIDENT 32886 // GUID НАБОРА ДАННЫХ
#define SEMSECURITY 50603 // ГРИФ СЕКРЕТНОСТИ (УСТАРЕВШИЙ КОД, ЗАПИСЫВАЕТСЯ В МЕТАДАННЫЕ ЛИСТА КАРТЫ)
#define SEMAREADATE 32888 // ДАТА СОСТОЯНИЯ МЕСТНОСТИ
#define SEMSOURCETYPE 32889 // ВИД ИСХОДНЫХ ДАННЫХ
// ЗАРЕЗЕРВИРОВАННЫЕ КОДЫ СЕМАНТИЧЕСКИХ ХАРАКТЕРИСТИК,
// ДЛЯ АФФИННОГО ПРЕОБРАЗОВАНИЯ СИСТЕМ КООРДИНАТ
// ------------------------------------------------------------------
#define SEMTPTYPE 32890 // ТИП ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ (TRANSFORMTYPE)
#define SEMTPPARM1 32891 // 1-ЫЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM2 32892 // 2-ОЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM3 32893 // 3-ИЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM4 32894 // 4-ЫЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM5 32895 // 5-ЫЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM6 32896 // 6-ОЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM7 32897 // 7-ОЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM8 32898 // 8-ОЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM9 32899 // 9-ЫЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMTPPARM10 32900 // 10-ЫЙ ПАРАМЕТР ПРЕОБРАЗОВАНИЯ СИСТЕМЫ КООРДИНАТ
#define SEMAPPNAME 32910 // ИМЯ ПРИЛОЖЕНИЯ
#define SEMADMINID 32911 // ИДЕНТИФИКАТОР РАЙОНА (РЕГИОНА)
#define SEMSERVICEFIRST 31001 // НАЧАЛО ДИАПАЗОНА СПЕЦИАЛЬНЫХ СЕМАНТИК // 06/02/17 -> 32800
#define SEMSERVICELAST 33000 // КОНЕЦ ДИАПАЗОНА СПЕЦИАЛЬНЫХ СЕМАНТИК
#define SHEETFRAMEINCODE 15l // ВНУТРЕННИЙ КОД РАМКИ ЛИСТА
#define SHEETFRAMEEXCODE 91000000l // ВНЕШНИЙ КОД РАМКИ ЛИСТА
Если нужна помощь по конкретной характеристике, то нужно назвать файл классификатора (RSC) и код семантики. Рассматриваем те классификаторы, что входят в инсталляцию наших продуктов.
Елена Кузнецова, да, ее я смотрел. Посмотрел еще раз, ответ на 2-й вопрос я нашел. Для тех, кто будет искать: Семантика 1300 "Признак цвета объекта" из operator.rsc заполняется подготовленными значениями, хранящимися в классификаторе.
Получить количество значений характеристики:
mapGetRscSemanticClassificatorCount( hRsc, 1300)
Получить код значения( именно он записывается в семантику ): mapGetRscSemanticClassificatorCode()
Получить текстовое описание значения: mapGetRscSemanticClassificatorName()
В какой кодировке описания? У меня и в редакторе классификатора крякозябры, и в программе после выполнения mapGetRscSemanticClassificatorName() - вопрос снят, это у нас классификатор был модифицирован. И все-таки, записывать код значения характеристики в семантику как long или как строку? 1-й вопрос все еще открыт, конкретного ответа по ссылке не нашел.
Добавлять значения можно как long, например, следующим образом: mapAppendSemanticLong(objectHandle, 1300, 9);
Для mapGetRscSemanticClassificatorName(), существует unicode версия - mapGetRscSemanticClassificatorNameUn(). Используйте, пожалуйста, по возможности ее.
Не очевидны причины для применения этой семантики на карте оперативной обстановки. Цвет объекта зависит от ряда его свойств. Например: Государственная принадлежность (1100)
Если нужно обозначить противника, то единственный способ - присвоить эту семантику.
Остальное должно быть исключением.
На вид знака влияют все его свойства - код, координаты, атрибуты.
Можно запросить семантики, гарантированно влияющие на вид:
Код
// Запросить число семантик, влияющих на внещний вид объекта, по внутреннему
// коду (порядковому номеру) объекта (с 1)
// incode - внутренний код объекта (номер по порядку)
// hRsc - идентификатор классификатора карты
// При ошибке возвращает ноль
_MAPIMP long _MAPAPI mapGetRscImageSemanticCount(HRSC hRsc,long int incode);
// Запрос кода семантики, влияющей на изображение, по внутреннему коду
// (порядковому номеру) объекта и порядковому номеру такой семантики (c 1)
// hRsc - идентификатор классификатора карты
// incode - внутренний код объекта (номер по порядку)
// number - номер семантики
// При ошибке возвращает ноль
_MAPIMP long _MAPAPI mapGetRscImageSemanticCode(HRSC hRsc,long int incode, long int number);
Готовится этот список, в частности, ручками программиста при подготовке программируемого условного знака в iml-библиотеке.
См. sdk13.zip\imlapi\rscarmy\imlmain.cpp
Код
// -----------------------------------------------------------------
// Запросить список семантик, влияющих на вид объекта
// type - тип функции отображения, включенной в IMLLIST,
// list - указатель на буфер для записи списка кодов семантик,
// count - число кодов, которые могут быть помещены в список
// Возвращает число кодов, которые занесены в список, если места достаточно,
// или отрицательное число кодов, которые могут быть занесены в список, если места недостаточно
// При ошибке возвращает ноль
// -----------------------------------------------------------------
_IMLIMP long int _IMLAPI imlCheckImageSemantic(long int type, const IMGDRAW * draw, long int code)
{
// 1100 Госпринадлежность
// 1200 Характер действия
// 1201 Характер действия подразделения (оборона, наступление, марш)
// 1300 Признак цвета
// 1400 Признак типа линии - планируемый
// 1500 Признак состояния объекта (разрушен, не разрушен)
// 2200 Тактическая единица
// 2300 Укомплектованность (1 - основн знак, 2 - сокращенный состав, 3 - кадры)
// 3300 Защищенность
// 3400 Подвижность
// 3500 Принцип подвижности
// 3600 Признак "В движении"
// 4100 Дальность действия
// 4400 Калибр
// 5201 Транспорт подвижных КП
// 5202 Дополнительные элементы бронетехники
// 5234 Оснащенность средствами РЭБ
// 5253 Транспорт мотострелковых и других формирований
// 5254 Вооружение противотанковых подразделений
// 5255 Артиллерийское вооружение
// 5257 Дополнительные элементы оформления заграждений
// 5426 Форма построения
// 11301 Цвет подтушевки
// 11302 Цвет флагштока
// 11303 Цвет градиентной заливки
// 11304 Рамка подписи (есть, нет)
// 11401 Признак выделения контуров (точки, крестики, пунктир, фон...)
// 11521 Оснащенность средствами АСУ
// 11541 Верхняя часть подписи
// 11542 Нижняя часть подписи
// 20101 Название населенного пункта
// 31001 Масштаб отображения знака
// 31003 Высота шрифта
switch (type)
{
case IMG_MTEXT: // 11541, 5401, 11542, 5402, 31003, 31001, 11301, 11304
if ((code == 11541) || (code == 5401) || (code == 11542) || (code == 5402) ||
(code == 31003) || (code == 31001) || (code == 11301) || (code == 11304))
return 1;
return 0;
case IMG_CTRLPOINT:
break;
}
if ((code == 1100) || (code == 1300))
return 1;
switch (type)
{
case IMG_FRONTLINEOLD :
case IMG_FRONTLINE :
break;
case IMG_DISTRICT : // 1200, 1400, #5
case IMG_POSITION :
if (imlCheckImageSemantic(5, 0, draw, code))
return 1;
if ((code == 1200) || (code == 1400))
return 1;
return 0;
case IMG_ATTACKDIRECTION : // 1200
if (code == 1200)
return 1;
return 0;
mapGetRscImageSemanticCount() возвращает 0 для тех объектов, вид которых явно изменяется при добавлении семантик, это можно проверить экспериментально. Например, это объекты из operator.rsc: 256000038 - рыболовный траулер, семантики 1100 и 1300. mapGetRscImageSemanticCount() возвращает 0. 112020410 - Автомобиль, семантики 1100 и 1300. то же самое.
Порядковый номер объекта получаю так:
Код
long excode = 256000038;
long local = LOCAL_VECTOR;
int cnt = mapGetRscObjectsCount( hRsc, excode, local );
if( cnt )
{
long incode = mapGetRscObjectCodeByNumber( hRsc, excode, local, 1 );
long semCount = mapGetRscImageSemanticCount( hRsc, realIncode );
}
Здесь: hRsc - идентификатор открытого классификатора, в том же месте кода есть работа с ним, и работа успешная. excode и local получены из описания объекта RSCOBJECT.
Также хочу отметить, что если в Редакторе классификатора во вкладке "Семантика" при выбранной семантике 1300 или 1100 нажать кнопку "Инфо", появится окно с текстовкой "Число объектов,для которых семантика влияет на вид 0 ". Предположу, что это работа той же функции.