FSM.xaml.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Media;
  6. using Aitex.Core.RT.DataCenter;
  7. using Aitex.Core.UI.MVVM;
  8. using Aitex.Core.Util;
  9. namespace CyberX8_RT.Backends
  10. {
  11. /// <summary>
  12. /// Interaction logic for FSM.xaml
  13. /// </summary>
  14. public partial class FSMView : UserControl
  15. {
  16. public FSMView()
  17. {
  18. InitializeComponent();
  19. this.DataContext = new FsmViewModel();
  20. this.IsVisibleChanged += FSM_IsVisibleChanged;
  21. }
  22. private void FSM_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e)
  23. {
  24. if (this.DataContext is FsmViewModel vm)
  25. {
  26. vm.EnableTimer(this.IsVisible);
  27. }
  28. }
  29. }
  30. public class GridOptions
  31. {
  32. //暂时不处理实时显示的事情
  33. #region 显示边框信息
  34. public static readonly DependencyProperty ShowBorderProperty =
  35. DependencyProperty.RegisterAttached("ShowBorder", typeof(bool), typeof(GridOptions)
  36. , new PropertyMetadata(OnShowBorderChanged));
  37. public static bool GetShowBorder(DependencyObject obj)
  38. {
  39. return (bool)obj.GetValue(ShowBorderProperty);
  40. }
  41. // private static bool flag = false;
  42. public static void SetShowBorder(DependencyObject obj, bool value)
  43. {
  44. obj.SetValue(ShowBorderProperty, value);
  45. }
  46. public static void OnShowBorderChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  47. {
  48. var grid = d as Grid;
  49. if ((bool)e.OldValue)
  50. grid.Loaded -= (s, arg) => { };
  51. else
  52. {
  53. grid.Loaded += new RoutedEventHandler(GridLoaded);
  54. }
  55. }
  56. #endregion
  57. #region 线宽信息
  58. public static readonly DependencyProperty LineThicknessProperty =
  59. DependencyProperty.RegisterAttached("LineThickness", typeof(double), typeof(GridOptions),
  60. new PropertyMetadata(1d, OnGridLineThicknessChanged));
  61. public static double GetLineThickness(DependencyObject obj)
  62. {
  63. return (double)obj.GetValue(LineThicknessProperty);
  64. }
  65. public static void SetLineThickness(DependencyObject obj, double value)
  66. {
  67. obj.SetValue(LineThicknessProperty, value);
  68. }
  69. public static void OnGridLineThicknessChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  70. {
  71. }
  72. #endregion
  73. public static readonly DependencyProperty LineBrushProperty =
  74. DependencyProperty.RegisterAttached("LineBrush", typeof(Brush), typeof(GridOptions),
  75. new PropertyMetadata(Brushes.Gray, OnGridLineBrushChanged));
  76. #region 线画刷问题
  77. public static Brush GetLineBrush(DependencyObject obj)
  78. {
  79. var brush = (Brush)obj.GetValue(LineBrushProperty);
  80. return brush ?? Brushes.LightGray;
  81. }
  82. public static void SetLineBrush(DependencyObject obj, Brush value)
  83. {
  84. obj.SetValue(LineBrushProperty, value);
  85. }
  86. public static void OnGridLineBrushChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  87. {
  88. }
  89. #endregion
  90. private static void GridLoaded(object sender, RoutedEventArgs e)
  91. {
  92. #region 思路
  93. /*
  94. * 1、覆盖所有单元格都要包围上边框。
  95. * 2、边框线不能存在重复。每个单元格绘制【右下】部分,主体绘制右上部分
  96. */
  97. #endregion
  98. var grid = sender as Grid;
  99. foreach (UIElement item in grid.Children)
  100. {
  101. if (item is Border)
  102. {
  103. return;
  104. }
  105. }
  106. var rowCount = Math.Max(1, grid.RowDefinitions.Count);
  107. var columnCount = Math.Max(1, grid.ColumnDefinitions.Count);
  108. #region 初始化标准数组
  109. int[,] flagArray = new int[rowCount, columnCount];
  110. #endregion
  111. var controls = grid.Children;
  112. var count = controls.Count;
  113. var settingThickness = GetLineThickness(grid);
  114. var borderBrush = GetLineBrush(grid);
  115. for (int i = 0; i < count; i++)
  116. {
  117. var item = controls[i] as FrameworkElement;
  118. var row = Grid.GetRow((item));
  119. var column = Grid.GetColumn(item);
  120. var rowSpan = Grid.GetRowSpan(item);
  121. var columnSpan = Grid.GetColumnSpan(item);
  122. for (int rowTemp = 0; rowTemp < rowSpan; rowTemp++)
  123. {
  124. for (int colTemp = 0; colTemp < columnSpan; colTemp++)
  125. {
  126. flagArray[rowTemp + row, colTemp + column] = 1;
  127. }
  128. }
  129. var border = CreateBorder(row, column, rowSpan, columnSpan, settingThickness);
  130. border.BorderBrush = borderBrush;
  131. grid.Children.RemoveAt(i);
  132. border.Child = item;
  133. grid.Children.Insert(i, border);
  134. }
  135. #region 整理为填充单元格
  136. for (int i = 0; i < rowCount; i++)
  137. {
  138. for (int k = 0; k < columnCount; k++)
  139. {
  140. if (flagArray[i, k] == 0)
  141. {
  142. var border = CreateBorder(i, k, 1, 1, settingThickness);
  143. border.BorderBrush = borderBrush;
  144. grid.Children.Add(border);
  145. }
  146. }
  147. }
  148. #endregion
  149. }
  150. private static Border CreateBorder(int row, int column, int rowSpan, int columnSpan, double thickness)
  151. {
  152. var useThickness = new Thickness(0, 0, thickness, thickness);
  153. if (row == 0)
  154. useThickness.Top = thickness;
  155. if (column == 0)
  156. useThickness.Left = thickness;
  157. var border = new Border()
  158. {
  159. BorderThickness = useThickness,
  160. };
  161. Grid.SetRow(border, row);
  162. Grid.SetColumn(border, column);
  163. Grid.SetRowSpan(border, rowSpan);
  164. Grid.SetColumnSpan(border, columnSpan);
  165. return border;
  166. }
  167. }
  168. public class FsmViewModel : SubscriptionViewModelBase
  169. {
  170. [Subscription("EFEM.FsmPrevState")]
  171. public string EFEMPrevState { get; set; }
  172. [Subscription("EFEM.FsmState")]
  173. public string EFEMState { get; set; }
  174. [Subscription("EFEM.FsmLastMessage")]
  175. public string EFEMLastMsg { get; set; }
  176. //LP1
  177. [Subscription("LP1.FsmPrevState")]
  178. public string LP1PrevState { get; set; }
  179. [Subscription("LP1.FsmState")]
  180. public string LP1State { get; set; }
  181. [Subscription("LP1.FsmLastMessage")]
  182. public string LP1LastMsg { get; set; }
  183. //LP2
  184. [Subscription("LP2.FsmPrevState")]
  185. public string LP2PrevState { get; set; }
  186. [Subscription("LP2.FsmState")]
  187. public string LP2State { get; set; }
  188. [Subscription("LP2.FsmLastMessage")]
  189. public string LP2LastMsg { get; set; }
  190. //LP3
  191. [Subscription("LP3.FsmPrevState")]
  192. public string LP3PrevState { get; set; }
  193. [Subscription("LP3.FsmState")]
  194. public string LP3State { get; set; }
  195. [Subscription("LP3.FsmLastMessage")]
  196. public string LP3LastMsg { get; set; }
  197. // Constructor
  198. //
  199. public FsmViewModel() : base(nameof(FsmViewModel))
  200. {
  201. PollDataFunction = PerformPollDataFunction;
  202. }
  203. private Dictionary<string, object> PerformPollDataFunction(IEnumerable<string> arg)
  204. {
  205. return DATA.PollData(arg);
  206. }
  207. }
  208. }