// 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.Collections; using Deltares.Dam.Data.Properties; using Deltares.Standard; using Deltares.Standard.EventPublisher; using Deltares.Standard.Validation; namespace Deltares.Dam.Data; /// /// /// public class DamStabilityParameters : IDomain, IVisibleEnabled, ICloneable { private bool isUpliftVanRunOnlyWhenUpliftOccurs = true; public DamStabilityParameters() { SearchMethod = StabilitySearchMethod.BeeSwarm; IsUpliftVanRunOnlyWhenUpliftOccurs = true; SlipCircleDefinition = new SlipCircleDefinition(); ReadUserSettingsSlipCircleDefinition(); } /// /// The search method to use for stability calculations. /// [Validate] public StabilitySearchMethod SearchMethod { get; set; } /// /// When true, the uplift van calculation is only run when an uplift occurs. /// [Validate] public bool IsUpliftVanRunOnlyWhenUpliftOccurs { get { return isUpliftVanRunOnlyWhenUpliftOccurs; } set { isUpliftVanRunOnlyWhenUpliftOccurs = value; } } /// /// The slip circle definition. /// [Validate] public SlipCircleDefinition SlipCircleDefinition { get; set; } /// /// Assigns the values from the given stability calculation. /// /// public void Assign(DamStabilityParameters damFailureMechanismCalculation) { // failureMechanismSystemType = damFailureMechanismCalculation.FailureMechanismSystemType; // calculationModel = damFailureMechanismCalculation.CalculationModel; // pipingModelType = damFailureMechanismCalculation.PipingModelType; // stabilityModelType = damFailureMechanismCalculation.StabilityModelType; SearchMethod = damFailureMechanismCalculation.SearchMethod; IsUpliftVanRunOnlyWhenUpliftOccurs = damFailureMechanismCalculation.IsUpliftVanRunOnlyWhenUpliftOccurs; if (SlipCircleDefinition != null) { SlipCircleDefinition.Assign(damFailureMechanismCalculation.SlipCircleDefinition); } else { SlipCircleDefinition = null; } //assign interface } public DamStabilityParameters Clone() { var stabilityParameters = new DamStabilityParameters(); if (SlipCircleDefinition != null) { SlipCircleDefinition = SlipCircleDefinition.Clone(); } stabilityParameters.Assign(this); return stabilityParameters; } /// /// Reads the user settings. /// private void ReadUserSettingsSlipCircleDefinition() { if (SlipCircleDefinition == null) { SlipCircleDefinition = new SlipCircleDefinition(); } SlipCircleDefinition.UpliftVanTangentLinesDefinition = Settings.Default.SlipCircleUpliftVanTangentLinesDefinition; SlipCircleDefinition.UpliftVanTangentLinesDistance = Settings.Default.SlipCircleUpliftVanTangentLinesDistance; SlipCircleDefinition.BishopSearchAreaDetermination = Settings.Default.SlipCircleBishopSearchAreaDetermination; SlipCircleDefinition.BishopTangentLinesDistance = Settings.Default.SlipCircleBishopTangentLinesDistance; SlipCircleDefinition.UpliftVanGridSizeDetermination = Settings.Default.SlipCircleUpliftVanGridSizeDetermination; SlipCircleDefinition.UpliftVanLeftGridVerticalPointCount = Settings.Default.SlipCircleUpliftVanLeftGridVerticalPointCount; SlipCircleDefinition.UpliftVanLeftGridVerticalPointDistance = Settings.Default.SlipCircleUpliftVanLeftGridVerticalPointDistance; SlipCircleDefinition.UpliftVanLeftGridHorizontalPointCount = Settings.Default.SlipCircleUpliftVanLeftGridHorizontalPointCount; SlipCircleDefinition.UpliftVanLeftGridHorizontalPointDistance = Settings.Default.SlipCircleUpliftVanLeftGridHorizontalPointDistance; SlipCircleDefinition.UpliftVanRightGridVerticalPointCount = Settings.Default.SlipCircleUpliftVanRightGridVerticalPointCount; SlipCircleDefinition.UpliftVanRightGridVerticalPointDistance = Settings.Default.SlipCircleUpliftVanRightGridVerticalPointDistance; SlipCircleDefinition.UpliftVanRightGridHorizontalPointCount = Settings.Default.SlipCircleUpliftVanRightGridHorizontalPointCount; SlipCircleDefinition.UpliftVanRightGridHorizontalPointDistance = Settings.Default.SlipCircleUpliftVanRightGridHorizontalPointDistance; SlipCircleDefinition.BishopGridVerticalPointCount = Settings.Default.SlipCircleBishopGridVerticalPointCount; SlipCircleDefinition.BishopGridVerticalPointDistance = Settings.Default.SlipCircleBishopGridVerticalPointDistance; SlipCircleDefinition.BishopGridHorizontalPointCount = Settings.Default.SlipCircleBishopGridHorizontalPointCount; SlipCircleDefinition.BishopGridHorizontalPointDistance = Settings.Default.SlipCircleBishopGridHorizontalPointDistance; } public ICollection GetDomain(string property) { switch (property) { case "SearchMethod": if (SlipCircleDefinition.Specification.FailureMechanismSystemType == FailureMechanismSystemType.StabilityInside && (SlipCircleDefinition.Specification.StabilityModelType == StabilityModelType.UpliftVan || SlipCircleDefinition.Specification.StabilityModelType == StabilityModelType.BishopUpliftVan)) { return new[] { StabilitySearchMethod.BeeSwarm, StabilitySearchMethod.Grid }; } // Make sure that grid is reset and updated too when needed. if (SearchMethod != StabilitySearchMethod.Grid) { DataEventPublisher.BeforeChange(this, "SearchMethod"); SearchMethod = StabilitySearchMethod.Grid; DataEventPublisher.AfterChange(this, "SearchMethod"); } return new[] { StabilitySearchMethod.Grid }; default: return null; } } public bool IsEnabled(string property) { switch (property) { case "SearchMethod": case "IsUpliftVanRunOnlyWhenUpliftOccurs": return Location.DamProjectType == DamProjectType.Design; default: return true; } } public bool IsVisible(string property) { switch (property) { case "SearchMethod": case "IsUpliftVanRunOnlyWhenUpliftOccurs": return (SlipCircleDefinition.Specification.FailureMechanismSystemType == FailureMechanismSystemType.StabilityInside || SlipCircleDefinition.Specification.FailureMechanismSystemType == FailureMechanismSystemType.StabilityOutside) && (SlipCircleDefinition.Specification.StabilityModelType == StabilityModelType.BishopUpliftVan || SlipCircleDefinition.Specification.StabilityModelType == StabilityModelType.UpliftVan); default: return true; } } }