Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs =================================================================== diff -u -r5786 -r6087 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 5786) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryData.cs (.../GeometryData.cs) (revision 6087) @@ -228,7 +228,6 @@ CreateSurfaceLinePointString(curves); updatingSurfaceLine = false; - surfaceLine.SyncPoints(); } /// @@ -338,9 +337,16 @@ foreach (GeometrySurface surface in Surfaces) { GeometryLoop clonedLoop = surface.OuterLoop.Clone(); + ReplacePointsForLoop(clonedGeometryData, clonedLoop); + ReplaceCurvesForLoop(clonedGeometryData, clonedLoop); clonedGeometryData.Loops.Add(clonedLoop); var innerLoops = new List(); innerLoops.AddRange(surface.InnerLoops.Select(loop => loop.Clone()).ToList()); + foreach (GeometryLoop innerLoop in innerLoops) + { + ReplacePointsForLoop(clonedGeometryData, innerLoop); + ReplaceCurvesForLoop(clonedGeometryData, innerLoop); + } clonedGeometryData.Loops.AddRange(innerLoops); GeometrySurface clonedSurface = surface.Clone(); clonedSurface.OuterLoop = clonedLoop; @@ -349,6 +355,23 @@ } } + private void ReplacePointsForLoop(GeometryData clonedGeometryData, GeometryLoop clonedLoop) + { + for (int i = 0; i < clonedLoop.CalcPoints.Count; i++) + { + clonedLoop.CalcPoints[i] = clonedGeometryData.GetPointAtLocation(clonedLoop.CalcPoints[i]); + } + } + + private void ReplaceCurvesForLoop(GeometryData clonedGeometryData, GeometryLoop clonedLoop) + { + for (int i = 0; i < clonedLoop.CurveList.Count; i++) + { + clonedLoop.CurveList[i].HeadPoint = clonedGeometryData.GetPointAtLocation(clonedLoop.CurveList[i].HeadPoint); + clonedLoop.CurveList[i].EndPoint = clonedGeometryData.GetPointAtLocation(clonedLoop.CurveList[i].EndPoint); + } + } + private void CloneNewlyEffectedCurves(GeometryData clonedGeometryData) { foreach (GeometryCurve curve in NewlyEffectedCurves) @@ -1167,7 +1190,51 @@ return false; } + + /// + /// Finds a Surface based on its outerloop + /// + /// + /// the surface or when not found null + public GeometrySurface FindSurfaceByItsOuterLoop(GeometryLoop outerLoop) + { + foreach (GeometrySurface geometrySurface in Surfaces) + { + if (geometrySurface.OuterLoop.HasSameCurves(outerLoop)) + { + return geometrySurface; + } + } + return null; + } + + /// + /// + /// + /// + /// + public GeometryLoop FindLoopThatHasSameLoopCurves(GeometryLoop outerLoop) + { + foreach (GeometrySurface geometrySurface in Surfaces) + { + if (geometrySurface.OuterLoop.HasSameCurves(outerLoop)) + { + return geometrySurface.OuterLoop; + } + + foreach (GeometryLoop innerLoop in geometrySurface.InnerLoops) + { + if (innerLoop.HasSameCurves(outerLoop)) + { + return innerLoop; + } + } + } + + return null; + } + #region calculation function private int GetDependentCurveCount(Point2D point)