革博士程序V1仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

961 rivejä
38 KiB

  1. using GeBoShi.SysCtrl;
  2. using GeBoShi.UI;
  3. using GeBoShi.UI.Load;
  4. using GeBoShi.UI.Product;
  5. using GeBoShi.UI.SysSet;
  6. using HZH_Controls;
  7. using HZH_Controls.Controls;
  8. using HZH_Controls.Forms;
  9. using MaiMuControl.Device;
  10. using MaiMuControl.Device.CamDev;
  11. using Models;
  12. using OpenCvSharp.Extensions;
  13. using System;
  14. using System.Collections;
  15. using System.Collections.Generic;
  16. using System.ComponentModel;
  17. using System.Data;
  18. using System.Drawing;
  19. using System.IO;
  20. using System.Linq;
  21. using System.Text;
  22. using System.Threading;
  23. using System.Threading.Tasks;
  24. using System.Web.UI.WebControls.WebParts;
  25. using System.Windows.Forms;
  26. using System.Windows.Forms.DataVisualization.Charting;
  27. namespace GeBoShi
  28. {
  29. public partial class Main : Form
  30. {
  31. object AddTextLock = new object();
  32. bool backgroundWorkerDo;
  33. /// <summary>
  34. /// 显示颜色现在对应30色,确保label在30个以内
  35. /// </summary>
  36. Color[] ChartColor = new Color[30] { Color.Red, Color.Blue, Color.Green, Color.YellowGreen, Color.Orange,
  37. Color.Peru, Color.DarkRed,Color.AliceBlue, Color.Pink , Color.Brown,
  38. Color.CadetBlue, Color.OrangeRed, Color.Cyan, Color.Lime, Color.Magenta, Color.Tan, Color.Sienna,
  39. Color.AliceBlue, Color.SaddleBrown, Color.DarkBlue, Color.Firebrick,Color.Gainsboro,Color.Honeydew,Color.Khaki,Color.Lavender,
  40. Color.LightGoldenrodYellow,Color.Navy, Color.Khaki, Color.IndianRed,Color.Lavender};
  41. public Main()
  42. {
  43. InitializeComponent();
  44. UIStyle.SetUIStyle(this);
  45. this.uiTitel1.FatherForm = this;
  46. this.uiTitel1.UserMenuStrip = this.menuStrip1;
  47. this.uiTitel1.ShowContrlBox(true, true, true);
  48. this.uiTitel1.ShowMenu();
  49. this.DoubleBuffered = true;//设置本窗体
  50. SetStyle(ControlStyles.UserPaint, true);
  51. SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
  52. SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
  53. SysMgr.Instance.MainRuning += main_running;
  54. SysMgr.Instance.AutoRuning += auto_runing;
  55. #region dataGridView设置
  56. skinDataGridView1.AllowUserToAddRows = skinDataGridView1.AllowUserToDeleteRows = false;//用户添加删除行
  57. skinDataGridView1.AllowUserToResizeRows = false;//用户调整行大小 //显示行号与列宽度自动调整
  58. skinDataGridView1.RowHeadersVisible = true;
  59. skinDataGridView1.RowHeadersWidth = 50;
  60. //dataGridView1.ColumnHeadersHeightSizeMode = dataGridView2.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
  61. skinDataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;//数据量过百绑定太变
  62. skinDataGridView1.RowTemplate.Height = 30;
  63. //skinDataGridView1.RowPostPaint += (sender, e) =>//序号列头
  64. //{
  65. // showRowNum_onDataGrid_RowPostPaint(this.skinDataGridView1, sender, e);
  66. //};
  67. for (int i = 0; i < skinDataGridView1.Columns.Count; i++)//禁止点击列头排序
  68. skinDataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  69. this.skinDataGridView1.CellClick += skinDataGridView1_CellClick; ;
  70. #endregion
  71. this.lblDefectLen.Top = toolStrip1.Top + 10;
  72. this.lblDefectLen.Left = toolStrip1.Width - 300;
  73. this.lblDefectSpeed.Top = toolStrip1.Top + 10 + lblDefectLen.Height + 5;
  74. this.lblDefectSpeed.Left = toolStrip1.Width - 300;
  75. }
  76. #region 初始化
  77. /// <summary>
  78. /// 初始化
  79. /// </summary>
  80. /// <returns></returns>
  81. private bool InitSystem()
  82. {
  83. //进入初始化,初始化失败则中断
  84. InitFrm initFrm = new InitFrm();
  85. initFrm.ShowDialog();
  86. if (initFrm.DialogResult == DialogResult.OK)
  87. {
  88. //初始化成功
  89. }
  90. else
  91. {
  92. initFrm.Dispose();
  93. return false;
  94. }
  95. initFrm.Dispose();
  96. return true;
  97. }
  98. #endregion
  99. #region 界面刷新
  100. private void showRowNum_onDataGrid_RowPostPaint(DataGridView dgv, object sender, DataGridViewRowPostPaintEventArgs e)
  101. {
  102. Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 4, e.RowBounds.Height);
  103. TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dgv.RowHeadersDefaultCellStyle.Font, rectangle, dgv.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
  104. }
  105. private void ResetUI(bool clearSN)
  106. {
  107. //保持产品名称和料号
  108. //txtProductName.Text = txtProductCode.Text = txtProductSN.Text = "";
  109. if (clearSN)
  110. cbPdtSN.Text = "";
  111. this.lstLog.Items.Clear();
  112. this.tsbtnImpStop.Enabled = false;
  113. this.tsbtnStart.Enabled = true;
  114. this.tsbtnStop.Enabled = false;
  115. this.cbPdtSN.Enabled = true;
  116. this.cbProductCode.Enabled = true;
  117. this.cbProductBatch.Enabled = true;
  118. this.cbProductReelNum.Enabled = true;
  119. this.cbProductNum.Enabled = true;
  120. this.pictureBox1.Image = null;
  121. pictureBox1.Refresh();
  122. this.pictureBox2.Image = null;
  123. pictureBox2.Refresh();
  124. this.pictureBox3.Image = null;
  125. pictureBox3.Refresh();
  126. this.pictureBox4.Image = null;
  127. pictureBox4.Refresh();
  128. //tslabelTime.Text = "实时测试:0.00s";
  129. skinDataGridView1.DataSource = null;
  130. this.skinDataGridView1.Rows.Clear();
  131. chart1.Series.Clear();
  132. chart1.Series.Add("SELECT");
  133. chart1.Series["SELECT"].ChartType = SeriesChartType.Point;
  134. chart1.Series["SELECT"].MarkerSize = 25;
  135. chart1.Series["SELECT"].MarkerColor = Color.Black;
  136. chart1.Series["SELECT"].MarkerStyle = MarkerStyle.Star6;
  137. //chart1.Series["SELECT"].Enabled = false;
  138. chart1.ChartAreas[0].AxisX.Title = "宽度(cm)";
  139. chart1.ChartAreas[0].AxisY.Title = "长度(m)";
  140. chart3.Series.Clear();
  141. chart3.Series.Add("面宽");
  142. chart3.ChartAreas[0].AxisX.Title = "长度(m)";
  143. chart3.ChartAreas[0].AxisY.Title = "宽度(cm)";
  144. chart3.Series["面宽"].ChartType = SeriesChartType.Line;
  145. chart3.Series["面宽"].MarkerSize = 5;
  146. chart3.Series["面宽"].MarkerColor = Color.Blue;
  147. chart3.Series["面宽"].MarkerStyle = MarkerStyle.Circle;
  148. lblDefectLen.Text = $"检测长度: 0 米";
  149. lblDefectSpeed.Text = $"检测速度: 0 米/分钟";
  150. this.Refresh();
  151. }
  152. #endregion
  153. #region 权限判断
  154. private void UserRightCheck()
  155. {
  156. this.tsmPdtMgr.Enabled = SysMgr.Instance.UserMgr.RightControl(MaiMuControl.SysStatusMgr.UserMgr.UserRightEnum.Product);
  157. this.tsmSysDataFind.Visible = SysMgr.Instance.UserMgr.RightControl(MaiMuControl.SysStatusMgr.UserMgr.UserRightEnum.Statistics);
  158. this.tsmUserList.Enabled = SysMgr.Instance.UserMgr.RightControl(MaiMuControl.SysStatusMgr.UserMgr.UserRightEnum.User);
  159. this.tsmUserRight.Enabled = SysMgr.Instance.UserMgr.RightControl(MaiMuControl.SysStatusMgr.UserMgr.UserRightEnum.Role);
  160. if (this.tsmUserList.Enabled == false && this.tsmUserRight.Enabled == false)
  161. this.tsmSysUserMgr.Visible = false;
  162. else
  163. this.tsmSysUserMgr.Visible = true;
  164. this.tsmDebug.Enabled = SysMgr.Instance.UserMgr.RightControl(MaiMuControl.SysStatusMgr.UserMgr.UserRightEnum.Debug);
  165. this.tsmSysSet.Enabled = SysMgr.Instance.UserMgr.RightControl(MaiMuControl.SysStatusMgr.UserMgr.UserRightEnum.ParamsSetting);
  166. if (this.tsmDebug.Enabled == false && this.tsmSysSet.Enabled == false)
  167. this.stmSysSet.Visible = false;
  168. else
  169. this.stmSysSet.Visible = true;
  170. }
  171. #endregion
  172. #region 运行判断
  173. /// <summary>
  174. /// 系统是否在运行
  175. /// </summary>
  176. /// <returns></returns>
  177. private bool SystemIsRun()
  178. {
  179. if (SysMgr.Instance.IsRuning)
  180. {
  181. FrmDialog.ShowDialog(this, "设备正在运行中!", "警告", false);
  182. //MessageBox.Show("设备正在运行中!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  183. return false;
  184. }
  185. return true;
  186. }
  187. #endregion
  188. #region 界面事件
  189. private void Main_Load(object sender, EventArgs e)
  190. {
  191. //登入
  192. if (SysMgr.Instance.LoginSystem())
  193. {
  194. //登入成功
  195. if (InitSystem())
  196. {
  197. this.Cursor = Cursors.WaitCursor;
  198. //this.WindowState = FormWindowState.Normal;
  199. this.Top = 0;
  200. this.Left = 0;
  201. this.Width = SystemInformation.WorkingArea.Width;
  202. this.Height = SystemInformation.WorkingArea.Height;
  203. //this.WindowState = FormWindowState.Maximized;
  204. //this.splitContainer1.SplitterDistance = this.Width / 3;
  205. ResetUI(true);
  206. this.Show();
  207. this.tsslLoginInfo.Text = $"操作员:{SysMgr.Instance.UserMgr.LoginUser.Code}({SysMgr.Instance.UserMgr.LoginUser.Name})";
  208. this.statusStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;
  209. this.tsslLoginTime.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
  210. this.tsslLoginInfo.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
  211. this.tsAxisState.Text = "";
  212. //更新数据库格式
  213. Service.InitDB.initDB(ConfMgr.Instance.DBConStr);
  214. //权限判断
  215. UserRightCheck();
  216. //开启后台
  217. //timer1.Enabled = true;
  218. //backgroundWorkerDo = true;
  219. //backgroundWorker1.RunWorkerAsync();
  220. //s_BackWorker = true;
  221. //backgroundWorker.RunWorkerAsync();
  222. //开启云端连接
  223. //SysMgr.Instance.InitCloudConnect();
  224. //开启产品服务
  225. //SysMgr.Instance.InitPdtService();
  226. //开启处理事件反馈
  227. SysMgr.Instance.InitDefectEvent();
  228. //加载产品料号
  229. SysMgr.Instance.LoadProductCodeList();
  230. //加载产品选择
  231. LoadPdtList(SysMgr.Instance.ProductCodeList);
  232. this.Cursor = Cursors.Default;
  233. //运行前检测磁盘空间
  234. SysMgr.CheckDisk(this);
  235. }
  236. else
  237. {
  238. Application.Exit();
  239. }
  240. }
  241. else
  242. {
  243. Application.Exit();
  244. }
  245. }
  246. private void Main_FormClosing(object sender, FormClosingEventArgs e)
  247. {
  248. //backgroundWorkerDo = false;
  249. Thread.Sleep(300);
  250. if (SystemIsRun())
  251. {
  252. DialogResult dr = DialogResult.Cancel;
  253. if (SysMgr.Instance.IsInit)
  254. {
  255. dr = FrmDialog.ShowDialog(this, "确定要退出当前系统?", "警告", true);
  256. }
  257. else
  258. dr = DialogResult.OK;
  259. if (dr == DialogResult.Cancel)
  260. {
  261. e.Cancel = true;
  262. }
  263. else
  264. {
  265. Thread.Sleep(300);
  266. if (SysMgr.Instance.IsInit)
  267. SysMgr.Instance.Close();
  268. //SysMgr.Instance.MainRuning -= main_running;
  269. }
  270. }
  271. else
  272. e.Cancel = true;
  273. }
  274. private void Main_SizeChanged(object sender, EventArgs e)
  275. {
  276. if (this.WindowState == FormWindowState.Maximized)
  277. {
  278. this.WindowState = FormWindowState.Normal;
  279. this.Top = 0;
  280. this.Left = 0;
  281. this.Width = SystemInformation.WorkingArea.Width;
  282. this.Height = SystemInformation.WorkingArea.Height;
  283. }
  284. }
  285. #endregion
  286. #region 菜单
  287. #region 退出
  288. private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
  289. {
  290. this.Close();
  291. }
  292. #endregion
  293. #region 用户
  294. private void tsmUserRight_Click(object sender, EventArgs e)
  295. {
  296. SysMgr.Instance.UserPermissiomMgr();
  297. }
  298. private void tsmUserList_Click(object sender, EventArgs e)
  299. {
  300. SysMgr.Instance.UserListMgr();
  301. }
  302. #endregion
  303. #region 系统设置
  304. private void MainFrm_Paint(object sender, PaintEventArgs e)
  305. {
  306. this.tsbtnReset.Visible = ConfMgr.Instance.SysConfigParams.ShowResetBtn;
  307. }
  308. private void tsmSysSet_Click(object sender, EventArgs e)
  309. {
  310. if (SystemIsRun())
  311. {
  312. SysMgr.Instance.StatusMgr.GotoSetParams();
  313. SysMgr.Instance.SendStatus();
  314. SysSetFrm frm = new SysSetFrm();
  315. frm.ShowDialog();
  316. MainFrm_Paint(null, null);
  317. SysMgr.Instance.StatusMgr.GotoNormalStandby();
  318. SysMgr.Instance.SendStatus();
  319. }
  320. }
  321. private void tsmDebug_Click(object sender, EventArgs e)
  322. {
  323. }
  324. #endregion
  325. #endregion
  326. #region 检测管理
  327. private string[] pdtlistData;
  328. private void LoadPdtList(List<string> list)
  329. {
  330. this.cbDefectCode.Items.Clear();
  331. while (true)
  332. {
  333. bool bk = true;
  334. for (int i = 0; i < list.Count; i++)
  335. {
  336. if (list[i] == null || string.IsNullOrEmpty(list[i]))
  337. {
  338. list.Remove(list[i]);
  339. bk = false;
  340. }
  341. }
  342. if (bk)
  343. {
  344. break;
  345. }
  346. }
  347. this.pdtlistData = list.ToArray();
  348. cbDefectCode.Items.AddRange(pdtlistData);//比使用DataSource速度要快一些
  349. cbDefectCode.TextUpdate += cobList_TextUpdate;//重新绑定事件
  350. cbDefectCode.KeyDown += CobList_KeyDown;
  351. this.cbDefectCode.Text = "";
  352. cbDefectCode.Focus();
  353. cbDefectCode.SelectAll();
  354. }
  355. private void tsmPdtMgr_Click(object sender, EventArgs e)
  356. {
  357. if (SystemIsRun())
  358. {
  359. ProductListFrm frm = new ProductListFrm();
  360. frm.ShowDialog();
  361. //加载产品料号
  362. SysMgr.Instance.LoadProductCodeList();
  363. //加载产品选择
  364. LoadPdtList(SysMgr.Instance.ProductCodeList);
  365. }
  366. }
  367. private void CobList_KeyDown(object sender, KeyEventArgs e)
  368. {
  369. ComboBox ctrl = sender as ComboBox;
  370. if (e.KeyCode == Keys.Enter)
  371. {
  372. if (ctrl.Items.Count == 1)
  373. ctrl.Text = ctrl.Items[0].ToString();
  374. }
  375. }
  376. private void cobList_TextUpdate(object sender, EventArgs e)
  377. {
  378. ComboBox ctrl = sender as ComboBox;
  379. if (ctrl.Text != null)
  380. {
  381. string str = ctrl.Text; //获取cb_material控件输入内
  382. //清空combobox
  383. ctrl.DataSource = null;
  384. ctrl.Items.Clear();
  385. string[] workOrderFiltered;
  386. workOrderFiltered = pdtlistData.Where(x => x.IndexOf(str, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray();//忽略大小写
  387. ctrl.Items.AddRange(workOrderFiltered);//比使用DataSource速度要快一些
  388. // 不存在符合条件时
  389. //设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
  390. ctrl.Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置
  391. if (workOrderFiltered.Length > 0)
  392. {
  393. if (!ctrl.DroppedDown)
  394. ctrl.DroppedDown = true; // 自动弹出下拉框
  395. }
  396. ctrl.SelectionStart = str.Length; // 设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
  397. }
  398. }
  399. #endregion
  400. #region 按钮
  401. private void tsbtnStart_Click(object sender, EventArgs e)
  402. {
  403. if (!SysMgr.Instance.IsRuning)
  404. {
  405. //低报警自动复位
  406. if (SysMgr.Instance.StatusMgr.Status == SystemStsEnum.Warning)
  407. {
  408. if (SysMgr.Instance.StatusMgr.Warning == WarningEnum.Low)
  409. {
  410. SysMgr.Instance.StatusMgr.ClearWarning();
  411. SysMgr.Instance.StatusMgr.GotoNormalStandby();
  412. }
  413. }
  414. //提示正在报警中
  415. if (SysMgr.Instance.StatusMgr.Status == SystemStsEnum.Warning)
  416. {
  417. FrmDialog.ShowDialog(this, "系统报警中!无法启动运行!", "警告", false);
  418. return;
  419. }
  420. this.Cursor = Cursors.WaitCursor;
  421. System.Windows.Forms.Application.DoEvents();
  422. if (SysMgr.Instance.StatusMgr.Status != SystemStsEnum.Pause)
  423. {
  424. ResetUI(false);
  425. AddTextEvent("运行", $"启动自动检测流程");
  426. this.lstLog.Refresh();
  427. string name = this.cbProductCode.Text;
  428. string batch = this.cbProductBatch.Text;
  429. string reel = this.cbProductReelNum.Text;
  430. string len = this.cbProductNum.Text;
  431. string defname = this.cbDefectCode.Text;
  432. if (SysMgr.Instance.StartRun(this, this.cbPdtSN.Text, ref defname, ref name, ref batch, ref reel, ref len))
  433. {
  434. this.tsbtnImpStop.Enabled = true;
  435. this.tsbtnStop.Enabled = true;
  436. this.tsbtnStart.Enabled = false;
  437. //锁定信息
  438. this.cbPdtSN.Enabled = false;
  439. this.cbProductCode.Enabled = false;
  440. this.cbProductBatch.Enabled = false;
  441. this.cbProductReelNum.Enabled = false;
  442. this.cbProductNum.Enabled = false;
  443. this.cbDefectCode.Enabled = false;
  444. //记录开始运行时间
  445. //RunStartTime.Restart();
  446. //重新显示
  447. this.cbProductCode.Text = name;
  448. this.cbProductBatch.Text = batch;
  449. this.cbProductReelNum.Text = reel;
  450. this.cbProductNum.Text = len;
  451. this.cbDefectCode.Text = defname;
  452. }
  453. }
  454. else //暂停状态开始
  455. {
  456. if (SysMgr.Instance.ReStartRun())
  457. {
  458. this.tsbtnStop.Enabled = true;
  459. this.tsbtnStart.Enabled = false;
  460. }
  461. }
  462. this.Cursor = Cursors.Default;
  463. }
  464. }
  465. private void tsbtnReset_Click(object sender, EventArgs e)
  466. {
  467. }
  468. private void tsbtnStop_Click(object sender, EventArgs e)
  469. {
  470. AddTextEvent("暂停", "手动暂停");
  471. this.tsbtnStart.Enabled = true;
  472. SysMgr.Instance.StatusMgr.GotoPause();
  473. SysMgr.Instance.SendStatus();
  474. SysMgr.Instance.LedPause();
  475. }
  476. private void tsbtnWarning_Click(object sender, EventArgs e)
  477. {
  478. if (SysMgr.Instance.StatusMgr.Warning != WarningEnum.Normal)
  479. {
  480. AddTextEvent("清除", "手动清除报警");
  481. SysMgr.Instance.StatusMgr.ClearWarning();
  482. SysMgr.Instance.LedReady();
  483. if (SysMgr.Instance.IsAuto)
  484. SysMgr.Instance.StatusMgr.GotoPause();
  485. else
  486. SysMgr.Instance.StatusMgr.GotoNormalStandby();
  487. SysMgr.Instance.SendStatus();
  488. }
  489. }
  490. /// <summary>
  491. /// 结束验布
  492. /// </summary>
  493. /// <param name="sender"></param>
  494. /// <param name="e"></param>
  495. private void tsbtnImpStop_Click(object sender, EventArgs e)
  496. {
  497. AddTextEvent("结束验布", "手动结束验布");
  498. SysMgr.Instance.DefectEnd(this);
  499. }
  500. int cnnnt = 10;
  501. private void tsbGoHome_Click(object sender, EventArgs e)
  502. {
  503. #if false
  504. //测试散点
  505. chart1.Series.Clear();
  506. chart1.ChartAreas[0].AxisX.Title = "宽度(cm)";
  507. chart1.ChartAreas[0].AxisY.Title = "长度(m)";
  508. chart1.Series.Add("皱印");
  509. chart1.Series["皱印"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
  510. chart1.Series["皱印"].MarkerSize = 10;
  511. chart1.Series["皱印"].MarkerColor = Color.Red;
  512. chart1.Series["皱印"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  513. for (int i = 0; i < cnnnt; i++)
  514. this.chart1.Series["皱印"].Points.AddXY(i%5,i);
  515. chart1.Series.Add("划伤");
  516. chart1.Series["划伤"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
  517. chart1.Series["划伤"].MarkerSize = 10;
  518. chart1.Series["划伤"].MarkerColor = Color.Blue;
  519. chart1.Series["划伤"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  520. for (int i = 0; i < cnnnt; i++)
  521. this.chart1.Series["划伤"].Points.AddXY(i % 5 + 0.5, i + 0.3);
  522. chart1.ChartAreas[0].AxisY.Maximum = ((int)(this.chart1.Series["划伤"].Points.FindMaxByValue().YValues.Max() /10) + 1) * 10 + 5;
  523. chart1.ChartAreas[0].AxisY.ScaleView.Scroll(System.Windows.Forms.DataVisualization.Charting.ScrollType.Last);
  524. cnnnt +=20;
  525. MemoryStream ms = new MemoryStream();
  526. chart1.SaveImage(ms, ChartImageFormat.Bmp);
  527. Bitmap bmp = new Bitmap(ms);
  528. bmp.Save("111.jpg");
  529. ms.Close();
  530. #endif
  531. //测试散点
  532. chart3.Series.Clear();
  533. chart3.ChartAreas[0].AxisX.Title = "长度(m)";
  534. chart3.ChartAreas[0].AxisY.Title = "宽度(cm)";
  535. chart3.Series.Add("面宽");
  536. string tt = "面宽";
  537. if (chart3.Series.FindByName(tt) == null)
  538. chart3.Series.Add("面宽");
  539. else
  540. {
  541. chart3.Series["面宽"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
  542. chart3.Series["面宽"].MarkerSize = 5;
  543. chart3.Series["面宽"].MarkerColor = Color.Blue;
  544. chart3.Series["面宽"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  545. Random rm = new Random();
  546. for (int i = 0; i < cnnnt; i++)
  547. this.chart3.Series["面宽"].Points.AddXY(i, rm.Next(140, 160));
  548. cnnnt += 20;
  549. }
  550. //chart3.Series[0].f
  551. chart3.ChartAreas["ChartArea1"].AxisX.ScaleView.Scroll(ScrollType.Last);
  552. }
  553. #endregion
  554. #region 显示图像和消息
  555. private void lstLog_DrawItem(object sender, DrawItemEventArgs e)
  556. {
  557. e.DrawBackground();
  558. if (e.Index < 0) return;
  559. try
  560. {
  561. string str = lstLog.Items[e.Index].ToString();
  562. e.Graphics.DrawString(str.Substring(1), e.Font,
  563. new SolidBrush(str[0] == 'R' ? Color.Red : (str[0] == 'Y' ? Color.Orange : Color.Black)),
  564. e.Bounds);
  565. }
  566. catch (Exception ex)
  567. {
  568. e.Graphics.DrawString(ex.Message, e.Font,
  569. new SolidBrush(Color.Red),
  570. e.Bounds);
  571. }
  572. }
  573. /// <summary>
  574. /// 异步输出日志
  575. /// </summary>
  576. /// <param name="tag">模板标识</param>
  577. /// <param name="msg">内容</param>
  578. /// <param name="type"></param>
  579. private void AddTextEvent(string tag, string msg, WarningEnum level = WarningEnum.Normal)
  580. {
  581. lock (AddTextLock)
  582. {
  583. if (tag != null && tag != "")
  584. tag = $" - [{tag}]";
  585. var now = DateTime.Now;
  586. msg = now.ToString("HH:mm:ss fff") + tag + " - " + msg;
  587. msg = (level == WarningEnum.Normal ? "B" : level == WarningEnum.Low ? "Y" : "R") + msg;
  588. if (this.lstLog.Items.Count > 1000)
  589. this.lstLog.Items.Clear();
  590. lstLog.Items.Insert(0, msg);
  591. }
  592. }
  593. private void main_running(object sender, MainEventArgs e)
  594. {
  595. ShowMessage(e);
  596. }
  597. private delegate void ShowMessageDelegate(MainEventArgs e);
  598. private void ShowMessage(MainEventArgs e)
  599. {
  600. if (InvokeRequired)
  601. {
  602. ShowMessageDelegate smd = new ShowMessageDelegate(ShowMessage);
  603. this.BeginInvoke(smd, e);
  604. }
  605. else
  606. {
  607. AddTextEvent(e.Tag, e.Message, e.Warning);
  608. }
  609. }
  610. /// <summary>
  611. /// 自动运行流程显示
  612. /// </summary>
  613. /// <param name="sender"></param>
  614. /// <param name="e"></param>
  615. private void auto_runing(object sender, RunEventArgs e)
  616. {
  617. ShowUIEvent(e);
  618. }
  619. private delegate void ShowUIEventDelegate(RunEventArgs e);
  620. Bitmap bmp0;
  621. Bitmap bmp1;
  622. Bitmap bmp2;
  623. private void ShowUIEvent(RunEventArgs e)
  624. {
  625. if (InvokeRequired)
  626. {
  627. ShowUIEventDelegate smd = new ShowUIEventDelegate(ShowUIEvent);
  628. this.BeginInvoke(smd, e);
  629. }
  630. else
  631. {
  632. try
  633. {
  634. if (e.Cmd == 6) //显示主图
  635. {
  636. if (e.PicIndex == 1)
  637. {
  638. bmp1 = (Bitmap)CamDev.HImageToBitmap(e.Pic).Clone();
  639. this.pictureBox2.Image = bmp1;
  640. this.pictureBox2.Refresh();
  641. }
  642. else if (e.PicIndex == 2)
  643. {
  644. bmp2 = (Bitmap)CamDev.HImageToBitmap(e.Pic).Clone();
  645. this.pictureBox3.Image = bmp2;
  646. this.pictureBox3.Refresh();
  647. }
  648. else if(e.PicIndex == 0)
  649. {
  650. bmp0 = (Bitmap)CamDev.HImageToBitmap(e.Pic).Clone();
  651. this.pictureBox1.Image = bmp0;
  652. this.pictureBox1.Refresh();
  653. }
  654. }
  655. else if (e.Cmd == 10) //测试结束
  656. {
  657. this.tsbtnStart.Enabled = true;
  658. this.tsbtnStop.Enabled = false;
  659. this.tsbtnImpStop.Enabled = false;
  660. this.cbPdtSN.Enabled = true;
  661. this.cbProductCode.Enabled = true;
  662. this.cbProductBatch.Enabled = true;
  663. this.cbProductReelNum.Enabled = true;
  664. this.cbProductNum.Enabled = true;
  665. this.cbDefectCode.Enabled = true;
  666. }
  667. else if (e.Cmd == 11) //显示缺陷列表
  668. {
  669. foreach (var rowItem in e.DataRowlist)
  670. {
  671. this.skinDataGridView1.Rows.Insert(0, rowItem);
  672. if (chart1.Series.FindByName((string)rowItem[3]) == null)//rowItem[3] 为name
  673. {
  674. chart1.Series.Add((string)rowItem[3]);
  675. var obj = SysMgr.Instance.GetDefectLabel((string)rowItem[3]);
  676. int labelIndex = obj.Value<int>("id");
  677. chart1.Series[(string)rowItem[3]].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
  678. chart1.Series[(string)rowItem[3]].MarkerSize = 5;
  679. chart1.Series[(string)rowItem[3]].MarkerColor = ChartColor[labelIndex];
  680. chart1.Series[(string)rowItem[3]].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  681. }
  682. chart1.Series[(string)rowItem[3]].Points.AddXY(rowItem[4], rowItem[5]);
  683. }
  684. //chart1.ChartAreas[0].AxisY.Maximum = ((int)(this.chart1.Series["划伤"].Points.FindMaxByValue().YValues.Max() / 10) + 1) * 10 + 5;
  685. chart1.ChartAreas[0].AxisY.ScaleView.Scroll(System.Windows.Forms.DataVisualization.Charting.ScrollType.Last);
  686. }
  687. else if(e.Cmd == 12) //显示处理图
  688. {
  689. bmp0 = (Bitmap)e.Defectimg.Clone();
  690. this.pictureBox1.Image = bmp0;
  691. this.pictureBox1.Refresh();
  692. }
  693. else if (e.Cmd == 13) //显示门幅
  694. {
  695. //this.BeginInvoke(new System.Action(() =>
  696. //{
  697. List<float> ydata = new List<float>();
  698. foreach (var Item in e.Points)
  699. {
  700. ydata.Add(Item[1]);
  701. float x = Item[0] / 100; //cm -> m
  702. this.chart3.Series["面宽"].Points.AddXY((float)Math.Round(x, 2), (float)Math.Round(Item[1], 2));
  703. }
  704. chart3.ChartAreas[0].AxisY.Maximum = Math.Round(ydata.Max() + 10, 0);
  705. chart3.ChartAreas[0].AxisY.Minimum = Math.Round(ydata.Max() - 10, 0);
  706. chart3.ChartAreas["ChartArea1"].AxisX.ScaleView.Scroll(ScrollType.Last);
  707. //}));
  708. }
  709. else if (e.Cmd == 14) //显示速度
  710. {
  711. //this.BeginInvoke(new System.Action(() =>
  712. //{
  713. lblDefectLen.Text = $"检测长度: {e.Len} 米";
  714. lblDefectSpeed.Text = $"检测速度: {e.Speed} 米/分钟";
  715. //}));
  716. }
  717. else if (e.Cmd == 15) //显示处理图 new
  718. {
  719. bmp0 = (Bitmap)e.DefectMat.ToBitmap();
  720. this.pictureBox1.Image = bmp0;
  721. this.pictureBox1.Refresh();
  722. }
  723. Application.DoEvents();
  724. }
  725. catch { }
  726. }
  727. }
  728. #endregion
  729. #region 后台
  730. GetPN pn = new GetPN();
  731. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  732. {
  733. while (backgroundWorkerDo)
  734. {
  735. try
  736. {
  737. this.Invoke(new MethodInvoker(() =>
  738. {
  739. this.tsslLoginTime.Text = $" 当前时间:{DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss")}";
  740. }));
  741. //检测按钮和实时状态
  742. if (SysMgr.Instance.IsInit)
  743. {
  744. bool sts = SysMgr.Instance.WarningShowLed(false);
  745. if (sts)
  746. {
  747. this.Invoke(new MethodInvoker(() =>
  748. {
  749. this.tsbtnStart.Enabled = true;
  750. this.tsbtnStop.Enabled = false;
  751. }));
  752. }
  753. int stsno = 0;
  754. stsno = SysMgr.Instance.ButtonIOTrg(false);
  755. if (stsno == 1)
  756. {
  757. this.Invoke(new MethodInvoker(() =>
  758. {
  759. tsbtnStart_Click(null, null);
  760. }));
  761. }
  762. else if (stsno == 2)
  763. {
  764. this.Invoke(new MethodInvoker(() =>
  765. {
  766. this.tsbtnStart.Enabled = true;
  767. }));
  768. SysMgr.Instance.LedPause();
  769. }
  770. else if (stsno == 3)
  771. {
  772. this.Invoke(new MethodInvoker(() =>
  773. {
  774. tsbtnReset_Click(null, null);
  775. }));
  776. }
  777. }
  778. //if (pn.P(SysMgr.Instance.IsRuning))
  779. //{
  780. // //继续计时
  781. // RunStartTime.Start();
  782. //}
  783. //if (pn.N(SysMgr.Instance.IsRuning))
  784. //{
  785. // //停止计时
  786. // RunStartTime.Stop();
  787. //}
  788. //if (SysMgr.Instance.IsRuning)
  789. //{
  790. // //实时显示
  791. // RunStartTime.Stop();
  792. // this.Invoke(new MethodInvoker(() =>
  793. // {
  794. // tslabelTime.Text = "实时测试:" + ((double)RunStartTime.ElapsedMilliseconds / 1000.0).ToString("0.000") + "s";
  795. // //this.Refresh();
  796. // }));
  797. // RunStartTime.Start();
  798. //}
  799. Thread.Sleep(100);
  800. Application.DoEvents();
  801. }
  802. catch { }
  803. }
  804. }
  805. /// <summary>
  806. /// 信号上升沿下降沿捕获
  807. /// </summary>
  808. class GetPN
  809. {
  810. bool _P = false;
  811. bool _N = false;
  812. /// <summary>
  813. /// 判断上升沿
  814. /// </summary>
  815. /// <param name="Value"></param>
  816. /// <returns></returns>
  817. public bool P(bool Value)
  818. {
  819. if (Value && !_P)
  820. {
  821. _P = true;
  822. return true;
  823. }
  824. if (!Value)
  825. _P = false;
  826. return false;
  827. }
  828. /// <summary>
  829. /// 判断下降沿
  830. /// </summary>
  831. /// <param name="Value"></param>
  832. /// <returns></returns>
  833. public bool N(bool Value)
  834. {
  835. if (!Value && _N)
  836. {
  837. _N = false;
  838. return true;
  839. }
  840. if (Value)
  841. _N = true;
  842. return false;
  843. }
  844. }
  845. #endregion
  846. #region 表格点击
  847. private void skinDataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
  848. {
  849. if (e.RowIndex < 0)
  850. return;
  851. var defectInfo = SysMgr.Instance.GetDefectInfo((long)this.skinDataGridView1.CurrentRow.Cells["colUid"].Value);
  852. if (defectInfo == null)
  853. {
  854. DialogResult dr = DialogResult.Cancel;
  855. dr = FrmDialog.ShowDialog(this, "此记录已不存在!", "警告", true);
  856. return;
  857. }
  858. this.pictureBox4.Image = (defectInfo.image);
  859. //选中
  860. this.Invoke(new System.Action(() =>
  861. {
  862. if (chart1.Series != null && chart1.Series.FindByName("SELECT") != null)
  863. {
  864. chart1.Series["SELECT"].Points.Clear();
  865. chart1.Series["SELECT"].Points.AddXY(defectInfo.CentreX, defectInfo.CentreY / 100);
  866. chart1.Refresh();
  867. }
  868. }));
  869. }
  870. #endregion
  871. }
  872. }