/// <summary> /// Change the display of the reassignment paths for a SelectionChanged event. /// </summary> /// <param name="sender">A reference to the control/object that raised the event.</param> /// <param name="e">>State information and event data associated with a SelectionChanged event.</param> private void ReassignPaths_SelectionChanged(object sender, SelectionChangedEventArgs e) { string display = ""; string infoDisplay = ""; string [] display1; // Contains the course names string [] display2; // Contains the room names string [] display3; // Contains the course sections LinkedReassignments node = ReassignPaths.SelectedItem as LinkedReassignments; // Splits the strings display1 = node.courseSteps.Split(','); display2 = node.roomSteps.Split(','); display3 = node.courseSections.Split(','); for (int i = 0; i < display2.Length; i++) { if (node.steps == 0) { display += display1[i] + " is assigned to " + display2[i] + "\n"; display += "If this is the only item you see the reassignment has failed"; } else if (i != 0 && i % 2 == 1) { display += display1[i] + " will be assigned to " + display2[i] + "\n\n"; } else { display += display1[i] + " was assigned to " + display2[i] + "\n"; var thecourse = from course in CourseRepo.Courses where course.CourseName == display1[i] && course.SectionNumber == display3[i] select course; foreach (Course course in thecourse) { infoDisplay += course.CourseName + " Section " + course.SectionNumber + "\n" + course.MeetingPattern.ToString() + "\n\n"; } } } PathDisplay.Text = display; RoomInfo.Text = infoDisplay; }
/// <summary> /// Commit the reassigned room to the course. /// </summary> /// <param name="sender">A reference to the control/object that raised the event.</param> /// <param name="e">State information and event data associated with a routed event.</param> void CommitReassign(Object sender, RoutedEventArgs e) { string[] coursestoassign; string[] roomstoassign; string[] coursesections; LinkedReassignments node = ReassignPaths.SelectedItem as LinkedReassignments; // Splits the strings coursestoassign = node.courseSteps.Split(','); roomstoassign = node.roomSteps.Split(','); coursesections = node.courseSections.Split(','); for (int i = 0; i < roomstoassign.Length; i++) { if (node.steps == 0) { MessageBox.Show("You can not reassign with this item!"); break; } else if (i != 0 && i % 2 == 1) { var thecourse = from course in CourseRepo.Courses where course.CourseName == coursestoassign[i] && course.SectionNumber == coursesections[i] select course; var theroom = from room in RoomRepo.Rooms where room.RoomName == roomstoassign[i] select room; foreach (Course course in thecourse) { foreach (Room room in theroom) { System.Diagnostics.Debug.WriteLine("Course is: " + course.CourseName + " assigned to " + room.RoomName); course.Room = room.RoomName; course.RoomAssignment = room; } } } } MessageBox.Show("Reassigned rooms to courses"); saveWork.SaveWork(); }
/// <summary> /// Constructor for ReassignmentPage /// </summary> /// <param name="c">The course</param> /// <param name="capacity">The new capacity to search for for a course.</param> /// <param name="type">The room type to search for.</param> public ReassignmentPage(Course c, string capacity, string type) { saveWork = new SaveBase(); LinkedReassignments node = new LinkedReassignments(); Type = type; Capacity = capacity; var courses = from course in CourseRepo.Courses where course.CourseName == c.CourseName && course.SectionNumber == c.SectionNumber select course; foreach (Course course in courses) { course.RoomCapRequest = capacity; } c.RoomCapRequest = capacity; // initializes the head node node.steps = 0; node.courseSteps = c.CourseName; node.courseSections = c.SectionNumber; node.roomSteps = c.RoomAssignment.ToString(); node.next = null; InitializeComponent(); node = recursiveReassign(node, c); viewModel = new ReassignmentViewModel(node); DataContext = viewModel; if (viewModel.ReassignPath.Count() == 0) { PathDisplay.Text = "Couldn't reassign the course.\nPlease change the course time or manually reassign the room"; RoomInfo.Text = ""; } }
// Still working on this /// <summary> /// Recursively reassign a room for the course. /// </summary> /// <param name="node">A node represented the linked reassignments.</param> /// <param name="c">The course to be reassigned.</param> /// <returns>Null if it takes over three shuffles. The available room(s) otherwise.</returns> public LinkedReassignments recursiveReassign(LinkedReassignments node, Course c) { int steps = node.steps + 1; LinkedReassignments traverser; AvailableRoomSearch availableRoomSearch = new AvailableRoomSearch(RoomRepo, CourseRepo); IEnumerable <Room> rooms = availableRoomSearch.AvailableRooms(c.MeetingDays, (TimeSpan)c.StartTime, (TimeSpan)c.EndTime, int.Parse(c.RoomCapRequest), Type); LinkedReassignments newnode; // If it takes more than three shuffles then that's too much and ends it if (steps > 3) { return(null); } // If there are available rooms with regards to room type else if (rooms.Count() > 0) { foreach (var room in rooms) { traverser = node; newnode = new LinkedReassignments(); newnode.steps = steps; newnode.courseSections = node.courseSections + "," + c.SectionNumber; newnode.courseSteps = node.courseSteps + "," + c.CourseName; newnode.roomSteps = (node.roomSteps + "," + room.RoomName); newnode.next = null; while (traverser.next != null) { traverser = traverser.next; } traverser.next = newnode; } return(node); } // Finds all the rooms that match, if a course is assigned to it takes that room, then puts that course through // the algorithm else { // Took this from AvailableRoomSearch // Pretty sure it gets all rooms from the roomrepository that matches the requirements // Then finds all the courses that are assigned to those rooms var coursesGroupedByRoom = from room in RoomRepo.Rooms where room.Capacity >= int.Parse(c.RoomCapRequest) && room.RoomType == Type join course in CourseRepo.Courses on room equals course.RoomAssignment into courseGroup select new { Room = room, Courses = courseGroup }; foreach (var courseGroup in coursesGroupedByRoom) { // If no available rooms are found find all the courses assigned // to rooms that match the specifications and run the algorithm on them List <Course> courses = courseGroup.Courses .Where(x => x.HasRoomAssignment && x.MeetingDays.Intersect(c.MeetingDays).Count(z => true) != 0 && x.StartTime.HasValue && ((x.StartTime.Value <= c.EndTime && x.StartTime.Value >= c.StartTime) || (x.EndTime >= c.StartTime && x.EndTime <= c.EndTime))) .OrderBy(x => x.StartTime.Value) .ToList(); // Then we'll go through all the paths trying to shuffle here for (int i = 0; i < courses.Count; i++) { newnode = new LinkedReassignments(); traverser = node; newnode.steps = steps; newnode.courseSections = node.courseSections + "," + c.SectionNumber + "," + courses[i].SectionNumber; newnode.courseSteps = node.courseSteps + "," + c.CourseName + "," + courses[i].CourseName; newnode.roomSteps = node.roomSteps + "," + courses[i].RoomAssignment.RoomName + "," + courses[i].RoomAssignment.RoomName; newnode.next = null; newnode = recursiveReassign(newnode, courses[i]); // The first node is just this nodes info which isn't what we want if (newnode != null) { if (newnode.next != null) { newnode = newnode.next; while (traverser.next != null) { traverser = traverser.next; } traverser.next = newnode; } } } } return(node); } }