Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategy.cs =================================================================== diff -u -r583456a0f5395189a54a8cedf4e4a7b40945d990 -r7d572f6fd93d08cbdc472dd334ed3655b5d7ae36 --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategy.cs (.../RingtoetsPipingSurfaceLineUpdateDataStrategy.cs) (revision 583456a0f5395189a54a8cedf4e4a7b40945d990) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategy.cs (.../RingtoetsPipingSurfaceLineUpdateDataStrategy.cs) (revision 7d572f6fd93d08cbdc472dd334ed3655b5d7ae36) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Core.Common.Base.Data; using Ringtoets.Common.Data.UpdateDataStrategies; using Ringtoets.Common.Service; using Ringtoets.Piping.Data; @@ -101,6 +102,8 @@ affectedObjects.AddRange(UpdateSurfaceLineDependentData(surfaceLineToUpdate)); affectedObjects.AddRange(UpdateStochasticSoilModel(surfaceLineToUpdate)); + + ValidateEntryAndExitPoints(surfaceLineToUpdate); } return affectedObjects; @@ -153,6 +156,28 @@ failureMechanism.StochasticSoilModels); } + private void ValidateEntryAndExitPoints(RingtoetsPipingSurfaceLine surfaceLine) + { + IEnumerable affectedCalculations = GetAffectedCalculationWithSurfaceLine(surfaceLine); + foreach (PipingCalculation affectedCalculation in affectedCalculations) + { + PipingInput inputParameters = affectedCalculation.InputParameters; + if (!ValidateLocalCoordinateOnSurfaceLine(surfaceLine, inputParameters.EntryPointL)) + { + inputParameters.EntryPointL = RoundedDouble.NaN; + } + if (!ValidateLocalCoordinateOnSurfaceLine(surfaceLine, inputParameters.ExitPointL)) + { + inputParameters.ExitPointL = RoundedDouble.NaN; + } + } + } + + private static bool ValidateLocalCoordinateOnSurfaceLine(RingtoetsPipingSurfaceLine surfaceLine, double localCoordinateL) + { + return surfaceLine.ValidateInRange(localCoordinateL); + } + #endregion #region Removing Data Functions Index: Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs =================================================================== diff -u -r66239a42b315209acc4d124200c58d8be1a18195 -r7d572f6fd93d08cbdc472dd334ed3655b5d7ae36 --- Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs (.../RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs) (revision 66239a42b315209acc4d124200c58d8be1a18195) +++ Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs (.../RingtoetsPipingSurfaceLineUpdateDataStrategyTest.cs) (revision 7d572f6fd93d08cbdc472dd334ed3655b5d7ae36) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Linq; using Core.Common.Base; +using Core.Common.Base.Data; using Core.Common.Base.Geometry; using NUnit.Framework; using Ringtoets.Common.Data.UpdateDataStrategies; @@ -906,6 +907,148 @@ }, affectedObjects); } + [Test] + public void UpdateSurfaceLinesWithImportedData_EntryPointNotOnSurfaceLineAnymore_SetsEntryPointToNaN() + { + // Setup + const string updatedSurfaceLineName = "Name A"; + var affectedSurfaceLine = new RingtoetsPipingSurfaceLine + { + Name = updatedSurfaceLineName + }; + affectedSurfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, 0), + new Point3D(1, 0, 2), + new Point3D(2, 0, 3), + new Point3D(3, 0, 0), + new Point3D(4, 0, 2), + new Point3D(5, 0, 3) + }); + var affectedCalculation = new PipingCalculation(new GeneralPipingInput()) + { + InputParameters = + { + SurfaceLine = affectedSurfaceLine, + EntryPointL = (RoundedDouble) 2 + }, + Output = new TestPipingOutput(), + SemiProbabilisticOutput = new TestPipingSemiProbabilisticOutput() + }; + + + var collection = new RingtoetsPipingSurfaceLineCollection(); + collection.AddRange(new[] + { + affectedSurfaceLine + }, sourceFilePath); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.CalculationsGroup.Children.Add(affectedCalculation); + + RingtoetsPipingSurfaceLine importedAffectedSurfaceLine = DeepCloneSurfaceLine(affectedSurfaceLine); + importedAffectedSurfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, 0), + new Point3D(1, 0, 1) + }); + + var strategy = new RingtoetsPipingSurfaceLineUpdateDataStrategy(failureMechanism); + + // Call + IEnumerable affectedObjects = strategy.UpdateSurfaceLinesWithImportedData(collection, + new[] + { + importedAffectedSurfaceLine, + }, "path").ToArray(); + + // Assert + Assert.IsFalse(affectedCalculation.HasOutput); + PipingInput affectedInput = affectedCalculation.InputParameters; + Assert.AreSame(affectedSurfaceLine, affectedInput.SurfaceLine); + Assert.IsNaN(affectedInput.EntryPointL); + CollectionAssert.AreEqual(importedAffectedSurfaceLine.Points, affectedSurfaceLine.Points); + + CollectionAssert.AreEquivalent(new IObservable[] + { + affectedCalculation, + affectedInput, + affectedSurfaceLine + }, affectedObjects); + } + + [Test] + public void UpdateSurfaceLinesWithImportedData_ExitPointNotOnSurfaceLineAnymore_SetsExitPointToNaN() + { + // Setup + const string updatedSurfaceLineName = "Name A"; + var affectedSurfaceLine = new RingtoetsPipingSurfaceLine + { + Name = updatedSurfaceLineName + }; + affectedSurfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, 0), + new Point3D(1, 0, 2), + new Point3D(2, 0, 3), + new Point3D(3, 0, 0), + new Point3D(4, 0, 2), + new Point3D(5, 0, 3) + }); + var affectedCalculation = new PipingCalculation(new GeneralPipingInput()) + { + InputParameters = + { + SurfaceLine = affectedSurfaceLine, + EntryPointL = (RoundedDouble) 0, + ExitPointL = (RoundedDouble) 3 + }, + Output = new TestPipingOutput(), + SemiProbabilisticOutput = new TestPipingSemiProbabilisticOutput() + }; + + + var collection = new RingtoetsPipingSurfaceLineCollection(); + collection.AddRange(new[] + { + affectedSurfaceLine + }, sourceFilePath); + + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.CalculationsGroup.Children.Add(affectedCalculation); + + RingtoetsPipingSurfaceLine importedAffectedSurfaceLine = DeepCloneSurfaceLine(affectedSurfaceLine); + importedAffectedSurfaceLine.SetGeometry(new[] + { + new Point3D(0, 0, 1), + new Point3D(1, 0, 2) + }); + + var strategy = new RingtoetsPipingSurfaceLineUpdateDataStrategy(failureMechanism); + + // Call + IEnumerable affectedObjects = strategy.UpdateSurfaceLinesWithImportedData(collection, + new[] + { + importedAffectedSurfaceLine, + }, "path").ToArray(); + + // Assert + Assert.IsFalse(affectedCalculation.HasOutput); + PipingInput affectedInput = affectedCalculation.InputParameters; + Assert.AreSame(affectedSurfaceLine, affectedInput.SurfaceLine); + Assert.AreEqual(0, affectedInput.EntryPointL.Value); + Assert.IsNaN(affectedInput.ExitPointL); + CollectionAssert.AreEqual(importedAffectedSurfaceLine.Points, affectedSurfaceLine.Points); + + CollectionAssert.AreEquivalent(new IObservable[] + { + affectedCalculation, + affectedInput, + affectedSurfaceLine + }, affectedObjects); + } + private static RingtoetsPipingSurfaceLine CreateValidSurfaceLineForCalculations() { var surfaceLine = new RingtoetsPipingSurfaceLine