/// <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); }