// 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 Core.Common.Util.Extensions;
using Ringtoets.MacroStabilityInwards.Primitives;
using Ringtoets.Piping.Primitives;
namespace Application.Ringtoets.Storage.Read
{
///
/// This class defines extension methods for read operations for a surface line
/// 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 any input parameter is null.
/// Thrown when
/// of is empty.
public static PipingSurfaceLine ReadAsPipingSurfaceLine(this SurfaceLineEntity entity,
ReadConversionCollector collector)
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity));
}
if (collector == null)
{
throw new ArgumentNullException(nameof(collector));
}
if (collector.ContainsPipingSurfaceLine(entity))
{
return collector.GetPipingSurfaceLine(entity);
}
var surfaceLine = new PipingSurfaceLine(entity.Name)
{
ReferenceLineIntersectionWorldPoint = GetReferenceLineIntersectionWorldPoint(entity)
};
surfaceLine.SetGeometry(ReadGeometryPoints(entity.PointsXml));
entity.ReadCharacteristicPoints(surfaceLine);
collector.Read(entity, surfaceLine);
return surfaceLine;
}
///
/// Read the and use the information to construct
/// a .
///
/// The to create
/// for.
/// The object keeping track of read operations.
/// A new .
/// Thrown when any input parameter is null.
/// Thrown when
/// of is empty.
public static MacroStabilityInwardsSurfaceLine ReadAsMacroStabilityInwardsSurfaceLine(
this SurfaceLineEntity entity,
ReadConversionCollector collector)
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity));
}
if (collector == null)
{
throw new ArgumentNullException(nameof(collector));
}
if (collector.ContainsMacroStabilityInwardsSurfaceLine(entity))
{
return collector.GetMacroStabilityInwardsSurfaceLine(entity);
}
var surfaceLine = new MacroStabilityInwardsSurfaceLine(entity.Name)
{
ReferenceLineIntersectionWorldPoint = GetReferenceLineIntersectionWorldPoint(entity)
};
surfaceLine.SetGeometry(ReadGeometryPoints(entity.PointsXml));
entity.ReadCharacteristicPoints(surfaceLine);
collector.Read(entity, surfaceLine);
return surfaceLine;
}
private static Point2D GetReferenceLineIntersectionWorldPoint(SurfaceLineEntity entity)
{
return new Point2D(entity.ReferenceLineIntersectionX.ToNullAsNaN(),
entity.ReferenceLineIntersectionY.ToNullAsNaN());
}
private static void ReadCharacteristicPoints(this SurfaceLineEntity entity, PipingSurfaceLine surfaceLine)
{
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());
}
characteristicPoints.ForEachElementDo(cp => SetCharacteristicPoint(surfaceLine, cp.Key, cp.Value));
}
private static void ReadCharacteristicPoints(this SurfaceLineEntity entity, MacroStabilityInwardsSurfaceLine surfaceLine)
{
var characteristicPoints = new Dictionary();
foreach (MacroStabilityInwardsCharacteristicPointEntity pointEntity in entity.MacroStabilityInwardsCharacteristicPointEntities)
{
characteristicPoints[(MacroStabilityInwardsCharacteristicPointType) pointEntity.Type] = new Point3D(pointEntity.X.ToNullAsNaN(),
pointEntity.Y.ToNullAsNaN(),
pointEntity.Z.ToNullAsNaN());
}
characteristicPoints.ForEachElementDo(cp => SetCharacteristicPoint(surfaceLine, cp.Key, cp.Value));
}
private static void SetCharacteristicPoint(PipingSurfaceLine surfaceLine,
PipingCharacteristicPointType type,
Point3D geometryPoint)
{
if (!Enum.IsDefined(typeof(PipingCharacteristicPointType), type))
{
throw new InvalidEnumArgumentException(nameof(type),
(int) type,
typeof(PipingCharacteristicPointType));
}
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 NotSupportedException($"The enum value {nameof(PipingCharacteristicPointType)}.{type} is not supported.");
}
}
private static void SetCharacteristicPoint(MacroStabilityInwardsSurfaceLine surfaceLine,
MacroStabilityInwardsCharacteristicPointType type,
Point3D geometryPoint)
{
if (!Enum.IsDefined(typeof(MacroStabilityInwardsCharacteristicPointType), type))
{
throw new InvalidEnumArgumentException(nameof(type),
(int) type,
typeof(MacroStabilityInwardsCharacteristicPointType));
}
switch (type)
{
case MacroStabilityInwardsCharacteristicPointType.SurfaceLevelOutside:
surfaceLine.SetSurfaceLevelOutsideAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.SurfaceLevelInside:
surfaceLine.SetSurfaceLevelInsideAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.ShoulderBaseInside:
surfaceLine.SetShoulderBaseInsideAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.ShoulderTopInside:
surfaceLine.SetShoulderTopInsideAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.DikeToeAtRiver:
surfaceLine.SetDikeToeAtRiverAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.DikeToeAtPolder:
surfaceLine.SetDikeToeAtPolderAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.BottomDitchDikeSide:
surfaceLine.SetBottomDitchDikeSideAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.BottomDitchPolderSide:
surfaceLine.SetBottomDitchPolderSideAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.DitchDikeSide:
surfaceLine.SetDitchDikeSideAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.DikeTopAtRiver:
surfaceLine.SetDikeTopAtRiverAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.DikeTopAtPolder:
surfaceLine.SetDikeTopAtPolderAt(geometryPoint);
break;
case MacroStabilityInwardsCharacteristicPointType.DitchPolderSide:
surfaceLine.SetDitchPolderSideAt(geometryPoint);
break;
default:
throw new NotSupportedException($"The enum value {nameof(MacroStabilityInwardsCharacteristicPointType)}.{type} is not supported.");
}
}
///
/// Reads the geometry points.
///
/// The xml containing a collection of .
/// The read geometry points.
/// Thrown when is empty.
private static IEnumerable ReadGeometryPoints(string xml)
{
return new Point3DXmlSerializer().FromXml(xml);
}
}
}