Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/SoilProfile2DDataModelTest.cs =================================================================== diff -u -r4870 -r5922 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/SoilProfile2DDataModelTest.cs (.../SoilProfile2DDataModelTest.cs) (revision 4870) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader.Tests/SoilProfile2DDataModelTest.cs (.../SoilProfile2DDataModelTest.cs) (revision 5922) @@ -37,7 +37,7 @@ { PersistableDataModel dataModel = PersistableDataModelFactory.CreateSimpleDataModelWithMultipleScenarioAndStages(); - SoilProfile2D soilProfile2D = new SoilProfile2DDataModel().Create(dataModel); + SoilProfile2D soilProfile2D = new SoilProfile2DDataModel().Create(dataModel, 0.0); Assert.Multiple(() => { @@ -55,7 +55,7 @@ public void WhenDataModelWithMultipleLayersIsCreated_ThenSoilProfile2DIsAsExpected() { PersistableDataModel dataModel = PersistableDataModelFactory.CreateSimpleDataModelWithMultipleLayers(); - SoilProfile2D soilProfile2D = new SoilProfile2DDataModel().Create(dataModel); + SoilProfile2D soilProfile2D = new SoilProfile2DDataModel().Create(dataModel, 0.0); IList points = soilProfile2D.Geometry.Points; Assert.Multiple(() => Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/SoilProfile2DDataModel.cs =================================================================== diff -u -r5433 -r5922 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/SoilProfile2DDataModel.cs (.../SoilProfile2DDataModel.cs) (revision 5433) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/SoilProfile2DDataModel.cs (.../SoilProfile2DDataModel.cs) (revision 5922) @@ -38,8 +38,9 @@ /// Converts a to a . /// /// + /// /// - public SoilProfile2D Create(PersistableDataModel dataModel) + public SoilProfile2D Create(PersistableDataModel dataModel, double offsetX) { string geometryId = dataModel.Scenarios.Last().Stages.Last().GeometryId; PersistableGeometry geometry = dataModel.Geometry.First(g => g.Id == geometryId); @@ -48,13 +49,13 @@ foreach (PersistableLayer layer in geometry.Layers) { - CreateCurvesFromLayer(layer, soilProfile2D.Geometry.Curves); - GeometrySurface surface = CreateSurfacesFromLayer(layer, soilProfile2D.Geometry.Surfaces); + CreateCurvesFromLayer(layer, soilProfile2D.Geometry.Curves, offsetX); + GeometrySurface surface = CreateSurfacesFromLayer(layer, soilProfile2D.Geometry.Surfaces, offsetX); foreach (PersistablePoint point in layer.Points) { - if (!IsPointPresent(point, soilProfile2D.Geometry.Points)) + if (!IsPointPresent(point, soilProfile2D.Geometry.Points, offsetX)) { - soilProfile2D.Geometry.Points.Add(new GeometryPoint(point.X, 0, point.Z)); + soilProfile2D.Geometry.Points.Add(new GeometryPoint(point.X + offsetX, 0, point.Z)); } } @@ -74,17 +75,10 @@ }; soilProfile2D.Surfaces.Add(soilLayer2D); } - SetLimits(soilProfile2D); + soilProfile2D.Geometry.Rebox(); return soilProfile2D; } - private static void SetLimits(SoilProfile2D soilProfile2D) - { - soilProfile2D.Geometry.Left = soilProfile2D.Geometry.MinGeometryPointsX; - soilProfile2D.Geometry.Right = soilProfile2D.Geometry.MaxGeometryPointsX; - soilProfile2D.Geometry.Bottom = soilProfile2D.Geometry.MinGeometryPointsZ; - } - private Color FetchSoilColor(PersistableSoil persistableSoil, PersistableDataModel dataModel) { var color = new Color(); @@ -123,16 +117,16 @@ return soilId == string.Empty ? null : dataModel.Soils.Soils.FirstOrDefault(soil => soil.Id == soilId); } - private GeometrySurface CreateSurfacesFromLayer(PersistableLayer layer, ICollection geometrySurface) + private GeometrySurface CreateSurfacesFromLayer(PersistableLayer layer, ICollection geometrySurface, double offsetX) { var surface = new GeometrySurface(); for (var i = 0; i < layer.Points.Count(); i++) { - surface.OuterLoop.Points.Add(new GeometryPoint(layer.Points.ElementAt(i).X, 0, layer.Points.ElementAt(i).Z)); + surface.OuterLoop.Points.Add(new GeometryPoint(layer.Points.ElementAt(i).X + offsetX, 0, layer.Points.ElementAt(i).Z)); for (var j = 0; j < layer.Points.Count(); j++) { - GeometryCurve curve = CreateCurveFromLayer(layer, j); + GeometryCurve curve = CreateCurveFromLayer(layer, j, offsetX); if (!IsCurvePresent(curve, surface.OuterLoop.CurveList)) { surface.OuterLoop.CurveList.Add(curve); @@ -148,42 +142,43 @@ return surface; } - private void CreateCurvesFromLayer(PersistableLayer layer, ICollection geometryCurves) + private void CreateCurvesFromLayer(PersistableLayer layer, ICollection geometryCurves, double offsetX) { for (var i = 0; i < layer.Points.Count(); i++) { - GeometryCurve curve = CreateCurveFromLayer(layer, i); + GeometryCurve curve = CreateCurveFromLayer(layer, i, offsetX); if (!IsCurvePresent(curve, geometryCurves)) { geometryCurves.Add(curve); } } + //GeometryCurve curve = CreateCurveFromLayer(layer, i, offsetX); } - private GeometryCurve CreateCurveFromLayer(PersistableLayer layer, int index) + private GeometryCurve CreateCurveFromLayer(PersistableLayer layer, int index, double offsetX) { GeometryCurve curve; if (index == layer.Points.Count() - 1) { - curve = CreateCurve(layer.Points.ElementAt(index), layer.Points.ElementAt(0)); + curve = CreateCurve(layer.Points.ElementAt(index), layer.Points.ElementAt(0), offsetX); } else { - curve = CreateCurve(layer.Points.ElementAt(index), layer.Points.ElementAt(index + 1)); + curve = CreateCurve(layer.Points.ElementAt(index), layer.Points.ElementAt(index + 1), offsetX); } return curve; } - private GeometryCurve CreateCurve(PersistablePoint firstPoint, PersistablePoint secondPoint) + private GeometryCurve CreateCurve(PersistablePoint firstPoint, PersistablePoint secondPoint, double offsetX) { return new GeometryCurve { - HeadPoint = new GeometryPoint(firstPoint.X, 0, firstPoint.Z), - EndPoint = new GeometryPoint(secondPoint.X, 0, secondPoint.Z) + HeadPoint = new GeometryPoint(firstPoint.X + offsetX, 0, firstPoint.Z), + EndPoint = new GeometryPoint(secondPoint.X + offsetX, 0, secondPoint.Z) }; } - + private bool IsCurvePresent(GeometryCurve curve, IEnumerable geometryCurves) { return geometryCurves.Any(geometryCurve => @@ -193,9 +188,9 @@ ArePointsEqual(geometryCurve.HeadPoint, curve.EndPoint))); } - private bool IsPointPresent(PersistablePoint point, IEnumerable geometryPoints) + private bool IsPointPresent(PersistablePoint point, IEnumerable geometryPoints, double offsetX) { - return geometryPoints.Any(geometryPoint => ArePointsEqual(geometryPoint, point)); + return geometryPoints.Any(geometryPoint => ArePointsEqual(geometryPoint, point, offsetX)); } private bool ArePointsEqual(GeometryPoint firstPoint, GeometryPoint secondPoint) @@ -206,11 +201,11 @@ (Math.Abs(firstPoint.Z - secondPoint.Z) < pointTolerance); } - private bool ArePointsEqual(GeometryPoint firstPoint, PersistablePoint secondPoint) + private bool ArePointsEqual(GeometryPoint firstPoint, PersistablePoint secondPoint, double offsetX) { const double pointTolerance = 1E-6; - return (Math.Abs(firstPoint.X - secondPoint.X) < pointTolerance) && + return (Math.Abs(firstPoint.X - (secondPoint.X + offsetX)) < pointTolerance) && (Math.Abs(firstPoint.Z - secondPoint.Z) < pointTolerance); } } \ No newline at end of file Index: DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/Geometry2DImporter/SoilProfile2DImporterTest.cs =================================================================== diff -u -r5875 -r5922 --- DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/Geometry2DImporter/SoilProfile2DImporterTest.cs (.../SoilProfile2DImporterTest.cs) (revision 5875) +++ DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/Geometry2DImporter/SoilProfile2DImporterTest.cs (.../SoilProfile2DImporterTest.cs) (revision 5922) @@ -266,10 +266,11 @@ GeometryData geometry = soilProfiles.ElementAt(0).Geometry; Assert.That(geometry.Surfaces, Has.Count.EqualTo(12)); Assert.That(geometry.Left, Is.EqualTo(xSoilProfile2DOrigin)); - ValidationResult[] validationResults = geometry.ValidateGeometry(); + Assert.That(soilProfiles[0].Surfaces[0].GeometrySurface.OuterLoop.GetMinX(),Is.EqualTo(xSoilProfile2DOrigin)); + ValidationResult[] validationResults = SoilProfile2DImporter.ValidateGeometry(geometry); Assert.That(validationResults, Has.Length.EqualTo(0)); geometry = soilProfiles.ElementAt(1).Geometry; - validationResults = geometry.ValidateGeometry(); + validationResults = SoilProfile2DImporter.ValidateGeometry(geometry); Assert.That(validationResults, Has.Length.EqualTo(0)); } Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Geometry2DImporter/SoilProfile2DImporter.cs =================================================================== diff -u -r5918 -r5922 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Geometry2DImporter/SoilProfile2DImporter.cs (.../SoilProfile2DImporter.cs) (revision 5918) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Geometry2DImporter/SoilProfile2DImporter.cs (.../SoilProfile2DImporter.cs) (revision 5922) @@ -26,10 +26,10 @@ using Deltares.Dam.StixFileReader; using Deltares.DamEngine.Data.Geometry; using Deltares.DamEngine.Data.Standard; +using Deltares.Standard.Validation; using Deltares.Geotechnics.Soils; using Deltares.Standard.Language; using GeometryPoint = Deltares.Geometry.GeometryPoint; -using GeometryPointString = Deltares.Geometry.GeometryPointString; namespace Deltares.Dam.Data.Geometry2DImporter; @@ -78,22 +78,94 @@ foreach (SoilGeometryProbability profile in soilProfiles) { string profileName = profile.SoilGeometry2DName; - SoilProfile2D readSoilProfile = ReadSoilProfile(soilProfileDirectory, profileName, aquifers, xSoilGeometry2DOrigin); - foreach (string soilName in readSoilProfile.Surfaces.Select(surface => surface.Soil.Name)) + SoilProfile2D importedSoilProfile = ReadSoilProfile(soilProfileDirectory, profileName, aquifers, xSoilGeometry2DOrigin); + foreach (string soilName in importedSoilProfile.Surfaces.Select(surface => surface.Soil.Name)) { if (!IsSoilOfSurfacePresent(availableSoils.Soils, soilName)) { string messageFormat = LocalizationManager.GetTranslatedText(typeof(SoilProfile2DImporter), "ImportSoilProfileErrorUndefinedMaterials"); throw new SoilProfileImporterException(string.Format(messageFormat, profileName, soilName)); } } - TransferSoilLayerProperties(readSoilProfile.Surfaces); - importedSoilProfiles.Add(readSoilProfile); + TransferSoilLayerProperties(importedSoilProfile.Surfaces); + importedSoilProfiles.Add(importedSoilProfile); } return importedSoilProfiles; } + + /// + /// Validates the geometry (replaces the one in GeometryData as that does pointer compares instead of location compares). + /// + /// + /// List of validation errors + public static ValidationResult[] ValidateGeometry(Deltares.Geometry.GeometryData geometry) + { + List validationResultList = new List(); + List looseCurves = GetLooseCurves(geometry); + List overhangPoints = GetOverhangPoints(geometry); + if (looseCurves.Count > 0) + { + validationResultList.Add(new ValidationResult(ValidationResultType.Error, + LocalizationManager.GetTranslatedText(geometry, "Loose lines are not allowed"), looseCurves[0])); + } + else if (overhangPoints.Count > 0) + { + validationResultList.Add(new ValidationResult(ValidationResultType.Error, + LocalizationManager.GetTranslatedText(geometry, "Overhangs are not allowed"), overhangPoints[0])); + } + return validationResultList.ToArray(); + } + private static Deltares.Geometry.GeometryCurve FindFirstConnectingCurveByPoint( + GeometryPoint point, + Deltares.Geometry.GeometryCurve inputCurve, + List searchCurves) + { + var searchCurve = searchCurves.Where((Func) + (curve => curve != inputCurve)).FirstOrDefault((Func) + (curve => curve.HeadPoint.LocationEquals(point))); + if (searchCurve == null) + { + searchCurve = searchCurves.Where((Func) + (curve => curve != inputCurve)).FirstOrDefault((Func) + (curve => curve.EndPoint.LocationEquals(point))); + } + + return searchCurve; + } + + private static List GetLooseCurves(Deltares.Geometry.GeometryData geometry) + { + List looseCurves = new List(); + foreach (Deltares.Geometry.GeometryCurve curve in geometry.Curves) + { + bool flag1 = FindFirstConnectingCurveByPoint(curve.HeadPoint, curve, geometry.Curves) != null; + bool flag2 = FindFirstConnectingCurveByPoint(curve.EndPoint, curve, geometry.Curves) != null; + if (!flag1 || !flag2) + looseCurves.Add(curve); + } + return looseCurves; + } + + private static List GetOverhangPoints(Deltares.Geometry.GeometryData geometry) + { + var surfaceLine = geometry.SurfaceLine; + List overhangPoints = new List(); + if (surfaceLine.Points == null || surfaceLine.Points.Count < 2) + return overhangPoints; + if (surfaceLine.Points.First().X > surfaceLine.Points.Last().X) + surfaceLine.Points.Reverse(); + double x = surfaceLine.Points.First().X; + for (int index = 1; index < surfaceLine.Points.Count; ++index) + { + if (x > surfaceLine.Points[index].X) + overhangPoints.Add(surfaceLine.Points[index - 1]); + x = surfaceLine.Points[index].X; + } + return overhangPoints; + } + /// /// Reads a soil profile. /// @@ -113,12 +185,11 @@ filePath = Path.Combine(soilProfileDirectory, soilProfileFileName); try { + SoilProfile2D readSoilProfile = null; var reader = new StixFileReader.StixFileReader(); - SoilProfile2D readSoilProfile = reader.ReadSoilProfile(filePath); + readSoilProfile = reader.ReadSoilProfile(filePath, xSoilGeometry2DOrigin); TransferAquiferData(soilProfileFileName, readSoilProfile.Surfaces, aquifers); - var originalSurfaces = AdaptGeometryForXSoilGeometry2DOrigin(readSoilProfile, xSoilGeometry2DOrigin); - readSoilProfile.Geometry.RegenerateGeometry(); - ResetSoilsForSurfaces(originalSurfaces, readSoilProfile, xSoilGeometry2DOrigin); + return readSoilProfile; } catch (StixFileReadException e) @@ -127,84 +198,10 @@ throw new SoilProfileImporterException(string.Format(messageFormat, soilProfileName, e.Message), e); } } - string message = LocalizationManager.GetTranslatedText(typeof(SoilProfile2DImporter), "ImportSoilProfileErrorReadFailed"); throw new SoilProfileImporterException(string.Format(message, soilProfileName, string.Empty)); } - private static void ResetSoilsForSurfaces(List originalSurfaces, SoilProfile2D readSoilProfile, - double xSoilGeometry2DOrigin) - { - if (originalSurfaces == null) - { - return; - } - - for (var i = 0; i < readSoilProfile.Surfaces.Count; i++) - { - GeometryPointString topCurves = readSoilProfile.Surfaces[i].GeometrySurface.DetermineTopGeometrySurface(); - double x = (topCurves.Points[0].X + topCurves.Points[1].X) / 2.0; - double z = (topCurves.Points[0].Z + topCurves.Points[1].Z) / 2.0; - x -= xSoilGeometry2DOrigin; - z -= GeometryConstants.Accuracy; - Soil soil = FindSoilInOldSurfaces(originalSurfaces, x, z); - readSoilProfile.Surfaces[i].Soil = soil; - } - } - - private static Soil FindSoilInOldSurfaces(List originalSurfaces, double x, double z) - { - var np = new GeometryPoint(x, 0, z); - - foreach (var soilLayer2D in originalSurfaces) - { - if (soilLayer2D.GeometrySurface.OuterLoop.IsPointInLoopArea(np)) - { - return soilLayer2D.Soil; - } - } - string st = "surface "; - foreach (var geometryPoint in originalSurfaces[2].GeometrySurface.OuterLoop.Points) - { - st = st + " " + geometryPoint.ToString(); - } - - throw new InvalidOperationException("Soil should always be found at point X =" + x + " point Z = " + z + - " in " + st + "as is equal np.X = " + np.X + " np.Z = " + np.Z); - } - - private static List AdaptGeometryForXSoilGeometry2DOrigin(SoilProfile2D profile2D, double xSoilGeometry2DOrigin) - { - if (xSoilGeometry2DOrigin.IsNearEqual(GeometryConstants.Accuracy)) - { - return null; - } - - var oldSurfaces = new List(); - oldSurfaces.AddRange((IEnumerable) profile2D.Surfaces); - - foreach (var point in profile2D.Geometry.Points) - { - MoveXCoordinatePointInCurvesWithCoincidingInputPoint(profile2D, point, xSoilGeometry2DOrigin); - point.X += xSoilGeometry2DOrigin; - } - profile2D.Geometry.Rebox(); - return oldSurfaces; - } - - private static void MoveXCoordinatePointInCurvesWithCoincidingInputPoint(SoilProfile2D profile2D, - GeometryPoint inputPoint, - double xSoilGeometry2DOrigin) - { - foreach (Deltares.Geometry.GeometryCurve curve in profile2D.Geometry.Curves) - { - if (curve.HeadPoint.LocationEquals(inputPoint)) - curve.HeadPoint.X += xSoilGeometry2DOrigin; - if (curve.EndPoint.LocationEquals(inputPoint)) - curve.EndPoint.X += xSoilGeometry2DOrigin; - } - } - private static bool IsSoilOfSurfacePresent(IEnumerable availableSoils, string soilName) { var soilNames = new HashSet(availableSoils.Select(s => s.Name)); @@ -221,7 +218,7 @@ private static void TransferAquiferData(string soilProfileFileName, IEnumerable soilLayers, IEnumerable aquifers) { - if (aquifers != null) + if (aquifers != null && aquifers.Any()) { List aquiferList = aquifers.ToList(); foreach (SoilLayer2D layer in soilLayers) Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/StixFileReader.cs =================================================================== diff -u -r4539 -r5922 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/StixFileReader.cs (.../StixFileReader.cs) (revision 4539) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.StixFileReader/StixFileReader.cs (.../StixFileReader.cs) (revision 5922) @@ -36,9 +36,10 @@ /// Reads the data from a stix file into a . /// /// The file path to read from. + /// /// A . /// This only reads the names and the geometry of the soil layers. - public SoilProfile2D ReadSoilProfile(string filePath) + public SoilProfile2D ReadSoilProfile(string filePath, double offsetX = 0.0) { if (!File.Exists(filePath)) { @@ -49,7 +50,7 @@ PersistableDataModel dataModel = dataModelReader.Read(); VerifyReadData(dataModel); - SoilProfile2D soilProfile2D = new SoilProfile2DDataModel().Create(dataModel); + SoilProfile2D soilProfile2D = new SoilProfile2DDataModel().Create(dataModel, offsetX); soilProfile2D.Name = Path.GetFileName(filePath); return soilProfile2D; }