예제 #1
0
파일: Logic.cs 프로젝트: Tvde1/OdoriRails
        public bool SortMovingTrams(TramLocation location)
        {
            SortingAlgoritm sorter      = new SortingAlgoritm(AllTracks, repo);
            List <Tram>     movingTrams = repo.GetAllTramsWithLocation(location);

            if (movingTrams.Count != 0)
            {
                for (int i = 0; i < movingTrams.Count; i++)
                {
                    BeheerTram beheerTram = BeheerTram.ToBeheerTram(movingTrams[i]);
                    if (location == TramLocation.ComingIn)
                    {
                        if (movingTrams[i].DepartureTime == null)
                        {
                            GetExitTime(beheerTram);
                        }
                        SortTram(sorter, beheerTram);
                    }
                    else if (location == TramLocation.GoingOut)
                    {
                        beheerTram.EditTramLocation(TramLocation.Out);
                        movingTrams[i] = beheerTram;
                        repo.EditTram(movingTrams[i]);
                        repo.WipeSectorByTramId(movingTrams[i].Number);
                    }
                }
                FetchUpdates();
                return(true);
            }
            return(false);
        }
예제 #2
0
        public void AssignTramLocation(BeheerTram tram)
        {
            tram.EditTramLocation(TramLocation.In);

            //With a service needed, put on the first free slot
            if (tram.Status == TramStatus.Cleaning || tram.Status == TramStatus.Maintenance ||
                tram.Status == TramStatus.CleaningMaintenance)
            {
                foreach (Track track in _allTracks.Where(track => track.Type == TrackType.Service))
                {
                    for (var i = 0; i < track.Sectors.Count; i++)
                    {
                        if (track.Sectors[i].OccupyingTram == null && track.Sectors[i].Status == SectorStatus.Open)
                        {
                            var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i]);
                            track.Sectors[i] = Assign(beheerSector, tram);
                            Console.WriteLine("Moved tram {0} to track: {1}, sector: {2} ({3})", tram.Number,
                                              beheerSector.TrackNumber, beheerSector.Number + 1, tram.Status);
                            return;
                        }
                    }
                }
            }

            //Put tram on track thats connected to the line the tram is on
            foreach (var track in _allTracks.Where(track => track.Line == tram.Line && track.Type == TrackType.Normal))
            {
                for (var i = 0; i < track.Sectors.Count - 1; i++)
                {
                    if (track.Sectors[i].OccupyingTram == null && track.Sectors[i].Status == SectorStatus.Open)
                    {
                        var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i]);
                        track.Sectors[i] = Assign(beheerSector, tram);
                        Console.WriteLine("Moved tram {0} to track: {1}, sector: {2}", tram.Number,
                                          beheerSector.TrackNumber, beheerSector.Number + 1);
                        return;
                    }

                    if (track.Sectors[i].Status == SectorStatus.Occupied &&
                        track.Sectors[i].OccupyingTram.DepartureTime < tram.DepartureTime)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open)
                        {
                            var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            Console.WriteLine("Moved tram {0} to track: {1}, sector: {2}", tram.Number,
                                              beheerSector.TrackNumber, beheerSector.Number + 1);
                            return;
                        }
                    }
                }
            }

            //If not successful put tram on any other normal track (that doesn't have another line connected to it)
            foreach (var track in _allTracks.Where(track => track.Type == TrackType.Normal))
            {
                for (var i = 0; i < track.Sectors.Count - 1; i++)
                {
                    if (track.Sectors[0].OccupyingTram == null && track.Sectors[0].Status == SectorStatus.Open)
                    {
                        var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i]);
                        track.Sectors[i] = Assign(beheerSector, tram);
                        Console.WriteLine("Moved tram {0} to track: {1}, sector: {2}", tram.Number,
                                          beheerSector.TrackNumber, beheerSector.Number + 1);
                        return;
                    }
                    else if (track.Sectors[i].Status == SectorStatus.Occupied &&
                             track.Sectors[i].OccupyingTram.DepartureTime < tram.DepartureTime)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open)
                        {
                            var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            Console.WriteLine("Moved tram {0} to track: {1}, sector: {2}", tram.Number,
                                              beheerSector.TrackNumber, beheerSector.Number + 1);
                            return;
                        }
                    }
                }
            }

            //If not successful put on an exit line
            foreach (var track in _allTracks.Where(track => track.Type == TrackType.Exit))
            {
                for (var i = 0; i < track.Sectors.Count - 1; i++)
                {
                    if (track.Sectors[0].OccupyingTram == null && track.Sectors[0].Status == SectorStatus.Open)
                    {
                        var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i]);
                        track.Sectors[i] = Assign(beheerSector, tram);
                        Console.WriteLine("Moved tram {0} to track: {1}, sector: {2}", tram.Number,
                                          beheerSector.TrackNumber, beheerSector.Number + 1);
                        return;
                    }
                    else if (track.Sectors[i].Status == SectorStatus.Occupied &&
                             track.Sectors[i].OccupyingTram.DepartureTime < tram.DepartureTime)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open)
                        {
                            var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            Console.WriteLine("Moved tram {0} to track: {1}, sector: {2}", tram.Number,
                                              beheerSector.TrackNumber, beheerSector.Number + 1);
                            return;
                        }
                    }
                    else if (track.Sectors[i].Status == SectorStatus.Occupied &&
                             track.Sectors[0].OccupyingTram.DepartureTime == null)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open)
                        {
                            var beheerSector = BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            Console.WriteLine("Moved tram {0} to track: {1}, sector: {2}", tram.Number,
                                              beheerSector.TrackNumber, beheerSector.Number + 1);
                            return;
                        }
                    }
                }
            }

            //If not successful let user place tram
            tram.EditTramLocation(TramLocation.NotAssigned);
            _repo.EditTram(tram);
            Console.WriteLine($"Could not move tram {tram.Number}, please move manually.");
        }
