Index: Ringtoets/Piping/src/Ringtoets.Piping.KernelWrapper/PipingSurfaceLineCreator.cs =================================================================== diff -u -rad11d25e651c47162ecf08d11a05d40bba0bebca -r8835dbef07a012e4e7e9f8aa8e21040bfea4e079 --- Ringtoets/Piping/src/Ringtoets.Piping.KernelWrapper/PipingSurfaceLineCreator.cs (.../PipingSurfaceLineCreator.cs) (revision ad11d25e651c47162ecf08d11a05d40bba0bebca) +++ Ringtoets/Piping/src/Ringtoets.Piping.KernelWrapper/PipingSurfaceLineCreator.cs (.../PipingSurfaceLineCreator.cs) (revision 8835dbef07a012e4e7e9f8aa8e21040bfea4e079) @@ -54,43 +54,58 @@ private static IEnumerable CreatePoints(RingtoetsPipingSurfaceLine line) { - var projectedPoints = line.ProjectGeometryToLZ().ToArray(); + Point2D[] projectedPoints = line.ProjectGeometryToLZ().ToArray(); var pipingPoints = new List(); + for (int i = 0; i < line.Points.Length; i++) { - var pipingPoint = CreatePoint(line, projectedPoints, i); - pipingPoints.Add(pipingPoint); + IEnumerable newPoints = CreatePoint(line, projectedPoints, i); + pipingPoints.AddRange(newPoints); } return pipingPoints; } - private static PipingPoint CreatePoint(RingtoetsPipingSurfaceLine line, Point2D[] projectedPoints, int index) + private static IEnumerable CreatePoint(RingtoetsPipingSurfaceLine line, Point2D[] projectedPoints, int index) { - var surfaceLinePoint = line.Points[index]; - var projectedPoint = projectedPoints[index]; - var pipingPoint = new PipingPoint(projectedPoint.X, 0.0, projectedPoint.Y); + Point3D surfaceLinePoint = line.Points[index]; + Point2D projectedPoint = projectedPoints[index]; + IList pipingPoints = new List(); + if (ReferenceEquals(line.DitchPolderSide, surfaceLinePoint)) { - pipingPoint.Type = PipingCharacteristicPointType.DitchPolderSide; + pipingPoints.Add(CreatePipingPointOfType(projectedPoint, PipingCharacteristicPointType.DitchPolderSide)); } if (ReferenceEquals(line.BottomDitchPolderSide, surfaceLinePoint)) { - pipingPoint.Type = PipingCharacteristicPointType.BottomDitchPolderSide; + pipingPoints.Add(CreatePipingPointOfType(projectedPoint, PipingCharacteristicPointType.BottomDitchPolderSide)); } if (ReferenceEquals(line.BottomDitchDikeSide, surfaceLinePoint)) { - pipingPoint.Type = PipingCharacteristicPointType.BottomDitchDikeSide; + pipingPoints.Add(CreatePipingPointOfType(projectedPoint, PipingCharacteristicPointType.BottomDitchDikeSide)); } if (ReferenceEquals(line.DitchDikeSide, surfaceLinePoint)) { - pipingPoint.Type = PipingCharacteristicPointType.DitchDikeSide; + pipingPoints.Add(CreatePipingPointOfType(projectedPoint, PipingCharacteristicPointType.DitchDikeSide)); } if (ReferenceEquals(line.DikeToeAtPolder, surfaceLinePoint)) { - pipingPoint.Type = PipingCharacteristicPointType.DikeToeAtPolder; + pipingPoints.Add(CreatePipingPointOfType(projectedPoint, PipingCharacteristicPointType.DikeToeAtPolder)); } + if (!pipingPoints.Any()) + { + pipingPoints.Add(CreatePipingPointOfType(projectedPoint, PipingCharacteristicPointType.None)); + } + return pipingPoints; + } + + private static PipingPoint CreatePipingPointOfType(Point2D projectedPoint, PipingCharacteristicPointType pointType) + { + var pipingPoint = new PipingPoint(projectedPoint.X, 0.0, projectedPoint.Y) + { + Type = pointType + }; return pipingPoint; } } Index: Ringtoets/Piping/test/Ringtoets.Piping.InputParameterCalculation.Test/InputParameterCalculationServiceTest.cs =================================================================== diff -u -r04e39e2be6e56f40de8ca5ade95a2e9c0c736c85 -r8835dbef07a012e4e7e9f8aa8e21040bfea4e079 --- Ringtoets/Piping/test/Ringtoets.Piping.InputParameterCalculation.Test/InputParameterCalculationServiceTest.cs (.../InputParameterCalculationServiceTest.cs) (revision 04e39e2be6e56f40de8ca5ade95a2e9c0c736c85) +++ Ringtoets/Piping/test/Ringtoets.Piping.InputParameterCalculation.Test/InputParameterCalculationServiceTest.cs (.../InputParameterCalculationServiceTest.cs) (revision 8835dbef07a012e4e7e9f8aa8e21040bfea4e079) @@ -70,6 +70,57 @@ } [Test] + public static void CalculateEffectiveThicknessCoverageLayer_WithMultipleCharacteristicTypesOnSamePoint_ReturnsThickness() + { + // Setup + var surfaceLine = new RingtoetsPipingSurfaceLine(); + surfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, 10), + new Point3D(20, 0, 10) + }); + surfaceLine.SetDikeToeAtRiverAt(surfaceLine.Points[0]); + surfaceLine.SetDikeToeAtPolderAt(surfaceLine.Points[0]); + surfaceLine.SetDitchDikeSideAt(surfaceLine.Points[0]); + surfaceLine.SetBottomDitchPolderSideAt(surfaceLine.Points[1]); + surfaceLine.SetBottomDitchDikeSideAt(surfaceLine.Points[1]); + surfaceLine.SetDitchPolderSideAt(surfaceLine.Points[1]); + + var stochasticSoilProfile = new StochasticSoilProfile(0.0, SoilProfileType.SoilProfile1D, 0) + { + SoilProfile = new PipingSoilProfile(string.Empty, 0, new[] + { + new PipingSoilLayer(5) + { + IsAquifer = true + }, + new PipingSoilLayer(20) + { + IsAquifer = false + } + }, SoilProfileType.SoilProfile1D, 0) + }; + + var input = new PipingInput(new GeneralPipingInput()) + { + ExitPointL = (RoundedDouble) 10, + SurfaceLine = surfaceLine, + StochasticSoilProfile = stochasticSoilProfile + }; + + // Call + double thickness = InputParameterCalculationService.CalculateEffectiveThicknessCoverageLayer( + input.WaterVolumetricWeight, + PipingSemiProbabilisticDesignValueFactory.GetPhreaticLevelExit(input).GetDesignValue(), + input.ExitPointL, + input.SurfaceLine, + input.StochasticSoilProfile.SoilProfile); + + // Assert + Assert.AreEqual(5, thickness); + } + + [Test] public static void CalculateEffectiveThicknessCoverageLayer_ValidInput_ReturnsThickness() { // Setup Index: Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.Test/PipingSurfaceLineCreatorTest.cs =================================================================== diff -u -r51c41f19c5b5ed0a0ad42b5dc3a969246d58a2d6 -r8835dbef07a012e4e7e9f8aa8e21040bfea4e079 --- Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.Test/PipingSurfaceLineCreatorTest.cs (.../PipingSurfaceLineCreatorTest.cs) (revision 51c41f19c5b5ed0a0ad42b5dc3a969246d58a2d6) +++ Ringtoets/Piping/test/Ringtoets.Piping.KernelWrapper.Test/PipingSurfaceLineCreatorTest.cs (.../PipingSurfaceLineCreatorTest.cs) (revision 8835dbef07a012e4e7e9f8aa8e21040bfea4e079) @@ -320,6 +320,40 @@ AssertPointsAreEqual(new Point3D(0.0, 0.0, 2.2), actual.DitchPolderSide); } + [Test] + public void Create_SurfaceLineWithMultipleCharacteristicTypesForOnePoint_CreateSurfaceLineWithPointsForEachType() + { + // Setup + const string name = "Surfaceline without points"; + var point = new Point3D(1.0, 1.0, 2.2); + var surfaceLine = new RingtoetsPipingSurfaceLine + { + Name = name + }; + surfaceLine.SetGeometry(new[] + { + point + }); + surfaceLine.SetDikeToeAtRiverAt(point); + surfaceLine.SetDikeToeAtPolderAt(point); + surfaceLine.SetDitchDikeSideAt(point); + surfaceLine.SetBottomDitchPolderSideAt(point); + surfaceLine.SetBottomDitchDikeSideAt(point); + surfaceLine.SetDitchPolderSideAt(point); + + // Call + PipingSurfaceLine actual = PipingSurfaceLineCreator.Create(surfaceLine); + + // Assert + Assert.AreEqual(name, actual.Name); + Assert.AreEqual(5, actual.Points.Count); + AssertPointsAreEqual(new Point3D(0.0, 0.0, 2.2), actual.DikeToeAtPolder); + AssertPointsAreEqual(new Point3D(0.0, 0.0, 2.2), actual.DitchDikeSide); + AssertPointsAreEqual(new Point3D(0.0, 0.0, 2.2), actual.BottomDitchPolderSide); + AssertPointsAreEqual(new Point3D(0.0, 0.0, 2.2), actual.BottomDitchDikeSide); + AssertPointsAreEqual(new Point3D(0.0, 0.0, 2.2), actual.DitchPolderSide); + } + private void AssertPointsAreEqual(Point3D point, PipingPoint otherPoint) { if (point == null)