Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs =================================================================== diff -u -r5613 -r5634 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5613) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5634) @@ -1117,6 +1117,54 @@ } /// + /// -50 -40 -30 0 10 30 40 50 + /// |-----------------------------------------------| Level 10 m + /// | surface 1 | + /// | |---------------|---------------| | Level 0 m + /// | | surface 2 | surface 3 | | + /// | |------------------|------------------| | Level -10 m + /// | surface 1 | + /// |-----------------------------------------------| Level -20 m + /// + public static SoilProfile2D CreateSoilProfile2DWithThreeLayersOfWhichTwoAreConnectedInnerLoops() + { + var soilProfile2D = new SoilProfile2D + { + Geometry = new GeometryData + { + Left = -50, + Right = 50, + Bottom = -20 + } + }; + var soil1 = new Soil("Soil1", 11, 12); + Soil soil2 = new Soil("Soil2", 13, 14); + Soil soil3 = new Soil("Soil3", 13.1, 14.1); + + SoilLayer2D soilLayer1 = CreateRectangularSoilLayer2D(10, -20, -50, 50, soil1, soilProfile2D); + SoilLayer2D soilLayer2 = CreateRectangularSoilLayer2D(0, -10, -40, 0, soil2, soilProfile2D); + SoilLayer2D soilLayer3 = CreateRectangularSoilLayer2D(0, -10, 0, 40, soil3, soilProfile2D); + + soilProfile2D.Geometry.GetPointAtLocation(new Point2D(-40, 0)).X = -30; + soilProfile2D.Geometry.GetPointAtLocation(new Point2D(40, 0)).X = 30; + + soilProfile2D.Surfaces.Add(soilLayer1); + soilProfile2D.Surfaces.Add(soilLayer2); + soilProfile2D.Surfaces.Add(soilLayer3); + + soilProfile2D.Geometry.Loops.Add(soilLayer1.GeometrySurface.OuterLoop); + soilProfile2D.Geometry.Surfaces.Add(soilLayer1.GeometrySurface); + soilProfile2D.Geometry.Loops.Add(soilLayer2.GeometrySurface.OuterLoop); + soilProfile2D.Geometry.Surfaces.Add(soilLayer2.GeometrySurface); + soilProfile2D.Geometry.Loops.Add(soilLayer3.GeometrySurface.OuterLoop); + soilProfile2D.Geometry.Surfaces.Add(soilLayer3.GeometrySurface); + soilProfile2D.Geometry.Surfaces[0].InnerLoops.Add(soilLayer2.GeometrySurface.OuterLoop); + soilProfile2D.Geometry.Surfaces[0].InnerLoops.Add(soilLayer3.GeometrySurface.OuterLoop); + + return soilProfile2D; + } + + /// /// -50 -20 -10 0 35 60 /// |-----------------|--------------|-----------------------------| Level 10 m /// | surface 1 | surface 2 | surface 3 | @@ -1170,7 +1218,7 @@ soilProfile2D.Geometry.Surfaces.Add(soilLayer6.GeometrySurface); return soilProfile2D; -} + } /// /// -50 -20/-19.999/-19.998 -10 @@ -1181,7 +1229,7 @@ /// | | | | /// |-------------------|-|---------------| Level -15 m /// -public static SoilProfile2D CreateSoilProfile2DWithFourSurfacesAndThreeVerticalSeparationDistantFrom1Mm(bool areConsecutiveSoilsIdentical) + public static SoilProfile2D CreateSoilProfile2DWithFourSurfacesAndThreeVerticalSeparationDistantFrom1Mm(bool areConsecutiveSoilsIdentical) { var soilProfile2D = new SoilProfile2D { @@ -1232,7 +1280,7 @@ soilProfile2D.Geometry.Surfaces.Add(soilLayer7.GeometrySurface); return soilProfile2D; -} + } public static SoilProfile1D CreateSoilProfile1DWithTwoClustersOfInBetweenAquifers(out SurfaceLine2 surfaceLine) Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs =================================================================== diff -u -r5617 -r5634 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs (.../GeometrySurface.cs) (revision 5617) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs (.../GeometrySurface.cs) (revision 5634) @@ -96,15 +96,15 @@ /// public void AddInnerLoop(GeometryLoop aLoop) { - if (!InnerLoops.Contains(aLoop) && !HasIdeneticalInnerLoop(aLoop)) + if (!InnerLoops.Contains(aLoop) && !HasIdenticalInnerLoop(aLoop)) { InnerLoops.Add(aLoop); } } - private bool HasIdeneticalInnerLoop(GeometryLoop loop) + private bool HasIdenticalInnerLoop(GeometryLoop loop) { - return InnerLoops.Any(innerLoop => innerLoop.HasSameCurvesByReference(loop)); + return InnerLoops.Any(innerLoop => innerLoop.HasSameCurves(loop)); } /// Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs =================================================================== diff -u -r5621 -r5634 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs (.../GeometryHelperTests.cs) (revision 5621) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs (.../GeometryHelperTests.cs) (revision 5634) @@ -148,7 +148,14 @@ } [Test] + [TestCase(-40, 3, 12, 12, 2)] + [TestCase(-30, 3, 12, 13, 1)] [TestCase(-20, 3, 12, 13, 1)] + [TestCase(-10, 2, 10, 10, 1)] + [TestCase(0, 2, 8, 8, 1)] + [TestCase(10, 2, 8, 9, 0)] + [TestCase(20, 2, 8, 9, 0)] + [TestCase(45, 1, 4, 4, 0)] public void GivenInnerLoopLayerGeometryWhenCuttingLeftThenLeftBoundaryIsChanged(double atX, int surfacesCount, int pointsCount, int curvesCount, int innerLoopsCount) { // Given @@ -179,14 +186,58 @@ { Assert.That(geometryBounds.Left, Is.EqualTo(atX).Within(cTolerance)); Assert.That(soilProfile2D.Geometry.Left, Is.EqualTo(atX).Within(cTolerance)); - // At first there are 3 surfaces, after cutting the boundary, there still must be 3 surfaces Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(surfacesCount)); - // At first there are 12 points, after cutting the boundary, there still must be 12 points Assert.That(soilProfile2D.Geometry.Points, Has.Count.EqualTo(pointsCount)); - // At first there are 14 curves, after cutting the boundary, there must be 13 curves Assert.That(soilProfile2D.Geometry.Curves, Has.Count.EqualTo(curvesCount)); - // At first there are 2 inner loops, after cutting the boundary, there must be 1 inner loop Assert.That(soilProfile2D.Geometry.InnerLoopsCount, Is.EqualTo(innerLoopsCount)); }); } + + [Test] + [TestCase(-45, 3, 10, 11, 2)] + [TestCase(-40, 3, 10, 12, 0)] + [TestCase(-30, 3, 10, 12, 0)] + [TestCase(-20, 3, 10, 12, 0)] + [TestCase(-10, 3, 10, 12, 0)] + [TestCase(0, 2, 8, 9, 0)] + [TestCase(10, 2, 8, 9, 0)] + [TestCase(20, 2, 8, 9, 0)] + [TestCase(40, 1, 5, 5, 0)] + [TestCase(45, 1, 4, 4, 0)] + public void GivenInnerLoopLayerGeometryWithConnectedLoopsWhenCuttingLeftThenLeftBoundaryIsChanged(double atX, int surfacesCount, int pointsCount, int curvesCount, int innerLoopsCount) + { + // Given + SoilProfile2D soilProfile2D = FactoryForSoilProfiles.CreateSoilProfile2DWithThreeLayersOfWhichTwoAreConnectedInnerLoops(); + GeometryBounds originalGeometryBounds = soilProfile2D.Geometry.GetGeometryBounds(); + Assert.Multiple(() => + { + Assert.That(originalGeometryBounds.Left, Is.EqualTo(-50).Within(cTolerance)); + Assert.That(soilProfile2D.Geometry.Left, Is.EqualTo(-50).Within(cTolerance)); + // At first there are 3 surfaces + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(3)); + // At first there are 12 points + Assert.That(soilProfile2D.Geometry.Points, Has.Count.EqualTo(10)); + // At first there are 12 curves + Assert.That(soilProfile2D.Geometry.Curves, Has.Count.EqualTo(11)); + // At first there are 2 inner loops + Assert.That(soilProfile2D.Geometry.InnerLoopsCount, Is.EqualTo(2)); + }); + //GeometryExporter.ExportToFile(soilProfile2D.Geometry, GeometryExporter.VisualizationFolder + "GeometryBefore.txt"); + // When + GeometryHelper.CutGeometryLeft(soilProfile2D.Geometry, atX); + //GeometryExporter.ExportToFile(soilProfile2D.Geometry, GeometryExporter.VisualizationFolder + "GeometryAfter.txt"); + //GeometryExporter.ExportWithSurfaceLineToJsonFile(GeometryExporter.VisualizationFolder + + // GeometryExporter.ExportJasonFile, soilProfile2D.Geometry, null); + // Then + GeometryBounds geometryBounds = soilProfile2D.Geometry.GetGeometryBounds(); + Assert.Multiple(() => + { + Assert.That(geometryBounds.Left, Is.EqualTo(atX).Within(cTolerance)); + Assert.That(soilProfile2D.Geometry.Left, Is.EqualTo(atX).Within(cTolerance)); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(surfacesCount)); + Assert.That(soilProfile2D.Geometry.Points, Has.Count.EqualTo(pointsCount)); + Assert.That(soilProfile2D.Geometry.Curves, Has.Count.EqualTo(curvesCount)); + Assert.That(soilProfile2D.Geometry.InnerLoopsCount, Is.EqualTo(innerLoopsCount)); + }); + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryLoopTests.cs =================================================================== diff -u -r5619 -r5634 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryLoopTests.cs (.../GeometryLoopTests.cs) (revision 5619) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geometry/GeometryLoopTests.cs (.../GeometryLoopTests.cs) (revision 5634) @@ -705,29 +705,41 @@ } [Test] - public void TestHasSameCurvesByReference() + public void TestHasSameCurves() { // setup GeometryLoop loop1 = GenerateSquareGeometryLoop(); - // create identical loop but with also new (and thus different) curves + // create identical loop but with also new (and thus by reference different) curves GeometryLoop loop2 = GenerateSquareGeometryLoop(); // call - bool isEqual = loop1.HasSameCurvesByReference(loop2); + bool isEqual = loop1.HasSameCurves(loop2); - // assert that result is False as it should be - Assert.That(isEqual, Is.False); + // assert that result is true as it should be + Assert.That(isEqual, Is.True); // setup for next test, now with same curves GeometryLoop loop3 = new GeometryLoop(); loop3.CurveList.AddRange(loop1.CurveList); // call - isEqual = loop1.HasSameCurvesByReference(loop3); + isEqual = loop1.HasSameCurves(loop3); - // assert that result is now True + // assert that result is also True Assert.That(isEqual, Is.True); + + // setup for next test, now with different curves + loop3.CurveList.Clear(); + loop3.CurveList.Add(new GeometryCurve(new Point2D(0.0, 0.0), new Point2D(11.0, 0.0))); + loop3.CurveList.Add(new GeometryCurve(loop3.CurveList[0].EndPoint, new Point2D(11.0, 10.0))); + loop3.CurveList.Add(new GeometryCurve(loop3.CurveList[1].EndPoint, new Point2D(0.0, 10.0))); + loop3.CurveList.Add(new GeometryCurve(loop3.CurveList[2].EndPoint, loop3.CurveList[0].HeadPoint)); + + // call + isEqual = loop1.HasSameCurves(loop3); + // assert that result is also True + Assert.That(isEqual, Is.False); } private static GeometryLoop GenerateSquareGeometryLoop() Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs =================================================================== diff -u -r5618 -r5634 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5618) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5634) @@ -264,15 +264,16 @@ } /// - /// Determines if all curves in the loop are equal (by reference) to the curves of the given geometry loop. + /// Determines if all curves in the loop are equal to the curves of the given geometry loop. + /// The order of the curves does not matter, nor their direction. /// /// /// true when there are curves and they are equal, else false - public bool HasSameCurvesByReference(GeometryLoop geometryLoop) + public bool HasSameCurves(GeometryLoop geometryLoop) { foreach (GeometryCurve geometryCurve in CurveList) { - if (!geometryLoop.CurveList.Contains(geometryCurve)) + if (!geometryLoop.HasSameCurveAtLocation(geometryCurve)) // .CurveList.Contains(geometryCurve)) { return false; } @@ -281,6 +282,19 @@ return CurveList.Count > 2 && CurveList.Count == geometryLoop.CurveList.Count; } + private bool HasSameCurveAtLocation(GeometryCurve geometryCurve) + { + foreach (GeometryCurve curve in CurveList) + { + if (curve.LocationEquals(geometryCurve)) + { + return true; + } + } + + return false; + } + /// /// Helper class NotEnoughUniquePointsException /// Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5612 -r5634 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5612) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5634) @@ -1146,7 +1146,7 @@ { foreach (GeometrySurface geometrySurface in Surfaces) { - if (geometrySurface.OuterLoop.HasSameCurvesByReference(outerLoop)) + if (geometrySurface.OuterLoop.HasSameCurves(outerLoop)) { return true; }