using System; using System.ComponentModel; using System.Xml.Serialization; using Deltares.Geometry; using Deltares.Geotechnics; using Deltares.Geotechnics.Soils; using Deltares.Standard; using Deltares.Standard.EventPublisher; namespace Deltares.Stability { public enum ActiveSideType { Left, Right } public class SlipPlaneUpliftVan : GeometryObject, IVisibleEnabled, ITangentLinesBoundaries, ISlipCircleGridOwner, IDisposable { private ActiveSideType activeSide = ActiveSideType.Left; private SlipCircleGrid leftGrid = new SlipCircleGrid(); private ModelOptions modelOption = ModelOptions.Bishop; private SlipCircleGrid rightGrid = new SlipCircleGrid(); private StabilityModel stabilityModel; private SlipCircleTangentLine tangentLine = new SlipCircleTangentLine(); public SlipPlaneUpliftVan() { DataEventPublisher.InvokeWithoutPublishingEvents(() => { leftGrid.Name = "Calculation grid - Left"; rightGrid.Name = "Calculation grid - Right"; tangentLine.Name = "Calculation Tangent Lines"; tangentLine.TangentLinesBoundaries = this; leftGrid.Owner = this; rightGrid.Owner = this; }); } [Browsable(false)] [XmlElement("LeftGrid")] public SlipCircleGrid SlipPlaneLeftGrid { get { return leftGrid; } set { DataEventPublisher.BeforeChange(this, "SlipPlaneLeftGrid"); leftGrid = value; leftGrid.Owner = this; DataEventPublisher.AfterChange(this, "SlipPlaneLeftGrid"); } } [Browsable(false)] [XmlElement("RightGrid")] public SlipCircleGrid SlipPlaneRightGrid { get { return rightGrid; } set { DataEventPublisher.BeforeChange(this, "SlipPlaneRightGrid"); rightGrid = value; rightGrid.Owner = this; DataEventPublisher.AfterChange(this, "SlipPlaneRightGrid"); } } [Browsable(false)] [XmlElement("TangentLines")] public SlipCircleTangentLine SlipPlaneTangentLine { get { return tangentLine; } set { DataEventPublisher.BeforeChange(this, "SlipPlaneTangentLine"); if (null != tangentLine) { tangentLine.Dispose(); // Dispose the old object } tangentLine = value; tangentLine.TangentLinesBoundaries = this; tangentLine.StabilityModel = StabilityModel; DataEventPublisher.AfterChange(this, "SlipPlaneTangentLine"); } } [XmlIgnore] public ModelOptions ModelOption { get { return modelOption; } set { DataEventPublisher.BeforeChange(this, "ModelOption"); modelOption = value; DataEventPublisher.AfterChange(this, "ModelOption"); } } public ActiveSideType ActiveSide { get { return activeSide; } set { DataEventPublisher.BeforeChange(this, "ActiveSide"); activeSide = value; DataEventPublisher.AfterChange(this, "ActiveSide"); } } #region IVisibleEnabled Members public bool IsEnabled(string property) { return true; } public bool IsVisible(string property) { return ModelOption == ModelOptions.UpliftSpencer || ModelOption == ModelOptions.UpliftVan; } #endregion [Browsable(false)] [XmlIgnore] public StabilityModel StabilityModel // Aggregation relationship { get { return stabilityModel; } set { stabilityModel = value; if (tangentLine != null) { tangentLine.StabilityModel = value; } } } [Browsable(false)] public SlipCircleTangentLine SlipCircleTangentLine { get { return SlipPlaneTangentLine; } } [Browsable(false)] public double XLeft { get { return Math.Max(StabilityModel.GeometryData.Left, Math.Min(SlipPlaneLeftGrid.GridXLeft, SlipPlaneRightGrid.GridXLeft) - SlipCircleTangentLine.TangentLineOffset); } } [Browsable(false)] public double XRight { get { return Math.Min(StabilityModel.GeometryData.Right, Math.Max(SlipPlaneLeftGrid.GridXLeft, SlipPlaneRightGrid.GridXLeft) + SlipCircleTangentLine.TangentLineOffset); } } public virtual void Dispose() { tangentLine.Dispose(); } } }