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); }
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."); }
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); }