// Copyright (C) Stichting Deltares 2017. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets 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.Generic; using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Common.Base.Geometry; using Core.Common.Controls.Views; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.MacroStabilityInwards.Data; using Ringtoets.MacroStabilityInwards.Forms.Properties; namespace Ringtoets.MacroStabilityInwards.Forms.Views { /// /// This class is a view for configuring piping calculations. /// public partial class PipingScenariosView : UserControl, IView { private readonly RecursiveObserver pipingInputObserver; private readonly RecursiveObserver pipingCalculationGroupObserver; private readonly RecursiveObserver pipingCalculationObserver; private readonly Observer pipingFailureMechanismObserver; private CalculationGroup calculationGroup; private MacroStabilityInwardsFailureMechanism macroStabilityInwardsFailureMechanism; /// /// Creates a new instance of the class. /// public PipingScenariosView() { InitializeComponent(); InitializeDataGridView(); InitializeListBox(); pipingFailureMechanismObserver = new Observer(OnPipingFailureMechanismUpdate); // The concat is needed to observe the input of calculations in child groups. pipingInputObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children.Concat(pcg.Children.OfType().Select(pc => pc.InputParameters))); pipingCalculationGroupObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children); pipingCalculationObserver = new RecursiveObserver(dataGridViewControl.RefreshDataGridView, pcg => pcg.Children); } /// /// Gets or sets the piping failure mechanism. /// public MacroStabilityInwardsFailureMechanism MacroStabilityInwardsFailureMechanism { get { return macroStabilityInwardsFailureMechanism; } set { macroStabilityInwardsFailureMechanism = value; pipingFailureMechanismObserver.Observable = macroStabilityInwardsFailureMechanism; UpdateSectionsListBox(); } } public object Data { get { return calculationGroup; } set { calculationGroup = value as CalculationGroup; if (calculationGroup != null) { UpdateDataGridViewDataSource(); pipingInputObserver.Observable = calculationGroup; pipingCalculationObserver.Observable = calculationGroup; pipingCalculationGroupObserver.Observable = calculationGroup; } else { dataGridViewControl.SetDataSource(null); pipingInputObserver.Observable = null; pipingCalculationObserver.Observable = null; pipingCalculationGroupObserver.Observable = null; } } } protected override void Dispose(bool disposing) { pipingFailureMechanismObserver.Dispose(); pipingInputObserver.Dispose(); pipingCalculationObserver.Dispose(); pipingCalculationGroupObserver.Dispose(); if (disposing) { components?.Dispose(); } base.Dispose(disposing); } private void InitializeDataGridView() { dataGridViewControl.AddCheckBoxColumn( nameof(PipingScenarioRow.IsRelevant), Resources.PipingCalculationsView_InitializeDataGridView_In_final_rating ); dataGridViewControl.AddTextBoxColumn( nameof(PipingScenarioRow.Contribution), Resources.PipingCalculationsView_InitializeDataGridView_Contribution ); dataGridViewControl.AddTextBoxColumn( nameof(PipingScenarioRow.Name), Resources.PipingCalculation_Name_DisplayName ); dataGridViewControl.AddTextBoxColumn( nameof(PipingScenarioRow.FailureProbabilityPiping), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabilityPiping ); dataGridViewControl.AddTextBoxColumn( nameof(PipingScenarioRow.FailureProbabilityUplift), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabilityUplift ); dataGridViewControl.AddTextBoxColumn( nameof(PipingScenarioRow.FailureProbabilityHeave), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabilityHeave ); dataGridViewControl.AddTextBoxColumn( nameof(PipingScenarioRow.FailureProbabilitySellmeijer), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabilitySellmeijer ); } private void InitializeListBox() { listBox.DisplayMember = nameof(FailureMechanismSection.Name); listBox.SelectedValueChanged += ListBoxOnSelectedValueChanged; } private void UpdateDataGridViewDataSource() { var failureMechanismSection = listBox.SelectedItem as FailureMechanismSection; if (failureMechanismSection == null || calculationGroup == null) { dataGridViewControl.SetDataSource(null); return; } IEnumerable lineSegments = Math2D.ConvertLinePointsToLineSegments(failureMechanismSection.Points); IEnumerable pipingCalculations = calculationGroup .GetCalculations() .OfType() .Where(pc => pc.IsSurfaceLineIntersectionWithReferenceLineInSection(lineSegments)); List dataSource = pipingCalculations.Select(pc => new PipingScenarioRow(pc)).ToList(); dataGridViewControl.SetDataSource(dataSource); } #region Event handling private void ListBoxOnSelectedValueChanged(object sender, EventArgs e) { UpdateDataGridViewDataSource(); } private void OnPipingFailureMechanismUpdate() { UpdateSectionsListBox(); } private void UpdateSectionsListBox() { listBox.Items.Clear(); if (macroStabilityInwardsFailureMechanism != null && macroStabilityInwardsFailureMechanism.Sections.Any()) { listBox.Items.AddRange(macroStabilityInwardsFailureMechanism.Sections.Cast().ToArray()); listBox.SelectedItem = macroStabilityInwardsFailureMechanism.Sections.First(); } } #endregion } }