110 lines
2.8 KiB
C#
110 lines
2.8 KiB
C#
using OperationControl.Mapas.Models;
|
|
|
|
namespace OperationControl.Mapas.Services
|
|
{
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
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;
|
|
}
|
|
}
|
|
} |