Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Hunter
Зарегистрирован: 29.08.2006 Сообщения: 9 Откуда: Belarus
|
Добавлено: Чт 29 Ноя 2007 00:55 Заголовок сообщения: Как скопировать объект |
|
|
Доброго времени суток!
Есть два слоя с идентичными стилями.
Как скопировать объект из одного слоя в другой и чтобы ID были разными?  |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пт 30 Ноя 2007 17:52 Заголовок сообщения: |
|
|
Меню "Сервис | Массовые операции" _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
Hunter
Зарегистрирован: 29.08.2006 Сообщения: 9 Откуда: Belarus
|
Добавлено: Пт 30 Ноя 2007 20:45 Заголовок сообщения: |
|
|
Благадарю Вас Михаил, но это я как бы знаю)
Хотелось бы узнать как это можно реализовать в своем модуле.
Просто если делаю я автоматизацию, то хотелось бы чтобы этот процесс не прерывался. |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Вт 04 Дек 2007 16:59 Заголовок сообщения: |
|
|
Например так:
Код: |
// Выполняет поиск подходящего стиля
function FindSuitableStyle(aSourceStyle: IIngeoStyle; aTargetLayer: IIngeoLayer): IIngeoStyle;
var
i: Integer;
begin
for i := 0 to aTargetLayer.Styles.Count - 1 do begin
Result := aTargetLayer.Styles[i];
if AnsiSameText(Result.Name, aSourceStyle.Name) then begin
Exit;
end
end;
Result := nil;
end;
// Выполняет копирование геометрии
procedure CopyShapes(aSourceObject, aTargetObject: IIngeoMapObject; aTargetLayer: IIngeoLayer);
var
aSourceShape, aTargetShape: IIngeoShape;
aTargetStyle: IIngeoStyle;
i: Integer;
begin
for i := 0 to aSourceObject.Shapes.Count - 1 do begin
aSourceShape := aSourceObject.Shapes[i];
aTargetStyle := FindSuitableStyle(aSourceShape.Style, aTargetLayer);
if Assigned(aTargetStyle) then begin
aTargetShape := aTargetObject.Shapes.Insert(-1, aTargetStyle.Id);
aTargetShape.Contour.AddPartsFrom(aSourceShape.Contour);
end;
end;
end;
// Выполняет копирование семантических данных
procedure CopySemData(aSourceObject, aTargetObject: IIngeoMapObject; aTargetLayer: IIngeoLayer);
begin
тут писать не буду, по аналогии со стилями, но несколько сложнее
end;
// Создает дубликат объекта в другом слое
function CloneObject(aSourceObject: IIngeoMapObject; aTargetLayer: IIngeoLayer): IIngeoMapObject;
begin
Result := aSourceObject.MapObjects.AddObject(aTargetLayer.Id);
CopyShapes(aSourceObject, Result, aTargetLayer);
CopySemData(aSourceObject, Result, aTargetLayer);
end;
|
Памятка: не забыть в конце вызвать MapObjects.UpdateChanges. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
RuslanG

Зарегистрирован: 10.07.2005 Сообщения: 171 Откуда: ИНТЕГРО
|
|
Вернуться к началу |
|
 |
burgomistr
Зарегистрирован: 24.03.2008 Сообщения: 10
|
Добавлено: Сб 03 Май 2008 17:58 Заголовок сообщения: |
|
|
Ну почти все понятно, только я никак не соображу как можно получить ссылку на слой-источник в процедуре
Код: | procedure CopySemData(aSourceObject, aTargetObject: IIngeoMapObject; aTargetLayer: IIngeoLayer); |
если это вообще возможно, то зачем тогда передавать в процедуру ссылку на aTargetLayer ? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пн 05 Май 2008 07:51 Заголовок сообщения: |
|
|
Если на руках есть пространственный объект, то слой, к которому он относится, можно получить так:
Код: | aLayer := anIngeoDb.LayerFromID(aMapObject.LayerID); |
burgomistr писал(а): | если это вообще возможно, то зачем тогда передавать в процедуру ссылку на aTargetLayer ? |
Вы правы - можно не передавать. _________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
 |
Oleg_at
Зарегистрирован: 28.09.2007 Сообщения: 10 Откуда: Ижевск
|
Добавлено: Вт 12 Авг 2008 16:54 Заголовок сообщения: Пойдем от обратного. |
|
|
Как в любой теореме:
Во всех просматриваемых вопросах (может ошибаюсь) выбран пространственный объект, и по нему мы определяем Style, Layer и д.т. Но допустим зная GUID Style и Layer как сделать выбору (набор) всех Shapes Style и Layer? Т.е. от общего к частному:
1. зная GUID Layer, получиь все Shapes которые в него входят;
2. зная GUID Style, получиь все Shapes которыми они отбражаются.
3. задаю GUID Style или Layer и получаю соответствующие им Shape.
P.S. конструкция
MapO := FApp.ActiveDb.MapObjects.GetObject('001D0000040A');
MapO.Shapes.Count;
не проходит. Где 001D0000040A - GUID Layer.
??? |
|
Вернуться к началу |
|
 |
Михаил Власов

Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
|
Вернуться к началу |
|
 |
|