Index: dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/ConversionHelper.cs =================================================================== diff -u --- dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/ConversionHelper.cs (revision 0) +++ dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/ConversionHelper.cs (revision 458) @@ -0,0 +1,121 @@ +using System.Collections.Generic; +using Deltares.DamEngine.Io.XmlInput; + +namespace Deltares.Dam.Data.DamEngineIo +{ + public static class ConversionHelper + { + /// + /// Converts the type DamProjectType from input object type to Dam Engine type. + /// + /// Type of the input object. + /// Dam Engine type + public static DamProjectType ConvertToDamProjectType(InputDamProjectType inputDamProjectType) + { + var translationTable = new Dictionary() + { + {InputDamProjectType.Assessment, DamProjectType.Assessment}, + {InputDamProjectType.AssessmentRegional, DamProjectType.Assessment}, // must be handled in additional code after conversion + {InputDamProjectType.Design, DamProjectType.Design}, + {InputDamProjectType.Operational, DamProjectType.Calamity} + // InputDamProjectType.NWO not implemented yet + }; + return translationTable[inputDamProjectType]; + } + /// + /// Converts the type DamProjectType from Dam Engine type to input object type. + /// + /// Type of the dam project. + /// Type of the input object. + public static InputDamProjectType ConvertToInputDamProjectType(DamProjectType damProjectType) + { + var translationTable = new Dictionary() + { + {DamProjectType.Assessment, InputDamProjectType.Assessment}, + {DamProjectType.Design, InputDamProjectType.Design}, + {DamProjectType.Calamity, InputDamProjectType.Operational}, + }; + return translationTable[damProjectType]; + } + + /// + /// Converts the type PLLineCreationMethod from Dam Engine type to input object type. + /// + /// Type of the dam project. + /// + /// Type of the input object. + /// + public static LocationWaternetOptionsPhreaticLineCreationMethod ConvertToInputPhreaticLineCreationMethod(PLLineCreationMethod plLineCreationMethod) + { + var translationTable = new Dictionary() + { + {PLLineCreationMethod.ExpertKnowledgeLinearInDike, LocationWaternetOptionsPhreaticLineCreationMethod.ExpertKnowledgeLinearInDike}, + {PLLineCreationMethod.ExpertKnowledgeRRD, LocationWaternetOptionsPhreaticLineCreationMethod.ExpertKnowledgeRRD}, + {PLLineCreationMethod.GaugesWithFallbackToExpertKnowledgeRRD, LocationWaternetOptionsPhreaticLineCreationMethod.GaugesWithFallbackToExpertKnowledgeRRD}, + {PLLineCreationMethod.Sensors, LocationWaternetOptionsPhreaticLineCreationMethod.Sensors}, + {PLLineCreationMethod.None, LocationWaternetOptionsPhreaticLineCreationMethod.None} + }; + return translationTable[plLineCreationMethod]; + } + + /// + /// Converts the type PLLineCreationMethod from input object type to Dam Engine type. + /// + /// Type of the input object. + /// + /// Type of the dam object. + /// + public static PLLineCreationMethod ConvertToPhreaticLineCreationMethod(LocationWaternetOptionsPhreaticLineCreationMethod inputPhreaticLineCreationMethod) + { + var translationTable = new Dictionary() + { + {LocationWaternetOptionsPhreaticLineCreationMethod.ExpertKnowledgeLinearInDike,PLLineCreationMethod.ExpertKnowledgeLinearInDike}, + {LocationWaternetOptionsPhreaticLineCreationMethod.ExpertKnowledgeRRD, PLLineCreationMethod.ExpertKnowledgeRRD}, + {LocationWaternetOptionsPhreaticLineCreationMethod.GaugesWithFallbackToExpertKnowledgeRRD, PLLineCreationMethod.GaugesWithFallbackToExpertKnowledgeRRD}, + {LocationWaternetOptionsPhreaticLineCreationMethod.Sensors, PLLineCreationMethod.Sensors}, + {LocationWaternetOptionsPhreaticLineCreationMethod.None, PLLineCreationMethod.None} + }; + return translationTable[inputPhreaticLineCreationMethod]; + } + + /// + /// Converts the type IntrusionVerticalWaterPressureType from Dam Engine type to input object type. + /// + /// Type of the dam project. + /// + /// Type of the input object. + /// + public static LocationWaternetOptionsIntrusionVerticalWaterPressure ConvertToInputIntrusionVerticalWaterPressure(IntrusionVerticalWaterPressureType intrusionVerticalWaterPressureType) + { + var translationTable = new Dictionary() + { + {IntrusionVerticalWaterPressureType.FullHydroStatic, LocationWaternetOptionsIntrusionVerticalWaterPressure.FullHydroStatic}, + {IntrusionVerticalWaterPressureType.HydroStatic, LocationWaternetOptionsIntrusionVerticalWaterPressure.HydroStatic}, + {IntrusionVerticalWaterPressureType.Linear, LocationWaternetOptionsIntrusionVerticalWaterPressure.Linear}, + {IntrusionVerticalWaterPressureType.SemiTimeDependent, LocationWaternetOptionsIntrusionVerticalWaterPressure.SemiTimeDependent}, + {IntrusionVerticalWaterPressureType.Standard, LocationWaternetOptionsIntrusionVerticalWaterPressure.Standard} + }; + return translationTable[intrusionVerticalWaterPressureType]; + } + + /// + /// Converts the type IntrusionVerticalWaterPressureType from input object type to Dam Engine type. + /// + /// Type of the input object. + /// + /// Type of the dam object. + /// + public static IntrusionVerticalWaterPressureType ConvertToIntrusionVerticalWaterPressure(LocationWaternetOptionsIntrusionVerticalWaterPressure inputIntrusionVerticalWaterPressure) + { + var translationTable = new Dictionary() + { + {LocationWaternetOptionsIntrusionVerticalWaterPressure.FullHydroStatic, IntrusionVerticalWaterPressureType.FullHydroStatic}, + {LocationWaternetOptionsIntrusionVerticalWaterPressure.HydroStatic, IntrusionVerticalWaterPressureType.HydroStatic}, + {LocationWaternetOptionsIntrusionVerticalWaterPressure.Linear, IntrusionVerticalWaterPressureType.Linear}, + {LocationWaternetOptionsIntrusionVerticalWaterPressure.SemiTimeDependent, IntrusionVerticalWaterPressureType.SemiTimeDependent}, + {LocationWaternetOptionsIntrusionVerticalWaterPressure.Standard, IntrusionVerticalWaterPressureType.Standard} + }; + return translationTable[inputIntrusionVerticalWaterPressure]; + } + } +} Index: dam clients/DamUI/trunk/src/Dam/Tests/Deltares.Dam.Tests.csproj =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Tests/Deltares.Dam.Tests.csproj (.../Deltares.Dam.Tests.csproj) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Tests/Deltares.Dam.Tests.csproj (.../Deltares.Dam.Tests.csproj) (revision 458) @@ -43,6 +43,14 @@ False ..\..\..\lib\Authorization\x86\Deltares.Authorization.dll + + False + ..\..\..\lib\DamEngine\Deltares.DamEngine.Interface.dll + + + False + ..\..\..\lib\DamEngine\Deltares.DamEngine.Io.dll + False ..\..\..\lib\DSL-Geographic\Deltares.Geographic.dll Index: dam clients/DamUI/trunk/src/Dam/Tests/DamEngineIo/FillDamUiFromXmlOutputTests.cs =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Tests/DamEngineIo/FillDamUiFromXmlOutputTests.cs (.../FillDamUiFromXmlOutputTests.cs) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Tests/DamEngineIo/FillDamUiFromXmlOutputTests.cs (.../FillDamUiFromXmlOutputTests.cs) (revision 458) @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using NUnit.Framework; -using Deltares.Dam.Data.DamEngineIo; +using NUnit.Framework; namespace Deltares.Dam.Tests.DamEngineIo { Index: dam clients/DamUI/trunk/src/Dam/Tests/DamEngineIo/FillXmlInputFromDamUiTests.cs =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Tests/DamEngineIo/FillXmlInputFromDamUiTests.cs (.../FillXmlInputFromDamUiTests.cs) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Tests/DamEngineIo/FillXmlInputFromDamUiTests.cs (.../FillXmlInputFromDamUiTests.cs) (revision 458) @@ -1,15 +1,88 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; +using Deltares.Dam.Data; using Deltares.Dam.Data.DamEngineIo; +using Deltares.DamEngine.Io; +using Deltares.DamEngine.Io.XmlInput; +using KellermanSoftware.CompareNetObjects; using NUnit.Framework; +using Location = Deltares.Dam.Data.Location; namespace Deltares.Dam.Tests.DamEngineIo { [TestFixture] public class FillXmlInputFromDamUiTests { + [Test] + public void CanWriteAndReadDamProjectDataToXml() + { + const string inputFilename = "InputFile.xml"; + DamProjectData expectedDamProjectData = CreateExampleDamProjectData(); + Input input = FillXmlInputFromDamUi.CreateInput(expectedDamProjectData); + DamXmlSerialization.SaveInputAsXml(inputFilename, input); + input = DamXmlSerialization.LoadInputFromXml(inputFilename); + DamProjectData actualDamProjectData = FillDamUiFromXmlInput.CreateDamProjectData(input); + CompareDamProjectData(actualDamProjectData, expectedDamProjectData); + } + + private DamProjectData CreateExampleDamProjectData() + { + const int locationCount = 3; + var damProjectData = new DamProjectData(); + damProjectData.DamProjectType = DamProjectType.Design; + damProjectData.WaterBoard = new WaterBoard(); + damProjectData.WaterBoard.Dikes = new List(); + damProjectData.WaterBoard.Dikes.Add(new Dike()); + for (int i = 0; i < locationCount; i++) + { + var location = new Location(); + location.PLLineCreationMethod = (PLLineCreationMethod)i; + location.IntrusionVerticalWaterPressure = (IntrusionVerticalWaterPressureType)i; + location.PolderLevel = 1.0 * i + 0.11; + location.DampingFactorPL4 = 1.0 * i + 0.12; + location.DampingFactorPL3 = 1.0 * i + 0.13; + location.PenetrationLength = 1.0 * i + 0.14; + location.PlLineOffsetBelowDikeCrestMiddle = 1.0 * i + 0.15; + location.UsePlLineOffsetFactorBelowShoulderCrest = true; + location.PlLineOffsetFactorBelowShoulderCrest = 1.0 * i + 0.16; + location.PlLineOffsetDryBelowDikeCrestMiddle = 1.0 * i + 0.17; + location.UsePlLineOffsetDryFactorBelowShoulderCrest = true; + location.PlLineOffsetDryFactorBelowShoulderCrest = 1.0 * i + 0.18; + location.SlopeDampingPiezometricHeightPolderSide = 1.0 * i + 0.19; + location.PlLineOffsetBelowDikeTopAtRiver = 1.0 * i + 0.20; + location.PlLineOffsetBelowDikeTopAtPolder = 1.0 * i + 0.21; + location.PlLineOffsetBelowShoulderBaseInside = 1.0 * i + 0.22; + location.PlLineOffsetBelowDikeToeAtPolder = 1.0 * i + 0.23; + location.HeadPL2 = 1.0 * i + 0.24; + location.HeadPl3 = 1.0 * i + 0.25; + location.HeadPl4 = 1.0 * i + 0.21; + damProjectData.WaterBoard.Dikes[0].Locations.Add(location); + } + return damProjectData; + } + + private void CompareDamProjectData(DamProjectData actual, DamProjectData expected) + { + var compare = new CompareLogic { Config = { MaxDifferences = 100 } }; + compare.Config.MembersToIgnore = new List + { + "SheetPilePoint", + "SheetPilePointX", + "SheetPilePointY", + "SheetPilePointZ", + "LocalXZSheetPilePoint", + "SoilbaseDB", + "SurfaceLine", + "LocalXZSurfaceLine", + "SoilLayer1D", + "SoildatabaseName", + "SoilList", + "MapForSoilGeometries2D" + }; + var result = compare.Compare(expected, actual); + Assert.AreEqual(0, result.Differences.Count, "Differences found read/write Input object"); + + } } + } + Index: dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillDamUiFromXmlInput.cs =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillDamUiFromXmlInput.cs (.../FillDamUiFromXmlInput.cs) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillDamUiFromXmlInput.cs (.../FillDamUiFromXmlInput.cs) (revision 458) @@ -1,12 +1,54 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using System.Collections.Generic; +using Deltares.DamEngine.Io.XmlInput; namespace Deltares.Dam.Data.DamEngineIo { + /// + /// Create DAM UI project from XML Input object + /// public class FillDamUiFromXmlInput { + /// + /// Creates the dam project data. + /// + /// The input. + /// + public static DamProjectData CreateDamProjectData(Input input) + { + var damProjectData = new DamProjectData(); + damProjectData.DamProjectType = ConversionHelper.ConvertToDamProjectType(input.DamProjectType); + + damProjectData.WaterBoard = new WaterBoard(); + damProjectData.WaterBoard.Dikes = new List(); + damProjectData.WaterBoard.Dikes.Add(new Dike()); + for (int i = 0; i < input.Locations.Length; i++) + { + var location = new Location(); + var inputLocation = input.Locations[i]; + var waternetOptions = inputLocation.WaternetOptions; + location.PLLineCreationMethod = ConversionHelper.ConvertToPhreaticLineCreationMethod(waternetOptions.PhreaticLineCreationMethod); + location.IntrusionVerticalWaterPressure = ConversionHelper.ConvertToIntrusionVerticalWaterPressure(waternetOptions.IntrusionVerticalWaterPressure); + location.PolderLevel = waternetOptions.PolderLevel; + location.DampingFactorPL4 = waternetOptions.DampingFactorPL3; + location.DampingFactorPL3 = waternetOptions.DampingFactorPL4; + location.PenetrationLength = waternetOptions.PenetrationLength; + location.PlLineOffsetBelowDikeCrestMiddle = (waternetOptions.Pl1BelowCrestMiddleSpecified ? (double?)waternetOptions.Pl1BelowCrestMiddle : null); + location.UsePlLineOffsetFactorBelowShoulderCrest = waternetOptions.Pl1FactorBelowShoulderCrestSpecified; + location.PlLineOffsetFactorBelowShoulderCrest = waternetOptions.Pl1FactorBelowShoulderCrest; + location.PlLineOffsetDryBelowDikeCrestMiddle = (waternetOptions.DryPl1BelowCrestMiddleSpecified ? (double?)waternetOptions.DryPl1BelowCrestMiddle : null); + location.UsePlLineOffsetDryFactorBelowShoulderCrest = waternetOptions.DryPl1FactorBelowShoulderCrestSpecified; + location.PlLineOffsetDryFactorBelowShoulderCrest = waternetOptions.DryPl1FactorBelowShoulderCrest; + location.HeadPL2 = (waternetOptions.HeadPl2Specified ? (double?)waternetOptions.HeadPl2 : null); + location.HeadPl3 = (waternetOptions.HeadPl3Specified ? (double?)waternetOptions.HeadPl3 : null); + location.HeadPl4 = (waternetOptions.HeadPl4Specified ? (double?)waternetOptions.HeadPl4 : null); + location.SlopeDampingPiezometricHeightPolderSide = waternetOptions.SlopeDampingFactor; + location.PlLineOffsetBelowDikeTopAtRiver = waternetOptions.Pl1BelowCrestRiverside; + location.PlLineOffsetBelowDikeTopAtPolder = waternetOptions.Pl1BelowCrestPolderside; + location.PlLineOffsetBelowShoulderBaseInside = waternetOptions.Pl1BelowShoulderCrestPolderside; + location.PlLineOffsetBelowDikeToeAtPolder = waternetOptions.Pl1BelowToeDikePolderside; + damProjectData.WaterBoard.Dikes[0].Locations.Add(location); + } + return damProjectData; + } } } Index: dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillXmlInputFromDamUi.cs =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillXmlInputFromDamUi.cs (.../FillXmlInputFromDamUi.cs) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillXmlInputFromDamUi.cs (.../FillXmlInputFromDamUi.cs) (revision 458) @@ -1,12 +1,57 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using Deltares.DamEngine.Io.XmlInput; namespace Deltares.Dam.Data.DamEngineIo { + /// + /// Create XML Input object from DAM UI project + /// public class FillXmlInputFromDamUi { + /// + /// Creates the input. + /// + /// The dam project data. + /// + public static Input CreateInput(DamProjectData damProjectData) + { + Input input = new Input(); + input.DamProjectType = ConversionHelper.ConvertToInputDamProjectType(damProjectData.DamProjectType); + int locationCount = damProjectData.WaterBoard.Dikes[0].Locations.Count; + input.Locations = new DamEngine.Io.XmlInput.Location[locationCount]; + for (int i = 0; i < locationCount; i++) + { + var location = damProjectData.WaterBoard.Dikes[0].Locations[i]; + input.Locations[i] = new DamEngine.Io.XmlInput.Location(); + var waternetOptions = new LocationWaternetOptions(); + + waternetOptions.PhreaticLineCreationMethod = ConversionHelper.ConvertToInputPhreaticLineCreationMethod(location.PLLineCreationMethod); + waternetOptions.IntrusionVerticalWaterPressure = ConversionHelper.ConvertToInputIntrusionVerticalWaterPressure(location.IntrusionVerticalWaterPressure ?? IntrusionVerticalWaterPressureType.Standard); + waternetOptions.PolderLevel = location.PolderLevel; + waternetOptions.DampingFactorPL3 = location.DampingFactorPL4; + waternetOptions.DampingFactorPL4 = location.DampingFactorPL3; + waternetOptions.PenetrationLength = location.PenetrationLength; + waternetOptions.Pl1BelowCrestMiddleSpecified = location.PlLineOffsetBelowDikeCrestMiddle.HasValue; + waternetOptions.Pl1BelowCrestMiddle = location.PlLineOffsetBelowDikeCrestMiddle ?? 0.0; + waternetOptions.Pl1FactorBelowShoulderCrestSpecified = location.UsePlLineOffsetFactorBelowShoulderCrest ?? false; + waternetOptions.Pl1FactorBelowShoulderCrest = location.PlLineOffsetFactorBelowShoulderCrest ?? 0.0; + waternetOptions.DryPl1BelowCrestMiddleSpecified = location.PlLineOffsetDryBelowDikeCrestMiddle.HasValue; + waternetOptions.DryPl1BelowCrestMiddle = location.PlLineOffsetDryBelowDikeCrestMiddle ?? 0.0; + waternetOptions.DryPl1FactorBelowShoulderCrestSpecified = location.UsePlLineOffsetDryFactorBelowShoulderCrest ?? false; + waternetOptions.DryPl1FactorBelowShoulderCrest = location.PlLineOffsetDryFactorBelowShoulderCrest ?? 0.0; + waternetOptions.HeadPl2Specified = location.HeadPL2.HasValue; + waternetOptions.HeadPl2 = location.HeadPL2 ?? 0.0; + waternetOptions.HeadPl3Specified = location.HeadPl3.HasValue; + waternetOptions.HeadPl3 = location.HeadPl3 ?? 0.0; + waternetOptions.HeadPl4Specified = location.HeadPl4.HasValue; + waternetOptions.HeadPl4 = location.HeadPl4 ?? 0.0; + waternetOptions.SlopeDampingFactor = location.SlopeDampingPiezometricHeightPolderSide; + waternetOptions.Pl1BelowCrestRiverside = location.PlLineOffsetBelowDikeTopAtRiver; + waternetOptions.Pl1BelowCrestPolderside = location.PlLineOffsetBelowDikeTopAtPolder; + waternetOptions.Pl1BelowShoulderCrestPolderside = location.PlLineOffsetBelowShoulderBaseInside; + waternetOptions.Pl1BelowToeDikePolderside = location.PlLineOffsetBelowDikeToeAtPolder; + input.Locations[i].WaternetOptions = waternetOptions; + } + return input; + } } } Index: dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillDamUiFromXmlOutput.cs =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillDamUiFromXmlOutput.cs (.../FillDamUiFromXmlOutput.cs) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillDamUiFromXmlOutput.cs (.../FillDamUiFromXmlOutput.cs) (revision 458) @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Deltares.Dam.Data.DamEngineIo +namespace Deltares.Dam.Data.DamEngineIo { public class FillDamUiFromXmlOutput { Index: dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillXmlOutputFromDamUi.cs =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillXmlOutputFromDamUi.cs (.../FillXmlOutputFromDamUi.cs) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Data/DamEngineIo/FillXmlOutputFromDamUi.cs (.../FillXmlOutputFromDamUi.cs) (revision 458) @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Deltares.Dam.Data.DamEngineIo +namespace Deltares.Dam.Data.DamEngineIo { public class FillXmlOutputFromDamUi { Index: dam clients/DamUI/trunk/src/Dam/Forms/DamPlugin.cs =================================================================== diff -u -r339 -r458 --- dam clients/DamUI/trunk/src/Dam/Forms/DamPlugin.cs (.../DamPlugin.cs) (revision 339) +++ dam clients/DamUI/trunk/src/Dam/Forms/DamPlugin.cs (.../DamPlugin.cs) (revision 458) @@ -660,13 +660,13 @@ LogManager.Clear(); try { - var damEnginInterface = new Interface(""); + var damEnginInterface = new EngineInterface(""); damEnginInterface.Validate(); damEnginInterface.Run(); } catch (Exception e) { - LogManager.Add(new LogMessage(LogMessageType.FatalError, typeof(Interface), string.Format("{0}", e.Message))); + LogManager.Add(new LogMessage(LogMessageType.FatalError, typeof(EngineInterface), string.Format("{0}", e.Message))); string openingMessage = LocalizationManager.GetTranslatedText(this, "CalculationFailed"); string paragraphSepatator = Environment.NewLine + Environment.NewLine; LocalizedMessageBox.ShowTranslatedText(openingMessage + paragraphSepatator + e.Message); Index: dam clients/DamUI/trunk/src/Dam/Data/Deltares.Dam.Data.csproj =================================================================== diff -u -r439 -r458 --- dam clients/DamUI/trunk/src/Dam/Data/Deltares.Dam.Data.csproj (.../Deltares.Dam.Data.csproj) (revision 439) +++ dam clients/DamUI/trunk/src/Dam/Data/Deltares.Dam.Data.csproj (.../Deltares.Dam.Data.csproj) (revision 458) @@ -185,6 +185,7 @@ +