| Предыдущая тема :: Следующая тема   | 
	
	
	
		| Автор | 
		Сообщение | 
	
	
		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 Откуда: ИНТЕГРО
  | 
		 | 
	
	
		| Вернуться к началу | 
		 | 
	
	
		  | 
	
	
		 |