RUS  ENG 

Делаю программой символ-картинку. Есть вопросы...

Страницы: 1
RSS
Делаю программой символ-картинку. Есть вопросы...
 
Цепляю в шарпе картинку на слой в памяти:
int layerID = mapCtrl.Map.Layers.AddInMemory("Moveable Objects");
Layer layer = mapCtrl.Map.Layers[(short)layerID];
Symbol s = new Symbol();
string path = @"C:\_ItssProjects\ScenarioPatterns\_Pictures\re.bmp";
int i = s.AddImagePath(path, 0, 0);
i = layer.Symbols.AddItem(s);
i = layer.AddSimpleSymbol(55749927, 37602827, 0, i, 100, 0);
здесь немного лишнего, но:
0. Работает на *.bmp 30х30, не работает на той же в формате png, не работает на "Ночной ковыль.bmp" - стандартном из винды, 256х256.
1. Кусок написан правильно?
2. Точка привязки картинки (0,0) в серединке?
3. Максимальный размер картинки существует? Если нет - почему не берет "ковыль"?
4. Как сделать транспарентный колор? png ведь не сосет...
 
Сейчас AddImagePath добавляет только BMP причем историческое ограничение на суммарный размер символа 64K со всеми шапками. Поэтому "Ковыль" не влезет.
Сейчас можно только посоветовть создать в каком-то слое шаблонном символ в нашем редакторе структуры (там и png и GIF прозрачный берет, но полупрозрачности не будет). Потом брать этот сивол из этого слоя, либо сохранить его один раз в бинарный файл через Symbol.GetBLOB и когда нужно, записывать через Symbol.SetBLOB
 
Это хорошо. А есть ли конвертор Вашего блоба в bmp? Просто хочется видеть такую картинку еще и в других прогах.
Или конвертор для преобрзования bmp+transparentColour в blob? Или формат blob-а может быть раскрыт?
 
Кстати, а SimbolElement нельзя в блоб вытащить? Похоже, eGraphTypeHotSpot - это картинка? (В справке этого значения нет).
Я так понимаю, это проще было бы.
 
На самом деле, самое простое было бы сделать еще метод AddImagePath с параметро transparentColor, по аналогии в виндовым ImageList-ом.
 
Добавить можно только чтобы любые форматы брало. Будет там прозрачность, значит возьмет с прозрачностью. Доделаем.
 
Кстати, какие значения может принимать Scalable в layer.AddSimpleSymbol? То, что 0 - немасштабируемый, понятно.
 
Если 1 - то масштабируется пропорционально. Если 2 - то масштабируется, но не увеличивается больше своего размера 1:1 Аналогично опциям в настройке сивола из диалога Zulu
 
i = layer.AddSimpleSymbol(55749927, 37602827, 0, i, 100, 0);
При использовании кода возвращает -1 - в чем может быть причина?
Нужно ли использовать layer.Visible=true? Чтобы объект появился?
 
И вообще вопрос глобальный - существуют ли где примеры, написанные на С# или на любом другом диалекте C? В крайнем случае, на Delphi. А то доступны примеры только на VB, но их очень мало + не самый распространенный язык на сегодняшний день, сейчас его уже мало кто знает.
 
1. i = layer.AddSimpleSymbol(55749927, 37602827, 0, i, 100, 0);
Символьный объект скорее всего не добавился, т.к. в библиотеке символов (коллекция Layer.Symbols) нет cbvdjkf c id равнымм i

2. layer.Visible=true никакого обновления не делает. Если оно итак было true, то ничего не произойдет.

3. На Visual Basic примеры просто демонстрируют возможности объектной модели. Visual Basic понятен наибольшему количеству пользователей (которые иногда просто инженеры, а не программисты). Basic наиболее иллюстративен, так как содержит минимум текста (пример не замусорен служебным кодом). Подразумевается, что те, кто пишут на C, умеют на нем писать, и тем более поймут Basic.
 
Спасибо, тогда еще один вопрос: а что за параметр такой у AddSimpleSymbol - SymbolSize? Как я понял, он имеет отношение к масштабированию картинки, но в чем он меряется?
 
У немасштабируемого символа размер 100 соответствует отображению символа в пикселах 1:1
Если символ масштабируется, то 1:1 он отобразится при масштабе карты 100 см/пиксел.
 
