Index: Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionCollection.cs =================================================================== diff -u --- Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionCollection.cs (revision 0) +++ Ringtoets/Common/src/Ringtoets.Common.Data/FailureMechanism/FailureMechanismSectionCollection.cs (revision 29590bf9ec9ced87e1fc0e124466238c4151def8) @@ -0,0 +1,133 @@ +// 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; +using System.Collections.Generic; +using System.Linq; +using Core.Common.Base; +using Core.Common.Util; +using Ringtoets.Common.Data.Properties; + +namespace Ringtoets.Common.Data.FailureMechanism +{ + public class FailureMechanismSectionCollection : Observable, IObservableEnumerable + { + private readonly List sections = new List(); + + /// + /// Clears the imported items in the collection and the . + /// + public void Clear() + { + sections.Clear(); + } + + /// + /// Adds all originating from a source file. + /// + /// The collection of to add + /// The path to the source file. + /// Thrown when any input argument is null. + /// Thrown when: + /// + /// contains null. + /// is not a valid file path. + /// + /// + public void AddRange(IEnumerable failureMechanismSections, + string filePath) + { + if (failureMechanismSections == null) + { + throw new ArgumentNullException(nameof(failureMechanismSections)); + } + + if (filePath == null) + { + throw new ArgumentNullException(nameof(filePath)); + } + + if (!IOUtils.IsValidFilePath(filePath) && filePath.Length > 0) + { + throw new ArgumentException($@"'{filePath}' is not a valid file path.", nameof(filePath)); + } + + if (failureMechanismSections.Contains(null)) + { + throw new ArgumentException(@"Collection cannot contain null.", nameof(failureMechanismSections)); + } + + List sourceCollection = failureMechanismSections.ToList(); + if (!sections.Any()) + { + FailureMechanismSection firstSection = sourceCollection.First(); + sections.Add(firstSection); + sourceCollection.Remove(firstSection); + } + + foreach (FailureMechanismSection section in sourceCollection) + { + InsertSectionWhileMaintainingConnectivityOrder(section); + } + + SourcePath = filePath; + } + + /// + /// Gets the last known file path from which the were imported. + /// + /// The path where the elements originate + /// from, or null if the collection is cleared. + public string SourcePath { get; private set; } + + /// + /// Inserts the section to the collection while maintaining connectivity + /// order (neighboring have same end points). + /// + /// The new section. + /// Thrown when cannot + /// be connected to elements already defined in this collection. + private void InsertSectionWhileMaintainingConnectivityOrder(FailureMechanismSection sectionToInsert) + { + if (sections.Last().EndPoint.Equals(sectionToInsert.StartPoint)) + { + sections.Add(sectionToInsert); + } + else + { + string message = string.Format(Resources.BaseFailureMechanism_AddSection_Section_0_must_connect_to_existing_sections, + sectionToInsert.Name); + throw new ArgumentException(message, nameof(sectionToInsert)); + } + } + + public IEnumerator GetEnumerator() + { + return sections.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj =================================================================== diff -u -r35cea5bdef5fedc2034ca0df05994b1930f7d46a -r29590bf9ec9ced87e1fc0e124466238c4151def8 --- Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj (.../Ringtoets.Common.Data.csproj) (revision 35cea5bdef5fedc2034ca0df05994b1930f7d46a) +++ Ringtoets/Common/src/Ringtoets.Common.Data/Ringtoets.Common.Data.csproj (.../Ringtoets.Common.Data.csproj) (revision 29590bf9ec9ced87e1fc0e124466238c4151def8) @@ -48,6 +48,7 @@ +