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