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