private static RouteTimeTableEntry GetPreviousEntry(RouteTimeTableEntry entry, FleetAirliner airliner, List <RouteTimeTableEntry> entries) { TimeSpan tsEntry = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); DayOfWeek eDay = entry.Day; int counter = 0; while (counter < 7) { List <RouteTimeTableEntry> tEntries = entries; tEntries = (from e in tEntries orderby e.Time descending select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { TimeSpan ts = new TimeSpan((int)eDay, dEntry.Time.Hours, dEntry.Time.Minutes, dEntry.Time.Seconds); if (ts < tsEntry) { return(dEntry); } } counter++; eDay--; if (((int)eDay) == -1) { eDay = (DayOfWeek)6; tsEntry = new TimeSpan(7, tsEntry.Hours, tsEntry.Minutes, tsEntry.Seconds); } } return(null); }
public StopoverFlight(RouteTimeTableEntry entry) : base(entry) { CurrentFlight = 0; AllClasses = new Dictionary<RouteTimeTableEntry, List<FlightAirlinerClass>>(); AllCargo = new Dictionary<RouteTimeTableEntry, double>(); List<Route> legs = entry.TimeTable.Route.Stopovers.SelectMany(s => s.Legs).ToList(); bool isInbound = entry.DepartureAirport == entry.TimeTable.Route.Destination2; if (isInbound) { legs.Reverse(); } CreateEntries(entry); /* foreach (Route route in legs) { List<FlightAirlinerClass> classes = new List<FlightAirlinerClass>(); foreach (AirlinerClass aClass in this.Airliner.Airliner.Classes) { FlightAirlinerClass faClass; if (isInbound) faClass = new FlightAirlinerClass(route.getRouteAirlinerClass(aClass.Type), PassengerHelpers.GetStopoverFlightPassengers(this.Airliner,aClass.Type,route.Destination2,route.Destination1)); else faClass = new FlightAirlinerClass(route.getRouteAirlinerClass(aClass.Type), PassengerHelpers.GetStopoverFlightPassengers(this.Airliner,aClass.Type,route.Destination1,route.Destination2)); classes.Add(faClass); } this.AllClasses.Add(route, classes); } * */ }
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { RouteTimeTableEntry e = (RouteTimeTableEntry)value; TimeSpan flightTime = e.TimeTable.Route.getFlightTime(e.Airliner.Airliner.Type); return(new TimeSpanConverter().Convert(e.Time.Add(flightTime))); }
private void EntryChanged_Event(object sender, System.Windows.RoutedEventArgs e) { object[] entries = e.OriginalSource as object[]; TimelineEntry oldEntry = entries[0] as TimelineEntry; TimelineEntry newEntry = entries[1] as TimelineEntry; RouteTimeTableEntry oEntry = (RouteTimeTableEntry)oldEntry.Source; RouteTimeTable rt = new RouteTimeTable(oEntry.TimeTable.Route); RouteTimeTableEntry nEntry = new RouteTimeTableEntry(rt, (DayOfWeek)newEntry.StartTime.Days, newEntry.StartTime, oEntry.Destination); nEntry.Airliner = this.Airliner; rt.addEntry(nEntry); List <RouteTimeTableEntry> tEntries = new List <RouteTimeTableEntry>(this.Entries); tEntries.Remove(oEntry); if (!TimeTableHelpers.IsTimeTableValid(rt, this.Airliner, tEntries)) { WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2706"), Translator.GetInstance().GetString("MessageBox", "2706", "message"), WPFMessageBoxButtons.Ok); } else { this.Entries.Remove(oEntry); this.Entries.Add(nEntry); } }
public static List <RouteTimeTableEntry> GetAirportDepartures(Airport airport, int count) { List <RouteTimeTableEntry> entries = new List <RouteTimeTableEntry>(); foreach (Route route in AirportHelpers.GetAirportRoutes(airport)) { if (route.HasAirliner && route.getCurrentAirliner() != null) { RouteTimeTableEntry entry = route.getCurrentAirliner().CurrentFlight == null?route.TimeTable.getNextEntry(GameObject.GetInstance().GameTime, airport) : route.getCurrentAirliner().CurrentFlight.Entry; if (!entry.Destination.Airport.Profile.Coordinates.Equals(airport.Profile.Coordinates)) { entries.Add(entry); } while (entries.Count < 4) { entry = route.TimeTable.getNextEntry(entry); if (entry.Destination.Airport != airport) { entries.Add(entry); } } } } entries.Sort(delegate(RouteTimeTableEntry e1, RouteTimeTableEntry e2) { return(MathHelpers.ConvertEntryToDate(e1).CompareTo(MathHelpers.ConvertEntryToDate(e2))); }); return(entries.GetRange(0, Math.Min(entries.Count, count))); }
//returns the next entry after a specific entry private static RouteTimeTableEntry GetNextEntry(RouteTimeTableEntry entry, FleetAirliner airliner, Dictionary <Route, List <RouteTimeTableEntry> > entries, Dictionary <Route, List <RouteTimeTableEntry> > entriesToDelete) { DayOfWeek day = entry.Day; int counter = 0; while (counter < 7) { List <RouteTimeTableEntry> tEntries = airliner.Routes.SelectMany(r => r.TimeTable.Entries.FindAll(e => e.Airliner == airliner && e.Day == day)).ToList(); tEntries.AddRange(entries.Keys.SelectMany(r => entries[r].FindAll(e => e.Day == day))); tEntries.RemoveAll(e => entriesToDelete.Keys.SelectMany(r => entriesToDelete[r]).ToList().Find(te => te == e) == e); tEntries = (from e in tEntries orderby e.Time select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { if (!((dEntry.Day == entry.Day && dEntry.Time <= entry.Time))) { return(dEntry); } } day++; if (day == (DayOfWeek)7) { day = (DayOfWeek)0; } counter++; } return(null); }
//adds entries to the planner private void addEntries(List <DayOfWeek> days) { Route route = (Route)cbHomebound.SelectedItem; Airport origin = (Airport)cbOutbound.SelectedItem; Airport airport = route.Destination1 == origin ? route.Destination2 : route.Destination1; TimeSpan time = new TimeSpan(tpTime.Value.Value.Hour, tpTime.Value.Value.Minute, 0); string flightCode = this.Airliner.Airliner.Airline.Profile.IATACode + txtSchedulerFlightNumber.Text; RouteTimeTable rt = new RouteTimeTable(route); foreach (DayOfWeek dayOfWeek in days) { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, dayOfWeek, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; rt.addEntry(entry); } if (!TimeTableHelpers.IsRoutePlannerTimeTableValid(rt, this.Airliner, this.Entries.ToList())) { WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2706"), Translator.GetInstance().GetString("MessageBox", "2706", "message"), WPFMessageBoxButtons.Ok); } else { foreach (RouteTimeTableEntry entry in rt.Entries) { this.Entries.Add(entry); } } setFlightNumbers(); }
private static RouteTimeTableEntry GetNextEntry(RouteTimeTableEntry entry, FleetAirliner airliner, List <RouteTimeTableEntry> entries) { DayOfWeek day = entry.Day; int counter = 0; while (counter < 7) { List <RouteTimeTableEntry> tEntries = entries; tEntries = (from e in tEntries orderby e.Time select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { if (!((dEntry.Day == entry.Day && dEntry.Time <= entry.Time))) { return(dEntry); } } day++; if (day == (DayOfWeek)7) { day = (DayOfWeek)0; } counter++; } return(null); }
public Flight(RouteTimeTableEntry entry) { this.Entry = entry; if (this.Entry.TimeTable.Route.Type == Route.RouteType.Passenger || this.Entry.TimeTable.Route.Type == Route.RouteType.Mixed) { this.Classes = new List<FlightAirlinerClass>(); if (this.Entry != null) { this.Airliner = this.Entry.Airliner; this.FlightTime = MathHelpers.ConvertEntryToDate(this.Entry); this.ScheduledFlightTime = this.FlightTime; } this.IsOnTime = true; } if (this.Entry.TimeTable.Route.Type == Route.RouteType.Cargo || this.Entry.TimeTable.Route.Type == Route.RouteType.Mixed) { if (this.Entry != null) { this.Airliner = this.Entry.Airliner; this.FlightTime = MathHelpers.ConvertEntryToDate(this.Entry); this.ScheduledFlightTime = this.FlightTime; } this.IsOnTime = true; } this.DistanceToDestination = MathHelpers.GetDistance(this.Entry.Destination.Airport.Profile.Coordinates,this.Entry.DepartureAirport.Profile.Coordinates); }
public Flight(RouteTimeTableEntry entry) { this.Entry = entry; if (this.Entry.TimeTable.Route.Type == Route.RouteType.Passenger || this.Entry.TimeTable.Route.Type == Route.RouteType.Mixed) { this.Classes = new List<FlightAirlinerClass>(); if (this.Entry != null) { this.Airliner = this.Entry.Airliner; this.FlightTime = MathHelpers.ConvertEntryToDate(this.Entry); this.ScheduledFlightTime = this.FlightTime; } this.IsOnTime = true; } if (this.Entry.TimeTable.Route.Type == Route.RouteType.Cargo || this.Entry.TimeTable.Route.Type == Route.RouteType.Mixed) { if (this.Entry != null) { this.Airliner = this.Entry.Airliner; this.FlightTime = MathHelpers.ConvertEntryToDate(this.Entry); this.ScheduledFlightTime = this.FlightTime; } this.IsOnTime = true; } }
public DestinationFlight(Airline airline, RouteTimeTableEntry entry, DateTime time) { this.Airline = airline; this.Entry = entry; this.Time = time; this.AirlinerType = this.Entry.Airliner.Airliner.Type; }
// chs, 2011-17-11 changed for showing departures and arrivals from one airport to another //returns the list of arrivals or departures from one airport to another public static List <RouteTimeTableEntry> GetAirportFlights(Airport fAirport, Airport tAirport, Boolean arrivals) { List <RouteTimeTableEntry> entries = new List <RouteTimeTableEntry>(); foreach (Route route in AirportHelpers.GetAirportRoutes(fAirport)) { if (route.HasAirliner && (route.Destination1 == tAirport || route.Destination2 == tAirport)) { RouteTimeTableEntry entry = route.getCurrentAirliner() == null || route.getCurrentAirliner().CurrentFlight == null || route.getCurrentAirliner().CurrentFlight.Entry == null?route.TimeTable.getNextEntry(GameObject.GetInstance().GameTime) : route.getCurrentAirliner().CurrentFlight.Entry; for (int i = 0; i < route.TimeTable.Entries.Count; i++) { if (!arrivals && entry.Destination.Airport == tAirport) { entries.Add(entry); } if (arrivals && entry.Destination.Airport == fAirport) { entries.Add(entry); } entry = route.TimeTable.getNextEntry(entry); } } } entries.Sort(delegate(RouteTimeTableEntry e1, RouteTimeTableEntry e2) { return(MathHelpers.ConvertEntryToDate(e1).CompareTo(MathHelpers.ConvertEntryToDate(e2))); }); return(entries); }
private void EntryDeleted_Event(object sender, System.Windows.RoutedEventArgs e) { TimelineEntry entry = (TimelineEntry)e.OriginalSource; RouteTimeTableEntry rEntry = (RouteTimeTableEntry)entry.Source; this.Entries.Remove(rEntry); }
private void btnAdd_Click(object sender, RoutedEventArgs e) { ComboBoxItem item = (ComboBoxItem)cbDestination.SelectedItem; Route route = (Route)item.Tag; Airport airport = (Airport)item.Content; TimeSpan time = new TimeSpan(tpTime.Value.Value.Hour, tpTime.Value.Value.Minute, 0); string day = cbDay.SelectedItem.ToString(); if (!this.ParentPage.Entries.ContainsKey(route)) { this.ParentPage.Entries.Add(route, new List <RouteTimeTableEntry>()); } string flightCode = cbFlightCode.SelectedItem.ToString(); RouteTimeTable rt = new RouteTimeTable(route); if (day == "Daily") { foreach (DayOfWeek dayOfWeek in Enum.GetValues(typeof(DayOfWeek))) { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, dayOfWeek, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; rt.addEntry(entry); } } else { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, (DayOfWeek)cbDay.SelectedItem, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; rt.addEntry(entry); } if (!TimeTableHelpers.IsTimeTableValid(rt, this.Airliner, this.ParentPage.Entries)) { WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2706"), Translator.GetInstance().GetString("MessageBox", "2706", "message"), WPFMessageBoxButtons.Ok); } else { this.ParentPage.NewestEntries.Clear(); foreach (RouteTimeTableEntry entry in rt.Entries) { this.ParentPage.Entries[route].Add(entry); this.ParentPage.NewestEntries.Add(entry); } } this.ParentPage.showFlights(); }
//adds entries for a specific destination and time for each day of the week assigned to an airliner public void AddDailyEntries(RouteEntryDestination destination, TimeSpan time, FleetAirliner airliner) { foreach (DayOfWeek day in Enum.GetValues(typeof (DayOfWeek))) { var entry = new RouteTimeTableEntry(this, day, time, destination) {Airliner = airliner}; Entries.Add(entry); } }
//adds entries for a specific destination and for each weekday of the week assinged to an airliner public void AddWeekDailyEntries(RouteEntryDestination destination, TimeSpan time) { foreach (DayOfWeek day in Enum.GetValues(typeof (DayOfWeek))) { if (day != DayOfWeek.Saturday && day != DayOfWeek.Sunday) { var entry = new RouteTimeTableEntry(this, day, time, destination) {Airliner = null}; Entries.Add(entry); } } }
private void btnAdd_Click(object sender, RoutedEventArgs e) { ComboBoxItem item = (ComboBoxItem)cbRoute.SelectedItem; Route route = ((KeyValuePair <Route, Airport>)item.Tag).Key; Airport airport = ((KeyValuePair <Route, Airport>)item.Tag).Value; TimeSpan time = new TimeSpan(tpTime.Value.Value.Hour, tpTime.Value.Value.Minute, 0); string day = cbDay.SelectedItem.ToString(); if (!this.Entries.ContainsKey(route)) { this.Entries.Add(route, new List <RouteTimeTableEntry>()); } string flightCode = cbFlightCode.SelectedItem.ToString(); if (day == "Daily") { Boolean showMessageBoxOnError = true; foreach (DayOfWeek dayOfWeek in Enum.GetValues(typeof(DayOfWeek))) { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, dayOfWeek, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; if (isRouteEntryValid(entry, showMessageBoxOnError)) { this.Entries[route].Add(entry); } else { showMessageBoxOnError = false; } } } else { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, (DayOfWeek)cbDay.SelectedItem, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; if (isRouteEntryValid(entry, true)) { this.Entries[route].Add(entry); } } showFlights(); }
//checks if an entry is in occupied slot public static Boolean IsRouteEntryInOccupied(RouteTimeTableEntry entry, FleetAirliner airliner) { var occupiedSlots1 = AirportHelpers.GetOccupiedSlotTimes(entry.DepartureAirport, airliner.Airliner.Airline); var occupiedSlots2 = AirportHelpers.GetOccupiedSlotTimes(entry.Destination.Airport, airliner.Airliner.Airline); TimeSpan gateTimeBefore = new TimeSpan(0, 15, 0); TimeSpan gateTimeAfter = new TimeSpan(0, 15, 0); TimeSpan entryTakeoffTime = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); TimeSpan entryLandingTime = entryTakeoffTime.Add(entry.TimeTable.Route.getFlightTime(entry.Airliner.Airliner.Type)); if (entryLandingTime.Days > 6) { entryLandingTime = new TimeSpan(0, entryLandingTime.Hours, entryLandingTime.Minutes, entryLandingTime.Seconds); } TimeSpan entryStartTakeoffTime = entryTakeoffTime.Subtract(gateTimeBefore); TimeSpan entryEndTakeoffTime = entryTakeoffTime.Add(gateTimeAfter); TimeSpan tTakeoffTime = new TimeSpan(entryStartTakeoffTime.Days, entryStartTakeoffTime.Hours, (entryStartTakeoffTime.Minutes / 15) * 15, 0); while (tTakeoffTime < entryEndTakeoffTime) { if (occupiedSlots1.Contains(tTakeoffTime)) { return(true); } tTakeoffTime = tTakeoffTime.Add(new TimeSpan(0, 15, 0)); } TimeSpan entryStartLandingTime = entryLandingTime.Subtract(gateTimeBefore); TimeSpan entryEndLandingTime = entryLandingTime.Add(gateTimeAfter); TimeSpan tLandingTime = new TimeSpan(entryStartLandingTime.Days, entryStartLandingTime.Hours, (entryStartLandingTime.Minutes / 15) * 15, 0); while (tLandingTime < entryEndLandingTime) { if (occupiedSlots2.Contains(tLandingTime)) { return(true); } tLandingTime = tLandingTime.Add(new TimeSpan(0, 15, 0)); } return(false); }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { RouteTimeTableEntry e = (RouteTimeTableEntry)value; TimeSpan flightTime = e.TimeTable.Route.getFlightTime(e.Airliner.Airliner.Type); Airport airport = parameter.ToString() == "D" ? e.DepartureAirport : e.Destination.Airport; TimeSpan time = parameter.ToString() == "D" ? e.Time : e.Time.Add(flightTime); string timezone = parameter.ToString() == "D" ? e.DepartureAirport.Profile.TimeZone.ShortName : e.Destination.Airport.Profile.TimeZone.ShortName; TimeSpan localTime = MathHelpers.ConvertTimeSpanToLocalTime(time, airport.Profile.TimeZone); return(string.Format("{0} {1}", new TimeSpanConverter().Convert(MathHelpers.ConvertTimeSpanToLocalTime(time, airport.Profile.TimeZone)), timezone)); }
//simulates a flight with stopovers private static void SimulateStopoverFlight(RouteTimeTableEntry mainEntry) { //List<Route> routes = mainEntry.TimeTable.Route.Stopovers.SelectMany(s => s.Legs).ToList(); //Boolean isInbound = mainEntry.DepartureAirport == mainEntry.TimeTable.Route.Destination2; SimulateFlight(mainEntry); /* * if (isInbound) * routes.Reverse(); * TimeSpan time = mainEntry.Time; * * * foreach (Route route in routes) * { * RouteTimeTable timetable = new RouteTimeTable(route); * * //inbound * if (isInbound) * { * RouteTimeTableEntry entry = new RouteTimeTableEntry(timetable, mainEntry.Day, time, new RouteEntryDestination(route.Destination1, mainEntry.Destination.FlightCode)); * * time = entry.TimeTable.Route.getFlightTime(mainEntry.Airliner.Airliner.Type).Add(RouteTimeTable.MinTimeBetweenFlights); //getFlightTime ( 737-900ER SBY-BOS-CPH-AAR) * entry.Airliner = mainEntry.Airliner; * entry.MainEntry = mainEntry; * * SimulateFlight(entry); * } * //outbound * else * { * RouteTimeTableEntry entry = new RouteTimeTableEntry(timetable, mainEntry.Day, time, new RouteEntryDestination(route.Destination2, mainEntry.Destination.FlightCode)); * entry.Airliner = mainEntry.Airliner; * entry.MainEntry = mainEntry; * * time = time.Add(entry.TimeTable.Route.getFlightTime(mainEntry.Airliner.Airliner.Type)).Add(RouteTimeTable.MinTimeBetweenFlights); * * SimulateFlight(entry); * } * * * * } */ }
//checks if an entry is in occupied slot public static Boolean IsRouteEntryInOccupied(RouteTimeTableEntry entry, FleetAirliner airliner) { var occupiedSlots1 = AirportHelpers.GetOccupiedSlotTimes(entry.DepartureAirport, airliner.Airliner.Airline); var occupiedSlots2 = AirportHelpers.GetOccupiedSlotTimes(entry.Destination.Airport, airliner.Airliner.Airline); TimeSpan gateTimeBefore = new TimeSpan(0, 15, 0); TimeSpan gateTimeAfter = new TimeSpan(0, 15, 0); TimeSpan entryTakeoffTime = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); TimeSpan entryLandingTime = entryTakeoffTime.Add(entry.TimeTable.Route.getFlightTime(entry.Airliner.Airliner.Type)); if (entryLandingTime.Days > 6) entryLandingTime = new TimeSpan(0, entryLandingTime.Hours, entryLandingTime.Minutes, entryLandingTime.Seconds); TimeSpan entryStartTakeoffTime = entryTakeoffTime.Subtract(gateTimeBefore); TimeSpan entryEndTakeoffTime = entryTakeoffTime.Add(gateTimeAfter); TimeSpan tTakeoffTime = new TimeSpan(entryStartTakeoffTime.Days, entryStartTakeoffTime.Hours, (entryStartTakeoffTime.Minutes / 15) * 15, 0); while (tTakeoffTime < entryEndTakeoffTime) { if (occupiedSlots1.Contains(tTakeoffTime)) return true; tTakeoffTime = tTakeoffTime.Add(new TimeSpan(0, 15, 0)); } TimeSpan entryStartLandingTime = entryLandingTime.Subtract(gateTimeBefore); TimeSpan entryEndLandingTime = entryLandingTime.Add(gateTimeAfter); TimeSpan tLandingTime = new TimeSpan(entryStartLandingTime.Days, entryStartLandingTime.Hours, (entryStartLandingTime.Minutes / 15) * 15, 0); while (tLandingTime < entryEndLandingTime) { if (occupiedSlots2.Contains(tLandingTime)) return true; tLandingTime = tLandingTime.Add(new TimeSpan(0, 15, 0)); } return false; }
//converts a route time table entry to datetime public static DateTime ConvertEntryToDate(RouteTimeTableEntry entry) { return(ConvertEntryToDate(entry, 0)); /* * int currentDay = (int)GameObject.GetInstance().GameTime.DayOfWeek; * if (GameObject.GetInstance().GameTime.DayOfWeek > entry.Day) * currentDay -= 7; * * int daysBetween = Math.Abs((int)entry.Day - currentDay); * * if (daysBetween == 0 && new TimeSpan(GameObject.GetInstance().GameTime.Hour,GameObject.GetInstance().GameTime.Minute,0) > new TimeSpan(entry.Time.Hours,entry.Time.Minutes,0)) * { * daysBetween = 7; * } * * DateTime flightTime = new DateTime(GameObject.GetInstance().GameTime.Year, GameObject.GetInstance().GameTime.Month, GameObject.GetInstance().GameTime.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds).AddDays(daysBetween); * * * return flightTime; * */ }
private void txtFlightEntry_MouseDown(object sender, MouseButtonEventArgs e) { if (e.RightButton == MouseButtonState.Pressed && this.IsEditable) { RouteTimeTableEntry entry = (RouteTimeTableEntry)((TextBlock)sender).Tag; if (this.Entries.ContainsKey(entry.TimeTable.Route) && this.Entries[entry.TimeTable.Route].Find(te => te == entry) != null) { this.Entries[entry.TimeTable.Route].Remove(entry); } else { if (!this.EntriesToDelete.ContainsKey(entry.TimeTable.Route)) { this.EntriesToDelete.Add(entry.TimeTable.Route, new List <RouteTimeTableEntry>()); } this.EntriesToDelete[entry.TimeTable.Route].Add(entry); } showFlights(); } }
//converts a route time table entry to datetime with a max minutes before moving a week ahead public static DateTime ConvertEntryToDate(RouteTimeTableEntry entry, int maxMinutes) { int currentDay = (int)GameObject.GetInstance().GameTime.DayOfWeek; int entryDay = (int)entry.Day + entry.Time.Days; if (currentDay > entryDay) { currentDay -= 7; } int daysBetween = Math.Abs(entryDay - currentDay); if (daysBetween == 0 && new TimeSpan(GameObject.GetInstance().GameTime.Hour, GameObject.GetInstance().GameTime.Minute, 0) > new TimeSpan(entry.Time.Hours, entry.Time.Minutes, 0).Add(new TimeSpan(0, maxMinutes, 0))) { daysBetween = 7; } DateTime flightTime = new DateTime(GameObject.GetInstance().GameTime.Year, GameObject.GetInstance().GameTime.Month, GameObject.GetInstance().GameTime.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds).AddDays(daysBetween); return(flightTime); }
public static List <RouteTimeTableEntry> GetAirportArrivals(Airport airport, int count) { List <RouteTimeTableEntry> entries = new List <RouteTimeTableEntry>(); foreach (Route route in AirportHelpers.GetAirportRoutes(airport)) { if (route.HasAirliner && route.getCurrentAirliner() != null) { RouteTimeTableEntry entry = route.getCurrentAirliner().CurrentFlight == null?route.TimeTable.getNextEntry(GameObject.GetInstance().GameTime, (airport == route.Destination1 ? route.Destination2 : route.Destination1)) : route.getCurrentAirliner().CurrentFlight.Entry; for (int i = 0; i < route.TimeTable.Entries.Count; i++) { if (entry.Destination.Airport == airport) { entries.Add(entry); } entry = route.TimeTable.getNextEntry(entry); } } } entries.Sort(delegate(RouteTimeTableEntry e1, RouteTimeTableEntry e2) { return(MathHelpers.ConvertEntryToDate(e1).CompareTo(MathHelpers.ConvertEntryToDate(e2))); }); return(entries.GetRange(0, Math.Min(entries.Count, count))); }
public Flight(RouteTimeTableEntry entry) { Entry = entry; if (Entry.TimeTable.Route.Type == Route.RouteType.Passenger || Entry.TimeTable.Route.Type == Route.RouteType.Mixed || Entry.TimeTable.Route.Type == Route.RouteType.Helicopter) { Classes = new List<FlightAirlinerClass>(); if (Entry != null) { Airliner = Entry.Airliner; FlightTime = MathHelpers.ConvertEntryToDate(Entry); ScheduledFlightTime = FlightTime; } IsOnTime = true; } if (Entry.TimeTable.Route.Type == Route.RouteType.Cargo || Entry.TimeTable.Route.Type == Route.RouteType.Mixed) { if (Entry != null) { Airliner = Entry.Airliner; FlightTime = MathHelpers.ConvertEntryToDate(Entry); ScheduledFlightTime = FlightTime; } IsOnTime = true; } DistanceToDestination = MathHelpers.GetDistance( Entry.Destination.Airport.Profile.Coordinates.ConvertToGeoCoordinate(), Entry.DepartureAirport.Profile.Coordinates.ConvertToGeoCoordinate()); }
//returns the previous entry before a specific entry private static RouteTimeTableEntry GetPreviousEntry(RouteTimeTableEntry entry, FleetAirliner airliner, Dictionary <Route, List <RouteTimeTableEntry> > entries, Dictionary <Route, List <RouteTimeTableEntry> > entriesToDelete) { TimeSpan tsEntry = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); DayOfWeek eDay = entry.Day; int counter = 0; while (counter < 7) { List <RouteTimeTableEntry> tEntries = airliner.Routes.SelectMany(r => r.TimeTable.Entries.FindAll(e => e.Airliner == airliner && e.Day == eDay)).ToList(); tEntries.AddRange(entries.Keys.SelectMany(r => entries[r].FindAll(e => e.Day == eDay))); tEntries.RemoveAll(e => entriesToDelete.Keys.SelectMany(r => entriesToDelete[r]).ToList().Find(te => te == e) == e); tEntries = (from e in tEntries orderby e.Time descending select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { TimeSpan ts = new TimeSpan((int)eDay, dEntry.Time.Hours, dEntry.Time.Minutes, dEntry.Time.Seconds); if (ts < tsEntry) { return(dEntry); } } counter++; eDay--; if (((int)eDay) == -1) { eDay = (DayOfWeek)6; tsEntry = new TimeSpan(7, tsEntry.Hours, tsEntry.Minutes, tsEntry.Seconds); } } return(null); }
private static RouteTimeTableEntry GetPreviousEntry(RouteTimeTableEntry entry, FleetAirliner airliner, List<RouteTimeTableEntry> entries) { TimeSpan tsEntry = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); DayOfWeek eDay = entry.Day; int counter = 0; while (counter < 7) { List<RouteTimeTableEntry> tEntries = entries; tEntries = (from e in tEntries orderby e.Time descending select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { TimeSpan ts = new TimeSpan((int)eDay, dEntry.Time.Hours, dEntry.Time.Minutes, dEntry.Time.Seconds); if (ts < tsEntry) return dEntry; } counter++; eDay--; if (((int)eDay) == -1) { eDay = (DayOfWeek)6; tsEntry = new TimeSpan(7, tsEntry.Hours, tsEntry.Minutes, tsEntry.Seconds); } } return null; }
//returns the previous entry before a specific entry private static RouteTimeTableEntry GetPreviousEntry(RouteTimeTableEntry entry, FleetAirliner airliner, Dictionary<Route, List<RouteTimeTableEntry>> entries, Dictionary<Route, List<RouteTimeTableEntry>> entriesToDelete) { TimeSpan tsEntry = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); DayOfWeek eDay = entry.Day; int counter = 0; while (counter < 7) { List<RouteTimeTableEntry> tEntries = airliner.Routes.SelectMany(r => r.TimeTable.Entries.FindAll(e => e.Airliner == airliner && e.Day == eDay)).ToList(); tEntries.AddRange(entries.Keys.SelectMany(r => entries[r].FindAll(e => e.Day == eDay))); tEntries.RemoveAll(e => entriesToDelete.Keys.SelectMany(r => entriesToDelete[r]).ToList().Find(te => te == e) == e); tEntries = (from e in tEntries orderby e.Time descending select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { TimeSpan ts = new TimeSpan((int)eDay, dEntry.Time.Hours, dEntry.Time.Minutes, dEntry.Time.Seconds); if (ts < tsEntry) return dEntry; } counter++; eDay--; if (((int)eDay) == -1) { eDay = (DayOfWeek)6; tsEntry = new TimeSpan(7, tsEntry.Hours, tsEntry.Minutes, tsEntry.Seconds); } } return null; }
//adds an entry to the timetable public void addEntry(RouteTimeTableEntry entry) { this.Entries.Add(entry); }
//adds entries to the planner private void addEntries(List<DayOfWeek> days) { Route route = (Route)cbHomebound.SelectedItem; Airport origin = (Airport)cbOutbound.SelectedItem; Airport airport = route.Destination1 == origin ? route.Destination2 : route.Destination1; TimeSpan time = new TimeSpan(tpTime.Value.Value.Hour, tpTime.Value.Value.Minute, 0); string flightCode = this.Airliner.Airliner.Airline.Profile.IATACode + txtSchedulerFlightNumber.Text; RouteTimeTable rt = new RouteTimeTable(route); foreach (DayOfWeek dayOfWeek in days) { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, dayOfWeek, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; rt.addEntry(entry); } if (!TimeTableHelpers.IsTimeTableValid(rt, this.Airliner, this.Entries.ToList())) WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2706"), Translator.GetInstance().GetString("MessageBox", "2706", "message"), WPFMessageBoxButtons.Ok); else { foreach (RouteTimeTableEntry entry in rt.Entries) { this.Entries.Add(entry); } } }
//simulates a flight private static void SimulateFlight(RouteTimeTableEntry entry) { FleetAirliner airliner = entry.Airliner; if (entry.TimeTable.Route.HasStopovers || airliner.CurrentFlight is StopoverFlight) { if (airliner.CurrentFlight == null || ((StopoverFlight)airliner.CurrentFlight).IsLastTrip) airliner.CurrentFlight = new StopoverFlight(entry); ((StopoverFlight)airliner.CurrentFlight).setNextEntry(); } else airliner.CurrentFlight = new Flight(entry); KeyValuePair<FleetAirlinerHelpers.DelayType, int> delayedMinutes = FleetAirlinerHelpers.GetDelayedMinutes(airliner); //cancelled/delay if (delayedMinutes.Value >= Convert.ToInt16(airliner.Airliner.Airline.getAirlinePolicy("Cancellation Minutes").PolicyValue)) { if (airliner.Airliner.Airline.IsHuman) { Flight flight = airliner.CurrentFlight; switch (delayedMinutes.Key) { case FleetAirlinerHelpers.DelayType.Airliner_problems: GameObject.GetInstance().NewsBox.addNews(new News(News.NewsType.Flight_News, GameObject.GetInstance().GameTime, Translator.GetInstance().GetString("News", "1004"), string.Format(Translator.GetInstance().GetString("News", "1004", "message"), flight.Entry.Destination.FlightCode, flight.Entry.DepartureAirport.Profile.IATACode, flight.Entry.Destination.Airport.Profile.IATACode))); break; case FleetAirlinerHelpers.DelayType.Bad_weather: GameObject.GetInstance().NewsBox.addNews(new News(News.NewsType.Flight_News, GameObject.GetInstance().GameTime, Translator.GetInstance().GetString("News", "1005"), string.Format(Translator.GetInstance().GetString("News", "1005", "message"), flight.Entry.Destination.FlightCode, flight.Entry.DepartureAirport.Profile.IATACode, flight.Entry.Destination.Airport.Profile.IATACode))); break; } } airliner.Airliner.Airline.Statistics.addStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellations"), 1); double cancellationPercent = airliner.Airliner.Airline.Statistics.getStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellations")) / (airliner.Airliner.Airline.Statistics.getStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Arrivals")) + airliner.Airliner.Airline.Statistics.getStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellations"))); airliner.Airliner.Airline.Statistics.setStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellation%"), cancellationPercent * 100); airliner.CurrentFlight = null; } else { airliner.CurrentFlight.addDelayMinutes(delayedMinutes.Value); if (airliner.CurrentFlight.Entry.MainEntry == null) { if (airliner.CurrentFlight.isPassengerFlight()) { var classes = new List<AirlinerClass>(airliner.Airliner.Classes); foreach (AirlinerClass aClass in classes) { airliner.CurrentFlight.Classes.Add(new FlightAirlinerClass(((PassengerRoute)airliner.CurrentFlight.Entry.TimeTable.Route).getRouteAirlinerClass(aClass.Type), PassengerHelpers.GetFlightPassengers(airliner, aClass.Type))); //airliner.CurrentFlight.Classes.Add(new FlightAirlinerClass(((PassengerRoute)airliner.CurrentFlight.Entry.TimeTable.Route).getRouteAirlinerClass(aClass.Type),0)); } } if (airliner.CurrentFlight.isCargoFlight()) airliner.CurrentFlight.Cargo = PassengerHelpers.GetFlightCargo(airliner); } //SetTakeoffStatistics(airliner); if (airliner.CurrentFlight.ExpectedLanding.ToShortDateString() == GameObject.GetInstance().GameTime.ToShortDateString()) SimulateLanding(airliner); } }
//checks if an entry is valid private static Boolean IsRouteEntryValid(RouteTimeTableEntry entry, FleetAirliner airliner, List <RouteTimeTableEntry> entries, Boolean withSlots) { TimeSpan flightTime = entry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan startTime = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); TimeSpan endTime = startTime.Add(flightTime); if (endTime.Days == 7) { endTime = new TimeSpan(0, endTime.Hours, endTime.Minutes, endTime.Seconds); } List <RouteTimeTableEntry> airlinerEntries = entries; if (withSlots) { if (IsRouteEntryInOccupied(entry, airliner)) { return(false); } } // airlinerEntries.AddRange(entry.TimeTable.Entries.FindAll(e => e.Destination.Airport == entry.Destination.Airport)); foreach (RouteTimeTableEntry e in airlinerEntries) { TimeSpan eStartTime = new TimeSpan((int)e.Day, e.Time.Hours, e.Time.Minutes, e.Time.Seconds); TimeSpan eFlightTime = e.TimeTable.Route.getFlightTime(airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan eEndTime = eStartTime.Add(eFlightTime); double diffStartTime = Math.Abs(eStartTime.Subtract(startTime).TotalMinutes); double diffEndTime = Math.Abs(eEndTime.Subtract(endTime).TotalMinutes); if (eEndTime.Days == 7) { eEndTime = new TimeSpan(0, eEndTime.Hours, eEndTime.Minutes, eEndTime.Seconds); } if ((eStartTime >= startTime && endTime >= eStartTime) || (eEndTime >= startTime && endTime >= eEndTime) || (endTime >= eStartTime && eEndTime >= endTime) || (startTime >= eStartTime && eEndTime >= startTime)) { if (e.Airliner == airliner || diffEndTime < 15 || diffStartTime < 15) { return(false); } } } double minutesPerWeek = 7 * 24 * 60; RouteTimeTableEntry nextEntry = GetNextEntry(entry, airliner, entries); RouteTimeTableEntry previousEntry = GetPreviousEntry(entry, airliner, entries); if (nextEntry != null && previousEntry != null) { TimeSpan flightTimeNext = MathHelpers.GetFlightTime(entry.Destination.Airport.Profile.Coordinates, nextEntry.DepartureAirport.Profile.Coordinates, airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan flightTimePrevious = MathHelpers.GetFlightTime(entry.DepartureAirport.Profile.Coordinates, previousEntry.Destination.Airport.Profile.Coordinates, airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan prevDate = new TimeSpan((int)previousEntry.Day, previousEntry.Time.Hours, previousEntry.Time.Minutes, previousEntry.Time.Seconds); TimeSpan nextDate = new TimeSpan((int)nextEntry.Day, nextEntry.Time.Hours, nextEntry.Time.Minutes, nextEntry.Time.Seconds); TimeSpan currentDate = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); double timeToNext = currentDate.Subtract(nextDate).TotalMinutes > 0 ? minutesPerWeek - currentDate.Subtract(nextDate).TotalMinutes : Math.Abs(currentDate.Subtract(nextDate).TotalMinutes); double timeFromPrev = prevDate.Subtract(currentDate).TotalMinutes > 0 ? minutesPerWeek - prevDate.Subtract(currentDate).TotalMinutes : Math.Abs(prevDate.Subtract(currentDate).TotalMinutes); if (timeFromPrev > previousEntry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).TotalMinutes + flightTimePrevious.TotalMinutes && timeToNext > entry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).TotalMinutes + flightTimeNext.TotalMinutes) { return(true); } else { return(false); } } else { return(true); } }
private void EntryChanged_Event(object sender, RoutedEventArgs e) { var entries = e.OriginalSource as object[]; var oldEntry = entries[0] as TimelineEntry; var newEntry = entries[1] as TimelineEntry; var oEntry = (RouteTimeTableEntry)oldEntry.Source; var rt = new RouteTimeTable(oEntry.TimeTable.Route); var nEntry = new RouteTimeTableEntry( rt, (DayOfWeek)newEntry.StartTime.Days, newEntry.StartTime, oEntry.Destination); nEntry.Airliner = Airliner; rt.AddEntry(nEntry); var tEntries = new List<RouteTimeTableEntry>(Entries); tEntries.Remove(oEntry); if (!TimeTableHelpers.IsTimeTableValid(rt, Airliner, tEntries)) { WPFMessageBox.Show( Translator.GetInstance().GetString("MessageBox", "2706"), Translator.GetInstance().GetString("MessageBox", "2706", "message"), WPFMessageBoxButtons.Ok); } else { Entries.Remove(oEntry); Entries.Add(nEntry); } }
public static Boolean IsTimeTableValid(RouteTimeTableEntry entry, FleetAirliner airliner, Dictionary <Route, List <RouteTimeTableEntry> > entries, Boolean withSlots = true) { return(IsRouteEntryValid(entry, airliner, entries, new Dictionary <Route, List <RouteTimeTableEntry> >(), withSlots)); }
//checks if an entry is valid private Boolean isRouteEntryValid(RouteTimeTableEntry entry, Boolean showMessageBoxOnError) { TimeSpan flightTime = entry.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan startTime = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); TimeSpan endTime = startTime.Add(flightTime); if (endTime.Days == 7) endTime = new TimeSpan(0, endTime.Hours, endTime.Minutes, endTime.Seconds); List<RouteTimeTableEntry> airlinerEntries = this.Airliner.Routes.SelectMany(r => r.TimeTable.Entries.FindAll(e => e.Airliner == this.Airliner)).ToList(); airlinerEntries.AddRange(this.Entries.Keys.SelectMany(r => this.Entries[r])); //var deletable = this.EntriesToDelete.Keys.SelectMany(r => this.Entries.ContainsKey(r) ? this.Entries[r] : null); List<RouteTimeTableEntry> deletable = new List<RouteTimeTableEntry>(); deletable.AddRange(this.EntriesToDelete.Keys.SelectMany(r => this.EntriesToDelete[r])); foreach (Route route in this.EntriesToDelete.Keys) { if (this.Entries.ContainsKey(route)) deletable.AddRange(this.Entries[route]); } foreach (RouteTimeTableEntry e in deletable) if (airlinerEntries.Contains(e)) airlinerEntries.Remove(e); airlinerEntries.AddRange(entry.TimeTable.Entries.FindAll(e => e.Destination.Airport == entry.Destination.Airport)); foreach (RouteTimeTableEntry e in airlinerEntries) { TimeSpan eStartTime = new TimeSpan((int)e.Day, e.Time.Hours, e.Time.Minutes, e.Time.Seconds); TimeSpan eFlightTime = e.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan eEndTime = eStartTime.Add(eFlightTime); double diffStartTime = Math.Abs(eStartTime.Subtract(startTime).TotalMinutes); double diffEndTime = Math.Abs(eEndTime.Subtract(endTime).TotalMinutes); if (eEndTime.Days == 7) eEndTime = new TimeSpan(0, eEndTime.Hours, eEndTime.Minutes, eEndTime.Seconds); if ((eStartTime >= startTime && endTime >= eStartTime) || (eEndTime >= startTime && endTime >= eEndTime) || (endTime >= eStartTime && eEndTime >= endTime) || (startTime >= eStartTime && eEndTime >= startTime)) { if (e.Airliner == this.Airliner || diffEndTime < 15 || diffStartTime < 15) { if (showMessageBoxOnError) { if (e.Airliner == this.Airliner) WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2702"), string.Format(Translator.GetInstance().GetString("MessageBox", "2702", "message")), WPFMessageBoxButtons.Ok); else { WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2703"), string.Format(Translator.GetInstance().GetString("MessageBox", "2703", "message")), WPFMessageBoxButtons.Ok); } } return false; } } } double minutesPerWeek = 7 * 24 * 60; RouteTimeTableEntry nextEntry = getNextEntry(entry); RouteTimeTableEntry previousEntry = getPreviousEntry(entry); if (nextEntry != null && previousEntry != null) { TimeSpan flightTimeNext = MathHelpers.GetFlightTime(entry.Destination.Airport.Profile.Coordinates, nextEntry.DepartureAirport.Profile.Coordinates, this.Airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan flightTimePrevious = MathHelpers.GetFlightTime(entry.DepartureAirport.Profile.Coordinates, previousEntry.Destination.Airport.Profile.Coordinates, this.Airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan prevDate = new TimeSpan((int)previousEntry.Day, previousEntry.Time.Hours, previousEntry.Time.Minutes, previousEntry.Time.Seconds); TimeSpan nextDate = new TimeSpan((int)nextEntry.Day, nextEntry.Time.Hours, nextEntry.Time.Minutes, nextEntry.Time.Seconds); TimeSpan currentDate = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); double timeToNext = currentDate.Subtract(nextDate).TotalMinutes > 0 ? minutesPerWeek - currentDate.Subtract(nextDate).TotalMinutes : Math.Abs(currentDate.Subtract(nextDate).TotalMinutes); double timeFromPrev = prevDate.Subtract(currentDate).TotalMinutes > 0 ? minutesPerWeek - prevDate.Subtract(currentDate).TotalMinutes : Math.Abs(prevDate.Subtract(currentDate).TotalMinutes); if (timeFromPrev > previousEntry.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).TotalMinutes + flightTimePrevious.TotalMinutes && timeToNext > entry.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).TotalMinutes + flightTimeNext.TotalMinutes) return true; else { if (showMessageBoxOnError) WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2704"), string.Format(Translator.GetInstance().GetString("MessageBox", "2704", "message")), WPFMessageBoxButtons.Ok); return false; } } else return true; }
//adds an entry to the configuration public void AddEntry(RouteTimeTableEntry entry) { Entries.Add(entry); }
private void btnAdd_Click(object sender, RoutedEventArgs e) { ComboBoxItem item = (ComboBoxItem)cbRoute.SelectedItem; Route route = ((KeyValuePair<Route, Airport>)item.Tag).Key; Airport airport = ((KeyValuePair<Route, Airport>)item.Tag).Value; TimeSpan time = new TimeSpan(tpTime.Value.Value.Hour, tpTime.Value.Value.Minute, 0); string day = cbDay.SelectedItem.ToString(); if (!this.Entries.ContainsKey(route)) this.Entries.Add(route, new List<RouteTimeTableEntry>()); string flightCode = cbFlightCode.SelectedItem.ToString(); if (day == "Daily") { Boolean showMessageBoxOnError = true; foreach (DayOfWeek dayOfWeek in Enum.GetValues(typeof(DayOfWeek))) { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, dayOfWeek, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; if (isRouteEntryValid(entry, showMessageBoxOnError)) this.Entries[route].Add(entry); else showMessageBoxOnError = false; } } else { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, (DayOfWeek)cbDay.SelectedItem, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; if (isRouteEntryValid(entry, true)) this.Entries[route].Add(entry); } showFlights(); }
//loads a route private static Route LoadRoute(XmlElement routeNode, Airline airline, Route.RouteType routetype = Route.RouteType.Passenger) { string id = routeNode.Attributes["id"].Value; Airport dest1 = Airports.GetAirport(routeNode.Attributes["destination1"].Value); Airport dest2 = Airports.GetAirport(routeNode.Attributes["destination2"].Value); Boolean isBanned = Convert.ToBoolean(routeNode.Attributes["isbanned"].Value); if (routeNode.HasAttribute("type")) routetype = (Route.RouteType)Enum.Parse(typeof(Route.RouteType), routeNode.Attributes["type"].Value); Route route; if (routetype == Route.RouteType.Passenger || routetype == Route.RouteType.Mixed) route = new PassengerRoute(id, dest1, dest2, DateTime.Now,0); else route = new CargoRoute(id, dest1, dest2, DateTime.Now,0); route.Banned = isBanned; /* foreach (StopoverRoute stopover in route.Stopovers) { XmlElement routeStopoverNode = xmlDoc.CreateElement("stopover"); routeStopoverNode.SetAttribute("airport", stopover.Stopover.Profile.ID); XmlElement stopoverLegsNode = xmlDoc.CreateElement("legs"); foreach (Route leg in stopover.Legs) { XmlElement stopoverLegNode = xmlDoc.CreateElement("leg"); stopoverLegNode.AppendChild(SaveRoute(xmlDoc, leg)); stopoverLegsNode.AppendChild(stopoverLegNode); } routeStopoverNode.AppendChild(stopoverLegsNode); routeStopoversNode.AppendChild(routeStopoverNode);*/ XmlNodeList routeStopoverList = routeNode.SelectNodes("stopovers/stopover"); foreach (XmlElement routeStopoverNode in routeStopoverList) { Airport stopoverAirport = Airports.GetAirportFromID(routeStopoverNode.Attributes["airport"].Value); StopoverRoute stopoverRoute = new StopoverRoute(stopoverAirport); XmlNodeList legsList = routeStopoverNode.SelectNodes("legs/leg"); foreach (XmlElement legNode in legsList) { stopoverRoute.addLeg(LoadRoute((XmlElement)legNode.SelectSingleNode("route"), airline, routetype)); } route.addStopover(stopoverRoute); } if (routetype == Route.RouteType.Passenger || routetype == Route.RouteType.Mixed) { ((PassengerRoute)route).Classes.Clear(); XmlNodeList routeClassList = routeNode.SelectNodes("routeclasses/routeclass"); foreach (XmlElement routeClassNode in routeClassList) { AirlinerClass.ClassType airlinerClassType = (AirlinerClass.ClassType)Enum.Parse(typeof(AirlinerClass.ClassType), routeClassNode.Attributes["type"].Value); double fareprice = Convert.ToDouble(routeClassNode.Attributes["fareprice"].Value,new CultureInfo("de-DE", false)); RouteAirlinerClass.SeatingType seatingType = (RouteAirlinerClass.SeatingType)Enum.Parse(typeof(RouteAirlinerClass.SeatingType), routeClassNode.Attributes["seating"].Value); RouteAirlinerClass rClass = new RouteAirlinerClass(airlinerClassType, RouteAirlinerClass.SeatingType.Reserved_Seating, fareprice); rClass.Seating = seatingType; foreach (RouteFacility.FacilityType ftype in Enum.GetValues(typeof(RouteFacility.FacilityType))) { if (routeClassNode.HasAttribute(ftype.ToString())) { RouteFacility facility = RouteFacilities.GetFacility(routeClassNode.Attributes[ftype.ToString()].Value); rClass.addFacility(facility); } } ((PassengerRoute)route).addRouteAirlinerClass(rClass); } } if (routetype == Route.RouteType.Mixed || routetype == Route.RouteType.Cargo) { XmlElement routeCargoNode = (XmlElement)routeNode.SelectSingleNode("cargo"); double unitPrice = Convert.ToDouble(routeCargoNode.Attributes["priceperunit"].Value,new CultureInfo("de-DE", false)); ((CargoRoute)route).PricePerUnit = unitPrice; } RouteTimeTable timeTable = new RouteTimeTable(route); XmlNodeList timetableList = routeNode.SelectNodes("timetable/timetableentry"); foreach (XmlElement entryNode in timetableList) { Airport entryDest = Airports.GetAirport(entryNode.Attributes["destination"].Value); string flightCode = entryNode.Attributes["flightcode"].Value; DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), entryNode.Attributes["day"].Value); TimeSpan time = TimeSpan.Parse(entryNode.Attributes["time"].Value); FleetAirliner airliner = entryNode.Attributes["airliner"].Value == "-" ? null : airline.Fleet.Find(a => a.Airliner.ID == entryNode.Attributes["airliner"].Value); ; RouteTimeTableEntry entry = new RouteTimeTableEntry(timeTable, day, time, new RouteEntryDestination(entryDest, flightCode,null),null); if (entryNode.HasAttribute("id")) entry.ID = entryNode.Attributes["id"].Value; if (entryNode.HasAttribute("mainentry")) entry.MainEntry = airline.Routes.SelectMany(r => r.TimeTable.Entries).ToList().Find(e => e.ID == entryNode.Attributes["mainentry"].Value); entry.Airliner = airliner; if (airliner != null && !airliner.Routes.Contains(route)) airliner.Routes.Add(route); timeTable.addEntry(entry); } route.TimeTable = timeTable; XmlNodeList routeInvoiceList = routeNode.SelectNodes("invoices/invoice"); foreach (XmlElement routeInvoiceNode in routeInvoiceList) { Invoice.InvoiceType type = (Invoice.InvoiceType)Enum.Parse(typeof(Invoice.InvoiceType), routeInvoiceNode.Attributes["type"].Value); int invoiceYear = Convert.ToInt16(routeInvoiceNode.Attributes["year"].Value); int invoiceMonth = Convert.ToInt16(routeInvoiceNode.Attributes["month"].Value); double invoiceAmount = Convert.ToDouble(routeInvoiceNode.Attributes["amount"].Value, new CultureInfo("de-DE", false)); route.setRouteInvoice(type, invoiceYear, invoiceMonth, invoiceAmount); } return route; }
private void btnAdd_Click(object sender, RoutedEventArgs e) { ComboBoxItem item = (ComboBoxItem)cbDestination.SelectedItem; Route route = (Route)item.Tag; Airport airport = (Airport)item.Content; TimeSpan time = new TimeSpan(tpTime.Value.Value.Hour, tpTime.Value.Value.Minute, 0); string day = cbDay.SelectedItem.ToString(); if (!this.ParentPage.Entries.ContainsKey(route)) this.ParentPage.Entries.Add(route, new List<RouteTimeTableEntry>()); string flightCode = cbFlightCode.SelectedItem.ToString(); RouteTimeTable rt = new RouteTimeTable(route); if (day == "Daily") { foreach (DayOfWeek dayOfWeek in Enum.GetValues(typeof(DayOfWeek))) { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, dayOfWeek, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; rt.addEntry(entry); } } else { RouteTimeTableEntry entry = new RouteTimeTableEntry(route.TimeTable, (DayOfWeek)cbDay.SelectedItem, time, new RouteEntryDestination(airport, flightCode)); entry.Airliner = this.Airliner; rt.addEntry(entry); } if (!TimeTableHelpers.IsTimeTableValid(rt, this.Airliner, this.ParentPage.Entries)) WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2706"), Translator.GetInstance().GetString("MessageBox", "2706", "message"), WPFMessageBoxButtons.Ok); else { this.ParentPage.NewestEntries.Clear(); foreach (RouteTimeTableEntry entry in rt.Entries) { this.ParentPage.Entries[route].Add(entry); this.ParentPage.NewestEntries.Add(entry); } } this.ParentPage.showFlights(); }
public static Boolean IsRouteEntryValid(RouteTimeTableEntry entry, FleetAirliner airliner, Dictionary<Route, List<RouteTimeTableEntry>> entries, Dictionary<Route, List<RouteTimeTableEntry>> entriesToDelete, Boolean withSlots) { TimeSpan flightTime = entry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan startTime = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); TimeSpan endTime = startTime.Add(flightTime); if (endTime.Days == 7) endTime = new TimeSpan(0, endTime.Hours, endTime.Minutes, endTime.Seconds); List<RouteTimeTableEntry> airlinerEntries = airliner.Routes.SelectMany(r => r.TimeTable.Entries.FindAll(e => e.Airliner == airliner)).ToList(); airlinerEntries.AddRange(entries.Keys.SelectMany(r => entries[r])); //var deletable = this.EntriesToDelete.Keys.SelectMany(r => this.Entries.ContainsKey(r) ? this.Entries[r] : null); List<RouteTimeTableEntry> deletable = new List<RouteTimeTableEntry>(); deletable.AddRange(entriesToDelete.Keys.SelectMany(r => entriesToDelete[r])); foreach (Route route in entriesToDelete.Keys) { if (entries.ContainsKey(route)) deletable.AddRange(entries[route]); } foreach (RouteTimeTableEntry e in deletable) if (airlinerEntries.Contains(e)) airlinerEntries.Remove(e); if (withSlots) if (IsRouteEntryInOccupied(entry, airliner)) return false; // airlinerEntries.AddRange(entry.TimeTable.Entries.FindAll(e => e.Destination.Airport == entry.Destination.Airport)); foreach (RouteTimeTableEntry e in airlinerEntries) { TimeSpan eStartTime = new TimeSpan((int)e.Day, e.Time.Hours, e.Time.Minutes, e.Time.Seconds); TimeSpan eFlightTime = e.TimeTable.Route.getFlightTime(airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan eEndTime = eStartTime.Add(eFlightTime); double diffStartTime = Math.Abs(eStartTime.Subtract(startTime).TotalMinutes); double diffEndTime = Math.Abs(eEndTime.Subtract(endTime).TotalMinutes); if (eEndTime.Days == 7) eEndTime = new TimeSpan(0, eEndTime.Hours, eEndTime.Minutes, eEndTime.Seconds); if ((eStartTime >= startTime && endTime >= eStartTime) || (eEndTime >= startTime && endTime >= eEndTime) || (endTime >= eStartTime && eEndTime >= endTime) || (startTime >= eStartTime && eEndTime >= startTime)) { if (e.Airliner == airliner || diffEndTime < 15 || diffStartTime < 15) { return false; } } } double minutesPerWeek = 7 * 24 * 60; RouteTimeTableEntry nextEntry = GetNextEntry(entry, airliner, entries, entriesToDelete); RouteTimeTableEntry previousEntry = GetPreviousEntry(entry, airliner, entries, entriesToDelete); if (nextEntry != null && previousEntry != null) { TimeSpan flightTimeNext = MathHelpers.GetFlightTime(entry.Destination.Airport.Profile.Coordinates, nextEntry.DepartureAirport.Profile.Coordinates, airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan flightTimePrevious = MathHelpers.GetFlightTime(entry.DepartureAirport.Profile.Coordinates, previousEntry.Destination.Airport.Profile.Coordinates, airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan prevDate = new TimeSpan((int)previousEntry.Day, previousEntry.Time.Hours, previousEntry.Time.Minutes, previousEntry.Time.Seconds); TimeSpan nextDate = new TimeSpan((int)nextEntry.Day, nextEntry.Time.Hours, nextEntry.Time.Minutes, nextEntry.Time.Seconds); TimeSpan currentDate = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); double timeToNext = currentDate.Subtract(nextDate).TotalMinutes > 0 ? minutesPerWeek - currentDate.Subtract(nextDate).TotalMinutes : Math.Abs(currentDate.Subtract(nextDate).TotalMinutes); double timeFromPrev = prevDate.Subtract(currentDate).TotalMinutes > 0 ? minutesPerWeek - prevDate.Subtract(currentDate).TotalMinutes : Math.Abs(prevDate.Subtract(currentDate).TotalMinutes); if (timeFromPrev > previousEntry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).TotalMinutes + flightTimePrevious.TotalMinutes && timeToNext > entry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).TotalMinutes + flightTimeNext.TotalMinutes) return true; else { return false; } } else return true; }
private void btnSaveContract_Click(Object sender, RoutedEventArgs e) { Route route = (Route)cbSpecialRoute.SelectedItem; RouteTimeTable rtt = new RouteTimeTable(route); RouteTimeTableEntry entry = new RouteTimeTableEntry(rtt, DayOfWeek.Wednesday, new TimeSpan(12, 0, 0), new RouteEntryDestination(route.Destination2, "Charter")); entry.Airliner = Airliner; rtt.AddEntry(entry); route.TimeTable = rtt; Airliner.AddRoute(route); Airliner.Status = FleetAirliner.AirlinerStatus.OnCharter; }
//checks if an entry is valid private Boolean isRouteEntryValid(RouteTimeTableEntry entry, Boolean showMessageBoxOnError) { TimeSpan flightTime = entry.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan startTime = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); TimeSpan endTime = startTime.Add(flightTime); if (endTime.Days == 7) { endTime = new TimeSpan(0, endTime.Hours, endTime.Minutes, endTime.Seconds); } List <RouteTimeTableEntry> airlinerEntries = this.Airliner.Routes.SelectMany(r => r.TimeTable.Entries.FindAll(e => e.Airliner == this.Airliner)).ToList(); airlinerEntries.AddRange(this.Entries.Keys.SelectMany(r => this.Entries[r])); //var deletable = this.EntriesToDelete.Keys.SelectMany(r => this.Entries.ContainsKey(r) ? this.Entries[r] : null); List <RouteTimeTableEntry> deletable = new List <RouteTimeTableEntry>(); deletable.AddRange(this.EntriesToDelete.Keys.SelectMany(r => this.EntriesToDelete[r])); foreach (Route route in this.EntriesToDelete.Keys) { if (this.Entries.ContainsKey(route)) { deletable.AddRange(this.Entries[route]); } } foreach (RouteTimeTableEntry e in deletable) { if (airlinerEntries.Contains(e)) { airlinerEntries.Remove(e); } } airlinerEntries.AddRange(entry.TimeTable.Entries.FindAll(e => e.Destination.Airport == entry.Destination.Airport)); foreach (RouteTimeTableEntry e in airlinerEntries) { TimeSpan eStartTime = new TimeSpan((int)e.Day, e.Time.Hours, e.Time.Minutes, e.Time.Seconds); TimeSpan eFlightTime = e.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan eEndTime = eStartTime.Add(eFlightTime); double diffStartTime = Math.Abs(eStartTime.Subtract(startTime).TotalMinutes); double diffEndTime = Math.Abs(eEndTime.Subtract(endTime).TotalMinutes); if (eEndTime.Days == 7) { eEndTime = new TimeSpan(0, eEndTime.Hours, eEndTime.Minutes, eEndTime.Seconds); } if ((eStartTime >= startTime && endTime >= eStartTime) || (eEndTime >= startTime && endTime >= eEndTime) || (endTime >= eStartTime && eEndTime >= endTime) || (startTime >= eStartTime && eEndTime >= startTime)) { if (e.Airliner == this.Airliner || diffEndTime < 15 || diffStartTime < 15) { if (showMessageBoxOnError) { if (e.Airliner == this.Airliner) { WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2702"), string.Format(Translator.GetInstance().GetString("MessageBox", "2702", "message")), WPFMessageBoxButtons.Ok); } else { WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2703"), string.Format(Translator.GetInstance().GetString("MessageBox", "2703", "message")), WPFMessageBoxButtons.Ok); } } return(false); } } } double minutesPerWeek = 7 * 24 * 60; RouteTimeTableEntry nextEntry = getNextEntry(entry); RouteTimeTableEntry previousEntry = getPreviousEntry(entry); if (nextEntry != null && previousEntry != null) { TimeSpan flightTimeNext = MathHelpers.GetFlightTime(entry.Destination.Airport.Profile.Coordinates, nextEntry.DepartureAirport.Profile.Coordinates, this.Airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan flightTimePrevious = MathHelpers.GetFlightTime(entry.DepartureAirport.Profile.Coordinates, previousEntry.Destination.Airport.Profile.Coordinates, this.Airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(this.Airliner)); TimeSpan prevDate = new TimeSpan((int)previousEntry.Day, previousEntry.Time.Hours, previousEntry.Time.Minutes, previousEntry.Time.Seconds); TimeSpan nextDate = new TimeSpan((int)nextEntry.Day, nextEntry.Time.Hours, nextEntry.Time.Minutes, nextEntry.Time.Seconds); TimeSpan currentDate = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); double timeToNext = currentDate.Subtract(nextDate).TotalMinutes > 0 ? minutesPerWeek - currentDate.Subtract(nextDate).TotalMinutes : Math.Abs(currentDate.Subtract(nextDate).TotalMinutes); double timeFromPrev = prevDate.Subtract(currentDate).TotalMinutes > 0 ? minutesPerWeek - prevDate.Subtract(currentDate).TotalMinutes : Math.Abs(prevDate.Subtract(currentDate).TotalMinutes); if (timeFromPrev > previousEntry.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).TotalMinutes + flightTimePrevious.TotalMinutes && timeToNext > entry.TimeTable.Route.getFlightTime(this.Airliner.Airliner.Type).TotalMinutes + flightTimeNext.TotalMinutes) { return(true); } else { if (showMessageBoxOnError) { WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2704"), string.Format(Translator.GetInstance().GetString("MessageBox", "2704", "message")), WPFMessageBoxButtons.Ok); } return(false); } } else { return(true); } }
private void CreateEntries(RouteTimeTableEntry mainEntry) { List<Route> routes = mainEntry.TimeTable.Route.Stopovers.SelectMany(s => s.Legs).ToList(); TimeSpan time = mainEntry.Time; bool isInbound = mainEntry.DepartureAirport == mainEntry.TimeTable.Route.Destination2; if (isInbound) { routes.Reverse(); } foreach (Route route in routes) { var timetable = new RouteTimeTable(route); RouteTimeTableEntry entry; //inbound if (isInbound) { entry = new RouteTimeTableEntry( timetable, mainEntry.Day, time, new RouteEntryDestination(route.Destination1, mainEntry.Destination.FlightCode)); time = time.Add(entry.TimeTable.Route.GetFlightTime(mainEntry.Airliner.Airliner.Type)) .Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(mainEntry.Airliner)); entry.Airliner = mainEntry.Airliner; entry.MainEntry = mainEntry; } //outbound else { entry = new RouteTimeTableEntry( timetable, mainEntry.Day, time, new RouteEntryDestination(route.Destination2, mainEntry.Destination.FlightCode)) {Airliner = mainEntry.Airliner, MainEntry = mainEntry}; time = time.Add(entry.TimeTable.Route.GetFlightTime(mainEntry.Airliner.Airliner.Type)) .Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(mainEntry.Airliner)); } if (route.Type == Route.RouteType.Passenger || route.Type == Route.RouteType.Mixed) { var classes = new List<FlightAirlinerClass>(); foreach (AirlinerClass aClass in Airliner.Airliner.Classes) { FlightAirlinerClass faClass; if (isInbound) { faClass = new FlightAirlinerClass( ((PassengerRoute) route).GetRouteAirlinerClass(aClass.Type), PassengerHelpers.GetStopoverFlightPassengers( Airliner, aClass.Type, route.Destination2, route.Destination1, routes, true)); } else { faClass = new FlightAirlinerClass( ((PassengerRoute) route).GetRouteAirlinerClass(aClass.Type), PassengerHelpers.GetStopoverFlightPassengers( Airliner, aClass.Type, route.Destination1, route.Destination2, routes, false)); } classes.Add(faClass); } AllClasses.Add(entry, classes); } if (route.Type == Route.RouteType.Cargo || route.Type == Route.RouteType.Mixed) { if (isInbound) { AllCargo.Add( entry, PassengerHelpers.GetStopoverFlightCargo( Airliner, route.Destination2, route.Destination1, routes, true)); } else { AllCargo.Add( entry, PassengerHelpers.GetStopoverFlightCargo( Airliner, route.Destination1, route.Destination2, routes, false)); } } } }
//returns the next entry after a specific entry public RouteTimeTableEntry getNextEntry(RouteTimeTableEntry entry) { DayOfWeek eDay = entry.Day; int counter = 0; while (counter < 7) { List<RouteTimeTableEntry> entries = getEntries(eDay); foreach (RouteTimeTableEntry dEntry in (from e in entries orderby e.Time select e)) { if (!((dEntry.Day == entry.Day && dEntry.Time <= entry.Time)))// && dEntry.Destination != entry.Destination) return dEntry; } counter++; eDay++; if (eDay == (DayOfWeek)7) eDay = (DayOfWeek)0; } return entry; }
//checks if an entry is valid private static Boolean IsRouteEntryValid(RouteTimeTableEntry entry, FleetAirliner airliner, List<RouteTimeTableEntry> entries,Boolean withSlots) { TimeSpan flightTime = entry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan startTime = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); TimeSpan endTime = startTime.Add(flightTime); if (endTime.Days == 7) endTime = new TimeSpan(0, endTime.Hours, endTime.Minutes, endTime.Seconds); List<RouteTimeTableEntry> airlinerEntries = new List<RouteTimeTableEntry>(entries); if (entry.TimeTable.Route.Season == WeatherModel.Weather.Season.Winter) airlinerEntries.RemoveAll(e => e.TimeTable.Route.Season == WeatherModel.Weather.Season.Summer); if (entry.TimeTable.Route.Season == WeatherModel.Weather.Season.Summer) airlinerEntries.RemoveAll(e => e.TimeTable.Route.Season == WeatherModel.Weather.Season.Winter); if (withSlots) if (IsRouteEntryInOccupied(entry, airliner)) return false; // airlinerEntries.AddRange(entry.TimeTable.Entries.FindAll(e => e.Destination.Airport == entry.Destination.Airport)); foreach (RouteTimeTableEntry e in airlinerEntries) { TimeSpan eStartTime = new TimeSpan((int)e.Day, e.Time.Hours, e.Time.Minutes, e.Time.Seconds); TimeSpan eFlightTime = e.TimeTable.Route.getFlightTime(airliner.Airliner.Type).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan eEndTime = eStartTime.Add(eFlightTime); double diffStartTime = Math.Abs(eStartTime.Subtract(startTime).TotalMinutes); double diffEndTime = Math.Abs(eEndTime.Subtract(endTime).TotalMinutes); if (eEndTime.Days == 7) eEndTime = new TimeSpan(0, eEndTime.Hours, eEndTime.Minutes, eEndTime.Seconds); if ((eStartTime >= startTime && endTime >= eStartTime) || (eEndTime >= startTime && endTime >= eEndTime) || (endTime >= eStartTime && eEndTime >= endTime) || (startTime >= eStartTime && eEndTime >= startTime)) { if (e.Airliner == airliner || diffEndTime < 15 || diffStartTime < 15) { return false; } } } double minutesPerWeek = 7 * 24 * 60; RouteTimeTableEntry nextEntry = GetNextEntry(entry, airliner, airlinerEntries); RouteTimeTableEntry previousEntry = GetPreviousEntry(entry, airliner, airlinerEntries); if (nextEntry != null && previousEntry != null) { TimeSpan flightTimeNext = MathHelpers.GetFlightTime(entry.Destination.Airport.Profile.Coordinates.convertToGeoCoordinate(), nextEntry.DepartureAirport.Profile.Coordinates.convertToGeoCoordinate(), airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan flightTimePrevious = MathHelpers.GetFlightTime(entry.DepartureAirport.Profile.Coordinates.convertToGeoCoordinate(), previousEntry.Destination.Airport.Profile.Coordinates.convertToGeoCoordinate(), airliner.Airliner.Type.CruisingSpeed).Add(FleetAirlinerHelpers.GetMinTimeBetweenFlights(airliner)); TimeSpan prevDate = new TimeSpan((int)previousEntry.Day, previousEntry.Time.Hours, previousEntry.Time.Minutes, previousEntry.Time.Seconds); TimeSpan nextDate = new TimeSpan((int)nextEntry.Day, nextEntry.Time.Hours, nextEntry.Time.Minutes, nextEntry.Time.Seconds); TimeSpan currentDate = new TimeSpan((int)entry.Day, entry.Time.Hours, entry.Time.Minutes, entry.Time.Seconds); double timeToNext = currentDate.Subtract(nextDate).TotalMinutes > 0 ? minutesPerWeek - currentDate.Subtract(nextDate).TotalMinutes : Math.Abs(currentDate.Subtract(nextDate).TotalMinutes); double timeFromPrev = prevDate.Subtract(currentDate).TotalMinutes > 0 ? minutesPerWeek - prevDate.Subtract(currentDate).TotalMinutes : Math.Abs(prevDate.Subtract(currentDate).TotalMinutes); if (timeFromPrev > previousEntry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).TotalMinutes + flightTimePrevious.TotalMinutes && timeToNext > entry.TimeTable.Route.getFlightTime(airliner.Airliner.Type).TotalMinutes + flightTimeNext.TotalMinutes) return true; else { return false; } } else return true; }
public static Boolean IsTimeTableValid(RouteTimeTableEntry entry, FleetAirliner airliner, Dictionary<Route, List<RouteTimeTableEntry>> entries, Boolean withSlots = true) { return IsRouteEntryValid(entry, airliner, entries, new Dictionary<Route, List<RouteTimeTableEntry>>(), withSlots); }
//simulates a flight private static void SimulateFlight(RouteTimeTableEntry entry) { FleetAirliner airliner = entry.Airliner; if (entry.TimeTable.Route.HasStopovers || airliner.CurrentFlight is StopoverFlight) { if (airliner.CurrentFlight == null || ((StopoverFlight)airliner.CurrentFlight).IsLastTrip) { airliner.CurrentFlight = new StopoverFlight(entry); } ((StopoverFlight)airliner.CurrentFlight).setNextEntry(); } else { airliner.CurrentFlight = new Flight(entry); } KeyValuePair <FleetAirlinerHelpers.DelayType, int> delayedMinutes = FleetAirlinerHelpers.GetDelayedMinutes(airliner); //cancelled/delay if (delayedMinutes.Value >= Convert.ToInt16(airliner.Airliner.Airline.getAirlinePolicy("Cancellation Minutes").PolicyValue)) { if (airliner.Airliner.Airline.IsHuman) { Flight flight = airliner.CurrentFlight; switch (delayedMinutes.Key) { case FleetAirlinerHelpers.DelayType.Airliner_problems: GameObject.GetInstance().NewsBox.addNews(new News(News.NewsType.Flight_News, GameObject.GetInstance().GameTime, Translator.GetInstance().GetString("News", "1004"), string.Format(Translator.GetInstance().GetString("News", "1004", "message"), flight.Entry.Destination.FlightCode, flight.Entry.DepartureAirport.Profile.IATACode, flight.Entry.Destination.Airport.Profile.IATACode))); break; case FleetAirlinerHelpers.DelayType.Bad_weather: GameObject.GetInstance().NewsBox.addNews(new News(News.NewsType.Flight_News, GameObject.GetInstance().GameTime, Translator.GetInstance().GetString("News", "1005"), string.Format(Translator.GetInstance().GetString("News", "1005", "message"), flight.Entry.Destination.FlightCode, flight.Entry.DepartureAirport.Profile.IATACode, flight.Entry.Destination.Airport.Profile.IATACode))); break; } } airliner.Airliner.Airline.Statistics.addStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellations"), 1); double cancellationPercent = airliner.Airliner.Airline.Statistics.getStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellations")) / (airliner.Airliner.Airline.Statistics.getStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Arrivals")) + airliner.Airliner.Airline.Statistics.getStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellations"))); airliner.Airliner.Airline.Statistics.setStatisticsValue(GameObject.GetInstance().GameTime.Year, StatisticsTypes.GetStatisticsType("Cancellation%"), cancellationPercent * 100); airliner.CurrentFlight = null; } else { airliner.CurrentFlight.addDelayMinutes(delayedMinutes.Value); if (airliner.CurrentFlight.Entry.MainEntry == null) { if (airliner.CurrentFlight.isPassengerFlight()) { var classes = new List <AirlinerClass>(airliner.Airliner.Classes); foreach (AirlinerClass aClass in classes) { airliner.CurrentFlight.Classes.Add(new FlightAirlinerClass(((PassengerRoute)airliner.CurrentFlight.Entry.TimeTable.Route).getRouteAirlinerClass(aClass.Type), PassengerHelpers.GetFlightPassengers(airliner, aClass.Type))); //airliner.CurrentFlight.Classes.Add(new FlightAirlinerClass(((PassengerRoute)airliner.CurrentFlight.Entry.TimeTable.Route).getRouteAirlinerClass(aClass.Type),0)); } } if (airliner.CurrentFlight.isCargoFlight()) { airliner.CurrentFlight.Cargo = PassengerHelpers.GetFlightCargo(airliner); } } //SetTakeoffStatistics(airliner); if (airliner.CurrentFlight.ExpectedLanding.ToShortDateString() == GameObject.GetInstance().GameTime.ToShortDateString()) { SimulateLanding(airliner); } } }
//returns the next entry after a specific entry private static RouteTimeTableEntry GetNextEntry(RouteTimeTableEntry entry, FleetAirliner airliner, Dictionary<Route, List<RouteTimeTableEntry>> entries, Dictionary<Route, List<RouteTimeTableEntry>> entriesToDelete) { DayOfWeek day = entry.Day; int counter = 0; while (counter < 7) { List<RouteTimeTableEntry> tEntries = airliner.Routes.SelectMany(r => r.TimeTable.Entries.FindAll(e => e.Airliner == airliner && e.Day == day)).ToList(); tEntries.AddRange(entries.Keys.SelectMany(r => entries[r].FindAll(e => e.Day == day))); tEntries.RemoveAll(e => entriesToDelete.Keys.SelectMany(r => entriesToDelete[r]).ToList().Find(te => te == e) == e); tEntries = (from e in tEntries orderby e.Time select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { if (!((dEntry.Day == entry.Day && dEntry.Time <= entry.Time))) return dEntry; } day++; if (day == (DayOfWeek)7) day = (DayOfWeek)0; counter++; } return null; }
//simulates a flight with stopovers private static void SimulateStopoverFlight(RouteTimeTableEntry mainEntry) { //List<Route> routes = mainEntry.TimeTable.Route.Stopovers.SelectMany(s => s.Legs).ToList(); //Boolean isInbound = mainEntry.DepartureAirport == mainEntry.TimeTable.Route.Destination2; SimulateFlight(mainEntry); /* if (isInbound) routes.Reverse(); TimeSpan time = mainEntry.Time; foreach (Route route in routes) { RouteTimeTable timetable = new RouteTimeTable(route); //inbound if (isInbound) { RouteTimeTableEntry entry = new RouteTimeTableEntry(timetable, mainEntry.Day, time, new RouteEntryDestination(route.Destination1, mainEntry.Destination.FlightCode)); time = entry.TimeTable.Route.getFlightTime(mainEntry.Airliner.Airliner.Type).Add(RouteTimeTable.MinTimeBetweenFlights); //getFlightTime ( 737-900ER SBY-BOS-CPH-AAR) entry.Airliner = mainEntry.Airliner; entry.MainEntry = mainEntry; SimulateFlight(entry); } //outbound else { RouteTimeTableEntry entry = new RouteTimeTableEntry(timetable, mainEntry.Day, time, new RouteEntryDestination(route.Destination2, mainEntry.Destination.FlightCode)); entry.Airliner = mainEntry.Airliner; entry.MainEntry = mainEntry; time = time.Add(entry.TimeTable.Route.getFlightTime(mainEntry.Airliner.Airliner.Type)).Add(RouteTimeTable.MinTimeBetweenFlights); SimulateFlight(entry); } } */ }
private static RouteTimeTableEntry GetNextEntry(RouteTimeTableEntry entry, FleetAirliner airliner, List<RouteTimeTableEntry> entries) { DayOfWeek day = entry.Day; int counter = 0; while (counter < 7) { List<RouteTimeTableEntry> tEntries = entries; tEntries = (from e in tEntries orderby e.Time select e).ToList(); foreach (RouteTimeTableEntry dEntry in tEntries) { if (!((dEntry.Day == entry.Day && dEntry.Time <= entry.Time))) return dEntry; } day++; if (day == (DayOfWeek)7) day = (DayOfWeek)0; counter++; } return null; }
private void EntryChanged_Event(object sender, System.Windows.RoutedEventArgs e) { object[] entries = e.OriginalSource as object[]; TimelineEntry oldEntry = entries[0] as TimelineEntry; TimelineEntry newEntry = entries[1] as TimelineEntry; RouteTimeTableEntry oEntry = (RouteTimeTableEntry)oldEntry.Source; RouteTimeTable rt = new RouteTimeTable(oEntry.TimeTable.Route); RouteTimeTableEntry nEntry = new RouteTimeTableEntry(rt,(DayOfWeek)newEntry.StartTime.Days,newEntry.StartTime,oEntry.Destination); nEntry.Airliner = this.Airliner; rt.addEntry(nEntry); List<RouteTimeTableEntry> tEntries = new List<RouteTimeTableEntry>(this.Entries); tEntries.Remove(oEntry); if (!TimeTableHelpers.IsTimeTableValid(rt, this.Airliner, tEntries)) WPFMessageBox.Show(Translator.GetInstance().GetString("MessageBox", "2706"), Translator.GetInstance().GetString("MessageBox", "2706", "message"), WPFMessageBoxButtons.Ok); else { this.Entries.Remove(oEntry); this.Entries.Add(nEntry); } }
//removes an entry from the time table public void removeEntry(RouteTimeTableEntry entry) { this.Entries.Remove(entry); }