using OperationControl.Mapas.Models; namespace OperationControl.Mapas.Services { /// /// Responsável por criar cópias profundas e independentes /// de documentos canônicos do subsistema de mapas. /// /// Nenhuma coleção, MapaRua ou geometria mutável é /// compartilhada entre origem e clone. /// public sealed class MapaDocumentoCloneService { public MapaDocumento Clonar( MapaDocumento origem) { if (origem == null) { throw new ArgumentNullException( nameof(origem) ); } var clone = new MapaDocumento { Nome = origem.Nome, CaminhoOrigem = origem.CaminhoOrigem, FormatoOrigem = origem.FormatoOrigem, Tipo = origem.Tipo, Modificado = origem.Modificado }; if (origem.AvisosImportacao != null) { clone .AvisosImportacao .AddRange( origem.AvisosImportacao ); } if (origem.Ruas == null) return clone; foreach ( var rua in origem.Ruas) { if (rua == null) continue; clone.Ruas.Add( new MapaRua { Id = rua.Id, IdOriginal = rua.IdOriginal, IdGeradoAutomaticamente = rua.IdGeradoAutomaticamente, Nome = rua.Nome, Geometria = rua.Geometria == null ? null : (NetTopologySuite .Geometries .LineString) rua.Geometria .Copy(), ComprimentoMetros = rua.ComprimentoMetros, Dist1 = rua.Dist1, Dist2 = rua.Dist2, IndiceFeatureOrigem = rua.IndiceFeatureOrigem } ); } return clone; } } }