Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5460 -r5494 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5460) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5494) @@ -51,7 +51,7 @@ /// /// Ordered list of all geometry points at the surface /// - public virtual GeometryPointString SurfaceLine + public GeometryPointString SurfaceLine { get { @@ -142,11 +142,13 @@ { foreach (Point2D geometryPoint in Points.ToArray()) { - if (this.GetDependentCurveCount(geometryPoint) == 0) - this.Remove((IGeometryObject) geometryPoint, true); + if (GetDependentCurveCount(geometryPoint) == 0) + { + Remove(geometryPoint, true); + } } } - + /// /// Deletes all the loose curves. /// Returns true when the loose curve is inside publisherEventArgs surface. @@ -159,16 +161,17 @@ { geometryGenerator = new GeometryGenerator(this); } + geometryGenerator.SetupCurveSurfaceAssociations(); var regenerateGeometry = false; var curvesToDelete = new List(); foreach (GeometryCurve curve in Curves) { - if ((curve.SurfaceAtLeft == null && curve.SurfaceAtRight == null)) + if (curve.SurfaceAtLeft == null && curve.SurfaceAtRight == null) { curvesToDelete.Add(curve); } - else if ((curve.SurfaceAtLeft != null && curve.SurfaceAtRight != null) && + else if (curve.SurfaceAtLeft != null && curve.SurfaceAtRight != null && (curve.SurfaceAtLeft == curve.SurfaceAtRight)) { regenerateGeometry = true; @@ -287,6 +290,264 @@ } /// + /// Updates the line at the top of the geometry + /// + public void UpdateSurfaceLine() + { + if (updatingSurfaceLine) + { + return; + } + + updatingSurfaceLine = true; + + List bCurves = GetBoundaryCurves(); + if (bCurves.Count == 0) + { + surfaceLine.CalcPoints.Clear(); + } + + List curvesCopy = GetCurvesCopy(bCurves); + List curves = GetTopCurves(curvesCopy); + CreateSurfaceLinePointString(curves); + + updatingSurfaceLine = false; + surfaceLine.SyncPoints(); + } + + public Point2D CreatePoint(Point2D requestedPoint, bool snapToExistingPoint) + { + Point2D newPoint = DetermineNewPointAndFlags(requestedPoint, out bool flag1, out bool flag2); + if (!flag2 && snapToExistingPoint) + { + int count = Curves.Count; + for (var index = 0; index < count; ++index) + { + GeometryCurve curve = Curves[index]; + if (Routines2D.DoesPointExistInLine(curve.HeadPoint, curve.EndPoint, newPoint, GeometryConstants.Accuracy)) + { + Routines2D.GetPointOnLineClosestTo(newPoint.X, newPoint.Z, curve.HeadPoint.X, curve.HeadPoint.Z, + curve.EndPoint.X, curve.EndPoint.Z, out Point2D aResultPoint); + + newPoint.X = aResultPoint.X; + newPoint.Z = aResultPoint.Z; + break; + } + } + } + + if (!NewlyEffectedPoints.Contains(newPoint) && !flag1) + { + NewlyEffectedPoints.Add(newPoint); + } + + return newPoint; + } + + public bool DeletePoint(Point2D aPoint) + { + var flag = false; + var source = new List(); + if (Curves.Count > 0) + { + source.AddRange(Curves.Where((Func) (c => c.HeadPoint == aPoint || c.EndPoint == aPoint))); + if (source.Count == 2) + { + CheckForCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(aPoint, source); + } + + Remove(aPoint, false); + if (source.Exists(curve => curve.SurfaceAtLeft != null || curve.SurfaceAtRight != null)) + { + flag = true; + } + + foreach (GeometryCurve aCurve in source) + { + DeleteCurve(aCurve, true); + } + + return flag; + } + + Remove(aPoint, false); + return false; + } + + public GeometryCurve CreateCurve(Point2D aPoint1, Point2D aPoint2) + { + foreach (GeometryCurve curve in Curves) + { + if (curve.HeadPoint == aPoint1 && curve.EndPoint == aPoint2 || curve.HeadPoint == aPoint2 && curve.EndPoint == aPoint1) + { + return curve; + } + } + + var curve1 = new GeometryCurve(); + geometryGenerator.SetIsUsed(curve1, CurveDirection.Forward, false); + geometryGenerator.SetIsUsed(curve1, CurveDirection.Reverse, false); + curve1.HeadPoint = aPoint1; + curve1.EndPoint = aPoint2; + Create(curve1); + NewlyEffectedCurves.Add(curve1); + return curve1; + } + + /// + /// Clones the geometry data. + /// + /// Returns a clone + public GeometryData Clone() + { + var clonedGeometryData = new GeometryData + { + Left = Left, + Right = Right, + Bottom = Bottom + }; + foreach (Point2D point in Points) + { + clonedGeometryData.Points.Add(point.Clone()); + } + + foreach (Point2D point in NewlyEffectedPoints) + { + clonedGeometryData.NewlyEffectedPoints.Add(point.Clone()); + } + + foreach (GeometryCurve curve in Curves) + { + clonedGeometryData.Curves.Add(curve.Clone(clonedGeometryData.Points)); + } + + foreach (GeometryCurve curve in NewlyEffectedCurves) + { + clonedGeometryData.NewlyEffectedCurves.Add(curve.Clone(clonedGeometryData.NewlyEffectedPoints)); + } + + foreach (GeometrySurface surface in Surfaces) + { + GeometryLoop clonedLoop = surface.OuterLoop.Clone(); + clonedGeometryData.Loops.Add(clonedLoop); + var innerLoops = new List(); + innerLoops.AddRange(surface.InnerLoops.Select(loop => loop.Clone()).ToList()); + clonedGeometryData.Loops.AddRange(innerLoops); + GeometrySurface clonedSurface = surface.Clone(); + clonedSurface.OuterLoop = clonedLoop; + clonedSurface.InnerLoops.AddRange(innerLoops); + clonedGeometryData.Surfaces.Add(clonedSurface); + } + + // For the clone, set use geometry generator to null. + // This will ensure that a new generator for this geometry using this geometry will be used. + clonedGeometryData.geometryGenerator = null; + return clonedGeometryData; + } + + public bool HandleDelete(List aList) + { + var regenerationResult = false; + + //SaveGeometryState(); + + foreach (IGeometryObject anObject in aList) + { + bool tobeRegenerated; + if (anObject.GetType() == typeof(GeometryPoint)) + { + var selectedPoint = (Point2D) anObject; + //if (Points.Contains(selectedPoint)) + { + tobeRegenerated = DeletePoint(selectedPoint); + if (!regenerationResult) + { + regenerationResult = tobeRegenerated; + } + //DataEventPublisher.DataListModified(Points); + } + } + else if (anObject.GetType() == typeof(GeometryCurve)) + { + var selectedCurve = (GeometryCurve) anObject; + + tobeRegenerated = DeleteCurve(selectedCurve, true); + if (!regenerationResult) + { + regenerationResult = tobeRegenerated; + } + + // if (curveDataList.Contains(selectedCurve)) + // { + // DataEventPublisher.DataListModified(curveDataList); + // } + } + else if (anObject.GetType() == typeof(GeometrySurface)) + { + var selectedSurface = (GeometrySurface) anObject; + DeleteSurface(selectedSurface, true); + //DataEventPublisher.DataListModified(surfaceDataList); + } + } + + if (regenerationResult) + { + RegenerateGeometry(); + } + + return regenerationResult; + } + + /// + /// Deletes the given IGeometrySurface if aValidate is true. + /// + /// + /// + public void DeleteSurface(GeometrySurface aSurface, bool aValidate) + { + aValidate = aValidate && !geometryGenerator.IsRegenerationOn; + GeometrySurface surface = aSurface; + + GeometryLoop outerLoop = aSurface.OuterLoop; + + if (aValidate) + { + // Delete all curves which are part of the surface + //DataEventPublisher.BeforeChange(Curves); + //DataEventPublisher.BeforeChange(Points); + + var curvesToBeDeleted = new List(); + foreach (GeometryCurve curve in outerLoop.CurveList) + { + bool allowDelete = curve.SurfaceAtLeft == null || curve.SurfaceAtLeft == surface; + allowDelete &= curve.SurfaceAtRight == null || curve.SurfaceAtRight == surface; + + if (allowDelete) + { + curvesToBeDeleted.Add(curve); + } + else + { + NewlyEffectedCurves.Add(curve); + } + } + + foreach (GeometryCurve delCurve in curvesToBeDeleted) + { + DeleteCurve(delCurve, true); + } + + Remove(outerLoop, false); + Remove(aSurface, false); + } + else + { + Remove(outerLoop, false); + Remove(surface, false); + } + } + + /// /// Returns a that represents this instance. /// /// @@ -298,6 +559,29 @@ } /// + /// Gets next connected top curve in list of curves + /// + /// + /// + /// + /// Curve + protected internal GeometryCurve GetNextTopCurve(GeometryCurve curve, List boundaryCurves, + List excludedCurves) + { + // if current curve ends on right limit then that must have been the last one so stop the search + if (Math.Abs(curve.HeadPoint.X - Right) < GeometryConstants.Accuracy || Math.Abs(curve.EndPoint.X - Right) < GeometryConstants.Accuracy) + { + return null; + } + + IEnumerable includedCurves = boundaryCurves.Where(geometryCurve => geometryCurve != curve && !excludedCurves.Contains(geometryCurve)); + IEnumerable connectedCurves = includedCurves.Where(geometryCurve => AreConnected(curve, geometryCurve)); + IEnumerable connectedCurvesOnRightSide = connectedCurves.Where(geometryCurve => IsOnLeftSideOf(curve, geometryCurve)); + GeometryCurve topConnectedCurve = connectedCurvesOnRightSide.MaxBy(c => c.HeadPoint.Z + c.EndPoint.Z); + return topConnectedCurve; + } + + /// /// Removes the boundary curves from the given list of curves. /// The boundaries themselves are determined from the given geometry /// @@ -335,29 +619,6 @@ } /// - /// Gets next connected top curve in list of curves - /// - /// - /// - /// - /// Curve - protected internal GeometryCurve GetNextTopCurve(GeometryCurve curve, List boundaryCurves, - List excludedCurves) - { - // if current curve ends on right limit then that must have been the last one so stop the search - if (Math.Abs(curve.HeadPoint.X - Right) < GeometryConstants.Accuracy || Math.Abs(curve.EndPoint.X - Right) < GeometryConstants.Accuracy) - { - return null; - } - - IEnumerable includedCurves = boundaryCurves.Where(geometryCurve => geometryCurve != curve && !excludedCurves.Contains(geometryCurve)); - IEnumerable connectedCurves = includedCurves.Where(geometryCurve => AreConnected(curve, geometryCurve)); - IEnumerable connectedCurvesOnRightSide = connectedCurves.Where(geometryCurve => IsOnLeftSideOf(curve, geometryCurve)); - GeometryCurve topConnectedCurve = connectedCurvesOnRightSide.MaxBy(c => c.HeadPoint.Z + c.EndPoint.Z); - return topConnectedCurve; - } - - /// /// create a copy of the curves /// /// @@ -488,12 +749,12 @@ private static bool AreConnected(GeometryCurve curve1, GeometryCurve curve2) { - return curve1.HeadPoint.LocationEquals(curve2.HeadPoint) || + return curve1.HeadPoint.LocationEquals(curve2.HeadPoint) || curve1.HeadPoint.LocationEquals(curve2.EndPoint) || - curve1.EndPoint.LocationEquals(curve2.HeadPoint) || + curve1.EndPoint.LocationEquals(curve2.HeadPoint) || curve1.EndPoint.LocationEquals(curve2.EndPoint); } - + /// /// Checks if curve1 is on the left side of curve2 /// @@ -502,36 +763,127 @@ /// True when curve1 is on the left side of curve2 private static bool IsOnLeftSideOf(GeometryCurve curve1, GeometryCurve curve2) { - return curve1.HeadPoint.X.IsLessThanOrEqualTo(curve2.HeadPoint.X) && + return curve1.HeadPoint.X.IsLessThanOrEqualTo(curve2.HeadPoint.X) && curve1.HeadPoint.X.IsLessThanOrEqualTo(curve2.EndPoint.X) && curve1.EndPoint.X.IsLessThanOrEqualTo(curve2.HeadPoint.X) && curve1.EndPoint.X.IsLessThanOrEqualTo(curve2.EndPoint.X); } - + + private Point2D DetermineNewPointAndFlags(Point2D requestedPoint, out bool isExistingPoint, out bool flag2) + { + isExistingPoint = false; + flag2 = false; + // try to find the point in Points + Point2D newPoint = GetPoint(requestedPoint, GeometryConstants.Accuracy); + + if (newPoint != null) + { + requestedPoint.X = newPoint.X; + requestedPoint.Z = newPoint.Z; + if (!Points.Contains(requestedPoint)) + { + newPoint = null; + } + else + { + isExistingPoint = true; + } + } + + if (newPoint == null) + { + newPoint = new Point2D(requestedPoint.X, requestedPoint.Z); + Create(newPoint); + } + else + { + flag2 = true; + } + + return newPoint; + } + + private void Create(IGeometryObject aData) + { + if (aData.GetType() == typeof(Point2D)) + { + var point = (Point2D) aData; + Points.Add(point); + } + else if (aData.GetType() == typeof(GeometryCurve)) + { + var geometryCurve = (GeometryCurve) aData; + Curves.Add(geometryCurve); + } + else if (aData.GetType() == typeof(GeometryLoop)) + { + Loops.Add((GeometryLoop) aData); + } + else if (aData.GetType() == typeof(GeometrySurface)) + { + Surfaces.Add((GeometrySurface) aData); + } + } + /// - /// Updates the line at the top of the geometry + /// Checks whether the given point already exists in Points within the requested snap distance. /// - public void UpdateSurfaceLine() + /// + /// + /// the existing point if found else null + private Point2D GetPoint(Point2D point2D, double snapDistance) { - if (updatingSurfaceLine) + for (var index = 0; index < Points.Count; ++index) { - return; + if (Routines2D.DetermineIfPointsCoincide(point2D.X, point2D.Z, Points[index].X, Points[index].Z, snapDistance)) + { + return new Point2D(Points[index].X, Points[index].Z); + } } - updatingSurfaceLine = true; + return null; + } - List bCurves = GetBoundaryCurves(); - if (bCurves.Count == 0) + private void CheckForCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(Point2D aPoint, List source) + { + var line1Point1 = new Point2D(); + var line2Point1 = new Point2D(); + line1Point1.Init(source[0].HeadPoint != aPoint ? source[0].HeadPoint : source[0].EndPoint); + line2Point1.Init(source[1].HeadPoint != aPoint ? source[1].HeadPoint : source[1].EndPoint); + double angle = Routines2D.FindAngle(line1Point1, aPoint, line2Point1, aPoint); + if (angle.IsGreaterThanOrEqualTo(179.0) && angle.IsLessThanOrEqualTo(181.0)) { - surfaceLine.CalcPoints.Clear(); + FixCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(aPoint, source); } + } - List curvesCopy = GetCurvesCopy(bCurves); - List curves = GetTopCurves(curvesCopy); - CreateSurfaceLinePointString(curves); + private void FixCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(Point2D aPoint, List source) + { + for (var 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; + } - updatingSurfaceLine = false; - surfaceLine.SyncPoints(); + Remove(aPoint, false); + Remove(source[1], false); + } + } } #region properties @@ -582,6 +934,9 @@ /// public List Surfaces { get; } = new List(); + /// + /// (Re-)generates the geometry + /// public void RegenerateGeometry() { if (isRegeneratingGeometry) @@ -913,6 +1268,7 @@ { HandleDelete(objectlist); } + removeFromList = true; } } @@ -927,6 +1283,7 @@ { HandleDelete(objectlist); } + if (Curves.Remove(geometryCurve)) { RemoveDeletedCurveFromIsUsedCurveLists(geometryCurve); @@ -945,6 +1302,7 @@ { HandleDelete(objectlist); } + removeFromList = true; } } @@ -957,7 +1315,7 @@ removeFromList = true; } } - + return removeFromList; } @@ -1002,7 +1360,7 @@ return curvePointDependency; } - + /// /// Returns a list of boundary curves. These are curves which are used in only one surface so they have to be on a boundary (inner or outer) /// @@ -1045,312 +1403,4 @@ #endregion #endregion - - public Point2D CreatePoint(Point2D requestedPoint, bool snapToExistingPoint) - { - Point2D newPoint = DetermineNewPointAndFlags(requestedPoint, out bool flag1, out bool flag2); - if (!flag2 && snapToExistingPoint) - { - int count = Curves.Count; - for (int index = 0; index < count; ++index) - { - GeometryCurve curve = Curves[index]; - if (Routines2D.DoesPointExistInLine(curve.HeadPoint, curve.EndPoint, newPoint, GeometryConstants.Accuracy)) - { - Routines2D.GetPointOnLineClosestTo(newPoint.X, newPoint.Z, curve.HeadPoint.X, curve.HeadPoint.Z, - curve.EndPoint.X, curve.EndPoint.Z, out Point2D aResultPoint); - - newPoint.X = aResultPoint.X; - newPoint.Z = aResultPoint.Z; - break; - } - } - } - if (!NewlyEffectedPoints.Contains(newPoint) && !flag1) - NewlyEffectedPoints.Add(newPoint); - return newPoint; - } - - private Point2D DetermineNewPointAndFlags(Point2D requestedPoint, out bool isExistingPoint, out bool flag2) - { - isExistingPoint = false; - flag2 = false; - // try to find the point in Points - Point2D newPoint = GetPoint(requestedPoint, GeometryConstants.Accuracy); - - if (newPoint != null) - { - requestedPoint.X = newPoint.X; - requestedPoint.Z = newPoint.Z; - if (!Points.Contains(requestedPoint)) - newPoint = null; - else - isExistingPoint = true; - } - if (newPoint == null) - { - newPoint = new Point2D(requestedPoint.X, requestedPoint.Z); - Create(newPoint); - } - else - flag2 = true; - - return newPoint; - } - - private void Create(IGeometryObject aData) - { - if (aData.GetType() == typeof (Point2D)) - { - Point2D point = (Point2D) aData; - Points.Add(point); - } - else if (aData.GetType() == typeof (GeometryCurve)) - { - GeometryCurve geometryCurve = (GeometryCurve) aData; - Curves.Add(geometryCurve); - } - else if (aData.GetType() == typeof (GeometryLoop)) - Loops.Add((GeometryLoop) aData); - else if (aData.GetType() == typeof (GeometrySurface)) - Surfaces.Add((GeometrySurface) aData); - } - - /// - /// Checks whether the given point already exists in Points within the requested snap distance. - /// - /// - /// - /// the existing point if found else null - private Point2D GetPoint(Point2D point2D, double snapDistance) - { - for (int index = 0; index < Points.Count; ++index) - { - if (Routines2D.DetermineIfPointsCoincide(point2D.X, point2D.Z, Points[index].X, Points[index].Z, snapDistance)) - return new Point2D(Points[index].X, Points[index].Z); - } - return null; - } - - public bool DeletePoint(Point2D aPoint) - { - - bool flag = false; - List source = new List(); - if (Curves.Count > 0) - { - source.AddRange(Curves.Where((Func) (c => c.HeadPoint == aPoint || c.EndPoint == aPoint))); - if (source.Count == 2) - { - CheckForCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(aPoint, source); - } - Remove(aPoint, false); - if (source.Exists((curve => curve.SurfaceAtLeft != null || curve.SurfaceAtRight != null))) - flag = true; - foreach (GeometryCurve aCurve in source) - DeleteCurve(aCurve, true); - return flag; - } - Remove(aPoint, false); - return false; - } - - private void CheckForCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(Point2D aPoint, List source) - { - Point2D line1Point1 = new Point2D(); - Point2D line2Point1 = new Point2D(); - line1Point1.Init(source[0].HeadPoint != aPoint ? source[0].HeadPoint : source[0].EndPoint); - line2Point1.Init(source[1].HeadPoint != aPoint ? source[1].HeadPoint : source[1].EndPoint); - double angle = Routines2D.FindAngle(line1Point1, aPoint, line2Point1, aPoint); - if (angle.IsGreaterThanOrEqualTo(179.0) && angle.IsLessThanOrEqualTo(181.0)) - { - FixCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(aPoint, source); - } - } - - private void FixCurvesWherePointIsOnBothConnectedCurvesInLineWithEachOther(Point2D aPoint, List source) - { - 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); - } - } - } - - public GeometryCurve CreateCurve(Point2D aPoint1, Point2D aPoint2) - { - foreach (GeometryCurve curve in Curves) - { - if (curve.HeadPoint == aPoint1 && curve.EndPoint == aPoint2 || curve.HeadPoint == aPoint2 && curve.EndPoint == aPoint1) - { - return curve; - } - } - GeometryCurve curve1 = new GeometryCurve(); - geometryGenerator.SetIsUsed(curve1, CurveDirection.Forward, false); - geometryGenerator.SetIsUsed(curve1, CurveDirection.Reverse, false); - curve1.HeadPoint = aPoint1; - curve1.EndPoint = aPoint2; - Create(curve1); - NewlyEffectedCurves.Add(curve1); - return curve1; - } - - /// - /// Clones the geometry data. - /// - /// Returns a clone - public GeometryData Clone() - { - var clonedGeometryData = new GeometryData - { - Left = this.Left, - Right = this.Right, - Bottom = this.Bottom - }; - foreach (Point2D point in this.Points) - { - clonedGeometryData.Points.Add(point.Clone()); - } - foreach (Point2D point in this.NewlyEffectedPoints) - { - clonedGeometryData.NewlyEffectedPoints.Add(point.Clone()); - } - foreach (GeometryCurve curve in this.Curves) - { - clonedGeometryData.Curves.Add(curve.Clone(clonedGeometryData.Points)); - } - foreach (GeometryCurve curve in this.NewlyEffectedCurves) - { - clonedGeometryData.NewlyEffectedCurves.Add(curve.Clone(clonedGeometryData.NewlyEffectedPoints)); - } - foreach (GeometrySurface surface in this.Surfaces) - { - var clonedLoop = surface.OuterLoop.Clone(); - clonedGeometryData.Loops.Add(clonedLoop); - List innerLoops = new List(); - innerLoops.AddRange(surface.InnerLoops.Select(loop => loop.Clone()).ToList()); - clonedGeometryData.Loops.AddRange(innerLoops); - var clonedSurface = surface.Clone(); - clonedSurface.OuterLoop = clonedLoop; - clonedSurface.InnerLoops.AddRange(innerLoops); - clonedGeometryData.Surfaces.Add(clonedSurface); - } - - // For the clone, set use geometry generator to null. - // This will ensure that a new generator for this geometry using this geometry will be used. - clonedGeometryData.geometryGenerator = null; - return clonedGeometryData; - } - - public bool HandleDelete(List aList) - { - bool regenerationResult = false; - - //SaveGeometryState(); - - foreach (var anObject in aList) - { - bool tobeRegenerated; - if (anObject.GetType() == typeof(GeometryPoint)) - { - var selectedPoint = (Point2D) anObject; - //if (Points.Contains(selectedPoint)) - { - tobeRegenerated = DeletePoint(selectedPoint); - if (!regenerationResult) - { - regenerationResult = tobeRegenerated; - } - //DataEventPublisher.DataListModified(Points); - } - } - else if (anObject.GetType() == typeof(GeometryCurve)) - { - var selectedCurve = (GeometryCurve) anObject; - - tobeRegenerated = DeleteCurve(selectedCurve, true); - if (!regenerationResult) - { - regenerationResult = tobeRegenerated; - } - - // if (curveDataList.Contains(selectedCurve)) - // { - // DataEventPublisher.DataListModified(curveDataList); - // } - } - else if (anObject.GetType() == typeof(GeometrySurface)) - { - var selectedSurface = (GeometrySurface) anObject; - DeleteSurface(selectedSurface, true); - //DataEventPublisher.DataListModified(surfaceDataList); - } - } - if (regenerationResult) - { - RegenerateGeometry(); - } - - return regenerationResult; - } - - /// - /// Deletes the given IGeometrySurface if aValidate is true. - /// - /// - /// - public void DeleteSurface(GeometrySurface aSurface, bool aValidate) - { - aValidate = aValidate && !geometryGenerator.IsRegenerationOn; - var surface = aSurface; - - GeometryLoop outerLoop = aSurface.OuterLoop; - - if (aValidate) - { - // Delete all curves which are part of the surface - //DataEventPublisher.BeforeChange(Curves); - //DataEventPublisher.BeforeChange(Points); - - var curvesToBeDeleted = new List(); - foreach (var curve in outerLoop.CurveList) - { - bool allowDelete = curve.SurfaceAtLeft == null || curve.SurfaceAtLeft == surface; - allowDelete &= curve.SurfaceAtRight == null || curve.SurfaceAtRight == surface; - - if (allowDelete) - { - curvesToBeDeleted.Add(curve); - } - else - { - NewlyEffectedCurves.Add(curve); - } - } - - foreach (var delCurve in curvesToBeDeleted) - { - DeleteCurve(delCurve, true); - } - Remove(outerLoop, false); - Remove(aSurface, false); - } - else - { - Remove(outerLoop, false); - Remove(surface, false); - } - } } \ No newline at end of file Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs =================================================================== diff -u -r5477 -r5494 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs (.../GeometryPointString.cs) (revision 5477) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPointString.cs (.../GeometryPointString.cs) (revision 5494) @@ -80,21 +80,13 @@ /// private const double epsilon = GeometryConstants.Accuracy; - /// + /// /// The calculate points as protected field (to be able to prevent recursive calls to CalcPoints) /// protected readonly List calcPoints = new List(); private readonly List points = new List(); - private bool isFrozen; - private bool hasNaNx; - private readonly double frozenMaxZ = double.NaN; - - // sortedPoints must never be used outside this class. Either the GPS concerned must have sorted points but then they already are - // (eg. surfaceline, headline) or they may be unsorted in which case using the sorted list in other classes leads to errors (eg. - // geometrysurfaces, waternetlines) - private List sortedPoints; - + /// /// Gets the at the specified index. /// @@ -202,11 +194,6 @@ /// public double GetMaxZ() { - if (isFrozen) - { - return frozenMaxZ; - } - return CalcPoints.Any() ? CalcPoints.Max(p => p.Z) : double.NaN; @@ -220,11 +207,6 @@ /// The minimal X value or in case there are no points. public double GetMinX() { - if (isFrozen && !hasNaNx) - { - return sortedPoints[0].X; - } - return CalcPoints.Any(p => !double.IsNaN(p.X)) ? CalcPoints.Where(p => !double.IsNaN(p.X)).Min(p => p.X) : double.NaN; @@ -238,11 +220,6 @@ /// public double GetMaxX() { - if (isFrozen && !hasNaNx) - { - return sortedPoints[sortedPoints.Count - 1].X; - } - return CalcPoints.Any(p => !double.IsNaN(p.X)) ? CalcPoints.Where(p => !double.IsNaN(p.X)).Max(p => p.X) : double.NaN; Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPoint.cs =================================================================== diff -u -r5480 -r5494 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPoint.cs (.../GeometryPoint.cs) (revision 5480) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryPoint.cs (.../GeometryPoint.cs) (revision 5494) @@ -37,8 +37,6 @@ /// public const double Precision = GeometryConstants.Accuracy; - private object owner; - /// /// Initializes a new instance of the class. ///