// Copyright (C) Stichting Deltares 2025. 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 CsvImporterLocations { private int currentColIndex = -1; // Keep track of column for error message public CsvImporterLocations(string fileName) { ErrorMessages.Clear(); ThrowHelper.ThrowIfStringArgumentNullOrEmpty(fileName, StringResourceNames.CsvFileNotValid); ThrowHelper.ThrowIfFileNotExist(fileName, StringResourceNames.CsvFileNotFound); CultureInfo oldcur = 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 < 3) { string csvHeaderError = LocalizationManager.GetTranslatedText(GetType(), "csvHeaderError"); throw new CsvImporterSegmentsException($"{fileName} : {csvHeaderError}"); } int colIndexLocationId = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.LocationColumnName); int colIndexSurfacelineId = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SurfaceLineColumnName); int colIndexSegmentId = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SegmentColumnName); int colIndexGeoX = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.XValueColumnName); int colIndexGeoY = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.YValueColumnName); int colIndexXSoilgeometry2DOrigin = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.XSoilGeometry2DOriginColumnName); int colIndexPolderlevel = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PolderLevelColumnName); int colIndexHeadPl2 = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.HeadPl2ColumnName); int colIndexHeadPl3 = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.HeadPl3ColumnName); int colIndexHeadPl4 = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.HeadPl4ColumnName); int colIndexOphoogmateriaaldijk = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.DikeEmbankmentMaterialColumnName); int colIndexOphoogmateriaalberm = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.ShoulderEmbankmentMaterialColumnName); int colIndexPenetrationLength = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PenetrationLengthColumnName); int colIndexTrafficLoad = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.TrafficLoadColumnName); int colIndexTrafficLoadDistributionAngle = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.TrafficLoadDistributionAngle); int colIndexMinimalCircleDepth = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.MinimalCircleDepthColumnName); int colIndexDempingsfactorPl3 = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.DampingFactorPl3ColumnName); int colIndexDempingsfactorPl4 = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.DampingFactorPl4ColumnName); int colIndexPLLineCreationMethod = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PlLineCreationMethodColumnName); int colIndexSafetyFactorPiping = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.RequiredSafetyFactorPipingColumnName); int colIndexSafetyFactorStabilityInnerSlope = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.RequiredSafetyFactorStabilityInnerSlopeColumnName); int colIndexSafetyFactorStabilityOuterSlope = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.RequiredSafetyFactorStabilityOuterSlopeColumnName); int colIndexUpliftCriterionPiping = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UpliftCriterionPipingColumnName); int colIndexUpliftCriterionStability = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UpliftCriterionStabilityColumnName); int colIndexDistanceToEntryPoint = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.DistanceToEntryPointColumnName); int colIndexPLLineOffsetBelowDikeTopAtRiver = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PlLineOffsetBelowDikeTopAtRiverColumnName); int colIndexPLLineOffsetBelowDikeTopAtPolder = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PlLineOffsetBelowDikeTopAtPolderColumnName); int colIndexPLLineOffsetBelowShoulderBaseInside = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PlLineOffsetBelowShoulderBaseInsideColumnName); int colIndexPLLineOffsetBelowDikeToeAtPolder = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PlLineOffsetBelowDikeToeAtPolderColumnName); int colIndexPlLineOffsetBelowDikeCrestMiddle = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PlLineOffsetBelowDikeCrestMiddleColumnName); int colIndexPlLineOffsetFactorBelowShoulderCrest = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.PlLineOffsetFactorBelowShoulderCrestColumnName); int colIndexUsePlLineOffsetBelowDikeCrestMiddle = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UsePlLineOffsetBelowDikeCrestMiddleColumnName); int colIndexUsePlLineOffsetFactorBelowShoulderCrest = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UsePlLineOffsetFactorBelowShoulderCrestColumnName); int colIndexIntrusionVerticalWaterPressure = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.IntrusionVerticalWaterPressureColumnName); int colIndexStabilityShoulderGrowSlope = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.StabilityShoulderGrowSlopeColumnName); int colIndexStabilityShoulderGrowDeltaX = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.StabilityShoulderGrowDeltaXColumnName); int colIndexStabilitySlopeAdaptionDeltaX = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.StabilitySlopeAdaptionDeltaXColumnName); int colIndexSlopeDampingPiezometricHeightPolderSide = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SlopeDampingPiezometricHeightPolderSideColumnName); int colIndexStabilityDesignMethod = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.StabilityDesignMethodColumnName); int colIndexStabilityZoneType = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.ZoneTypeColumnName); int colIndexForbiddenZoneFactor = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.ForbiddenZoneFactorColumnName); int colIndexSlopeAdaptionStartCotangent = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SlopeAdaptionStartCotangentColumnName); int colIndexSlopeAdaptionEndCotangent = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SlopeAdaptionEndCotangentColumnName); int colIndexSlopeAdaptionStepCotangent = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.SlopeAdaptionStepCotangentColumnName); int colIndexNewDikeTopWidth = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewDikeTopWidthColumnName); int colIndexUseNewDikeTopWidth = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewDikeTopWidthColumnName); int colIndexNewDikeSlopeInside = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewDikeSlopeInsideColumnName); int colIndexUseNewDikeSlopeInside = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewDikeSlopeInsideColumnName); int colIndexNewDikeSlopeOutside = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewDikeSlopeOutsideColumnName); int colIndexUseNewDikeSlopeOutside = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewDikeSlopeOutsideColumnName); int colIndexNewShoulderTopSlope = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewShoulderTopSlopeColumnName); int colIndexUseNewShoulderTopSlope = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewShoulderTopSlopeColumnName); int colIndexNewShoulderBaseSlope = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewShoulderBaseSlopeColumnName); int colIndexUseNewShoulderBaseSlope = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewShoulderBaseSlopeColumnName); int colIndexNewMaxHeightShoulderAsFraction = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewMaxHeightShoulderAsFractionColumnName); int colIndexUseNewMaxHeightShoulderAsFraction = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewMaxHeightShoulderAsFractionColumnName); int colIndexNewMinDistanceDikeToeStartDitch = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewMinDistanceDikeToeStartDitchColumnName); int colIndexUseNewMinDistanceDikeToeStartDitch = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewMinDistanceDikeToeStartDitchColumnName); int colIndexUseNewDitchDefinition = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.UseNewDitchDefinitionColumnName); int colIndexNewWidthDitchBottom = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewWidthDitchBottomColumnName); int colIndexNewSlopeAngleDitch = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewSlopeAngleDitchColumnName); int colIndexNewDepthDitch = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.NewDepthDitchColumnName); int colIndexDikeTableHeight = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.DikeTableHeightColumnName); int colIndexRiverLevel = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.RiverLevelColumnName); int colIndexRiverLevelLow = CsvReaderUtilities.GetHeaderIndexByString(headers, CsvColumnNames.RiverLevelLowColumnName); var index = 1; while (csv.ReadNextRecord()) { var locationRecord = new LocationRecord(); try { locationRecord.LocationRecordId = index++; // Required columns locationRecord.LocationId = csv[colIndexLocationId]; locationRecord.SurfaceLineId = csv[colIndexSurfacelineId]; locationRecord.SegmentId = csv[colIndexSegmentId]; // Optional columns locationRecord.GeoX = FetchOptionalColumnToDouble(colIndexGeoX, csv); locationRecord.GeoY = FetchOptionalColumnToDouble(colIndexGeoY, csv); locationRecord.XSoilGeometry2DOrigin = FetchOptionalColumnToDouble(colIndexXSoilgeometry2DOrigin, csv); locationRecord.PolderLevel = FetchOptionalColumnToDouble(colIndexPolderlevel, csv); locationRecord.HeadPl2 = FetchOptionalColumnToDouble(colIndexHeadPl2, csv); locationRecord.HeadPl3 = FetchOptionalColumnToDouble(colIndexHeadPl3, csv); locationRecord.HeadPl4 = FetchOptionalColumnToDouble(colIndexHeadPl4, csv); locationRecord.DikeEmbankmentMaterial = FetchOptionalColumnToString(colIndexOphoogmateriaaldijk, csv); locationRecord.ShoulderEmbankmentMaterial = FetchOptionalColumnToString(colIndexOphoogmateriaalberm, csv); locationRecord.PenetrationLength = FetchOptionalColumnToDouble(colIndexPenetrationLength, csv); locationRecord.TrafficLoad = FetchOptionalColumnToDouble(colIndexTrafficLoad, csv); locationRecord.TrafficLoadDistributionAngle = FetchOptionalColumnToDouble(colIndexTrafficLoadDistributionAngle, csv); locationRecord.MinimalCircleDepth = FetchOptionalColumnToDouble(colIndexMinimalCircleDepth, csv); locationRecord.DampingFactorPl3 = FetchOptionalColumnToDouble(colIndexDempingsfactorPl3, csv); locationRecord.DampingFactorPl4 = FetchOptionalColumnToDouble(colIndexDempingsfactorPl4, csv); if (colIndexPLLineCreationMethod > -1) { currentColIndex = colIndexPLLineCreationMethod; locationRecord.PLLineCreationMethod = LocationImportHelper.ToPLLineCreationMethod(csv[colIndexPLLineCreationMethod]); } locationRecord.RequiredSafetyFactorPiping = FetchOptionalColumnToDouble(colIndexSafetyFactorPiping, csv); locationRecord.RequiredSafetyFactorStabilityInnerSlope = FetchOptionalColumnToDouble(colIndexSafetyFactorStabilityInnerSlope, csv); locationRecord.RequiredSafetyFactorStabilityOuterSlope = FetchOptionalColumnToDouble(colIndexSafetyFactorStabilityOuterSlope, csv); locationRecord.UpliftCriterionPiping = FetchOptionalColumnToDouble(colIndexUpliftCriterionPiping, csv); locationRecord.UpliftCriterionStability = FetchOptionalColumnToDouble(colIndexUpliftCriterionStability, csv); locationRecord.DistanceToEntryPoint = FetchOptionalColumnToDouble(colIndexDistanceToEntryPoint, csv); locationRecord.PlLineOffsetBelowDikeTopAtRiver = FetchOptionalColumnToDouble(colIndexPLLineOffsetBelowDikeTopAtRiver, csv); locationRecord.PlLineOffsetBelowDikeTopAtPolder = FetchOptionalColumnToDouble(colIndexPLLineOffsetBelowDikeTopAtPolder, csv); locationRecord.PlLineOffsetBelowShoulderBaseInside = FetchOptionalColumnToDouble(colIndexPLLineOffsetBelowShoulderBaseInside, csv); locationRecord.PlLineOffsetBelowDikeToeAtPolder = FetchOptionalColumnToDouble(colIndexPLLineOffsetBelowDikeToeAtPolder, csv); locationRecord.PlLineOffsetBelowDikeCrestMiddle = FetchOptionalColumnToDouble(colIndexPlLineOffsetBelowDikeCrestMiddle, csv); locationRecord.PlLineOffsetFactorBelowShoulderCrest = FetchOptionalColumnToDouble(colIndexPlLineOffsetFactorBelowShoulderCrest, csv); locationRecord.UsePlLineOffsetBelowDikeCrestMiddle = FetchOptionalColumnToBoolean(colIndexUsePlLineOffsetBelowDikeCrestMiddle, csv); locationRecord.UsePlLineOffsetFactorBelowShoulderCrest = FetchOptionalColumnToBoolean(colIndexUsePlLineOffsetFactorBelowShoulderCrest, csv); if (colIndexIntrusionVerticalWaterPressure > -1) { currentColIndex = colIndexIntrusionVerticalWaterPressure; locationRecord.IntrusionVerticalWaterPressure = LocationImportHelper.ToIntrusionVerticalWaterPressure(csv[currentColIndex]); } locationRecord.StabilityShoulderGrowSlope = FetchOptionalColumnToDouble(colIndexStabilityShoulderGrowSlope, csv); locationRecord.StabilityShoulderGrowDeltaX = FetchOptionalColumnToDouble(colIndexStabilityShoulderGrowDeltaX, csv); locationRecord.StabilitySlopeAdaptionDeltaX = FetchOptionalColumnToDouble(colIndexStabilitySlopeAdaptionDeltaX, csv); if (colIndexStabilityDesignMethod > -1) { currentColIndex = colIndexStabilityDesignMethod; locationRecord.StabilityDesignMethod = LocationImportHelper.ToStabilityDesignMethod(csv[colIndexStabilityDesignMethod]); } if (colIndexStabilityZoneType > -1) { currentColIndex = colIndexStabilityZoneType; locationRecord.StabilityZoneType = LocationImportHelper.ToMStabZonesTypeMethod(csv[colIndexStabilityZoneType]); } locationRecord.ForbiddenZoneFactor = FetchOptionalColumnToDouble(colIndexForbiddenZoneFactor, csv); locationRecord.SlopeAdaptionStartCotangent = FetchOptionalColumnToDouble(colIndexSlopeAdaptionStartCotangent, csv); locationRecord.SlopeAdaptionEndCotangent = FetchOptionalColumnToDouble(colIndexSlopeAdaptionEndCotangent, csv); locationRecord.SlopeAdaptionStepCotangent = FetchOptionalColumnToDouble(colIndexSlopeAdaptionStepCotangent, csv); locationRecord.SlopeDampingPiezometricHeightPolderSide = FetchOptionalColumnToDouble(colIndexSlopeDampingPiezometricHeightPolderSide, csv); locationRecord.NewDikeTopWidth = FetchOptionalColumnToDouble(colIndexNewDikeTopWidth, csv); locationRecord.NewDikeSlopeInside = FetchOptionalColumnToDouble(colIndexNewDikeSlopeInside, csv); locationRecord.NewDikeSlopeOutside = FetchOptionalColumnToDouble(colIndexNewDikeSlopeOutside, csv); locationRecord.NewShoulderTopSlope = FetchOptionalColumnToDouble(colIndexNewShoulderTopSlope, csv); locationRecord.NewShoulderBaseSlope = FetchOptionalColumnToDouble(colIndexNewShoulderBaseSlope, csv); locationRecord.NewMaxHeightShoulderAsFraction = FetchOptionalColumnToDouble(colIndexNewMaxHeightShoulderAsFraction, csv); locationRecord.NewMinDistanceDikeToeStartDitch = FetchOptionalColumnToDouble(colIndexNewMinDistanceDikeToeStartDitch, csv); locationRecord.NewWidthDitchBottom = FetchOptionalColumnToDouble(colIndexNewWidthDitchBottom, csv); locationRecord.NewSlopeAngleDitch = FetchOptionalColumnToDouble(colIndexNewSlopeAngleDitch, csv); locationRecord.NewDepthDitch = FetchOptionalColumnToDouble(colIndexNewDepthDitch, csv); locationRecord.UseNewDikeTopWidth = FetchOptionalColumnToBoolean(colIndexUseNewDikeTopWidth, csv); locationRecord.UseNewDikeSlopeInside = FetchOptionalColumnToBoolean(colIndexUseNewDikeSlopeInside, csv); locationRecord.UseNewDikeSlopeOutside = FetchOptionalColumnToBoolean(colIndexUseNewDikeSlopeOutside, csv); locationRecord.UseNewShoulderTopSlope = FetchOptionalColumnToBoolean(colIndexUseNewShoulderTopSlope, csv); locationRecord.UseNewShoulderBaseSlope = FetchOptionalColumnToBoolean(colIndexUseNewShoulderBaseSlope, csv); locationRecord.UseNewMaxHeightShoulderAsFraction = FetchOptionalColumnToBoolean(colIndexUseNewMaxHeightShoulderAsFraction, csv); locationRecord.UseNewMinDistanceDikeToeStartDitch = FetchOptionalColumnToBoolean(colIndexUseNewMinDistanceDikeToeStartDitch, csv); locationRecord.UseNewDitchDefinition = FetchOptionalColumnToBoolean(colIndexUseNewDitchDefinition, csv); locationRecord.DikeTableHeight = FetchOptionalColumnToDouble(colIndexDikeTableHeight, csv); locationRecord.RiverLevel = FetchOptionalColumnToDouble(colIndexRiverLevel, csv); locationRecord.RiverLevelLow = FetchOptionalColumnToDouble(colIndexRiverLevelLow, csv); ImportedItems.Add(locationRecord); } catch (Exception e) { string csvLocationError = string.Format(LocalizationManager.GetTranslatedText(GetType(), "csvLocationError"), locationRecord.LocationId, currentColIndex + 1); ErrorMessages.Add(csvLocationError + e.Message); } } } } finally { Thread.CurrentThread.CurrentCulture = oldcur; } } public List ImportedItems { get; } = new(); public List ErrorMessages { get; set; } = new(); private double? FetchOptionalColumnToDouble(int colIndex, CsvReader csv) { if (colIndex > -1) { currentColIndex = colIndex; return Convert.ToDouble(csv[colIndex]); } return null; } private bool? FetchOptionalColumnToBoolean(int colIndex, CsvReader csv) { if (colIndex > -1) { currentColIndex = colIndex; return Convert.ToBoolean(csv[colIndex]); } return null; } private string FetchOptionalColumnToString(int colIndex, CsvReader csv) { if (colIndex > -1) { currentColIndex = colIndex; return csv[colIndex]; } return null; } public class LocationRecord { public IntrusionVerticalWaterPressureType? IntrusionVerticalWaterPressure; public int LocationRecordId { get; set; } public string LocationId { get; set; } public string SurfaceLineId { get; set; } public string SegmentId { get; set; } public double? GeoX { get; set; } public double? GeoY { get; set; } public double? XSoilGeometry2DOrigin { get; set; } public double? PolderLevel { get; set; } public double? HeadPl2 { get; set; } public double? HeadPl3 { get; set; } public double? HeadPl4 { get; set; } public string DikeEmbankmentMaterial { get; set; } public string ShoulderEmbankmentMaterial { get; set; } public double? PenetrationLength { get; set; } public double? TrafficLoad { get; set; } public double? TrafficLoadDistributionAngle { get; set; } public double? MinimalCircleDepth { get; set; } public double? DampingFactorPl3 { get; set; } public double? DampingFactorPl4 { get; set; } public PLLineCreationMethod? PLLineCreationMethod { get; set; } public double? RequiredSafetyFactorPiping { get; set; } public double? RequiredSafetyFactorStabilityInnerSlope { get; set; } public double? RequiredSafetyFactorStabilityOuterSlope { get; set; } public double? UpliftCriterionPiping { get; set; } public double? UpliftCriterionStability { get; set; } public double? DistanceToEntryPoint { get; set; } public double? PlLineOffsetBelowDikeTopAtRiver { get; set; } public double? PlLineOffsetBelowDikeTopAtPolder { get; set; } public double? PlLineOffsetBelowShoulderBaseInside { get; set; } public double? PlLineOffsetBelowDikeToeAtPolder { get; set; } public double? PlLineOffsetBelowDikeCrestMiddle { get; set; } public double? PlLineOffsetFactorBelowShoulderCrest { get; set; } public bool? UsePlLineOffsetBelowDikeCrestMiddle { get; set; } public bool? UsePlLineOffsetFactorBelowShoulderCrest { get; set; } public double? StabilityShoulderGrowSlope { get; set; } public double? StabilityShoulderGrowDeltaX { get; set; } public double? StabilitySlopeAdaptionDeltaX { get; set; } public double? SlopeDampingPiezometricHeightPolderSide { get; set; } public StabilityDesignMethod? StabilityDesignMethod { get; set; } public StabilityZoneType? StabilityZoneType { get; set; } public double? ForbiddenZoneFactor { get; set; } public double? SlopeAdaptionStartCotangent { get; set; } public double? SlopeAdaptionEndCotangent { get; set; } public double? SlopeAdaptionStepCotangent { get; set; } public double? NewDikeTopWidth { get; set; } public bool? UseNewDikeTopWidth { get; set; } public double? NewDikeSlopeInside { get; set; } public bool? UseNewDikeSlopeInside { get; set; } public double? NewDikeSlopeOutside { get; set; } public bool? UseNewDikeSlopeOutside { get; set; } public double? NewShoulderTopSlope { get; set; } public bool? UseNewShoulderTopSlope { get; set; } public double? NewShoulderBaseSlope { get; set; } public bool? UseNewShoulderBaseSlope { get; set; } public double? NewMaxHeightShoulderAsFraction { get; set; } public bool? UseNewMaxHeightShoulderAsFraction { get; set; } public double? NewMinDistanceDikeToeStartDitch { get; set; } public bool? UseNewMinDistanceDikeToeStartDitch { get; set; } public bool? UseNewDitchDefinition { get; set; } public double? NewWidthDitchBottom { get; set; } public double? NewSlopeAngleDitch { get; set; } public double? NewDepthDitch { get; set; } public double? DikeTableHeight { get; set; } public double? RiverLevel { get; set; } public double? RiverLevelLow { get; set; } } }