// 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; using System.ComponentModel; using System.Xml.Serialization; using Deltares.Dam.Data.Properties; using Deltares.Dam.Data.UISupport; using Deltares.Standard; using Deltares.Standard.Attributes; using Deltares.Standard.EventPublisher; using Deltares.Standard.Validation; namespace Deltares.Dam.Data; /// /// /// public class DamFailureMechanismeCalculationSpecification : IDomain, IVisibleEnabled { private FailureMechanismSystemType failureMechanismSystemType; private PipingModelType pipingModelType = PipingModelType.Wti2017; private Enum calculationModel; private Boolean firstTime = true; public DamFailureMechanismeCalculationSpecification() { //Todo interface failureMechanismSystemType = FailureMechanismSystemType.StabilityInside; FailureMechanismeParamatersMStab = new FailureMechanismeParamatersMStab(); CalculationModel = FailureMechanismeParamatersMStab.MStabParameters.Model; FailureMechanismeParamatersMStab.MStabParameters.GridPosition = StabilityGridPosition.Right; ReadUserSettingsSlipCircleDefinition(); } [Browsable(false)] [Validate] public FailureMechanismeParamatersMStab FailureMechanismeParamatersMStab { get; set; } [Label("Failure mechanism")] [PropertyOrder(1, 0)] public FailureMechanismSystemType FailureMechanismSystemType { get { return failureMechanismSystemType; } set { // Make sure the set is done for the very first time too even when the value has not changed (MWDAM-1199). if (failureMechanismSystemType != value || firstTime) { firstTime = false; DataEventPublisher.BeforeChange(this, "FailureMechanismSystemType"); failureMechanismSystemType = value; // To solve MWDAM-592, remember the current pipingmodeltype as this gets reset by setting the // calculationmodel. Only switch it back when needed. PipingModelType oldPipingModelType = pipingModelType; foreach (Enum possibleModel in GetDomain("CalculationModel")) { CalculationModel = possibleModel; break; } switch (failureMechanismSystemType) { case FailureMechanismSystemType.StabilityInside: FailureMechanismeParamatersMStab.MStabParameters.GridPosition = StabilityGridPosition.Right; break; case FailureMechanismSystemType.StabilityOutside: FailureMechanismeParamatersMStab.MStabParameters.GridPosition = StabilityGridPosition.Left; break; case FailureMechanismSystemType.Piping: PipingModelType = oldPipingModelType; break; } DataEventPublisher.AfterChange(this, "FailureMechanismSystemType"); } } } [Browsable(false)] public PipingModelType PipingModelType { get { return pipingModelType; } set { pipingModelType = value; if (failureMechanismSystemType == FailureMechanismSystemType.Piping) { CalculationModel = pipingModelType; } } } [Browsable(false)] public static DamProjectType DamProjectType { get; set; } /// /// The calculationmodel is only needed to support the selection of the modeltype in the UI. The dropdownlist /// in the UI depends on this. This set can be filled with any proper types (for piping, stabilty etc) for any /// mechanism instead of the fixed types per mechanism. /// [XmlIgnore] [Label("Model")] [PropertyOrder(1, 1)] public Enum CalculationModel { get { return calculationModel; } set { DataEventPublisher.BeforeChange(this, "CalculationModel"); calculationModel = value; if (value is PipingModelType) { pipingModelType = (PipingModelType) value; } else { FailureMechanismeParamatersMStab.MStabParameters.Model = (StabilityModelType) value; if (FailureMechanismeParamatersMStab.MStabParameters.Model != StabilityModelType.Bishop) { FailureMechanismeParamatersMStab.MStabParameters.SearchMethod = StabilitySearchMethod.BeeSwarm; } } DataEventPublisher.AfterChange(this, "CalculationModel"); } } [Browsable(false)] public StabilityModelType StabilityModelType { get { return FailureMechanismeParamatersMStab.MStabParameters.Model; } set { FailureMechanismeParamatersMStab.MStabParameters.Model = value; if (failureMechanismSystemType != FailureMechanismSystemType.Piping) { CalculationModel = value; } } } public void Assign(DamFailureMechanismeCalculationSpecification damFailureMechanismeCalculation) { failureMechanismSystemType = damFailureMechanismeCalculation.FailureMechanismSystemType; calculationModel = damFailureMechanismeCalculation.CalculationModel; pipingModelType = damFailureMechanismeCalculation.pipingModelType; FailureMechanismeParamatersMStab.Assign(damFailureMechanismeCalculation.FailureMechanismeParamatersMStab); StabilityModelType = damFailureMechanismeCalculation.StabilityModelType; //assign interface } public DamFailureMechanismeCalculationSpecification Clone() { var damFailureMechanismeCalculation = new DamFailureMechanismeCalculationSpecification(); damFailureMechanismeCalculation.Assign(this); return damFailureMechanismeCalculation; } /// /// Determines whether slip circle definition is undefined. /// /// /// true if [is slip circle definition undefined]; otherwise, false. /// public bool IsSlipCircleDefinitionUndefined() { bool isSlipCircleDefinitionUndefined = (FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition == null); if (!isSlipCircleDefinitionUndefined) { isSlipCircleDefinitionUndefined = (FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanLeftGridHorizontalPointCount == 0); } return isSlipCircleDefinitionUndefined; } /// /// Reads the user settings. /// public void ReadUserSettingsSlipCircleDefinition() { if (FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition == null) { FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition = new SlipCircleDefinition(); } FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanTangentLinesDefinition = Settings.Default.SlipCircleUpliftVanTangentLinesDefinition; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanTangentLinesDistance = Settings.Default.SlipCircleUpliftVanTangentLinesDistance; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.BishopSearchAreaDetermination = Settings.Default.SlipCircleBishopSearchAreaDetermination; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.BishopTangentLinesDistance = Settings.Default.SlipCircleBishopTangentLinesDistance; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanGridSizeDetermination = Settings.Default.SlipCircleUpliftVanGridSizeDetermination; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanLeftGridVerticalPointCount = Settings.Default.SlipCircleUpliftVanLeftGridVerticalPointCount; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanLeftGridVerticalPointDistance = Settings.Default.SlipCircleUpliftVanLeftGridVerticalPointDistance; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanLeftGridHorizontalPointCount = Settings.Default.SlipCircleUpliftVanLeftGridHorizontalPointCount; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanLeftGridHorizontalPointDistance = Settings.Default.SlipCircleUpliftVanLeftGridHorizontalPointDistance; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanRightGridVerticalPointCount = Settings.Default.SlipCircleUpliftVanRightGridVerticalPointCount; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanRightGridVerticalPointDistance = Settings.Default.SlipCircleUpliftVanRightGridVerticalPointDistance; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanRightGridHorizontalPointCount = Settings.Default.SlipCircleUpliftVanRightGridHorizontalPointCount; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.UpliftVanRightGridHorizontalPointDistance = Settings.Default.SlipCircleUpliftVanRightGridHorizontalPointDistance; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.BishopGridVerticalPointCount = Settings.Default.SlipCircleBishopGridVerticalPointCount; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.BishopGridVerticalPointDistance = Settings.Default.SlipCircleBishopGridVerticalPointDistance; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.BishopGridHorizontalPointCount = Settings.Default.SlipCircleBishopGridHorizontalPointCount; FailureMechanismeParamatersMStab.MStabParameters.SlipCircleDefinition.BishopGridHorizontalPointDistance = Settings.Default.SlipCircleBishopGridHorizontalPointDistance; } public override string ToString() { var description = ""; description += $"{FailureMechanismSystemType}"; if ((FailureMechanismSystemType == FailureMechanismSystemType.StabilityInside) || (FailureMechanismSystemType == FailureMechanismSystemType.StabilityOutside)) { //interface? description += $" ({FailureMechanismeParamatersMStab.MStabParameters.Model})"; } return description; } public ICollection GetDomain(string property) { switch (property) { case "CalculationModel": return ConfigurationManager.Instance.GetAvailableMechanismModels(DamProjectType, failureMechanismSystemType); case "PipingModelType": return ConfigurationManager.Instance.GetAvailableMechanismModels(DamProjectType, FailureMechanismSystemType.Piping); case "FailureMechanismSystemType": return ConfigurationManager.Instance.GetAvailableFailureMechanisms(DamProjectType); case "StabilityKernelType": return ConfigurationManager.Instance.GetAvailableFailureMechanisms(DamProjectType); default: return null; } } public bool IsEnabled(string property) { if (Equals(nameof(CalculationModel), property) && FailureMechanismSystemType == FailureMechanismSystemType.StabilityOutside) { return false; // Disable model selection when stability outside is active, as only Bishop is currently supported. } return true; } public bool IsVisible(string property) { if (Equals(property, nameof(FailureMechanismeParamatersMStab))) { switch (FailureMechanismSystemType) { case FailureMechanismSystemType.StabilityInside: return true; case FailureMechanismSystemType.StabilityOutside: return false; case FailureMechanismSystemType.Piping: return false; default: return true; } } return true; } }