// 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.Collections; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Linq; using System.Windows.Forms; using Core.Common.Base.Data; using Core.Common.Controls.TreeView; using Core.Common.Gui; using Core.Common.Gui.ContextMenu; using Core.Common.Gui.Forms; using Core.Common.Gui.Forms.ProgressDialog; using Core.Common.Gui.Plugin; using Core.Common.IO.Exceptions; using log4net; using Ringtoets.Common.Data; using Ringtoets.Common.Data.AssessmentSection; using Ringtoets.Common.Data.Calculation; using Ringtoets.Common.Data.Contribution; using Ringtoets.Common.Data.FailureMechanism; using Ringtoets.Common.Forms.PresentationObjects; using Ringtoets.Common.Forms.TreeNodeInfos; using Ringtoets.Common.Forms.Views; using Ringtoets.GrassCoverErosionInwards.Data; using Ringtoets.GrassCoverErosionInwards.Forms.PresentationObjects; using Ringtoets.HeightStructures.Data; using Ringtoets.HeightStructures.Forms.PresentationObjects; using Ringtoets.HydraRing.Calculation.Activities; using Ringtoets.HydraRing.Calculation.Data; using Ringtoets.HydraRing.Calculation.Data.Input.Hydraulics; using Ringtoets.HydraRing.Calculation.Data.Output; using Ringtoets.HydraRing.Data; using Ringtoets.HydraRing.IO; using Ringtoets.Integration.Forms.PresentationObjects; using Ringtoets.Integration.Forms.PropertyClasses; using Ringtoets.Integration.Forms.Views; using Ringtoets.Integration.Plugin.FileImporters; using Ringtoets.Integration.Plugin.Properties; using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.PresentationObjects; using RingtoetsDataResources = Ringtoets.Integration.Data.Properties.Resources; using RingtoetsFormsResources = Ringtoets.Integration.Forms.Properties.Resources; using RingtoetsCommonDataResources = Ringtoets.Common.Data.Properties.Resources; using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; using UtilsResources = Core.Common.Utils.Properties.Resources; using BaseResources = Core.Common.Base.Properties.Resources; namespace Ringtoets.Integration.Plugin { /// /// The GUI plugin for the Ringtoets application. /// public class RingtoetsGuiPlugin : GuiPlugin { private static readonly ILog log = LogManager.GetLogger(typeof(GuiPlugin)); public override IRibbonCommandHandler RibbonCommandHandler { get { return new RingtoetsRibbon(); } } public override IGui Gui { get { return base.Gui; } set { RemoveOnOpenProjectListener(base.Gui); base.Gui = value; AddOnOpenProjectListener(value); } } /// /// Returns all instances provided for data of . /// public override IEnumerable GetPropertyInfos() { yield return new PropertyInfo(); yield return new PropertyInfo(); yield return new PropertyInfo, StandAloneFailureMechanismContextProperties>(); yield return new PropertyInfo, CalculationGroupContextProperties>(); yield return new PropertyInfo, CalculationContextProperties>(); } /// /// Returns all instances provided for data of . /// public override IEnumerable GetViewInfos() { yield return new ViewInfo { GetViewName = (v, o) => RingtoetsDataResources.FailureMechanismContribution_DisplayName, GetViewData = context => context.WrappedData, Image = RingtoetsCommonFormsResources.FailureMechanismContributionIcon, CloseForData = CloseFailureMechanismContributionViewForData, AfterCreate = (view, context) => { view.AssessmentSection = context.Parent; view.ViewCommands = Gui.ViewCommands; } }; yield return new ViewInfo { GetViewName = (v, o) => RingtoetsFormsResources.AssessmentSectionMap_DisplayName, Image = RingtoetsFormsResources.Map }; yield return new ViewInfo, IEnumerable, SimpleFailureMechanismResultView> { GetViewName = (v, o) => RingtoetsCommonDataResources.FailureMechanism_AssessmentResult_DisplayName, Image = RingtoetsCommonFormsResources.FailureMechanismSectionResultIcon, CloseForData = CloseSimpleFailureMechanismResultViewForData, GetViewData = context => context.SectionResults, AfterCreate = (view, context) => view.FailureMechanism = context.FailureMechanism }; yield return new ViewInfo, IEnumerable, CustomFailureMechanismResultView> { GetViewName = (v, o) => RingtoetsCommonDataResources.FailureMechanism_AssessmentResult_DisplayName, Image = RingtoetsCommonFormsResources.FailureMechanismSectionResultIcon, CloseForData = CloseCustomFailureMechanismResultViewForData, GetViewData = context => context.SectionResults, AfterCreate = (view, context) => view.FailureMechanism = context.FailureMechanism }; yield return new ViewInfo, ICommentable, CommentView> { GetViewName = (v, o) => Resources.Comment_DisplayName, GetViewData = context => context.CommentContainer, Image = RingtoetsCommonFormsResources.EditDocumentIcon, CloseForData = CloseCommentViewForData }; } /// /// Gets the child data instances that have definitions of some parent data object. /// /// The parent data object. /// Sequence of child data. public override IEnumerable GetChildDataWithViewDefinitions(object dataObject) { var assessmentSection = dataObject as IAssessmentSection; if (assessmentSection != null) { yield return assessmentSection.FailureMechanismContribution; } } /// /// Returns all instances provided for data of . /// public override IEnumerable GetTreeNodeInfos() { yield return new TreeNodeInfo { Text = assessmentSection => assessmentSection.Name, Image = assessmentSection => RingtoetsFormsResources.AssessmentSectionFolderIcon, EnsureVisibleOnCreate = (assessmentSection, parent) => true, ChildNodeObjects = AssessmentSectionChildNodeObjects, ContextMenuStrip = AssessmentSectionContextMenuStrip, CanRename = (assessmentSection, parentData) => true, OnNodeRenamed = AssessmentSectionOnNodeRenamed, CanRemove = (assessmentSection, parentNodeData) => true, OnNodeRemoved = AssessmentSectionOnNodeRemoved }; yield return new TreeNodeInfo { Text = context => RingtoetsCommonDataResources.ReferenceLine_DisplayName, Image = context => RingtoetsCommonFormsResources.ReferenceLineIcon, ForeColor = context => context.WrappedData == null ? Color.FromKnownColor(KnownColor.GrayText) : Color.FromKnownColor(KnownColor.ControlText), ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl).AddImportItem().Build() }; yield return RingtoetsTreeNodeInfoFactory.CreateFailureMechanismContextTreeNodeInfo>( StandAloneFailureMechanismEnabledChildNodeObjects, StandAloneFailureMechanismDisabledChildNodeObjects, StandAloneFailureMechanismEnabledContextMenuStrip, StandAloneFailureMechanismDisabledContextMenuStrip); yield return new TreeNodeInfo { Text = context => RingtoetsCommonFormsResources.FailureMechanism_Sections_DisplayName, Image = context => RingtoetsCommonFormsResources.Sections, ForeColor = context => context.WrappedData.Any() ? Color.FromKnownColor(KnownColor.ControlText) : Color.FromKnownColor(KnownColor.GrayText), ContextMenuStrip = FailureMechanismSectionsContextMenuStrip }; yield return new TreeNodeInfo { Text = categoryTreeFolder => categoryTreeFolder.Name, Image = categoryTreeFolder => GetFolderIcon(categoryTreeFolder.Category), ChildNodeObjects = categoryTreeFolder => categoryTreeFolder.Contents.Cast().ToArray(), ContextMenuStrip = CategoryTreeFolderContextMenu }; yield return new TreeNodeInfo { Text = failureMechanismContribution => RingtoetsDataResources.FailureMechanismContribution_DisplayName, Image = failureMechanismContribution => RingtoetsCommonFormsResources.FailureMechanismContributionIcon, ContextMenuStrip = (failureMechanismContribution, parentData, treeViewControl) => Gui.Get(failureMechanismContribution, treeViewControl) .AddOpenItem() .AddSeparator() .AddExportItem() .Build() }; yield return new TreeNodeInfo { Text = hydraulicBoundaryDatabase => RingtoetsFormsResources.HydraulicBoundaryDatabase_DisplayName, Image = hydraulicBoundaryDatabase => RingtoetsCommonFormsResources.GenericInputOutputIcon, CanRename = (context, o) => false, ForeColor = context => context.Parent.HydraulicBoundaryDatabase == null ? Color.FromKnownColor(KnownColor.GrayText) : Color.FromKnownColor(KnownColor.ControlText), ContextMenuStrip = HydraulicBoundaryDatabaseContextMenuStrip }; yield return new TreeNodeInfo> { Text = context => RingtoetsCommonDataResources.FailureMechanism_AssessmentResult_DisplayName, Image = context => RingtoetsCommonFormsResources.FailureMechanismSectionResultIcon, ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddOpenItem() .Build() }; yield return new TreeNodeInfo> { Text = context => RingtoetsCommonDataResources.FailureMechanism_AssessmentResult_DisplayName, Image = context => RingtoetsCommonFormsResources.FailureMechanismSectionResultIcon, ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddOpenItem() .Build() }; yield return new TreeNodeInfo> { Text = comment => Resources.Comment_DisplayName, Image = context => RingtoetsCommonFormsResources.EditDocumentIcon, ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddOpenItem() .Build() }; } private void RemoveOnOpenProjectListener(IProjectOwner projectOwner) { if (projectOwner != null) { projectOwner.ProjectOpened -= VerifyHydraulicBoundaryDatabasePath; } } private void AddOnOpenProjectListener(IProjectOwner projectOwner) { if (projectOwner != null) { projectOwner.ProjectOpened += VerifyHydraulicBoundaryDatabasePath; } } private static void VerifyHydraulicBoundaryDatabasePath(Project project) { var sectionsWithDatabase = project.Items.OfType().Where(i => i.HydraulicBoundaryDatabase != null); foreach (IAssessmentSection section in sectionsWithDatabase) { string selectedFile = section.HydraulicBoundaryDatabase.FilePath; var validationProblem = HydraulicDatabaseHelper.ValidatePathForCalculation(selectedFile); if (validationProblem != null) { log.WarnFormat( RingtoetsCommonFormsResources.GuiPlugin_VerifyHydraulicBoundaryDatabasePath_Hydraulic_boundary_database_connection_failed_0_, validationProblem); } } } #region FailureMechanismContributionContext ViewInfo private static bool CloseFailureMechanismContributionViewForData(FailureMechanismContributionView view, object o) { var assessmentSection = o as IAssessmentSection; return assessmentSection != null && assessmentSection.FailureMechanismContribution == view.Data && assessmentSection == view.AssessmentSection; } #endregion #region FailureMechanismResults ViewInfo private static bool CloseSimpleFailureMechanismResultViewForData(SimpleFailureMechanismResultView view, object o) { var assessmentSection = o as IAssessmentSection; var failureMechanism = o as IFailureMechanism; var failureMechanismContext = o as IFailureMechanismContext; var data = view.Data; if (assessmentSection != null) { return assessmentSection .GetFailureMechanisms() .OfType>() .Any(fm => ReferenceEquals(data, fm.SectionResults)); } if (failureMechanismContext != null) { failureMechanism = failureMechanismContext.WrappedData; } return failureMechanism != null && ReferenceEquals(data, ((IHasSectionResults)failureMechanism).SectionResults); } private static bool CloseCustomFailureMechanismResultViewForData(CustomFailureMechanismResultView view, object o) { var assessmentSection = o as IAssessmentSection; var failureMechanism = o as IFailureMechanism; var failureMechanismContext = o as IFailureMechanismContext; var data = view.Data; if (assessmentSection != null) { return assessmentSection .GetFailureMechanisms() .OfType>() .Any(fm => ReferenceEquals(data, fm.SectionResults)); } if (failureMechanismContext != null) { failureMechanism = failureMechanismContext.WrappedData; } return failureMechanism != null && ReferenceEquals(data, ((IHasSectionResults)failureMechanism).SectionResults); } #endregion #region FailureMechanismSectionsContext private ContextMenuStrip FailureMechanismSectionsContextMenuStrip(FailureMechanismSectionsContext nodeData, object parentData, TreeViewControl treeViewControl) { return Gui.Get(nodeData, treeViewControl) .AddImportItem() .Build(); } #endregion #region Comment ViewInfo private static bool CloseCommentViewForData(CommentView commentView, object o) { var calculationGroupContext = o as ICalculationContext; if (calculationGroupContext != null) { return GetCommentableElements(calculationGroupContext.WrappedData) .Any(commentableElement => ReferenceEquals(commentView.Data, commentableElement)); } var calculationContext = o as ICalculationContext; if (calculationContext != null) { return ReferenceEquals(commentView.Data, calculationContext.WrappedData); } var failureMechanismContext = o as IFailureMechanismContext; if (failureMechanismContext != null) { return GetCommentableElements(failureMechanismContext.WrappedData) .Any(commentableElement => ReferenceEquals(commentView.Data, commentableElement)); } var assessmentSection = o as IAssessmentSection; if (assessmentSection != null) { return GetCommentableElements(assessmentSection) .Any(commentableElement => ReferenceEquals(commentView.Data, commentableElement)); } return false; } private static IEnumerable GetCommentableElements(CalculationGroup calculationGroup) { return calculationGroup.GetCalculations(); } private static IEnumerable GetCommentableElements(IAssessmentSection assessmentSection) { yield return assessmentSection; foreach (var commentable in assessmentSection.GetFailureMechanisms().SelectMany(GetCommentableElements)) { yield return commentable; } } private static IEnumerable GetCommentableElements(IFailureMechanism failureMechanism) { yield return failureMechanism; foreach (ICalculation commentableCalculation in failureMechanism.Calculations) { yield return commentableCalculation; } } #endregion # region assessmentSection private object[] AssessmentSectionChildNodeObjects(IAssessmentSection nodeData) { var childNodes = new List { new ReferenceLineContext(nodeData), new FailureMechanismContributionContext(nodeData.FailureMechanismContribution, nodeData), new HydraulicBoundaryDatabaseContext(nodeData), new CommentContext(nodeData) }; IEnumerable failureMechanismContexts = WrapFailureMechanismsInContexts(nodeData); childNodes.AddRange(failureMechanismContexts); return childNodes.ToArray(); } private static IEnumerable WrapFailureMechanismsInContexts(IAssessmentSection nodeData) { foreach (IFailureMechanism failureMechanism in nodeData.GetFailureMechanisms()) { var piping = failureMechanism as PipingFailureMechanism; var grassCoverErosionInwards = failureMechanism as GrassCoverErosionInwardsFailureMechanism; var heightStructuresFailureMechanism = failureMechanism as HeightStructuresFailureMechanism; var customFailureMechanism = failureMechanism as IHasSectionResults; var simpleFailureMechanism = failureMechanism as IHasSectionResults; if (piping != null) { yield return new PipingFailureMechanismContext(piping, nodeData); } else if (grassCoverErosionInwards != null) { yield return new GrassCoverErosionInwardsFailureMechanismContext(grassCoverErosionInwards, nodeData); } else if (heightStructuresFailureMechanism != null) { yield return new HeightStructuresFailureMechanismContext(heightStructuresFailureMechanism, nodeData); } else if (customFailureMechanism != null) { yield return new CustomFailureMechanismContext(customFailureMechanism as IFailureMechanism, nodeData); } else if (simpleFailureMechanism != null) { yield return new SimpleFailureMechanismContext(simpleFailureMechanism as IFailureMechanism, nodeData); } else { throw new NotImplementedException(); } } } private void AssessmentSectionOnNodeRenamed(IAssessmentSection nodeData, string newName) { nodeData.Name = newName; nodeData.NotifyObservers(); } private void AssessmentSectionOnNodeRemoved(IAssessmentSection nodeData, object parentNodeData) { var parentProject = (Project) parentNodeData; parentProject.Items.Remove(nodeData); parentProject.NotifyObservers(); } private ContextMenuStrip AssessmentSectionContextMenuStrip(IAssessmentSection nodeData, object parentData, TreeViewControl treeViewControl) { return Gui.Get(nodeData, treeViewControl) .AddOpenItem() .AddSeparator() .AddRenameItem() .AddDeleteItem() .AddSeparator() .AddImportItem() .AddExportItem() .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() .AddSeparator() .AddPropertiesItem() .Build(); } # endregion # region StandAloneFailureMechanismContext private object[] StandAloneFailureMechanismEnabledChildNodeObjects(FailureMechanismContext nodeData) { return new object[] { new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Inputs_DisplayName, GetInputs(nodeData.WrappedData, nodeData.Parent), TreeFolderCategory.Input), new CategoryTreeFolder(RingtoetsCommonFormsResources.FailureMechanism_Outputs_DisplayName, GetOutputs(nodeData.WrappedData), TreeFolderCategory.Output) }; } private object[] StandAloneFailureMechanismDisabledChildNodeObjects(FailureMechanismContext nodeData) { return new object[] { new CommentContext(nodeData.WrappedData) }; } private IList GetInputs(IFailureMechanism nodeData, IAssessmentSection assessmentSection) { return new ArrayList { new FailureMechanismSectionsContext(nodeData, assessmentSection), new CommentContext(nodeData) }; } private IList GetOutputs(IFailureMechanism nodeData) { var simple = nodeData as IHasSectionResults; var custom = nodeData as IHasSectionResults; var failureMechanismSectionResultContexts = new object[1]; if (simple != null) { failureMechanismSectionResultContexts[0] = new FailureMechanismSectionResultContext(simple.SectionResults, nodeData); } if (custom != null) { failureMechanismSectionResultContexts[0] = new FailureMechanismSectionResultContext(custom.SectionResults, nodeData); } return failureMechanismSectionResultContexts; } private ContextMenuStrip StandAloneFailureMechanismEnabledContextMenuStrip(FailureMechanismContext nodeData, object parentData, TreeViewControl treeViewControl) { var builder = new RingtoetsContextMenuBuilder(Gui.Get(nodeData, treeViewControl)); return builder.AddToggleRelevancyOfFailureMechanismItem(nodeData, RemoveAllViewsForItem) .AddSeparator() .AddImportItem() .AddExportItem() .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() .AddSeparator() .AddPropertiesItem() .Build(); } private void RemoveAllViewsForItem(FailureMechanismContext failureMechanismContext) { Gui.ViewCommands.RemoveAllViewsForItem(failureMechanismContext); } private ContextMenuStrip StandAloneFailureMechanismDisabledContextMenuStrip(FailureMechanismContext nodeData, object parentData, TreeViewControl treeViewControl) { var builder = new RingtoetsContextMenuBuilder(Gui.Get(nodeData, treeViewControl)); return builder.AddToggleRelevancyOfFailureMechanismItem(nodeData, null) .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() .Build(); } # endregion # region CategoryTreeFolder private Image GetFolderIcon(TreeFolderCategory category) { switch (category) { case TreeFolderCategory.General: return RingtoetsCommonFormsResources.GeneralFolderIcon; case TreeFolderCategory.Input: return RingtoetsCommonFormsResources.InputFolderIcon; case TreeFolderCategory.Output: return RingtoetsCommonFormsResources.OutputFolderIcon; default: throw new NotImplementedException(); } } private ContextMenuStrip CategoryTreeFolderContextMenu(CategoryTreeFolder nodeData, object parentData, TreeViewControl treeViewControl) { return Gui.Get(nodeData, treeViewControl) .AddExpandAllItem() .AddCollapseAllItem() .Build(); } # endregion #region HydraulicBoundaryDatabase private ContextMenuStrip HydraulicBoundaryDatabaseContextMenuStrip(HydraulicBoundaryDatabaseContext nodeData, object parentData, TreeViewControl treeViewControl) { var connectionItem = new StrictContextMenuItem( RingtoetsFormsResources.HydraulicBoundaryDatabase_Connect, RingtoetsFormsResources.HydraulicBoundaryDatabase_Connect_ToolTip, RingtoetsCommonFormsResources.DatabaseIcon, (sender, args) => { SelectDatabaseFile(nodeData.Parent); }); var designWaterLevelItem = new StrictContextMenuItem( RingtoetsFormsResources.DesignWaterLevel_Calculate, RingtoetsFormsResources.DesignWaterLevel_Calculate_ToolTip, RingtoetsCommonFormsResources.FailureMechanismIcon, (sender, args) => { var hrdFile = nodeData.Parent.HydraulicBoundaryDatabase.FilePath; var validationProblem = HydraulicDatabaseHelper.ValidatePathForCalculation(hrdFile); if (validationProblem == null) { var hlcdDirectory = Path.GetDirectoryName(hrdFile); var activities = nodeData.Parent.HydraulicBoundaryDatabase.Locations.Select(hbl => CreateHydraRingTargetProbabilityCalculationActivity(nodeData.Parent, hbl, hlcdDirectory)).ToList(); ActivityProgressDialogRunner.Run(Gui.MainWindow, activities); nodeData.Parent.NotifyObservers(); } else { log.ErrorFormat(Resources.RingtoetsGuiPlugin_HydraulicBoundaryDatabaseContextMenuStrip_Start_calculation_failed_0_, validationProblem); } }); if (nodeData.Parent.HydraulicBoundaryDatabase == null) { designWaterLevelItem.Enabled = false; designWaterLevelItem.ToolTipText = RingtoetsFormsResources.DesignWaterLevel_No_HRD_To_Calculate; } return Gui.Get(nodeData, treeViewControl) .AddOpenItem() .AddSeparator() .AddCustomItem(connectionItem) .AddImportItem() .AddExportItem() .AddSeparator() .AddCustomItem(designWaterLevelItem) .AddSeparator() .AddPropertiesItem() .Build(); } private void SelectDatabaseFile(IAssessmentSection assessmentSection) { var windowTitle = RingtoetsFormsResources.SelectHydraulicBoundaryDatabaseFile_Title; using (var dialog = new OpenFileDialog { Filter = string.Format("{0} (*.sqlite)|*.sqlite", RingtoetsFormsResources.SelectHydraulicBoundaryDatabaseFile_FilterName), Multiselect = false, Title = windowTitle, RestoreDirectory = true, CheckFileExists = false }) { if (dialog.ShowDialog(Gui.MainWindow) == DialogResult.OK) { try { ImportHydraulicBoundaryDatabase(dialog.FileName, assessmentSection); } catch (CriticalFileReadException exception) { log.Error(exception.Message, exception); } } } } /// /// Attempts to update the with a /// imported from the . /// /// The file to use to import a from. /// The to which the imported /// will be assigned. /// Thrown when importing from the /// failed. private static void ImportHydraulicBoundaryDatabase(string databaseFile, IAssessmentSection assessmentSection) { var hydraulicBoundaryDatabase = assessmentSection.HydraulicBoundaryDatabase; var isHydraulicBoundaryDatabaseSet = hydraulicBoundaryDatabase != null; var isClearConfirmationRequired = isHydraulicBoundaryDatabaseSet && !HydraulicDatabaseHelper.HaveEqualVersion(hydraulicBoundaryDatabase, databaseFile); var isClearConfirmationGiven = isClearConfirmationRequired && IsClearCalculationConfirmationGiven(); if (!isHydraulicBoundaryDatabaseSet || !isClearConfirmationRequired || isClearConfirmationGiven) { var hydraulicBoundaryLocationsImporter = new HydraulicBoundaryDatabaseImporter(); if (hydraulicBoundaryLocationsImporter.Import(assessmentSection, databaseFile)) { if (isClearConfirmationRequired) { ClearCalculations(assessmentSection); } assessmentSection.NotifyObservers(); log.InfoFormat(RingtoetsFormsResources.RingtoetsGuiPlugin_SetBoundaryDatabaseFilePath_Database_on_path_0_linked, assessmentSection.HydraulicBoundaryDatabase.FilePath); } } } private static TargetProbabilityCalculationActivity CreateHydraRingTargetProbabilityCalculationActivity(IAssessmentSection assessmentSection, HydraulicBoundaryLocation hydraulicBoundaryLocation, string hlcdDirectory) { return HydraRingActivityFactory.Create( string.Format(Resources.RingtoetsGuiPlugin_Calculate_assessment_level_for_location_0_, hydraulicBoundaryLocation.Id), hlcdDirectory, assessmentSection.Name, // TODO: Provide name of reference line instead HydraRingTimeIntegrationSchemeType.FBC, HydraRingUncertaintiesType.All, new AssessmentLevelCalculationInput((int) hydraulicBoundaryLocation.Id, assessmentSection.FailureMechanismContribution.Norm), () => { hydraulicBoundaryLocation.DesignWaterLevel = double.NaN; }, output => { ParseHydraRingOutput(hydraulicBoundaryLocation, output); }); } private static void ParseHydraRingOutput(HydraulicBoundaryLocation hydraulicBoundaryLocation, TargetProbabilityCalculationOutput output) { if (output != null) { hydraulicBoundaryLocation.DesignWaterLevel = output.Result; } else { throw new InvalidOperationException(Resources.RingtoetsGuiPlugin_Error_during_assessment_level_calculation); } } private static bool IsClearCalculationConfirmationGiven() { var confirmation = MessageBox.Show( RingtoetsFormsResources.Delete_Calculations_Text, BaseResources.Confirm, MessageBoxButtons.OKCancel); return (confirmation == DialogResult.OK); } private static void ClearCalculations(IAssessmentSection nodeData) { var failureMechanisms = nodeData.GetFailureMechanisms(); foreach (ICalculation calc in failureMechanisms.SelectMany(fm => fm.Calculations)) { calc.ClearOutput(); calc.ClearHydraulicBoundaryLocation(); calc.NotifyObservers(); } log.Info(RingtoetsFormsResources.Calculations_Deleted); } #endregion } }