Index: Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/PipingSurfaceLinesCsvImporter.cs =================================================================== diff -u -re09cea5c0eb01dd5dcfe438bd191fb5166924ff0 -r130efbf0e33a64b60dc853347a93f182bf6f1749 --- Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/PipingSurfaceLinesCsvImporter.cs (.../PipingSurfaceLinesCsvImporter.cs) (revision e09cea5c0eb01dd5dcfe438bd191fb5166924ff0) +++ Ringtoets/Piping/src/Ringtoets.Piping.Plugin/FileImporter/PipingSurfaceLinesCsvImporter.cs (.../PipingSurfaceLinesCsvImporter.cs) (revision 130efbf0e33a64b60dc853347a93f182bf6f1749) @@ -168,10 +168,15 @@ List readCharacteristicPointsLocationNames = readCharacteristicPointsLocations.Select(cpl => cpl.Name).ToList(); foreach (var readSurfaceLine in readSurfaceLines) { - if (!CheckReferenceLineInterSections(readSurfaceLine, target.AssessmentSection.ReferenceLine)) + ReferenceLineIntersectionResult result = CheckReferenceLineInterSections(readSurfaceLine, target.AssessmentSection.ReferenceLine); + if (result.TypeOfIntersection != ReferenceLineIntersectionsResult.OneIntersection) { continue; } + else + { + readSurfaceLine.ReferenceLineIntersectionWorldPoint = result.IntersectionPoint; + } CharacteristicPoints characteristicPoints = readCharacteristicPointsLocations.FirstOrDefault(cpl => cpl.Name == readSurfaceLine.Name); if (characteristicPoints != null) @@ -193,57 +198,88 @@ } } - private bool CheckReferenceLineInterSections(RingtoetsPipingSurfaceLine readSurfaceLine, ReferenceLine referenceLine) + private ReferenceLineIntersectionResult CheckReferenceLineInterSections(RingtoetsPipingSurfaceLine readSurfaceLine, ReferenceLine referenceLine) { - ReferenceLineIntersectionsResult result = GetReferenceLineIntersections(referenceLine, readSurfaceLine); + ReferenceLineIntersectionResult result = GetReferenceLineIntersections(referenceLine, readSurfaceLine); - if (result == ReferenceLineIntersectionsResult.NoIntersections) + if (result.TypeOfIntersection == ReferenceLineIntersectionsResult.NoIntersections) { log.ErrorFormat(RingtoetsPluginResources.PipingSurfaceLinesCsvImporter_CheckReferenceLineInterSections_Surfaceline_0_does_not_correspond_to_current_referenceline_1_, readSurfaceLine.Name, RingtoetsPluginResources.PipingSurfaceLinesCsvImporter_CheckReferenceLineInterSections_This_could_be_caused_coordinates_being_local_coordinate_system); } - else if (result == ReferenceLineIntersectionsResult.MultipleIntersectionsOrOverlap) + else if (result.TypeOfIntersection == ReferenceLineIntersectionsResult.MultipleIntersectionsOrOverlap) { log.ErrorFormat(RingtoetsPluginResources.PipingSurfaceLinesCsvImporter_CheckReferenceLineInterSections_Surfaceline_0_does_not_correspond_to_current_referenceline, readSurfaceLine.Name); } - return result == ReferenceLineIntersectionsResult.OneIntersection; + return result; } - private static ReferenceLineIntersectionsResult GetReferenceLineIntersections(ReferenceLine referenceLine, RingtoetsPipingSurfaceLine surfaceLine) + private class ReferenceLineIntersectionResult { + private ReferenceLineIntersectionResult(ReferenceLineIntersectionsResult typeOfIntersection, Point2D intersectionPoint) + { + TypeOfIntersection = typeOfIntersection; + IntersectionPoint = intersectionPoint; + } + + public static ReferenceLineIntersectionResult CreateNoSingleIntersectionResult() + { + return new ReferenceLineIntersectionResult(ReferenceLineIntersectionsResult.NoIntersections, null); + } + + public static ReferenceLineIntersectionResult CreateIntersectionResult(Point2D point) + { + return new ReferenceLineIntersectionResult(ReferenceLineIntersectionsResult.OneIntersection, point); + } + + public static ReferenceLineIntersectionResult CreateMultipleIntersectionsOrOverlapResult() + { + return new ReferenceLineIntersectionResult(ReferenceLineIntersectionsResult.MultipleIntersectionsOrOverlap, null); + } + + public ReferenceLineIntersectionsResult TypeOfIntersection { get; private set; } + public Point2D IntersectionPoint { get; private set; } + } + + private static ReferenceLineIntersectionResult GetReferenceLineIntersections(ReferenceLine referenceLine, RingtoetsPipingSurfaceLine surfaceLine) + { var surfaceLineSegments = Math2D.ConvertLinePointsToLineSegments(surfaceLine.Points.Select(p => new Point2D(p.X, p.Y))); Segment2D[] referenceLineSegments = Math2D.ConvertLinePointsToLineSegments(referenceLine.Points).ToArray(); return GetReferenceLineIntersectionsResult(surfaceLineSegments, referenceLineSegments); } - private static ReferenceLineIntersectionsResult GetReferenceLineIntersectionsResult(IEnumerable surfaceLineSegments, Segment2D[] referenceLineSegments) + private static ReferenceLineIntersectionResult GetReferenceLineIntersectionsResult(IEnumerable surfaceLineSegments, Segment2D[] referenceLineSegments) { - ReferenceLineIntersectionsResult intersectionResult = ReferenceLineIntersectionsResult.NoIntersections; + Point2D intersectionPoint = null; foreach (Segment2D surfaceLineSegment in surfaceLineSegments) { foreach (Segment2D referenceLineSegment in referenceLineSegments) { Segment2DIntersectSegment2DResult result = Math2D.GetIntersectionBetweenSegments(surfaceLineSegment, referenceLineSegment); + if (result.IntersectionType == Intersection2DType.Intersects) { - if (intersectionResult == ReferenceLineIntersectionsResult.OneIntersection) + if (intersectionPoint != null) { // Early exit as multiple intersections is a return result: - return ReferenceLineIntersectionsResult.MultipleIntersectionsOrOverlap; + return ReferenceLineIntersectionResult.CreateMultipleIntersectionsOrOverlapResult(); } - intersectionResult = ReferenceLineIntersectionsResult.OneIntersection; + intersectionPoint = result.IntersectionPoints[0]; } + if (result.IntersectionType == Intersection2DType.Overlapping) { // Early exit as overlap is a return result: - return ReferenceLineIntersectionsResult.MultipleIntersectionsOrOverlap; + return ReferenceLineIntersectionResult.CreateMultipleIntersectionsOrOverlapResult(); } } } - return intersectionResult; + return intersectionPoint != null ? + ReferenceLineIntersectionResult.CreateIntersectionResult(intersectionPoint) : + ReferenceLineIntersectionResult.CreateNoSingleIntersectionResult(); } private static void SetCharacteristicPointsOnSurfaceLine(RingtoetsPipingSurfaceLine readSurfaceLine, CharacteristicPoints characteristicPointsLocation) Index: Ringtoets/Piping/src/Ringtoets.Piping.Primitives/RingtoetsPipingSurfaceLine.cs =================================================================== diff -u -r1b4f4720632f9a691837fa97e777a4637b6739c8 -r130efbf0e33a64b60dc853347a93f182bf6f1749 --- Ringtoets/Piping/src/Ringtoets.Piping.Primitives/RingtoetsPipingSurfaceLine.cs (.../RingtoetsPipingSurfaceLine.cs) (revision 1b4f4720632f9a691837fa97e777a4637b6739c8) +++ Ringtoets/Piping/src/Ringtoets.Piping.Primitives/RingtoetsPipingSurfaceLine.cs (.../RingtoetsPipingSurfaceLine.cs) (revision 130efbf0e33a64b60dc853347a93f182bf6f1749) @@ -103,6 +103,8 @@ /// public Point3D DikeToeAtPolder { get; private set; } + public Point2D ReferenceLineIntersectionWorldPoint { get; set; } + /// /// Sets the geometry of the surfaceline. /// Index: Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/RingtoetsPipingSurfaceLineTest.cs =================================================================== diff -u -r10779bb6a6db2d00f4627b2bc190e7e35e1fee3e -r130efbf0e33a64b60dc853347a93f182bf6f1749 --- Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/RingtoetsPipingSurfaceLineTest.cs (.../RingtoetsPipingSurfaceLineTest.cs) (revision 10779bb6a6db2d00f4627b2bc190e7e35e1fee3e) +++ Ringtoets/Piping/test/Ringtoets.Piping.Data.Test/RingtoetsPipingSurfaceLineTest.cs (.../RingtoetsPipingSurfaceLineTest.cs) (revision 130efbf0e33a64b60dc853347a93f182bf6f1749) @@ -45,9 +45,25 @@ CollectionAssert.IsEmpty(surfaceLine.Points); Assert.IsNull(surfaceLine.StartingWorldPoint); Assert.IsNull(surfaceLine.EndingWorldPoint); + Assert.IsNull(surfaceLine.ReferenceLineIntersectionWorldPoint); } [Test] + public void ReferenceLineIntersectionWorldPoint_SetNewValue_GetNewlySetValue() + { + // Setup + var surfaceLine = new RingtoetsPipingSurfaceLine(); + + var point = new Point2D(1.2, 3.4); + + // Call + surfaceLine.ReferenceLineIntersectionWorldPoint = point; + + // Assert + Assert.AreEqual(point, surfaceLine.ReferenceLineIntersectionWorldPoint); + } + + [Test] public void SetGeometry_EmptyCollection_PointsSetEmptyAndNullStartAndEndWorldPoints() { // Setup Index: Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/PipingSurfaceLinesCsvImporterTest.cs =================================================================== diff -u -r619f3fd6896edb6d7f6ac160fcfc66054883dce4 -r130efbf0e33a64b60dc853347a93f182bf6f1749 --- Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/PipingSurfaceLinesCsvImporterTest.cs (.../PipingSurfaceLinesCsvImporterTest.cs) (revision 619f3fd6896edb6d7f6ac160fcfc66054883dce4) +++ Ringtoets/Piping/test/Ringtoets.Piping.Plugin.Test/FileImporter/PipingSurfaceLinesCsvImporterTest.cs (.../PipingSurfaceLinesCsvImporterTest.cs) (revision 130efbf0e33a64b60dc853347a93f182bf6f1749) @@ -12,6 +12,7 @@ using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.PresentationObjects; using Ringtoets.Piping.Plugin.FileImporter; + using PipingFormsResources = Ringtoets.Piping.Forms.Properties.Resources; using PipingIOResources = Ringtoets.Piping.IO.Properties.Resources; using PipingDataResources = Ringtoets.Piping.Data.Properties.Resources; @@ -198,11 +199,13 @@ Assert.AreEqual("Rotterdam1", firstSurfaceLine.Name); Assert.AreEqual(8, firstSurfaceLine.Points.Length); Assert.AreEqual(427776.654093, firstSurfaceLine.StartingWorldPoint.Y); + AssertAreEqualPoint2D(new Point2D(94270.0, 427795.313769642), firstSurfaceLine.ReferenceLineIntersectionWorldPoint); var secondSurfaceLine = importTargetArray[1]; Assert.AreEqual("ArtifcialLocal", secondSurfaceLine.Name); Assert.AreEqual(3, secondSurfaceLine.Points.Length); Assert.AreEqual(5.7, secondSurfaceLine.EndingWorldPoint.X); + AssertAreEqualPoint2D(new Point2D(3.3, 0), secondSurfaceLine.ReferenceLineIntersectionWorldPoint); Assert.AreEqual(4, callCount); @@ -269,6 +272,7 @@ "Originally duplicate points at the start have been removed."); Assert.AreEqual(427776.654093, firstSurfaceLine.StartingWorldPoint.Y); CollectionAssert.AllItemsAreUnique(geometryPoints); + AssertAreEqualPoint2D(new Point2D(94270.0, 427795.313769642), firstSurfaceLine.ReferenceLineIntersectionWorldPoint); Assert.IsTrue(TestHelper.CanOpenFileForWrite(validFilePath)); @@ -1535,5 +1539,12 @@ mocks.VerifyAll(); // Ensure there are no calls to UpdateObserver } + + private static void AssertAreEqualPoint2D(Point2D expectedPoint, Point2D actualPoint) + { + Assert.IsTrue(Math2D.AreEqualPoints(expectedPoint, actualPoint), + String.Format("Expected point: {0}" + Environment.NewLine + "Actual point: {1}", + expectedPoint, actualPoint)); + } } } \ No newline at end of file