Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Forms/Views/MacroStabilityInwardsOutputChartControl.cs =================================================================== diff -u -r96764c996a0c059b15ccfd968ba165a0ede1b1e3 -r187efa574b622ec8fd7d3f82f367974e17dbf138 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Forms/Views/MacroStabilityInwardsOutputChartControl.cs (.../MacroStabilityInwardsOutputChartControl.cs) (revision 96764c996a0c059b15ccfd968ba165a0ede1b1e3) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.Forms/Views/MacroStabilityInwardsOutputChartControl.cs (.../MacroStabilityInwardsOutputChartControl.cs) (revision 187efa574b622ec8fd7d3f82f367974e17dbf138) @@ -19,6 +19,7 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; @@ -42,6 +43,8 @@ { private readonly ChartDataCollection chartDataCollection; private readonly ChartDataCollection soilProfileChartData; + private readonly ChartDataCollection waternetZonesExtremeChartData; + private readonly ChartDataCollection waternetZonesDailyChartData; private readonly ChartLineData surfaceLineChartData; private readonly ChartPointData surfaceLevelInsideChartData; private readonly ChartPointData ditchPolderSideChartData; @@ -61,6 +64,14 @@ private IMacroStabilityInwardsSoilProfile currentSoilProfile; private MacroStabilityInwardsSurfaceLine currentSurfaceLine; + private MacroStabilityInwardsWaternet currentWaternetExtreme; + private MacroStabilityInwardsWaternet currentWaternetDaily; + + private readonly IDictionary phreaticLineExtremeLookup; + private readonly IDictionary phreaticLineDailyLookup; + private readonly IDictionary waternetLineExtremeLookup; + private readonly IDictionary waternetLineDailyLookup; + /// /// Creates a new instance of . /// @@ -83,6 +94,8 @@ dikeToeAtRiverChartData = RingtoetsChartDataFactory.CreateDikeToeAtRiverChartData(); dikeTopAtRiverChartData = MacroStabilityInwardsChartDataFactory.CreateDikeTopAtRiverChartData(); surfaceLevelOutsideChartData = MacroStabilityInwardsChartDataFactory.CreateSurfaceLevelOutsideChartData(); + waternetZonesExtremeChartData = MacroStabilityInwardsChartDataFactory.CreateWaternetZonesExtremeChartDataCollection(); + waternetZonesDailyChartData = MacroStabilityInwardsChartDataFactory.CreateWaternetZonesDailyChartDataCollection(); chartDataCollection.Add(soilProfileChartData); chartDataCollection.Add(surfaceLineChartData); @@ -98,8 +111,15 @@ chartDataCollection.Add(dikeToeAtRiverChartData); chartDataCollection.Add(dikeTopAtRiverChartData); chartDataCollection.Add(surfaceLevelOutsideChartData); + chartDataCollection.Add(waternetZonesExtremeChartData); + chartDataCollection.Add(waternetZonesDailyChartData); soilLayerChartDataLookup = new List(); + + phreaticLineExtremeLookup = new Dictionary(); + phreaticLineDailyLookup = new Dictionary(); + waternetLineExtremeLookup = new Dictionary(); + waternetLineDailyLookup = new Dictionary(); } public IChartControl Chart @@ -136,9 +156,9 @@ return; } - MacroStabilityInwardsInput macroStabilityInwardsInput = data.InputParameters; - MacroStabilityInwardsSurfaceLine surfaceLine = macroStabilityInwardsInput.SurfaceLine; - IMacroStabilityInwardsSoilProfile soilProfile = macroStabilityInwardsInput.StochasticSoilProfile?.SoilProfile; + MacroStabilityInwardsInput input = data.InputParameters; + MacroStabilityInwardsSurfaceLine surfaceLine = input.SurfaceLine; + IMacroStabilityInwardsSoilProfile soilProfile = input.StochasticSoilProfile?.SoilProfile; if (!ReferenceEquals(currentSoilProfile, soilProfile) || !ReferenceEquals(currentSurfaceLine, surfaceLine)) { @@ -148,19 +168,26 @@ SetSoilProfileChartData(); } + SetWaternetExtremeChartData(input.WaternetExtreme); + SetWaternetDailyChartData(input.WaternetDaily); + if (data.Output != null) { SetSurfaceLineChartData(surfaceLine); SetSoilLayerAreas(); + SetWaternetDatas(surfaceLine); } else { SetSurfaceLineChartData(null); SetEmptySoilLayerAreas(); + SetEmptyWaternets(); } chartDataCollection.Collection.ForEachElementDo(cd => cd.NotifyObservers()); soilProfileChartData.Collection.ForEachElementDo(sp => sp.NotifyObservers()); + waternetZonesDailyChartData.Collection.ForEachElementDo(cd => cd.NotifyObservers()); + waternetZonesExtremeChartData.Collection.ForEachElementDo(cd => cd.NotifyObservers()); } private void SetSoilProfileChartData() @@ -226,5 +253,88 @@ ? MacroStabilityInwardsSoilProfile2DLayersHelper.GetLayersRecursively(layers) : new List(); } + + private void SetWaternetDatas(MacroStabilityInwardsSurfaceLine surfaceLine) + { + foreach (KeyValuePair dailyPhreaticLineData in phreaticLineDailyLookup) + { + dailyPhreaticLineData.Value.Points = MacroStabilityInwardsChartDataPointsFactory.CreatePhreaticLinePoints(dailyPhreaticLineData.Key); + } + foreach (KeyValuePair extremePhreaticLineData in phreaticLineExtremeLookup) + { + extremePhreaticLineData.Value.Points = MacroStabilityInwardsChartDataPointsFactory.CreatePhreaticLinePoints(extremePhreaticLineData.Key); + } + foreach (KeyValuePair dailyWaternetLineData in waternetLineDailyLookup) + { + dailyWaternetLineData.Value.Areas = MacroStabilityInwardsChartDataPointsFactory.CreateWaternetZonePoints(dailyWaternetLineData.Key, surfaceLine); + } + foreach (KeyValuePair extremeWaternetLineData in waternetLineExtremeLookup) + { + extremeWaternetLineData.Value.Areas = MacroStabilityInwardsChartDataPointsFactory.CreateWaternetZonePoints(extremeWaternetLineData.Key, surfaceLine); + } + } + + private void SetEmptyWaternets() + { + foreach (KeyValuePair dailyPhreaticLineData in phreaticLineDailyLookup) + { + dailyPhreaticLineData.Value.Points = new Point2D[0]; + } + foreach (KeyValuePair extremePhreaticLineData in phreaticLineExtremeLookup) + { + extremePhreaticLineData.Value.Points = new Point2D[0]; + } + foreach (KeyValuePair dailyWaternetLineData in waternetLineDailyLookup) + { + dailyWaternetLineData.Value.Areas = Enumerable.Empty(); + } + foreach (KeyValuePair extremeWaternetLineData in waternetLineExtremeLookup) + { + extremeWaternetLineData.Value.Areas = Enumerable.Empty(); + } + } + + private void SetWaternetExtremeChartData(MacroStabilityInwardsWaternet waternet) + { + if (!waternet.Equals(currentWaternetExtreme)) + { + currentWaternetExtreme = waternet; + SetWaternetZonesChartData(waternet, waternetZonesExtremeChartData, + phreaticLineExtremeLookup, waternetLineExtremeLookup); + } + } + + private void SetWaternetDailyChartData(MacroStabilityInwardsWaternet waternet) + { + if (!waternet.Equals(currentWaternetDaily)) + { + currentWaternetDaily = waternet; + SetWaternetZonesChartData(waternet, waternetZonesDailyChartData, + phreaticLineDailyLookup, waternetLineDailyLookup); + } + } + + private static void SetWaternetZonesChartData(MacroStabilityInwardsWaternet waternet, ChartDataCollection chartData, + IDictionary phreaticLineLookup, + IDictionary waternetLineLookup) + { + chartData.Clear(); + phreaticLineLookup.Clear(); + waternetLineLookup.Clear(); + + foreach (MacroStabilityInwardsPhreaticLine phreaticLine in waternet.PhreaticLines) + { + ChartLineData phreaticLineChartData = MacroStabilityInwardsChartDataFactory.CreatePhreaticLineChartData(phreaticLine.Name); + chartData.Add(phreaticLineChartData); + phreaticLineLookup.Add(phreaticLine, phreaticLineChartData); + } + + foreach (MacroStabilityInwardsWaternetLine waternetLine in waternet.WaternetLines) + { + ChartMultipleAreaData waternetLineChartData = MacroStabilityInwardsChartDataFactory.CreateWaternetZoneChartData(waternetLine.Name); + chartData.Add(waternetLineChartData); + waternetLineLookup.Add(waternetLine, waternetLineChartData); + } + } } } \ No newline at end of file Index: Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Views/MacroStabilityInwardsOutputChartControlTest.cs =================================================================== diff -u -r1a3f904157a3f86e702ea8086bee67e780da7856 -r187efa574b622ec8fd7d3f82f367974e17dbf138 --- Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Views/MacroStabilityInwardsOutputChartControlTest.cs (.../MacroStabilityInwardsOutputChartControlTest.cs) (revision 1a3f904157a3f86e702ea8086bee67e780da7856) +++ Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Views/MacroStabilityInwardsOutputChartControlTest.cs (.../MacroStabilityInwardsOutputChartControlTest.cs) (revision 187efa574b622ec8fd7d3f82f367974e17dbf138) @@ -31,6 +31,7 @@ using Ringtoets.MacroStabilityInwards.Data.TestUtil; using Ringtoets.MacroStabilityInwards.Forms.TestUtil; using Ringtoets.MacroStabilityInwards.Forms.Views; +using Ringtoets.MacroStabilityInwards.KernelWrapper.TestUtil.Calculators; using Ringtoets.MacroStabilityInwards.Primitives; namespace Ringtoets.MacroStabilityInwards.Forms.Test.Views @@ -104,6 +105,7 @@ public void Data_SetValueWithOutput_ChartDatSet() { // Setup + using (new MacroStabilityInwardsCalculatorFactoryConfig()) using (var control = new MacroStabilityInwardsOutputChartControl()) { MacroStabilityInwardsSurfaceLine surfaceLine = GetSurfaceLineWithGeometry(); @@ -127,7 +129,7 @@ } [Test] - public void Data_SetValueWithoutOutput_ChartDataEmpty() + public void Data_SetValueWithoutOutputAndEmptyWaternet_ChartDataEmpty() { // Setup MacroStabilityInwardsSurfaceLine surfaceLine = GetSurfaceLineWithGeometry(); @@ -138,23 +140,45 @@ { SurfaceLine = surfaceLine, StochasticSoilProfile = stochasticSoilProfile - }, - Output = MacroStabilityInwardsOutputTestFactory.CreateOutput() + } }; + // Call + using (var control = new MacroStabilityInwardsOutputChartControl { Data = calculation }) { - // Precondition - MacroStabilityInwardsOutputViewChartDataAssert.AssertChartData(calculation, GetChartControl(control).Data); + // Assert + MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerAndEmptyWaternetChartData(control.Chart.Data); + } + } - // Call - control.Data = MacroStabilityInwardsCalculationScenarioFactory.CreateMacroStabilityInwardsCalculationScenarioWithValidInput(); + [Test] + public void Data_SetValueWithoutOutputAndWithWaternet_ChartDataEmpty() + { + // Setup + MacroStabilityInwardsSurfaceLine surfaceLine = GetSurfaceLineWithGeometry(); + MacroStabilityInwardsStochasticSoilProfile stochasticSoilProfile = GetStochasticSoilProfile2D(); + var calculation = new MacroStabilityInwardsCalculationScenario + { + InputParameters = + { + SurfaceLine = surfaceLine, + StochasticSoilProfile = stochasticSoilProfile + } + }; + // Call + using(new MacroStabilityInwardsCalculatorFactoryConfig()) + using (var control = new MacroStabilityInwardsOutputChartControl + { + Data = calculation + }) + { // Assert - MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerChartData(control.Chart.Data); + MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerAndWithWaternetChartData(control.Chart.Data); } } @@ -205,13 +229,14 @@ } }; + using(new MacroStabilityInwardsCalculatorFactoryConfig()) using (var control = new MacroStabilityInwardsOutputChartControl { Data = calculation }) { // Precondition - MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerChartData(control.Chart.Data); + MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerAndWithWaternetChartData(control.Chart.Data); calculation.Output = MacroStabilityInwardsOutputTestFactory.CreateOutput(); @@ -224,7 +249,7 @@ } [Test] - public void UpdateChartData_CalculationWithoutOutput_ChartDataUpdated() + public void UpdateChartData_CalculationWithoutOutputWithWaternet_ChartDataUpdated() { // Setup MacroStabilityInwardsSurfaceLine surfaceLine = GetSurfaceLineWithGeometry(); @@ -239,6 +264,7 @@ Output = MacroStabilityInwardsOutputTestFactory.CreateOutput() }; + using (new MacroStabilityInwardsCalculatorFactoryConfig()) using (var control = new MacroStabilityInwardsOutputChartControl { Data = calculation @@ -253,10 +279,44 @@ control.UpdateChartData(); // Assert - MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerChartData(control.Chart.Data); + MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerAndWithWaternetChartData(control.Chart.Data); } } + [Test] + public void UpdateChartData_CalculationWithoutOutputWithoutWaternet_ChartDataUpdated() + { + // Setup + MacroStabilityInwardsSurfaceLine surfaceLine = GetSurfaceLineWithGeometry(); + MacroStabilityInwardsStochasticSoilProfile stochasticSoilProfile = GetStochasticSoilProfile2D(); + var calculation = new MacroStabilityInwardsCalculationScenario + { + InputParameters = + { + SurfaceLine = surfaceLine, + StochasticSoilProfile = stochasticSoilProfile + }, + Output = MacroStabilityInwardsOutputTestFactory.CreateOutput() + }; + + using (var control = new MacroStabilityInwardsOutputChartControl + { + Data = calculation + }) + { + // Precondition + MacroStabilityInwardsOutputViewChartDataAssert.AssertChartData(calculation, GetChartControl(control).Data); + + calculation.ClearOutput(); + + // Call + control.UpdateChartData(); + + // Assert + MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerAndEmptyWaternetChartData(control.Chart.Data); + } + } + private static MacroStabilityInwardsStochasticSoilProfile GetStochasticSoilProfile2D() { var layers = new[] Index: Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Views/MacroStabilityInwardsOutputViewTest.cs =================================================================== diff -u -r1a3f904157a3f86e702ea8086bee67e780da7856 -r187efa574b622ec8fd7d3f82f367974e17dbf138 --- Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Views/MacroStabilityInwardsOutputViewTest.cs (.../MacroStabilityInwardsOutputViewTest.cs) (revision 1a3f904157a3f86e702ea8086bee67e780da7856) +++ Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.Test/Views/MacroStabilityInwardsOutputViewTest.cs (.../MacroStabilityInwardsOutputViewTest.cs) (revision 187efa574b622ec8fd7d3f82f367974e17dbf138) @@ -179,7 +179,7 @@ calculation.NotifyObservers(); // Then - MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerChartData(chartData); + MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerAndEmptyWaternetChartData(chartData); } } @@ -210,7 +210,7 @@ // Precondition ChartDataCollection chartData = GetChartControl(chartControl).Data; - MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerChartData(chartData); + MacroStabilityInwardsOutputViewChartDataAssert.AssertEmptyChartDataWithEmptySoilLayerAndEmptyWaternetChartData(chartData); // When calculation.Output = MacroStabilityInwardsOutputTestFactory.CreateOutput(); Index: Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.TestUtil/MacroStabilityInwardsOutputViewChartDataAssert.cs =================================================================== diff -u -r7585d2fd78627d94d55ffa16423af90a91e4efd4 -r187efa574b622ec8fd7d3f82f367974e17dbf138 --- Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.TestUtil/MacroStabilityInwardsOutputViewChartDataAssert.cs (.../MacroStabilityInwardsOutputViewChartDataAssert.cs) (revision 7585d2fd78627d94d55ffa16423af90a91e4efd4) +++ Ringtoets/MacroStabilityInwards/test/Ringtoets.MacroStabilityInwards.Forms.TestUtil/MacroStabilityInwardsOutputViewChartDataAssert.cs (.../MacroStabilityInwardsOutputViewChartDataAssert.cs) (revision 187efa574b622ec8fd7d3f82f367974e17dbf138) @@ -46,7 +46,9 @@ private const int dikeToeAtRiverIndex = 11; private const int dikeTopAtRiverIndex = 12; private const int surfaceLevelOutsideIndex = 13; - private const int nrOfChartData = 14; + private const int waternetZonesExtremeIndex = 14; + private const int waternetZonesDailyIndex = 15; + private const int nrOfChartData = 16; /// /// Asserts whether corresponds to . @@ -63,28 +65,64 @@ calculationScenario.InputParameters.StochasticSoilProfile.SoilProfile.Name, true, actual.Collection.ElementAt(soilProfileIndex)); + + MacroStabilityInwardsViewChartDataAssert.AssertWaternetChartData(calculationScenario.InputParameters.WaternetExtreme, + (ChartDataCollection) actual.Collection.ElementAt(waternetZonesExtremeIndex)); + MacroStabilityInwardsViewChartDataAssert.AssertWaternetChartData(calculationScenario.InputParameters.WaternetDaily, + (ChartDataCollection) actual.Collection.ElementAt(waternetZonesDailyIndex)); } /// - /// Asserts whether contains empty data without - /// any soil layer chart data. + /// Asserts whether contains empty data, + /// empty soil layer chart data and empty waternet chart data. /// /// The actual . /// Thrown when: /// /// is not empty; - /// the soil profile chart data contains chart data. + /// a soil layer chart data contains data; + /// a waternet layer chart data contains data. /// /// - public static void AssertEmptyChartDataWithoutSoilLayerData(ChartDataCollection chartDataCollection) + public static void AssertEmptyChartDataWithEmptySoilLayerAndWithWaternetChartData(ChartDataCollection chartDataCollection) { - var soilProfileData = (ChartDataCollection) chartDataCollection.Collection.ElementAt(soilProfileIndex); - CollectionAssert.IsEmpty(soilProfileData.Collection); - AssertEmptyChartData(chartDataCollection); + var waternetExtremeData = (ChartDataCollection) chartDataCollection.Collection.ElementAt(waternetZonesExtremeIndex); + var waternetDailyData = (ChartDataCollection) chartDataCollection.Collection.ElementAt(waternetZonesDailyIndex); + + CollectionAssert.IsNotEmpty(waternetExtremeData.Collection); + CollectionAssert.IsNotEmpty(waternetDailyData.Collection); + + Assert.IsFalse(waternetExtremeData.Collection.Any(c => c.HasData)); + Assert.IsFalse(waternetDailyData.Collection.Any(c => c.HasData)); + + AssertEmptyChartDataWithEmptySoilLayerChartData(chartDataCollection); } /// /// Asserts whether contains empty data and + /// empty soil layer chart data and no waternet chart data. + /// + /// The actual . + /// Thrown when: + /// + /// is not empty; + /// a soil layer chart data contains data; + /// a waternet layer is present. + /// + /// + public static void AssertEmptyChartDataWithEmptySoilLayerAndEmptyWaternetChartData(ChartDataCollection chartDataCollection) + { + var waternetExtremeData = (ChartDataCollection) chartDataCollection.Collection.ElementAt(waternetZonesExtremeIndex); + var waternetDailyData = (ChartDataCollection) chartDataCollection.Collection.ElementAt(waternetZonesDailyIndex); + + CollectionAssert.IsEmpty(waternetExtremeData.Collection); + CollectionAssert.IsEmpty(waternetDailyData.Collection); + + AssertEmptyChartDataWithEmptySoilLayerChartData(chartDataCollection); + } + + /// + /// Asserts whether contains empty data and /// empty soil layer chart data. /// /// The actual . @@ -94,7 +132,7 @@ /// a soil layer chart data contains data. /// /// - public static void AssertEmptyChartDataWithEmptySoilLayerChartData(ChartDataCollection chartDataCollection) + private static void AssertEmptyChartDataWithEmptySoilLayerChartData(ChartDataCollection chartDataCollection) { var soilProfileData = (ChartDataCollection) chartDataCollection.Collection.ElementAt(soilProfileIndex); CollectionAssert.IsNotEmpty(soilProfileData.Collection); @@ -130,6 +168,8 @@ var dikeToeAtRiverData = (ChartPointData) chartDataArray[dikeToeAtRiverIndex]; var dikeTopAtRiverData = (ChartPointData) chartDataArray[dikeTopAtRiverIndex]; var surfaceLevelOutsideData = (ChartPointData) chartDataArray[surfaceLevelOutsideIndex]; + var waternetZonesExtremeData = (ChartDataCollection) chartDataArray[waternetZonesExtremeIndex]; + var waternetZonesDailyData = (ChartDataCollection) chartDataArray[waternetZonesDailyIndex]; CollectionAssert.IsEmpty(surfaceLineData.Points); CollectionAssert.IsEmpty(surfaceLevelInsideData.Points); @@ -159,6 +199,8 @@ Assert.AreEqual("Teen dijk buitenwaarts", dikeToeAtRiverData.Name); Assert.AreEqual("Kruin buitentalud", dikeTopAtRiverData.Name); Assert.AreEqual("Maaiveld buitenwaarts", surfaceLevelOutsideData.Name); + Assert.AreEqual("Zones extreem", waternetZonesExtremeData.Name); + Assert.AreEqual("Zones dagelijks", waternetZonesDailyData.Name); } } } \ No newline at end of file