Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs
===================================================================
diff -u -r1974 -r3079
--- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 1974)
+++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 3079)
@@ -33,6 +33,11 @@
///
public class GeometryData : GeometryObject
{
+ private GeometryGenerator geometryGenerator;
+ private readonly List newlyEffectedCurves = new List();
+ private readonly List newlyEffectedPoints = new List();
+ private bool isRegeneratingGeometry;
+
private readonly List curveDataList = new List();
private readonly List loopDataList = new List();
@@ -47,6 +52,14 @@
private bool updatingSurfaceLine;
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public GeometryData()
+ {
+ geometryGenerator = null;
+ }
+
#region properties
///
@@ -56,7 +69,7 @@
/// The points.
///
[Validate]
- public IList Points
+ public List Points
{
get
{
@@ -65,6 +78,20 @@
}
///
+ /// Gets the newly effected points.
+ ///
+ ///
+ /// The newly effected points.
+ ///
+ public List NewlyEffectedPoints
+ {
+ get
+ {
+ return newlyEffectedPoints;
+ }
+ }
+
+ ///
/// gets the Curve data list.
///
///
@@ -79,6 +106,20 @@
}
///
+ /// Gets the newly effected curves.
+ ///
+ ///
+ /// The newly effected curves.
+ ///
+ public List NewlyEffectedCurves
+ {
+ get
+ {
+ return newlyEffectedCurves;
+ }
+ }
+
+ ///
/// gets the Loop data list.
///
///
@@ -103,6 +144,35 @@
}
}
+ public void RegenerateGeometry()
+ {
+ if (isRegeneratingGeometry)
+ {
+ return;
+ }
+
+ isRegeneratingGeometry = true;
+ if (geometryGenerator == null)
+ {
+ geometryGenerator = new GeometryGenerator(this);
+ }
+ lock (this)
+ {
+ SynchronizeLoops();
+ RemoveDoublesFromNewlyEffectedPointsAndCurves();
+ Curves.Clear();
+ Points.Clear();
+ Points.AddRange(newlyEffectedPoints);
+ Curves.AddRange(newlyEffectedCurves);
+
+ geometryGenerator.GenerateGeometry();
+ newlyEffectedPoints.Clear();
+ newlyEffectedCurves.Clear();
+ UpdateSurfaceLine();
+ }
+ isRegeneratingGeometry = false;
+ }
+
///
/// Gets the minimum geometry points x.
///
@@ -225,6 +295,64 @@
}
}
+ public void RemoveDoublesFromNewlyEffectedPointsAndCurves()
+ {
+ var pdel = new List();
+ var par = newlyEffectedPoints.ToArray();
+ for (int i = 0; i < par.Length; i++)
+ {
+ for (int j = i; j < par.Length; j++)
+ {
+ if (i != j && par[i].LocationEquals(par[j]))
+ {
+ if (!pdel.Contains(par[j]))
+ {
+ pdel.Add(par[j]);
+ }
+ }
+ }
+ }
+ foreach (var point in pdel)
+ {
+ newlyEffectedPoints.Remove(point);
+ }
+
+ var cdel = new List();
+ var car = newlyEffectedCurves.ToArray();
+ // First remove all "illegal" newlyeffected curves
+ for (int i = 0; i < car.Length; i++)
+ {
+ if (car[i].HeadPoint == null || car[i].EndPoint == null || car[i].HeadPoint.LocationEquals(car[i].EndPoint))
+ {
+ cdel.Add(car[i]);
+ }
+ }
+ foreach (var curve in cdel)
+ {
+ newlyEffectedCurves.Remove(curve);
+ }
+ // then remove all real doubles
+ var car2 = newlyEffectedCurves.ToArray();
+ cdel.Clear();
+ for (int i = 0; i < car2.Length; i++)
+ {
+ for (int j = i; j < car2.Length; j++)
+ {
+ if (i != j && car2[i].LocationEquals(car2[j]))
+ {
+ if (!cdel.Contains(car2[j]))
+ {
+ cdel.Add(car2[j]);
+ }
+ }
+ }
+ }
+ foreach (var curve in cdel)
+ {
+ newlyEffectedCurves.Remove(curve);
+ }
+ }
+
///
/// Gets all points on the Left boundary.
///
@@ -295,10 +423,10 @@
pointDataList.Clear();
curveDataList.Clear();
surfaceDataList.Clear();
-
-// newlyEffectedPoints.Clear();
-// newlyEffectedCurves.Clear();
+ newlyEffectedPoints.Clear();
+ newlyEffectedCurves.Clear();
}
+
///
/// deletes all the Loop from IGeometryLoop.
///
@@ -338,7 +466,7 @@
}
///
- /// CheckIfIntersectStricktly
+ /// CheckIfIntersect
/// Determines if two lines intersect each other stricktly (so no extrapolated points).
///
/// Line 1 GeometryPoint 1
@@ -543,27 +671,26 @@
}
///
- /// Updates the line at the top of the geometry
+ /// Deletes the point and the curves it belongs too.
///
- private void UpdateSurfaceLine()
+ /// The point.
+ public void DeletePointWithCurves(Point2D point)
{
- if (updatingSurfaceLine)
+ var curvesToDelete = new List();
+ foreach (var curve in Curves)
{
- return;
+ if (curve.ContainsPoint(point))
+ {
+ curvesToDelete.Add(curve);
+ }
}
- updatingSurfaceLine = true;
-
- var bCurves = GetBoundaryCurves();
- if (bCurves.Count == 0)
+ foreach (var curveToDelete in curvesToDelete)
{
- surfaceLine.CalcPoints.Clear();
+ Curves.Remove(curveToDelete);
}
- var curvesCopy = GetCurvesCopy(bCurves);
- var curves = GetTopCurves(curvesCopy);
- CreateSurfaceLinePointString(curves);
- updatingSurfaceLine = false;
+ Points.Remove(point);
}
///
@@ -789,5 +916,30 @@
return (curve1.HeadPoint == curve2.HeadPoint || curve1.HeadPoint == curve2.EndPoint ||
curve1.EndPoint == curve2.HeadPoint || curve1.EndPoint == curve2.EndPoint);
}
+
+ ///
+ /// Updates the line at the top of the geometry
+ ///
+ private void UpdateSurfaceLine()
+ {
+ if (updatingSurfaceLine)
+ {
+ return;
+ }
+
+ updatingSurfaceLine = true;
+
+ var bCurves = GetBoundaryCurves();
+ if (bCurves.Count == 0)
+ {
+ surfaceLine.CalcPoints.Clear();
+ }
+ var curvesCopy = GetCurvesCopy(bCurves);
+ var curves = GetTopCurves(curvesCopy);
+ CreateSurfaceLinePointString(curves);
+
+ updatingSurfaceLine = false;
+ surfaceLine.SyncPoints();
+ }
}
}
\ No newline at end of file