using System.Collections.Generic; using System.Linq; namespace Deltares.Dam.Data.Sensors { internal abstract class SensorPLLine3Or4CreatorBase : SensorPLLineCreatorBase { protected SensorPLLine3Or4CreatorBase(SensorLocation sensorLocation, IDictionary sensorValues, PLLineType plLineType) : base(sensorLocation, plLineType, sensorValues) { } /// /// Gets the start z level of the PL line /// /// /// The start level is based on the PL3 or PL4 configuration (locationdata or sensor) /// and the position of the first sensor /// /// public override PLLine CreatePLLine() { var lineConstructor = new PLLineConstructor(); double currentLevel = 0; currentLevel = GetStartLevel(); // Add begin boundary lineConstructor.Insert(new PLLinePoint(XBeginBoundary, currentLevel)); // Add point toe at river lineConstructor.Insert(new PLLinePoint(XDikeToeAtRiver, currentLevel)); var firstSensor = SensorsSortedAlongProfile.FirstOrDefault(); if (firstSensor != null) { bool skipFirstSensor = WaterLevelSensor.RelativeLocation > firstSensor.RelativeLocation; IEnumerable sensorsSortedAlongProfile = skipFirstSensor ? SensorsSortedAlongProfile.Skip(1) : SensorsSortedAlongProfile; foreach (var sensor in sensorsSortedAlongProfile) { var x = GetSensorXValue(sensor); var z = currentLevel = GetSensorZValue(sensor); var point = new PLLinePoint(x, z) { Name = sensor.Name }; Logger.LogDebug(string.Format("Point '{0}' added to PL Line", sensor.Name)); lineConstructor.Insert(point); } } // Add end boundary lineConstructor.Insert(new PLLinePoint(XEndBoundary, currentLevel)); return lineConstructor.CreatePLLine(PLLineType); } /// /// Gets the water level at river. /// /// /// If the position of the water level sensor is after the position of the /// first sensor then the value of the latter is used /// public double WaterLevelAtRiver { get { var firstSensor = SensorsSortedAlongProfile.First(); double level = SensorValues[firstSensor]; if (WaterLevelSensor.RelativeLocation < firstSensor.RelativeLocation) level = SensorValues[WaterLevelSensor]; level = level - Correction; return level; } } /// /// Gets or sets the (stijghoogtedemping) correction value. /// /// /// The correction. /// protected double Correction { get; set; } /// /// Gets the start level. /// /// abstract protected double GetStartLevel(); } }