// Copyright (C) Stichting Deltares 2017. All rights reserved.
//
// This file is part of Ringtoets.
//
// Ringtoets is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
//
// All names, logos, and references to "Deltares" are registered trademarks of
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Application.Ringtoets.Storage.DbContext;
using Application.Ringtoets.Storage.Serializers;
using Core.Common.Base.Geometry;
using Ringtoets.Piping.Primitives;
namespace Application.Ringtoets.Storage.Read
{
///
/// This class defines extension methods for read operations for an
/// based on the .
///
internal static class SurfaceLineEntityReadExtensions
{
///
/// Read the and use the information to construct
/// a .
///
/// The to create
/// for.
/// The object keeping track of read operations.
/// A new .
/// Thrown when is null.
/// Thrown when
/// of is null or empty.
public static PipingSurfaceLine Read(this SurfaceLineEntity entity, ReadConversionCollector collector)
{
if (collector == null)
{
throw new ArgumentNullException(nameof(collector));
}
if (collector.ContainsPipingSurfaceLine(entity))
{
return collector.GetPipingSurfaceLine(entity);
}
var surfaceLine = new PipingSurfaceLine(entity.Name)
{
ReferenceLineIntersectionWorldPoint = new Point2D(
entity.ReferenceLineIntersectionX.ToNullAsNaN(),
entity.ReferenceLineIntersectionY.ToNullAsNaN())
};
entity.ReadSurfaceLineGeometryAndCharacteristicPoints(surfaceLine);
collector.Read(entity, surfaceLine);
return surfaceLine;
}
private static void ReadSurfaceLineGeometryAndCharacteristicPoints(this SurfaceLineEntity entity, PipingSurfaceLine surfaceLine)
{
Point3D[] geometryPoints = new Point3DXmlSerializer().FromXml(entity.PointsXml);
surfaceLine.SetGeometry(geometryPoints);
var characteristicPoints = new Dictionary();
foreach (PipingCharacteristicPointEntity pointEntity in entity.PipingCharacteristicPointEntities)
{
characteristicPoints[(PipingCharacteristicPointType) pointEntity.Type] = new Point3D(pointEntity.X.ToNullAsNaN(),
pointEntity.Y.ToNullAsNaN(),
pointEntity.Z.ToNullAsNaN());
}
foreach (KeyValuePair keyValuePair in characteristicPoints)
{
SetCharacteristicPoint(surfaceLine, keyValuePair.Key, keyValuePair.Value);
}
}
private static void SetCharacteristicPoint(PipingSurfaceLine surfaceLine, PipingCharacteristicPointType type, Point3D geometryPoint)
{
switch (type)
{
case PipingCharacteristicPointType.DikeToeAtRiver:
surfaceLine.SetDikeToeAtRiverAt(geometryPoint);
break;
case PipingCharacteristicPointType.DikeToeAtPolder:
surfaceLine.SetDikeToeAtPolderAt(geometryPoint);
break;
case PipingCharacteristicPointType.DitchDikeSide:
surfaceLine.SetDitchDikeSideAt(geometryPoint);
break;
case PipingCharacteristicPointType.BottomDitchDikeSide:
surfaceLine.SetBottomDitchDikeSideAt(geometryPoint);
break;
case PipingCharacteristicPointType.BottomDitchPolderSide:
surfaceLine.SetBottomDitchPolderSideAt(geometryPoint);
break;
case PipingCharacteristicPointType.DitchPolderSide:
surfaceLine.SetDitchPolderSideAt(geometryPoint);
break;
default:
throw new InvalidEnumArgumentException(nameof(type),
(int) type,
typeof(PipingCharacteristicPointType));
}
}
}
}