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

Измененение размера, добавляемых из классификатора объектов

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Измененение размера, добавляемых из классификатора объектов
 
Добрый день!

Добавляю в классификатор собственное изображение в формате *.bmp и далее этот объект добавляю на пользовательскую карту. Подскажите пожалуйста, есть ли возможность указывать какого размера необходимо добавить изображение на карту.

P.S Предположим в классификатор было добавлено изображение 100 на 100 пикселей, а на карту я хочу нанести объект этот с размером 50 на 50.

 mapRegisterObject(hObj, 10094, LOCAL_POINT);

Сейчас указывая внешний код объекта (числовой), который ранее был добавлен в классификатор на карте я вижу изображение именно, того размера, которое имеет изображение, добавленное в классификатор.
Изменено: Анастасия - 11.07.2018 11:30:20
 
Цитата
Анастасия написал:
Предположим в классификатор было добавлено изображение 100 на 100 пикселей, а на карту я хочу нанести объект этот с размером 50 на 50
Внести изменения относительно размера в создаваемый объект на карте объект нельзя.
В редакторе классификатора на закладке "Разное" Вы можете установить коэффициент уменьшения/увеличения Ваше объекта, но он будет действовать на все объекты данного типа.
 
С уважением, Демиденко Р.А.
 
Цитата
Роман Демиденко написал:
Внести изменения относительно размера в создаваемый объект на карте объект нельзя.
Тяжело спорить с разработчиками :oops: , но отображением можно управлять через служебные семантики, в частности, "Масштаб отображения"
 
Цитата
Vitaliy Belenkov написал:
отображением можно управлять через служебные семантики, в частности, "Масштаб отображения"
Благодарю за дополнение.
Семантику "Масштаб отображения" можно добавить объекту используя функцию mapAppendSemanticDouble - http://help.gisinfo.ru/apilist1.htm#f2120
С уважением, Демиденко Р.А.
 
Доброе утро!

Спасибо за ответ, сейчас буду разбираться. Единственная неприятность, что при переходе по вашей ссылке и попытке открыть документацию на метод (чтобы посмотреть какие параметры он принимает и как с ним работать) я увидела сообщение об ошибке 404 File Not Found http://help.gisinfo.ru/mapapi1.htm#mapAppendSemanticDouble

Может Вы можете привести пример использование данного метода для моей задачи? Т.е у меня есть объект в классификаторе, у него есть код, зная код я добавляю объект на пользовательскую карту. Как мне добавить объект с измененным размером.
 
Страницу поиска поправят. Вот правильная ссылка: http://help.gisinfo.ru/mapapi.htm#mapAppendSemanticDouble
 
Спасибо!

Но пока не очень понятно.

Метод
// Добавить новую характеристику в семантику объекта,    

// info    - идентификатор объекта карты в памяти

// code    - внешний код характеристики

// value   - значение в виде числа двойной точности

// При ошибке возвращает ноль, при успешном выполнении - последовательный номер созданной характеристики

_MAPIMP long int _MAPAPI mapAppendSemanticDouble(HOBJ info, long int code, double value);

value - что характеризует это значение? Каким его задать мне не ясно.

Как я понимаю, данный метод создаст новую характеристику в семантике объекта, а далее, как мне  указать размер для этого объекта? Как задать, что эта характеристика отвечает за размер объекта?

Изменено: Анастасия - 12.07.2018 11:41:54
 
Поехали.
Код
//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  // ЦВЕТ ФОНА 
#define SEMBACKCOLOR       31013  // ЧИСЛОВОЕ ЗНАЧЕНИЕ ЦВЕТА RGB

#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  // УГОЛ ПОВОРОТА ТОЧЕЧНОГО ОРИЕНТИРОВАННОГО ЗНАКА  // 17/07/17
#define EXTSEMANTICEND     31017  // КОНЕЦ ДИАПАЗОНА


Семантики бывают разные:
Код
//maptype.h
enum SEMTYPE           // ТИПЫ ЗНАЧЕНИЯ СЕМАНТИКИ
{
   TUNDEFINED = -1,    // Значение не установлено
   TSTRING    = 0,     // Символьная строка
   TNUMBER    = 1,     // Числовое значение
   TANYFILE   = 9,     // Имя файла зарегистрированного типа
   TBMPFILE   = 10,    // Имя файла BMP
   TOLEFILE   = 11,    // Имя файла,обрабатываемого OLE-сервером
   TREFER     = 12,    // Ссылка на произвольный объект карты
                       // (уникальный номер объекта)
   TMAPFILE   = 13,    // Имя файла-паспорта района
   TTXTFILE   = 14,    // Имя текстового файла
   TPCXFILE   = 15,    // Имя файла PCX
   TCODE      = 16,    // Значение в виде числового кода
                       // из классификатора значений
   TDATE      = 17,    // Значение даты в числовом виде (ГГГГММДД)
   TANGLE     = 18,    // Угловая величина в радианах
   TTIME      = 19,    // Значение времени в числовом виде (ЧЧММСС)
   TFONT      = 20,    // Имя шрифта ("Arial", "Courier"...)
   TCOLOR     = 21,    // Числовое значение цвета в RGB
   TFDIGITAL  = 22,    // Семантика типа формула числовая (с вычисляемыми значениями)   
   TFSTRING   = 23,    // Семантика типа формула символьная (с вычисляемыми значениями) 
   TLAST      = 23,    // ВЕРХНЯЯ ГРАНИЦА СПИСКА КОДОВ

