Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/MacroStabilityInwardsCalculator.cs =================================================================== diff -u -re53ef4c278a378cb5b3973dc939a19896f94b1cc -r8df0c1c5344a84bd7aa0a1f660e3a0adacc47bc7 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/MacroStabilityInwardsCalculator.cs (.../MacroStabilityInwardsCalculator.cs) (revision e53ef4c278a378cb5b3973dc939a19896f94b1cc) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/MacroStabilityInwardsCalculator.cs (.../MacroStabilityInwardsCalculator.cs) (revision 8df0c1c5344a84bd7aa0a1f660e3a0adacc47bc7) @@ -37,6 +37,7 @@ { private readonly MacroStabilityInwardsCalculatorInput input; private readonly IMacroStabilityInwardsSubCalculatorFactory factory; + private GeometryData geometryData; /// /// Constructs a new . The is used to @@ -74,45 +75,126 @@ private IUpliftVanCalculator CalculateUpliftVan() { IUpliftVanCalculator upliftVanCalculator = CreateUpliftVanCalculator(); + + upliftVanCalculator.Calculate(); - try - { - upliftVanCalculator.Calculate(); - } - catch (Exception) - { - // Temporary - } - return upliftVanCalculator; } private IUpliftVanCalculator CreateUpliftVanCalculator() { IUpliftVanCalculator calculator = factory.CreateUpliftVanCalculator(); Soil[] soils = MacroStabilityInwardsSoilCreator.Create(input.SoilProfile); + GeometrySurface[] surfaces = CreateSurfaces(input.SoilProfile); calculator.SoilModel = CreateSoilModel(soils); - calculator.SoilProfile = CreateSoilProfile(input.SoilProfile.LayersUnderSurfaceLine.ToArray(), soils); + calculator.SoilProfile = CreateSoilProfile(input.SoilProfile.LayersUnderSurfaceLine.ToArray(), soils, surfaces); return calculator; } - private SoilProfile2D CreateSoilProfile(IList layers, IList soils) + private GeometrySurface[] CreateSurfaces(MacroStabilityInwardsSoilProfileUnderSurfaceLine soilProfile) { + geometryData = new GeometryData(); + + var surfaces = new List(); + foreach (MacroStabilityInwardsSoilLayerUnderSurfaceLine layer in soilProfile.LayersUnderSurfaceLine) + { + var outerLoop = new GeometryLoop(); + GeometryCurve[] curves = ToCurveList(layer.OuterRing); + + geometryData.Curves.AddRange(curves); + + outerLoop.CurveList.AddRange(curves); + + geometryData.Loops.Add(outerLoop); + + IEnumerable innerloops = layer.Holes.Select(h => + { + GeometryCurve[] geometryCurves = ToCurveList(h); + geometryData.Curves.AddRange(geometryCurves); + return geometryCurves; + }).Select(CurvesToLoop); + + geometryData.Loops.AddRange(innerloops); + + var surface = new GeometrySurface + { + OuterLoop = outerLoop + }; + surface.InnerLoops.AddRange(innerloops); + + surfaces.Add(surface); + } + + geometryData.Surfaces.AddRange(surfaces); + + return surfaces.ToArray(); + } + + private static GeometryLoop CurvesToLoop(GeometryCurve[] curves) + { + var loop = new GeometryLoop(); + loop.CurveList.AddRange(curves); + return loop; + } + + private GeometryCurve[] ToCurveList(Core.Common.Base.Geometry.Point2D[] points) + { + var geometryPoints = (List) geometryData.Points; + + var curves = new List(); + + var firstPoint = new Point2D(points[0].X, points[0].Y); + Point2D lastPoint = null; + + for (int i = 0; i < points.Length-1; i++) + { + Point2D headPoint = i == 0 + ? firstPoint + : new Point2D(points[i].X, points[i].Y); + + var endPoint = new Point2D(points[i+1].X, points[i+1].Y); + + geometryPoints.Add(headPoint); + geometryPoints.Add(endPoint); + + curves.Add(new GeometryCurve + { + HeadPoint = headPoint, + EndPoint = endPoint, + }); + + lastPoint = endPoint; + } + + curves.Add(new GeometryCurve + { + HeadPoint = lastPoint, + EndPoint = firstPoint + }); + + return curves.ToArray(); + } + + private SoilProfile2D CreateSoilProfile(IList layers, IList soils, IList surfaces) + { var profile = new SoilProfile2D(); for (int i = 0; i < layers.Count; i++) { profile.Surfaces.Add(new SoilLayer2D { IsAquifer = layers[i].Properties.IsAquifer, - Soil = soils[i] + Soil = soils[i], + GeometrySurface = surfaces[i] }); } + profile.Geometry = geometryData; + return profile; } - private SoilModel CreateSoilModel(IEnumerable soils) + private static SoilModel CreateSoilModel(IEnumerable soils) { var soilModel = new SoilModel(); soilModel.Soils.AddRange(soils); Index: Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/SubCalculator/UpliftVanCalculator.cs =================================================================== diff -u -re53ef4c278a378cb5b3973dc939a19896f94b1cc -r8df0c1c5344a84bd7aa0a1f660e3a0adacc47bc7 --- Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/SubCalculator/UpliftVanCalculator.cs (.../UpliftVanCalculator.cs) (revision e53ef4c278a378cb5b3973dc939a19896f94b1cc) +++ Ringtoets/MacroStabilityInwards/src/Ringtoets.MacroStabilityInwards.KernelWrapper/SubCalculator/UpliftVanCalculator.cs (.../UpliftVanCalculator.cs) (revision 8df0c1c5344a84bd7aa0a1f660e3a0adacc47bc7) @@ -19,6 +19,7 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using Deltares.WTIStability; using Deltares.WTIStability.Calculation.Wrapper; using Deltares.WTIStability.Data.Geo; @@ -49,8 +50,17 @@ public void Calculate() { - wrappedCalculator.InitializeForDeterministic(WTISerializer.Serialize(calculatorInput)); - wrappedCalculator.Run(); + try + { + wrappedCalculator.InitializeForDeterministic(WTISerializer.Serialize(calculatorInput)); + + var messages = wrappedCalculator.Validate(); + wrappedCalculator.Run(); + } + catch (Exception e) + { + // Do nothing + } } public SoilModel SoilModel