// 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;
}
}
}