Index: DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs =================================================================== diff -u -r5256 -r5487 --- DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5256) +++ DamEngine/trunk/src/Deltares.DamEngine.Data/Geometry/GeometryLoop.cs (.../GeometryLoop.cs) (revision 5487) @@ -66,7 +66,7 @@ { return false; } - + GeometryCurve beginCurve = CurveList[0]; GeometryCurve endCurve = CurveList[^1]; // Just check that the first and last curve are connected @@ -141,7 +141,6 @@ /// True if continuous, false if not public bool IsContinuous() { - for (var i = 0; i < CurveList.Count - 1; i++) { if ((CurveList[i].EndPoint != CurveList[i + 1].HeadPoint) && @@ -167,6 +166,31 @@ } /// + /// Creates a clone of the geometry loop + /// + /// The cloned GeometryLoop + public override GeometryLoop Clone() + { + // Note: explicit use of CalcPoints to ensure calcPoints are populated + List p = CalcPoints; + if (p.Count > 0) + { + SyncPoints(); + } + + GeometryPointString clonedGeometryPointString = base.Clone(); + var clonedGeometryLoop = new GeometryLoop(); + clonedGeometryLoop.Points.AddRange(clonedGeometryPointString.Points); + clonedGeometryLoop.SyncCalcPoints(); + foreach (GeometryCurve curve in CurveList) + { + clonedGeometryLoop.CurveList.Add(curve.Clone(clonedGeometryLoop.CalcPoints)); + } + + return clonedGeometryLoop; + } + + /// /// Gets the local 2D Points List. /// /// @@ -195,34 +219,51 @@ } else { - // TODO why not compare by value instead of reference - if (CurveList[index].HeadPoint == calcPoints[calcPoints.Count - 1]) + // Compare by reference (is faster then by value) + // if (CurveList[index].HeadPoint == calcPoints[calcPoints.Count - 1]) + // { + // calcPoints.Add(CurveList[index].EndPoint); + // } + // else if (CurveList[index].EndPoint == calcPoints[calcPoints.Count - 1]) + // { + // calcPoints.Add(CurveList[index].HeadPoint); + // } + //else + if (!AddEitherHeadOrEndPointOfCurveToCalcPoints(index)) + { - calcPoints.Add(CurveList[index].EndPoint); - } - else if (CurveList[index].EndPoint == calcPoints[calcPoints.Count - 1]) - { - calcPoints.Add(CurveList[index].HeadPoint); - } - else - { if (calcPoints.Count == 2) { calcPoints.Reverse(); } - if (CurveList[index].HeadPoint == calcPoints[calcPoints.Count - 1]) - { - calcPoints.Add(CurveList[index].EndPoint); - } - else if (CurveList[index].EndPoint == calcPoints[calcPoints.Count - 1]) - { - calcPoints.Add(CurveList[index].HeadPoint); - } + AddEitherHeadOrEndPointOfCurveToCalcPoints(index); } } } + RemoveDoubleClosingPointWhenNeeded(); + } + + private bool AddEitherHeadOrEndPointOfCurveToCalcPoints(int index) + { + if (CurveList[index].HeadPoint == calcPoints[calcPoints.Count - 1]) + { + calcPoints.Add(CurveList[index].EndPoint); + return true; + } + + if (CurveList[index].EndPoint != calcPoints[calcPoints.Count - 1]) + { + return false; + } + + calcPoints.Add(CurveList[index].HeadPoint); + return true; + } + + private void RemoveDoubleClosingPointWhenNeeded() + { if (calcPoints.Count > 0) { if (calcPoints[0] == calcPoints[calcPoints.Count - 1]) @@ -243,27 +284,4 @@ public NotEnoughUniquePointsException() : base("At least 3 unique points are required to determine if the loop is running clockwise.") {} } - - /// - /// Creates a clone of the geometry loop - /// - /// The cloned GeometryLoop - public override GeometryLoop Clone() - { - // Note: explicit use of CalcPoints to ensure calcPoints are populated - var p = CalcPoints; - if (p.Count > 0) - { - SyncPoints(); - } - GeometryPointString clonedGeometryPointString = base.Clone(); - var clonedGeometryLoop = new GeometryLoop(); - clonedGeometryLoop.Points.AddRange(clonedGeometryPointString.Points); - clonedGeometryLoop.SyncCalcPoints(); - foreach (GeometryCurve curve in CurveList) - { - clonedGeometryLoop.CurveList.Add(curve.Clone(clonedGeometryLoop.CalcPoints)); - } - return clonedGeometryLoop; - } } \ No newline at end of file