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 @@
+