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 =
{