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); } Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs =================================================================== diff -u -r5028 -r5034 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5028) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5034) @@ -66,8 +66,8 @@ return false; } - GeometryCurve beginCurve = CurveList[0]; - GeometryCurve endCurve = CurveList[CurveList.Count - 1]; + //GeometryCurve beginCurve = CurveList[0]; + //GeometryCurve endCurve = CurveList[CurveList.Count - 1]; // if (beginCurve.HeadPoint == endCurve.HeadPoint || // beginCurve.HeadPoint == endCurve.EndPoint || Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs =================================================================== diff -u -r5028 -r5034 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs (.../GeometryHelper.cs) (revision 5028) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryHelper.cs (.../GeometryHelper.cs) (revision 5034) @@ -229,7 +229,6 @@ var newCurve = new GeometryCurve(splitPoints[i - 1], splitPoints[i]); geometry.NewlyEffectedPoints.Add(splitPoints[i]); geometry.NewlyEffectedCurves.Add(newCurve); - //geometry.Curves.Add(newCurve); } } } Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryGenerator.cs =================================================================== diff -u -r5028 -r5034 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryGenerator.cs (.../GeometryGenerator.cs) (revision 5028) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryGenerator.cs (.../GeometryGenerator.cs) (revision 5034) @@ -956,35 +956,9 @@ geometryData.NewlyEffectedCurves.Clear(); foreach (GeometryCurve geometryCurve1 in geometryCurveList) { - foreach (GeometryCurve geometryCurve2 in this.geometryData.Curves.ToArray()) + foreach (GeometryCurve geometryCurve2 in geometryData.Curves.ToArray()) { - Point2D pointXz1 = geometryCurve1.HeadPoint; - Point2D pointXz2 = geometryCurve1.EndPoint; - Point2D pointXz3 = geometryCurve2.HeadPoint; - Point2D pointXz4 = geometryCurve2.EndPoint; - Point2D intersectionPoint; - if (geometryCurve1 != geometryCurve2 && - !RegenerateParallelCurves(geometryCurve2, geometryCurve1, ref isCurveInserted) && - Routines2D.DetermineIf2DLinesIntersectStrickly(pointXz1, pointXz2, pointXz3, pointXz4, out intersectionPoint) == - LineIntersection.Intersects) - { - if (!Routines2D.DetermineIfPointsCoincide(pointXz1.X, pointXz1.Z, intersectionPoint.X, intersectionPoint.Z, 0.001) - && !Routines2D.DetermineIfPointsCoincide(pointXz2.X, pointXz2.Z, intersectionPoint.X, intersectionPoint.Z, 0.001)) - { - Point2D point = this.geometryData.CreatePoint(new Point2D(intersectionPoint.X, intersectionPoint.Z), true); - SplitCurve(geometryCurve1, point); - flag = true; - } - - if (!Routines2D.DetermineIfPointsCoincide(pointXz3.X, pointXz3.Z, intersectionPoint.X, intersectionPoint.Z, 0.001) && - !Routines2D.DetermineIfPointsCoincide(pointXz4.X, pointXz4.Z, intersectionPoint.X, intersectionPoint.Z, 0.001)) - { - Point2D point = this.geometryData.CreatePoint(new Point2D(intersectionPoint.X, intersectionPoint.Z), - true); - SplitCurve(geometryCurve2, point); - flag = true; - } - } + isCurveInserted = FindAndHandleCurveIntersections(geometryCurve1, geometryCurve2, isCurveInserted, ref flag); } } @@ -1001,6 +975,38 @@ // } } + private bool FindAndHandleCurveIntersections(GeometryCurve geometryCurve1, GeometryCurve geometryCurve2, bool isCurveInserted, ref bool flag) + { + Point2D pointXz1 = geometryCurve1.HeadPoint; + Point2D pointXz2 = geometryCurve1.EndPoint; + Point2D pointXz3 = geometryCurve2.HeadPoint; + Point2D pointXz4 = geometryCurve2.EndPoint; + if (geometryCurve1 != geometryCurve2 && + !RegenerateParallelCurves(geometryCurve2, geometryCurve1, ref isCurveInserted) && + Routines2D.DetermineIf2DLinesIntersectStrickly(pointXz1, pointXz2, pointXz3, pointXz4, out Point2D intersectionPoint) == + LineIntersection.Intersects) + { + if (!Routines2D.DetermineIfPointsCoincide(pointXz1.X, pointXz1.Z, intersectionPoint.X, intersectionPoint.Z, 0.001) + && !Routines2D.DetermineIfPointsCoincide(pointXz2.X, pointXz2.Z, intersectionPoint.X, intersectionPoint.Z, 0.001)) + { + Point2D point = this.geometryData.CreatePoint(new Point2D(intersectionPoint.X, intersectionPoint.Z), true); + SplitCurve(geometryCurve1, point); + flag = true; + } + + if (!Routines2D.DetermineIfPointsCoincide(pointXz3.X, pointXz3.Z, intersectionPoint.X, intersectionPoint.Z, 0.001) && + !Routines2D.DetermineIfPointsCoincide(pointXz4.X, pointXz4.Z, intersectionPoint.X, intersectionPoint.Z, 0.001)) + { + Point2D point = this.geometryData.CreatePoint(new Point2D(intersectionPoint.X, intersectionPoint.Z), + true); + SplitCurve(geometryCurve2, point); + flag = true; + } + } + + return isCurveInserted; + } + private void MergePoints() { //try @@ -1214,7 +1220,7 @@ } } - private void SetPointInCurves(List aCurveList, Point2D aPoint, bool aHead) + private static void SetPointInCurves(List aCurveList, Point2D aPoint, bool aHead) { int count = aCurveList.Count; if (count < 1) @@ -1250,12 +1256,10 @@ geometryData.DeleteCurve(aCurve, true); } - private bool CheckAndAddToIntersectedCurveList(GeometryCurve aCurve) + private void CheckAndAddToIntersectedCurveList(GeometryCurve aCurve) { - if (intersectedCurveList.Contains(aCurve)) - return false; - intersectedCurveList.Add(aCurve); - return true; + if (!intersectedCurveList.Contains(aCurve)) + intersectedCurveList.Add(aCurve); } /// Index: DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs =================================================================== diff -u -r5028 -r5034 --- DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs (.../GeometryHelperTests.cs) (revision 5028) +++ DamEngine/trunk/src/Deltares.DamEngine.Data.Tests/Geotechnics/GeometryHelperTests.cs (.../GeometryHelperTests.cs) (revision 5034) @@ -62,11 +62,11 @@ Assert.That(geometryBounds.Left, Is.EqualTo(-2).Within(cTolerance)); Assert.That(soilProfile2D.Geometry.Left, Is.EqualTo(-2).Within(cTolerance)); // At first there are 3 surfaces, but after extending the right boundary, there are 6 surfaces - Assert.That(soilProfile2D.Geometry.Surfaces.Count, Is.EqualTo(6)); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(6)); // the number of points should now be 12 + 4 = 16 - Assert.That(soilProfile2D.Geometry.Points.Count, Is.EqualTo(16)); + Assert.That(soilProfile2D.Geometry.Points, Has.Count.EqualTo(16)); // the number of curves should now be 14 + 7 = 21 - Assert.That(soilProfile2D.Geometry.Curves.Count, Is.EqualTo(21)); + Assert.That(soilProfile2D.Geometry.Curves, Has.Count.EqualTo(21)); }); } @@ -97,11 +97,11 @@ { Assert.That(soilProfile2D.Geometry.Right, Is.EqualTo(12).Within(cTolerance)); // At first there are 3 surfaces, but after extending the right boundary, there are 6 surfaces - Assert.That(soilProfile2D.Geometry.Surfaces.Count, Is.EqualTo(6)); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(6)); // the number of points should now be 12 + 4 = 16 - Assert.That(soilProfile2D.Geometry.Points.Count, Is.EqualTo(16)); + Assert.That(soilProfile2D.Geometry.Points, Has.Count.EqualTo(16)); // the number of curves should now be 14 + 7 = 21 - Assert.That(soilProfile2D.Geometry.Curves.Count, Is.EqualTo(21)); + Assert.That(soilProfile2D.Geometry.Curves, Has.Count.EqualTo(21)); }); } @@ -137,11 +137,11 @@ Assert.That(geometryBounds.Left, Is.EqualTo(2).Within(cTolerance)); Assert.That(soilProfile2D.Geometry.Left, Is.EqualTo(2).Within(cTolerance)); // At first there are 3 surfaces, after cutting the boundary, there still must be 3 surfaces - Assert.That(soilProfile2D.Geometry.Surfaces.Count, Is.EqualTo(3)); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(3)); // At first there are 12 points, after cutting the boundary, there still must be 12 points - Assert.That(soilProfile2D.Geometry.Points.Count, Is.EqualTo(12)); + Assert.That(soilProfile2D.Geometry.Points, Has.Count.EqualTo(12)); // At first there are 14 curves, after cutting the boundary, there still must be 14 curves - Assert.That(soilProfile2D.Geometry.Curves.Count, Is.EqualTo(14)); + Assert.That(soilProfile2D.Geometry.Curves, Has.Count.EqualTo(14)); }); } @@ -167,11 +167,11 @@ Assert.That(geometryBounds.Right, Is.EqualTo(8).Within(cTolerance)); Assert.That(soilProfile2D.Geometry.Right, Is.EqualTo(8).Within(cTolerance)); // At first there are 3 surfaces, after cutting the boundary, there still must be 3 surfaces - Assert.That(soilProfile2D.Geometry.Surfaces.Count, Is.EqualTo(3)); + Assert.That(soilProfile2D.Geometry.Surfaces, Has.Count.EqualTo(3)); // At first there are 12 points, after cutting the boundary, there still must be 12 points - Assert.That(soilProfile2D.Geometry.Points.Count, Is.EqualTo(12)); + Assert.That(soilProfile2D.Geometry.Points, Has.Count.EqualTo(12)); // At first there are 14 curves, after cutting the boundary, there still must be 14 curves - Assert.That(soilProfile2D.Geometry.Curves.Count, Is.EqualTo(14)); + Assert.That(soilProfile2D.Geometry.Curves, Has.Count.EqualTo(14)); }); } } \ No newline at end of file