Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5028 -r5034 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5028) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5034) @@ -1163,69 +1163,69 @@ public Point2D CreatePoint(Point2D requestedPoint, bool snapToExistingPoint) { - long num = 0; - Point2D newPoint = null; - bool flag1 = false; - if (num < 1L) + Point2D newPoint = DetermineNewPointAndFlags(requestedPoint, snapToExistingPoint, out bool flag1, out bool flag2); + if (!flag2 && snapToExistingPoint) { - bool flag2 = false; + int count = Curves.Count; + for (int index = 0; index < count; ++index) + { + GeometryCurve curve = Curves[index]; + if (Routines2D.DoesPointExistInLine(curve.HeadPoint, curve.EndPoint, newPoint, 0.25)) + { + Routines2D.GetPointOnLineClosestTo(newPoint.X, newPoint.Z, curve.HeadPoint.X, curve.HeadPoint.Z, + curve.EndPoint.X, curve.EndPoint.Z, out double aResultX, + out double aResultZ); + newPoint.X = aResultX; + newPoint.Z = aResultZ; + break; + } + } + } + if (!NewlyEffectedPoints.Contains(newPoint) && !flag1) + NewlyEffectedPoints.Add(newPoint); + return newPoint; + } + + private Point2D DetermineNewPointAndFlags(Point2D requestedPoint, bool snapToExistingPoint, out bool flag1, out bool flag2) + { + Point2D newPoint = null; + flag1 = false; + flag2 = false; if (snapToExistingPoint) - newPoint = GetPoint(requestedPoint, 0.001); + newPoint = GetPoint(requestedPoint, 0.001); if (newPoint != null) { - requestedPoint.X = newPoint.X; - requestedPoint.Z = newPoint.Z; - if (!Points.Contains(requestedPoint)) - newPoint = null; - else - flag1 = true; + requestedPoint.X = newPoint.X; + requestedPoint.Z = newPoint.Z; + if (!Points.Contains(requestedPoint)) + newPoint = null; + else + flag1 = true; } if (newPoint == null) { - newPoint = new Point2D(requestedPoint.X, requestedPoint.Z); - Create((IGeometryObject) newPoint); + newPoint = new Point2D(requestedPoint.X, requestedPoint.Z); + Create((IGeometryObject) newPoint); } else - flag2 = true; - if (!flag2 & snapToExistingPoint) - { - int count = this.Curves.Count; - for (int index = 0; index < count; ++index) - { - GeometryCurve curve = this.Curves[index]; - if (Routines2D.DoesPointExistInLine(curve.HeadPoint, curve.EndPoint, newPoint, 0.25)) - { - double aResultX; - double aResultZ; - Routines2D.GetPointOnLineClosestTo(newPoint.X, newPoint.Z, curve.HeadPoint.X, curve.HeadPoint.Z, - curve.EndPoint.X, curve.EndPoint.Z, out aResultX, out aResultZ); - newPoint.X = aResultX; - newPoint.Z = aResultZ; - break; - } - } - } - } - if (!NewlyEffectedPoints.Contains(newPoint) && !flag1) - NewlyEffectedPoints.Add(newPoint); - return newPoint; + flag2 = true; + + return newPoint; } - + public IGeometryObject Create(IGeometryObject aData) { if (aData == null) return (IGeometryObject) null; if (aData.GetType() == typeof (Point2D)) { Point2D point = (Point2D) aData; - this.Points.Add(point); - //point.Name = (pointIndex++.ToString()); + Points.Add(point); } else if (aData.GetType() == typeof (GeometryCurve)) { GeometryCurve geometryCurve = (GeometryCurve) aData; Curves.Add(geometryCurve); - //geometryCurve.SetName(this.curveIndex++.ToString()); } else if (aData.GetType() == typeof (GeometryLoop)) Loops.Add((GeometryLoop) aData); @@ -1261,26 +1261,11 @@ double angle = Routines2D.FindAngle(line1Point1, aPoint, line2Point1, aPoint); if (angle.IsGreaterThanOrEqualTo(179.0) && angle.IsLessThanOrEqualTo(181.0)) { - for (int index = 0; index < Curves.Count - 1; ++index) - { - if (Curves[index] == source[0]) - { - if (Curves[index].EndPoint != source[1].EndPoint && aPoint == source[0].HeadPoint && aPoint == source[1].HeadPoint) - Curves[index].HeadPoint = source[1].EndPoint; - else if (Curves[index].EndPoint != source[1].EndPoint && aPoint == source[1].HeadPoint) - Curves[index].EndPoint = source[1].EndPoint; - else if (Curves[index].HeadPoint != source[1].HeadPoint && aPoint == Curves[index].EndPoint) - Curves[index].EndPoint = source[1].HeadPoint; - else if (Curves[index].HeadPoint == source[1].EndPoint) - Curves[index].HeadPoint = source[1].HeadPoint; - Remove(aPoint, false); - Remove(source[1], false); - } - } + FixCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(aPoint, source); } } Remove(aPoint, false); - if (source.Any((Func) (curve => curve.SurfaceAtLeft != null || curve.SurfaceAtRight != null))) + if (source.Exists((curve => curve.SurfaceAtLeft != null || curve.SurfaceAtRight != null))) flag = true; foreach (GeometryCurve aCurve in source) DeleteCurve(aCurve, true); @@ -1289,54 +1274,34 @@ Remove(aPoint, false); return false; } - - public GeometryCurve CreateCurve(List points, Point2D aPoint1, Point2D aPoint2) + + private void FixCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(Point2D aPoint, List source) { - if (aPoint1 == null && aPoint2 == null) - { - if (points.Count < 1) - return null; - Point2D geometryPoint1 = null; - if (points.Count == 1) + for (int index = 0; index < Curves.Count - 1; ++index) { - Point2D point = points[0]; - Point2D aPoint = new Point2D(point.X, point.Z); - List aCurveList = new List(); - GetCurvesCoincidingInputPoint(aPoint, ref aCurveList); - if (aCurveList.Count <= 0) - return null; - geometryGenerator.SplitCurvesAtCoincidentPoint(CreatePoint(point, true), aCurveList); - } - else - { - for (int index = 0; index < points.Count - 1; ++index) - { - Point2D geometryPoint2 = index != 0 ? geometryPoint1 : CreatePoint(points[index], true); - geometryPoint1 = CreatePoint(points[index + 1], true); - bool flag = false; - foreach (GeometryCurve curve in Curves) + if (Curves[index] == source[0]) { - if (curve.HeadPoint == geometryPoint2 && curve.EndPoint == geometryPoint1 || - curve.HeadPoint == geometryPoint1 && curve.EndPoint == geometryPoint2) - { - flag = true; - } + if (Curves[index].EndPoint != source[1].EndPoint && aPoint == source[0].HeadPoint && aPoint == source[1].HeadPoint) + Curves[index].HeadPoint = source[1].EndPoint; + else if (Curves[index].EndPoint != source[1].EndPoint && aPoint == source[1].HeadPoint) + Curves[index].EndPoint = source[1].EndPoint; + else if (Curves[index].HeadPoint != source[1].HeadPoint && aPoint == Curves[index].EndPoint) + Curves[index].EndPoint = source[1].HeadPoint; + else if (Curves[index].HeadPoint == source[1].EndPoint) + Curves[index].HeadPoint = source[1].HeadPoint; + Remove(aPoint, false); + Remove(source[1], false); } - if (!flag) - { - GeometryCurve geometryCurve = new GeometryCurve(); - geometryGenerator.SetIsUsed(geometryCurve, CurveDirection.Forward, false); - geometryGenerator.SetIsUsed(geometryCurve, CurveDirection.Reverse, false); - geometryCurve.HeadPoint = geometryPoint2; - geometryCurve.EndPoint = geometryPoint1; - Create((IGeometryObject) geometryCurve); - NewlyEffectedCurves.Add(geometryCurve); - } - } } - RegenerateGeometry(); // #Bka: dit is een directe call, geen delayed invoke. Kan tot problemen leiden (eeuwig ronddraaien) - return Curves.Count > 0 ? Curves[0] : (GeometryCurve) null; + } + + public GeometryCurve CreateCurve(List points, Point2D aPoint1, Point2D aPoint2) + { + if (HandleEmptyPointsGeometryCurve(points, aPoint1, aPoint2, out GeometryCurve geometryCurve1)) + { + return geometryCurve1; } + foreach (GeometryCurve curve in this.Curves) { if (curve.HeadPoint == aPoint1 && curve.EndPoint == aPoint2 || curve.HeadPoint == aPoint2 && curve.EndPoint == aPoint1) @@ -1349,18 +1314,79 @@ geometryGenerator.SetIsUsed(curve1, CurveDirection.Reverse, false); curve1.HeadPoint = aPoint1; curve1.EndPoint = aPoint2; - this.Create((IGeometryObject) curve1); + Create((IGeometryObject) curve1); NewlyEffectedCurves.Add(curve1); return curve1; } - - public void GetCurvesCoincidingInputPoint(Point2D aPoint, ref List aCurveList) + + private bool HandleEmptyPointsGeometryCurve(List points, Point2D aPoint1, Point2D aPoint2, out GeometryCurve geometryCurve1) { + if (aPoint1 == null && aPoint2 == null) + { + if (points.Count < 1) + { + geometryCurve1 = null; + return true; + } + + Point2D geometryPoint1 = null; + if (points.Count == 1) + { + Point2D point = points[0]; + Point2D aPoint = new Point2D(point.X, point.Z); + List aCurveList = new List(); + GetCurvesCoincidingInputPoint(aPoint, ref aCurveList); + if (aCurveList.Count <= 0) + { + geometryCurve1 = null; + return true; + } + + geometryGenerator.SplitCurvesAtCoincidentPoint(CreatePoint(point, true), aCurveList); + } + else + { + for (int index = 0; index < points.Count - 1; ++index) + { + Point2D geometryPoint2 = index != 0 ? geometryPoint1 : CreatePoint(points[index], true); + geometryPoint1 = CreatePoint(points[index + 1], true); + bool flag = false; + foreach (GeometryCurve curve in Curves) + { + if (curve.HeadPoint == geometryPoint2 && curve.EndPoint == geometryPoint1 || + curve.HeadPoint == geometryPoint1 && curve.EndPoint == geometryPoint2) + { + flag = true; + } + } + if (!flag) + { + GeometryCurve geometryCurve = new GeometryCurve(); + geometryGenerator.SetIsUsed(geometryCurve, CurveDirection.Forward, false); + geometryGenerator.SetIsUsed(geometryCurve, CurveDirection.Reverse, false); + geometryCurve.HeadPoint = geometryPoint2; + geometryCurve.EndPoint = geometryPoint1; + Create((IGeometryObject) geometryCurve); + NewlyEffectedCurves.Add(geometryCurve); + } + } + } + // #Bka: this is a direct call instead of a delayed invoke. Can lead to problems (endless spinning) + RegenerateGeometry(); + geometryCurve1 = Curves.Count > 0 ? Curves[0] : (GeometryCurve) null; + return true; + } + geometryCurve1 = null; + return false; + } + + private void GetCurvesCoincidingInputPoint(Point2D aPoint, ref List aCurveList) + { aCurveList.Clear(); - int count = this.Curves.Count; + int count = Curves.Count; for (int index = 0; index < count; ++index) { - GeometryCurve curve = this.Curves[index]; + GeometryCurve curve = Curves[index]; if (Routines2D.DoesPointExistInLine(curve.HeadPoint, curve.EndPoint, aPoint, 0.001)) aCurveList.Add(curve); }