/// <summary> /// Menu item to open a file dialog and process the data file. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void loadStudentToolStripMenuItem_Click(object sender, EventArgs e) { /* make sure the list is clear */ lstScores.Items.Clear(); /* present the file open dialog */ var btn = openFileDialog1.ShowDialog(); if (btn == DialogResult.OK) { var filePath = openFileDialog1.FileName; try { GradeHelper helper = new GradeHelper(filePath); var grades = helper.Read(); /* now that we have the grades, generate the score */ grades.CalculateGpa(); PopulateForm(grades); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error"); } } }
/// <summary> /// Converts an OnlineScoreboardScore to a local score. /// </summary> /// <param name="score"></param> /// <returns></returns> public static Score FromOnlineScoreboardScore(OnlineScoreboardScore score) { // Unix timestamp is seconds past epoch var dtDateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); dtDateTime = dtDateTime.AddSeconds(score.Timestamp / 1000f).ToLocalTime(); var localScore = new Score() { IsOnline = true, Id = score.Id, SteamId = score.SteamId, MapMd5 = score.MapMd5, Name = score.Username, DateTime = dtDateTime.ToString(CultureInfo.InvariantCulture), Mode = score.Mode, TotalScore = score.TotalScore, PerformanceRating = score.PerformanceRating, Grade = GradeHelper.GetGradeFromAccuracy((float)score.Accuracy), Accuracy = score.Accuracy, MaxCombo = score.MaxCombo, CountMarv = score.CountMarv, CountPerf = score.CountPerf, CountGreat = score.CountGreat, CountGood = score.CountGood, CountOkay = score.CountOkay, CountMiss = score.CountMiss, Mods = score.Mods }; return(localScore); }
/// <summary> /// Creates a local score object from a score processor. /// </summary> /// <param name="processor"></param> /// <param name="md5"></param> /// <param name="name"></param> /// <param name="scrollSpeed"></param> /// <returns></returns> public static Score FromScoreProcessor(ScoreProcessor processor, string md5, string name, int scrollSpeed, int pauseCount) { var score = new Score() { MapMd5 = md5, Name = name, DateTime = $"{System.DateTime.Now.ToShortDateString()} {System.DateTime.Now.ToShortTimeString()}", Mode = processor.Map.Mode, TotalScore = processor.Score, Grade = processor.Failed ? Grade.F : GradeHelper.GetGradeFromAccuracy(processor.Accuracy), Accuracy = processor.Accuracy, MaxCombo = processor.MaxCombo, CountMarv = processor.CurrentJudgements[Judgement.Marv], CountPerf = processor.CurrentJudgements[Judgement.Perf], CountGreat = processor.CurrentJudgements[Judgement.Great], CountGood = processor.CurrentJudgements[Judgement.Good], CountOkay = processor.CurrentJudgements[Judgement.Okay], CountMiss = processor.CurrentJudgements[Judgement.Miss], Mods = processor.Mods, ScrollSpeed = scrollSpeed, PauseCount = pauseCount, JudgementBreakdown = GzipHelper.Compress(processor.GetJudgementBreakdown()), }; return(score); }
/// <summary> /// Creates the grade of the score /// </summary> private void CreateGrade() => Grade = new Sprite() { Parent = this, Alignment = Alignment.MidRight, X = -50, Size = new ScalableVector2(100, 100), Image = Screen.ScoreProcessor.Failed ? SkinManager.Skin.Grades[API.Enums.Grade.F] : SkinManager.Skin.Grades[GradeHelper.GetGradeFromAccuracy(Screen.ScoreProcessor.Accuracy)] };
double Help(GradeHelper t, double[] grades, ref double secondsElapsed) { Timing timer = new Timing(); timer.StartTime(); var result = t(grades); timer.StopTIme(); var dur = timer.Result(); secondsElapsed = dur.TotalMilliseconds / 1000.0; return(result); }
private void BtnFolder_Click(object sender, RoutedEventArgs e) { FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); if (folderBrowserDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { var path = folderBrowserDialog.SelectedPath; tbFileName.Text = path; //所有年级所有班级的所有科目成绩 var datas = ExcelHelper.GetExcelFiles(path); foreach (var d in datas) { var rankGrade = new RankGradeEntity(); var allList = new List <SubjectEntity>(); var sourceFile = Path.Combine(System.Windows.Forms.Application.StartupPath, "Result.xlsx"); var destPath = $@"{path}\Result"; var destFile = $@"{destPath}\{d.Id}_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx"; if (!Directory.Exists(destPath)) { Directory.CreateDirectory(destPath); } File.Copy(sourceFile, destFile, true); foreach (GradeEnum.SubjectName n in Enum.GetValues(typeof(GradeEnum.SubjectName))) { GradeHelper.GetEntitiesByExcelDatas(d, ref rankGrade, n); //每一科目list写入excel //TODO rankGrade.RankDict.TryGetValue(n.ToString(), out List <SubjectEntity> list); var sort = 1; var sortList = list.OrderByDescending(l => l.StandGrade).ToList(); sortList.ForEach(s => s.ClassSort = sort++); allList = allList.Concat(sortList).ToList(); //ExcelHelper.ToExcel(destFile, sortList, "result"); //list.OrderByDescending(l => l.StandGrade).ToList().ForEach(l => allList.Add(l)); } ExcelHelper.ToExcel(destFile, allList, "result", 3); // BindsList(d, allList); //rankGrade.RankDict.TryGetValue("数学", out List<SubjectEntity> list); //m_dataGrid.ItemsSource = allList; //ExcelHelper.ToExcel(); } } System.Windows.MessageBox.Show("计算完毕并保存文件成功"); }
/// <summary> /// Changes discord rich presence to show results. /// </summary> private void ChangeDiscordPresence() { DiscordHelper.Presence.EndTimestamp = 0; // Don't change if we're loading in from a replay file. if (ResultsType == ResultScreenType.Replay || Gameplay.InReplayMode) { DiscordHelper.Presence.Details = "Idle"; DiscordHelper.Presence.State = "In the Menus"; DiscordRpc.UpdatePresence(ref DiscordHelper.Presence); return; } var state = Gameplay.Failed ? "Fail" : "Pass"; var score = $"{ScoreProcessor.Score / 1000}k"; var acc = $"{StringHelper.AccuracyToString(ScoreProcessor.Accuracy)}"; var grade = Gameplay.Failed ? "F" : GradeHelper.GetGradeFromAccuracy(ScoreProcessor.Accuracy).ToString(); var combo = $"{ScoreProcessor.MaxCombo}x"; if (OnlineManager.CurrentGame == null) { DiscordHelper.Presence.State = $"{state}: {grade} {score} {acc} {combo}"; } else { if (OnlineManager.CurrentGame.Ruleset == MultiplayerGameRuleset.Team) { var redTeamAverage = GetTeamAverage(MultiplayerTeam.Red); var blueTeamAverage = GetTeamAverage(MultiplayerTeam.Blue); DiscordHelper.Presence.State = $"Red: {redTeamAverage:0.00} vs. Blue: {blueTeamAverage:0.00}"; } else { DiscordHelper.Presence.State = $"{StringHelper.AddOrdinal(MultiplayerScores.First().Rank)} " + $"Place: {MultiplayerScores.First().RatingProcessor.CalculateRating(ScoreProcessor):0.00} {acc} {grade}"; } } DiscordRpc.UpdatePresence(ref DiscordHelper.Presence); }
/// <summary> /// Changes discord rich presence to show results. /// </summary> private void ChangeDiscordPresence() { DiscordHelper.Presence.EndTimestamp = 0; // Don't change if we're loading in from a replay file. if (ResultsType == ResultScreenType.Replay || Gameplay.InReplayMode) { DiscordHelper.Presence.Details = "Idle"; DiscordHelper.Presence.State = "In the Menus"; DiscordRpc.UpdatePresence(ref DiscordHelper.Presence); return; } var state = Gameplay.Failed ? "Fail" : "Pass"; var score = $"{ScoreProcessor.Score / 1000}k"; var acc = $"{StringHelper.AccuracyToString(ScoreProcessor.Accuracy)}"; var grade = Gameplay.Failed ? "F" : GradeHelper.GetGradeFromAccuracy(ScoreProcessor.Accuracy).ToString(); var combo = $"{ScoreProcessor.MaxCombo}x"; DiscordHelper.Presence.State = $"{state}: {grade} {score} {acc} {combo}"; DiscordRpc.UpdatePresence(ref DiscordHelper.Presence); }
/// <summary> /// Creates the grade of the score /// </summary> private void CreateGrade() { Texture2D image; switch (Screen.ResultsType) { case ResultScreenType.Replay: case ResultScreenType.Gameplay: // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (Screen.ScoreProcessor.Failed) { image = SkinManager.Skin.Grades[API.Enums.Grade.F]; } else { image = SkinManager.Skin.Grades[GradeHelper.GetGradeFromAccuracy(Screen.ScoreProcessor.Accuracy)]; } break; case ResultScreenType.Score: image = SkinManager.Skin.Grades[Screen.Score.Grade]; break; default: throw new ArgumentOutOfRangeException(); } Grade = new Sprite() { Parent = this, Alignment = Alignment.MidRight, X = -50, Size = new ScalableVector2(66, 66), Image = image }; }
/// <summary> /// Adds data to the row /// <header name, value> /// </summary> /// <param name="data"></param> private void CreateData(Dictionary <string, string> data) { foreach (var pair in data) { var header = Header.Headers[pair.Key]; Sprite val; if (pair.Key == "Grade") { val = new Sprite() { Parent = this, Alignment = Alignment.MidRight, Size = new ScalableVector2(30, 30), Image = Item.Processor.Failed ? SkinManager.Skin.Grades[Grade.F] : SkinManager.Skin.Grades[GradeHelper.GetGradeFromAccuracy(Item.Processor.Accuracy)], UsePreviousSpriteBatchOptions = true }; } else { val = new SpriteTextBitmap(FontsBitmap.GothamRegular, pair.Value) { Parent = this, Alignment = Alignment.MidRight, FontSize = 16, UsePreviousSpriteBatchOptions = true }; } if (Item.Type == ScoreboardUserType.Self && val is SpriteTextBitmap t) { t.Tint = Colors.SecondaryAccent; } val.X = header.X - header.Width / 2f; val.X += val.Width / 2f; } }