// Copyright (C) Stichting Deltares 2017. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets 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.Linq; using Core.Common.Base.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Hydraulics; namespace Ringtoets.Common.Util { /// /// Factory for creating instances. /// public static class AggregatedHydraulicBoundaryLocationFactory { /// /// Creates the aggregated hydraulic boundary locations based on the locations and calculations /// from an assessment section. /// /// The assessment section to get the locations and calculations from. /// An of . /// Thrown when is null. public static IEnumerable CreateAggregatedHydraulicBoundaryLocations(IAssessmentSection assessmentSection) { if (assessmentSection == null) { throw new ArgumentNullException(nameof(assessmentSection)); } Dictionary waterLevelLookupForFactorizedSignalingNorm = assessmentSection.WaterLevelCalculationsForFactorizedSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); Dictionary waterLevelLookupForSignalingNorm = assessmentSection.WaterLevelCalculationsForSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); Dictionary waterLevelLookupForLowerLimitNorm = assessmentSection.WaterLevelCalculationsForLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); Dictionary waterLevelLookupForFactorizedLowerLimitNorm = assessmentSection.WaterLevelCalculationsForFactorizedLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); Dictionary waveHeightLookupForFactorizedSignalingNorm = assessmentSection.WaveHeightCalculationsForFactorizedSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); Dictionary waveHeightLookupForSignalingNorm = assessmentSection.WaveHeightCalculationsForSignalingNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); Dictionary waveHeightLookupForLowerLimitNorm = assessmentSection.WaveHeightCalculationsForLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); Dictionary waveHeightLookupForFactorizedLowerLimitNorm = assessmentSection.WaveHeightCalculationsForFactorizedLowerLimitNorm.ToDictionary(c => c.HydraulicBoundaryLocation, c => c); return assessmentSection.HydraulicBoundaryDatabase.Locations .Select(location => new AggregatedHydraulicBoundaryLocation( location.Id, location.Name, location.Location, GetCalculationResult(waterLevelLookupForFactorizedSignalingNorm[location].Output), GetCalculationResult(waterLevelLookupForSignalingNorm[location].Output), GetCalculationResult(waterLevelLookupForLowerLimitNorm[location].Output), GetCalculationResult(waterLevelLookupForFactorizedLowerLimitNorm[location].Output), GetCalculationResult(waveHeightLookupForFactorizedSignalingNorm[location].Output), GetCalculationResult(waveHeightLookupForSignalingNorm[location].Output), GetCalculationResult(waveHeightLookupForLowerLimitNorm[location].Output), GetCalculationResult(waveHeightLookupForFactorizedLowerLimitNorm[location].Output))).ToArray(); } private static RoundedDouble GetCalculationResult(HydraulicBoundaryLocationOutput output) { return output?.Result ?? RoundedDouble.NaN; } } }