Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/TestFiles/SimpleTwoInnerLoops.stix =================================================================== diff -u Binary files differ Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/TestFiles/SimpleInnerLoopInAnotherInnerLoop.stix =================================================================== diff -u Binary files differ Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/TestFiles/SimpleInnerLoop.stix =================================================================== diff -u Binary files differ Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/SoilProfile2DDataModel.cs =================================================================== diff -u -r5922 -r5987 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/SoilProfile2DDataModel.cs (.../SoilProfile2DDataModel.cs) (revision 5922) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/SoilProfile2DDataModel.cs (.../SoilProfile2DDataModel.cs) (revision 5987) @@ -76,6 +76,7 @@ soilProfile2D.Surfaces.Add(soilLayer2D); } soilProfile2D.Geometry.Rebox(); + CreateInnerLoops(soilProfile2D); return soilProfile2D; } @@ -208,4 +209,51 @@ return (Math.Abs(firstPoint.X - (secondPoint.X + offsetX)) < pointTolerance) && (Math.Abs(firstPoint.Z - secondPoint.Z) < pointTolerance); } + + private struct LayerConnection(int innerLayer, int outerLayer, double areaOuterLayer) + { + public int InnerLayer { get; set; } = innerLayer; + public int OuterLayer { get; set; } = outerLayer; + public double AreaOuterLayer { get; set; } = areaOuterLayer; + } + + private static void CreateInnerLoops(SoilProfile2D soilProfile) + { + // Find all inner loops + var layerConnections = new List(); + for (var index1 = 0; index1 < soilProfile.Surfaces.Count; index1++) + { + GeometryLoop loop1 = soilProfile.Surfaces[index1].GeometrySurface.OuterLoop; + for (var index2 = 0; index2 < soilProfile.Surfaces.Count; index2++) + { + if (index1 == index2) + { + continue; + } + GeometryLoop loop2 = soilProfile.Surfaces[index2].GeometrySurface.OuterLoop; + bool allPointsInLoop2AreInLoop1 = loop2.Points.All(loop1.IsPointInLoopArea); + if (allPointsInLoop2AreInLoop1) + { + layerConnections.Add(new LayerConnection(index2, index1, loop1.Area())); + } + } + } + // When layer 1 is in layer 2 and layer 2 is in layer 3, layer 3 is not an inner loop of layer 1 + if (layerConnections.Count > 0) + { + List uniqueInnerLayers = layerConnections + .Select(lc => lc.InnerLayer) + .Distinct() + .ToList(); + foreach (int innerLayer in uniqueInnerLayers) + { + LayerConnection largestAreaConnection = layerConnections + .Where(lc => lc.InnerLayer == innerLayer) + .OrderByDescending(lc => lc.AreaOuterLayer) + .LastOrDefault(); + GeometryLoop loop = soilProfile.Surfaces[largestAreaConnection.InnerLayer].GeometrySurface.OuterLoop; + soilProfile.Surfaces[largestAreaConnection.OuterLayer].GeometrySurface.AddInnerLoop(loop); + } + } + } } \ No newline at end of file Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/StixFileReaderTest.cs =================================================================== diff -u -r5951 -r5987 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/StixFileReaderTest.cs (.../StixFileReaderTest.cs) (revision 5951) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/StixFileReaderTest.cs (.../StixFileReaderTest.cs) (revision 5987) @@ -20,6 +20,7 @@ // All rights reserved. using System.IO; +using Deltares.Geometry; using Deltares.Geotechnics.Soils; using Deltares.Standard.Validation; using DGeoSuite.Components.Persistence; @@ -59,7 +60,7 @@ Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(12)); ValidationResult[] validationResults = System.Array.Empty(); - for (int index = 0; index < 11; index++) + for (int index = 0; index < 12; index++) { Assert.That(validationResults, Has.Length.EqualTo(0)); validationResults = soilProfile2D.Surfaces[index].ValidateLayer(); @@ -72,4 +73,147 @@ validationResults = soilProfile2D.Geometry.ValidateGeometry(); Assert.That(validationResults, Has.Length.EqualTo(0)); } + + [Test] + public void WhenStixFileWithOneInnerLoopIsRead_ThenLoopsAreAsExpected() + { + const string fileName = @".\TestFiles\SimpleInnerLoop.stix"; + + SoilProfile2D soilProfile2D = new StixFileReader().ReadSoilProfile(fileName); + + Assert.That(soilProfile2D, Is.Not.Null); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(2)); + // L 1 outer loop + var surfaceIndex = 0; + GeometryLoop outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(outerLoop, 0, 0, 1, 10, 59, 10, 60, 0); + // L 1 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(1)); + GeometryLoop innerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops[0]; + Assert.That(innerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(innerLoop, 11, 8, 29, 8, 30, 2, 10, 2); + // L 2 outer loop + surfaceIndex = 1; + outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(outerLoop, 11, 8, 29, 8, 30, 2, 10, 2); + // L 2 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(0)); + } + + [Test] + public void WhenStixFileWithTwoInnerLoopsIsRead_ThenLoopsAreAsExpected() + { + const string fileName = @".\TestFiles\SimpleTwoInnerLoops.stix"; + + SoilProfile2D soilProfile2D = new StixFileReader().ReadSoilProfile(fileName); + + Assert.That(soilProfile2D, Is.Not.Null); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(3)); + + // L 1 outer loop + var surfaceIndex = 1; + GeometryLoop outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(outerLoop, 0, 0, 1, 10, 59, 10, 60, 0); + // L 1 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(2)); + GeometryLoop innerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops[0]; + Assert.That(innerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(innerLoop, 11, 8, 29, 8, 30, 2, 10, 2); + innerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops[1]; + Assert.That(innerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(innerLoop, 40, 2, 41, 8, 49, 8, 50, 2); + // L 2 outer loop + surfaceIndex = 0; + outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(outerLoop, 11, 8, 29, 8, 30, 2, 10, 2); + // L 2 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(0)); + // L 3 outer loop + surfaceIndex = 2; + outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(outerLoop, 40, 2, 41, 8, 49, 8, 50, 2); + // L 3 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(0)); + } + + [Test] + public void WhenStixFileWithInnerLoopInAnotherInnerLoopIsRead_ThenLoopsAreAsExpected() + { + const string fileName = @".\TestFiles\SimpleInnerLoopInAnotherInnerLoop.stix"; + + SoilProfile2D soilProfile2D = new StixFileReader().ReadSoilProfile(fileName); + + Assert.That(soilProfile2D, Is.Not.Null); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(3)); + + // L 1 outer loop + var surfaceIndex = 0; + GeometryLoop outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(outerLoop, 0, 0, 1, 10, 59, 10, 60, 0); + // L 1 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(1)); + GeometryLoop innerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops[0]; + Assert.That(innerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(innerLoop, 11, 8, 29, 8, 30, 2, 10, 2); + // L 2 outer loop + surfaceIndex = 1; + outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(outerLoop, 11, 8, 29, 8, 30, 2, 10, 2); + // L 2 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(1)); + innerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops[0]; + Assert.That(innerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(innerLoop, 12, 3, 13, 7, 27, 7, 28, 3); + // L 3 outer loop + surfaceIndex = 2; + outerLoop = soilProfile2D.Geometry.Surfaces[surfaceIndex].OuterLoop; + Assert.That(outerLoop, Has.Count.EqualTo(4)); + CheckIfLoopWith4PointsIsAsExpected(innerLoop, 12, 3, 13, 7, 27, 7, 28, 3); + // L 3 inner loops + Assert.That(soilProfile2D.Geometry.Surfaces[surfaceIndex].InnerLoops, Has.Count.EqualTo(0)); + } + + private static GeometryCurve CheckIfLoopWith4PointsIsAsExpected(GeometryLoop loop, double x1, double z1, double x2, double z2, double x3, double z3, double x4, double z4) + { + GeometryCurve curve = loop.CurveList[0]; + Assert.Multiple(() => + { + Assert.That(curve.HeadPoint.X, Is.EqualTo(x1)); + Assert.That(curve.HeadPoint.Z, Is.EqualTo(z1)); + Assert.That(curve.EndPoint.X, Is.EqualTo(x2)); + Assert.That(curve.EndPoint.Z, Is.EqualTo(z2)); + }); + curve = loop.CurveList[1]; + Assert.Multiple(() => + { + Assert.That(curve.HeadPoint.X, Is.EqualTo(x2)); + Assert.That(curve.HeadPoint.Z, Is.EqualTo(z2)); + Assert.That(curve.EndPoint.X, Is.EqualTo(x3)); + Assert.That(curve.EndPoint.Z, Is.EqualTo(z3)); + }); + curve = loop.CurveList[2]; + Assert.Multiple(() => + { + Assert.That(curve.HeadPoint.X, Is.EqualTo(x3)); + Assert.That(curve.HeadPoint.Z, Is.EqualTo(z3)); + Assert.That(curve.EndPoint.X, Is.EqualTo(x4)); + Assert.That(curve.EndPoint.Z, Is.EqualTo(z4)); + }); + curve = loop.CurveList[3]; + Assert.Multiple(() => + { + Assert.That(curve.HeadPoint.X, Is.EqualTo(x4)); + Assert.That(curve.HeadPoint.Z, Is.EqualTo(z4)); + Assert.That(curve.EndPoint.X, Is.EqualTo(x1)); + Assert.That(curve.EndPoint.Z, Is.EqualTo(z1)); + }); + return curve; + } } \ No newline at end of file Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/Deltares.Dam.StixFileReader.Tests.csproj =================================================================== diff -u -r4823 -r5987 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/Deltares.Dam.StixFileReader.Tests.csproj (.../Deltares.Dam.StixFileReader.Tests.csproj) (revision 4823) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/Deltares.Dam.StixFileReader.Tests.csproj (.../Deltares.Dam.StixFileReader.Tests.csproj) (revision 5987) @@ -30,5 +30,14 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest +