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;
}