// 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.ComponentModel; using System.Linq; using Core.Common.Base.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Data.Hydraulics; namespace Ringtoets.GrassCoverErosionOutwards.Data { /// /// Defines extension methods dealing with instances. /// public static class GrassCoverErosionOutwardsFailureMechanismExtensions { /// /// Gets the assessment level for a based on . /// /// The assessment section to get the assessment level from. /// The failure mechanism to get the assessment level from. /// The hydraulic boundary location to get the assessment level for. /// The category type to use while obtaining the assessment level. /// The assessment level or when: /// /// is null; /// is not part of ; /// is not part of ; /// contains no corresponding calculation output. /// /// /// Thrown when /// or is null. /// Thrown when /// is an invalid . /// Thrown when /// is a valid but unsupported . public static RoundedDouble GetAssessmentLevel(this GrassCoverErosionOutwardsFailureMechanism failureMechanism, IAssessmentSection assessmentSection, HydraulicBoundaryLocation hydraulicBoundaryLocation, FailureMechanismCategoryType categoryType) { if (failureMechanism == null) { throw new ArgumentNullException(nameof(failureMechanism)); } if (assessmentSection == null) { throw new ArgumentNullException(nameof(assessmentSection)); } if (!Enum.IsDefined(typeof(FailureMechanismCategoryType), categoryType)) { throw new InvalidEnumArgumentException(nameof(categoryType), (int) categoryType, typeof(FailureMechanismCategoryType)); } IEnumerable calculations; switch (categoryType) { case FailureMechanismCategoryType.MechanismSpecificFactorizedSignalingNorm: calculations = failureMechanism.WaterLevelCalculationsForMechanismSpecificFactorizedSignalingNorm; break; case FailureMechanismCategoryType.MechanismSpecificSignalingNorm: calculations = failureMechanism.WaterLevelCalculationsForMechanismSpecificSignalingNorm; break; case FailureMechanismCategoryType.MechanismSpecificLowerLimitNorm: calculations = failureMechanism.WaterLevelCalculationsForMechanismSpecificLowerLimitNorm; break; case FailureMechanismCategoryType.LowerLimitNorm: calculations = assessmentSection.WaterLevelCalculationsForLowerLimitNorm; break; case FailureMechanismCategoryType.FactorizedLowerLimitNorm: calculations = assessmentSection.WaterLevelCalculationsForFactorizedLowerLimitNorm; break; default: throw new NotSupportedException(); } return GetAssessmentLevelFromCalculations(hydraulicBoundaryLocation, calculations); } private static RoundedDouble GetAssessmentLevelFromCalculations(HydraulicBoundaryLocation hydraulicBoundaryLocation, IEnumerable calculations) { return calculations.FirstOrDefault(c => ReferenceEquals(c.HydraulicBoundaryLocation, hydraulicBoundaryLocation))?.Output?.Result ?? RoundedDouble.NaN; } } }