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

Работа с семантиками

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Работа с семантиками, Полноценная работа с семантикой "Признак цвета объекта" из пользовательского интерфейса
 
Здравствуйте.
Стоит задача рисовать объекты из разных классификаторов с добавлением семантики "Признак цвета объекта". Пытаюсь понять механизм работы в целом.
1. Как определить, изменится ли цвет объекта при добавлении ему семантики "Признак цвета объекта". Имеется ввиду, как программно понять, что объект "имеет" данную семантику и при ее добавлении способ его отрисовки изменится.
2. Как я понял, в "Признак цвета объекта" записывается значение из некоего списка доступных значений, в редакторе классификатора Панорамы он называется "Код из классификатора". Как программно получить этот набор значений?
Изменено: Илья Аникин - 01.12.2020 11:50:00
 
Изменение цвета объекта через ввод цвета в семантику обычно применяется при плохом проектировании информационной системы.
Есть служебная семантика с кодом 31002, которая меняет цвет объекта на заданный.

Условный знак должен меняться исходя из свойств объекта.

Можно подготовить серию объектов (двумерную/одномерную таблицу условных знаков), зависящую от двух семантик.
Или подготовить программируемые знаки (IMLAPI), формирующие условный знак по любому алгоритму.

Примеры в классификаторах operator.rsc, dfc.rsc (аэронавигация), agro10t.rsc (сельскохозяйственный), s57navy.rsc (морские карты) и т.д.


Примеры есть в SDK.zip в разделе Скачать\Программные продукты для Windows (коды общие с Linux) -
https://gisinfo.ru/download/?id=229

и на карте \shape\shape.sitx в Примерах данных для ГИС Панорама.
 
Oleg Belenkov, делаем универсальный инструмент для рисования любыми объектами из любых классификаторов, интересует конкретно механизм работы с подобными семантиками, для примера взял Признак цвета.
Ответов на заданные вопросы пока не получил.
 
Содержание классификаторов можно посмотреть в отчетах -
https://gisinfo.ru/classifiers/classifiers.htm

Например -
https://gistoolkit.ru/download/classifiers/nmroad25.pdf
https://gistoolkit.ru/download/classifiers/map5000mdoc.pdf

или в программе Редактор классификатора

Служебные семантики перечислены в maptype.h
Код
#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) и код семантики.
Рассматриваем те классификаторы, что входят в инсталляцию наших продуктов.
 
Цитата
Oleg Belenkov написал:
файл классификатора (RSC) и код семантики
operator.rsc, семантика "Признак цвета объекта", код 1300
 
Елена Кузнецова, да, ее я смотрел.
Посмотрел еще раз, ответ на 2-й вопрос я нашел. Для тех, кто будет искать:
Семантика 1300 "Признак цвета объекта" из operator.rsc заполняется подготовленными значениями, хранящимися в классификаторе.

Получить количество значений характеристики:

mapGetRscSemanticClassificatorCount( hRsc, 1300)

Получить код значения( именно он записывается в семантику ):
mapGetRscSemanticClassificatorCode()

Получить текстовое описание значения:
mapGetRscSemanticClassificatorName()


В какой кодировке описания? У меня и в редакторе классификатора крякозябры, и в программе после выполнения mapGetRscSemanticClassificatorName() - вопрос снят, это у нас классификатор был модифицирован.
И все-таки, записывать код значения характеристики в семантику как long или как строку?
1-й вопрос все еще открыт, конкретного ответа по ссылке не нашел.
Изменено: Илья Аникин - 01.12.2020 14:13:48
 
Здравствуйте.

Добавлять значения можно как 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;
 
Константин Ганюшин,спасибо, буду иметь ввиду
 
Oleg Belenkov,


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 ". Предположу, что это работа той же функции.

Вобщем, ваш вариант не подходит.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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