Кто знает, подскажите, как сделать "меняющийся" объект слоя? То есть он должен не только двигаться, но и менять свое изображение, напрмер, растровую картинку. Движение сделано с помощью Element, логично, если у него будет свойство Symbol, где можно указать его способ отображения. Искал что-то похожее, не нашел. Ниже приведен код, реализующий движение объекта (С#):

string path = @"E:\_ItssProjects\Car\Start.bmp";
int i = s.AddImagePath(path, 0, 0);
i = _layer.Symbols.AddItem(s);
int j1 = _layer.AddSimpleSymbol(55647913, 37542889, 0, i, 100, 0);
Element _el=_layer.Elements[j1].D;
_el.Move(40000, 40000,true,0,false); //числа указывают смещение

Как сделать изменение свойства отображения (например, поменять растровую картинку)? Можно удалить Element, а потом нарисовать заново, но это наверное не лучший способ?
 
Запиши в библиотеку символов слоя два разных символа (sID1 = _layer.Symbols.AddItem(s1), sID2 = _layer.Symbols.AddItem(s2))
А потом меняй у элемента стиль отображения, задавая разный SymbolID
Например:
Dim st As ElemStyle
Set st = _layer.Elements(ElemID).ElemStyle
st.SymbolID = sID2
_layer.Elements(ElemID).ElemStyle = st
 
Спасибо большое за помощь!
 
А можно ли к Element'у слоя вывести подпись, не создавая дополнительный элемент для вывода текста? Тот же вопрос, но иначе: есть ли у элемента слоя такое понятие как подпись или нет?
 
Лично у элемента подписи нет.
 
А можно ли изменить положение элемента в Z последовательности на экране, т.е. создать его позже остальных элементов, а при пересечении с ними отображать "под" ними?
 
У нас нет Z последовательности для элементов. Подразумевается, что территориальные объекты одного слоя все-таки не перекрываются.
 
В С# есть возможность скрыть элемент, что бы он не отображался на карте? При попытке использовать следующий код

Element el=new Element();
el.Mode.Visible=false;

выдает, что:
Property, indexer, or event 'Mode' is not supported by the language; try directly calling accessor methods 'ZuluLib.IElement.get_Mode()' or 'ZuluLib.IElement.set_Mode(object)'
То есть такого свойства нет, но и указываемых методов тоже нет среди доступных.
 
1. Св-во есть, только языковые возможности не позволяют использовать семантику типа ".Mode", о чем он и говорит (is not supported by the language) и советует прямо использовать el.get_Mode(), чтобы получить доступ к режиму объекту.
2. Mode.Visible влияет на отображение ВСЕХ объектов данного типа и режима.
3. На Visible отдельного элемента можно влиять через раскраску (тему).
 
А что такое тема? В терминах Zulu? Элемент является растровой картинкой, а не векторным примитивом
 
Еще один глобальный вопрос: если элемент - растровая картинка, то когда я использую метод
layer.Elements[ElementIndex].MoveToXY(_p.X, _p.Y, true, false);
точка _p указывает, куда будет помещен левый верхний угол растра. А как сделать так, что бы в указаную точку помещался геометрический центр растра?
Прямых методов для этого я не нашел, поэтому взялся за пересчет с помощью Element.GetBoundsRectangle(true) в надежде, что он мне возратит координаты габаритов видимой части рисунка, но он вернул что-то не совсем то. Центр полученного прямоугольника практически полностью совпал с координатами точки _p, то есть для растровой картинки левый верхний угол и центр объекта одно и тоже?
В частности, для растра 32*16 были получены результаты _yCenter=411, _xCenter=411. Что это за величины и в чем они меряются, в справке про это нет ни слова... Угол поворота рисунка не 45 градусов, значит, для прямоугольно растра должны получится как минимум разные результаты.
ZRectangle _zr = _layer.Elements[ElementIndex].GetBoundsRectangle(false);
double _xCenter, _yCenter;//положение центра фигуры
_yCenter = (_zr.Ymax - _zr.Ymin) / 2;
_xCenter = (_zr.Xmax - _zr.Xmin) / 2;
Страницы: 1