DataMangerViewModel.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using HandyControl.Interactivity.Commands;
  2. using OxyPlot;
  3. using OxyPlot.Series;
  4. using Shaker.ViewModel;
  5. using ShakerManger.Data;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Collections.ObjectModel;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using System.Windows.Controls;
  13. using System.Windows.Input;
  14. namespace ShakerManger.ViewModel
  15. {
  16. internal class DataMangerViewModel:DisplayViewModel<Shaker.Model.ModelBase>,IMainPageViewModel
  17. {
  18. private List<string> _PropertieNames = new List<string>()
  19. {
  20. nameof(LineSeries.Color),
  21. nameof(LineSeries.DataFieldX),
  22. nameof(LineSeries.DataFieldY),
  23. nameof(LineSeries.Title),
  24. nameof(LineSeries.StrokeThickness),
  25. nameof(LineSeries.MarkerSize),
  26. nameof(LineSeries.LineJoin),
  27. nameof(LineSeries.LineStyle),
  28. nameof(LineSeries.MarkerType),
  29. nameof(LineSeries.MarkerFill),
  30. nameof(LineSeries.MarkerStroke),
  31. nameof(LineSeries.MarkerStrokeThickness),
  32. };
  33. public DataMangerViewModel()
  34. {
  35. PlotModel.TextColor = OxyColors.White;
  36. PlotModel.TitleColor = OxyColors.White;
  37. PlotModel.PlotAreaBorderColor = OxyColors.White;
  38. PlotModel.Axes.Add(new OxyPlot.Axes.DateTimeAxis()
  39. {
  40. Title = "时间",
  41. Position = OxyPlot.Axes.AxisPosition.Bottom,
  42. Key = "X",
  43. MaximumPadding = 0,
  44. MajorGridlineColor = OxyPlot.OxyColors.Gray,
  45. MajorGridlineStyle = LineStyle.Dot,
  46. MajorGridlineThickness = 1,
  47. MinimumPadding = 0,
  48. ExtraGridlineColor = OxyPlot.OxyColors.White,
  49. TextColor = OxyColors.White,
  50. TitleColor = OxyColors.White,
  51. AxislineColor = OxyColors.White,
  52. TicklineColor = OxyColors.White,
  53. });
  54. PlotModel.Axes.Add(new OxyPlot.Axes.LinearAxis()
  55. {
  56. Title = "值",
  57. Position = OxyPlot.Axes.AxisPosition.Left,
  58. Key = "Y",
  59. MajorGridlineStyle = LineStyle.Dot,
  60. MajorGridlineColor = OxyPlot.OxyColors.Gray,
  61. MajorGridlineThickness = 1,
  62. ExtraGridlineColor = OxyPlot.OxyColors.White,
  63. TextColor = OxyColors.White,
  64. TitleColor = OxyColors.White,
  65. AxislineColor = OxyColors.White,
  66. TicklineColor = OxyColors.White,
  67. });
  68. }
  69. private string selectedShaker = string.Empty;
  70. private DateTime startTime;
  71. private DateTime endTime = DateTime.Now;
  72. public DateTime StartTime { get => startTime; set => UpdateProperty(ref startTime, value); }
  73. public DateTime EndTime { get => endTime; set => UpdateProperty(ref endTime, value); }
  74. public string SelectedShaker { get => selectedShaker; set => UpdateProperty(ref selectedShaker, value); }
  75. public ObservableCollection<KeyValuePair<string, string>> Shakers { get; } = new ObservableCollection<KeyValuePair<string, string>>();
  76. private bool isEnabled = true;
  77. private bool isOpen = false;
  78. public MainPageType MainPageType => MainPageType.DataManger;
  79. public ICommand SeachCommand => new DelegateCommand(Search);
  80. public bool IsEnabled { get => isEnabled; set => UpdateProperty(ref isEnabled, value); }
  81. public string IconPath { get; } = (string)App.Current.FindResource("DataMangerIcon");
  82. public ICommand ExportCommand => new DelegateCommand(Export);
  83. private void Export()
  84. {
  85. }
  86. private void Search()
  87. {
  88. var shaker = MainWindowViewModel.Default.Shakers.Shakers.FirstOrDefault(x => x.Model.Id == SelectedShaker);
  89. if(shaker==null)
  90. {
  91. PromptViewModel.Default.Init();
  92. PromptViewModel.Default.NoVisibility = System.Windows.Visibility.Collapsed;
  93. PromptViewModel.Default.Message = "找不到该振动台";
  94. PromptViewModel.Default.IsOpen = true;
  95. return;
  96. }
  97. if (StartTime > EndTime)
  98. {
  99. PromptViewModel.Default.Init();
  100. PromptViewModel.Default.NoVisibility = System.Windows.Visibility.Collapsed;
  101. return;
  102. }
  103. Datas.Clear();
  104. var datas = Sql.Default.Find<Shaker.Model.DataMangerItemModel>(x=>x.Time>=StartTime&&x.Time<=EndTime,name:SelectedShaker).ToList();
  105. if(datas ==null || datas.Count()==0)
  106. {
  107. PromptViewModel.Default.Init();
  108. PromptViewModel.Default.NoVisibility = System.Windows.Visibility.Collapsed;
  109. PromptViewModel.Default.Message = "没有找到数据";
  110. PromptViewModel.Default.IsOpen = true;
  111. return;
  112. }
  113. foreach (var data in datas)
  114. {
  115. Datas.Add(data);
  116. }
  117. PlotConfig.Clear();
  118. PlotModel.InvalidatePlot(false);
  119. PlotModel.Axes[0].Title = $"时间({datas[0].Time:yyyy-MM-dd})";
  120. PlotModel.Series.Clear();
  121. foreach(var val in shaker.PlotModel.Series.OfType<LineSeries>())
  122. {
  123. var series = new LineSeries();
  124. typeof(LineSeries).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)
  125. .Where(x => x.CanRead && x.CanWrite && _PropertieNames.Contains(x.Name))
  126. .ToList()
  127. .ForEach(x =>
  128. {
  129. x.SetValue(series, x.GetValue(val));
  130. });
  131. series.ItemsSource = Datas;
  132. PlotConfig.Add(new PlotConfigViewModel(series));
  133. PlotConfig[^1].PropertyChanged += (_, _) =>
  134. {
  135. PlotModel.InvalidatePlot(true);
  136. };
  137. PlotModel.Series.Add(series);
  138. }
  139. PlotModel.Legends.Add(new OxyPlot.Legends.Legend()
  140. {
  141. IsLegendVisible = true,
  142. ShowInvisibleSeries = true,
  143. });
  144. PlotModel.InvalidatePlot(true);
  145. OnPropertyChanged(nameof(IsConfigEnabled));
  146. }
  147. public bool IsConfigEnabled=>PlotConfig.Count>0;
  148. public bool IsOpen { get => isOpen; set =>UpdateProperty(ref isOpen, value); }
  149. public ObservableCollection<PlotConfigViewModel> PlotConfig { get; } = new ObservableCollection<PlotConfigViewModel>();
  150. public override Type View { get; } = typeof(View.DataRecordMangerView);
  151. public OxyPlot.PlotModel PlotModel { get; }= new OxyPlot.PlotModel();
  152. public ObservableCollection<Shaker.Model.DataMangerItemModel> Datas { get; } = new ObservableCollection<Shaker.Model.DataMangerItemModel>();
  153. }
  154. }