// 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 Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Base.Geometry; namespace Ringtoets.Common.Data { /// /// Base definition of a structure. /// public abstract class StructureBase : Observable { /// /// Creates a new instance of . /// /// The parameters required to construct a new /// instance of . /// Thrown when /// or is null, empty or consists of whitespace. /// Thrown when is null. protected StructureBase(ConstructionProperties constructionProperties) { if (string.IsNullOrWhiteSpace(constructionProperties.Name)) { throw new ArgumentException(@"Name is null, empty or consists of whitespace.", nameof(constructionProperties)); } if (string.IsNullOrWhiteSpace(constructionProperties.Id)) { throw new ArgumentException(@"Id is null, empty or consists of whitespace.", nameof(constructionProperties)); } if (constructionProperties.Location == null) { throw new ArgumentNullException(nameof(constructionProperties), @"Location is null."); } Name = constructionProperties.Name; Id = constructionProperties.Id; Location = constructionProperties.Location; StructureNormalOrientation = constructionProperties.StructureNormalOrientation; } /// /// Gets the name of the structure. /// public string Name { get; private set; } /// /// Gets the identifier of the structure. /// public string Id { get; } /// /// Gets the location of the structure. /// public Point2D Location { get; private set; } /// /// Gets the orientation of the structure, relative to north. /// [degrees] /// public RoundedDouble StructureNormalOrientation { get; private set; } public override string ToString() { return Name; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) { return false; } if (ReferenceEquals(this, obj)) { return true; } if (obj.GetType() != GetType()) { return false; } return Equals((StructureBase) obj); } public override int GetHashCode() { unchecked { int hashCode = Name.GetHashCode(); hashCode = (hashCode * 397) ^ Id.GetHashCode(); hashCode = (hashCode * 397) ^ Location.GetHashCode(); hashCode = (hashCode * 397) ^ StructureNormalOrientation.GetHashCode(); return hashCode; } } /// /// Copies the property values of the to the /// . /// /// The /// to get the property values from. /// Thrown when /// is null. protected void CopyProperties(StructureBase fromStructure) { if (fromStructure == null) { throw new ArgumentNullException(nameof(fromStructure)); } Name = fromStructure.Name; Location = new Point2D(fromStructure.Location.X, fromStructure.Location.Y); StructureNormalOrientation = fromStructure.StructureNormalOrientation; } private bool Equals(StructureBase other) { return Id.Equals(other.Id) && Name.Equals(other.Name) && Location.Equals(other.Location) && StructureNormalOrientation.Equals(other.StructureNormalOrientation); } /// /// Class holding the various construction parameters for . /// public class ConstructionProperties { private RoundedDouble structureNormalOrientation; /// /// Creates a new instance of . /// public ConstructionProperties() { structureNormalOrientation = new RoundedDouble(2, double.NaN); } /// /// Gets or sets the name of the structure. /// public string Name { internal get; set; } /// /// Gets or sets the identifier of the structure. /// public string Id { internal get; set; } /// /// Gets or sets the location of the structure. /// public Point2D Location { internal get; set; } /// /// Gets or sets the orientation of the structure, relative to north. /// [degrees] /// public RoundedDouble StructureNormalOrientation { internal get { return structureNormalOrientation; } set { structureNormalOrientation = value.ToPrecision(structureNormalOrientation.NumberOfDecimalPlaces); } } } } }