/// <summary>
 /// Initializes a new instance of the <see cref="ActivityDestination"/> class.
 /// </summary>
 /// <param name="activityDestination">The activity destination to be copied deeply.</param>
 public ActivityDestination(ActivityDestination activityDestination)
 {
     this.EngagedActivityName    = activityDestination.Name;
     this._destinationArea       = activityDestination.DestinationArea;
     this.DefaultState           = activityDestination.DefaultState;
     this._minimumEngagementTime = activityDestination._minimumEngagementTime;
     this._maximumEngagementTime = activityDestination._maximumEngagementTime;
     this.Origins = activityDestination.Origins;
 }
        /// <summary>
        /// creates an Activity Destination from its string representation
        /// </summary>
        /// <param name="lines">The lines.</param>
        /// <param name="startIndex">The start index.</param>
        /// <param name="cellularFloor">The cellular floor.</param>
        /// <param name="tolerance">The tolerance.</param>
        /// <returns>ActivityDestination.</returns>
        /// <exception cref="System.ArgumentException">
        /// Activity does not include a name!
        /// or
        /// Failed to parse activity's engagement duration: " + lines[startIndex + 3]
        /// or
        /// Activity does not include cell origins!
        /// or
        /// Failed to set activity engagement duration!
        /// </exception>
        public static ActivityDestination FromString(List <string> lines, int startIndex, Length_Unit_Types unitType, CellularFloor cellularFloor, double tolerance = 0.0000001d)
        {
            string name = lines[startIndex];

            if (string.IsNullOrEmpty(lines[startIndex]) || string.IsNullOrWhiteSpace(lines[startIndex]))
            {
                throw new ArgumentException("Activity does not include a name!");
            }
            StateBase      state   = StateBase.FromStringRepresentation(lines[startIndex + 1]);
            BarrierPolygon barrier = BarrierPolygon.FromStringRepresentation(lines[startIndex + 2]);

            //unit converion
            UnitConversion.Transform(state.Location, unitType, cellularFloor.UnitType);
            UnitConversion.Transform(state.Velocity, unitType, cellularFloor.UnitType);
            UnitConversion.Transform(barrier.BoundaryPoints, unitType, cellularFloor.UnitType);

            var    strings = lines[startIndex + 3].Split(',');
            double min = 0, max = 0;

            if (!double.TryParse(strings[0], out min) || !double.TryParse(strings[1], out max))
            {
                throw new ArgumentException("Failed to parse activity's engagement duration: " + lines[startIndex + 3]);
            }
            HashSet <Cell> origins = new HashSet <Cell>();
            var            indices = cellularFloor.GetIndicesInsideBarrier(barrier, tolerance);

            if (indices.Count > 0)
            {
                foreach (var index in indices)
                {
                    Cell cell = cellularFloor.FindCell(index);
                    if (cell != null && cell.FieldOverlapState == OverlapState.Inside)
                    {
                        origins.Add(cell);
                    }
                }
            }
            if (origins.Count == 0)
            {
                throw new ArgumentException("Activity does not include cell origins!");
            }
            ActivityDestination dest = new ActivityDestination(name, origins, state, barrier);

            if (!dest.TrySetEngagementTime(min, max))
            {
                throw new ArgumentException("Failed to set activity engagement duration!");
            }
            return(dest);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="Activity"/> class.
 /// </summary>
 /// <param name="activityDestination">The activity destination.</param>
 /// <param name="cellularFloor">The cellular floor.</param>
 public Activity(ActivityDestination activityDestination, CellularFloor cellularFloor)
     : base(activityDestination)
 {
     this._cellularFloor = cellularFloor;
     var indices = this._cellularFloor.GetIndicesInsideBarrier(activityDestination.DestinationArea, .000001);
 }