RUS  ENG 

Применение стиля

Страницы: 1
RSS
Применение стиля
 
Вопрос такой. В ZULU у полигональных объектов слоя можно поставить что бы стиль применился ко всем элементам слоя. Как это реализовать? Я сделал так

var
elkeys : IElementKeys;
Col: integer;
begin
elkeys := MapCtrl1.Map.Layers.Active.ElementKeys;
for Col:=1 to elkeys.Count do
MapCtrl1.Map.Layers.Active.Elements.Item[elkeys.Item[col]].ElemStyle:=ST_OLD;
end;

Где ST_OLD - стиль который я присваиваю, но для 2500 объектов он применяется секунд 30 (а в ZULU моментально).

И попутно еще такой вопрос как лучше сделать копирование из одного слоя элементы в другой слой (со всеми параметрами, то есть координаты + стиль и.т.д)
 
1. Да, это вариант работает долго, т.к. Elements.Items[<key>] всякий раз ищет элемент по ключу. Быстрее будет воспользоваться Layer.EnumElements
2. См. Layer.AddElement
 
Сделал вот так.

var
EN: IZEnumElements;
Lay: ILayer;
begin
Lay:= MapCtrl1.Map.Layers.Active;
EN:= Lay.EnumElements;
EN.MoveFirst;
while not EN.IsEOF do
begin
Lay.Elements.Item[EN.ElemID].ElemStyle:=ST_OLD;
EN.MoveNext;
end;


Стало по быстрее но не на много (секунд на 10). Как можно всетаки быстрее сделать так что бы у всего слоя был один и тат жестиль.
 
Попробуй создать новый типовой стиль и присвоить этот стиль этим элементам. И при смене этого стиля, стиль элементов будет меняться...
 
Добавили метод для группового присвоения стиля
Layer.SetElemStyle(Elems, Style As ElemStyle, GraphType As eElemGraphType)
Elems - VARIANT Сейчас можно подставлять IElementKeys или SafeArray c ключами объектов.
GraphType - указывает к какому графическому типу объектов применяется стиль (линия, контур, текст ...)
 
Lyosha я хотел бы уточнить, что есть SafeArray.
 
SafeArray - это массив элементов, один из типов данных VT_ARRAY, передаваемых через VARIANT
В C++ для создания и работы с такими массивами ряд функций SafeArrayCreate, SafeArrayGetUBound, SafeArrayGetLBound, SafeArrayPutElement, SafeArrayGetElement
в Delphi наверняка тоже есть.
 
Можно выложить пример заполнения такого массива. Хотябы на С++. Просто проблема с параметрами которые надо задавать при создании и занесении данных в данный массив. И еще как можно получить номер в коллекции IElementKeys зная ID в слое.
 
Номер в коллекции сейчас получить только перебором

А SafeArray примерно так:

SAFEARRAY *arr;
SAFEARRAYBOUND dim;

dim.lLbound = 0;
dim.cElements = 5;

long keys[]={12, 43, 55, 63, 58};

arr = ::SafeArrayCreate( VT_I4, 1, &dim);

for( long i = 0; i < 5; i++ )
{
::SafeArrayPutElement( arr, &i, &keys[i]);
}

VARIANT v;
v.vt = VT_I4 | VT_ARRAY;
v.parray = arr;
{
//....................
// Как-то используем
//....................
}
::VariantClear( &v);
Страницы: 1