Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/PipingCalculationConfigurationHelper.cs =================================================================== diff -u -r3462d84f3304a35ba5ce26c7d3afc9c31cdf9205 -rc046d22cfc010414d21bda8cc15806530e315ca3 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/PipingCalculationConfigurationHelper.cs (.../PipingCalculationConfigurationHelper.cs) (revision 3462d84f3304a35ba5ce26c7d3afc9c31cdf9205) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/PipingCalculationConfigurationHelper.cs (.../PipingCalculationConfigurationHelper.cs) (revision c046d22cfc010414d21bda8cc15806530e315ca3) @@ -121,6 +121,23 @@ return soilModelObjectsForCalculation; } + /// + /// Determines if the surfaceline of a calculation is instersecting with the section reference line. + /// + /// The calculation surface line. + /// The line segments that defines the reference line. + /// true when intersecting. false otherwise. + /// Thrown when contains no elements. + public static bool IsSurfaceLineIntersectionWithReferenceLineInSection(RingtoetsPipingSurfaceLine surfaceLine, IEnumerable lineSegments) + { + if (surfaceLine == null) + { + return false; + } + var minimalDistance = lineSegments.Min(segment => segment.GetEuclideanDistanceToPoint(surfaceLine.ReferenceLineIntersectionWorldPoint)); + return minimalDistance < 1.0e-6; + } + private static IPipingCalculationItem CreateCalculationGroup(RingtoetsPipingSurfaceLine surfaceLine, IEnumerable soilModels, GeneralPipingInput generalInput, SemiProbabilisticPipingInput semiProbabilisticInput) { var pipingCalculationGroup = new PipingCalculationGroup(surfaceLine.Name, true); Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs =================================================================== diff -u -r63f8b9c87db76c0aac38ac9a47530962d06849ae -rc046d22cfc010414d21bda8cc15806530e315ca3 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision 63f8b9c87db76c0aac38ac9a47530962d06849ae) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision c046d22cfc010414d21bda8cc15806530e315ca3) @@ -328,16 +328,6 @@ pipingFailureMechanism.StochasticSoilModels.Any(); } - private static bool IsSurfaceLineIntersectionWithReferenceLineInSection(RingtoetsPipingSurfaceLine surfaceLine, IEnumerable lineSegments) - { - if (surfaceLine == null) - { - return false; - } - var minimalDistance = lineSegments.Min(segment => segment.GetEuclideanDistanceToPoint(surfaceLine.ReferenceLineIntersectionWorldPoint)); - return minimalDistance < 1.0e-6; - } - private void FillAvailableSoilModelsList(DataGridViewRow dataGridViewRow) { var rowData = (PipingCalculationRow) dataGridViewRow.DataBoundItem; @@ -411,7 +401,7 @@ var lineSegments = Math2D.ConvertLinePointsToLineSegments(failureMechanismSection.Points); var pipingCalculations = pipingCalculationGroup .GetPipingCalculations() - .Where(pc => IsSurfaceLineIntersectionWithReferenceLineInSection(pc.InputParameters.SurfaceLine, lineSegments)); + .Where(pc => PipingCalculationConfigurationHelper.IsSurfaceLineIntersectionWithReferenceLineInSection(pc.InputParameters.SurfaceLine, lineSegments)); updatingDataSource = true; @@ -805,7 +795,7 @@ foreach (var failureMechanismSectionResult in pipingFailureMechanism.SectionResults) { var lineSegments = Math2D.ConvertLinePointsToLineSegments(failureMechanismSectionResult.Section.Points); - var calculationScenarios = pipingCalculationGroup.GetPipingCalculations().Where(pc => IsSurfaceLineIntersectionWithReferenceLineInSection(pc.InputParameters.SurfaceLine, lineSegments)).ToList(); + var calculationScenarios = pipingCalculationGroup.GetPipingCalculations().Where(pc => PipingCalculationConfigurationHelper.IsSurfaceLineIntersectionWithReferenceLineInSection(pc.InputParameters.SurfaceLine, lineSegments)).ToList(); if (calculationScenarios.Any()) { Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs =================================================================== diff -u -rc7c07db38829afdc5965c331844e1d39123944ff -rc046d22cfc010414d21bda8cc15806530e315ca3 --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision c7c07db38829afdc5965c331844e1d39123944ff) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/PipingGuiPlugin.cs (.../PipingGuiPlugin.cs) (revision c046d22cfc010414d21bda8cc15806530e315ca3) @@ -24,6 +24,7 @@ using System.Drawing; using System.Linq; using System.Windows.Forms; +using Core.Common.Base.Geometry; using Core.Common.Controls.TreeView; using Core.Common.Gui.ContextMenu; using Core.Common.Gui.Forms; @@ -728,6 +729,8 @@ GeneratePipingCalculations(nodeData.WrappedData, view.SelectedSurfaceLines, nodeData.AvailableStochasticSoilModels, nodeData.PipingFailureMechanism.GeneralInput, nodeData.PipingFailureMechanism.SemiProbabilisticInput); nodeData.NotifyObservers(); + + AddCalculationScenariosToFailureMechanismSectionResult(nodeData.WrappedData, nodeData.PipingFailureMechanism); } private void GeneratePipingCalculations(PipingCalculationGroup target, IEnumerable surfaceLines, IEnumerable soilModels, GeneralPipingInput generalInput, SemiProbabilisticPipingInput semiProbabilisticInput) @@ -738,6 +741,20 @@ } } + private void AddCalculationScenariosToFailureMechanismSectionResult(PipingCalculationGroup pipingCalculationGroup, PipingFailureMechanism pipingFailureMechanism) + { + foreach (var failureMechanismSectionResult in pipingFailureMechanism.SectionResults) + { + var lineSegments = Math2D.ConvertLinePointsToLineSegments(failureMechanismSectionResult.Section.Points); + var calculationScenarios = pipingCalculationGroup.GetPipingCalculations().Where(pc => PipingCalculationConfigurationHelper.IsSurfaceLineIntersectionWithReferenceLineInSection(pc.InputParameters.SurfaceLine, lineSegments)).ToList(); + + if (calculationScenarios.Any()) + { + failureMechanismSectionResult.CalculationScenarios.AddRange(calculationScenarios); + } + } + } + private StrictContextMenuItem CreateCalculateAllItem(PipingCalculationGroup group) { var menuItem = new StrictContextMenuItem( Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PipingCalculationConfigurationHelperTest.cs =================================================================== diff -u -rc7c07db38829afdc5965c331844e1d39123944ff -rc046d22cfc010414d21bda8cc15806530e315ca3 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PipingCalculationConfigurationHelperTest.cs (.../PipingCalculationConfigurationHelperTest.cs) (revision c7c07db38829afdc5965c331844e1d39123944ff) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/PipingCalculationConfigurationHelperTest.cs (.../PipingCalculationConfigurationHelperTest.cs) (revision c046d22cfc010414d21bda8cc15806530e315ca3) @@ -25,6 +25,7 @@ using Core.Common.Base.Geometry; using Core.Common.TestUtil; using NUnit.Framework; +using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Piping.Data; using Ringtoets.Piping.Primitives; @@ -1147,5 +1148,90 @@ } #endregion + + #region IsSurfaceLineIntersectionWithReferenceLineInSection + + [Test] + public void IsSurfaceLineIntersectionWithReferenceLineInSection_SurfaceLineNull_ReturnsFalse() + { + // Call + var intersects = PipingCalculationConfigurationHelper.IsSurfaceLineIntersectionWithReferenceLineInSection(null, Enumerable.Empty()); + + // Assert + Assert.IsFalse(intersects); + } + + [Test] + public void IsSurfaceLineIntersectionWithReferenceLineInSection_EmptySegmentCollection_ThrowsInvalidOperationException() + { + // Setup + var surfaceLine = new RingtoetsPipingSurfaceLine(); + + // Call + TestDelegate call = () => PipingCalculationConfigurationHelper.IsSurfaceLineIntersectionWithReferenceLineInSection(surfaceLine, Enumerable.Empty()); + + // Assert + Assert.Throws(call); + } + + [Test] + public void IsSurfaceLineIntersectionWithReferenceLineInSection_SurfaceLineIntersectsReferenceline_ReturnsTrue() + { + // Setup + var surfaceLine = new RingtoetsPipingSurfaceLine + { + ReferenceLineIntersectionWorldPoint = new Point2D(0.0, 0.0) + }; + surfaceLine.SetGeometry(new[] + { + new Point3D(0.0, 5.0, 0.0), + new Point3D(0.0, 0.0, 1.0), + new Point3D(0.0, -5.0, 0.0) + }); + var referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(new[] + { + new Point2D(0.0, 0.0), + new Point2D(10.0, 0.0) + }); + var lineSegments = Math2D.ConvertLinePointsToLineSegments(referenceLine.Points); + + // Call + var intersects = PipingCalculationConfigurationHelper.IsSurfaceLineIntersectionWithReferenceLineInSection(surfaceLine, lineSegments); + + // Assert + Assert.IsTrue(intersects); + } + + [Test] + public void IsSurfaceLineIntersectionWithReferenceLineInSection_SurfaceLineDoesNotIntersectsReferenceline_ReturnsFalse() + { + // Setup + var surfaceLine = new RingtoetsPipingSurfaceLine + { + ReferenceLineIntersectionWorldPoint = new Point2D(0.0, 0.0) + }; + surfaceLine.SetGeometry(new[] + { + new Point3D(0.0, 5.0, 0.0), + new Point3D(0.0, 0.0, 1.0), + new Point3D(0.0, -5.0, 0.0) + }); + var referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(new[] + { + new Point2D(10.0, 0.0), + new Point2D(20.0, 0.0) + }); + var lineSegments = Math2D.ConvertLinePointsToLineSegments(referenceLine.Points); + + // Call + var intersects = PipingCalculationConfigurationHelper.IsSurfaceLineIntersectionWithReferenceLineInSection(surfaceLine, lineSegments); + + // Assert + Assert.IsFalse(intersects); + } + + #endregion } } \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -rc7c07db38829afdc5965c331844e1d39123944ff -rc046d22cfc010414d21bda8cc15806530e315ca3 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision c7c07db38829afdc5965c331844e1d39123944ff) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/TreeNodeInfos/PipingCalculationGroupContextTreeNodeInfoTest.cs (.../PipingCalculationGroupContextTreeNodeInfoTest.cs) (revision c046d22cfc010414d21bda8cc15806530e315ca3) @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using Core.Common.Base; +using Core.Common.Base.Geometry; using Core.Common.Controls.TreeView; using Core.Common.Gui; using Core.Common.Gui.Commands; @@ -14,6 +16,7 @@ using Rhino.Mocks; using Ringtoets.Common.Data; using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Piping.Data; using Ringtoets.Piping.Data.TestUtil; using Ringtoets.Piping.Forms.PresentationObjects; @@ -1046,6 +1049,118 @@ } [Test] + public void GivenPipingCalculationsViewGenerateScenariosButtonClicked_WhenSurfaceLineSelectedAndDialogClosed_ThenUpdateSectionResultScenarios() + { + // Given + var gui = mocks.StrictMock(); + var treeViewControl = mocks.StrictMock(); + var menuBuilder = new CustomItemsOnlyContextMenuBuilder(); + + var group = new PipingCalculationGroup(); + + var pipingFailureMechanism = new PipingFailureMechanism(); + var assessmentSectionMock = mocks.StrictMock(); + + var mainWindow = mocks.Stub(); + var parentData = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionMock); + + var surfaceLine1 = new RingtoetsPipingSurfaceLine + { + Name = "Surface line 1", + ReferenceLineIntersectionWorldPoint = new Point2D(0.0, 0.0) + }; + + surfaceLine1.SetGeometry(new[] + { + new Point3D(0.0, 5.0, 0.0), + new Point3D(0.0, 0.0, 1.0), + new Point3D(0.0, -5.0, 0.0) + }); + + var surfaceLine2 = new RingtoetsPipingSurfaceLine + { + Name = "Surface line 2", + ReferenceLineIntersectionWorldPoint = new Point2D(5.0, 0.0) + }; + + surfaceLine2.SetGeometry(new[] + { + new Point3D(5.0, 5.0, 0.0), + new Point3D(5.0, 0.0, 1.0), + new Point3D(5.0, -5.0, 0.0) + }); + + var surfaceLines = new[] + { + surfaceLine1, + surfaceLine2 + }; + pipingFailureMechanism.AddSection(new FailureMechanismSection("Section 1", new List + { + new Point2D(0.0, 0.0), + new Point2D(5.0, 0.0) + })); + + pipingFailureMechanism.AddSection(new FailureMechanismSection("Section 2", new List + { + new Point2D(5.0, 0.0), + new Point2D(10.0, 0.0) + })); + + var nodeData = new PipingCalculationGroupContext(group, + surfaceLines, + new[] + { + new TestStochasticSoilModel + { + Geometry = + { + new Point2D(0.0, 0.0), new Point2D(5.0, 0.0) + }, + } + }, + pipingFailureMechanism, + assessmentSectionMock); + + gui.Expect(cmp => cmp.Get(nodeData, treeViewControl)).Return(menuBuilder); + gui.Expect(g => g.MainWindow).Return(mainWindow); + + mocks.ReplayAll(); + + plugin.Gui = gui; + + DialogBoxHandler = (name, wnd) => + { + var selectionDialog = new FormTester(name).TheObject as PipingSurfaceLineSelectionDialog; + var grid = new ControlTester("SurfaceLineDataGrid", selectionDialog).TheObject as DataGridView; + + grid.Rows[0].Cells[0].Value = true; + + new ButtonTester("OkButton", selectionDialog).Click(); + }; + + var contextMenu = info.ContextMenuStrip(nodeData, parentData, treeViewControl); + + // When + contextMenu.Items[contextMenuAddGenerateCalculationsIndex].PerformClick(); + + // Then + var failureMechanismSectionResult1 = pipingFailureMechanism.SectionResults.First(); + var failureMechanismSectionResult2 = pipingFailureMechanism.SectionResults.ElementAt(1); + + Assert.AreEqual(2, failureMechanismSectionResult1.CalculationScenarios.Count); + + foreach (var calculationScenario in failureMechanismSectionResult1.CalculationScenarios) + { + Assert.IsInstanceOf(calculationScenario); + } + + CollectionAssert.IsEmpty(failureMechanismSectionResult2.CalculationScenarios); + + mocks.VerifyAll(); + } + + [Test] public void CanRenameNode_ParentIsPipingFailureMechanismContext_ReturnFalse() { // Setup Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingCalculationsViewTest.cs =================================================================== diff -u -r3462d84f3304a35ba5ce26c7d3afc9c31cdf9205 -rc046d22cfc010414d21bda8cc15806530e315ca3 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingCalculationsViewTest.cs (.../PipingCalculationsViewTest.cs) (revision 3462d84f3304a35ba5ce26c7d3afc9c31cdf9205) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingCalculationsViewTest.cs (.../PipingCalculationsViewTest.cs) (revision c046d22cfc010414d21bda8cc15806530e315ca3) @@ -639,7 +639,7 @@ } [Test] - public void GivenPipingCalculationsViewGenerateScenariosButtonClicked_WhenSurfaceLineSelectedAndDialogClosed_ThenNotifySectionResult() + public void GivenPipingCalculationsViewGenerateScenariosButtonClicked_WhenSurfaceLineSelectedAndDialogClosed_ThenUpdateSectionResultScenarios() { // Given var surfaceLine1 = new RingtoetsPipingSurfaceLine @@ -678,7 +678,7 @@ }, StochasticSoilModels = { - new TestStochasticSoilModel() + new TestStochasticSoilModel { Geometry = {