Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Service/MacroStabilityInwardsInputValidator.cs =================================================================== diff -u -re678af24e939bdb6b49294b16b06af9565bef9b1 -re5364ac1dd155a3e329529af8a542625ada547cf --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Service/MacroStabilityInwardsInputValidator.cs (.../MacroStabilityInwardsInputValidator.cs) (revision e678af24e939bdb6b49294b16b06af9565bef9b1) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Service/MacroStabilityInwardsInputValidator.cs (.../MacroStabilityInwardsInputValidator.cs) (revision e5364ac1dd155a3e329529af8a542625ada547cf) @@ -79,6 +79,7 @@ { yield return Resources.MacroStabilityInwardsCalculationService_ValidateInput_SoilLayerTop_must_be_larger_than_SurfaceLineTop; } + yield break; } @@ -143,31 +144,56 @@ IEnumerable surfaceLineWithInterpolations = GetSurfaceLineWithInterpolations(inputParameters, uniqueXs); + IEnumerable maximumYCoordinates = GetMaximumYCoordinatesFromSoilProfile(soilProfile2D); foreach (Point2D surfaceLinePoint in surfaceLineWithInterpolations) { - bool isNear = soilProfile2D.Layers.Any(l => IsPointNearSoilSegments( - surfaceLinePoint, - Math2D.ConvertLinePointsToClosingLineSegments(l.OuterRing.Points))); + bool isNear = IsPointNearSoilSegments(surfaceLinePoint, + Math2D.ConvertLinePointsToClosingLineSegments(maximumYCoordinates)); if (!isNear) { return false; } } + return true; } private static IEnumerable GetDistinctXFromCoordinates(IEnumerable surfaceLinePoints, MacroStabilityInwardsSoilProfile2D soilProfile2D) { return surfaceLinePoints.Select(p => p.X) - .Concat(soilProfile2D.Layers - .SelectMany(l => l.OuterRing - .Points - .Select(outerRingPoint => outerRingPoint.X)) - ).OrderBy(d => d) + .Concat(GetSoilProfile2DXCoordinates(soilProfile2D)) + .OrderBy(d => d) .Distinct(); } + private static IEnumerable GetSoilProfile2DXCoordinates(MacroStabilityInwardsSoilProfile2D soilProfile2D) + { + return soilProfile2D.Layers + .SelectMany(l => l.OuterRing + .Points + .Select(outerRingPoint => outerRingPoint.X)); + } + + private static IEnumerable GetMaximumYCoordinatesFromSoilProfile(MacroStabilityInwardsSoilProfile2D soilProfile2D) + { + IEnumerable points = GetSoilProfile2DXCoordinates(soilProfile2D).OrderBy(d => d) + .Distinct(); + + var selectedPoints = new List(); + foreach (double point in points) + { + double maximumYCoordinate = soilProfile2D.Layers + .SelectMany(l => l.OuterRing + .Points) + .Where(p => p.X.Equals(point)) + .Max(p => p.Y); + selectedPoints.Add(new Point2D(point, maximumYCoordinate)); + } + + return selectedPoints; + } + private static IEnumerable GetSurfaceLineWithInterpolations(MacroStabilityInwardsInput inputParameters, IEnumerable uniqueXs) { @@ -191,6 +217,7 @@ return true; } } + return false; } @@ -235,10 +262,12 @@ { validationResults.Add(Resources.MacroStabilityInwardsCalculationService_ValidateInput_No_SurfaceLine_selected); } + if (inputParameters.StochasticSoilProfile == null) { validationResults.Add(Resources.MacroStabilityInwardsCalculationService_ValidateInput_No_StochasticSoilProfile_selected); } + return validationResults; } }