예제 #3
0
        public List <BeheerTrack> AssignTramLocation(BeheerTram tram)
        {
            tram.EditTramLocation(TramLocation.In);

            //With a service needed, put on the first free slot
            if (tram.Status == TramStatus.Cleaning || tram.Status == TramStatus.Maintenance || tram.Status == TramStatus.CleaningMaintenance)
            {
                foreach (Track track in allTracks.Where(x => x.Type == TrackType.Service))
                {
                    for (int i = 0; i < track.Sectors.Count; i++)
                    {
                        if (track.Sectors[i].OccupyingTram == null && track.Sectors[i].Status == SectorStatus.Open)
                        {
                            BeheerSector beheerSector = track.Sectors[i] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i]);
                            track.Sectors[i] = Assign(beheerSector, tram);
                            return(allTracks);
                        }
                    }
                }
            }

            //Put tram on track thats connected to the line the tram is on
            foreach (BeheerTrack track in allTracks.Where(x => x.Line == tram.Line && x.Type == TrackType.Normal))
            {
                for (int i = 0; i < track.Sectors.Count - 1; i++)
                {
                    float sectorId = track.Number + track.Sectors[i].Number / 100f;
                    if (track.Sectors[i].OccupyingTram == null && track.Sectors[i].Status == SectorStatus.Open && !OccupiedSectors.Contains(sectorId))
                    {
                        BeheerSector beheerSector = track.Sectors[i] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i]);
                        track.Sectors[i] = Assign(beheerSector, tram);
                        OccupiedSectors.Add(sectorId);
                        return(allTracks);
                    }
                    sectorId = track.Number + track.Sectors[i + 1].Number / 100f;
                    if (track.Sectors[i].Status == SectorStatus.Occupied && track.Sectors[i].OccupyingTram.DepartureTime < tram.DepartureTime)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open && !OccupiedSectors.Contains(sectorId))
                        {
                            BeheerSector beheerSector = track.Sectors[i + 1] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            OccupiedSectors.Add(sectorId);
                            return(allTracks);
                        }
                    }
                }
            }

            //If not successful put tram on any other normal track (that doesn't have another line connected to it)
            foreach (BeheerTrack track in allTracks.Where(x => x.Type == TrackType.Normal))
            {
                for (int i = 0; i < track.Sectors.Count - 1; i++)
                {
                    if (track.Sectors[0].OccupyingTram == null && track.Sectors[0].Status == SectorStatus.Open)
                    {
                        BeheerSector beheerSector = track.Sectors[i] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i]);
                        track.Sectors[i] = Assign(beheerSector, tram);
                        return(allTracks);
                    }
                    else if (track.Sectors[i].Status == SectorStatus.Occupied && track.Sectors[i].OccupyingTram.DepartureTime < tram.DepartureTime)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open)
                        {
                            BeheerSector beheerSector = track.Sectors[i + 1] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            return(allTracks);
                        }
                    }
                }
            }

            //If not successful put on an exit line
            foreach (BeheerTrack track in allTracks.Where(x => x.Type == TrackType.Normal))
            {
                for (int i = 0; i < track.Sectors.Count - 1; i++)
                {
                    if (track.Sectors[0].OccupyingTram == null && track.Sectors[0].Status == SectorStatus.Open)
                    {
                        BeheerSector beheerSector = track.Sectors[i] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i]);
                        track.Sectors[i] = Assign(beheerSector, tram);
                        return(allTracks);
                    }
                    else if (track.Sectors[i].Status == SectorStatus.Occupied && track.Sectors[i].OccupyingTram.DepartureTime < tram.DepartureTime)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open)
                        {
                            BeheerSector beheerSector = track.Sectors[i + 1] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            return(allTracks);
                        }
                    }
                    else if (track.Sectors[i].Status == SectorStatus.Occupied && track.Sectors[0].OccupyingTram.DepartureTime == null)
                    {
                        if (track.Sectors[i + 1].Status == SectorStatus.Open)
                        {
                            BeheerSector beheerSector = track.Sectors[i + 1] == null ? null : BeheerSector.ToBeheerSector(track.Sectors[i + 1]);
                            track.Sectors[i + 1] = Assign(beheerSector, tram);
                            return(allTracks);
                        }
                    }
                }
            }

            //If not successful let user place tram
            return(null);
        }