Index: Core/Components/src/Core.Components.Gis.IO/Readers/PolylineShapeFileReader.cs =================================================================== diff -u -rcff3301f201c4e1d4691334cd3af48698f1b0d41 -r55e8451bb0b97020c9dd33741f4120d3f2162713 --- Core/Components/src/Core.Components.Gis.IO/Readers/PolylineShapeFileReader.cs (.../PolylineShapeFileReader.cs) (revision cff3301f201c4e1d4691334cd3af48698f1b0d41) +++ Core/Components/src/Core.Components.Gis.IO/Readers/PolylineShapeFileReader.cs (.../PolylineShapeFileReader.cs) (revision 55e8451bb0b97020c9dd33741f4120d3f2162713) @@ -89,7 +89,9 @@ try { IFeature lineFeature = GetFeature(readIndex); - return ConvertSingleLineFeatureToMapLineData(lineFeature, !string.IsNullOrWhiteSpace(name) ? name : GisIOResources.PolylineShapeFileReader_ReadLine_Line); + return ConvertSingleLineFeatureToMapLineData(lineFeature, !string.IsNullOrWhiteSpace(name) + ? name + : GisIOResources.PolylineShapeFileReader_ReadLine_Line); } finally { Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs =================================================================== diff -u -r11f0867b39150ae5fac83dc178a89fee46d27611 -r55e8451bb0b97020c9dd33741f4120d3f2162713 --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs (.../FailureMechanismBase.cs) (revision 11f0867b39150ae5fac83dc178a89fee46d27611) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismBase.cs (.../FailureMechanismBase.cs) (revision 55e8451bb0b97020c9dd33741f4120d3f2162713) @@ -130,20 +130,15 @@ /// /// Inserts the section to while maintaining connectivity - /// order (neighboring have same start and - /// end points). + /// order (neighboring have same end points). /// /// The new section. /// When cannot /// be connected to elements already defined in . private void InsertSectionWhileMaintainingConnectivityOrder(FailureMechanismSection sectionToInsert) { - if (sections[0].GetStart().Equals(sectionToInsert.GetLast())) + if (sections[sections.Count - 1].GetLast().Equals(sectionToInsert.GetStart())) { - sections.Insert(0, sectionToInsert); - } - else if (sections[sections.Count - 1].GetLast().Equals(sectionToInsert.GetStart())) - { sections.Add(sectionToInsert); } else Index: Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs =================================================================== diff -u -r11f0867b39150ae5fac83dc178a89fee46d27611 -r55e8451bb0b97020c9dd33741f4120d3f2162713 --- Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs (.../FailureMechanismBaseTest.cs) (revision 11f0867b39150ae5fac83dc178a89fee46d27611) +++ Ringtoets/Common/test/Ringtoets.Common.Data.Test/FailureMechanism/FailureMechanismBaseTest.cs (.../FailureMechanismBaseTest.cs) (revision 55e8451bb0b97020c9dd33741f4120d3f2162713) @@ -166,7 +166,7 @@ } [Test] - public void AddSection_SecondSectionEndConnectingToStartOfFirst_Section2InsertedBeforeSection1() + public void AddSection_SecondSectionStartConnectingToEndOfFirst_Section2AddedAfterSection1() { // Setup var failureMechanism = new SimpleFailureMechanismBase(); @@ -176,13 +176,13 @@ var section1 = new FailureMechanismSection("A", new[] { - new Point2D(matchingX, matchingY), - new Point2D(3, 4) + new Point2D(3, 4), + new Point2D(matchingX, matchingY) }); var section2 = new FailureMechanismSection("B", new[] { - new Point2D(-2, -1), - new Point2D(matchingX, matchingY) + new Point2D(matchingX, matchingY), + new Point2D(-2, -1) }); // Call @@ -192,13 +192,13 @@ // Assert CollectionAssert.AreEqual(new[] { - section2, - section1 + section1, + section2 }, failureMechanism.Sections); } [Test] - public void AddSection_SecondSectionStartConnectingToEndOfFirst_Section2AddedAfterSection1() + public void AddSection_SecondSectionEndConnectingToStartOfFirst_ThrowArgumentException() { // Setup var failureMechanism = new SimpleFailureMechanismBase(); @@ -208,25 +208,23 @@ var section1 = new FailureMechanismSection("A", new[] { - new Point2D(3, 4), - new Point2D(matchingX, matchingY) + new Point2D(matchingX, matchingY), + new Point2D(3, 4) }); var section2 = new FailureMechanismSection("B", new[] { - new Point2D(matchingX, matchingY), - new Point2D(-2, -1) + new Point2D(-2, -1), + new Point2D(matchingX, matchingY) }); - // Call failureMechanism.AddSection(section1); - failureMechanism.AddSection(section2); + // Call + TestDelegate call = () => failureMechanism.AddSection(section2); + // Assert - CollectionAssert.AreEqual(new[] - { - section1, - section2 - }, failureMechanism.Sections); + const string expectedMessage = "Vak 'B' sluit niet aan op de al gedefinieerde vakken van het toetsspoor."; + TestHelper.AssertThrowsArgumentExceptionAndTestMessage(call, expectedMessage); } [Test] Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.dbf =================================================================== diff -u Binary files differ Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.prj =================================================================== diff -u --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.prj (revision 0) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.prj (revision 55e8451bb0b97020c9dd33741f4120d3f2162713) @@ -0,0 +1 @@ +PROJCS["Amersfoort_RD_New",GEOGCS["GCS_Amersfoort",DATUM["D_Amersfoort",SPHEROID["Bessel_1841",6377397.155,299.1528128]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Double_Stereographic"],PARAMETER["latitude_of_origin",52.15616055555555],PARAMETER["central_meridian",5.38763888888889],PARAMETER["scale_factor",0.9999079],PARAMETER["false_easting",155000],PARAMETER["false_northing",463000],UNIT["Meter",1]] \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.qpj =================================================================== diff -u --- Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.qpj (revision 0) +++ Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.qpj (revision 55e8451bb0b97020c9dd33741f4120d3f2162713) @@ -0,0 +1 @@ +PROJCS["Amersfoort / RD New",GEOGCS["Amersfoort",DATUM["Amersfoort",SPHEROID["Bessel 1841",6377397.155,299.1528128,AUTHORITY["EPSG","7004"]],TOWGS84[565.4171,50.3319,465.5524,-0.398957,0.343988,-1.87740,4.0725],AUTHORITY["EPSG","6289"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4289"]],PROJECTION["Oblique_Stereographic"],PARAMETER["latitude_of_origin",52.15616055555555],PARAMETER["central_meridian",5.38763888888889],PARAMETER["scale_factor",0.9999079],PARAMETER["false_easting",155000],PARAMETER["false_northing",463000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],AUTHORITY["EPSG","28992"]] Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.shp =================================================================== diff -u Binary files differ Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/FailureMechanismSections/traject_19-1_vakken.shx =================================================================== diff -u Binary files differ Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/ReferenceLine/traject_19-1.dbf =================================================================== diff -u Binary files differ Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/ReferenceLine/traject_19-1.shp =================================================================== diff -u Binary files differ Index: Ringtoets/Common/test/Ringtoets.Common.IO.Test/test-data/ReferenceLine/traject_19-1.shx =================================================================== diff -u Binary files differ Index: Ringtoets/Integration/src/Ringtoets.Integration.Plugin/FileImporters/FailureMechanismSectionsImporter.cs =================================================================== diff -u -rb9851915fb250e14a7608ae243fe94b6ab8d8abf -r55e8451bb0b97020c9dd33741f4120d3f2162713 --- Ringtoets/Integration/src/Ringtoets.Integration.Plugin/FileImporters/FailureMechanismSectionsImporter.cs (.../FailureMechanismSectionsImporter.cs) (revision b9851915fb250e14a7608ae243fe94b6ab8d8abf) +++ Ringtoets/Integration/src/Ringtoets.Integration.Plugin/FileImporters/FailureMechanismSectionsImporter.cs (.../FailureMechanismSectionsImporter.cs) (revision 55e8451bb0b97020c9dd33741f4120d3f2162713) @@ -243,7 +243,7 @@ private static IEnumerable SnapReadSectionsToReferenceLine(IEnumerable readSections, ReferenceLine referenceLine) { - IList orderedReadSections = OrderSections(readSections); + IList orderedReadSections = OrderSections(readSections, referenceLine); double[] orderedSectionLengths = GetReferenceLineCutoffLengths(referenceLine, orderedReadSections); @@ -252,21 +252,42 @@ return CreateFailureMechanismSectionsSnappedOnReferenceLine(orderedReadSections, splitResults); } - private static IList OrderSections(IEnumerable unorderedSections) + private static IList OrderSections(IEnumerable unorderedSections, ReferenceLine referenceLine) { List sourceList = unorderedSections.ToList(); + var startSection = GetStart(sourceList, referenceLine); + var resultList = new List(sourceList.Count) { - sourceList[0] + startSection }; + sourceList.Remove(startSection); GrowTowardsEnd(resultList, sourceList); - GrowTowardsStart(resultList, sourceList); return resultList; } + private static FailureMechanismSection GetStart(List sourceList, ReferenceLine referenceLine) + { + var shortestDistance = double.MaxValue; + FailureMechanismSection closestSectionToReferenceLineStart = null; + Dictionary sectionReferenceLineDistances = sourceList.ToDictionary(s => referenceLine.Points.First().GetEuclideanDistanceTo(s.GetStart()), s => s); + + foreach (var sectionReferenceLineDistance in sectionReferenceLineDistances) + { + double distance = sectionReferenceLineDistance.Key; + if (distance < shortestDistance && distance <= snappingTolerance) + { + shortestDistance = sectionReferenceLineDistance.Key; + closestSectionToReferenceLineStart = sectionReferenceLineDistance.Value; + } + } + + return closestSectionToReferenceLineStart; + } + private static void GrowTowardsEnd(List resultList, List sourceList) { bool doneGrowingToEnd = false; @@ -298,37 +319,6 @@ } } - private static void GrowTowardsStart(List resultList, List sourceList) - { - bool doneGrowingToStart = false; - while (!doneGrowingToStart) - { - Point2D startPointToConnect = resultList[0].GetStart(); - - var shortestDistance = double.MaxValue; - FailureMechanismSection closestSectionToConnectWith = null; - Dictionary sectionConnectionDistances = sourceList.ToDictionary(s => startPointToConnect.GetEuclideanDistanceTo(s.GetLast()), s => s); - foreach (var sectionConnectionDistance in sectionConnectionDistances) - { - double distance = sectionConnectionDistance.Key; - if (distance < shortestDistance && distance <= snappingTolerance) - { - shortestDistance = sectionConnectionDistance.Key; - closestSectionToConnectWith = sectionConnectionDistance.Value; - } - } - if (closestSectionToConnectWith == null) - { - doneGrowingToStart = true; - } - else - { - resultList.Insert(0, closestSectionToConnectWith); - sourceList.Remove(closestSectionToConnectWith); - } - } - } - private static double[] GetReferenceLineCutoffLengths(ReferenceLine referenceLine, IList orderedReadSections) { double[] orderedSectionLengths = orderedReadSections.Select(GetSectionLength).ToArray(); Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/FileImporters/FailureMechanismSectionsImporterTest.cs =================================================================== diff -u -r355010200cb0321da0786bc1170c396c64e2845e -r55e8451bb0b97020c9dd33741f4120d3f2162713 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/FileImporters/FailureMechanismSectionsImporterTest.cs (.../FailureMechanismSectionsImporterTest.cs) (revision 355010200cb0321da0786bc1170c396c64e2845e) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/FileImporters/FailureMechanismSectionsImporterTest.cs (.../FailureMechanismSectionsImporterTest.cs) (revision 55e8451bb0b97020c9dd33741f4120d3f2162713) @@ -90,13 +90,15 @@ } [Test] - public void Import_ValidFileCorrespondingToReferenceLineAndNoSectionImportedYet_ImportSections() + [TestCase("traject_1-1.shp", "traject_1-1_vakken.shp", 62)] + [TestCase("traject_19-1.shp", "traject_19-1_vakken.shp", 17)] + public void Import_ValidFileCorrespondingToReferenceLineAndNoSectionImportedYet_ImportSections(string referenceLineFileName, string sectionsFileName, int sectionCount) { // Setup var referenceLineFilePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, - Path.Combine("ReferenceLine", "traject_1-1.shp")); + Path.Combine("ReferenceLine", referenceLineFileName)); var sectionsFilePath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, - Path.Combine("FailureMechanismSections", "traject_1-1_vakken.shp")); + Path.Combine("FailureMechanismSections", sectionsFileName)); var mocks = new MockRepository(); var assessmentSection = mocks.Stub(); @@ -116,7 +118,7 @@ Assert.IsTrue(importSuccessful); FailureMechanismSection[] sections = failureMechanism.Sections.ToArray(); - Assert.AreEqual(62, sections.Length); + Assert.AreEqual(sectionCount, sections.Length); AssertSectionsAreValidForReferenceLine(sections, assessmentSection.ReferenceLine); mocks.VerifyAll(); }