   TDOCREFMIN = 9,     // НИЖНЯЯ ГРАНИЦА ТИПА СЕМАНТИКИ - ССЫЛКА НА ДОКУМЕНТ (ГРАФИЧЕСКИЙ ФАЙЛ, КАРТА)
   TDOCREFMAX = 15,    // НИЖНЯЯ ГРАНИЦА ТИПА СЕМАНТИКИ - ССЫЛКА НА ДОКУМЕНТ (ГРАФИЧЕСКИЙ ФАЙЛ, КАРТА)
};
В зависимости от их типа - целое число, число с плавающей точкой, строка, формула числовая, формула символьная.

Вам нужна вот эта - от 0.0 до 500.0 % меняются её значения:
Код
#define SEMIMAGESCALE      31001  // МАСШТАБ ОТОБРАЖЕНИЯ ЗНАКА В ПРОЦЕНТАХ
Это из моих наработок:
Код
bool VMapObject::appendSemantic(long exCode, const QString &value)
{
    QByteArray koi8r = gis::common::convertStringToKOI8_R(value);
    long rc = mapAppendSemantic(m_obj, exCode, koi8r.constData(),
                                koi8r.size() + 1);
    return rc != 0;
}

bool VMapObject::appendSemantic(long exCode, long value)
{
    long rc = mapAppendSemanticLong(m_obj, exCode, value);
    return rc != 0;
}

bool VMapObject::appendSemantic(long exCode, double value)
{
    long rc = mapAppendSemanticDouble(m_obj, exCode, value);
    return rc != 0;
}
То есть вызвав для объекта hobj
Код
long rc = mapAppendSemanticDouble(hobj, SEMIMAGESCALE, 200.0);
Вы установите масштаб отображения в 200%.

Едем дальше - вызвав mapAppendSemantic вы добавите к объекту в список семантик новую семантику. Смотрим доки:

Код
 //mapapi.h
 // Добавить новую характеристику в семантику объекта,
 // info    - идентификатор объекта карты в памяти
 // code    - внешний код характеристики
 // value   - значение в виде числа двойной точности
 // При ошибке возвращает ноль,
 // при успешном выполнении - последовательный номер
 // созданной характеристики

_MAPIMP long int _MAPAPI mapAppendSemanticDouble(HOBJ info, long int code,
                                                 double value);

 // Удалить семантическую характеристику объекта
 // info    - идентификатор объекта карты в памяти
 // number  - последовательный номер характеристики,
 //           если номер равен "-1", удаляются все характеристики
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapDeleteSemantic(HOBJ info, long int number); 

 // Изменить значение семантической характеристики объекта
 // info    - идентификатор объекта карты в памяти
 // number  - последовательный номер характеристики,
 // place   - адрес строки, содержащей новое значение
 //           в символьном виде; Для семантики типа "классификатор"
 //           передается код значения в виде числа в символьном виде,
 //           то же - для типа "ссылка на объект".
 // maxsize - длина передаваемой строки (для контроля)
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapSetSemanticValue(HOBJ info, long int number,
                                             const char *place, long int maxsize);
У Вас есть возможность добавить семантику (и по коду возврата вы получите её порядковый номер в списке семантик), удалить семантику по её номеру, и изменить значение.
Я не знаю можно ли изменить значение семантики , если она число, то есть можно ли вызвать
_MAPIMP long int _MAPAPI mapSetSemanticValue(HOBJ info, long int number,                                              const char *place, long int maxsize);

, передав в place, например, "175.0" для масштаба отображения, поэтому у себя я обычно сначала удаляю семантику, а потом заново её добавляю уже с другим значением.
 
Владимир Егоров, шикарно, все работает! Спасибо Вам за столько исчерпывающий и подробный ответ!

Посмотрев какие еще симантики есть, подумала над тем, что неплохо бы еще научиться поворачивать изображение на определенный угол. Попробовала это сделать след. способом mapAppendSemanticDouble(hObj, SEMMARKANGLE, 45.0); Не получилось. Может Вы с этим уже сталкивались?
Изменено: Анастасия - 12.07.2018 15:04:08
 
Не сталкивался, но судя по описанию -
Код
#define SEMMARKANGLE       31017  // УГОЛ ПОВОРОТА ТОЧЕЧНОГО ОРИЕНТИРОВАННОГО ЗНАКА  // 17/07/17

Знак должен быть точечным и ориентированным. Возможно, здесь имеются в виду какие-то конкретные знаки, которых, возможно, не много.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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