From 00a491d93733d4625ad329b2ba8237f445364b3f Mon Sep 17 00:00:00 2001 From: Mirta Date: Wed, 30 Dec 2020 16:39:52 +0200 Subject: merge --- .../Tango.MachineStudio.Statistics/App.config | 20 +- .../Converters/CollectionConverter .cs | 48 -- .../Converters/DateTimeToStringFormatConverter.cs | 30 - .../Converters/JobLengthConverter.cs | 41 -- .../LiquidQuantityToFormatStringConverter.cs | 41 -- .../Converters/LiquidTypeToColorConverter.cs | 43 -- .../MidTankLevelToElementHeightConverter.cs | 41 -- .../Converters/NanoLiterToLiterFormatConverter.cs | 36 - .../Converters/StringToBoolYesNoNullConverter.cs | 37 - .../Converters/StringToFirstLetterConverter.cs | 30 - .../TooltipLiquidQuantityFormatConverter.cs | 38 - .../Models/ExcelModel.cs | 34 - .../Models/JobRunModel.cs | 39 - .../Models/JobRunStatisticsModel.cs | 45 -- .../Models/RmlModel.cs | 15 - .../Models/StatisticsValueCollection.cs | 319 --------- .../Models/TotalLiquidQuantityModel.cs | 15 - .../Tango.MachineStudio.Statistics.csproj | 48 -- .../Tooltips/PieChartTooltipControl.xaml | 2 +- .../ValidationRules/DateExpiredRule.cs | 21 - .../ViewModels/ChartsViewVM.cs | 364 ---------- .../ViewModels/JobRunsViewVM.cs | 729 ------------------- .../ViewModels/MainViewVM.cs | 339 ++++++++- .../Views/ChartsView.xaml | 145 ---- .../Views/ChartsView.xaml.cs | 74 -- .../Views/JobRunsView.xaml | 787 --------------------- .../Views/JobRunsView.xaml.cs | 175 ----- .../Views/MainView.xaml | 114 ++- .../Views/MainView.xaml.cs | 6 +- .../Tango.MachineStudio.Statistics/packages.config | 1 - 30 files changed, 432 insertions(+), 3245 deletions(-) delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/CollectionConverter .cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/DateTimeToStringFormatConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/JobLengthConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidTypeToColorConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/MidTankLevelToElementHeightConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/NanoLiterToLiterFormatConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToBoolYesNoNullConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToFirstLetterConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/TooltipLiquidQuantityFormatConverter.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/ExcelModel.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunModel.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunStatisticsModel.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/RmlModel.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/StatisticsValueCollection.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/TotalLiquidQuantityModel.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ValidationRules/DateExpiredRule.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/ChartsViewVM.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/JobRunsViewVM.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml.cs delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml delete mode 100644 Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml.cs (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics') diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/App.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/App.config index 75b63289d..ed4582d5b 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/App.config +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/App.config @@ -22,7 +22,7 @@ - + @@ -30,27 +30,27 @@ - + - + - + - + - + - + @@ -74,7 +74,7 @@ - + @@ -92,10 +92,6 @@ - - - - \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/CollectionConverter .cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/CollectionConverter .cs deleted file mode 100644 index 2d9a3cfd9..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/CollectionConverter .cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class CollectionConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if(value != null && value is System.Collections.IEnumerable) - { - var colection = value as System.Collections.IEnumerable; - var text = new StringBuilder(); - foreach(var val in colection) - { - string visibleText = val.ToString(); - if(val is bool && parameter is string) - { - string[] tokens = (parameter as string).Split(','); - if(tokens.Count() > 1) - { - visibleText = (bool)val == true ? tokens[1] : tokens[0]; - } - } - text.Append(visibleText); - text.Append("/"); - } - string str_text = text.ToString(); - if(str_text.Length > 1) - { - str_text = str_text.Remove(str_text.Length - 1); - } - return str_text; - } - return ""; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/DateTimeToStringFormatConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/DateTimeToStringFormatConverter.cs deleted file mode 100644 index 6b5154ce3..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/DateTimeToStringFormatConverter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class DateTimeToStringFormatConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null) - { - return ((TimeSpan)value).ToString(@"hh\:mm\:ss"); - } - else - { - return TimeSpan.FromSeconds(0).ToString(@"hh\:mm\:ss"); - } - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/JobLengthConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/JobLengthConverter.cs deleted file mode 100644 index cd928d9c9..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/JobLengthConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class JobLengthConverter : IMultiValueConverter - { - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - try - { - if (values != null && values.Count() == 3) - { - double length = (double)values[0]; - double endPoint = (double)values[1]; - double width = (double)values[2]; - var v = Math.Round((endPoint / length) * width, MidpointRounding.AwayFromZero); - - if (double.IsInfinity(v)) - { - return 0d; - } - return v; - } - } - catch { } - - return 0d; - } - - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs deleted file mode 100644 index 3ab013ab3..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidQuantityToFormatStringConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class LiquidQuantityToFormatStringConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - try - { - string format = ""; - if (parameter is string) - { - format = (string)parameter; - } - - var longValue = System.Convert.ToUInt64(value.ToString()); - double liters_val = (longValue / 1000000000d); - double cc_val = (longValue / 1000000d); - double dispensers_val = (longValue / 130000000d); - string tooltip = String.Format($"Nanoliters: {longValue.ToString(format)}\nCubic Centimeters: {cc_val}\nLiters: {liters_val}\nDispensers: {dispensers_val}"); - return tooltip; - } - catch { } - - return ""; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidTypeToColorConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidTypeToColorConverter.cs deleted file mode 100644 index b36bf608e..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/LiquidTypeToColorConverter.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; -using System.Windows.Media; -using Tango.BL; -using Tango.BL.Enumerations; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class LiquidTypeToColorConverter : IValueConverter - { - private static Dictionary liquidTypes; - - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (liquidTypes == null) - { - liquidTypes = new Dictionary(); - - foreach (var type in ObservablesStaticCollections.Instance.LiquidTypes.ToList()) - { - liquidTypes.Add(type.Type, type.LiquidTypeColor); - } - } - - if (value != null) - { - return liquidTypes[(LiquidTypes)value]; - } - - return value; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/MidTankLevelToElementHeightConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/MidTankLevelToElementHeightConverter.cs deleted file mode 100644 index de002046e..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/MidTankLevelToElementHeightConverter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Globalization; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class MidTankLevelToElementHeightConverter : IMultiValueConverter - { - public const double MAX_QUANTITY = 130000000; - public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) - { - try - { - double parentActualHeight; - Double.TryParse(values[0].ToString(), out parentActualHeight); - double quantity; - Double.TryParse(values[1].ToString(), out quantity); - - double midTankLevel = (double)Math.Min(quantity, MAX_QUANTITY); - double delta = ((midTankLevel / MAX_QUANTITY) * parentActualHeight); - if (quantity > 0 && midTankLevel < (MAX_QUANTITY/10))// if quantity < 10|% set 2 pixel - delta = 2.0; - var test = delta; - return parentActualHeight - delta; - } - catch - { - return 0d; - } - } - - public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/NanoLiterToLiterFormatConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/NanoLiterToLiterFormatConverter.cs deleted file mode 100644 index 97f4ec066..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/NanoLiterToLiterFormatConverter.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class NanoLiterToLiterFormatConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - try - { - var longValue = System.Convert.ToUInt64(value.ToString()); - double val = (longValue / 1000000000d); - if (parameter is string) - { - string format= (string)parameter; - return val.ToString(format); - } - return val.ToString(); - } - catch { } - - return ""; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToBoolYesNoNullConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToBoolYesNoNullConverter.cs deleted file mode 100644 index f7633a7d0..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToBoolYesNoNullConverter.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Controls; -using System.Windows.Data; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class StringToBoolYesNoNullConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if(value is bool) - { - return (bool)value ? "Yes" : "No"; - } - return "Null"; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - //throw new NotImplementedException(); - if (value is ComboBoxItem) - { - string str_val = ((ComboBoxItem)value).Content.ToString(); - if (str_val.ToUpper() == "NO") - return false; - if (str_val.ToUpper() == "YES") - return true; - } - return null; - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToFirstLetterConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToFirstLetterConverter.cs deleted file mode 100644 index a1c9561b9..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/StringToFirstLetterConverter.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; - -namespace Tango.MachineStudio.Statistics.Converters -{ - public class StringToFirstLetterConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - if (value != null && value.ToString().Length > 1) - { - return value.ToString().First().ToString(); - } - else - { - return value; - } - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/TooltipLiquidQuantityFormatConverter.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/TooltipLiquidQuantityFormatConverter.cs deleted file mode 100644 index 6c4d1347f..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Converters/TooltipLiquidQuantityFormatConverter.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; -namespace Tango.MachineStudio.Statistics.Converters -{ - class TooltipLiquidQuantityFormatConverter : IValueConverter - { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) - { - try - { - string format = ""; - if (parameter is string) - { - format = (string)parameter; - } - var longValue = System.Convert.ToUInt64(value.ToString()); - decimal liters_val = (decimal)(longValue / 1000000000d); - decimal cc_val = (decimal)(longValue / 1000000d); - decimal dispensers_val = (decimal)(longValue / 130000000d); - string tooltip = String.Format($"Nanoliters: {longValue.ToString(format)}\nCubic Centimeters: {cc_val}\nLiters: {liters_val}\nDispensers: {dispensers_val}"); - return tooltip; - } - catch { } - - return ""; - } - - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) - { - throw new NotImplementedException(); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/ExcelModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/ExcelModel.cs deleted file mode 100644 index f06b9fe60..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/ExcelModel.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Tango.MachineStudio.Statistics.Models -{ - public class ExcelModel - { - public String ID { get; set; } - public String Machine { get; set; } - public String User { get; set; } - public String JobName { get; set; } - public String Thread { get; set; } - public String Length { get; set; } - public String Source { get; set; } - public String UploadDuration { get; set; } - public String HeatingDuration { get; set; } - public String StartTime { get; set; } - public String IsGradient { get; set; } - public String GR { get; set; } - public String Status { get; set; } - public String EndTime { get; set; } - public String EndPosition { get; set; } - public String Cyan { get; set; } - public String Magenta { get; set; } - public String Yellow { get; set; } - public String Black { get; set; } - public String Transparent { get; set; } - public String Lubricant { get; set; } - public String Cleaner { get; set; } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunModel.cs deleted file mode 100644 index 83897ca16..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunModel.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Tango.BL.Entities; - -namespace Tango.MachineStudio.Statistics.Models -{ - public class JobRunModel - { - public JobRun JobRun { get; set; } - - public Machine Machine { get; set; } - - public User User { get; set; } - - public TimeSpan? UploadDuration { get; set; } - - public TimeSpan? HeatingDuration { get; set; } - - public RmlModel Rml { get; set; } - - public void Init() - { - if (JobRun.HeatingStartDate != null) - { - UploadDuration = JobRun.HeatingStartDate - JobRun.StartDate; - } - - if (JobRun.ActualStartDate != null && JobRun.HeatingStartDate != null) - { - HeatingDuration = JobRun.ActualStartDate - JobRun.HeatingStartDate; - } - - - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunStatisticsModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunStatisticsModel.cs deleted file mode 100644 index 98b719cae..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/JobRunStatisticsModel.cs +++ /dev/null @@ -1,45 +0,0 @@ - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Tango.BL; -using Tango.BL.Entities; -using Tango.Core.ExtensionMethods; - -namespace Tango.MachineStudio.Statistics.Models -{ - public class JobRunStatisticsModel : JobRun - { - private static Dictionary _machines = new Dictionary(); - - public JobRunStatisticsModel() - { - - } - - public JobRunStatisticsModel(JobRun run) - { - run.MapPropertiesTo(this, MappingFlags.NoReferenceTypes); - } - - public Task LoadMachine(ObservablesContext context) - { - return Task.Factory.StartNew(() => - { - if (!_machines.ContainsKey(MachineGuid)) - { - Machine = context.Machines.SingleOrDefault(x => x.Guid == MachineGuid); - _machines.Add(MachineGuid, Machine); - } - else - { - Machine = _machines[MachineGuid]; - } - }); - } - - public Machine Machine { get; set; } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/RmlModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/RmlModel.cs deleted file mode 100644 index 789779e42..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/RmlModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Tango.MachineStudio.Statistics.Models -{ - public class RmlModel - { - public string Guid { get; set; } - - public string Name { get; set; } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/StatisticsValueCollection.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/StatisticsValueCollection.cs deleted file mode 100644 index b5615e4d1..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/StatisticsValueCollection.cs +++ /dev/null @@ -1,319 +0,0 @@ -using LiveCharts; -using LiveCharts.Wpf; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Data; -using System.Windows.Media; -using Tango.BL.Enumerations; -using Tango.BL.ValueObjects; -using Tango.Core; -using System.Windows.Media; -using System.Windows; - -namespace Tango.MachineStudio.Statistics.Models -{ - public class StatisticsValue - { - public string Name { get; set; } - - public object Value { get; set; } - - public string Unit { get; set; } - } - public class MoreValue - { - public string Text { get; set; } - } - - public class StatisticsValueCollection : ExtendedObject - { - private List _pieColors; - - #region Properties - - private ObservableCollection _statisticsCollection; - - /// - /// Gets or sets the statistics collection of StatisticsValue object. - /// - public ObservableCollection StatisticsCollection - { - get { return _statisticsCollection; } - set - { - _statisticsCollection = value; - RaisePropertyChangedAuto(); - } - } - - private List _threadConsumptionPerThread; - /// - /// Gets or sets the thread consumption per thread list. - /// - public List ThreadConsumptionPerThread - { - get { return _threadConsumptionPerThread; } - set { _threadConsumptionPerThread = value; RaisePropertyChangedAuto(); } - } - - /// - /// Gets or sets the thread consumption per thread collection. - /// - public CompositeCollection ThreadConsumptionPerThreadCollection { get; set; } - - private LabeledSeriesCollection _pieJobSource; - - /// - /// Gets or sets the pie job source. - /// - public LabeledSeriesCollection PieJobSource - { - get { return _pieJobSource; } - set { _pieJobSource = value; RaisePropertyChangedAuto(); } - } - - private LabeledSeriesCollection _pieJobRunStatus; - - /// - /// Gets or sets the pie job run status. - /// - public LabeledSeriesCollection PieJobRunStatus - { - get { return _pieJobRunStatus; } - set { _pieJobRunStatus = value; RaisePropertyChangedAuto(); } - } - - private LabeledSeriesCollection _pieGradientSolid; - - /// - /// Gets or sets the pie gradient solid. - /// - public LabeledSeriesCollection PieGradientSolid - { - get { return _pieGradientSolid; } - set { _pieGradientSolid = value; RaisePropertyChangedAuto(); } - } - - private List _liquidQuantities; - - /// - /// Gets or sets the liquid quantities. - /// - public List LiquidQuantities - { - get - { - if (_liquidQuantities == null) - { - _liquidQuantities = new List(); - } - return _liquidQuantities; - } - set - { _liquidQuantities = value; RaisePropertyChangedAuto(); } - } - - private ulong _totalLiquidQuantities; - - /// - /// Gets or sets the total liquid quantities. - /// - public ulong TotalLiquidQuantities - { - get { return _totalLiquidQuantities; } - set { _totalLiquidQuantities = value; RaisePropertyChangedAuto(); } - } - - #endregion - - public StatisticsValueCollection() - { - StatisticsCollection = new ObservableCollection(); - ThreadConsumptionPerThread = new List(); - ThreadConsumptionPerThreadCollection = new CompositeCollection(); - - _pieColors = new List(); - _pieColors.Add(((SolidColorBrush)Application.Current.Resources["RedBrush500"]).Color); - _pieColors.Add(((SolidColorBrush)Application.Current.Resources["OrangeBrush"]).Color); - _pieColors.Add(((SolidColorBrush)Application.Current.Resources["GreenBrush"]).Color); - _pieColors.Add(((SolidColorBrush)Application.Current.Resources["BlueBrush100"]).Color); - _pieColors.Add(Color.FromRgb(255, 216, 76)); - - - PieJobSource = new LabeledSeriesCollection() - { - Title = "PPC/MS", - SeriesColors = _pieColors, - }; - PieJobRunStatus = new LabeledSeriesCollection() - { - Title = "Failed/Aborted/Completed", - SeriesColors = _pieColors, - }; - PieGradientSolid = new LabeledSeriesCollection() - { - Title = "Gradient/Solid", - SeriesColors = _pieColors, - }; - } - - /// - /// Cleans all values. - /// - public void Clean() - { - StatisticsCollection.Clear(); - ThreadConsumptionPerThreadCollection.Clear(); - ThreadConsumptionPerThread.Clear(); - PieJobSource.SeriesCollection.Clear(); - PieJobRunStatus.SeriesCollection.Clear(); - PieGradientSolid.SeriesCollection.Clear(); - } - - /// - /// Adds the statistics value. - /// - public void AddStatisticsValue(string name, object value, string unit) - { - StatisticsCollection.Add(new StatisticsValue() { Name = name, Value = value, Unit = unit }); - RaisePropertyChanged("StatisticsCollection"); - } - - /// - /// Creates the thread consumption per thread. - /// - public void CreateThreadConsumptionPerThread(List threads) - { - ThreadConsumptionPerThreadCollection.Add(new CollectionContainer() { Collection = threads.Take(threads.Count() > 2 ? 2 : threads.Count()) }); - if (threads.Count() > 2) - { - ThreadConsumptionPerThreadCollection.Add(new CollectionContainer() { Collection = new List() { new MoreValue() { Text = "More threads ..." } } }); - ThreadConsumptionPerThread = threads.Skip(2).ToList(); - } - - RaisePropertyChanged("ThreadConsumptionPerThreadCollection"); - } - - #region GeneratePieChart - Func labelPoint = chartPoint => - string.Format("{0} ({1:P})", chartPoint.Y, chartPoint.Participation); - - public void GeneratePieJobSource(int PPCCount, int MSCount) - { - var series = new PieSeries() - { - Title = "PPC", - Values = new ChartValues() { PPCCount }, - Fill = new SolidColorBrush(_pieColors[4]), - DataLabels = true, - ToolTip = "", - LabelPoint = labelPoint - - }; - - PieJobSource.SeriesCollection.Add(series); - - series = new PieSeries() - { - Title = "MS", - Values = new ChartValues() { MSCount }, - Fill = new SolidColorBrush(_pieColors[3]), - DataLabels = true, - ToolTip = "", - LabelPoint = labelPoint - }; - PieJobSource.SeriesCollection.Add(series); - RaisePropertyChanged("PieJobSource"); - } - - public void GeneratePieJobRunStatus(int failedCount, int abortedCount, int completedCount) - { - var series = new PieSeries() - { - Title = "Failed", - Values = new ChartValues() { failedCount }, - Fill = new SolidColorBrush(_pieColors[0]), - DataLabels = true, - ToolTip = "", - LabelPoint = labelPoint - }; - - PieJobRunStatus.SeriesCollection.Add(series); - - series = new PieSeries() - { - Title = "Aborted", - Values = new ChartValues() { abortedCount }, - Fill = new SolidColorBrush(_pieColors[1]), - DataLabels = true, - ToolTip = "", - LabelPoint = labelPoint, - - }; - PieJobRunStatus.SeriesCollection.Add(series); - - series = new PieSeries() - { - Title = "Completed", - Values = new ChartValues() { completedCount }, - Fill = new SolidColorBrush(_pieColors[2]), - DataLabels = true, - ToolTip = "", - LabelPoint = labelPoint - }; - PieJobRunStatus.SeriesCollection.Add(series); - - RaisePropertyChanged("PieJobRunStatus"); - } - - public void GeneratePieGradientSolid(int gradientCount, int solidCount) - { - var series = new PieSeries() - { - Title = "Solid", - Values = new ChartValues() { solidCount }, - Fill = new SolidColorBrush(_pieColors[4]), - DataLabels = true, - ToolTip = "", - LabelPoint = labelPoint - }; - PieGradientSolid.SeriesCollection.Add(series); - - series = new PieSeries() - { - Title = "Gradient", - Values = new ChartValues() { gradientCount }, - Fill = new SolidColorBrush(_pieColors[3]), - DataLabels = true, - ToolTip = "", - LabelPoint = labelPoint - - }; - - PieGradientSolid.SeriesCollection.Add(series); - - - RaisePropertyChanged("PieGradientSolid"); - } - #endregion - - /// - /// Generates the statistics liquid quantity and TotalLiquidQuantities. - /// - public void GenerateStatisticsLiquidQuantity(List liquidQuantities) - { - LiquidQuantities = liquidQuantities; - TotalLiquidQuantities = 0; - - foreach (var item in liquidQuantities) - { - TotalLiquidQuantities += (ulong)item.Quantity; - } - } - - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/TotalLiquidQuantityModel.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/TotalLiquidQuantityModel.cs deleted file mode 100644 index b5e2e9fb7..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Models/TotalLiquidQuantityModel.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Tango.BL.Enumerations; - -namespace Tango.MachineStudio.Statistics.Models -{ - public class TotalLiquidQuantityModel - { - public LiquidTypes LiquidType { get; set; } - public ulong Quantity { get; set; } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj index 4ce0ea87d..243663c5a 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tango.MachineStudio.Statistics.csproj @@ -38,9 +38,6 @@ ..\..\..\packages\EntityFramework.6.2.0\lib\net45\EntityFramework.SqlServer.dll - - ..\..\..\packages\Google.Protobuf.3.4.1\lib\net45\Google.Protobuf.dll - ..\..\..\packages\LiveCharts.0.9.7\lib\net45\LiveCharts.dll @@ -76,38 +73,13 @@ - - - - - - - - - - - - - - - - PieChartTooltipControl.xaml - - - - - ChartsView.xaml - - - JobRunsView.xaml - MainView.xaml @@ -122,14 +94,6 @@ Designer MSBuild:Compile - - Designer - MSBuild:Compile - - - Designer - MSBuild:Compile - Designer MSBuild:Compile @@ -164,10 +128,6 @@ - - {bb2abb74-ba58-4812-83aa-ec8171f42df4} - Tango.AutoComplete - {f441feee-322a-4943-b566-110e12fd3b72} Tango.BL @@ -176,18 +136,10 @@ {a34ee0f0-649d-41c8-8489-b6f1cc6924ee} Tango.Core - - {58e8825f-0c96-449c-b320-1e82b0aa876b} - Tango.CSV - {bc932dbd-7cdb-488c-99e4-f02cf441f55e} Tango.Logging - - {e4927038-348d-4295-aaf4-861c58cb3943} - Tango.PMR - {22f87980-e990-4686-be81-be63d562c4d5} Tango.Serialization diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tooltips/PieChartTooltipControl.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tooltips/PieChartTooltipControl.xaml index b03f02249..07f1308ec 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tooltips/PieChartTooltipControl.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Tooltips/PieChartTooltipControl.xaml @@ -7,7 +7,7 @@ mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"> - + diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ValidationRules/DateExpiredRule.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ValidationRules/DateExpiredRule.cs deleted file mode 100644 index 98b90f855..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ValidationRules/DateExpiredRule.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Controls; - - -namespace Tango.MachineStudio.Statistics.ValidationRules -{ - public class DateExpiredRule : ValidationRule - { - public override ValidationResult Validate(object value, CultureInfo cultureInfo) - { - DateTime orderDate = (DateTime)value; - - return new ValidationResult(orderDate < DateTime.Now, "Please enter a date until today."); - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/ChartsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/ChartsViewVM.cs deleted file mode 100644 index a98257086..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/ChartsViewVM.cs +++ /dev/null @@ -1,364 +0,0 @@ -using LiveCharts; -using LiveCharts.Wpf; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Windows.Media; -using Tango.BL.Enumerations; -using Tango.MachineStudio.Common; -using Tango.MachineStudio.Statistics.Models; -using Tango.BL.Entities; -using Tango.SharedUI; -using Tango.BL; -using Tango.MachineStudio.Common.Notifications; -using System.Threading.Tasks; -using Tango.Core.Commands; - -namespace Tango.MachineStudio.Statistics.ViewModels -{ - public class ChartsViewVM : ViewModel - { - private INotificationProvider _notification; - //private ObservablesContext _context; - private List _job_runs; - private bool _loaded; - - #region Properties - private LabeledSeriesCollection _timelineJobStatusSeries; - public LabeledSeriesCollection TimelineJobStatusSeries - { - get { return _timelineJobStatusSeries; } - set { _timelineJobStatusSeries = value; RaisePropertyChangedAuto(); } - } - - private LabeledSeriesCollection _pieJobFailedReasons; - public LabeledSeriesCollection PieJobFailedReasons - { - get { return _pieJobFailedReasons; } - set { _pieJobFailedReasons = value; RaisePropertyChangedAuto(); } - } - - private LabeledSeriesCollection _printPerWeekSeries; - public LabeledSeriesCollection PrintPerWeekSeries - { - get { return _printPerWeekSeries; } - set { _printPerWeekSeries = value; RaisePropertyChangedAuto(); } - } - - private DateTime _startDate; - public DateTime StartDate - { - get { return _startDate; } - set { _startDate = value; RaisePropertyChangedAuto(); RaisePropertyChanged("EndDate"); } - } - - private DateTime _endDate; - public DateTime EndDate - { - get { return _endDate; } - set { _endDate = value; RaisePropertyChangedAuto(); RaisePropertyChanged("StartDate"); } - } - - public RelayCommand LoadJobRunsCommand { get; set; } - #endregion - - public ChartsViewVM(INotificationProvider notificationProvider) - { - _notification = notificationProvider; - StartDate = DateTime.Now.AddMonths(-1); - EndDate = DateTime.Now; - LoadJobRunsCommand = new RelayCommand(async () => await LoadJobRuns(), () => IsFree); - } - - #region Generate Charts - - private async Task LoadJobRuns() - { - using (_notification.PushTaskItem("Loading statistics...")) - { - try - { - IsFree = false; - - await Task.Factory.StartNew(() => - { - using (var db = ObservablesContext.CreateDefault()) - { - DateTime startUtc = new DateTime(StartDate.Year, StartDate.Month, StartDate.Day, 0, 0, 0).ToUniversalTime(); - TimeSpan offsetTime = (EndDate.Date == DateTime.Now.Date) ? DateTime.Now.TimeOfDay : new TimeSpan(23, 59, 59); - DateTime endUtc = EndDate.ToUniversalTime() + offsetTime; - - _job_runs = db.JobRuns.Where(x => (x.StartDate <= endUtc && x.StartDate >= startUtc)).OrderBy(x => x.StartDate).ToList().Select(x => new JobRunStatisticsModel(x)).ToList(); - - foreach (var run in _job_runs) - { - run.LoadMachine(db).GetAwaiter().GetResult(); - } - } - }); - - InvokeUIOnIdle(() => - { - if (_loaded) - { - OnDateRangeChanged(); - } - }); - - _loaded = true; - } - catch (Exception ex) - { - LogManager.Log(ex, "Error loading statistics."); - } - finally - { - IsFree = true; - } - } - } - - - private List GetJobRunsByDateRange(DateTime startDate, DateTime endTime, JobRunStatus? status = null) - { - return _job_runs.Where(x => x.StartDate.ToLocalTime() >= startDate && x.StartDate.ToLocalTime() <= endTime && (status == null || x.JobRunStatus == status)).ToList(); - } - - private List GetJobRunsByDate(DateTime date, JobRunStatus? status = null) - { - return _job_runs.Where(x => x.StartDate.ToLocalTime().Date == date.Date && (status == null || x.JobRunStatus == status)).ToList(); - } - - private IEnumerable CreateDates(DateTime start, DateTime end) - { - for (DateTime date = start.Date; date.Date <= end.Date; date = date.AddDays(1)) - { - yield return date; - } - } - - private void GenerateTimelineJobStatusChart() - { - TimelineJobStatusSeries = new LabeledSeriesCollection() - { - Title = "Job Runs Status", - ChartTitle = "Number Of Runs", - LabelsTitle = "Date", - SeriesColors = new List() - { - Colors.Green, - Colors.Orange, - Colors.Red, - }, - }; - - Series completed_job_runs = new ColumnSeries() - { - Title = "Completed", - Values = new ChartValues(), - Fill = Brushes.Green, - MinWidth = 1, - - }; - Series aborted_job_runs = new ColumnSeries() - { - Title = "Aborted", - Values = new ChartValues(), - Fill = Brushes.Orange, - MinWidth = 1, - }; - Series failed_job_runs = new ColumnSeries() - { - Title = "Failed", - Values = new ChartValues(), - Fill = Brushes.Red, - MinWidth = 1, - }; - - if (EndDate - StartDate > TimeSpan.FromDays(40)) - { - completed_job_runs = new LineSeries() - { - Title = "Completed", - Values = new ChartValues(), - Fill = new SolidColorBrush(Colors.Green) { Opacity = 0.5 }, - MinWidth = 1, - PointGeometry = null, - StrokeThickness = 0, - - }; - aborted_job_runs = new LineSeries() - { - Title = "Aborted", - Values = new ChartValues(), - Fill = new SolidColorBrush(Colors.Orange) { Opacity = 0.5 }, - MinWidth = 1, - PointGeometry = null, - StrokeThickness = 0, - }; - failed_job_runs = new LineSeries() - { - Title = "Failed", - Values = new ChartValues(), - Fill = new SolidColorBrush(Colors.Red) { Opacity = 0.5 }, - MinWidth = 1, - PointGeometry = null, - StrokeThickness = 0, - }; - } - - foreach (var date in CreateDates(StartDate, EndDate)) - { - completed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Completed).Count()); - aborted_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Aborted).Count()); - failed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Failed).Count()); - - TimelineJobStatusSeries.Labels.Add(date.ToShortDateString()); - } - - - - TimelineJobStatusSeries.SeriesCollection.Add(failed_job_runs); - TimelineJobStatusSeries.SeriesCollection.Add(aborted_job_runs); - TimelineJobStatusSeries.SeriesCollection.Add(completed_job_runs); - } - - private void GeneratePieFailedReasonsChart() - { - var groups = GetJobRunsByDateRange(StartDate, EndDate, JobRunStatus.Failed).GroupBy(x => x.FailedMessage).OrderBy(x => x.Count()); - - List colors = new List(); - - int max = groups.Count() > 0 ? groups.Max(x => x.Count()) : 0; - - for (int i = 0; i < groups.Count(); i++) - { - int count = groups.ElementAt(i).Count(); - double alpha = Math.Max(((double)(count) / max * 200), 20); - colors.Add(Color.FromArgb((byte)alpha, 200, 0, 0)); - } - - PieJobFailedReasons = new LabeledSeriesCollection() - { - Title = "Job Failure Reasons", - SeriesColors = colors, - }; - - int index = 0; - - foreach (var group in groups) - { - int count = group.Count(); - - var series = new PieSeries() - { - Title = group.First().FailedMessage, - Values = new ChartValues() { count }, - Fill = new SolidColorBrush(colors[index++]), - DataLabels = true, - ToolTip = group.First().FailedMessage, - }; - - PieJobFailedReasons.SeriesCollection.Add(series); - } - } - - private void GeneratePrintPerWeekChart() - { - List range_job_runs = GetJobRunsByDateRange(StartDate, EndDate); - - Dictionary> weeks_print_avg = new Dictionary>(); - - //Init machines weeks averages dictionary. - foreach (var machine in range_job_runs.Select(x => x.Machine).OrderBy(x => x.Name).DistinctBy(x => x.Guid)) - { - weeks_print_avg[machine] = new List(); - } - - //Create all available dates - List all_dates = range_job_runs.Select(x => x.StartDate).ToList(); - - //get first Sunday. - DateTime current_sunday = all_dates.FirstOrDefault(x => x.DayOfWeek == DayOfWeek.Sunday); - - if (current_sunday != null && all_dates.Count > 0) - { - //Iterate over each week starting from the earliest Sunday. - while (current_sunday <= all_dates.Last()) - { - var week_job_runs = range_job_runs.Where(x => x.EndPosition > 10 && x.StartDate >= current_sunday && x.StartDate <= current_sunday.AddDays(7)).ToList(); - - foreach (var machine_job_runs in week_job_runs.GroupBy(x => x.Machine)) - { - weeks_print_avg[machine_job_runs.Key].Add(machine_job_runs.Select(x => x.EndPosition).Average()); - } - - current_sunday = current_sunday.AddDays(8); - } - } - - Dictionary week_print_avg = new Dictionary(); - - //Init machines week average dictionary. - foreach (var machine in weeks_print_avg) - { - if (machine.Value.Count > 0) - { - week_print_avg[machine.Key] = machine.Value.Average(); - } - } - - //Init chart series - PrintPerWeekSeries = new LabeledSeriesCollection() - { - Title = "Average Printed Thread Per Week (m)", - ChartTitle = "Average Print Per Week (m)", - LabelsTitle = "Date", - SeriesColors = new List() - { - - }, - }; - - //Init series colors intensity by number of prints. - double max = week_print_avg.Count > 0 ? week_print_avg.Max(x => x.Value) : 0; - foreach (var machine in week_print_avg) - { - double a = (machine.Value / max); - PrintPerWeekSeries.SeriesColors.Add(Color.FromArgb((byte)(255d * (machine.Value / max)), 0, 200, 0)); - } - - //Init columns. - int index = 0; - - foreach (var machine in week_print_avg) - { - var series = new ColumnSeries() - { - Title = machine.Key.Name, - Values = new ChartValues() { (int)machine.Value }, - Fill = new SolidColorBrush(PrintPerWeekSeries.SeriesColors[index++]), - DataLabels = true, - ToolTip = machine.Key.SerialNumber, - }; - - PrintPerWeekSeries.SeriesCollection.Add(series); - } - } - - #endregion - - #region Filter by Date - public void OnDateRangeChanged() - { - if (_job_runs != null)// && _job_runs.Count > 0)// && _loaded) - { - GenerateTimelineJobStatusChart(); - GeneratePieFailedReasonsChart(); - GeneratePrintPerWeekChart(); - } - } - #endregion - - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/JobRunsViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/JobRunsViewVM.cs deleted file mode 100644 index ae1592d8d..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/JobRunsViewVM.cs +++ /dev/null @@ -1,729 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Data.Entity; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Tango.BL; -using Tango.BL.Builders; -using Tango.BL.Entities; -using Tango.BL.Enumerations; -using Tango.Core.Commands; -using Tango.MachineStudio.Common; -using Tango.MachineStudio.Common.Notifications; -using Tango.MachineStudio.Statistics.Models; -using Tango.SharedUI; -using Tango.SharedUI.Components; -using Tango.AutoComplete.Editors; -using System.Windows.Media; -using LiveCharts.Wpf; -using LiveCharts; -using Tango.BL.ValueObjects; -using System.Diagnostics; -using Microsoft.Win32; -using Tango.CSV; -using System.ComponentModel; - -namespace Tango.MachineStudio.Statistics.ViewModels -{ - public enum HeadCleaningSelectionEnum - { - [Description("Exclude")] - Exclude = 0, - [Description("Include")] - Include = 1, - [Description("Only")] - Only = 2 - }; - - - public class JobRunsViewVM : ViewModel - { - private INotificationProvider _notification; - private List _allMachines; - private List _allUsers; - private List _rmlsModels; - - - - #region Properties - - private ObservableCollection _jobRuns; - /// - /// Gets or sets the job runs. Contains filtered data of JobRunModel. - /// - public ObservableCollection JobRuns - { - get { return _jobRuns; } - set - { - _jobRuns = value; - RaisePropertyChangedAuto(); - } - } - - private JobRunModel _selectedJobRun = null; - /// - /// Gets or sets the JobRunModel. Binding to selected item of grid items. - /// - public JobRunModel SelectedJobRun - { - get { return _selectedJobRun; } - set - { - _selectedJobRun = value; - RaisePropertyChangedAuto(); - } - } - - private SelectedObjectCollection _selectedMachines; - /// - /// Gets or sets the selected machines. Contains all available machines and selected machines. Binding to ComboBox Machines. - /// - public SelectedObjectCollection SelectedMachines - { - get { return _selectedMachines; } - set - { - _selectedMachines = value; - RaisePropertyChangedAuto(); - } - } - - private DateTime _startSelectedDate; - /// - /// Gets or sets the start selected date. - /// - public DateTime StartSelectedDate - { - get { return _startSelectedDate; } - set { _startSelectedDate = value; - RaisePropertyChangedAuto(); - } - } - - private DateTime _endSelectedDate; - /// - /// Gets or sets the end selected date. - /// - public DateTime EndSelectedDate - { - get { return _endSelectedDate; } - set { _endSelectedDate = value; RaisePropertyChangedAuto(); } - } - - protected Double _lengthLowerValue; - /// - /// Gets or sets the length lower value of Range Slider - /// - public Double LengthLowerValue - { - get { return _lengthLowerValue; } - set - { - _lengthLowerValue = value; - RaisePropertyChangedAuto(); - } - } - - protected Double _lengthUpperValue; - /// - /// Gets or sets the length upper value of Range Slider. - /// - public Double LengthUpperValue - { - get { return _lengthUpperValue; } - set - { - _lengthUpperValue = value; - RaisePropertyChangedAuto(); - } - } - - private SelectedObjectCollection _jobRunSelectedSources; - /// - /// Gets or sets the job run selected sources. Binding to ComboBox "Source". - /// - public SelectedObjectCollection JobRunSelectedSources - { - get { return _jobRunSelectedSources; } - set { _jobRunSelectedSources = value; RaisePropertyChangedAuto(); } - } - - private SelectedObjectCollection _jobRunSelectedStatuses; - /// - /// Gets or sets the job run selected statuses. Binding to ComboBox "Status". - /// - public SelectedObjectCollection JobRunSelectedStatuses - { - get { return _jobRunSelectedStatuses; } - set { _jobRunSelectedStatuses = value; RaisePropertyChangedAuto(); } - } - - public SelectedObjectCollection _isGradientSelection; - /// - /// Gets or sets the is gradient selection. Binding to ComboBox "IsGradient". - /// - public SelectedObjectCollection IsGradientSelection - { - get { return _isGradientSelection; } - set - { - _isGradientSelection = value; - RaisePropertyChangedAuto(); - } - } - - private SelectedObjectCollection _selectedThreads; - /// - /// Gets or sets the selected threads. Contains all available threads and selected threads. Binding to ComboBox "Thread". - /// - public SelectedObjectCollection SelectedThreads - { - get { return _selectedThreads; } - set - { - _selectedThreads = value; - RaisePropertyChangedAuto(); - } - } - - private HeadCleaningSelectionEnum _headCleaningSelected; - - public HeadCleaningSelectionEnum HeadCleaningSelected - { - get { return _headCleaningSelected; } - set - { - _headCleaningSelected = value; - RaisePropertyChangedAuto(); - } - } - - - /// - /// Gets or sets the JobRuns providers. - /// - public ISuggestionProvider JobsProvider { get; set; } - - private Job _selectedJob; - /// - /// Gets or sets the job. - /// - public Job SelectedJob - { - get { return _selectedJob; } - set - { - _selectedJob = value; - RaisePropertyChangedAuto(); - } - } - - /// - /// Gets or sets the statistics value collection. Class - container included calculated statistic values. - /// - public StatisticsValueCollection StatisticsValueCollection { get; set; } - - #endregion - - public RelayCommand LoadJobRunsCommand { get; set; } - - public RelayCommand ExportToExcelCommand { get; set; } - - public JobRunsViewVM(INotificationProvider notificationProvider) - { - _notification = notificationProvider; - JobRuns = new ObservableCollection(); - LoadJobRunsCommand = new RelayCommand(async () => await LoadJobRuns(), () => IsFree); - ExportToExcelCommand = new RelayCommand(ExportToExcel, () => IsFree); - LengthUpperValue = 10000.0; - LengthLowerValue = 0.0; - DateTime now = DateTime.Now; - StartSelectedDate = now.AddMonths(-1); - EndSelectedDate = now; - - JobRunSelectedSources = new SelectedObjectCollection(new ObservableCollection() - { - JobSource.Local, - JobSource.Remote - }, new ObservableCollection() - { - JobSource.Local, - JobSource.Remote - }); - JobRunSelectedSources.SelectionChanged -= (x, y) => RaisePropertyChanged(nameof(JobRunSelectedSources)); - JobRunSelectedSources.SelectionChanged += (x, y) => RaisePropertyChanged(nameof(JobRunSelectedSources)); - - JobRunSelectedStatuses = new SelectedObjectCollection(new ObservableCollection() - { - JobRunStatus.Aborted, - JobRunStatus.Completed, - JobRunStatus.Failed, - - }, new ObservableCollection() - { - JobRunStatus.Aborted, - JobRunStatus.Completed, - JobRunStatus.Failed, - - }); - JobRunSelectedStatuses.SelectionChanged -= (x, y) => RaisePropertyChanged(nameof(JobRunSelectedStatuses)); - JobRunSelectedStatuses.SelectionChanged += (x, y) => RaisePropertyChanged(nameof(JobRunSelectedStatuses)); - - IsGradientSelection = new SelectedObjectCollection(new ObservableCollection - { - true, - false - }, new ObservableCollection - { - true, - false - }); - IsGradientSelection.SelectionChanged -= (x, y) => RaisePropertyChanged(nameof(IsGradientSelection)); - IsGradientSelection.SelectionChanged += (x, y) => RaisePropertyChanged(nameof(IsGradientSelection)); - - HeadCleaningSelected = HeadCleaningSelectionEnum.Exclude; - - JobsProvider = new SuggestionProvider((filter) => - { - try - { - if (filter != null) - { - using (ObservablesContext db = ObservablesContext.CreateDefault()) - { - return db.Jobs.Where(x => x.Name != null && x.Name.ToLower().Contains(filter.ToLower())).ToList(); - } - } - else - { - return new List(); - } - } - catch (Exception ex) - { - LogManager.Log(ex, "Error loading jobs."); - return null; - } - }); - - StatisticsValueCollection = new StatisticsValueCollection(); - } - - /// - /// Initializes this instance. Called form main view VM in OnApplicationReady - /// - public async void Init() - { - using (_notification.PushTaskItem("Loading job runs...")) - { - try - { - IsFree = false; - - using (var db = ObservablesContext.CreateDefault()) - { - _allMachines = await db.Machines.ToListAsync(); - _allUsers = await db.Users.Include(x => x.Contact).ToListAsync(); - _rmlsModels = await db.Rmls.Select(x => new RmlModel() { Name = x.Name, Guid = x.Guid }).ToListAsync(); - SelectedMachines = new SelectedObjectCollection(_allMachines.ToObservableCollection(), new ObservableCollection()); - SelectedThreads = new SelectedObjectCollection(_rmlsModels.ToObservableCollection(), new ObservableCollection()); - } - } - catch (Exception ex) - { - LogManager.Log(ex, "Error loading job runs."); - } - finally - { - IsFree = true; - } - } - - } - - /// - /// Loads the job runs by filters. - /// - private async Task LoadJobRuns() - { - using (_notification.PushTaskItem("Loading job runs...")) - { - try - { - IsFree = false; - - using (var db = ObservablesContext.CreateDefault()) - { - DateTime startUtc = new DateTime(StartSelectedDate.Year, StartSelectedDate.Month, StartSelectedDate.Day, 0, 0, 0).ToUniversalTime(); - TimeSpan offsetTime = (EndSelectedDate.Date == DateTime.Now.Date) ? DateTime.Now.TimeOfDay : new TimeSpan(23, 59, 59); - DateTime endUtc = EndSelectedDate.ToUniversalTime() + offsetTime; - - string jobName = SelectedJob == null ? "" : SelectedJob.Name; - - var db_JobRuns = db.JobRuns.Where(x => (x.StartDate <= endUtc && x.StartDate >= startUtc)) - .Select(x => new - { - x.ID, - x.ActualStartDate, - x.EndDate, - x.EndPosition, - x.GradientResolutionCm, - x.Guid, - x.HeatingStartDate, - x.IsGradient, - x.JobGuid, - x.JobLength, - x.JobName, - x.JobSource, - x.MachineGuid, - x.RmlGuid, - x.StartDate, - x.Status, - x.UploadingStartDate, - x.UserGuid, - x.CyanQuantity, - x.MagentaQuantity, - x.YellowQuantity, - x.BlackQuantity, - x.TransparentQuantity, - x.LubricantQuantity, - x.CleanerQuantity, - x.IsHeadCleaning - }); - var machineIDs = new HashSet(SelectedMachines.SynchedSource.ToList().Select(p => p.Guid)); - if (machineIDs.Count > 0) - { - db_JobRuns = db_JobRuns.Where(x => machineIDs.Contains(x.MachineGuid)); - } - int[] jobRunSourceArr = JobRunSelectedSources.SynchedSource.Select(x => (int)x).ToArray(); - if (jobRunSourceArr.Length > 0) - { - db_JobRuns = db_JobRuns.Where(x => jobRunSourceArr.Contains(x.JobSource)); - } - int[] jobRunStatusArr = JobRunSelectedStatuses.SynchedSource.Select(x => (int)x).ToArray(); - if (jobRunStatusArr.Length > 0) - { - db_JobRuns = db_JobRuns.Where(x => jobRunStatusArr.Contains(x.Status)); - } - bool[] isGradientArr = IsGradientSelection.SynchedSource.Select(x => (bool)x).ToArray(); - if (isGradientArr.Length > 0) - { - db_JobRuns = db_JobRuns.Where(x => isGradientArr.Contains(x.IsGradient)); - } - - if(HeadCleaningSelected != HeadCleaningSelectionEnum.Include) - { - bool isHeadCleaning = HeadCleaningSelected == HeadCleaningSelectionEnum.Only; - db_JobRuns = db_JobRuns.Where(x => isHeadCleaning == x.IsHeadCleaning); - } - - List rmlGuids = SelectedThreads.SynchedSource.Select(y => y.Guid).ToList(); - if (rmlGuids != null && rmlGuids.Count > 0) - { - db_JobRuns = db_JobRuns.Where(x => rmlGuids.Contains(x.RmlGuid)); - } - if (!String.IsNullOrEmpty(jobName)) - { - db_JobRuns = db_JobRuns.Where(x => x.JobName.ToLower().StartsWith(jobName.ToLower())); - } - - var runs_db = await db_JobRuns.ToListAsync(); //Execute actual query. - - - List runs = runs_db.Where(x => (x.JobLength < LengthUpperValue && x.JobLength >= LengthLowerValue)) - .Select(x => new JobRun() - { - ID = x.ID, - ActualStartDate = x.ActualStartDate, - EndDate = x.EndDate, - EndPosition = x.EndPosition, - GradientResolutionCm = x.GradientResolutionCm, - Guid = x.Guid, - HeatingStartDate = x.HeatingStartDate, - IsGradient = x.IsGradient, - JobGuid = x.JobGuid, - JobLength = x.JobLength, - JobName = x.JobName, - JobSource = x.JobSource, - MachineGuid = x.MachineGuid, - RmlGuid = x.RmlGuid, - StartDate = x.StartDate, - Status = x.Status, - UploadingStartDate = x.UploadingStartDate, - UserGuid = x.UserGuid, - CyanQuantity = x.CyanQuantity, - MagentaQuantity = x.MagentaQuantity, - YellowQuantity = x.YellowQuantity, - BlackQuantity = x.BlackQuantity, - TransparentQuantity = x.TransparentQuantity, - LubricantQuantity = x.LubricantQuantity, - CleanerQuantity = x.CleanerQuantity, - IsHeadCleaning = x.IsHeadCleaning - }).ToList(); - - var modelList = runs.Select(x => new JobRunModel() - { - JobRun = x, - Machine = _allMachines.FirstOrDefault(y => y.Guid == x.MachineGuid), - User = _allUsers.SingleOrDefault(y => y.Guid == x.UserGuid), - Rml = _rmlsModels.SingleOrDefault(y => y.Guid == x.RmlGuid), - }).OrderByDescending(x => x.JobRun.StartDate).ToList(); - - modelList.ForEach(x => x.Init()); - JobRuns = modelList.ToObservableCollection(); - GenerateStatistics(); - } - - - } - catch (Exception ex) - { - LogManager.Log(ex, "Error loading job runs."); - } - finally - { - IsFree = true; - } - } - } - - private void ExportToExcel() - { - SaveFileDialog dlg = new SaveFileDialog(); - dlg.Title = "Job Runs Statistic Report"; - dlg.Filter = "CSV Files|*.csv"; - dlg.FileName = $"Statistics_Job_runs"; - dlg.DefaultExt = ".csv"; - if (dlg.ShowDialog().Value) - { - try - { - CsvFile csvFile = new CsvFile(new CsvDestination(dlg.FileName), new CsvDefinition() - { - Columns = new List() - { - "ID", - "Machine", - "User", - "Job Name", - "Thread", - "Length", - "Source", - "Upload Duration", - "Heating Duration", - "Start Time", - "IsGradient", - "Gradient Resolution", - "Status", - "End Date", - "End Position", - "Cyan", - "Magenta", - "Yellow", - "Black", - "Transparent", - "Lubricant", - "Cleaner" - }, - }); - var selection = JobRuns.Where(z => z.JobRun.EndPosition > 0 && z.JobRun.EndDate != null && z.JobRun.ActualStartDate != null); - foreach (var jobRunModel in selection) - { - ExcelModel excel_model = new ExcelModel(); - excel_model.ID = jobRunModel.JobRun.ID.ToString(); - excel_model.Machine = jobRunModel.Machine != null ? jobRunModel.Machine.SerialNumber : ""; - excel_model.User = jobRunModel.User != null ? jobRunModel.User.Contact.FullName: ""; - excel_model.JobName = jobRunModel.JobRun.JobName; - excel_model.Thread = jobRunModel.Rml != null ? jobRunModel.Rml.Name : ""; - excel_model.Length = String.Format("{0:0.##}", jobRunModel.JobRun.JobLength); - excel_model.Source = jobRunModel.JobRun.Source.ToString(); - excel_model.UploadDuration = jobRunModel.UploadDuration != null ? ((TimeSpan)(jobRunModel.UploadDuration)).ToString(@"hh\:mm\:ss") : TimeSpan.FromSeconds(0).ToString(@"hh\:mm\:ss"); - excel_model.HeatingDuration = jobRunModel.HeatingDuration != null ? ((TimeSpan)(jobRunModel.HeatingDuration)).ToString(@"hh\:mm\:ss") : TimeSpan.FromSeconds(0).ToString(@"hh\:mm\:ss"); - excel_model.StartTime = jobRunModel.JobRun.ActualStartDate != null ? ((DateTime)jobRunModel.JobRun.ActualStartDate).ToLocalTime().ToString("MM/dd/yy HH:mm"): ""; - excel_model.IsGradient = jobRunModel.JobRun.IsGradient ? "Yes" : "No"; - excel_model.GR = jobRunModel.JobRun.GradientResolutionCm.ToString(); - excel_model.Status = jobRunModel.JobRun.JobRunStatus.ToString(); - excel_model.EndTime = jobRunModel.JobRun.EndDate != null ? ((DateTime)jobRunModel.JobRun.EndDate).ToLocalTime().ToString("MM/dd/yy HH:mm"): ""; - excel_model.EndPosition = String.Format("{0:0.##}", jobRunModel.JobRun.EndPosition); - excel_model.Cyan = jobRunModel.JobRun.CyanQuantity < 0 ? "" :jobRunModel.JobRun.CyanQuantity.ToString(); - excel_model.Magenta = jobRunModel.JobRun.MagentaQuantity < 0 ? "" : jobRunModel.JobRun.MagentaQuantity.ToString(); - excel_model.Yellow = jobRunModel.JobRun.YellowQuantity < 0 ? "" : jobRunModel.JobRun.YellowQuantity.ToString(); - excel_model.Black = jobRunModel.JobRun.BlackQuantity < 0 ? "" : jobRunModel.JobRun.BlackQuantity.ToString(); - excel_model.Transparent = jobRunModel.JobRun.TransparentQuantity < 0 ? "" : jobRunModel.JobRun.TransparentQuantity.ToString(); - excel_model.Lubricant = jobRunModel.JobRun.LubricantQuantity < 0 ? "" : jobRunModel.JobRun.LubricantQuantity.ToString(); - excel_model.Cleaner = jobRunModel.JobRun.CleanerQuantity < 0 ? "" : jobRunModel.JobRun.CleanerQuantity.ToString(); - csvFile.Append(excel_model); - - } - - csvFile.Dispose(); - _notification.ShowInfo("Report generated successfully."); - } - catch (Exception ex) - { - LogManager.Log(ex, "Error generating Statistics Job Runs report."); - _notification.ShowError($"Error generating Statistics Job Runs report..\n{ex.Message}"); - } - } - } - #region GenerateS_StatisticsValueCollection - - /// - /// Generates the statistics. - /// - protected void GenerateStatistics() - { - StatisticsValueCollection.Clean(); - if (JobRuns.Count() == 0) - return; - GenerateTotalRunsCount(); - GenerateTotalRunsLength(); - GenerateTotalThreadConsumption(); - GenerateRunsDuration(); - GenerateAverageUploadDuration(); - GenerateAverageHeatingDuration(); - - GeneratePieCharts(); - CreateThreadConsumptionPerThread(); - GenerateAllLiquidQuantities(); - } - - protected void GenerateTotalRunsCount() - {//Total Runs: - int val = JobRuns.Count(); - StatisticsValueCollection.AddStatisticsValue("Total Runs ", val, " "); - } - - /// - /// Generates the total length of the job runs. - /// - protected void GenerateTotalRunsLength() - { - double val = JobRuns.Where(z => z.JobRun.EndPosition > 0).Sum(x => x.JobRun.JobLength); - StatisticsValueCollection.AddStatisticsValue("Total Runs Length", val, " m"); - } - - /// - /// Generates the duration and average of the job runs. - /// - protected void GenerateRunsDuration() - { - var selection = JobRuns.Where(z => z.JobRun.EndPosition > 0 && z.JobRun.EndDate != null && z.JobRun.ActualStartDate != null); - double val = 0d; - double average = 0d; - if (selection != null && selection.Count() > 0) - { - val = selection.Sum(x => (x.JobRun.EndDate - x.JobRun.ActualStartDate).Value.TotalHours); - average = selection.Average(x => (x.JobRun.EndDate - x.JobRun.ActualStartDate).Value.TotalMilliseconds); - } - StatisticsValueCollection.AddStatisticsValue("Total Dyeing Time", val, " hours"); - StatisticsValueCollection.AddStatisticsValue("Average Dyeing Time", Math.Max(TimeSpan.FromMilliseconds(average).TotalHours, 0), " hours"); - } - - /// - /// Generates the average upload duration of the job runs. - /// - protected void GenerateAverageUploadDuration() - { - var average = (long)JobRuns.Where(z => z.JobRun.EndPosition > 0 && z.UploadDuration != null).Average(x => x.UploadDuration.Value.TotalMilliseconds); - StatisticsValueCollection.AddStatisticsValue("Average Upload Duration", Math.Max(TimeSpan.FromMilliseconds(average).TotalMinutes, 0), " minutes"); - } - - /// - /// Generates the average duration heating of the job runs. - /// - protected void GenerateAverageHeatingDuration() - { - var average = JobRuns.Where(z => z.JobRun.EndPosition > 0 && z.HeatingDuration != null && z.HeatingDuration.Value.Ticks > 0).Average(x => x.HeatingDuration.Value.TotalMilliseconds); - StatisticsValueCollection.AddStatisticsValue("Average Heating Duration", Math.Max(TimeSpan.FromMilliseconds(average).TotalMinutes, 0), " minutes"); - } - - /// - /// Generates the total thread consumption by EndPosition. - /// - protected void GenerateTotalThreadConsumption() - { - double val = JobRuns.Where(z => z.JobRun.EndPosition > 0).Sum(x => x.JobRun.EndPosition); - StatisticsValueCollection.AddStatisticsValue("Total Dyeing Length", val, " m"); - } - - /// - /// Generates the pie charts in percentage: JobSource, JobRunStatus, Gradient. - /// - protected void GeneratePieCharts() - { - int PPCCount = JobRuns.Count(x => x.JobRun.Source == JobSource.Local); - int MSCount = JobRuns.Count(x => x.JobRun.Source == JobSource.Remote); - StatisticsValueCollection.GeneratePieJobSource(PPCCount, MSCount); - - int failedCount = JobRuns.Count(x => x.JobRun.JobRunStatus == JobRunStatus.Failed); - int abortedCount = JobRuns.Count(x => x.JobRun.JobRunStatus == JobRunStatus.Aborted); - int completedCount = JobRuns.Count(x => x.JobRun.JobRunStatus == JobRunStatus.Completed); - StatisticsValueCollection.GeneratePieJobRunStatus(failedCount, abortedCount, completedCount); - - int gradientCount = JobRuns.Count(x => x.JobRun.IsGradient == true); - int solidCount = JobRuns.Count(x => x.JobRun.IsGradient == false); - StatisticsValueCollection.GeneratePieGradientSolid(gradientCount, solidCount); - - } - - /// - /// Creates the thread consumption per thread. - /// - protected void CreateThreadConsumptionPerThread() - { - var temp = JobRuns.Where(z => z.JobRun.EndPosition > 0 && z.Rml != null).GroupBy(x => x.Rml.Name); - List result = JobRuns.Where(z => z.JobRun.EndPosition > 0 && z.Rml != null && !String.IsNullOrEmpty(z.Rml.Name)).GroupBy(x => x.Rml.Name).Select(y => new StatisticsValue { Name = y.Key, Value = y.Sum(x => x.JobRun.EndPosition), Unit = "m" }).ToList(); - StatisticsValueCollection.CreateThreadConsumptionPerThread(result); - } - - /// - /// Generates all liquid quantities. - /// - protected void GenerateAllLiquidQuantities() - { - var runs = JobRuns.Where(z => z.JobRun.EndPosition > 0 && z.JobRun.LiquidQuantitiesFast.Count > 0).ToList(); - - Dictionary total_quantities = new Dictionary(); - - foreach (LiquidTypes ltype in (LiquidTypes[])Enum.GetValues(typeof(LiquidTypes))) - { - total_quantities[ltype] = 0; - } - - foreach (var run in runs) - { - foreach (var lq in run.JobRun.LiquidQuantitiesFast) - { - if (lq.Quantity < 0) - { - Debug.WriteLine($"Warning: JobRun '{run.JobRun.ID}' contains an invalid value '{lq.Quantity}' for {lq.LiquidType} quantity."); - } - - total_quantities[lq.LiquidType] += Convert.ToUInt64(Math.Max(lq.Quantity, 0)); - } - } - - List allLiquidQuantities = total_quantities.Select(x => new TotalLiquidQuantityModel() - { - LiquidType = x.Key, - Quantity = x.Value - }).ToList(); - - - //foreach (LiquidTypes ltype in (LiquidTypes[])Enum.GetValues(typeof(LiquidTypes))) - //{ - // var liquidQuantityByTypeList = db_liquidQuantities.Select(x => x.FirstOrDefault(y => y.LiquidType == ltype)).Where(x => x != null); - // var count = liquidQuantityByTypeList != null ? liquidQuantityByTypeList.Sum(x => x.Quantity) : 0; - // JobRunLiquidQuantity lq = new JobRunLiquidQuantity() { LiquidType = ltype, Quantity = count }; - // allLiquidQuantities.Add(lq); - //} - StatisticsValueCollection.GenerateStatisticsLiquidQuantity(allLiquidQuantities); - } - #endregion - - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs index e7e2013c5..ef9561d0b 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/ViewModels/MainViewVM.cs @@ -7,49 +7,360 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Media; using Tango.BL; +using Tango.BL.Entities; using Tango.BL.Enumerations; using Tango.Core.Helpers; using Tango.MachineStudio.Common; using Tango.MachineStudio.Statistics.Models; using System.Data.Entity; using Tango.MachineStudio.Common.Notifications; -using Tango.BL.Entities; namespace Tango.MachineStudio.Statistics.ViewModels { public class MainViewVM : StudioViewModel { + private ObservablesContext _context; + private List _job_runs; + private bool rendered; private INotificationProvider _notification; + private bool _loaded; + + private LabeledSeriesCollection _timelineJobStatusSeries; + public LabeledSeriesCollection TimelineJobStatusSeries + { + get { return _timelineJobStatusSeries; } + set { _timelineJobStatusSeries = value; RaisePropertyChangedAuto(); } + } + + private LabeledSeriesCollection _pieJobFailedReasons; + public LabeledSeriesCollection PieJobFailedReasons + { + get { return _pieJobFailedReasons; } + set { _pieJobFailedReasons = value; RaisePropertyChangedAuto(); } + } + + private LabeledSeriesCollection _printPerWeekSeries; + public LabeledSeriesCollection PrintPerWeekSeries + { + get { return _printPerWeekSeries; } + set { _printPerWeekSeries = value; RaisePropertyChangedAuto(); } + } - private ChartsViewVM _chartsViewVM; - public ChartsViewVM ChartsViewVM + private DateTime _startDate; + public DateTime StartDate { - get { return _chartsViewVM; } - set { _chartsViewVM = value; RaisePropertyChangedAuto(); } + get { return _startDate; } + set { _startDate = value; RaisePropertyChangedAuto(); OnDateRangeChanged(); } } - private JobRunsViewVM _jobRunsViewVM; - public JobRunsViewVM JobRunsViewVM + private DateTime _endDate; + public DateTime EndDate { - get { return _jobRunsViewVM; } - set { _jobRunsViewVM = value; RaisePropertyChangedAuto(); } + get { return _endDate; } + set { _endDate = value; RaisePropertyChangedAuto(); OnDateRangeChanged(); } } - + + private DateTime _minDate; + public DateTime MinDate + { + get { return _minDate; } + set { _minDate = value; RaisePropertyChangedAuto(); } + } + + private DateTime _maxDate; + public DateTime MaxDate + { + get { return _maxDate; } + set { _maxDate = value; RaisePropertyChangedAuto(); } + } + + public MainViewVM(INotificationProvider notificationProvider) { _notification = notificationProvider; - ChartsViewVM = new ChartsViewVM(_notification); - JobRunsViewVM = new JobRunsViewVM(_notification); + + StartDate = DateTime.Now.AddMonths(-1); + EndDate = DateTime.Now; } public override void OnApplicationReady() { - JobRunsViewVM.Init(); + } - public override void OnNavigatedTo() + private List GetJobRunsByDateRange(DateTime startDate, DateTime endTime, JobRunStatus? status = null) + { + return _job_runs.Where(x => x.StartDate.ToLocalTime() >= startDate && x.StartDate.ToLocalTime() <= endTime && (status == null || x.JobRunStatus == status)).ToList(); + } + + private List GetJobRunsByDate(DateTime date, JobRunStatus? status = null) + { + return _job_runs.Where(x => x.StartDate.ToLocalTime().Date == date.Date && (status == null || x.JobRunStatus == status)).ToList(); + } + + private IEnumerable CreateDates(DateTime start, DateTime end) + { + for (DateTime date = start.Date; date.Date <= end.Date; date = date.AddDays(1)) + { + yield return date; + } + } + + + + public override async void OnNavigatedTo() { base.OnNavigatedTo(); + + if (rendered) return; + + rendered = true; + + + using (_notification.PushTaskItem("Loading statistics...")) + { + IsFree = false; + + await Task.Factory.StartNew(() => + { + _context = ObservablesContext.CreateDefault(); + _job_runs = _context.JobRuns.Include(x => x.Job).Include(x => x.Job.Machine).OrderBy(x => x.StartDate).ToList(); + }); + + if (_job_runs.Count > 0) + { + MinDate = _job_runs.Min(x => x.StartDate); + MaxDate = _job_runs.Max(x => x.StartDate); + } + + InvokeUIOnIdle(() => + { + OnDateRangeChanged(); + }); + + _loaded = true; + + IsFree = true; + } + } + + private void OnDateRangeChanged() + { + if (_job_runs != null && _job_runs.Count > 0 && _loaded) + { + GenerateTimelineJobStatusChart(); + GeneratePieFailedReasonsChart(); + GeneratePrintPerWeekChart(); + } + } + + private void GenerateTimelineJobStatusChart() + { + TimelineJobStatusSeries = new LabeledSeriesCollection() + { + Title = "Job Runs Status", + ChartTitle = "Number Of Runs", + LabelsTitle = "Date", + SeriesColors = new List() + { + Colors.Green, + Colors.Orange, + Colors.Red, + }, + }; + + Series completed_job_runs = new ColumnSeries() + { + Title = "Completed", + Values = new ChartValues(), + Fill = Brushes.Green, + MinWidth = 1, + + }; + Series aborted_job_runs = new ColumnSeries() + { + Title = "Aborted", + Values = new ChartValues(), + Fill = Brushes.Orange, + MinWidth = 1, + }; + Series failed_job_runs = new ColumnSeries() + { + Title = "Failed", + Values = new ChartValues(), + Fill = Brushes.Red, + MinWidth = 1, + }; + + if (EndDate - StartDate > TimeSpan.FromDays(40)) + { + completed_job_runs = new LineSeries() + { + Title = "Completed", + Values = new ChartValues(), + Fill = new SolidColorBrush(Colors.Green) { Opacity = 0.5 }, + MinWidth = 1, + PointGeometry = null, + StrokeThickness = 0, + + }; + aborted_job_runs = new LineSeries() + { + Title = "Aborted", + Values = new ChartValues(), + Fill = new SolidColorBrush(Colors.Orange) { Opacity = 0.5 }, + MinWidth = 1, + PointGeometry = null, + StrokeThickness = 0, + }; + failed_job_runs = new LineSeries() + { + Title = "Failed", + Values = new ChartValues(), + Fill = new SolidColorBrush(Colors.Red) { Opacity = 0.5 }, + MinWidth = 1, + PointGeometry = null, + StrokeThickness = 0, + }; + } + + foreach (var date in CreateDates(StartDate, EndDate)) + { + completed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Completed).Count()); + aborted_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Aborted).Count()); + failed_job_runs.Values.Add(GetJobRunsByDate(date, JobRunStatus.Failed).Count()); + + TimelineJobStatusSeries.Labels.Add(date.ToShortDateString()); + } + + + + TimelineJobStatusSeries.SeriesCollection.Add(failed_job_runs); + TimelineJobStatusSeries.SeriesCollection.Add(aborted_job_runs); + TimelineJobStatusSeries.SeriesCollection.Add(completed_job_runs); + } + + private void GeneratePieFailedReasonsChart() + { + var groups = GetJobRunsByDateRange(StartDate, EndDate, JobRunStatus.Failed).GroupBy(x => x.FailedMessage).OrderBy(x => x.Count()); + + List colors = new List(); + + int max = groups.Count() > 0 ? groups.Max(x => x.Count()) : 0; + + for (int i = 0; i < groups.Count(); i++) + { + int count = groups.ElementAt(i).Count(); + double alpha = Math.Max(((double)(count) / max * 200), 20); + colors.Add(Color.FromArgb((byte)alpha, 200, 0, 0)); + } + + PieJobFailedReasons = new LabeledSeriesCollection() + { + Title = "Job Failure Reasons", + SeriesColors = colors, + }; + + int index = 0; + + foreach (var group in groups) + { + int count = group.Count(); + + var series = new PieSeries() + { + Title = group.First().FailedMessage, + Values = new ChartValues() { count }, + Fill = new SolidColorBrush(colors[index++]), + DataLabels = true, + ToolTip = group.First().FailedMessage, + }; + + PieJobFailedReasons.SeriesCollection.Add(series); + } + } + + private void GeneratePrintPerWeekChart() + { + List range_job_runs = GetJobRunsByDateRange(StartDate, EndDate); + + Dictionary> weeks_print_avg = new Dictionary>(); + + //Init machines weeks averages dictionary. + foreach (var machine in range_job_runs.Select(x => x.Job.Machine).OrderBy(x => x.Name).DistinctBy(x => x.Guid)) + { + weeks_print_avg[machine] = new List(); + } + + //Create all available dates + List all_dates = range_job_runs.Select(x => x.StartDate).ToList(); + + //get first Sunday. + DateTime current_sunday = all_dates.FirstOrDefault(x => x.DayOfWeek == DayOfWeek.Sunday); + + if (current_sunday != null && all_dates.Count > 0) + { + //Iterate over each week starting from the earliest Sunday. + while (current_sunday <= all_dates.Last()) + { + var week_job_runs = range_job_runs.Where(x => x.EndPosition > 10 && x.StartDate >= current_sunday && x.StartDate <= current_sunday.AddDays(7)).ToList(); + + foreach (var machine_job_runs in week_job_runs.GroupBy(x => x.Job.Machine)) + { + weeks_print_avg[machine_job_runs.Key].Add(machine_job_runs.Select(x => x.EndPosition).Average()); + } + + current_sunday = current_sunday.AddDays(8); + } + } + + Dictionary week_print_avg = new Dictionary(); + + //Init machines week average dictionary. + foreach (var machine in weeks_print_avg) + { + if (machine.Value.Count > 0) + { + week_print_avg[machine.Key] = machine.Value.Average(); + } + } + + //Init chart series + PrintPerWeekSeries = new LabeledSeriesCollection() + { + Title = "Average Printed Thread Per Week (m)", + ChartTitle = "Average Print Per Week (m)", + LabelsTitle = "Date", + SeriesColors = new List() + { + + }, + }; + + //Init series colors intensity by number of prints. + double max = week_print_avg.Count > 0 ? week_print_avg.Max(x => x.Value) : 0; + foreach (var machine in week_print_avg) + { + double a = (machine.Value / max); + PrintPerWeekSeries.SeriesColors.Add(Color.FromArgb((byte)(255d * (machine.Value / max)), 0, 200, 0)); + } + + //Init columns. + int index = 0; + + foreach (var machine in week_print_avg) + { + var series = new ColumnSeries() + { + Title = machine.Key.Name, + Values = new ChartValues() { (int)machine.Value }, + Fill = new SolidColorBrush(PrintPerWeekSeries.SeriesColors[index++]), + DataLabels = true, + ToolTip = machine.Key.SerialNumber, + }; + + PrintPerWeekSeries.SeriesCollection.Add(series); + } } } } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml deleted file mode 100644 index b76154941..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - - - - - Start Date: - - - - - - - - - - - - - End Date: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml.cs deleted file mode 100644 index bd97ed2bc..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/ChartsView.xaml.cs +++ /dev/null @@ -1,74 +0,0 @@ -using LiveCharts; -using LiveCharts.Wpf; -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.Navigation; -using System.Windows.Shapes; - -namespace Tango.MachineStudio.Statistics.Views -{ - /// - /// Interaction logic for ChartsView.xaml - /// - public partial class ChartsView : UserControl - { - public ChartsView() - { - InitializeComponent(); - } - private void PieChart_DataHover(object sender, ChartPoint chartPoint) - { - var tooltip = ((chartPoint.ChartView as PieChart).DataTooltip as Tooltips.PieChartTooltipControl).Title; - txtPieTitle.Text = tooltip; - } - private void StartDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) - { - DatePicker datePickerObj = sender as DatePicker; - if (datePickerObj != null && datePickerObj.SelectedDate != null && endDatePicker.SelectedDate != null) - { - if (datePickerObj.SelectedDate > endDatePicker.SelectedDate) - { - BindingExpression start_be = datePickerObj.GetBindingExpression(DatePicker.SelectedDateProperty); - ValidationError validationError = new ValidationError(StartDateExpiredRule, start_be); - validationError.ErrorContent = "The start time must be less than or equal to end time."; - Validation.MarkInvalid(start_be, validationError); - } - else if (Validation.GetHasError(endDatePicker)) - { - BindingExpression end_be = endDatePicker.GetBindingExpression(DatePicker.SelectedDateProperty); - Validation.ClearInvalid(end_be); - } - } - } - - private void EndDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) - { - DatePicker datePickerObj = sender as DatePicker; - if (datePickerObj.SelectedDate != null && startdatePicker.SelectedDate != null) - { - if (datePickerObj != null && datePickerObj.SelectedDate < startdatePicker.SelectedDate) - { - BindingExpression end_be = datePickerObj.GetBindingExpression(DatePicker.SelectedDateProperty); - ValidationError validationError = new ValidationError(EndDateExpiredRule, end_be); - validationError.ErrorContent = "The end time must be greater than or equal to the start time."; - Validation.MarkInvalid(end_be, validationError); - } - else if (Validation.GetHasError(startdatePicker)) - { - BindingExpression start_be = startdatePicker.GetBindingExpression(DatePicker.SelectedDateProperty); - Validation.ClearInvalid(start_be); - } - } - } - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml deleted file mode 100644 index bc99c1bfa..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml +++ /dev/null @@ -1,787 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Start Date: - - - - - - - - - - - - End Date: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml.cs deleted file mode 100644 index 961d7f691..000000000 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/JobRunsView.xaml.cs +++ /dev/null @@ -1,175 +0,0 @@ -using LiveCharts; -using LiveCharts.Wpf; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.ObjectModel; -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.Navigation; -using System.Windows.Shapes; -using Tango.SharedUI.Components; - -namespace Tango.MachineStudio.Statistics.Views -{ - /// - /// Interaction logic for JobRunsView.xaml - /// - public partial class JobRunsView : UserControl - { - private int _lastSelectedGridItemIndex; - public JobRunsView() - { - InitializeComponent(); - _lastSelectedGridItemIndex = -1; - } - - - private void Button_Click(object sender, RoutedEventArgs e) - { - selectMachineButton.IsChecked = true; - e.Handled = true; - } - - private void JobRunSourcesButton_Click(object sender, RoutedEventArgs e) - { - selectJobRunSources.IsChecked = true; - e.Handled = true; - } - private void IsGradientButton_Click(object sender, RoutedEventArgs e) - { - selectIsGradient.IsChecked = true; - e.Handled = true; - } - private void JobRunStatusButton_Click(object sender, RoutedEventArgs e) - { - selectJobRunStatus.IsChecked = true; - e.Handled = true; - } - - private async void TextBox_GotFocus(object sender, RoutedEventArgs e) - { - await Task.Delay(200); - TextBox txtBox = sender as TextBox; - txtBox.SelectAll(); - } - - private void TextBox_PreviewMouseUp(object sender, MouseButtonEventArgs e) - { - e.Handled = true; - } - - private void SelectMachineButton_Click(object sender, RoutedEventArgs e) - { - selectThreadsButton.IsChecked = true; - e.Handled = true; - } - - private void IsHeadCleaningButton_Click(object sender, RoutedEventArgs e) - { - isHeadCleaningToggleButton.IsChecked = true; - e.Handled = true; - } - - private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) - { - DataGrid dataGrid = sender as DataGrid; - _lastSelectedGridItemIndex = -1; - if (e.AddedItems != null && e.AddedItems.Count > 0) - { - DataGridRow row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(e.AddedItems[0]); - if (row != null) - { - _lastSelectedGridItemIndex = row.GetIndex(); - } - } - } - - private void StartDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) - { - DatePicker datePickerObj = sender as DatePicker; - if(datePickerObj != null && datePickerObj.SelectedDate != null && endDatePicker.SelectedDate != null) - { - if(datePickerObj.SelectedDate> endDatePicker.SelectedDate) - { - BindingExpression start_be = datePickerObj.GetBindingExpression(DatePicker.SelectedDateProperty); - ValidationError validationError = new ValidationError(StartDateExpiredRule, start_be); - validationError.ErrorContent = "The start time must be less than or equal to end time."; - Validation.MarkInvalid(start_be, validationError); - } - else if (Validation.GetHasError(endDatePicker)) - { - BindingExpression end_be = endDatePicker.GetBindingExpression(DatePicker.SelectedDateProperty); - Validation.ClearInvalid(end_be); - } - } - } - - private void EndDatePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) - { - DatePicker datePickerObj = sender as DatePicker; - if (datePickerObj.SelectedDate != null && startdatePicker.SelectedDate != null ) - { - if(datePickerObj != null && datePickerObj.SelectedDate < startdatePicker.SelectedDate) - { - BindingExpression end_be = datePickerObj.GetBindingExpression(DatePicker.SelectedDateProperty); - ValidationError validationError = new ValidationError(EndDateExpiredRule, end_be); - validationError.ErrorContent = "The end time must be greater than or equal to the start time."; - Validation.MarkInvalid(end_be, validationError); - } - else if (Validation.GetHasError(startdatePicker)) - { - BindingExpression start_be = startdatePicker.GetBindingExpression(DatePicker.SelectedDateProperty); - Validation.ClearInvalid(start_be); - } - } - } - - private void CheckBox_PreventUndoCheck(object sender, RoutedEventArgs e) - { - if( sender is CheckBox) - { - CheckBox cb = sender as CheckBox; - if (cb.IsChecked == false) - { - cb.IsChecked = true; - e.Handled = true; - return; - } - } - e.Handled = false; - } - private void CheckBox_StayChecked(object sender, RoutedEventArgs e) - { - if (sender is CheckBox) - { - CheckBox cb = sender as CheckBox; - if (cb.IsChecked == false) - { - var col = cb.Tag; - Type type = col.GetType(); - if (col != null && col.GetType().GetGenericTypeDefinition() == typeof(SelectedObjectCollection<>)) - { - dynamic dSynchedSource = type.GetProperty("SynchedSource").GetValue(col); - if(dSynchedSource != null && dSynchedSource.GetType().GetGenericTypeDefinition() == typeof(ObservableCollection<>) && dSynchedSource.Count == 0) - { - cb.IsChecked = true; - e.Handled = true; - return; - } - } - } - } - e.Handled = false; - } - - } -} diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml index 21c099db9..55804c7b3 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml @@ -11,28 +11,100 @@ xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" mc:Ignorable="d" d:DesignHeight="1080" d:DesignWidth="1920" Background="Transparent" d:DataContext="{d:DesignInstance Type=vm:MainViewVM, IsDesignTimeCreatable=False}" DataContext="{x:Static global:ViewModelLocator.MainViewVM}"> - + - - + + - - - - - - - - - - - - - - + + + + Start Date: + + + + + End Date: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml.cs index f0d1c39a7..3948c4e5a 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml.cs +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/Views/MainView.xaml.cs @@ -28,6 +28,10 @@ namespace Tango.MachineStudio.Statistics.Views InitializeComponent(); } - + private void PieChart_DataHover(object sender, ChartPoint chartPoint) + { + var tooltip = ((chartPoint.ChartView as PieChart).DataTooltip as Tooltips.PieChartTooltipControl).Title; + txtPieTitle.Text = tooltip; + } } } diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/packages.config b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/packages.config index 6938c8a4b..31c5f029f 100644 --- a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/packages.config +++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Statistics/packages.config @@ -1,7 +1,6 @@  - -- cgit v1.3.1