예제 #1
0
        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);
            }
             * */
        }
예제 #3
0
        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)));
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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)));
        }
예제 #6
0
        //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);
        }
예제 #7
0
        //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();
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
        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;
 }
예제 #12
0
        // 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);
        }
예제 #13
0
        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);
                }
            }
        }
예제 #17
0
        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();
        }
예제 #18
0
        //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);
        }
예제 #19
0
        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));
        }
예제 #20
0
        //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);
             *  }
             *
             *
             *
             * }
             */
        }
예제 #21
0
        //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;
        }
예제 #22
0
        //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;
             * */
        }
예제 #23
0
        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();
            }
        }
예제 #24
0
        //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);
        }
예제 #25
0
        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)));
        }
예제 #26
0
        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());
        }
예제 #27
0
        //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);
        }
예제 #28
0
        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;
        }
예제 #29
0
        //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);
 }
예제 #31
0
        //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);

                }

            }
        }
예제 #32
0
        //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);

            }
        }
예제 #33
0
        //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);
            }
        }
예제 #35
0
 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();
        }
예제 #39
0
        //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();
        }
예제 #41
0
        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;
        }
예제 #42
0
 public DestinationFlight(Airline airline, RouteTimeTableEntry entry, DateTime time)
 {
     this.Airline = airline;
     this.Entry = entry;
     this.Time = time;
     this.AirlinerType = this.Entry.Airliner.Airliner.Type;
 }
        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;
        }
예제 #44
0
        //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;
        }
예제 #47
0
        //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;
        }
예제 #48
0
 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);
 }
예제 #49
0
        //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);
                }
            }
        }
예제 #50
0
        //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;
        }
예제 #51
0
        //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);
                }

            }
            */
        }
예제 #52
0
        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;
        }
예제 #53
0
        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);
 }