Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs =================================================================== diff -u -r946 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 946) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/DesignCalculator.cs (.../DesignCalculator.cs) (revision 971) @@ -23,18 +23,13 @@ using System.Collections.Generic; using System.Text; using Deltares.DamEngine.Calculators.KernelWrappers.Common; -using Deltares.DamEngine.Calculators.KernelWrappers.DamMacroStabilityInwards; -using Deltares.DamEngine.Calculators.KernelWrappers.DamMacroStabilityOutwards; -using Deltares.DamEngine.Calculators.KernelWrappers.DamPipingBligh; -using Deltares.DamEngine.Calculators.KernelWrappers.DamPipingSellmeijer4Forces; using Deltares.DamEngine.Calculators.KernelWrappers.Interfaces; using Deltares.DamEngine.Calculators.Properties; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.General.Results; -using Deltares.DamEngine.Data.Standard.Calculation; using Deltares.DamEngine.Data.Standard.Logging; -namespace Deltares.DamEngine.Calculators.Dikes_Design +namespace Deltares.DamEngine.Calculators.DikesDesign { /// /// The Dam Engine design calculator Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineShoulderAdapter.cs =================================================================== diff -u -r967 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineShoulderAdapter.cs (.../SurfaceLineShoulderAdapter.cs) (revision 967) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineShoulderAdapter.cs (.../SurfaceLineShoulderAdapter.cs) (revision 971) @@ -21,14 +21,16 @@ using System; using System.Linq; -using Deltares.DamEngine.Calculators.Dikes_Design; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; using Deltares.DamEngine.Data.Standard.Language; namespace Deltares.DamEngine.Calculators.DikesDesign { + /// + /// Class for adapting the shoulder (berm) of a surfaceline + /// public class SurfaceLineShoulderAdapter : SurfaceLineAdapter { /// Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineShoulderAdapterTest.cs =================================================================== diff -u -r967 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineShoulderAdapterTest.cs (.../SurfaceLineShoulderAdapterTest.cs) (revision 967) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineShoulderAdapterTest.cs (.../SurfaceLineShoulderAdapterTest.cs) (revision 971) @@ -22,7 +22,6 @@ using System; using System.Linq; using Deltares.DamEngine.Calculators.DikesDesign; -using Deltares.DamEngine.Calculators.Dikes_Design; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Deltares.DamEngine.Calculators.Tests.csproj =================================================================== diff -u -r967 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Deltares.DamEngine.Calculators.Tests.csproj (.../Deltares.DamEngine.Calculators.Tests.csproj) (revision 967) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/Deltares.DamEngine.Calculators.Tests.csproj (.../Deltares.DamEngine.Calculators.Tests.csproj) (revision 971) @@ -48,6 +48,7 @@ + Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineHeightAdapter.cs =================================================================== diff -u -r946 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineHeightAdapter.cs (.../SurfaceLineHeightAdapter.cs) (revision 946) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineHeightAdapter.cs (.../SurfaceLineHeightAdapter.cs) (revision 971) @@ -24,15 +24,26 @@ using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; -namespace Deltares.DamEngine.Calculators.Dikes_Design +namespace Deltares.DamEngine.Calculators.DikesDesign { + /// + /// Exception class for SurfaceLineHeightAdapter + /// public class SurfaceLineHeightAdapterException : Exception { public SurfaceLineHeightAdapterException(string message) : base(message) { } } + /// + /// Class for adapting the height of the crest of a surfaceline + /// public class SurfaceLineHeightAdapter : SurfaceLineAdapter { + /// + /// Initializes a new instance of the class. + /// + /// + /// public SurfaceLineHeightAdapter(SurfaceLine2 surfaceLine, Location location) : base(surfaceLine, location) { } Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineAdapterException.cs =================================================================== diff -u -r946 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineAdapterException.cs (.../SurfaceLineAdapterException.cs) (revision 946) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineAdapterException.cs (.../SurfaceLineAdapterException.cs) (revision 971) @@ -22,25 +22,46 @@ using System; using System.Runtime.Serialization; -namespace Deltares.DamEngine.Calculators.Dikes_Design +namespace Deltares.DamEngine.Calculators.DikesDesign { + /// + /// Exception class for the SurfaceLineAdpter classes + /// + /// [Serializable] public class SurfaceLineAdapterException : Exception { + /// + /// Initializes a new instance of the class. + /// public SurfaceLineAdapterException() { } + /// + /// Initializes a new instance of the class. + /// + /// The message that describes the error. public SurfaceLineAdapterException(string message) : base(message) { } + /// + /// Initializes a new instance of the class. + /// + /// The message. + /// The inner. public SurfaceLineAdapterException(string message, Exception inner) : base(message, inner) { } + /// + /// Initializes a new instance of the class. + /// + /// The that holds the serialized object data about the exception being thrown. + /// The that contains contextual information about the source or destination. protected SurfaceLineAdapterException( SerializationInfo info, StreamingContext context) Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Deltares.DamEngine.Data.csproj =================================================================== diff -u -r962 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Deltares.DamEngine.Data.csproj (.../Deltares.DamEngine.Data.csproj) (revision 962) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Deltares.DamEngine.Data.csproj (.../Deltares.DamEngine.Data.csproj) (revision 971) @@ -164,6 +164,7 @@ + Index: DamEngine/trunk/src/Deltares.DamEngine.Interface/EngineInterface.cs =================================================================== diff -u -r877 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Interface/EngineInterface.cs (.../EngineInterface.cs) (revision 877) +++ DamEngine/trunk/src/Deltares.DamEngine.Interface/EngineInterface.cs (.../EngineInterface.cs) (revision 971) @@ -21,7 +21,7 @@ using System; using System.Collections.Generic; -using Deltares.DamEngine.Calculators.Dikes_Design; +using Deltares.DamEngine.Calculators.DikesDesign; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Standard; using Deltares.DamEngine.Data.Standard.Logging; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineSlopeAdapterTest.cs =================================================================== diff -u --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineSlopeAdapterTest.cs (revision 0) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineSlopeAdapterTest.cs (revision 971) @@ -0,0 +1,728 @@ +// Copyright (C) Stichting Deltares 2018. All rights reserved. +// +// This file is part of the Dam Engine. +// +// The Dam Engine is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero 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 Deltares.DamEngine.Calculators.DikesDesign; +using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.Geometry; +using Deltares.DamEngine.Data.Geotechnics; +using NUnit.Framework; + +namespace Deltares.DamEngine.Calculators.Tests.DikesDesign +{ + /// + /// Class for testing SurfaceLineSlopeAdapter + /// + [TestFixture] + public class SurfaceLineSlopeAdapterTest + { + private readonly Location location = new Location(); + + /// + /// Tests the fixture tear down. + /// + [TestFixtureTearDown] + public void TestFixtureTearDown() + { + } + + private static SurfaceLine2 CreateSimpleDike() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = { GeometryMustContainPoint = true }, + Geometry = new GeometryPointString() + }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(1, 1, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(2, 1, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(3, 0, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(100, 0, CharacteristicPointType.SurfaceLevelInside); + return surfaceLine; + } + + #region ConstructWithDeltaX + + [Test] + public void ConstructNewSurfaceLineReturnsANewSurfaceLine() + { + var surfaceLine = CreateSimpleDike(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + var constructNewSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1); + Assert.IsNotNull(constructNewSurfaceLine); + } + + + [Test] + public void AdaptedSimpleDikeLineHasCorrectNewToeDikeAtPolder() + { + var surfaceLine = CreateSimpleDike(); + var pointDikeToeAtPolder = new GeometryPoint { X = 3, Z = 0 }; + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0); + var expectedPointDikeToeAtPolder = new GeometryPoint { X = 4, Z = 0 }; + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + } + + [Test] + public void AdaptedDikeWithShoulderHasCorrectPointsAfterToeSlope() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double deltaX = 1.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); + var expectedPointShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z }; + var expectedPointShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsTrue(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside))); + Assert.IsTrue(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside))); + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedDikeWithDitchHasCorrectPointsAfterToeSlope() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 30, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double deltaX = 1.0; + const double deltaXDitch = 3; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; + var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z }; + var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z }; + var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z }; + var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); + Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedDikeWithShoulderAndDitchHasCorrectPointsAfterToeSlope() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double deltaX = 1.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); + var expectedPointShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z }; + var expectedPointShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; + var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; + var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; + var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; + var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsTrue(expectedPointShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside))); + Assert.IsTrue(expectedPointShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside))); + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); + Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeHasCorrectNewToeDikeAtPolder() + { + var surfaceLine = CreateSimpleDike(); + surfaceLine.EnsurePoint(2.5, 0.4); // in between point on inside slope + surfaceLine.SortPoints(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(1.0); + var expectedPointDikeToeAtPolder = new GeometryPoint { X = 4, Z = 0 }; + Assert.AreEqual(6, surfaceLine.Geometry.Count); + Assert.AreEqual(5, adaptedSurfaceLine.Geometry.Count); // in between point should be thrown away + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + } + + [Test] + public void AdaptedSurfaceLineWithTrafficLoadPointsHasAdjustedPoints() + { + const double cTolerance = 0.0000001; + + // Create the base surfaceline (dike with shoulder and ditch) + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var pointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.3333333333 }; + var pointTrafficLoadInside = new GeometryPoint { X = 8, Z = 1.6666666667 }; + surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); + surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); + surfaceLine.SortPoints(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double deltaX = 1.0; + SurfaceLine2 adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); + GeometryPoint expectedPointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.5 }; + GeometryPoint expectedPointTrafficLoadInside = new GeometryPoint { X = 8, Z = 2.0 }; + Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); + pointTrafficLoadOutside = new GeometryPoint { X = 9.5, Z = 1.0 }; + pointTrafficLoadInside = new GeometryPoint { X = 10.5, Z = 1.0 }; + surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); + surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); + surfaceLine.SortPoints(); + surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLine(deltaX); + expectedPointTrafficLoadOutside = new GeometryPoint { X = 9.5, Z = 1.25 }; + expectedPointTrafficLoadInside = new GeometryPoint { X = 10.5, Z = 1.0 }; + Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); + } + #endregion + + #region ConstructWithSlopeTangent + + [Test] + [ExpectedException(typeof(SurfaceLineAdapterException))] + public void IsExceptionThrownIfSlopeDoesNotIntersectSurfaceLine() + { + var surfaceLine = CreateSimpleDike(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0); + } + + [Test] + public void IsNotExceptionThrownIfSlopeEqualsTheCurrentSlope() + { + var surfaceLine = CreateSimpleDike(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + Assert.IsNotNull(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(1.0)); + } + + [Test] + public void ConstructNewSurfaceLineBySlopeReturnsANewSurfaceLine() + { + var surfaceLine = CreateSimpleDike(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + Assert.IsNotNull(surfaceLineAdapter.ConstructNewSurfaceLineBySlope(0.9)); + } + + + [Test] + public void AdaptedSimpleDikeLineBySlopeHasCorrectNewToeDikeAtPolder() + { + var surfaceLine = CreateSimpleDike(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 3.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + var expectedPointDikeToeAtPolder = new GeometryPoint { X = 5, Z = 0 }; + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + } + + [Test] + public void AdaptedDikeWithShoulderBySlopeHasCorrectPointsAfterToeSlope() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 4.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + const double deltaX = 4.0; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedDikeWithDitchBySlopeHasCorrectPointsAfterToeSlope() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 4.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + const double deltaX = 4.0; + const double deltaXDitch = 3; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; + var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z }; + var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z }; + var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z }; + var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); + Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + [ExpectedException(typeof(SurfaceLineAdapterException))] + public void IsExceptionThrownWhenSlopeDoesNotFit() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 20, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 4.0; + surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + } + + [Test] + public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsBeyondDikeToe() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 4.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + const double deltaX = 4.0; + const double deltaXDitch = 3; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; + var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X + deltaX + deltaXDitch, Z = pointDitchDikeSide.Z }; + var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X + deltaX + deltaXDitch, Z = pointBottomDitchDikeSide.Z }; + var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X + deltaX + deltaXDitch, Z = pointBottomDitchPolderSide.Z }; + var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X + deltaX + deltaXDitch, Z = pointDitchPolderSide.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); + Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenBaseAndTop() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 2.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + const double deltaX = 1.0; + var expectedShoulderBaseInside = new GeometryPoint { X = pointShoulderBaseInside.X + deltaX, Z = pointShoulderBaseInside.Z }; + var expectedShoulderTopInside = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; + var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; + var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; + var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; + var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsTrue(expectedShoulderBaseInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside))); + Assert.IsTrue(expectedShoulderTopInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderTopInside))); + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); + Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsOnShoulderTop() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 10, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 2.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + var expectedNewPoint = new GeometryPoint { X = pointShoulderTopInside.X, Z = pointShoulderTopInside.Z }; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; + var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; + var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; + var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; + var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); + Assert.IsTrue(adaptedSurfaceLine.Geometry.GetPointAt(expectedNewPoint.X, expectedNewPoint.Z) != null); + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); + Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedDikeWithShoulderAndDitchBySlopeHasCorrectPointsAfterSlopeIntersectsInShoulderBetweenTopAndDikeToe() + { + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 7, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 8, Z = 0 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 2.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + const double deltaX = 4.0; // from pointShoulderTopInside + var expectedNewPoint = new GeometryPoint { X = pointShoulderTopInside.X + deltaX, Z = pointShoulderTopInside.Z }; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X, Z = pointDikeToeAtPolder.Z }; + var expectedPointDitchDikeSide = new GeometryPoint { X = pointDitchDikeSide.X, Z = pointDitchDikeSide.Z }; + var expectedPointBottomDitchDikeSide = new GeometryPoint { X = pointBottomDitchDikeSide.X, Z = pointBottomDitchDikeSide.Z }; + var expectedPointBottomDitchPolderSide = new GeometryPoint { X = pointBottomDitchPolderSide.X, Z = pointBottomDitchPolderSide.Z }; + var expectedPointDitchPolderSide = new GeometryPoint { X = pointDitchPolderSide.X, Z = pointDitchPolderSide.Z }; + var expectedPointSurfaceLevelInside = new GeometryPoint { X = pointSurfaceLevelInside.X, Z = pointSurfaceLevelInside.Z }; + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderBaseInside)); + Assert.IsFalse(adaptedSurfaceLine.HasAnnotation(CharacteristicPointType.ShoulderTopInside)); + Assert.IsTrue(adaptedSurfaceLine.Geometry.GetPointAt(expectedNewPoint.X, expectedNewPoint.Z) != null); + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + Assert.IsTrue(expectedPointDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchDikeSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchDikeSide))); + Assert.IsTrue(expectedPointBottomDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.BottomDitchPolderSide))); + Assert.IsTrue(expectedPointDitchPolderSide.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DitchPolderSide))); + Assert.IsTrue(expectedPointSurfaceLevelInside.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.SurfaceLevelInside))); + } + + [Test] + public void AdaptedSimpleDikeLineWithInBetweenPointOnInsideSlopeBySlopeHasCorrectNewToeDikeAtPolder() + { + var surfaceLine = CreateSimpleDike(); + var pointDikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePoint(2.5, 0.4); // in between point on inside slope + surfaceLine.SortPoints(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 4.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + const double deltaX = 3.0; + var expectedPointDikeToeAtPolder = new GeometryPoint { X = pointDikeToeAtPolder.X + deltaX, Z = pointDikeToeAtPolder.Z }; + Assert.AreEqual(6, surfaceLine.Geometry.Count); + Assert.AreEqual(5, adaptedSurfaceLine.Geometry.Count); // in between point should be thrown away + Assert.IsTrue(expectedPointDikeToeAtPolder.LocationEquals(adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder))); + } + + [Test] + public void AdaptedSurfaceLineWithTrafficLoadPointsBySlopeHasAdjustedPoints() + { + const double cTolerance = 0.0000001; + + // Create the base surfaceline (dike with shoulder and ditch) + var surfaceLine = new SurfaceLine2 + { + CharacteristicPoints = + { + GeometryMustContainPoint = true + }, + Geometry = new GeometryPointString() + }; + var pointShoulderBaseInside = new GeometryPoint { X = 9, Z = 1 }; + var pointShoulderTopInside = new GeometryPoint { X = 11, Z = 1 }; + var pointDikeToeAtPolder = new GeometryPoint { X = 14, Z = 0 }; + var pointDitchDikeSide = new GeometryPoint { X = 16, Z = 0 }; + var pointBottomDitchDikeSide = new GeometryPoint { X = 17, Z = -1 }; + var pointBottomDitchPolderSide = new GeometryPoint { X = 18, Z = -1 }; + var pointDitchPolderSide = new GeometryPoint { X = 19, Z = 0 }; + var pointSurfaceLevelInside = new GeometryPoint { X = 50, Z = 0 }; + surfaceLine.EnsurePointOfType(0, 0, CharacteristicPointType.DikeToeAtRiver); + surfaceLine.EnsurePointOfType(4, 3, CharacteristicPointType.DikeTopAtRiver); + surfaceLine.EnsurePointOfType(6, 3, CharacteristicPointType.DikeTopAtPolder); + surfaceLine.EnsurePointOfType(pointShoulderBaseInside.X, pointShoulderBaseInside.Z, CharacteristicPointType.ShoulderBaseInside); + surfaceLine.EnsurePointOfType(pointShoulderTopInside.X, pointShoulderTopInside.Z, CharacteristicPointType.ShoulderTopInside); + surfaceLine.EnsurePointOfType(pointDikeToeAtPolder.X, pointDikeToeAtPolder.Z, CharacteristicPointType.DikeToeAtPolder); + surfaceLine.EnsurePointOfType(pointDitchDikeSide.X, pointDitchDikeSide.Z, CharacteristicPointType.DitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchDikeSide.X, pointBottomDitchDikeSide.Z, CharacteristicPointType.BottomDitchDikeSide); + surfaceLine.EnsurePointOfType(pointBottomDitchPolderSide.X, pointBottomDitchPolderSide.Z, CharacteristicPointType.BottomDitchPolderSide); + surfaceLine.EnsurePointOfType(pointDitchPolderSide.X, pointDitchPolderSide.Z, CharacteristicPointType.DitchPolderSide); + surfaceLine.EnsurePointOfType(pointSurfaceLevelInside.X, pointSurfaceLevelInside.Z, CharacteristicPointType.SurfaceLevelInside); + var pointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.3333333333 }; + var pointTrafficLoadInside = new GeometryPoint { X = 8, Z = 1.6666666667 }; + surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); + surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); + surfaceLine.SortPoints(); + var surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + const double slopeTangent = 1.0 / 4.0; + var adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + var expectedPointTrafficLoadOutside = new GeometryPoint { X = 7, Z = 2.75 }; + var expectedPointTrafficLoadInside = new GeometryPoint { X = 8, Z = 2.5 }; + Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); + pointTrafficLoadOutside = new GeometryPoint { X = 10.0, Z = 1.0 }; + pointTrafficLoadInside = new GeometryPoint { X = 13, Z = 1.0 / 3.0 }; + surfaceLine.EnsurePointOfType(pointTrafficLoadOutside.X, pointTrafficLoadOutside.Z, CharacteristicPointType.TrafficLoadOutside); + surfaceLine.EnsurePointOfType(pointTrafficLoadInside.X, pointTrafficLoadInside.Z, CharacteristicPointType.TrafficLoadInside); + surfaceLine.SortPoints(); + surfaceLineAdapter = new SurfaceLineSlopeAdapter(surfaceLine, location); + adaptedSurfaceLine = surfaceLineAdapter.ConstructNewSurfaceLineBySlope(slopeTangent); + expectedPointTrafficLoadOutside = new GeometryPoint { X = 10.0, Z = 2.0 }; + expectedPointTrafficLoadInside = new GeometryPoint { X = 13, Z = 1.25 }; + Assert.AreEqual(expectedPointTrafficLoadOutside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.X, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).X, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadOutside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadOutside).Z, cTolerance); + Assert.AreEqual(expectedPointTrafficLoadInside.Z, adaptedSurfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.TrafficLoadInside).Z, cTolerance); + } + #endregion + } +} Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineAdapter.cs =================================================================== diff -u -r955 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineAdapter.cs (.../SurfaceLineAdapter.cs) (revision 955) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineAdapter.cs (.../SurfaceLineAdapter.cs) (revision 971) @@ -22,15 +22,16 @@ using System; using System.Collections.Generic; using System.Linq; -using Deltares.DamEngine.Calculators.General; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; -using Deltares.DamEngine.Data.Standard; using Deltares.DamEngine.Data.Standard.Language; -namespace Deltares.DamEngine.Calculators.Dikes_Design +namespace Deltares.DamEngine.Calculators.DikesDesign { + /// + /// Definition of a ditch + /// public struct DitchDefinition { public double OriginalX; @@ -42,6 +43,9 @@ public double DepthBottomPolderSide; } + /// + /// Base class for adapting the surfaceline + /// public abstract class SurfaceLineAdapter { @@ -323,6 +327,11 @@ "SurfaceLineAdapterNoDikePointsError")); } + /// + /// Gets the ditch definition. + /// + /// + /// protected DitchDefinition? GetDitchDefinition() { var ditchDefinition = new DitchDefinition(); @@ -436,6 +445,11 @@ return res; } + /// + /// Restores the ditch. + /// + /// The ditch definition. + /// protected void RestoreDitch(DitchDefinition? ditchDefinition) { if (ditchDefinition == null) return; Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ThrowHelper.cs =================================================================== diff -u --- DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ThrowHelper.cs (revision 0) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Standard/ThrowHelper.cs (revision 971) @@ -0,0 +1,47 @@ +// Copyright (C) Stichting Deltares 2018. All rights reserved. +// +// This file is part of the Dam Engine. +// +// The Dam Engine is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero 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; + +namespace Deltares.DamEngine.Data.Standard +{ + /// + /// Helper class for generating excepions + /// + public class ThrowHelper + { + /// + /// Throws the when condition is true. + /// + /// The type of the exception. + /// The message. + /// The condition. + public static void ThrowWhenConditionIsTrue(string message, Func condition) + where TException : Exception + { + var exception = (Exception)Activator.CreateInstance(typeof(TException), new object[] { message }); + + if (condition()) + throw exception; + } + + } +} Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineHeightAdapterTest.cs =================================================================== diff -u -r967 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineHeightAdapterTest.cs (.../SurfaceLineHeightAdapterTest.cs) (revision 967) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineHeightAdapterTest.cs (.../SurfaceLineHeightAdapterTest.cs) (revision 971) @@ -20,7 +20,7 @@ // All rights reserved. using System.Linq; -using Deltares.DamEngine.Calculators.Dikes_Design; +using Deltares.DamEngine.Calculators.DikesDesign; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineSlopeAdapter.cs =================================================================== diff -u --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineSlopeAdapter.cs (revision 0) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineSlopeAdapter.cs (revision 971) @@ -0,0 +1,115 @@ +// Copyright (C) Stichting Deltares 2018. All rights reserved. +// +// This file is part of the Dam Engine. +// +// The Dam Engine is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero 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 Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero 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.Linq; +using Deltares.DamEngine.Data.General; +using Deltares.DamEngine.Data.Geotechnics; +using Deltares.DamEngine.Data.Standard; +using Deltares.DamEngine.Data.Standard.Language; +using Deltares.DamEngine.Data.Standard.Validation; + +namespace Deltares.DamEngine.Calculators.DikesDesign +{ + /// + /// Class for adapting the slope of a surfaceline + /// + public class SurfaceLineSlopeAdapter : SurfaceLineAdapter + { + /// + /// Initializes a new instance of the class. + /// + /// + /// + public SurfaceLineSlopeAdapter(SurfaceLine2 surfaceLine, Location location) + : base(surfaceLine, location) + { + } + + /// + /// Constructs a new surface line with an adjusted slope + /// Adapt slope by moving the toe of the dike horizontally with deltaXAtToeOfSlope + /// + /// + /// + /// The offset to shift to the right + /// The adapted surface line + public SurfaceLine2 ConstructNewSurfaceLine(double deltaXAtToeOfSlope) + { + ThrowHelper.ThrowWhenConditionIsTrue("deltaXAtToeOfSlope should be >= 0.0", () => deltaXAtToeOfSlope < 0.0); + var dikeTopAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); + var dikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); + var dikeBaseInside = surfaceLine.HasShoulderInside() ? surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside) : dikeToeAtPolder; + var slopeTangent = (dikeTopAtPolder.Z - dikeBaseInside.Z) / + (dikeBaseInside.X + deltaXAtToeOfSlope - dikeTopAtPolder.X); + + ConstructNewSurfaceLineBySlope(slopeTangent); + + return surfaceLine; + } + + /// + /// Constructs a new surface line with an adjusted slope + /// Adapt slope by changing the slope to the specified slopeTangent + /// The top of the dike will remain in place and the te of the dike will be moved + /// + /// + /// + public SurfaceLine2 ConstructNewSurfaceLineBySlope(double slopeTangent) + { + ThrowHelper.ThrowWhenConditionIsTrue("Slopetangent should be >= 0.0", () => slopeTangent < 0.0); + // the given surface line must be valid to begin with. + var validationError = surfaceLine.Validate().FirstOrDefault(vr => vr.MessageType == ValidationResultType.Error); + if (validationError != null) + { + throw new SurfaceLineException(validationError.Text); + } + var orgMaxX = surfaceLine.Geometry.GetMaxX(); + if (double.IsNaN(orgMaxX)) + { + orgMaxX = double.MaxValue; + } + var dikeTopAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); + var dikeToeAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeToeAtPolder); + var dikeBaseInside = surfaceLine.HasShoulderInside() ? surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.ShoulderBaseInside) : dikeToeAtPolder; + // Remove points on inside slope + surfaceLine.RemoveSegmentBetween(dikeTopAtPolder.X, dikeBaseInside.X); + // Store the ditch (if any) + var ditchDefinition = GetDitchDefinition(); + // Delete the ditch from the surfaceline (if any) + RemoveExistingDitch(ditchDefinition); + // Adjust for the new slope + ReplaceBaseInsideForNewSlope(dikeTopAtPolder, slopeTangent); + // Restore Ditch (if any) + RestoreDitch(ditchDefinition); + // Check whether the surface line is extended. This is not allowed! + if (surfaceLine.Geometry.GetMaxX() > orgMaxX) + { + throw new SurfaceLineAdapterException(LocalizationManager.GetTranslatedText(this, + "SurfaceLineShoulderAdapterNewShoulderHeightTooLargeError")); + } + // Restore traffic load + RestoreTrafficLoad(); + surfaceLine.SortPoints(); + + return surfaceLine; + } + } +} \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineAdapterTest.cs =================================================================== diff -u -r951 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineAdapterTest.cs (.../SurfaceLineAdapterTest.cs) (revision 951) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators.Tests/DikesDesign/SurfaceLineAdapterTest.cs (.../SurfaceLineAdapterTest.cs) (revision 971) @@ -20,7 +20,7 @@ // All rights reserved. using System; -using Deltares.DamEngine.Calculators.Dikes_Design; +using Deltares.DamEngine.Calculators.DikesDesign; using Deltares.DamEngine.Data.General; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Geotechnics; Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/Deltares.DamEngine.Calculators.csproj =================================================================== diff -u -r967 -r971 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/Deltares.DamEngine.Calculators.csproj (.../Deltares.DamEngine.Calculators.csproj) (revision 967) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/Deltares.DamEngine.Calculators.csproj (.../Deltares.DamEngine.Calculators.csproj) (revision 971) @@ -61,6 +61,7 @@ +