Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs =================================================================== diff -u -r5768 -r5772 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 5768) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geotechnics/SoilProfile2DSurfaceLineHelper.cs (.../SoilProfile2DSurfaceLineHelper.cs) (revision 5772) @@ -80,7 +80,6 @@ SoilProfile2D clonedProfile = soilProfile2D.Clone(); GeometryPointString clonedSurfaceLine = surfaceLine.Clone(); - RoundCoordinates(clonedProfile.Geometry, clonedSurfaceLine); GeometryPointString originalSurfaceLine = soilProfile2D.Geometry.SurfaceLine; shift = GeometryObject.RoundValue(shift); if (Math.Abs(shift) >= GeometryConstants.Accuracy) @@ -107,7 +106,7 @@ var result = new SoilProfile2D(); result.Name = soilProfile2D.Name; - BuildGeometryModel(clonedSurfaceLine, clonedProfile, ref result); + result.Geometry = CreateNewGeometryForSoilProfile2DByCombiningItsGeometryWithSurfaceLine(clonedSurfaceLine, clonedProfile.Geometry); RemoveGeometryDataOfSoilProfileAboveSurfaceLine(clonedSurfaceLine, ref result); ReconstructSurfaces(ref result, originalSurfaceLine, oldSurfaces, defaultSoil, shift); @@ -140,7 +139,7 @@ private static void RoundCoordinates(GeometryData geometry, GeometryPointString surfaceLine = null) { - const double accuracy = 1e-7; + const double accuracy = 1e-3; foreach (Point2D point in geometry.Points) { point.X = Point2D.RoundValue(point.X, accuracy); @@ -155,49 +154,45 @@ surfaceLine.RoundPointsCoordinates(accuracy); } } - private static void AddGeometryIntersectionsToSurfaceLine(GeometryData geometry, ref GeometryPointString clonedSurfaceLine) + + private static GeometryData CreateNewGeometryForSoilProfile2DByCombiningItsGeometryWithSurfaceLine( + GeometryPointString surfaceLine, GeometryData originalGeometry) //SoilProfile2D soilProfile2D) { - var pointList = new List(); - foreach (GeometryLoop outerLoop in geometry.Surfaces.Select(surface => surface.OuterLoop)) + //SoilProfile2D clonedProfile2 = soilProfile2D.Clone(); + var resultGeometry = originalGeometry.Clone(); + if (resultGeometry == null) { - outerLoop.SyncCalcPoints(); - pointList.AddRange(clonedSurfaceLine.IntersectionXzPointsWithGeometryPointList(outerLoop.CalcPoints)); + return null; } - foreach (Point2D point in pointList) + + if (resultGeometry.Curves == null || resultGeometry.Curves.Count < 3) { - if (clonedSurfaceLine.DeterminePointAt(point.X, point.Z) == null) - clonedSurfaceLine.CalcPoints.Add(point); + return null; } - clonedSurfaceLine.SyncPoints(); - clonedSurfaceLine.SortPointsByXAscending(); - } - - private static void BuildGeometryModel(GeometryPointString surfaceLine, SoilProfile2D soilProfile2D, ref SoilProfile2D resultSoilProfile2D) - { - SoilProfile2D clonedProfile2 = soilProfile2D.Clone(); - resultSoilProfile2D.Geometry = clonedProfile2.Geometry; - if (resultSoilProfile2D.Geometry.Curves == null || resultSoilProfile2D.Geometry.Curves.Count < 3) - return; - resultSoilProfile2D.Geometry.Rebox(); + + resultGeometry.Rebox(); if (surfaceLine == null || surfaceLine.Points.Count <= 2) - return; - if (resultSoilProfile2D.Geometry.NewlyEffectedCurves.Count > 0 || resultSoilProfile2D.Geometry.NewlyEffectedPoints.Count > 0) { - return; + return null; } - GeometryData geometry = resultSoilProfile2D.Geometry; - AdaptGeometryToSurfaceLineLimits(surfaceLine, ref geometry); - AddLeadingSurfaceLineToGeometry(surfaceLine, ref geometry); + if (resultGeometry.NewlyEffectedCurves.Count > 0 || resultGeometry.NewlyEffectedPoints.Count > 0) + { + return null; + } - resultSoilProfile2D.Geometry.NewlyEffectedPoints.AddRange((IEnumerable) resultSoilProfile2D.Geometry.Points); - resultSoilProfile2D.Geometry.NewlyEffectedCurves.AddRange((IEnumerable) resultSoilProfile2D.Geometry.Curves); - resultSoilProfile2D.Geometry.Surfaces.Clear(); - resultSoilProfile2D.Geometry.Curves.Clear(); - resultSoilProfile2D.Geometry.Points.Clear(); - resultSoilProfile2D.Geometry.RegenerateGeometry(); - resultSoilProfile2D.Geometry.DeleteLoosePoints(); - resultSoilProfile2D.Geometry.DeleteLooseCurves(); + AdaptGeometryToSurfaceLineLimits(surfaceLine, ref resultGeometry); + AddLeadingSurfaceLineToGeometry(surfaceLine, ref resultGeometry); + + resultGeometry.NewlyEffectedPoints.AddRange((IEnumerable) resultGeometry.Points); + resultGeometry.NewlyEffectedCurves.AddRange((IEnumerable) resultGeometry.Curves); + resultGeometry.Surfaces.Clear(); + resultGeometry.Curves.Clear(); + resultGeometry.Points.Clear(); + resultGeometry.RegenerateGeometry(); + resultGeometry.DeleteLoosePoints(); + resultGeometry.DeleteLooseCurves(); + return resultGeometry; } private static void AdaptGeometryToSurfaceLineLimits(GeometryPointString surfaceLine, ref GeometryData geometryData)