Index: DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineHeightAdapter.cs =================================================================== diff -u -r3893 -r4000 --- DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineHeightAdapter.cs (.../SurfaceLineHeightAdapter.cs) (revision 3893) +++ DamEngine/trunk/src/Deltares.DamEngine.Calculators/DikesDesign/SurfaceLineHeightAdapter.cs (.../SurfaceLineHeightAdapter.cs) (revision 4000) @@ -36,9 +36,7 @@ /// /// /// - public SurfaceLineHeightAdapter(SurfaceLine2 surfaceLine, Location location, double scenarioPolderLevel) : base(surfaceLine, location, scenarioPolderLevel) - { - } + public SurfaceLineHeightAdapter(SurfaceLine2 surfaceLine, Location location, double scenarioPolderLevel) : base(surfaceLine, location, scenarioPolderLevel) {} /// /// Constructs a new surface line with a new height @@ -55,7 +53,6 @@ /// public SurfaceLine2 ConstructNewSurfaceLine(double newDikeHeight) { - //Input data GeometryPoint pointAtTopRiver = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver); GeometryPoint pointAtTopPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); @@ -68,23 +65,26 @@ if (Location.UseNewDikeSlopeOutside) { var newOutsideSlopePoint = new GeometryPoint - { - X = pointAtTopRiver.X + 100, - Z = pointAtTopRiver.Z + 100*Location.NewDikeSlopeOutside - }; + { + X = pointAtTopRiver.X + 100, + Z = pointAtTopRiver.Z + 100 * Location.NewDikeSlopeOutside + }; newPointAtTopRiver = LineHelper.GetIntersectionPointWithExtrapolation(pointAtTopRiver, newOutsideSlopePoint, - new GeometryPoint(pointAtTopRiver.X, newDikeHeight), - new GeometryPoint(pointAtTopPolder.X, newDikeHeight)); - oldPointAtTopRiver = new GeometryPoint {X = pointAtTopRiver.X, Z = pointAtTopRiver.Z}; + new GeometryPoint(pointAtTopRiver.X, newDikeHeight), + new GeometryPoint(pointAtTopPolder.X, newDikeHeight)); + oldPointAtTopRiver = new GeometryPoint + { + X = pointAtTopRiver.X, + Z = pointAtTopRiver.Z + }; } else { - newPointAtTopRiver = LineHelper.GetIntersectionPointWithExtrapolation(startingPoint,pointAtTopRiver, - new GeometryPoint(pointAtTopRiver.X, newDikeHeight), - new GeometryPoint(pointAtTopPolder.X, newDikeHeight)); + newPointAtTopRiver = LineHelper.GetIntersectionPointWithExtrapolation(startingPoint, pointAtTopRiver, + new GeometryPoint(pointAtTopRiver.X, newDikeHeight), + new GeometryPoint(pointAtTopPolder.X, newDikeHeight)); } // Determine the new point at DIKE TOP RIVER - double dikeTopWidth = pointAtTopPolder.X - pointAtTopRiver.X; if (Location.UseNewDikeTopWidth) @@ -93,15 +93,16 @@ } // Determine the new point at DIKE TOP POLDER - GeometryPoint newPointAtTopPolder = new GeometryPoint(newPointAtTopRiver.X + dikeTopWidth, newDikeHeight); - - var slopeTangentInside = (pointAtTopPolder.Z - pointDikeToeInward.Z) / (pointDikeToeInward.X - pointAtTopPolder.X); + var newPointAtTopPolder = new GeometryPoint(newPointAtTopRiver.X + dikeTopWidth, newDikeHeight); + + double slopeTangentInside = (pointAtTopPolder.Z - pointDikeToeInward.Z) / (pointDikeToeInward.X - pointAtTopPolder.X); if (Location.UseNewDikeSlopeInside) { slopeTangentInside = Location.NewDikeSlopeInside; } + // check case where the new top falls completely above the old top - var intersectionPointDikeTop = IntersectionpointWithOldDikeTop(newPointAtTopPolder, slopeTangentInside); + GeometryPoint intersectionPointDikeTop = IntersectionpointWithOldDikeTop(newPointAtTopPolder, slopeTangentInside); if (intersectionPointDikeTop != null) { // Remove all points between old dike top river and old dike top polder @@ -112,37 +113,40 @@ // check if intersection point equals old dike top polder, if so the ready else add intersection point as normal point if (!pointAtTopPolder.LocationEquals(intersectionPointDikeTop)) { - surfaceLine.EnsurePoint(intersectionPointDikeTop.X, intersectionPointDikeTop.Z); + surfaceLine.EnsurePoint(intersectionPointDikeTop.X, intersectionPointDikeTop.Z); } + surfaceLine.SortPoints(); return surfaceLine; } // Remove points on inside slope surfaceLine.RemoveSegmentBetween(pointAtTopPolder.X, pointDikeToeInward.X); // Store the ditch (if any) - var ditchDefinition = GetDitchDefinition(); + DitchDefinition? ditchDefinition = GetDitchDefinition(); // Delete the ditch from the surfaceline (if any) RemoveExistingDitch(ditchDefinition); // Adjust for the new slope - var slopePoint = ReplaceBaseInsideForNewSlope(newPointAtTopPolder, slopeTangentInside); + GeometryPoint slopePoint = ReplaceBaseInsideForNewSlope(newPointAtTopPolder, slopeTangentInside); // Reset pointDikeToeInward for new position pointDikeToeInward = surfaceLine.GetDikeToeInward(); // Remove all points between "old" dike top river side and new toe inward - surfaceLine.RemoveSegmentBetween(pointAtTopRiver.X, pointDikeToeInward.X); + surfaceLine.RemoveSegmentBetween(pointAtTopRiver.X, pointDikeToeInward.X); if (slopePoint != null) { // if the slope point exists (new end point of slope coincides with shouldertopinside), it has to be // re-added as "normal" point because it was deleted in the former RemoveSegmentBetween. surfaceLine.AddCharacteristicPoint(slopePoint, CharacteristicPointType.None); } + // Adjust position of "old" dike top river surfaceLine.EnsurePointOfType(newPointAtTopRiver.X, newPointAtTopRiver.Z, CharacteristicPointType.DikeTopAtRiver); if (Location.UseNewDikeSlopeOutside) { // Re-add the old dike top river as "normal" point surfaceLine.AddCharacteristicPoint(oldPointAtTopRiver, CharacteristicPointType.None); } + // Add the new dike top at polder side surfaceLine.EnsurePointOfType(newPointAtTopPolder.X, newPointAtTopPolder.Z, CharacteristicPointType.DikeTopAtPolder); // Restore Ditch (if any) @@ -165,18 +169,19 @@ { GeometryPoint res = null; var newPoint = new GeometryPoint - { - X = newPointAtTopPolder.X + 100, - Z = newPointAtTopPolder.Z - 100*slopeTangent - }; + { + X = newPointAtTopPolder.X + 100, + Z = newPointAtTopPolder.Z - 100 * slopeTangent + }; GeometryPoint dikeTopAtPolder = surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtPolder); - var ip = LineHelper.GetIntersectionPointWithExtrapolation(newPointAtTopPolder, newPoint, - surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver), - dikeTopAtPolder); + GeometryPoint ip = LineHelper.GetIntersectionPointWithExtrapolation(newPointAtTopPolder, newPoint, + surfaceLine.CharacteristicPoints.GetGeometryPoint(CharacteristicPointType.DikeTopAtRiver), + dikeTopAtPolder); if (ip != null && ip.X <= dikeTopAtPolder.X) { res = ip; } + return res; } }