Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/Creators/SoilProfileCreator.cs =================================================================== diff -u -r0e2f8ccdf96680a356758e91336a384e0638e7af -r47b5ca393079360a5050b63f9eb4a074345d9f2f --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/Creators/SoilProfileCreator.cs (.../SoilProfileCreator.cs) (revision 0e2f8ccdf96680a356758e91336a384e0638e7af) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/Creators/SoilProfileCreator.cs (.../SoilProfileCreator.cs) (revision 47b5ca393079360a5050b63f9eb4a074345d9f2f) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.Linq; using Deltares.WTIStability.Data.Geo; +using Deltares.WTIStability.Data.Standard; using Ringtoets.MacroStabilityInwards.Primitives.MacroStabilityInwardsSoilUnderSurfaceLine; using Point2D = Core.Common.Base.Geometry.Point2D; using WTIStabilityPoint2D = Deltares.WTIStability.Data.Geo.Point2D; @@ -34,8 +35,6 @@ /// internal static class SoilProfileCreator { - private static GeometryData geometryData; - /// /// Creates a with the given /// which can be used in the . @@ -56,8 +55,6 @@ throw new ArgumentNullException(nameof(layersWithSoils)); } - geometryData = new GeometryData(); - var profile = new SoilProfile2D(); profile.PreconsolidationStresses.AddRange(CreatePreconsolidationStresses(soilProfile)); @@ -72,12 +69,8 @@ }); } - geometryData.Left = geometryData.Points.Min(gp => gp.X); - geometryData.Right = geometryData.Points.Max(gp => gp.X); - geometryData.Bottom = geometryData.Points.Min(gp => gp.Z); + profile.Geometry = CreateGeometryData(profile); - profile.Geometry = geometryData; - return profile; } @@ -93,69 +86,37 @@ private static GeometrySurface CreateGeometrySurface(MacroStabilityInwardsSoilLayerUnderSurfaceLine layer) { - var outerLoop = new GeometryLoop(); - GeometryCurve[] curves = ToCurveList(layer.OuterRing); - - geometryData.Curves.AddRange(curves); - outerLoop.CurveList.AddRange(curves); - - geometryData.Loops.Add(outerLoop); - - var innerloops = new List(); - foreach (Point2D[] layerHole in layer.Holes) - { - GeometryCurve[] holeCurves = ToCurveList(layerHole); - geometryData.Curves.AddRange(holeCurves); - innerloops.Add(CurvesToLoop(holeCurves)); - } - - geometryData.Loops.AddRange(innerloops); - var surface = new GeometrySurface { - OuterLoop = outerLoop + OuterLoop = CreateGeometryLoop(layer.OuterRing) }; - surface.InnerLoops.AddRange(innerloops); - geometryData.Surfaces.Add(surface); + surface.InnerLoops.AddRange(layer.Holes.Select(CreateGeometryLoop).ToArray()); return surface; } - private static GeometryLoop CurvesToLoop(GeometryCurve[] curves) + private static GeometryLoop CreateGeometryLoop(Point2D[] points) { var loop = new GeometryLoop(); - loop.CurveList.AddRange(curves); + + loop.CurveList.AddRange(CreateGeometryCurves(points)); + return loop; } - private static GeometryCurve[] ToCurveList(Point2D[] points) + private static GeometryCurve[] CreateGeometryCurves(Point2D[] points) { - var geometryPoints = (List) geometryData.Points; - var curves = new List(); - var firstPoint = new WTIStabilityPoint2D(points[0].X, points[0].Y); WTIStabilityPoint2D lastPoint = null; for (var i = 0; i < points.Length - 1; i++) { - WTIStabilityPoint2D headPoint; + WTIStabilityPoint2D headPoint = i == 0 ? firstPoint : lastPoint; - if (i == 0) - { - headPoint = firstPoint; - geometryPoints.Add(headPoint); - } - else - { - headPoint = lastPoint; - } - var endPoint = new WTIStabilityPoint2D(points[i + 1].X, points[i + 1].Y); - geometryPoints.Add(endPoint); - curves.Add(new GeometryCurve { HeadPoint = headPoint, @@ -176,5 +137,30 @@ return curves.ToArray(); } + + private static GeometryData CreateGeometryData(SoilProfile2D profile) + { + var geometryData = new GeometryData(); + + geometryData.Surfaces.AddRange(profile.Surfaces + .Select(s => s.GeometrySurface)); + geometryData.Loops.AddRange(geometryData.Surfaces + .SelectMany(gs => new[] + { + gs.OuterLoop + }.Concat(gs.InnerLoops))); + geometryData.Curves.AddRange(geometryData.Loops + .SelectMany(l => l.CurveList)); + geometryData.Points.AddRange(geometryData.Curves + .SelectMany(c => new[] + { + c.HeadPoint, + c.EndPoint + }).Distinct()); + + geometryData.Rebox(); + + return geometryData; + } } } \ No newline at end of file