Index: Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoDikeAssessmentSectionCommand.cs =================================================================== diff -u -rfc22f4b149d07797f0526f04ca58595bb9446786 -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoDikeAssessmentSectionCommand.cs (.../AddNewDemoDikeAssessmentSectionCommand.cs) (revision fc22f4b149d07797f0526f04ca58595bb9446786) +++ Demo/Ringtoets/src/Demo.Ringtoets/Commands/AddNewDemoDikeAssessmentSectionCommand.cs (.../AddNewDemoDikeAssessmentSectionCommand.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -1,4 +1,5 @@ -using System.Linq; +using System; +using System.Linq; using Core.Common.Controls.Commands; using Core.Common.Gui; using Ringtoets.Common.Forms.PresentationObjects; @@ -115,6 +116,7 @@ calculation.InputParameters.SetSurfaceLine(pipingFailureMechanism.SurfaceLines.First(sl => sl.Name == "PK001_0001")); calculation.InputParameters.SoilProfile = pipingFailureMechanism.SoilProfiles.First(sl => sl.Name == "AD640M00_Segment_36005_1D2"); calculation.InputParameters.PhreaticLevelExit.Mean = 3; + calculation.InputParameters.ThicknessCoverageLayer.Mean = Math.Exp(-0.5); } } } \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingInput.cs =================================================================== diff -u -r2a7be595bf1251849a3c5f3be000f0e40f8fa874 -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingInput.cs (.../PipingInput.cs) (revision 2a7be595bf1251849a3c5f3be000f0e40f8fa874) +++ Ringtoets/Piping/src/Ringtoets.Piping.Data/PipingInput.cs (.../PipingInput.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -58,7 +58,10 @@ { Mean = 1.0 }; - ThicknessCoverageLayer = new LognormalDistribution(); + ThicknessCoverageLayer = new LognormalDistribution + { + Mean = double.NaN + }; SeepageLength = new LognormalDistribution(); SeepageLength.StandardDeviation = SeepageLength.Mean * SeepageLengthStandardDeviationFraction; Diameter70 = new LognormalDistribution(); Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Extensions/PipingInputExtensions.cs =================================================================== diff -u -r847f6b97f0a6e007a89364ad12d0541bc0d84d1e -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Extensions/PipingInputExtensions.cs (.../PipingInputExtensions.cs) (revision 847f6b97f0a6e007a89364ad12d0541bc0d84d1e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Extensions/PipingInputExtensions.cs (.../PipingInputExtensions.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -1,5 +1,7 @@ using System; using System.Linq; +using log4net; +using Ringtoets.Piping.Calculation; using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.Properties; using Ringtoets.Piping.Service; @@ -13,6 +15,8 @@ /// public static class PipingInputExtensions { + private static ILog logger = LogManager.GetLogger(typeof(PipingInput)); + /// /// Updates the property and propagates changes to dependent /// properties. @@ -73,36 +77,57 @@ private static void UpdateThicknessCoverageLayer(this PipingInput input) { - if (input.SurfaceLine == null || input.SoilProfile == null) + if (input.SurfaceLine != null && input.SoilProfile != null) { - return; + try + { + input.ThicknessCoverageLayer.Mean = PipingCalculationService.CalculateThicknessCoverageLayer(input); + return; + } + catch (ArgumentOutOfRangeException) + { + // error handling performed after try-catch + } + catch (PipingCalculatorException) + { + // error handling performed after try-catch + } } - input.ThicknessCoverageLayer.Mean = PipingCalculationService.CalculateThicknessCoverageLayer(input); + logger.Warn(Resources.PipingInputExtensions_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer); + input.ThicknessCoverageLayer.Mean = double.NaN; } private static void UpdateValuesBasedOnSurfaceLine(this PipingInput input) { - var entryPointIndex = Array.IndexOf(input.SurfaceLine.Points, input.SurfaceLine.DikeToeAtRiver); - var exitPointIndex = Array.IndexOf(input.SurfaceLine.Points, input.SurfaceLine.DikeToeAtPolder); - - var localGeometry = input.SurfaceLine.ProjectGeometryToLZ().ToArray(); - - var tempEntryPointL = localGeometry[0].X; - var tempExitPointL = localGeometry[localGeometry.Length - 1].X; - - var differentPoints = entryPointIndex < 0 || exitPointIndex < 0 || entryPointIndex < exitPointIndex; - if (differentPoints && exitPointIndex > 0) + if (input.SurfaceLine == null) { - tempExitPointL = localGeometry.ElementAt(exitPointIndex).X; + input.ExitPointL = double.NaN; + input.SeepageLength.Mean = double.NaN; } - if (differentPoints && entryPointIndex > -1) + else { - tempEntryPointL = localGeometry.ElementAt(entryPointIndex).X; - } + var entryPointIndex = Array.IndexOf(input.SurfaceLine.Points, input.SurfaceLine.DikeToeAtRiver); + var exitPointIndex = Array.IndexOf(input.SurfaceLine.Points, input.SurfaceLine.DikeToeAtPolder); - input.ExitPointL = tempExitPointL; - input.SetSeepageLengthMean(tempExitPointL - tempEntryPointL); + var localGeometry = input.SurfaceLine.ProjectGeometryToLZ().ToArray(); + + var tempEntryPointL = localGeometry[0].X; + var tempExitPointL = localGeometry[localGeometry.Length - 1].X; + + var differentPoints = entryPointIndex < 0 || exitPointIndex < 0 || entryPointIndex < exitPointIndex; + if (differentPoints && exitPointIndex > 0) + { + tempExitPointL = localGeometry.ElementAt(exitPointIndex).X; + } + if (differentPoints && entryPointIndex > -1) + { + tempEntryPointL = localGeometry.ElementAt(entryPointIndex).X; + } + + input.ExitPointL = tempExitPointL; + input.SetSeepageLengthMean(tempExitPointL - tempEntryPointL); + } } /// Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -r7faedeb6692adf7a28c07c695c8c3de5b470ebd8 -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 7faedeb6692adf7a28c07c695c8c3de5b470ebd8) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -1041,6 +1041,16 @@ } /// + /// Looks up a localized string similar to Kan deklaagdikte niet afleiden op basis van de invoer.. + /// + public static string PipingInputExtensions_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer { + get { + return ResourceManager.GetString("PipingInputExtensions_UpdateThicknessCoverageLayer_Cannot_determine_thickness_cov" + + "erage_layer", resourceCulture); + } + } + + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// public static System.Drawing.Bitmap PipingInputIcon { Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Properties/Resources.resx =================================================================== diff -u -r7faedeb6692adf7a28c07c695c8c3de5b470ebd8 -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Properties/Resources.resx (.../Resources.resx) (revision 7faedeb6692adf7a28c07c695c8c3de5b470ebd8) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Properties/Resources.resx (.../Resources.resx) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -580,4 +580,7 @@ Kan locatie '{0}' niet gebruiken als invoer. {1} + + Kan deklaagdikte niet afleiden op basis van de invoer. + \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingInputContextProperties.cs =================================================================== diff -u -r7faedeb6692adf7a28c07c695c8c3de5b470ebd8 -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingInputContextProperties.cs (.../PipingInputContextProperties.cs) (revision 7faedeb6692adf7a28c07c695c8c3de5b470ebd8) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PropertyClasses/PipingInputContextProperties.cs (.../PipingInputContextProperties.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -185,7 +185,7 @@ } set { - data.WrappedData.SoilProfile = value; + data.WrappedData.SetSoilProfile(value); data.WrappedData.NotifyObservers(); } } Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj =================================================================== diff -u -r2a7be595bf1251849a3c5f3be000f0e40f8fa874 -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj (.../Ringtoets.Piping.Forms.csproj) (revision 2a7be595bf1251849a3c5f3be000f0e40f8fa874) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Ringtoets.Piping.Forms.csproj (.../Ringtoets.Piping.Forms.csproj) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -39,6 +39,9 @@ MinimumRecommendedRules.ruleset + + ..\..\..\..\packages\log4net.2.0.4\lib\net40-full\log4net.dll + @@ -180,6 +183,7 @@ Copying.licenseheader + Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/packages.config =================================================================== diff -u --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/packages.config (revision 0) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/packages.config (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -0,0 +1,4 @@ + + + + \ No newline at end of file Index: Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs =================================================================== diff -u -r847f6b97f0a6e007a89364ad12d0541bc0d84d1e -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision 847f6b97f0a6e007a89364ad12d0541bc0d84d1e) +++ Ringtoets/Piping/src/Ringtoets.Piping.Service/PipingCalculationService.cs (.../PipingCalculationService.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -96,7 +96,7 @@ { foreach (var errorMessage in errorMessages) { - pipingCalculationLogger.Error(string.Format(format, errorMessage)); + pipingCalculationLogger.ErrorFormat(format, errorMessage); } } Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingInputTest.cs =================================================================== diff -u -r2a7be595bf1251849a3c5f3be000f0e40f8fa874 -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingInputTest.cs (.../PipingInputTest.cs) (revision 2a7be595bf1251849a3c5f3be000f0e40f8fa874) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/PipingInputTest.cs (.../PipingInputTest.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -32,7 +32,7 @@ Assert.AreEqual(1, inputParameters.DampingFactorExit.Mean); Assert.AreEqual(defaultLogNormalStandardDev, inputParameters.DampingFactorExit.StandardDeviation); Assert.IsInstanceOf(inputParameters.ThicknessCoverageLayer); - Assert.AreEqual(defaultLogNormalMean, inputParameters.ThicknessCoverageLayer.Mean); + Assert.IsNaN(inputParameters.ThicknessCoverageLayer.Mean); Assert.AreEqual(defaultLogNormalStandardDev, inputParameters.ThicknessCoverageLayer.StandardDeviation); Assert.IsInstanceOf(inputParameters.SeepageLength); Assert.AreEqual(defaultLogNormalMean, inputParameters.SeepageLength.Mean); Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Extensions/PipingInputExtensionsTest.cs =================================================================== diff -u -r847f6b97f0a6e007a89364ad12d0541bc0d84d1e -rbbfd376aee76613b471f70d2b1214d7e7b08fb1f --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Extensions/PipingInputExtensionsTest.cs (.../PipingInputExtensionsTest.cs) (revision 847f6b97f0a6e007a89364ad12d0541bc0d84d1e) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Extensions/PipingInputExtensionsTest.cs (.../PipingInputExtensionsTest.cs) (revision bbfd376aee76613b471f70d2b1214d7e7b08fb1f) @@ -38,6 +38,34 @@ } [Test] + public void SetSurfaceLine_Null_SetsExitPointLAndSeePageLengthMeanToNaN() + { + // Setup + var inputParameters = new PipingInput(); + RingtoetsPipingSurfaceLine surfaceLine = new RingtoetsPipingSurfaceLine(); + var firstPointX = 1.0; + var secondPointX = 4.0; + var point1 = new Point3D(firstPointX, 0.0, 2.0); + var point2 = new Point3D(secondPointX, 0.0, 1.8); + surfaceLine.SetGeometry(new[] + { + point1, + point2, + }); + surfaceLine.SetDikeToeAtRiverAt(point1); + surfaceLine.SetDikeToeAtPolderAt(point2); + + inputParameters.SetSurfaceLine(surfaceLine); + + // Call + inputParameters.SetSurfaceLine(null); + + // Assert + Assert.IsNaN(inputParameters.SeepageLength.Mean); + Assert.IsNaN(inputParameters.ExitPointL); + } + + [Test] public void SetSurfaceLine_WithoutDikeToeDikeSideAndDikeToeRiverSide_ExitPointAtEndAndSeePageLengthIsLengthInX() { // Setup @@ -259,7 +287,7 @@ [Test] [TestCase(0)] [TestCase(1)] - public void ThicknessCoverageLayer_WithMissingInput_NoChangeInThickness(int inputIndexMissing) + public void ThicknessCoverageLayer_WithMissingInput_ThicknessSetToNaNAndLog(int inputIndexMissing) { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); @@ -280,26 +308,55 @@ } }); var input = new PipingInput(); - var previousResult = input.ThicknessCoverageLayer.Mean; + // Call + Action call = null; if (inputIndexMissing != 0) { - input.SetSurfaceLine(surfaceLine); + call = () => input.SetSurfaceLine(surfaceLine); } if (inputIndexMissing != 1) { - input.SetSoilProfile(soilProfile); + call = () => input.SetSoilProfile(soilProfile); } + + // Assert + TestHelper.AssertLogMessageIsGenerated(call, Resources.PipingInputExtensions_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer); + Assert.IsNaN(input.ThicknessCoverageLayer.Mean); + } + [Test] + public void ThicknessCoverageLayer_InputCausesPipingCalculatorException_ThicknessSetToNaNAndLog() + { + // Setup + var surfaceLine = new RingtoetsPipingSurfaceLine(); + surfaceLine.SetGeometry(new[] + { + new Point3D(0,0,2.0), + new Point3D(1.0,0,2.0), + }); + var soilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(2.0) + { + IsAquifer = false + } + }); + var input = new PipingInput(); + input.SoilProfile = soilProfile; + // Call - var result = input.ThicknessCoverageLayer.Mean; + Action call = () => input.SetSurfaceLine(surfaceLine); // Assert - Assert.AreEqual(previousResult, result); + TestHelper.AssertLogMessageIsGenerated(call, Resources.PipingInputExtensions_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer); + Assert.IsNaN(input.ThicknessCoverageLayer.Mean); } [Test] - public void ThicknessCoverageLayer_InputResultsInZeroThickness_ThrowsExceptionNoChangeInThickness() + [TestCase(0)] + [TestCase(1)] + public void ThicknessCoverageLayer_HadThicknessCoverageLayerChangeToMissingInput_ThicknessSetToNaNAndLog(int inputIndexMissing) { // Setup var surfaceLine = new RingtoetsPipingSurfaceLine(); @@ -310,24 +367,67 @@ }); var soilProfile = new PipingSoilProfile(String.Empty, 0, new[] { + new PipingSoilLayer(1.0) + { + IsAquifer = true + }, new PipingSoilLayer(2.0) { + IsAquifer = false + } + }); + var input = new PipingInput(); + input.SetSurfaceLine(surfaceLine); + input.SetSoilProfile(soilProfile); + + // Call + Action call = null; + if (inputIndexMissing == 0) + { + call = () => input.SetSurfaceLine(null); + } + if (inputIndexMissing == 1) + { + call = () => input.SetSoilProfile(null); + } + + // Assert + TestHelper.AssertLogMessageIsGenerated(call, Resources.PipingInputExtensions_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer); + Assert.IsNaN(input.ThicknessCoverageLayer.Mean); + } + + [Test] + public void ThicknessCoverageLayer_InputResultsInZeroThickness_ThicknessSetToNaNAndLog() + { + // Setup + var surfaceLine = new RingtoetsPipingSurfaceLine(); + surfaceLine.SetGeometry(new[] + { + new Point3D(0,0,2.0), + new Point3D(1.0,0,2.0), + }); + var soilProfile = new PipingSoilProfile(String.Empty, 0, new[] + { + new PipingSoilLayer(2.0) + { IsAquifer = true } }); var input = new PipingInput(); - var previousResult = input.ThicknessCoverageLayer.Mean; input.SetSurfaceLine(surfaceLine); input.SetExitPointL(0.5); // Call - TestDelegate test = () => input.SetSoilProfile(soilProfile); + input.SetSoilProfile(soilProfile); + // Call + Action call = () => input.SetSoilProfile(soilProfile); + // Assert - Assert.Throws(test); - Assert.AreEqual(previousResult, input.ThicknessCoverageLayer.Mean); + TestHelper.AssertLogMessageIsGenerated(call, Resources.PipingInputExtensions_UpdateThicknessCoverageLayer_Cannot_determine_thickness_coverage_layer); + Assert.IsNaN(input.ThicknessCoverageLayer.Mean); } [Test]