225 lines
8.3 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|