Index: DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs =================================================================== diff -u -r5104 -r5111 --- DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5104) +++ DamEngine/trunk/src/Deltares.DamEngine.TestHelpers/Factories/FactoryForSoilProfiles.cs (.../FactoryForSoilProfiles.cs) (revision 5111) @@ -1109,11 +1109,17 @@ soilProfile2D.Surfaces.Add(soilLayer5); soilProfile2D.Surfaces.Add(soilLayer6); + 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.Loops.Add(soilLayer4.GeometrySurface.OuterLoop); soilProfile2D.Geometry.Surfaces.Add(soilLayer4.GeometrySurface); + soilProfile2D.Geometry.Loops.Add(soilLayer5.GeometrySurface.OuterLoop); soilProfile2D.Geometry.Surfaces.Add(soilLayer5.GeometrySurface); + soilProfile2D.Geometry.Loops.Add(soilLayer6.GeometrySurface.OuterLoop); soilProfile2D.Geometry.Surfaces.Add(soilLayer6.GeometrySurface); return soilProfile2D; Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs =================================================================== diff -u -r5069 -r5111 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs (.../GeometrySurface.cs) (revision 5069) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometrySurface.cs (.../GeometrySurface.cs) (revision 5111) @@ -229,11 +229,11 @@ /// The cloned GeometrySurface public GeometrySurface Clone() { - var clonedGeometrySurface = new GeometrySurface() + // Only clone the name, the outer loop and the inner loops are not to be cloned here! + var clonedGeometrySurface = new GeometrySurface { - OuterLoop = OuterLoop.Clone() + Name = Name }; - clonedGeometrySurface.InnerLoops.AddRange(InnerLoops.Select(loop => loop.Clone()).ToList()); return clonedGeometrySurface; } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilProfile2DSurfaceLineHelperTests.cs =================================================================== diff -u -r5101 -r5111 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilProfile2DSurfaceLineHelperTests.cs (.../SoilProfile2DSurfaceLineHelperTests.cs) (revision 5101) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/SoilProfile2DSurfaceLineHelperTests.cs (.../SoilProfile2DSurfaceLineHelperTests.cs) (revision 5111) @@ -34,7 +34,7 @@ { // For debugging purposes // For debugging purposes - //private const string visualizationFolder = @"C:\Dam\DamTools\GeometryVisualizer\"; //#John + private const string visualizationFolder = @"C:\Dam\DamTools\GeometryVisualizer\"; //#John //private const string visualizationFolder = @"D:\src\dam\DamTools\GeometryVisualizer\"; //#Tom // Use the following code to export the geometry to a file // GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); @@ -102,6 +102,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 1, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-50, 10), ExpectedSurfaceCount = 10, // 4 extra surfaces created : 2 below the highest corners of the "zigzag" surface line + 2 on the left side (between Z=60 and 70) @@ -123,6 +124,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine() { + TestNumber = 2, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-50, 13), ExpectedSurfaceCount = 9, // 3 extra surfaces created: 1 below the "zigzag" surface line + 2 on the left side (between Z=60 and 70) @@ -143,6 +145,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 3, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-50, 5), ExpectedSurfaceCount = 8, // 2 extra surfaces created on the left side (between Z=60 and 70) @@ -163,6 +166,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 4, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-50, 0), ExpectedSurfaceCount = 8, // 2 extra surfaces created on the left side (between Z=60 and 70) @@ -183,20 +187,23 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 5, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-50, -15), ExpectedSurfaceCount = 0 }).SetName("Test 5: Surface line partly below soil profile (and shift = 0)"); yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 6, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-50, -20), ExpectedSurfaceCount = 0 }).SetName("Test 6: Surface line completely below soil profile (and shift = 0)"); yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 7, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-40, 10), ExpectedSurfaceCount = 10, // Only few surfaces are tested @@ -217,6 +224,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 8, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(10, 10), ExpectedSurfaceCount = 7, // Only few surfaces are tested @@ -237,6 +245,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 9, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-60, 10), ExpectedSurfaceCount = 10, // Only few surfaces are tested @@ -257,6 +266,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 10, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(-60, 10), ExpectedSurfaceCount = 9, // Only few surfaces are tested @@ -277,6 +287,7 @@ yield return new TestCaseData( new TestCaseZigZagSurfaceLine { + TestNumber = 11, GivenZigZagSurfaceLine = FactoryForSurfaceLines.CreateSurfaceLineInZigZag(50, -5), ExpectedSurfaceCount = 2, ExpectedFilling1 = null, @@ -314,11 +325,11 @@ } [Test, TestCaseSource(nameof(SurfaceLinesTestCases))] - //[Ignore("Work in progress")] public void GivenSoilProfile2DWhenCombiningWithSurfaceLineThenCorrectNewSoilProfile2DIsCreated(TestCaseSurfaceLine testCaseSurfaceLine) { // Given SoilProfile2D soilProfile2D = FactoryForSoilProfiles.CreateSoilProfile2DWithThreeLayers(); + // For debugging purposes //GeometryExporter.ExportToJsonFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.json"); //GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); var defaultSoil = new Soil @@ -340,15 +351,19 @@ { // Given SoilProfile2D soilProfile2D = FactoryForSoilProfiles.CreateSoilProfile2DWithSixSurfacesFormingTwoLayers(); - //GeometryExporter.ExportToJsonFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.json"); - //GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); + // For debugging purposes + // GeometryExporter.ExportToJsonFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.json"); + // GeometryExporter.ExportToFile(soilProfile2D.Geometry, visualizationFolder + "Geometry.txt"); var defaultSoil = new Soil { Name = "Filling material" }; // When SoilProfile2D newSoilProfile2D = SoilProfile2DSurfaceLineHelper.CombineSurfaceLineWithSoilProfile2D( testCaseSurfaceLine.GivenZigZagSurfaceLine.Geometry, soilProfile2D, defaultSoil, 0); + // For debugging purposes + // GeometryExporter.ExportToFile(newSoilProfile2D.Geometry, visualizationFolder + "Geometry" + testCaseSurfaceLine.TestNumber + ".txt"); + // GeometryExporter.ExportToJsonFile(newSoilProfile2D.Geometry, visualizationFolder + "Geometry" + testCaseSurfaceLine.TestNumber + ".json"); // Then if (testCaseSurfaceLine.ExpectedSurfaceCount == 0) { @@ -415,6 +430,8 @@ public SoilLayer2D ExpectedExtendedSurface6 { get; init; } public SoilLayer2D ExpectedFilling1 { get; init; } public SoilLayer2D ExpectedFilling2 { get; init; } + + public int TestNumber { get; set; } } /// Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5101 -r5111 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5101) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5111) @@ -1323,13 +1323,17 @@ { clonedGeometryData.NewlyEffectedCurves.Add(curve.Clone(clonedGeometryData.NewlyEffectedPoints)); } - foreach (GeometryLoop loop in this.Loops) - { - clonedGeometryData.Loops.Add(loop.Clone()); - } foreach (GeometrySurface surface in this.Surfaces) { - clonedGeometryData.Surfaces.Add(surface.Clone()); + var clonedLoop = surface.OuterLoop.Clone(); + clonedGeometryData.Loops.Add(clonedLoop); + List innerLoops = new List(); + innerLoops.AddRange(surface.InnerLoops.Select(loop => loop.Clone()).ToList()); + clonedGeometryData.Loops.AddRange(innerLoops); + var clonedSurface = surface.Clone(); + clonedSurface.OuterLoop = clonedLoop; + clonedSurface.InnerLoops.AddRange(innerLoops); + clonedGeometryData.Surfaces.Add(clonedSurface); } // For the clone, set use geometry generator to null. Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilLayer2D.cs =================================================================== diff -u -r5061 -r5111 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilLayer2D.cs (.../SoilLayer2D.cs) (revision 5061) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilLayer2D.cs (.../SoilLayer2D.cs) (revision 5111) @@ -20,6 +20,8 @@ // All rights reserved. using System; +using System.Collections.Generic; +using System.Linq; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Standard.Language; @@ -65,6 +67,11 @@ WaterpressureInterpolationModel = WaterpressureInterpolationModel, GeometrySurface = GeometrySurface.Clone() }; + var clonedLoop = GeometrySurface.OuterLoop.Clone(); + clonedSoilLayer2D.GeometrySurface.OuterLoop = clonedLoop; + List innerLoops = new List(); + innerLoops.AddRange(GeometrySurface.InnerLoops.Select(loop => loop.Clone()).ToList()); + clonedSoilLayer2D.GeometrySurface.InnerLoops.AddRange(innerLoops); return clonedSoilLayer2D; } Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs =================================================================== diff -u -r5073 -r5111 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5073) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5111) @@ -249,7 +249,12 @@ /// The cloned GeometryLoop public override GeometryLoop Clone() { - SyncPoints(); + // Note: explicit use of CalcPoints to ensure calcPoints are populated + var p = CalcPoints; + if (p.Count > 0) + { + SyncPoints(); + } GeometryPointString clonedGeometryPointString = base.Clone(); var clonedGeometryLoop = new GeometryLoop(); clonedGeometryLoop.Points.AddRange(clonedGeometryPointString.Points);