Index: DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs =================================================================== diff -u -r5090 -r5256 --- DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs (.../FillDamFromXmlInput.cs) (revision 5090) +++ DamEngine/trunk/src/Deltares.DamEngine.Interface/FillDamFromXmlInput.cs (.../FillDamFromXmlInput.cs) (revision 5256) @@ -849,66 +849,98 @@ inputLayer.WaterpressureInterpolationModel); // Add OuterLoop - SoilProfile2DLayer2DSurfaceOuterPoint[] outerLoop = inputLayer.Surface.OuterLoop; - var isStartPoint = true; - var curve = new GeometryCurve(); - var firstPoint = new Point2D(); - for (var j = 0; j < outerLoop.Length; j++) - { - var point = new Point2D(outerLoop[j].X, outerLoop[j].Z); - if (isStartPoint) - { - curve.HeadPoint = point; - firstPoint = point; - } - else - { - curve.EndPoint = point; - soilProfile2D.Geometry.Curves.Add(curve); - layer.GeometrySurface.OuterLoop.CurveList.Add(curve); - curve = new GeometryCurve(); - curve.HeadPoint = point; - } + AddOuterLoopToSoilProfile2DFromLayer2D(soilProfile2D, inputLayer, layer); - if (j == outerLoop.Length - 1) - { - curve.EndPoint = firstPoint; - soilProfile2D.Geometry.Curves.Add(curve); - layer.GeometrySurface.OuterLoop.CurveList.Add(curve); - } + // Add InnerLoop + AddInnerLoopToSoilProfile2DFromLayer2D(soilProfile2D, inputLayer, layer); - isStartPoint = false; + soilProfile2D.Surfaces.Add(layer); + soilProfile2D.Geometry.Surfaces.Add(layer.GeometrySurface); + } + } + } + + private static void AddInnerLoopToSoilProfile2DFromLayer2D(SoilProfile2D soilProfile2D, SoilProfile2DLayer2D inputLayer, SoilLayer2D layer) + { + SoilProfile2DLayer2DSurfaceInnerPoint[] innerloop = inputLayer.Surface.Innerloop; + if (innerloop != null) + { + if (innerloop.Length > 0) + { + // TODO: Add curves of innerloop to geometry + var newloop = new GeometryLoop(); + for (var j = 0; j < innerloop.Length; j++) + { + var point = new Point2D(innerloop[j].X, innerloop[j].Z); soilProfile2D.Geometry.Points.Add(point); - layer.GeometrySurface.OuterLoop.CalcPoints.Add(point); + newloop.CalcPoints.Add(point); } - - soilProfile2D.Geometry.Loops.Add(layer.GeometrySurface.OuterLoop); + layer.GeometrySurface.InnerLoops.Add(newloop); + soilProfile2D.Geometry.Loops.Add(newloop); + } + } + } - // Add InnerLoop - SoilProfile2DLayer2DSurfaceInnerPoint[] innerloop = inputLayer.Surface.Innerloop; - if (innerloop != null) + private static void AddOuterLoopToSoilProfile2DFromLayer2D(SoilProfile2D soilProfile2D, SoilProfile2DLayer2D inputLayer, SoilLayer2D layer) + { + SoilProfile2DLayer2DSurfaceOuterPoint[] outerLoop = inputLayer.Surface.OuterLoop; + var isStartPoint = true; + var curve = new GeometryCurve(); + var firstPoint = new Point2D(); + for (var j = 0; j < outerLoop.Length; j++) + { + var point = new Point2D(outerLoop[j].X, outerLoop[j].Z); + if (isStartPoint) + { + curve.HeadPoint = point; + firstPoint = point; + } + else + { + curve.EndPoint = point; + var existingCurve = GeometryHelper.DoesCurveExist(soilProfile2D.Geometry, curve); + if (existingCurve == null) { - if (innerloop.Length > 0) - { - // TODO: Add curves of innerloop to geometry - var newloop = new GeometryLoop(); - for (var j = 0; j < innerloop.Length; j++) - { - var point = new Point2D(innerloop[j].X, innerloop[j].Z); - soilProfile2D.Geometry.Points.Add(point); - newloop.CalcPoints.Add(point); - } + soilProfile2D.Geometry.Curves.Add(curve); + layer.GeometrySurface.OuterLoop.CurveList.Add(curve); + } + else + { + layer.GeometrySurface.OuterLoop.CurveList.Add(existingCurve); + } + curve = new GeometryCurve(); + curve.HeadPoint = point; + } - layer.GeometrySurface.InnerLoops.Add(newloop); - soilProfile2D.Geometry.Loops.Add(newloop); - } + if (j == outerLoop.Length - 1) + { + curve.EndPoint = firstPoint; + var existingCurve = GeometryHelper.DoesCurveExist(soilProfile2D.Geometry, curve); + if (existingCurve == null) + { + soilProfile2D.Geometry.Curves.Add(curve); + layer.GeometrySurface.OuterLoop.CurveList.Add(curve); } + else + { + layer.GeometrySurface.OuterLoop.CurveList.Add(existingCurve); + } + } - soilProfile2D.Surfaces.Add(layer); - soilProfile2D.Geometry.Surfaces.Add(layer.GeometrySurface); + isStartPoint = false; + var existingPoint = soilProfile2D.Geometry.GetPointAtLocation(point, GeometryConstants.Accuracy); + if (existingPoint == null) + { + soilProfile2D.Geometry.Points.Add(point); + layer.GeometrySurface.OuterLoop.CalcPoints.Add(point); } + else + { + layer.GeometrySurface.OuterLoop.CalcPoints.Add(existingPoint); + } } + soilProfile2D.Geometry.Loops.Add(layer.GeometrySurface.OuterLoop); } private static void TransferSegments(Io.XmlInput.Segment[] inputSegments, IList segments)