终端一体化运控平台
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

NewConveyorBelt.xaml.cs 21 KiB

2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
2年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. using BPASmartClient.Compiler;
  2. using BPASmartClient.MessageCommunication;
  3. using BPASmartClient.MessageCommunication.MsgControl;
  4. using BPASmartClient.MessageName;
  5. using BPASmartClient.MessageName.EnumHelp;
  6. using BPASmartClient.MessageName.发送消息Model;
  7. using BPASmartClient.MessageName.接收消息Model;
  8. using BPASmartClient.MessageName.接收消息Model.滚动线;
  9. using Newtonsoft.Json;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Collections.ObjectModel;
  13. using System.ComponentModel;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. using System.Windows;
  18. using System.Windows.Controls;
  19. using System.Windows.Data;
  20. using System.Windows.Documents;
  21. using System.Windows.Input;
  22. using System.Windows.Media;
  23. using System.Windows.Media.Animation;
  24. using System.Windows.Media.Imaging;
  25. using System.Windows.Navigation;
  26. using System.Windows.Shapes;
  27. namespace BPASmartClient.SCADAControl.CustomerControls
  28. {
  29. /// <summary>
  30. /// 滚筒线
  31. /// NewConveyorBelt.xaml 的交互逻辑
  32. /// </summary>
  33. public partial class NewConveyorBelt : UserControl, IExecutable
  34. {
  35. #region 临时变量
  36. TextBlock textBlock = null;
  37. Path Path_mp = null;
  38. Path Path_cb = null;
  39. Storyboard storyboard = new Storyboard();
  40. Storyboard storyboard1 = new Storyboard();
  41. #endregion
  42. public event EventHandler PropertyChange; //声明一个事件
  43. public NewConveyorBelt()
  44. {
  45. InitializeComponent();
  46. Width = 1200;
  47. Height = 400;
  48. this.SizeChanged += ConveyorBelt_SizeChanged;
  49. ConveyorBeltWidth = 70;
  50. Direction = 0;
  51. StrokeBrush = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#00BEFA"));
  52. StrokeDashArray = new DoubleCollection { 1.5, 1.5 };
  53. StrokeFillBrush = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#00BEFA"));
  54. StrokeThickness = 2;
  55. this.Loaded += NewConveyorBelt_Loaded; ;
  56. }
  57. private void NewConveyorBelt_Loaded(object sender, RoutedEventArgs e)
  58. {
  59. EventReceiveNameList.CollectionChanged += EventNameList_CollectionChanged;
  60. EventSendNameList.CollectionChanged += EventSendNameList_CollectionChanged;
  61. }
  62. private void EventSendNameList_CollectionChanged(object? sender,System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  63. {
  64. if (EventSendNameList.Count > 0)
  65. {
  66. try
  67. {
  68. EventSendNameListStr = JsonConvert.SerializeObject(EventSendNameList);
  69. }
  70. catch (Exception ex)
  71. {
  72. }
  73. }
  74. }
  75. private void EventNameList_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
  76. {
  77. if (EventReceiveNameList.Count > 0)
  78. {
  79. try
  80. {
  81. EventReceiveNameListStr = JsonConvert.SerializeObject(EventReceiveNameList);
  82. }
  83. catch (Exception ex)
  84. {
  85. }
  86. }
  87. }
  88. public string ControlType => "滚动线";
  89. private bool isExecuteState;
  90. public bool IsExecuteState
  91. {
  92. get { return isExecuteState; }
  93. set
  94. {
  95. isExecuteState = value;
  96. if (IsExecuteState)
  97. {
  98. IsEnabled = true;
  99. Register();
  100. //Style = null;
  101. }
  102. }
  103. }
  104. #region 内部函数
  105. public void VisualStateManagerData()
  106. {
  107. storyboard.RepeatBehavior = RepeatBehavior.Forever;
  108. DoubleAnimation dbAscending = new DoubleAnimation
  109. {
  110. From = 0,
  111. To = 100,
  112. Duration = new Duration(new TimeSpan(0, 0, 20)),
  113. };
  114. storyboard.Children.Add(dbAscending);
  115. Storyboard.SetTarget(dbAscending, Path_mp);
  116. Storyboard.SetTargetProperty(dbAscending, new PropertyPath("StrokeDashOffset"));
  117. storyboard1.RepeatBehavior = RepeatBehavior.Forever;
  118. DoubleAnimation dbAscending1 = new DoubleAnimation
  119. {
  120. From = 0,
  121. To = -100,
  122. Duration = new Duration(new TimeSpan(0, 0, 20)),
  123. };
  124. storyboard1.Children.Add(dbAscending1);
  125. Storyboard.SetTarget(dbAscending1, Path_mp);
  126. Storyboard.SetTargetProperty(dbAscending1, new PropertyPath("StrokeDashOffset"));
  127. Refursh();
  128. }
  129. private void ConveyorBelt_SizeChanged(object sender, SizeChangedEventArgs e)
  130. {
  131. //查找
  132. if (!(Path_cb != null && Path_mp != null))
  133. {
  134. foreach (Path tb in FindVisualChildren<Path>(this))
  135. {
  136. // do something with tb here
  137. if (tb.Tag != null)
  138. {
  139. if (tb.Tag.ToString() == "cb")
  140. {
  141. Path_cb = tb;
  142. }
  143. else if (tb.Tag.ToString() == "mp")
  144. {
  145. Path_mp = tb;
  146. }
  147. }
  148. }
  149. VisualStateManagerData();
  150. }
  151. if (textBlock == null)
  152. {
  153. foreach (TextBlock tb in FindVisualChildren<TextBlock>(this))
  154. {
  155. // do something with tb here
  156. if (tb.Tag != null)
  157. {
  158. if (tb.Tag.ToString() == "标题")
  159. {
  160. textBlock = tb;
  161. }
  162. }
  163. }
  164. }
  165. if (this.Height > 0 && this.Width > 0)
  166. {
  167. try
  168. {
  169. //传送带外边框绘制
  170. PathGeometry geometry = new PathGeometry();
  171. PathFigure pathFigure = new PathFigure();
  172. pathFigure.StartPoint = new Point(this.Height / 2, 0);
  173. pathFigure.Segments.Add(new ArcSegment(new Point(this.Height / 2, this.Height), new Size(this.Height / 2, this.Height / 2), 0, false, SweepDirection.Counterclockwise, true));
  174. pathFigure.Segments.Add(new LineSegment(new Point(this.Width, this.Height), true));
  175. pathFigure.Segments.Add(new LineSegment(new Point(this.Width, this.Height - ConveyorBeltWidth), true));
  176. double innerCircle = (this.Height - (ConveyorBeltWidth * 2)) / 2;//内圆半径
  177. pathFigure.Segments.Add(new LineSegment(new Point(ConveyorBeltWidth + innerCircle, this.Height - ConveyorBeltWidth), true));
  178. pathFigure.Segments.Add(new ArcSegment(new Point(ConveyorBeltWidth + innerCircle, ConveyorBeltWidth), new Size(innerCircle, innerCircle), 0, false, SweepDirection.Clockwise, true));
  179. pathFigure.Segments.Add(new LineSegment(new Point(this.Width, ConveyorBeltWidth), true));
  180. pathFigure.Segments.Add(new LineSegment(new Point(this.Width, 0), true));
  181. pathFigure.Segments.Add(new LineSegment(new Point(this.Height / 2, 0), true));
  182. geometry.Figures.Add(pathFigure);
  183. Path_cb.Data = geometry;
  184. //传送带内部皮带绘制
  185. PathGeometry geometry1 = new PathGeometry();
  186. PathFigure pathFigure1 = new PathFigure();
  187. pathFigure1.StartPoint = new Point(this.Width, ConveyorBeltWidth / 2);
  188. double innerCircle1 = (this.Height - ConveyorBeltWidth) / 2;//内圆半径
  189. pathFigure1.Segments.Add(new LineSegment(new Point(innerCircle1 + ConveyorBeltWidth / 2, ConveyorBeltWidth / 2), true));
  190. pathFigure1.Segments.Add(new ArcSegment(new Point(innerCircle1 + ConveyorBeltWidth / 2, this.Height - ConveyorBeltWidth / 2), new Size(innerCircle1, innerCircle1), 0, false, SweepDirection.Counterclockwise, true));
  191. pathFigure1.Segments.Add(new LineSegment(new Point(this.Width, this.Height - ConveyorBeltWidth / 2), true));
  192. geometry1.Figures.Add(pathFigure1);
  193. Path_mp.Data = geometry1;
  194. }
  195. catch (Exception ex)
  196. {
  197. }
  198. }
  199. }
  200. public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
  201. {
  202. if (depObj != null)
  203. {
  204. for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
  205. {
  206. DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
  207. if (child != null && child is T)
  208. {
  209. yield return (T)child;
  210. }
  211. foreach (T childOfChild in FindVisualChildren<T>(child))
  212. {
  213. yield return childOfChild;
  214. }
  215. }
  216. }
  217. }
  218. #endregion
  219. #region 属性
  220. private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
  221. {
  222. (d as NewConveyorBelt)?.Refursh();
  223. }
  224. public DoubleCollection StrokeDashArray
  225. {
  226. get { return (DoubleCollection)GetValue(StrokeDashArrayProperty); }
  227. set { SetValue(StrokeDashArrayProperty, value); }
  228. }
  229. public static readonly DependencyProperty StrokeDashArrayProperty =
  230. DependencyProperty.Register("StrokeDashArray", typeof(DoubleCollection), typeof(NewConveyorBelt),
  231. new PropertyMetadata(default, new PropertyChangedCallback(OnPropertyChanged)));
  232. public double ConveyorBeltWidth
  233. {
  234. get { return (double)GetValue(ConveyorBeltWidthProperty); }
  235. set { SetValue(ConveyorBeltWidthProperty, value); }
  236. }
  237. public static readonly DependencyProperty ConveyorBeltWidthProperty =
  238. DependencyProperty.Register("ConveyorBeltWidth", typeof(double), typeof(NewConveyorBelt),
  239. new PropertyMetadata(50.0, new PropertyChangedCallback(OnPropertyChanged)));
  240. public Brush StrokeFillBrush
  241. {
  242. get { return (Brush)GetValue(StrokeFillBrushProperty); }
  243. set { SetValue(StrokeFillBrushProperty, value); }
  244. }
  245. public static readonly DependencyProperty StrokeFillBrushProperty =
  246. DependencyProperty.Register("StrokeFillBrush", typeof(Brush), typeof(NewConveyorBelt),
  247. new PropertyMetadata(Brushes.LightBlue, new PropertyChangedCallback(OnPropertyChanged)));
  248. public Brush StrokeBrush
  249. {
  250. get { return (Brush)GetValue(StrokeBrushProperty); }
  251. set { SetValue(StrokeBrushProperty, value); }
  252. }
  253. public static readonly DependencyProperty StrokeBrushProperty =
  254. DependencyProperty.Register("StrokeBrush", typeof(Brush), typeof(NewConveyorBelt),
  255. new PropertyMetadata(Brushes.LightBlue, new PropertyChangedCallback(OnPropertyChanged)));
  256. public double StrokeThickness
  257. {
  258. get { return (double)GetValue(StrokeThicknessProperty); }
  259. set { SetValue(StrokeThicknessProperty, value); }
  260. }
  261. public static readonly DependencyProperty StrokeThicknessProperty =
  262. DependencyProperty.Register("StrokeThickness", typeof(double), typeof(NewConveyorBelt),
  263. new PropertyMetadata(1.0, new PropertyChangedCallback(OnPropertyChanged)));
  264. [Category("值设定")]
  265. public int Direction
  266. {
  267. get { return (int)GetValue(DirectionProperty); }
  268. set { SetValue(DirectionProperty, value); }
  269. }
  270. public static readonly DependencyProperty DirectionProperty =
  271. DependencyProperty.Register("Direction", typeof(int), typeof(NewConveyorBelt),
  272. new PropertyMetadata(0, new PropertyChangedCallback(OnPropertyChanged)));
  273. [Category("值设定")]
  274. public string Text
  275. {
  276. get { return (string)GetValue(TextProperty); }
  277. set { SetValue(TextProperty, value); }
  278. }
  279. public static readonly DependencyProperty TextProperty =
  280. DependencyProperty.Register("Text", typeof(string), typeof(NewConveyorBelt), new PropertyMetadata(new PropertyChangedCallback(onTargetChanged)));
  281. private static void onTargetChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as NewConveyorBelt)?.TargetRefresh();
  282. [Category("主题订阅")]
  283. public string ConveyorBeltLeft
  284. {
  285. get { return (string)GetValue(ConveyorBeltLeftProperty); }
  286. set { SetValue(ConveyorBeltLeftProperty, value); }
  287. }
  288. public static readonly DependencyProperty ConveyorBeltLeftProperty =
  289. DependencyProperty.Register("ConveyorBeltLeft", typeof(string), typeof(NewConveyorBelt), new PropertyMetadata(string.Empty));
  290. [Category("主题订阅")]
  291. public string ConveyorBeltRight
  292. {
  293. get { return (string)GetValue(ConveyorBeltRightProperty); }
  294. set { SetValue(ConveyorBeltRightProperty, value); }
  295. }
  296. public static readonly DependencyProperty ConveyorBeltRightProperty =
  297. DependencyProperty.Register("ConveyorBeltRight", typeof(string), typeof(NewConveyorBelt), new PropertyMetadata(string.Empty));
  298. [Category("主题订阅")]
  299. public string ConveyorBeltStop
  300. {
  301. get { return (string)GetValue(ConveyorBeltStopProperty); }
  302. set { SetValue(ConveyorBeltStopProperty, value); }
  303. }
  304. public static readonly DependencyProperty ConveyorBeltStopProperty =
  305. DependencyProperty.Register("ConveyorBeltStop", typeof(string), typeof(NewConveyorBelt), new PropertyMetadata(string.Empty));
  306. [Category("名称[自动生成]")]
  307. public string EventReceiveNameListStr
  308. {
  309. get { return (string)GetValue(EventReceiveNameListStrProperty); }
  310. set { SetValue(EventReceiveNameListStrProperty, value); }
  311. }
  312. public static readonly DependencyProperty EventReceiveNameListStrProperty =
  313. DependencyProperty.Register("EventReceiveNameListStr",typeof(string),typeof(NewConveyorBelt),new PropertyMetadata(string.Empty,new PropertyChangedCallback(onEventReceiveNameListStrChanged)));
  314. private static void onEventReceiveNameListStrChanged(DependencyObject d,DependencyPropertyChangedEventArgs e) => (d as NewConveyorBelt)?.ReceiveNameRefresh();
  315. [Category("消息接收名称集合")]
  316. public ObservableCollection<EventReceiveMessage> EventReceiveNameList
  317. {
  318. get { return (ObservableCollection<EventReceiveMessage>)GetValue(EventReceiveNameListProperty); }
  319. set { SetValue(EventReceiveNameListProperty, value); }
  320. }
  321. public static readonly DependencyProperty EventReceiveNameListProperty =
  322. DependencyProperty.Register("EventReceiveNameList", typeof(ObservableCollection<EventReceiveMessage>), typeof(NewConveyorBelt), new PropertyMetadata(new ObservableCollection<EventReceiveMessage>(), onEventNameListChanged));
  323. private static void onEventNameListChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => (d as NewConveyorBelt)?.RunNameRefresh();
  324. [Category("名称[自动生成]")]
  325. private string EventSendNameListStr
  326. {
  327. get { return (string)GetValue(EventSendNameListStrProperty); }
  328. set { SetValue(EventSendNameListStrProperty,value); }
  329. }
  330. private static readonly DependencyProperty EventSendNameListStrProperty =
  331. DependencyProperty.Register("EventSendNameListStr",typeof(string),typeof(NewConveyorBelt),new PropertyMetadata(string.Empty));
  332. [Category("消息发送名称集合")]
  333. private ObservableCollection<EventSendMessage> EventSendNameList
  334. {
  335. get { return (ObservableCollection<EventSendMessage>)GetValue(EventSendNameListProperty); }
  336. set { SetValue(EventSendNameListProperty,value); }
  337. }
  338. private static readonly DependencyProperty EventSendNameListProperty =
  339. DependencyProperty.Register("EventSendNameList",typeof(ObservableCollection<EventSendMessage>),typeof(NewConveyorBelt),new PropertyMetadata(new ObservableCollection<EventSendMessage>(),new PropertyChangedCallback(onEventNameListChanged)));
  340. #endregion
  341. #region 属性变更事件
  342. List<string> MessageNameL = null;
  343. public void Register()
  344. {
  345. if (!string.IsNullOrEmpty(EventReceiveNameListStr))
  346. {
  347. try
  348. {
  349. EventReceiveNameList = JsonConvert.DeserializeObject<ObservableCollection<EventReceiveMessage>>(EventReceiveNameListStr);
  350. }
  351. catch (Exception ex)
  352. {
  353. }
  354. }
  355. if (!string.IsNullOrEmpty(EventSendNameListStr))
  356. {
  357. try
  358. {
  359. EventSendNameList = JsonConvert.DeserializeObject<ObservableCollection<EventSendMessage>>(EventSendNameListStr);
  360. }
  361. catch (Exception ex)
  362. {
  363. }
  364. }
  365. List<string> MessageNameNew = EventReceiveNameList?.Select(o => o.MeaageName.ToString())?.Distinct()?.ToList();
  366. if (MessageNameL == null || !MessageNameNew.SequenceEqual(MessageNameL))
  367. {
  368. MessageNameL?.ForEach(o => Class_InnerMessageBus.GetInstance().RemoveMessage(o,"NewConveyorBeltEventHandler"));
  369. MessageNameNew?.ForEach(x => Class_InnerMessageBus.GetInstance().ListenMessage(this,x,"NewConveyorBeltEventHandler"));
  370. MessageNameL = MessageNameNew;
  371. }
  372. }
  373. public void NewConveyorBeltEventHandler(object sender, InnerMessageEventArgs e)
  374. {
  375. try
  376. {
  377. if (IsExecuteState = true)
  378. {
  379. if (e.obj_MessageObj is RunEnumModel)//接收到运行消息
  380. {
  381. RunEnumModel mode = (RunEnumModel)e.obj_MessageObj;
  382. var msg = EventReceiveNameList?.ToList().Find(par => par.MeaageName.ToString() == e.str_MessageStr && par.MeaageID == mode.MessageID);
  383. //必对消息号:
  384. if (msg != null)
  385. {
  386. Direction = mode.Run == RunEnum.Run ? 1 : ((mode.Run == RunEnum.Run_Left) ? 2 : 0);
  387. }
  388. }
  389. else if (e.obj_MessageObj is ConveyorBeltMessageModel)//接收到数据模型
  390. {
  391. ConveyorBeltMessageModel mode = (ConveyorBeltMessageModel)e.obj_MessageObj;
  392. var msg = EventReceiveNameList?.ToList().Find(par => par.MeaageName.ToString() == e.str_MessageStr && par.MeaageID == mode.MessageID);
  393. //必对消息号:
  394. if (msg != null)
  395. {
  396. Text = mode.Title;
  397. }
  398. }
  399. }
  400. }
  401. catch (Exception ex)
  402. {
  403. }
  404. }
  405. private void Refursh()
  406. {
  407. if (Direction == 1)
  408. {
  409. storyboard.Begin();
  410. storyboard1.Stop();
  411. }
  412. else if (Direction == 2)
  413. {
  414. storyboard.Stop();
  415. storyboard1.Begin();
  416. }
  417. else
  418. {
  419. storyboard.Stop();
  420. storyboard1.Stop();
  421. }
  422. }
  423. /// <summary>
  424. /// 目标属性刷新
  425. /// </summary>
  426. public void TargetRefresh()
  427. {
  428. if (textBlock != null )
  429. {
  430. textBlock.Text = Text;
  431. }
  432. }
  433. public void RunNameRefresh()
  434. {
  435. }
  436. /// <summary>
  437. /// 接收数据改变
  438. /// </summary>
  439. public void ReceiveNameRefresh()
  440. {
  441. if (!string.IsNullOrEmpty(EventReceiveNameListStr))
  442. {
  443. try
  444. {
  445. EventReceiveNameList = JsonConvert.DeserializeObject<ObservableCollection<EventReceiveMessage>>(EventReceiveNameListStr);
  446. }
  447. catch (Exception ex)
  448. {
  449. }
  450. }
  451. }
  452. #endregion
  453. }
  454. }