CassetteView.xaml.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. using Aitex.Core.Common;
  2. using FurnaceUI.Views.Maintenances;
  3. using MECF.Framework.Common.Equipment;
  4. using MECF.Framework.Common.OperationCenter;
  5. using MECF.Framework.Common.SubstrateTrackings;
  6. using MECF.Framework.UI.Client.Annotations;
  7. using MECF.Framework.UI.Client.ClientBase;
  8. using SciChart.Core.Extensions;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.ComponentModel;
  12. using System.Linq;
  13. using System.Runtime.CompilerServices;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. using System.Windows;
  17. using System.Windows.Controls;
  18. using System.Windows.Data;
  19. using System.Windows.Documents;
  20. using System.Windows.Input;
  21. using System.Windows.Media;
  22. using System.Windows.Media.Animation;
  23. using System.Windows.Media.Imaging;
  24. using System.Windows.Navigation;
  25. using System.Windows.Shapes;
  26. namespace FurnaceUI.Controls.Parts
  27. {
  28. /// <summary>
  29. /// CassetteView.xaml 的交互逻辑
  30. /// </summary>
  31. public partial class CassetteView : UserControl, INotifyPropertyChanged
  32. {
  33. public string CarrierModule
  34. {
  35. get { return (string)GetValue(CarrierModuleProperty); }
  36. set
  37. {
  38. SetValue(CarrierModuleProperty, value);
  39. }
  40. }
  41. public static readonly DependencyProperty CarrierModuleProperty =
  42. DependencyProperty.Register("CarrierModule", typeof(string), typeof(CassetteView), new PropertyMetadata("System"));
  43. public int CarrierSlot
  44. {
  45. get { return (int)GetValue(CarrierSlotProperty); }
  46. set
  47. {
  48. SetValue(CarrierSlotProperty, value);
  49. }
  50. }
  51. public static readonly DependencyProperty CarrierSlotProperty =
  52. DependencyProperty.Register("CarrierSlot", typeof(int), typeof(CassetteView), new PropertyMetadata(0));
  53. public CarrierInfo CarrierData
  54. {
  55. get { return (CarrierInfo)GetValue(CarrierDataProperty); }
  56. set
  57. {
  58. SetValue(CarrierDataProperty, value);
  59. OnPropertyChanged("CarrierData");
  60. }
  61. }
  62. public static readonly DependencyProperty CarrierDataProperty =
  63. DependencyProperty.Register("CarrierData", typeof(CarrierInfo), typeof(CassetteView), new PropertyMetadata(new CarrierInfo(1), CarrierDataChangedCallback));
  64. public Visibility StockerPCassetteVisibility
  65. {
  66. get { return (Visibility)GetValue(StockerPCassetteVisibilityProperty); }
  67. set { SetValue(StockerPCassetteVisibilityProperty, value); }
  68. }
  69. // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc...
  70. public static readonly DependencyProperty StockerPCassetteVisibilityProperty =
  71. DependencyProperty.Register("StockerPCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden));
  72. public Visibility StockerEDCassetteVisibility
  73. {
  74. get { return (Visibility)GetValue(StockerEDCassetteVisibilityProperty); }
  75. set { SetValue(StockerEDCassetteVisibilityProperty, value); }
  76. }
  77. // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc...
  78. public static readonly DependencyProperty StockerEDCassetteVisibilityProperty =
  79. DependencyProperty.Register("StockerEDCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden));
  80. public Visibility ProcessCassetteVisibility
  81. {
  82. get { return (Visibility)GetValue(ProcessCassetteVisibilityProperty); }
  83. set { SetValue(ProcessCassetteVisibilityProperty, value); }
  84. }
  85. // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc...
  86. public static readonly DependencyProperty ProcessCassetteVisibilityProperty =
  87. DependencyProperty.Register("ProcessCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden));
  88. public Visibility StockerMCassetteVisibility
  89. {
  90. get { return (Visibility)GetValue(StockerMCassetteVisibilityProperty); }
  91. set { SetValue(StockerMCassetteVisibilityProperty, value); }
  92. }
  93. // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc...
  94. public static readonly DependencyProperty StockerMCassetteVisibilityProperty =
  95. DependencyProperty.Register("StockerMCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden));
  96. public Visibility StockerM1CassetteVisibility
  97. {
  98. get { return (Visibility)GetValue(StockerM1CassetteVisibilityProperty); }
  99. set { SetValue(StockerM1CassetteVisibilityProperty, value); }
  100. }
  101. // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc...
  102. public static readonly DependencyProperty StockerM1CassetteVisibilityProperty =
  103. DependencyProperty.Register("StockerM1CassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden));
  104. public Visibility StockerM2CassetteVisibility
  105. {
  106. get { return (Visibility)GetValue(StockerM2CassetteVisibilityProperty); }
  107. set { SetValue(StockerM2CassetteVisibilityProperty, value); }
  108. }
  109. // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc...
  110. public static readonly DependencyProperty StockerM2CassetteVisibilityProperty =
  111. DependencyProperty.Register("StockerM2CassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden));
  112. public Visibility StockerSDCassetteVisibility
  113. {
  114. get { return (Visibility)GetValue(StockerSDCassetteVisibilityProperty); }
  115. set { SetValue(StockerSDCassetteVisibilityProperty, value); }
  116. }
  117. // Using a DependencyProperty as the backing store for StockerPCassetteVisibility. This enables animation, styling, binding, etc...
  118. public static readonly DependencyProperty StockerSDCassetteVisibilityProperty =
  119. DependencyProperty.Register("StockerSDCassetteVisibility", typeof(Visibility), typeof(CassetteView), new PropertyMetadata(Visibility.Hidden));
  120. public string CassetteType
  121. {
  122. get { return (string)GetValue(CassetteTypeProperty); }
  123. set
  124. {
  125. SetValue(CassetteTypeProperty, value);
  126. OnPropertyChanged("CassetteType");
  127. }
  128. }
  129. // Using a DependencyProperty as the backing store for CassetteType. This enables animation, styling, binding, etc...
  130. public static readonly DependencyProperty CassetteTypeProperty =
  131. DependencyProperty.Register("CassetteType", typeof(string), typeof(CassetteView), new PropertyMetadata(null, CassetteTypeChangedCallback));
  132. public int WaferCount
  133. {
  134. get { return (int)GetValue(WaferCountProperty); }
  135. set
  136. {
  137. SetValue(WaferCountProperty, value);
  138. OnPropertyChanged("WaferCount");
  139. }
  140. }
  141. // Using a DependencyProperty as the backing store for WaferCount. This enables animation, styling, binding, etc...
  142. public static readonly DependencyProperty WaferCountProperty =
  143. DependencyProperty.Register("WaferCount", typeof(int), typeof(CassetteView), new PropertyMetadata(0));
  144. public double oldScale = 0;
  145. public static void CarrierDataChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  146. {
  147. var selfView = (CassetteView)d;
  148. var data = (CarrierInfo)e.NewValue;
  149. //if (!ModuleManager.ModuleInfos.ContainsKey(selfView.CarrierModule))
  150. //{
  151. // selfView.ProcessCassetteVisibility = Visibility.Hidden;
  152. // return;
  153. //}
  154. //var currentWafers = ModuleManager.ModuleInfos[selfView.CarrierModule].WaferManager.Wafers;
  155. //if (data == null || !data.HasWaferIn || currentWafers == null || currentWafers.Count == 0)
  156. //{
  157. // selfView.ProcessCassetteVisibility = Visibility.Hidden;
  158. // SetCassetteColor(selfView.CassetteType, d);
  159. // return;
  160. //}
  161. //var tempList = currentWafers.Where(p => !string.IsNullOrEmpty(p.WaferID)).ToList();
  162. //if (tempList.All(o => o.WaferStatus > 1))
  163. //{
  164. // var processedWafer = currentWafers.Where(a => a.WaferStatus > 1).FirstOrDefault();
  165. // if (processedWafer != null && (processedWafer.WaferType.Equals(WaferType.P) || processedWafer.WaferType.Equals(WaferType.M) || processedWafer.WaferType.Equals(WaferType.M1) || processedWafer.WaferType.Equals(WaferType.M2)))
  166. // {
  167. // selfView.StockerPCassetteVisibility = Visibility.Hidden;
  168. // selfView.StockerMCassetteVisibility = Visibility.Hidden;
  169. // selfView.StockerM1CassetteVisibility = Visibility.Hidden;
  170. // selfView.StockerM2CassetteVisibility = Visibility.Hidden;
  171. // selfView.StockerSDCassetteVisibility = Visibility.Hidden;
  172. // selfView.StockerEDCassetteVisibility = Visibility.Hidden;
  173. // selfView.ProcessCassetteVisibility = Visibility.Visible;
  174. // }
  175. //}
  176. }
  177. public static void CassetteTypeChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  178. {
  179. var self = (CassetteView)d;
  180. switch ((string)e.NewValue)
  181. {
  182. case "P":
  183. self.StockerPCassetteVisibility = Visibility.Visible;
  184. self.StockerMCassetteVisibility = Visibility.Hidden;
  185. self.StockerM1CassetteVisibility = Visibility.Hidden;
  186. self.StockerM2CassetteVisibility = Visibility.Hidden;
  187. self.StockerSDCassetteVisibility = Visibility.Hidden;
  188. self.StockerEDCassetteVisibility = Visibility.Hidden;
  189. self.ProcessCassetteVisibility = Visibility.Hidden;
  190. break;
  191. case "M":
  192. self.StockerPCassetteVisibility = Visibility.Hidden;
  193. self.StockerMCassetteVisibility = Visibility.Visible;
  194. self.StockerM1CassetteVisibility = Visibility.Hidden;
  195. self.StockerM2CassetteVisibility = Visibility.Hidden;
  196. self.StockerSDCassetteVisibility = Visibility.Hidden;
  197. self.StockerEDCassetteVisibility = Visibility.Hidden;
  198. self.ProcessCassetteVisibility = Visibility.Hidden;
  199. break;
  200. case "M1":
  201. self.StockerPCassetteVisibility = Visibility.Hidden;
  202. self.StockerMCassetteVisibility = Visibility.Hidden;
  203. self.StockerM1CassetteVisibility = Visibility.Visible;
  204. self.StockerM2CassetteVisibility = Visibility.Hidden;
  205. self.StockerSDCassetteVisibility = Visibility.Hidden;
  206. self.StockerEDCassetteVisibility = Visibility.Hidden;
  207. self.ProcessCassetteVisibility = Visibility.Hidden;
  208. break;
  209. case "M2":
  210. self.StockerPCassetteVisibility = Visibility.Hidden;
  211. self.StockerMCassetteVisibility = Visibility.Hidden;
  212. self.StockerM1CassetteVisibility = Visibility.Hidden;
  213. self.StockerM2CassetteVisibility = Visibility.Visible;
  214. self.StockerSDCassetteVisibility = Visibility.Hidden;
  215. self.StockerEDCassetteVisibility = Visibility.Hidden;
  216. self.ProcessCassetteVisibility = Visibility.Hidden;
  217. break;
  218. case "SD":
  219. self.StockerPCassetteVisibility = Visibility.Hidden;
  220. self.StockerMCassetteVisibility = Visibility.Hidden;
  221. self.StockerM1CassetteVisibility = Visibility.Hidden;
  222. self.StockerM2CassetteVisibility = Visibility.Hidden;
  223. self.StockerSDCassetteVisibility = Visibility.Visible;
  224. self.StockerEDCassetteVisibility = Visibility.Hidden;
  225. self.ProcessCassetteVisibility = Visibility.Hidden;
  226. break;
  227. case "ED":
  228. self.StockerPCassetteVisibility = Visibility.Hidden;
  229. self.StockerMCassetteVisibility = Visibility.Hidden;
  230. self.StockerM1CassetteVisibility = Visibility.Hidden;
  231. self.StockerM2CassetteVisibility = Visibility.Hidden;
  232. self.StockerSDCassetteVisibility = Visibility.Hidden;
  233. self.StockerEDCassetteVisibility = Visibility.Visible;
  234. self.ProcessCassetteVisibility = Visibility.Hidden;
  235. break;
  236. case "Process":
  237. self.StockerPCassetteVisibility = Visibility.Hidden;
  238. self.StockerMCassetteVisibility = Visibility.Hidden;
  239. self.StockerM1CassetteVisibility = Visibility.Hidden;
  240. self.StockerM2CassetteVisibility = Visibility.Hidden;
  241. self.StockerSDCassetteVisibility = Visibility.Hidden;
  242. self.StockerEDCassetteVisibility = Visibility.Hidden;
  243. self.ProcessCassetteVisibility = Visibility.Visible;
  244. break;
  245. default:
  246. self.StockerPCassetteVisibility = Visibility.Hidden;
  247. self.StockerMCassetteVisibility = Visibility.Hidden;
  248. self.StockerM1CassetteVisibility = Visibility.Hidden;
  249. self.StockerM2CassetteVisibility = Visibility.Hidden;
  250. self.StockerSDCassetteVisibility = Visibility.Hidden;
  251. self.StockerEDCassetteVisibility = Visibility.Hidden;
  252. self.ProcessCassetteVisibility = Visibility.Hidden;
  253. break;
  254. }
  255. }
  256. static void SetCassetteColor(string typeStr, DependencyObject d)
  257. {
  258. var self = (CassetteView)d;
  259. switch (typeStr)
  260. {
  261. case "P":
  262. self.StockerPCassetteVisibility = Visibility.Visible;
  263. self.StockerMCassetteVisibility = Visibility.Hidden;
  264. self.StockerM1CassetteVisibility = Visibility.Hidden;
  265. self.StockerM2CassetteVisibility = Visibility.Hidden;
  266. self.StockerSDCassetteVisibility = Visibility.Hidden;
  267. self.StockerEDCassetteVisibility = Visibility.Hidden;
  268. self.ProcessCassetteVisibility = Visibility.Hidden;
  269. break;
  270. case "M":
  271. self.StockerPCassetteVisibility = Visibility.Hidden;
  272. self.StockerMCassetteVisibility = Visibility.Visible;
  273. self.StockerM1CassetteVisibility = Visibility.Hidden;
  274. self.StockerM2CassetteVisibility = Visibility.Hidden;
  275. self.StockerSDCassetteVisibility = Visibility.Hidden;
  276. self.StockerEDCassetteVisibility = Visibility.Hidden;
  277. self.ProcessCassetteVisibility = Visibility.Hidden;
  278. break;
  279. case "M1":
  280. self.StockerPCassetteVisibility = Visibility.Hidden;
  281. self.StockerMCassetteVisibility = Visibility.Hidden;
  282. self.StockerM1CassetteVisibility = Visibility.Visible;
  283. self.StockerM2CassetteVisibility = Visibility.Hidden;
  284. self.StockerSDCassetteVisibility = Visibility.Hidden;
  285. self.StockerEDCassetteVisibility = Visibility.Hidden;
  286. self.ProcessCassetteVisibility = Visibility.Hidden;
  287. break;
  288. case "M2":
  289. self.StockerPCassetteVisibility = Visibility.Hidden;
  290. self.StockerMCassetteVisibility = Visibility.Hidden;
  291. self.StockerM1CassetteVisibility = Visibility.Hidden;
  292. self.StockerM2CassetteVisibility = Visibility.Visible;
  293. self.StockerSDCassetteVisibility = Visibility.Hidden;
  294. self.StockerEDCassetteVisibility = Visibility.Hidden;
  295. self.ProcessCassetteVisibility = Visibility.Hidden;
  296. break;
  297. case "SD":
  298. self.StockerPCassetteVisibility = Visibility.Hidden;
  299. self.StockerMCassetteVisibility = Visibility.Hidden;
  300. self.StockerM1CassetteVisibility = Visibility.Hidden;
  301. self.StockerM2CassetteVisibility = Visibility.Hidden;
  302. self.StockerSDCassetteVisibility = Visibility.Visible;
  303. self.StockerEDCassetteVisibility = Visibility.Hidden;
  304. self.ProcessCassetteVisibility = Visibility.Hidden;
  305. break;
  306. case "ED":
  307. self.StockerPCassetteVisibility = Visibility.Hidden;
  308. self.StockerMCassetteVisibility = Visibility.Hidden;
  309. self.StockerM1CassetteVisibility = Visibility.Hidden;
  310. self.StockerM2CassetteVisibility = Visibility.Hidden;
  311. self.StockerSDCassetteVisibility = Visibility.Hidden;
  312. self.StockerEDCassetteVisibility = Visibility.Visible;
  313. self.ProcessCassetteVisibility = Visibility.Hidden;
  314. break;
  315. case "Process":
  316. self.StockerPCassetteVisibility = Visibility.Hidden;
  317. self.StockerMCassetteVisibility = Visibility.Hidden;
  318. self.StockerM1CassetteVisibility = Visibility.Hidden;
  319. self.StockerM2CassetteVisibility = Visibility.Hidden;
  320. self.StockerSDCassetteVisibility = Visibility.Hidden;
  321. self.StockerEDCassetteVisibility = Visibility.Hidden;
  322. self.ProcessCassetteVisibility = Visibility.Visible;
  323. break;
  324. default:
  325. self.StockerPCassetteVisibility = Visibility.Hidden;
  326. self.StockerMCassetteVisibility = Visibility.Hidden;
  327. self.StockerM1CassetteVisibility = Visibility.Hidden;
  328. self.StockerM2CassetteVisibility = Visibility.Hidden;
  329. self.StockerSDCassetteVisibility = Visibility.Hidden;
  330. self.StockerEDCassetteVisibility = Visibility.Hidden;
  331. self.ProcessCassetteVisibility = Visibility.Hidden;
  332. break;
  333. }
  334. }
  335. public CassetteView()
  336. {
  337. InitializeComponent();
  338. }
  339. public event PropertyChangedEventHandler PropertyChanged;
  340. [NotifyPropertyChangedInvocator]
  341. protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  342. {
  343. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  344. }
  345. static void PropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
  346. {
  347. }
  348. protected override void OnRender(DrawingContext drawingContext)
  349. {
  350. base.OnRender(drawingContext);
  351. }
  352. public void Filp(int filp, int angle, bool absolute = true, int ms = 0, double accelerationRatio = 0, double decelerationRatio = 0, Action onComplete = null)
  353. {
  354. var storyboard = new Storyboard();
  355. storyboard.Completed += (s, e) => onComplete?.Invoke();
  356. if (Filp(storyboard, filp, angle, absolute, ms, accelerationRatio, decelerationRatio, onComplete))
  357. {
  358. storyboard.Begin();
  359. }
  360. else
  361. {
  362. onComplete?.Invoke();
  363. }
  364. }
  365. public bool Filp(Storyboard storyboard, int filp, int angle, bool absolute = true, int ms = 0, double accelerationRatio = 0, double decelerationRatio = 0, Action onComplete = null)
  366. {
  367. var newScale = 0.5;
  368. if (newScale == oldScale)
  369. {
  370. return false;
  371. }
  372. ScaleTransform scaleTransform = new ScaleTransform();
  373. if (filp == 180)
  374. {
  375. scaleTransform.ScaleX = -1;
  376. }
  377. else
  378. {
  379. scaleTransform.ScaleX = 1;
  380. }
  381. TransformGroup Group = new TransformGroup();
  382. Group.Children.Add(scaleTransform);
  383. tbWaferCount.RenderTransform = Group;
  384. tbWaferCount.RenderTransformOrigin = new Point(0.5, 0.5);
  385. var animation = new DoubleAnimation(oldScale, angle, TimeSpan.FromMilliseconds(ms));
  386. animation.AccelerationRatio = accelerationRatio;
  387. animation.DecelerationRatio = decelerationRatio;
  388. storyboard.Children.Add(animation);
  389. Storyboard.SetTarget(animation, tbWaferCount);
  390. Storyboard.SetTargetProperty(animation, new PropertyPath("RenderTransform.(TransformGroup.Children)[0].(TranslateTransform.X)"));
  391. oldScale = angle;
  392. return true;
  393. }
  394. private void CreateCassette(object sender, RoutedEventArgs e)
  395. {
  396. InvokeClient.Instance.Service.DoOperation("System.CreateCarrier", CarrierModule, 0);
  397. }
  398. private void DeleteCassette(object sender, RoutedEventArgs e)
  399. {
  400. InvokeClient.Instance.Service.DoOperation("System.DeleteCarrier", CarrierModule, 0);
  401. }
  402. }
  403. }