private bool SortMovingTrams(TramLocation location)
        {
            var movingTrams = _repo.GetAllTramsWithLocation(location);

            if (movingTrams.Count != 0)
            {
                UpdateTracks();
                var sorter = new TramSortingAlgoritm(_allTracks, _repo);
                for (var i = 0; i < movingTrams.Count; i++)
                {
                    var beheerTram = BeheerTram.ToBeheerTram(movingTrams[i]);
                    if (location == TramLocation.ComingIn)
                    {
                        if (beheerTram.DepartureTime == null)
                        {
                            beheerTram.EditTramDepartureTime(GetExitTime(beheerTram));
                        }
                        sorter.AssignTramLocation(beheerTram);
                    }
                    else if (location == TramLocation.GoingOut)
                    {
                        beheerTram.EditTramLocation(TramLocation.Out);
                        movingTrams[i] = beheerTram;
                        _repo.EditTram(movingTrams[i]);
                        _repo.WipeSectorByTramId(movingTrams[i].Number);
                        Console.WriteLine($"Tram {beheerTram.Number} left the remise.");
                    }
                }
                return(true);
            }
            return(false);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public BeheerSector Assign(BeheerSector sector, BeheerTram tram)
 {
     sector.SetOccupyingTram(tram);
     _repo.EditTram(tram);
     _repo.EditSector(sector);
     return(sector);
 }
Beispiel #4
0
        public void Simulation()
        {
            SortingAlgoritm sorter = new SortingAlgoritm(AllTracks, repo);

            //De schema moet op volgorde van eerst binnenkomende worden gesorteerd
            schema.Sort((x, y) => x.EntryTime.CompareTo(y.EntryTime));

            //Voor iedere inrijtijd een tram eraan koppellen
            foreach (InUitRijSchema entry in schema.Where(x => x.TramNumber == null))
            {
                foreach (BeheerTram tram in AllTrams.Where(x => x.DepartureTime == null && x.Line == entry.Line))
                {
                    entry.TramNumber = tram.Number;
                    tram.EditTramDepartureTime(entry.ExitTime);
                    break;
                }
            }

            //Too little linebound trams to fill each entry so overflow to other types of trams
            foreach (InUitRijSchema entry in schema.Where(x => x.TramNumber == null))
            {
                foreach (BeheerTram tram in AllTrams.Where(x => x.DepartureTime == null))
                {
                    if ((entry.Line == 5 || entry.Line == 1624) && (tram.Model == TramModel.Dubbel_Kop_Combino || tram.Model == TramModel.TwaalfG)) //No driver lines
                    {
                        entry.TramNumber = tram.Number;
                        tram.EditTramDepartureTime(entry.ExitTime);
                        break;
                    }
                    else if ((entry.Line != 5 || entry.Line != 1624) && tram.Model == TramModel.Combino) //Driver lines
                    {
                        entry.TramNumber = tram.Number;
                        tram.EditTramDepartureTime(entry.ExitTime);
                        break;
                    }
                }
            }

            //Het schema afgaan voor de simulatie
            foreach (InUitRijSchema entry in schema)
            {
                BeheerTram tram = AllTrams.Find(x => x.Number == entry.TramNumber);
                SortTram(sorter, tram);
                form.Invalidate();
                Thread.Sleep(simulationSpeed);
            }

            foreach (BeheerTram tram in AllTrams.Where(x => x.DepartureTime == null))
            {
                SortTram(sorter, tram);
                form.Invalidate();
                Thread.Sleep(simulationSpeed);
            }

            schema = csv.getSchema();
            Update();
        }
Beispiel #5
0
 public DateTime?GetExitTime(BeheerTram tram)
 {
     foreach (InUitRijSchema entry in schema.Where(x => x.Line == tram.Line && x.TramNumber == null))
     {
         entry.TramNumber = tram.Number;
         return(entry.ExitTime);
     }
     return(null);
 }
 private DateTime?GetExitTime(BeheerTram tram)
 {
     foreach (var entry in _schema.Where(entry => entry.Line == tram.Line && entry.TramNumber == null))
     {
         entry.TramNumber = tram.Number;
         return(entry.ExitTime);
     }
     return(null);
 }
Beispiel #7
0
 public void FetchUpdates()
 {
     AllTracks = new List <BeheerTrack>();
     foreach (Track track in repo.GetTracksAndSectors())
     {
         AllTracks.Add(track == null ? null : BeheerTrack.ToBeheerTrack(track));
     }
     AllTrams = new List <BeheerTram>();
     foreach (Tram tram in repo.GetAllTrams())
     {
         AllTrams.Add(tram == null ? null : BeheerTram.ToBeheerTram(tram));
     }
 }
Beispiel #8
0
        public void SortTram(SortingAlgoritm sorter, BeheerTram tram)
        {
            if (tram != null)
            {
                BackupAllTracks = AllTracks;
                AllTracks       = sorter.AssignTramLocation(tram);

                if (AllTracks == null)
                {
                    AllTracks = BackupAllTracks;
                }
            }
        }
        public void EditTram()
        {
            var tram = _logisticRepository.GetTram(1);

            Assert.IsNotNull(tram);

            var newTram = BeheerTram.ToBeheerTram(tram);

            newTram.EditTramStatus(TramStatus.Cleaning);
            newTram.EditTramDepartureTime(new DateTime(2017, 6, 15, 08, 0, 0, DateTimeKind.Unspecified));
            newTram.EditTramLocation(TramLocation.Out);

            _logisticRepository.EditTram(newTram);

            var fetchTram = _logisticRepository.GetTram(1);

            Assert.IsNotNull(fetchTram);

            Assert.AreEqual(JsonConvert.SerializeObject(newTram), JsonConvert.SerializeObject(fetchTram));
        }
Beispiel #10
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.");
        }
Beispiel #11
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);
        }