// Copyright (C) Stichting Deltares 2016. 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.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Common.Base.Geometry; using Core.Common.Controls.Views; using Core.Common.Utils.Reflection; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.Properties; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; using CoreCommonControlsResources = Core.Common.Controls.Properties.Resources; namespace Ringtoets.Piping.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 PipingFailureMechanism pipingFailureMechanism; /// /// 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 PipingFailureMechanism PipingFailureMechanism { get { return pipingFailureMechanism; } set { pipingFailureMechanism = value; pipingFailureMechanismObserver.Observable = pipingFailureMechanism; 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 != null)) { components.Dispose(); } base.Dispose(disposing); } private void InitializeDataGridView() { dataGridViewControl.AddCheckBoxColumn( TypeUtils.GetMemberName(row => row.IsRelevant), Resources.PipingCalculationsView_InitializeDataGridView_In_final_rating ); dataGridViewControl.AddTextBoxColumn( TypeUtils.GetMemberName(row => row.Contribution), Resources.PipingCalculationsView_InitializeDataGridView_Contribution ); dataGridViewControl.AddTextBoxColumn( TypeUtils.GetMemberName(row => row.Name), Resources.PipingCalculation_Name_DisplayName ); dataGridViewControl.AddTextBoxColumn( TypeUtils.GetMemberName(row => row.FailureProbabilityPiping), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabiltyPiping ); dataGridViewControl.AddTextBoxColumn( TypeUtils.GetMemberName(row => row.FailureProbabilityUplift), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabiltyUplift ); dataGridViewControl.AddTextBoxColumn( TypeUtils.GetMemberName(row => row.FailureProbabilityHeave), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabiltyHeave ); dataGridViewControl.AddTextBoxColumn( TypeUtils.GetMemberName(row => row.FailureProbabilitySellmeijer), Resources.PipingScenarioView_PipingScenarioRow_FailureProbabiltySellmeijer ); } private void InitializeListBox() { listBox.DisplayMember = TypeUtils.GetMemberName(s => s.Name); listBox.SelectedValueChanged += ListBoxOnSelectedValueChanged; } private void UpdateDataGridViewDataSource() { var failureMechanismSection = listBox.SelectedItem as FailureMechanismSection; if (failureMechanismSection == null || calculationGroup == null) { dataGridViewControl.SetDataSource(null); return; } var lineSegments = Math2D.ConvertLinePointsToLineSegments(failureMechanismSection.Points); var pipingCalculations = calculationGroup .GetCalculations() .OfType() .Where(pc => pc.IsSurfaceLineIntersectionWithReferenceLineInSection(lineSegments)); var 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 (pipingFailureMechanism != null && pipingFailureMechanism.Sections.Any()) { listBox.Items.AddRange(pipingFailureMechanism.Sections.Cast().ToArray()); listBox.SelectedItem = pipingFailureMechanism.Sections.First(); } } # endregion } }