Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSigmaTauCurves.cs =================================================================== diff -u --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSigmaTauCurves.cs (revision 0) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporterSigmaTauCurves.cs (revision 4544) @@ -0,0 +1,117 @@ +// Copyright (C) Stichting Deltares 2024. All rights reserved. +// +// This file is part of the application DAM - UI. +// +// DAM - UI is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// All names, logos, and references to "Deltares" are registered trademarks of +// Stichting Deltares and remain full property of Stichting Deltares at all times. +// All rights reserved. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Threading; +using Deltares.Dam.Data.Importers; +using Deltares.Standard.IO; +using Deltares.Standard.Language; +using LumenWorks.Framework.IO.Csv; + +namespace Deltares.Dam.Data.CsvImporters; + +public class CsvImporterSigmaTauCurvesException(string message) : ApplicationException(message); + +public class CsvImporterSigmaTauCurves +{ + private readonly int currentColIndex = -1; // Keep track of column for error message + + public CsvImporterSigmaTauCurves(string fileName) + { + ErrorMessages.Clear(); + ThrowHelper.ThrowIfStringArgumentNullOrEmpty(fileName, StringResourceNames.CsvFileNotValid); + ThrowHelper.ThrowIfFileNotExist(fileName, StringResourceNames.CsvFileNotFound); + CultureInfo oldCultureInfo = Thread.CurrentThread.CurrentCulture; + try + { + Thread.CurrentThread.CurrentCulture = CsvReaderUtilities.DetermineCultureForFile(fileName); + using (var csv = new CsvReader(new StreamReader(fileName), true, ';')) + { + string[] headers = CsvImporterHelper.GetFieldHeaders(this, csv); + if (headers.Length < 2) + { + string csvHeaderError = LocalizationManager.GetTranslatedText(GetType(), "csvHeaderError"); + throw new CsvImporterSoilsException($"{fileName} : {csvHeaderError}"); + } + + int colIndexSigmaTauCurveName = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SigmaTauCurveNameColumnName); + CheckColumn(colIndexSigmaTauCurveName, fileName, CsvColumnNames.SoilNameColumnName); + + int colIndexSigma = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SigmaColumnName); + CheckColumn(colIndexSigma, fileName, CsvColumnNames.SigmaColumnName); + + int colIndexTau = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.TauColumnName); + CheckColumn(colIndexTau, fileName, CsvColumnNames.TauColumnName); + + while (csv.ReadNextRecord()) + { + var sigmaTauCurveRecord = new SigmaTauCurveRecord(); + try + { + // Required columns + currentColIndex = colIndexSigmaTauCurveName; + sigmaTauCurveRecord.SigmaTauCurveName = csv[currentColIndex]; + + currentColIndex = colIndexSigma; + sigmaTauCurveRecord.Sigma = Convert.ToDouble(csv[currentColIndex]); + + currentColIndex = colIndexTau; + sigmaTauCurveRecord.Tau = Convert.ToDouble(csv[currentColIndex]); + + ImportedItems.Add(sigmaTauCurveRecord); + } + catch (Exception e) + { + string csvSigmaTauCurveError = string.Format(LocalizationManager.GetTranslatedText(GetType(), "csvSigmaTauCurveError"), + sigmaTauCurveRecord.SigmaTauCurveName, currentColIndex + 1); + ErrorMessages.Add(csvSigmaTauCurveError + e.Message); + } + } + } + } + finally + { + Thread.CurrentThread.CurrentCulture = oldCultureInfo; + } + } + + public List ErrorMessages { get; } = new(); + public List ImportedItems { get; } = new(); + + private void CheckColumn(int index, string fileName, string fieldName) + { + if (index < 0) + { + string csvHeaderFieldError = LocalizationManager.GetTranslatedText(GetType(), "csvHeaderFieldError"); + throw new CsvImporterSigmaTauCurvesException($"{fileName} : {csvHeaderFieldError} {fieldName}"); + } + } + + public class SigmaTauCurveRecord + { + public string SigmaTauCurveName { get; set; } + public double Sigma { get; set; } + public double Tau { get; set; } + } +} \ No newline at end of file Index: DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/CsvImporterTestsNew.cs =================================================================== diff -u -r4539 -r4544 --- DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/CsvImporterTestsNew.cs (.../CsvImporterTestsNew.cs) (revision 4539) +++ DamClients/DamUI/trunk/src/Dam/Deltares.Dam.Tests/CsvImporterTestsNew.cs (.../CsvImporterTestsNew.cs) (revision 4544) @@ -818,7 +818,7 @@ CreateSoilProfilesFileWithIllegalHeader(testFilePath); Assert.That(() => new CsvImporterSoils(testFilePath), - Throws.InstanceOf().With.Message.Contains("The header misses the field: soil_type")); + Throws.InstanceOf().With.Message.Contains("The header misses the field: soil_color")); } [Test] @@ -838,6 +838,58 @@ Assert.AreEqual(3, csvImporterSoils.ErrorMessages.Count); } + [Test] + public void SigmaTauCurvesCorrectFileTest() + { + const string importFile = "sigmataucurves.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + { + File.Delete(testFilePath); + } + + CreateSigmaTauCurvesFile(testFilePath); + var csvImporterSigmaTauCurves = new CsvImporterSigmaTauCurves(testFilePath); + IList sigmaTauCurveRecords = csvImporterSigmaTauCurves.ImportedItems; + + Assert.AreEqual("CurveKlei", sigmaTauCurveRecords[0].SigmaTauCurveName); + Assert.AreEqual(0.0, sigmaTauCurveRecords[0].Sigma); + Assert.AreEqual(2.05, sigmaTauCurveRecords[0].Tau); + Assert.AreEqual("CurveKlei", sigmaTauCurveRecords[1].SigmaTauCurveName); + Assert.AreEqual(13.0, sigmaTauCurveRecords[1].Sigma); + Assert.AreEqual(8.05, sigmaTauCurveRecords[1].Tau); + Assert.AreEqual("CurveKlei", sigmaTauCurveRecords[2].SigmaTauCurveName); + Assert.AreEqual(26.0, sigmaTauCurveRecords[2].Sigma); + Assert.AreEqual(13.79, sigmaTauCurveRecords[2].Tau); + Assert.AreEqual("CurveKlei", sigmaTauCurveRecords[3].SigmaTauCurveName); + Assert.AreEqual(65.0, sigmaTauCurveRecords[3].Sigma); + Assert.AreEqual(28.1, sigmaTauCurveRecords[3].Tau); + Assert.AreEqual("CurveKlei", sigmaTauCurveRecords[4].SigmaTauCurveName); + Assert.AreEqual(110.5, sigmaTauCurveRecords[4].Sigma); + Assert.AreEqual(44.6, sigmaTauCurveRecords[4].Tau); + Assert.AreEqual("CurveZand", sigmaTauCurveRecords[5].SigmaTauCurveName); + Assert.AreEqual(0.0, sigmaTauCurveRecords[5].Sigma); + Assert.AreEqual(0.0, sigmaTauCurveRecords[5].Tau); + Assert.AreEqual("CurveZand", sigmaTauCurveRecords[6].SigmaTauCurveName); + Assert.AreEqual(200.0, sigmaTauCurveRecords[6].Sigma); + Assert.AreEqual(129.88, sigmaTauCurveRecords[6].Tau); + } + + [Test] + public void SigmaTauCurvesMissingColumnFileTest() + { + const string importFile = "sigmataucurves_missing_column.csv"; + string testFilePath = Path.Combine(importFolder, importFile); + if (File.Exists(testFilePath)) + { + File.Delete(testFilePath); + } + + CreateSigmaTauCurvesMissingColumngFile(testFilePath); + Assert.That(() => new CsvImporterSigmaTauCurves(testFilePath), + Throws.InstanceOf().With.Message.Contains("The header misses the field: sigma")); + } + /// /// Create csv file with segments containing 1d soilprofiles /// @@ -939,6 +991,30 @@ writer.WriteLine("Veen;#A4FFA6;Peat;11.000;11.000;2.000;20.500;210.00;0.001;None;;;0;10.000"); } + private static void CreateSigmaTauCurvesFile(string filePath) + { + using StreamWriter writer = File.CreateText(filePath); + writer.WriteLine("sigma_tau_curve_name;sigma;tau"); + writer.WriteLine("CurveKlei;0.0;2.05"); + writer.WriteLine("CurveKlei;13.0;8.05"); + writer.WriteLine("CurveKlei;26.0;13.79"); + writer.WriteLine("CurveKlei;65.0;28.10"); + writer.WriteLine("CurveKlei;110.5;44.60"); + writer.WriteLine("CurveZand;0.0;0.0"); + writer.WriteLine("CurveZand;200.0;129.88"); + } + + private static void CreateSigmaTauCurvesMissingColumngFile(string filePath) + { + using StreamWriter writer = File.CreateText(filePath); + writer.WriteLine("sigma_tau_curve_name;tau"); + writer.WriteLine("CurveKlei;2.05"); + writer.WriteLine("CurveKlei;8.05"); + writer.WriteLine("CurveKlei;13.79"); + writer.WriteLine("CurveKlei;28.10"); + writer.WriteLine("CurveKlei;44.60"); + } + private static void CreateSoilProfilesFileWithIllegalHeader(string filePath) { using StreamWriter writer = File.CreateText(filePath); Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporter.cs =================================================================== diff -u -r4539 -r4544 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporter.cs (.../CsvImporter.cs) (revision 4539) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/CsvImporters/CsvImporter.cs (.../CsvImporter.cs) (revision 4544) @@ -39,6 +39,7 @@ private const string characteristicPointFileNamePart = "characteristicpoints"; private const string scenariosFileNamePart = "scenarios"; private const string soilsFileNamePart = "soils"; + private const string sigmaTauCurvesFileNamePart = "sigma_tau_curves"; private string folderName; public List ErrorMessages { get; } = new(); @@ -57,6 +58,8 @@ public List SoilsRecords { get; private set; } = new(); + public List SigmaTauCurvesRecords { get; private set; } = new(); + /// /// Imports the CSV data from directory. /// @@ -108,6 +111,12 @@ ImportSoils(SoilsFileName); } + if (File.Exists(SigmaTauCurvesFileName)) + { + progress?.Invoke(0.29); + ImportSigmaTauCurves(SigmaTauCurvesFileName); + } + progress?.Invoke(0.30); } } @@ -133,6 +142,8 @@ private string SoilsFileName => string.Format(filePattern, ImportFolderLocation, soilsFileNamePart); + private string SigmaTauCurvesFileName => string.Format(filePattern, ImportFolderLocation, sigmaTauCurvesFileNamePart); + /// /// Imports the locations. /// @@ -152,7 +163,7 @@ ErrorMessages.Add(logMessage); } } - catch (CsvImporterSegmentsException e) + catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); ErrorMessages.Add(logMessage); @@ -176,7 +187,7 @@ ErrorMessages.Add(logMessage); } } - catch (CsvImporterSegmentsException e) + catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); ErrorMessages.Add(logMessage); @@ -199,7 +210,7 @@ ErrorMessages.Add(logMessage); } } - catch (CsvImporterCharacteristicPointsException e) + catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); ErrorMessages.Add(logMessage); @@ -212,7 +223,7 @@ /// Name of the file. private void ImportSoilProfiles(string fileName) { - // 1D Soilprofiles are not mandatory. The project can use 2D-geometries + // 1D SoilProfiles are not mandatory. The project can use 2D-geometries if (File.Exists(fileName)) { try @@ -225,7 +236,7 @@ ErrorMessages.Add(logMessage); } } - catch (CsvImporterSoilProfilesException e) + catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); ErrorMessages.Add(logMessage); @@ -249,7 +260,7 @@ ErrorMessages.Add(logMessage); } } - catch (CsvImporterSurfaceLinesException e) + catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); ErrorMessages.Add(logMessage); @@ -272,11 +283,6 @@ ErrorMessages.Add(logMessage); } } - catch (CsvImporterScenariosException e) - { - var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); - ErrorMessages.Add(logMessage); - } catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); @@ -300,11 +306,29 @@ ErrorMessages.Add(logMessage); } } - catch (CsvImporterSoilsException e) + catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); ErrorMessages.Add(logMessage); } + } + + /// + /// Import the Sigma Tau Curves + /// + /// The filename of the file to read + private void ImportSigmaTauCurves(string fileName) + { + try + { + var csvImporterSigmaTauCurves = new CsvImporterSigmaTauCurves(fileName); + SigmaTauCurvesRecords = csvImporterSigmaTauCurves.ImportedItems; + foreach (string errorMessage in csvImporterSigmaTauCurves.ErrorMessages) + { + var logMessage = new LogMessage(LogMessageType.Error, this, errorMessage); + ErrorMessages.Add(logMessage); + } + } catch (Exception e) { var logMessage = new LogMessage(LogMessageType.FatalError, this, e.Message); Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Importers/CsvColumnNames.cs =================================================================== diff -u -r4539 -r4544 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Importers/CsvColumnNames.cs (.../CsvColumnNames.cs) (revision 4539) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Importers/CsvColumnNames.cs (.../CsvColumnNames.cs) (revision 4544) @@ -431,6 +431,16 @@ public const string SigmaTauCurveNameColumnName = "sigma_tau_curve_name"; /// + /// Normal effective stress + /// + public const string SigmaColumnName = "sigma"; + + /// + /// Shear strength + /// + public const string TauColumnName = "tau"; + + /// /// strength_increase_exponent /// public const string StrengthIncreaseExponentColumnName = "strength_increase_exponent"; Index: DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Translations.xml =================================================================== diff -u -r4539 -r4544 --- DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Translations.xml (.../Translations.xml) (revision 4539) +++ DamClients/DamUI/trunk/src/DamClientsLibrary/Deltares.Dam.Data/Translations.xml (.../Translations.xml) (revision 4544) @@ -376,6 +376,9 @@ +