Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs =================================================================== diff -u -r5259 -r5260 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 5259) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 5260) @@ -203,88 +203,58 @@ IList points = surfaceLine.CalcPoints; GeometryData geometry = result.Geometry; Point2D current1 = points[0].Clone(); - Point2D startPoint1 = new Point2D(current1.X, current1.Z); - Point2D current2 = HandleConnectionPointOfSurfaceLineToGeometry(ref result, startPoint1, current1, geometry, true); + var existingPoint1 = geometry.GetPointAtLocation(current1, GeometryConstants.Accuracy); + if (existingPoint1 == null) + { + Point2D[] leftPoints = geometry.GetLeftPoints().OrderBy(x => x.Z).ToArray(); + geometry.NewlyEffectedPoints.Add(current1); + if (leftPoints[^1].Z < current1.Z) + { + GeometryCurve newLeftCurve = new GeometryCurve(leftPoints[^1], current1); + result.Geometry.NewlyEffectedCurves.Add(newLeftCurve); + } + } + else + { + current1 = existingPoint1; + } + Point2D current2; int index = 1; while (index < points.Count) { - Point2D headPoint = current2; current2 = points[index].Clone(); - if (index == checked (points.Count - 1)) + var existingPoint2 = geometry.GetPointAtLocation(current2, GeometryConstants.Accuracy); + if (existingPoint2 == null) { - Point2D startPoint2 = new Point2D(current2.X, current2.Z); - current2 = HandleConnectionPointOfSurfaceLineToGeometry(ref result, startPoint2, current2, geometry, false); + if (index == checked (points.Count - 1)) + { + Point2D[] rightPoints = geometry.GetRightPoints().OrderBy(x => x.Z).ToArray(); + geometry.NewlyEffectedPoints.Add(current2); + if (rightPoints[^1].Z < current2.Z) + { + GeometryCurve newRightCurve = new GeometryCurve(rightPoints[^1], current2); + result.Geometry.NewlyEffectedCurves.Add(newRightCurve); + } + } + else + { + geometry.NewlyEffectedPoints.Add(current2); + } } else { - Point2D point3D = new Point2D(current2.X, current2.Z); - Point2D point = result.Geometry.GetPoint(point3D, 0.001); - if (point != null) - current2 = point; - else - geometry.Points.Add(current2); + current2 = existingPoint2; } - Point2D endPoint = current2; - GeometryCurve newCurve = new GeometryCurve(headPoint, endPoint); - if (!DoesCurveExist(result.Geometry, newCurve)) - result.Geometry.Curves.Add(newCurve); - checked { ++index; } - } - } - - private static bool DoesCurveExist(GeometryData geometry, GeometryCurve newCurve) - { - foreach (GeometryCurve curve in geometry.Curves) - { - if (curve.HeadPoint == newCurve.HeadPoint && curve.EndPoint == newCurve.EndPoint || - curve.HeadPoint == newCurve.EndPoint && curve.EndPoint == newCurve.HeadPoint) - return true; - } - return false; - } - - private static Point2D HandleConnectionPointOfSurfaceLineToGeometry(ref SoilProfile2D result, Point2D startPoint, - Point2D current, GeometryData data, bool forLeftSide) - { - Point2D point = result.Geometry.GetPoint(startPoint, 0.001); - if (point != null) - { - current = point; - } - else - { - List aCurveList = new List(); - result.Geometry.GetCurvesCoincidingInputPoint(startPoint, ref aCurveList); - if (aCurveList.Count == 0) + GeometryCurve newCurve = new GeometryCurve(current1, current2); + if (GeometryHelper.DoesCurveExist(result.Geometry, newCurve) == null) { - Point2D headPoint = !forLeftSide ? result.Geometry.GetRightPoints().OrderBy((Func) (a => a.Z)).Last() : - result.Geometry.GetLeftPoints().OrderBy((Func) - (a => a.Z)).Last(); - data.Points.Add(current); - GeometryCurve geometryCurve = new GeometryCurve(headPoint, current); - data.Curves.Add(geometryCurve); + result.Geometry.NewlyEffectedCurves.Add(newCurve); } - else if (aCurveList.Count == 1) - SplitCurveAtPoint(data, aCurveList[0], current); + current1 = current2; + index++; } - return current; } - private static void SplitCurveAtPoint(GeometryData geometry, GeometryCurve geometryCurve, Point2D splitPoint) - { - Point2D point = geometry.GetPoint(new Point2D(splitPoint.X, splitPoint.Z), 0.001); - if (point == null) - geometry.Points.Add(splitPoint); - else - splitPoint = point; - GeometryCurve geometryCurve1 = geometryCurve; - Point2D endPoint = geometryCurve1.EndPoint; - geometryCurve1.EndPoint = splitPoint; - GeometryCurve geometryCurve2 = new GeometryCurve(splitPoint, endPoint); - geometry.Curves.Add(geometryCurve2); - } - private static void RemoveGeometryDataOfSoilProfileAboveSurfaceLine(GeometryPointString surfaceLine, ref SoilProfile2D result) { GeometryData geometry = result.Geometry;