Index: DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs =================================================================== diff -u -r5090 -r5256 --- DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs (.../FillDamFromXmlInput.cs) (revision 5090) +++ DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs (.../FillDamFromXmlInput.cs) (revision 5256) @@ -849,66 +849,98 @@ inputLayer.WaterpressureInterpolationModel); // Add OuterLoop - SoilProfile2DLayer2DSurfaceOuterPoint[] outerLoop = inputLayer.Surface.OuterLoop; - var isStartPoint = true; - var curve = new GeometryCurve(); - var firstPoint = new Point2D(); - for (var j = 0; j < outerLoop.Length; j++) - { - var point = new Point2D(outerLoop[j].X, outerLoop[j].Z); - if (isStartPoint) - { - curve.HeadPoint = point; - firstPoint = point; - } - else - { - curve.EndPoint = point; - soilProfile2D.Geometry.Curves.Add(curve); - layer.GeometrySurface.OuterLoop.CurveList.Add(curve); - curve = new GeometryCurve(); - curve.HeadPoint = point; - } + AddOuterLoopToSoilProfile2DFromLayer2D(soilProfile2D, inputLayer, layer); - if (j == outerLoop.Length - 1) - { - curve.EndPoint = firstPoint; - soilProfile2D.Geometry.Curves.Add(curve); - layer.GeometrySurface.OuterLoop.CurveList.Add(curve); - } + // Add InnerLoop + AddInnerLoopToSoilProfile2DFromLayer2D(soilProfile2D, inputLayer, layer); - isStartPoint = false; + soilProfile2D.Surfaces.Add(layer); + soilProfile2D.Geometry.Surfaces.Add(layer.GeometrySurface); + } + } + } + + private static void AddInnerLoopToSoilProfile2DFromLayer2D(SoilProfile2D soilProfile2D, SoilProfile2DLayer2D inputLayer, SoilLayer2D layer) + { + SoilProfile2DLayer2DSurfaceInnerPoint[] innerloop = inputLayer.Surface.Innerloop; + if (innerloop != null) + { + if (innerloop.Length > 0) + { + // TODO: Add curves of innerloop to geometry + var newloop = new GeometryLoop(); + for (var j = 0; j < innerloop.Length; j++) + { + var point = new Point2D(innerloop[j].X, innerloop[j].Z); soilProfile2D.Geometry.Points.Add(point); - layer.GeometrySurface.OuterLoop.CalcPoints.Add(point); + newloop.CalcPoints.Add(point); } - - soilProfile2D.Geometry.Loops.Add(layer.GeometrySurface.OuterLoop); + layer.GeometrySurface.InnerLoops.Add(newloop); + soilProfile2D.Geometry.Loops.Add(newloop); + } + } + } - // Add InnerLoop - SoilProfile2DLayer2DSurfaceInnerPoint[] innerloop = inputLayer.Surface.Innerloop; - if (innerloop != null) + private static void AddOuterLoopToSoilProfile2DFromLayer2D(SoilProfile2D soilProfile2D, SoilProfile2DLayer2D inputLayer, SoilLayer2D layer) + { + SoilProfile2DLayer2DSurfaceOuterPoint[] outerLoop = inputLayer.Surface.OuterLoop; + var isStartPoint = true; + var curve = new GeometryCurve(); + var firstPoint = new Point2D(); + for (var j = 0; j < outerLoop.Length; j++) + { + var point = new Point2D(outerLoop[j].X, outerLoop[j].Z); + if (isStartPoint) + { + curve.HeadPoint = point; + firstPoint = point; + } + else + { + curve.EndPoint = point; + var existingCurve = GeometryHelper.DoesCurveExist(soilProfile2D.Geometry, curve); + if (existingCurve == null) { - if (innerloop.Length > 0) - { - // TODO: Add curves of innerloop to geometry - var newloop = new GeometryLoop(); - for (var j = 0; j < innerloop.Length; j++) - { - var point = new Point2D(innerloop[j].X, innerloop[j].Z); - soilProfile2D.Geometry.Points.Add(point); - newloop.CalcPoints.Add(point); - } + soilProfile2D.Geometry.Curves.Add(curve); + layer.GeometrySurface.OuterLoop.CurveList.Add(curve); + } + else + { + layer.GeometrySurface.OuterLoop.CurveList.Add(existingCurve); + } + curve = new GeometryCurve(); + curve.HeadPoint = point; + } - layer.GeometrySurface.InnerLoops.Add(newloop); - soilProfile2D.Geometry.Loops.Add(newloop); - } + if (j == outerLoop.Length - 1) + { + curve.EndPoint = firstPoint; + var existingCurve = GeometryHelper.DoesCurveExist(soilProfile2D.Geometry, curve); + if (existingCurve == null) + { + soilProfile2D.Geometry.Curves.Add(curve); + layer.GeometrySurface.OuterLoop.CurveList.Add(curve); } + else + { + layer.GeometrySurface.OuterLoop.CurveList.Add(existingCurve); + } + } - soilProfile2D.Surfaces.Add(layer); - soilProfile2D.Geometry.Surfaces.Add(layer.GeometrySurface); + isStartPoint = false; + var existingPoint = soilProfile2D.Geometry.GetPointAtLocation(point, GeometryConstants.Accuracy); + if (existingPoint == null) + { + soilProfile2D.Geometry.Points.Add(point); + layer.GeometrySurface.OuterLoop.CalcPoints.Add(point); } + else + { + layer.GeometrySurface.OuterLoop.CalcPoints.Add(existingPoint); + } } + soilProfile2D.Geometry.Loops.Add(layer.GeometrySurface.OuterLoop); } private static void TransferSegments(Io.XmlInput.Segment[] inputSegments, IList segments) Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs =================================================================== diff -u -r5157 -r5256 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs (.../GeometryHelper.cs) (revision 5157) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs (.../GeometryHelper.cs) (revision 5256) @@ -21,6 +21,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; namespace Deltares.DamEngine.Data.Geometry; @@ -332,4 +333,87 @@ } return null; } + + /// + /// Check if a curve already exists in the geometry. + /// + /// + /// + /// + public static GeometryCurve DoesCurveExist(GeometryData geometry, GeometryCurve newCurve) + { + foreach (GeometryCurve curve in geometry.Curves) + { + if (curve.HeadPoint.LocationEquals(newCurve.HeadPoint) && curve.EndPoint.LocationEquals(newCurve.EndPoint) || + curve.HeadPoint.LocationEquals(newCurve.EndPoint) && curve.EndPoint.LocationEquals(newCurve.HeadPoint)) + return curve; + } + return null; + } + + public static void ExportFullGeometryToFile(GeometryData geometry, string fileName) + { + using (var writer = new StreamWriter(fileName)) + { + // Export newly effected points + writer.WriteLine("[BEGIN NEWLY EFFECTED POINTS]"); + foreach (Point2D point in geometry.NewlyEffectedPoints) + { + writer.WriteLine($"{point.X}, {point.Z}"); + } + writer.WriteLine("[END NEWLY EFFECTED POINTS]"); + + // Export newly effected curves + writer.WriteLine("[BEGIN NEWLY EFFECTED CURVES]"); + foreach (GeometryCurve curve in geometry.Curves) + { + writer.WriteLine($"Curve: ({curve.HeadPoint.X}, {curve.HeadPoint.Z}) - ({curve.EndPoint.X}, {curve.EndPoint.Z})"); + } + writer.WriteLine("[END NEWLY EFFECTED CURVES]"); + + // Export points + writer.WriteLine("[BEGIN POINTS]"); + foreach (Point2D point in geometry.Points) + { + writer.WriteLine($"{point.X}, {point.Z}"); + } + writer.WriteLine("[END POINTS]"); + + // Export curves + writer.WriteLine("[BEGIN CURVES]"); + foreach (GeometryCurve curve in geometry.Curves) + { + writer.WriteLine($"Curve: ({curve.HeadPoint.X}, {curve.HeadPoint.Z}) - ({curve.EndPoint.X}, {curve.EndPoint.Z})"); + } + writer.WriteLine("[END CURVES]"); + + // Export surfaces + writer.WriteLine("[BEGIN SURFACES]"); + foreach (GeometrySurface surface in geometry.Surfaces) + { + // Outerloop + writer.WriteLine($"Surface: {surface.Name}"); + writer.WriteLine($"OuterLoop: {surface.OuterLoop.Name}"); + foreach (GeometryCurve curve in surface.OuterLoop.CurveList) + { + writer.WriteLine($"({curve.HeadPoint.X}, {curve.HeadPoint.Z}) - ({curve.EndPoint.X}, {curve.EndPoint.Z})"); + } + + writer.WriteLine(""); + + // Innerloops + foreach (GeometryLoop innerLoop in surface.InnerLoops) + { + writer.WriteLine($"InnerLoop: {innerLoop.Name}"); + foreach (GeometryCurve curve in innerLoop.CurveList) + { + writer.WriteLine($"Curve: ({curve.HeadPoint.X}, {curve.HeadPoint.Z}) - ({curve.EndPoint.X}, {curve.EndPoint.Z})"); + } + + writer.WriteLine(""); + } + } + writer.WriteLine("[END SURFACES]"); + } + } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/Routines2D.cs =================================================================== diff -u -r5036 -r5256 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/Routines2D.cs (.../Routines2D.cs) (revision 5036) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/Routines2D.cs (.../Routines2D.cs) (revision 5256) @@ -509,7 +509,7 @@ /// The point2 x. /// The point2 z. /// The tolerance. - /// + /// true when points coincide public static bool DetermineIfPointsCoincide(double point1X, double point1Z, double point2X, double point2Z, double tolerance) { if ((Math.Abs(point1X - point2X)) < tolerance && Math.Abs(point1Z - point2Z) < tolerance) Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs =================================================================== diff -u -r5157 -r5256 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5157) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5256) @@ -66,19 +66,19 @@ { return false; } + + GeometryCurve beginCurve = CurveList[0]; + GeometryCurve endCurve = CurveList[^1]; + // Just check that the first and last curve are connected + if (beginCurve.HeadPoint == endCurve.HeadPoint || + beginCurve.HeadPoint == endCurve.EndPoint || + beginCurve.EndPoint == endCurve.HeadPoint || + beginCurve.EndPoint == endCurve.EndPoint) + { + return true; + } - //GeometryCurve beginCurve = CurveList[0]; - //GeometryCurve endCurve = CurveList[CurveList.Count - 1]; - - // if (beginCurve.HeadPoint == endCurve.HeadPoint || - // beginCurve.HeadPoint == endCurve.EndPoint || - // beginCurve.EndPoint == endCurve.HeadPoint || - // beginCurve.EndPoint == endCurve.EndPoint) - // { - // return true; #Bka is too simple as check, must be rewritten, true for now - // } - - return true;//false; + return false; } ///