Files
HFUTCourseSimulation/HFUTCourseSimulation/Simulation.xaml.cs

225 lines
8.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace HFUTCourseSimulation {
/// <summary>
/// Simulation.xaml 的交互逻辑
/// </summary>
public partial class Simulation : Window {
public Simulation() {
InitializeComponent();
//init colums and rows
for (int i = 0; i < 11; i++) {
var rows = new RowDefinition();
rows.Height = new GridLength(1, GridUnitType.Star);
this.uiArrangeGrid.RowDefinitions.Add(rows);
}
for (int i = 0; i < 7; i++) {
var colums = new ColumnDefinition();
colums.Width = new GridLength(1, GridUnitType.Star);
this.uiArrangeGrid.ColumnDefinitions.Add(colums);
}
try {
originDate = DateTime.Parse(General.GeneralSheet.StartDate);
weekCount = General.GeneralSheet.WeekCount;
} catch (Exception) {
MessageBox.Show("周数或日期转换错误,请关闭窗口", "错误", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
this.uiArrangeError.IsEnabled = false;
this.uiBtnNext.IsEnabled = false;
this.uiBtnPre.IsEnabled = false;
return;
}
Generate();
//refresh error list
this.uiArrangeError.Items.Clear();
foreach (var item in errorList) {
this.uiArrangeError.Items.Add(item);
}
currentWeek = 1;
Render();
}
Dictionary<Vector3, SimulationItem> itemDict = new Dictionary<Vector3, SimulationItem>();
List<string> errorList = new List<string>();
List<Grid> uiList = new List<Grid>();
DateTime originDate;
int weekCount;
int currentWeek;
void Generate() {
foreach (var item in General.GeneralSheet.Courses) {
foreach (var inner in item.Schedule) {
var weekRes = GetArrange(inner.Week);
var dayRes = GetArrange(inner.Day);
var indexRes = GetArrange(inner.Index);
foreach (var weekItem in weekRes) {
foreach (var dayItem in dayRes) {
foreach (var indexItem in indexRes) {
var vectorCache = new Vector3(weekItem, dayItem, indexItem);
if (this.itemDict.Keys.Contains(vectorCache)) {
errorList.Add($"课程冲突:无法将{item.Name}安排到 {weekItem}周,星期{dayItem},第{indexItem}节。因为此处已被{itemDict[vectorCache].Name}占据");
} else {
itemDict.Add(vectorCache, new SimulationItem() { Name = item.Name, Desc = item.Description });
}
}
}
}
}
}
}
List<int> GetArrange(string str) {
var res = new List<int>();
try {
if (str.Contains('-')) {
var strSp = str.Split('-');
int start = int.Parse(strSp[0]), end = int.Parse(strSp[1]);
for (int i = start; i <= end; i++) {
res.Add(i);
}
} else if (str.Contains(',')) {
var strSp = str.Split(',');
foreach (var item in strSp) {
res.Add(int.Parse(item));
}
} else {
res.Add(int.Parse(str));
}
} catch (Exception) {
errorList.Add("解析错误:" + str);
}
return res;
}
void Render() {
//remove all old grid
this.uiArrangeGrid.Children.Clear();
uiList.Clear();
//update date
//comput start date
uiWeek.Text = currentWeek.ToString();
var pointer = originDate;
pointer = pointer.AddDays(7 * (currentWeek - 1));
uiWeek1.Text = $"{pointer.Month}/{pointer.Day}";
pointer = pointer.AddDays(1);
uiWeek2.Text = $"{pointer.Month}/{pointer.Day}";
pointer = pointer.AddDays(1);
uiWeek3.Text = $"{pointer.Month}/{pointer.Day}";
pointer = pointer.AddDays(1);
uiWeek4.Text = $"{pointer.Month}/{pointer.Day}";
pointer = pointer.AddDays(1);
uiWeek5.Text = $"{pointer.Month}/{pointer.Day}";
pointer = pointer.AddDays(1);
uiWeek6.Text = $"{pointer.Month}/{pointer.Day}";
pointer = pointer.AddDays(1);
uiWeek7.Text = $"{pointer.Month}/{pointer.Day}";
//create grid
var query = (from item in itemDict.Keys
where item.teachingweek == currentWeek
select item).ToList();
while (query.Count != 0) {
var core = query[0];
var data = itemDict[core];
int length = 1;
//check below
if (core.index != 1 && query.Contains(core + new Vector3(0, 0, -1))) {
if (itemDict[core + new Vector3(0, 0, -1)].Name == data.Name) {
//if below have. jump this->move this to the end
query.RemoveAt(0);
query.Add(core);
continue;
}
}
//check follow
while (true) {
if (query.Contains(core + new Vector3(0, 0, length)) && itemDict[core + new Vector3(0, 0, length)].Name == data.Name) {
query.Remove(core + new Vector3(0, 0, length));
length++;
} else break;
}
//create
var warp = new Border();
warp.Background = new SolidColorBrush(Colors.LightBlue);
warp.CornerRadius = new CornerRadius(5);
Grid.SetRowSpan(warp, length);
var nGrid = new Grid();
nGrid.ToolTip = data.Desc;
var courseName = new TextBlock();
courseName.VerticalAlignment = VerticalAlignment.Center;
courseName.Text = data.Name;
nGrid.Children.Add(courseName);
warp.Child = nGrid;
Grid.SetRow(warp, core.index - 1);
Grid.SetColumn(warp, core.week - 1);
this.uiArrangeGrid.Children.Add(warp);
//remove first item
query.RemoveAt(0);
}
foreach (var item in query) {
}
}
private void uiBtnPre_Click(object sender, RoutedEventArgs e) {
if (currentWeek == 1) {
MessageBox.Show("已经是第一周了", "错误", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
return;
}
currentWeek--;
Render();
}
private void uiBtnNext_Click(object sender, RoutedEventArgs e) {
if (currentWeek == weekCount) {
MessageBox.Show("已经是最后一周了", "错误", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
return;
}
currentWeek++;
Render();
}
private void uiArrangeError_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
if (this.uiArrangeError.SelectedIndex < 0) {
MessageBox.Show("未选择任何项", "错误", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
return;
}
MessageBox.Show(errorList[this.uiArrangeError.SelectedIndex], "错误详情", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK);
}
}
}