革博士V2程序
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

1439 řádky
62 KiB

  1. using CCWin.SkinControl;
  2. using DocumentFormat.OpenXml.EMMA;
  3. using DocumentFormat.OpenXml.Office2010.ExcelAc;
  4. using DocumentFormat.OpenXml.Office2019.Excel.RichData;
  5. using GeBoShi.SysCtrl;
  6. using GeBoShi.UI;
  7. using GeBoShi.UI.DataQuery;
  8. using GeBoShi.UI.InageShow;
  9. using GeBoShi.UI.Load;
  10. using GeBoShi.UI.Product;
  11. using GeBoShi.UI.SysSet;
  12. using HZH_Controls;
  13. using HZH_Controls.Controls;
  14. using HZH_Controls.Forms;
  15. using ImageToolKits;
  16. using MaiMuControl;
  17. using MaiMuControl.Device;
  18. using MaiMuControl.Device.CamDev;
  19. using Models;
  20. using OpenCvSharp;
  21. using OpenCvSharp.Extensions;
  22. using System;
  23. using System.Collections;
  24. using System.Collections.Generic;
  25. using System.ComponentModel;
  26. using System.Data;
  27. using System.Diagnostics;
  28. using System.Drawing;
  29. using System.IO;
  30. using System.Linq;
  31. using System.Runtime.InteropServices;
  32. using System.Text;
  33. using System.Threading;
  34. using System.Threading.Tasks;
  35. using System.Web.UI.WebControls.WebParts;
  36. using System.Windows.Forms;
  37. using System.Windows.Forms.DataVisualization.Charting;
  38. namespace GeBoShi
  39. {
  40. public partial class Main : Form
  41. {
  42. [DllImport("user32.dll ", EntryPoint = "SetParent")]
  43. private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); //将外部窗体嵌入程序
  44. [DllImport("user32.dll")]
  45. public static extern IntPtr FindWindow(string lpszClass, string lpszWindow); //按照窗体类名或窗体标题查找窗体
  46. object AddTextLock = new object();
  47. bool backgroundWorkerDo;
  48. private Stopwatch RunStartTime = new Stopwatch();
  49. /// <summary>
  50. /// 显示颜色现在对应30色,确保label在30个以内
  51. /// </summary>
  52. Color[] ChartColor = new Color[30] { Color.Red, Color.Blue, Color.Green, Color.YellowGreen, Color.Orange,
  53. Color.Peru, Color.DarkRed,Color.GreenYellow, Color.Pink , Color.Brown,
  54. Color.CadetBlue, Color.OrangeRed, Color.Cyan, Color.Lime, Color.Magenta, Color.Tan, Color.Sienna,
  55. Color.DarkGray, Color.SaddleBrown, Color.DarkBlue, Color.Firebrick,Color.Gainsboro,Color.Honeydew,Color.Khaki,Color.Lavender,
  56. Color.LightGoldenrodYellow,Color.Navy, Color.Khaki, Color.IndianRed,Color.Lavender};
  57. Process process = null;
  58. IntPtr appWin;
  59. public Main()
  60. {
  61. InitializeComponent();
  62. UIStyle.SetUIStyle(this);
  63. //process = Process.Start(@"C:\WINDOWS\system32\osk.exe");
  64. //process.WaitForInputIdle();
  65. //appWin = FindWindow(null, "屏幕键盘");
  66. //SetParent(appWin, this.keyPanel.Handle);
  67. this.keyPanel.Visible = false;
  68. this.uiTitel1.FatherForm = this;
  69. this.uiTitel1.UserMenuStrip = this.menuStrip1;
  70. this.uiTitel1.ShowContrlBox(true, true, true);
  71. this.uiTitel1.ShowMenu();
  72. this.DoubleBuffered = true;//设置本窗体
  73. SetStyle(ControlStyles.UserPaint, true);
  74. SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
  75. SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
  76. SysMgr.Instance.MainRuning += main_running;
  77. SysMgr.Instance.AutoRuning += auto_runing;
  78. #region dataGridView设置
  79. skinDataGridView1.AllowUserToAddRows = skinDataGridView1.AllowUserToDeleteRows = false;//用户添加删除行
  80. skinDataGridView1.AllowUserToResizeRows = false;//用户调整行大小 //显示行号与列宽度自动调整
  81. skinDataGridView1.RowHeadersVisible = true;
  82. skinDataGridView1.RowHeadersWidth = 50;
  83. //dataGridView1.ColumnHeadersHeightSizeMode = dataGridView2.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
  84. skinDataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;//数据量过百绑定太变
  85. skinDataGridView1.RowTemplate.Height = 30;
  86. //skinDataGridView1.RowPostPaint += (sender, e) =>//序号列头
  87. //{
  88. // showRowNum_onDataGrid_RowPostPaint(this.skinDataGridView1, sender, e);
  89. //};
  90. for (int i = 0; i < skinDataGridView1.Columns.Count; i++)//禁止点击列头排序
  91. skinDataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;
  92. this.skinDataGridView1.CellClick += skinDataGridView1_CellClick; ;
  93. #endregion
  94. this.lblDefectLen.Top = toolStrip1.Top + 10;
  95. this.lblDefectLen.Left = toolStrip1.Width - 300;
  96. this.lblDefectSpeed.Top = toolStrip1.Top + 10 + lblDefectLen.Height + 5;
  97. this.lblDefectSpeed.Left = toolStrip1.Width - 300;
  98. this.lbFK.Text = "当前幅宽:";
  99. }
  100. #region 初始化
  101. /// <summary>
  102. /// 初始化
  103. /// </summary>
  104. /// <returns></returns>
  105. private bool InitSystem()
  106. {
  107. //进入初始化,初始化失败则中断
  108. InitFrm initFrm = new InitFrm();
  109. initFrm.ShowDialog();
  110. if (initFrm.DialogResult == DialogResult.OK)
  111. {
  112. //初始化成功
  113. }
  114. else
  115. {
  116. initFrm.Dispose();
  117. return false;
  118. }
  119. initFrm.Dispose();
  120. return true;
  121. }
  122. #endregion
  123. #region 界面刷新
  124. private void showRowNum_onDataGrid_RowPostPaint(DataGridView dgv, object sender, DataGridViewRowPostPaintEventArgs e)
  125. {
  126. Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 4, e.RowBounds.Height);
  127. TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dgv.RowHeadersDefaultCellStyle.Font, rectangle, dgv.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right);
  128. }
  129. private void ResetUI(bool clearSN)
  130. {
  131. //保持产品名称和料号
  132. //txtProductName.Text = txtProductCode.Text = txtProductSN.Text = "";
  133. if (clearSN)
  134. cbPdtSN.Text = "";
  135. this.logTxt.Text = "正常状态";
  136. this.tsbtnImpStop.Enabled = false;
  137. this.tsbtnStart.Enabled = true;
  138. this.tsbtnStop.Enabled = false;
  139. this.cbPdtSN.Enabled = true;
  140. this.pictureBox1.Image = null;
  141. pictureBox1.Refresh();
  142. tslabelTime.Text = "实时测试队列";
  143. skinDataGridView1.DataSource = null;
  144. this.skinDataGridView1.Rows.Clear();
  145. ResetChart();
  146. lblDefectLen.Text = $"检测长度: 0 米";
  147. lblDefectSpeed.Text = $"检测速度: 0 米/分钟";
  148. ucSwitch1.Checked = SysMgr.Instance.GetDefectPause();
  149. this.Refresh();
  150. }
  151. void ResetChart()
  152. {
  153. chart1.Series.Clear();
  154. chart1.Series.Add("SELECT");
  155. chart1.Series["SELECT"].ChartType = SeriesChartType.Point;
  156. chart1.Series["SELECT"].MarkerSize = 25;
  157. chart1.Series["SELECT"].MarkerColor = Color.Black;
  158. chart1.Series["SELECT"].MarkerStyle = MarkerStyle.Star6;
  159. //chart1.Series["SELECT"].Enabled = false;
  160. //chart1.ChartAreas[0].AxisX.Title = "宽度(cm)";
  161. //chart1.ChartAreas[0].AxisY.Title = "长度(m)";
  162. chart3.Series.Clear();
  163. chart3.Series.Add("面宽");
  164. //chart3.ChartAreas[0].AxisX.Title = "长度(m)";
  165. //chart3.ChartAreas[0].AxisY.Title = "宽度(cm)";
  166. chart3.Series["面宽"].ChartType = SeriesChartType.Line;
  167. chart3.Series["面宽"].MarkerSize = 5;
  168. chart3.Series["面宽"].MarkerColor = Color.Blue;
  169. chart3.Series["面宽"].MarkerStyle = MarkerStyle.Circle;
  170. }
  171. #endregion
  172. #region 权限判断
  173. private void UserRightCheck()
  174. {
  175. this.tsmPdtMgr.Enabled = SysMgr.Instance.UserMgr.RightControl(GeBoShi.UI.User.UserRightEnum.Product);
  176. this.tsmSysDataFind.Visible = SysMgr.Instance.UserMgr.RightControl(GeBoShi.UI.User.UserRightEnum.Statistics);
  177. this.tsmUserList.Enabled = SysMgr.Instance.UserMgr.RightControl(GeBoShi.UI.User.UserRightEnum.User);
  178. this.tsmUserRight.Enabled = SysMgr.Instance.UserMgr.RightControl(GeBoShi.UI.User.UserRightEnum.Role);
  179. if (this.tsmUserList.Enabled == false && this.tsmUserRight.Enabled == false)
  180. this.tsmSysUserMgr.Visible = false;
  181. else
  182. this.tsmSysUserMgr.Visible = true;
  183. this.tsmDebug.Enabled = SysMgr.Instance.UserMgr.RightControl(GeBoShi.UI.User.UserRightEnum.Debug);
  184. this.tsmSysSet.Enabled = SysMgr.Instance.UserMgr.RightControl(GeBoShi.UI.User.UserRightEnum.ParamsSetting);
  185. if (this.tsmDebug.Enabled == false && this.tsmSysSet.Enabled == false)
  186. this.stmSysSet.Visible = false;
  187. else
  188. this.stmSysSet.Visible = true;
  189. }
  190. #endregion
  191. #region 运行判断
  192. /// <summary>
  193. /// 系统是否在运行
  194. /// </summary>
  195. /// <returns></returns>
  196. private bool SystemIsRun()
  197. {
  198. //if (SysMgr.Instance.IsRuning)
  199. //{
  200. // FrmDialog.ShowDialog(this, "设备正在运行中!", "警告", false);
  201. // //MessageBox.Show("设备正在运行中!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  202. // return false;
  203. //}
  204. return true;
  205. }
  206. #endregion
  207. #region 界面事件
  208. private void Main_Load(object sender, EventArgs e)
  209. {
  210. //登入
  211. if (SysMgr.Instance.LoginSystem())
  212. {
  213. //登入成功
  214. if (InitSystem())
  215. {
  216. this.Cursor = Cursors.WaitCursor;
  217. //this.WindowState = FormWindowState.Normal;
  218. this.Top = 0;
  219. this.Left = 0;
  220. this.Width = SystemInformation.WorkingArea.Width;
  221. this.Height = SystemInformation.WorkingArea.Height;
  222. //this.WindowState = FormWindowState.Maximized;
  223. //this.splitContainer1.SplitterDistance = this.Width / 3;
  224. //this.tabControl1.ItemSize = new System.Drawing.Size(this.tabControl1.Width / 2 - 10, 26);
  225. ResetUI(true);
  226. this.Show();
  227. this.tsslLoginInfo.Text = $"操作员:{SysMgr.Instance.UserMgr.LoginUser.Code}({SysMgr.Instance.UserMgr.LoginUser.Name})";
  228. this.statusStrip1.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.HorizontalStackWithOverflow;
  229. this.tsslLoginTime.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
  230. this.tsslLoginInfo.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
  231. this.tsState.Text = "";
  232. //更新数据库格式
  233. Service.InitDB.initDB(ConfMgr.Instance.DBConStr);
  234. //权限判断
  235. UserRightCheck();
  236. //开启后台
  237. //timer1.Enabled = true;
  238. backgroundWorkerDo = true;
  239. backgroundWorker1.RunWorkerAsync();
  240. //s_BackWorker = true;
  241. //backgroundWorker.RunWorkerAsync();
  242. //开启云端连接
  243. //SysMgr.Instance.InitCloudConnect();
  244. //开启产品服务
  245. //SysMgr.Instance.InitPdtService();
  246. //开启处理事件反馈
  247. SysMgr.Instance.InitDefectEvent();
  248. //加载产品料号
  249. SysMgr.Instance.LoadProductCodeList();
  250. //加载产品选择
  251. LoadPdtList(SysMgr.Instance.ProductCodeList);
  252. this.Cursor = Cursors.Default;
  253. //运行前检测磁盘空间
  254. SysMgr.CheckDisk(this, 100);
  255. }
  256. else
  257. {
  258. Application.Exit();
  259. }
  260. }
  261. else
  262. {
  263. Application.Exit();
  264. }
  265. }
  266. private void Main_FormClosing(object sender, FormClosingEventArgs e)
  267. {
  268. if (SystemIsRun())
  269. {
  270. DialogResult dr = DialogResult.Cancel;
  271. if (SysMgr.Instance.IsInit)
  272. {
  273. dr = FrmDialog.ShowDialog(this, "确定要退出当前系统?", "警告", true);
  274. }
  275. else
  276. dr = DialogResult.OK;
  277. if (dr == DialogResult.Cancel)
  278. {
  279. e.Cancel = true;
  280. }
  281. else
  282. {
  283. backgroundWorkerDo = false;
  284. //Thread.Sleep(300);
  285. Thread.Sleep(300);
  286. if (SysMgr.Instance.IsInit)
  287. SysMgr.Instance.Close();
  288. //SysMgr.Instance.MainRuning -= main_running;
  289. }
  290. }
  291. else
  292. e.Cancel = true;
  293. }
  294. private void Main_SizeChanged(object sender, EventArgs e)
  295. {
  296. if (this.WindowState == FormWindowState.Maximized)
  297. {
  298. this.WindowState = FormWindowState.Normal;
  299. this.Top = 0;
  300. this.Left = 0;
  301. this.Width = SystemInformation.WorkingArea.Width;
  302. this.Height = SystemInformation.WorkingArea.Height;
  303. //this.tabControl1.ItemSize = new System.Drawing.Size(this.tabControl1.Width / 2 - 10, 26);
  304. }
  305. }
  306. #endregion
  307. #region 菜单
  308. #region 退出
  309. private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
  310. {
  311. this.Close();
  312. }
  313. #endregion
  314. #region 用户
  315. private void tsmUserRight_Click(object sender, EventArgs e)
  316. {
  317. SysMgr.Instance.UserPermissiomMgr();
  318. }
  319. private void tsmUserList_Click(object sender, EventArgs e)
  320. {
  321. SysMgr.Instance.UserListMgr();
  322. }
  323. #endregion
  324. #region 系统设置
  325. private void MainFrm_Paint(object sender, PaintEventArgs e)
  326. {
  327. this.tsbtnReset.Visible = ConfMgr.Instance.SysConfigParams.ShowResetBtn;
  328. //this.tabControl1.ItemSize = new System.Drawing.Size(this.tabControl1.Width / 2 - 10, 26);
  329. }
  330. private void tsmSysSet_Click(object sender, EventArgs e)
  331. {
  332. if (SystemIsRun())
  333. {
  334. //SysMgr.Instance.StatusMgr.GotoSetParams();
  335. //SysMgr.Instance.SendStatus();
  336. SysSetFrm frm = new SysSetFrm();
  337. frm.ShowDialog();
  338. MainFrm_Paint(null, null);
  339. //SysMgr.Instance.StatusMgr.GotoNormalStandby();
  340. //SysMgr.Instance.SendStatus();
  341. }
  342. }
  343. private void tsmDebug_Click(object sender, EventArgs e)
  344. {
  345. }
  346. #endregion
  347. #endregion
  348. #region 检测管理
  349. private string[] pdtlistData;
  350. private void LoadPdtList(List<string> list)
  351. {
  352. this.cbDefectCode.Items.Clear();
  353. while (true)
  354. {
  355. bool bk = true;
  356. for (int i = 0; i < list.Count; i++)
  357. {
  358. if (list[i] == null || string.IsNullOrEmpty(list[i]))
  359. {
  360. list.Remove(list[i]);
  361. bk = false;
  362. }
  363. }
  364. if (bk)
  365. {
  366. break;
  367. }
  368. }
  369. this.pdtlistData = list.ToArray();
  370. cbDefectCode.Items.AddRange(pdtlistData);//比使用DataSource速度要快一些
  371. cbDefectCode.TextUpdate += cobList_TextUpdate;//重新绑定事件
  372. cbDefectCode.KeyDown += CobList_KeyDown;
  373. this.cbDefectCode.Text = "";
  374. cbDefectCode.Focus();
  375. cbDefectCode.SelectAll();
  376. }
  377. private void tsmPdtMgr_Click(object sender, EventArgs e)
  378. {
  379. if (SystemIsRun())
  380. {
  381. ProductListFrm frm = new ProductListFrm();
  382. frm.WindowState = FormWindowState.Maximized;
  383. frm.ShowDialog();
  384. //加载产品料号
  385. SysMgr.Instance.LoadProductCodeList();
  386. //加载产品选择
  387. LoadPdtList(SysMgr.Instance.ProductCodeList);
  388. }
  389. }
  390. private void CobList_KeyDown(object sender, KeyEventArgs e)
  391. {
  392. ComboBox ctrl = sender as ComboBox;
  393. if (e.KeyCode == Keys.Enter)
  394. {
  395. if (ctrl.Items.Count == 1)
  396. ctrl.Text = ctrl.Items[0].ToString();
  397. }
  398. }
  399. private void cobList_TextUpdate(object sender, EventArgs e)
  400. {
  401. ComboBox ctrl = sender as ComboBox;
  402. if (ctrl.Text != null)
  403. {
  404. string str = ctrl.Text; //获取cb_material控件输入内
  405. //清空combobox
  406. ctrl.DataSource = null;
  407. ctrl.Items.Clear();
  408. string[] workOrderFiltered;
  409. workOrderFiltered = pdtlistData.Where(x => x.IndexOf(str, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray();//忽略大小写
  410. ctrl.Items.AddRange(workOrderFiltered);//比使用DataSource速度要快一些
  411. // 不存在符合条件时
  412. //设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
  413. ctrl.Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置
  414. if (workOrderFiltered.Length > 0)
  415. {
  416. if (!ctrl.DroppedDown)
  417. ctrl.DroppedDown = true; // 自动弹出下拉框
  418. }
  419. ctrl.SelectionStart = str.Length; // 设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
  420. }
  421. }
  422. #endregion
  423. #region 按钮
  424. private void tsbtnStart_Click(object sender, EventArgs e)
  425. {
  426. if (!SysMgr.Instance.IsRuning)
  427. {
  428. //低报警自动复位
  429. if (SysMgr.Instance.StatusMgr.Status == SystemStsEnum.Warning)
  430. {
  431. if (SysMgr.Instance.StatusMgr.Warning == WarningEnum.Low)
  432. {
  433. SysMgr.Instance.StatusMgr.ClearWarning();
  434. SysMgr.Instance.StatusMgr.GotoNormalStandby();
  435. }
  436. }
  437. //提示正在报警中
  438. if (SysMgr.Instance.StatusMgr.Status == SystemStsEnum.Warning)
  439. {
  440. FrmDialog.ShowDialog(this, "系统报警中!无法启动运行!", "警告", false);
  441. return;
  442. }
  443. //运行前检测磁盘空间
  444. SysMgr.CheckDisk(this, 100);
  445. this.Cursor = Cursors.WaitCursor;
  446. System.Windows.Forms.Application.DoEvents();
  447. if (SysMgr.Instance.StatusMgr.Status != SystemStsEnum.Pause)
  448. {
  449. ResetUI(false);
  450. AddTextEvent("运行", $"启动自动检测流程");
  451. //获取测试产品信息
  452. string name = "";
  453. string batch = "";
  454. string reel = "";
  455. string len = "";
  456. string defname = this.cbDefectCode.Text;
  457. if(string.IsNullOrEmpty(name))
  458. {
  459. name = "default";
  460. }
  461. if (SysMgr.Instance.StartRun(this, this.cbPdtSN.Text, ref defname, ref name, ref batch, ref reel, ref len))
  462. {
  463. this.tsbtnImpStop.Enabled = true;
  464. this.tsbtnStop.Enabled = true;
  465. this.tsbtnStart.Enabled = false;
  466. //锁定信息
  467. this.cbPdtSN.Enabled = false;
  468. this.cbDefectCode.Enabled = false;
  469. //记录开始运行时间
  470. RunStartTime.Restart();
  471. //重新显示
  472. this.cbDefectCode.Text = defname;
  473. ResetChart();
  474. }
  475. }
  476. else //暂停状态开始
  477. {
  478. if (SysMgr.Instance.ReStartRun())
  479. {
  480. this.tsbtnStop.Enabled = true;
  481. this.tsbtnStart.Enabled = false;
  482. }
  483. }
  484. this.Cursor = Cursors.Default;
  485. }
  486. }
  487. private void tsbtnReset_Click(object sender, EventArgs e)
  488. {
  489. }
  490. private void tsbtnStop_Click(object sender, EventArgs e)
  491. {
  492. AddTextEvent("暂停", "手动暂停");
  493. this.tsbtnStart.Enabled = true;
  494. SysMgr.Instance.Stop();
  495. SysMgr.Instance.StatusMgr.GotoPause();
  496. SysMgr.Instance.SendStatus();
  497. SysMgr.Instance.LedPause();
  498. }
  499. private void tsbtnWarning_Click(object sender, EventArgs e)
  500. {
  501. if (SysMgr.Instance.StatusMgr.Warning != WarningEnum.Normal)
  502. {
  503. AddTextEvent("清除", "手动清除报警");
  504. SysMgr.Instance.StatusMgr.ClearWarning();
  505. SysMgr.Instance.LedReady();
  506. if (SysMgr.Instance.IsAuto)
  507. SysMgr.Instance.StatusMgr.GotoPause();
  508. else
  509. SysMgr.Instance.StatusMgr.GotoNormalStandby();
  510. SysMgr.Instance.SendStatus();
  511. }
  512. }
  513. /// <summary>
  514. /// 结束验布
  515. /// </summary>
  516. /// <param name="sender"></param>
  517. /// <param name="e"></param>
  518. private void tsbtnImpStop_Click(object sender, EventArgs e)
  519. {
  520. AddTextEvent("结束验布", "手动结束验布");
  521. SysMgr.Instance.StatusMgr.GotoPause();
  522. SysMgr.Instance.DefectEnd(this);
  523. this.tsbtnStop.Enabled = false;
  524. this.tsbtnStart.Enabled = true;
  525. this.tsbtnImpStop.Enabled = false;
  526. SysMgr.Instance.StatusMgr.GotoNormalStandby();
  527. SysMgr.Instance.SendStatus();
  528. SysMgr.Instance.LedReady();
  529. }
  530. int cnnnt = 10;
  531. private void tsbGoHome_Click(object sender, EventArgs e)
  532. {
  533. #if false
  534. //测试散点
  535. chart1.Series.Clear();
  536. chart1.ChartAreas[0].AxisX.Title = "宽度(cm)";
  537. chart1.ChartAreas[0].AxisY.Title = "长度(m)";
  538. chart1.Series.Add("皱印");
  539. chart1.Series["皱印"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
  540. chart1.Series["皱印"].MarkerSize = 10;
  541. chart1.Series["皱印"].MarkerColor = Color.Red;
  542. chart1.Series["皱印"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  543. for (int i = 0; i < cnnnt; i++)
  544. this.chart1.Series["皱印"].Points.AddXY(i%5,i);
  545. chart1.Series.Add("划伤");
  546. chart1.Series["划伤"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
  547. chart1.Series["划伤"].MarkerSize = 10;
  548. chart1.Series["划伤"].MarkerColor = Color.Blue;
  549. chart1.Series["划伤"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  550. for (int i = 0; i < cnnnt; i++)
  551. this.chart1.Series["划伤"].Points.AddXY(i % 5 + 0.5, i + 0.3);
  552. chart1.ChartAreas[0].AxisY.Maximum = ((int)(this.chart1.Series["划伤"].Points.FindMaxByValue().YValues.Max() /10) + 1) * 10 + 5;
  553. chart1.ChartAreas[0].AxisY.ScaleView.Scroll(System.Windows.Forms.DataVisualization.Charting.ScrollType.Last);
  554. cnnnt +=20;
  555. MemoryStream ms = new MemoryStream();
  556. chart1.SaveImage(ms, ChartImageFormat.Bmp);
  557. Bitmap bmp = new Bitmap(ms);
  558. bmp.Save("111.jpg");
  559. ms.Close();
  560. #endif
  561. //测试散点
  562. chart3.Series.Clear();
  563. //chart3.ChartAreas[0].AxisX.Title = "长度(m)";
  564. //chart3.ChartAreas[0].AxisY.Title = "宽度(cm)";
  565. chart3.Series.Add("面宽");
  566. string tt = "面宽";
  567. if (chart3.Series.FindByName(tt) == null)
  568. chart3.Series.Add("面宽");
  569. else
  570. {
  571. chart3.Series["面宽"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
  572. chart3.Series["面宽"].MarkerSize = 5;
  573. chart3.Series["面宽"].MarkerColor = Color.Blue;
  574. chart3.Series["面宽"].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  575. Random rm = new Random();
  576. for (int i = 0; i < cnnnt; i++)
  577. this.chart3.Series["面宽"].Points.AddXY(i, rm.Next(140, 160));
  578. cnnnt += 20;
  579. }
  580. //chart3.Series[0].f
  581. //chart3.ChartAreas["ChartArea1"].AxisX.ScaleView.Scroll(ScrollType.Last);
  582. }
  583. private void 本地数据库查询ToolStripMenuItem_Click(object sender, EventArgs e)
  584. {
  585. DataQueryFrm frm = new DataQueryFrm();
  586. frm.WindowState = FormWindowState.Maximized;
  587. frm.ShowDialog();
  588. }
  589. #endregion
  590. #region 显示图像和消息
  591. private void logTxt_TextChanged(object sender, EventArgs e)
  592. {
  593. }
  594. private void lstLog_DrawItem(object sender, DrawItemEventArgs e)
  595. {
  596. //e.DrawBackground();
  597. //if (e.Index < 0) return;
  598. //try
  599. //{
  600. // string str = lstLog.Items[e.Index].ToString();
  601. // e.Graphics.DrawString(str.Substring(1), e.Font,
  602. // new SolidBrush(str[0] == 'R' ? Color.Red : (str[0] == 'Y' ? Color.Orange : Color.Black)),
  603. // e.Bounds);
  604. //}
  605. //catch (Exception ex)
  606. //{
  607. // e.Graphics.DrawString(ex.Message, e.Font,
  608. // new SolidBrush(Color.Red),
  609. // e.Bounds);
  610. //}
  611. }
  612. /// <summary>
  613. /// 异步输出日志
  614. /// </summary>
  615. /// <param name="tag">模板标识</param>
  616. /// <param name="msg">内容</param>
  617. /// <param name="type"></param>
  618. private void AddTextEvent(string tag, string msg, WarningEnum level = WarningEnum.Normal, bool Show = true)
  619. {
  620. lock (AddTextLock)
  621. {
  622. if (tag != null && tag != "")
  623. tag = $" - [{tag}]";
  624. var now = DateTime.Now;
  625. string tmsg = now.ToString("HH:mm:ss fff") + tag + " - " + msg;
  626. //msg = (level == WarningEnum.Normal ? "B" : level == WarningEnum.Low ? "Y" : "R") + msg;
  627. this.logTxt.Text = tmsg;
  628. this.logTxt.ForeColor = (level == WarningEnum.Normal ? Color.White : level == WarningEnum.Low ? Color.Orange : Color.Red);
  629. //报警弹窗
  630. if (level != WarningEnum.Normal)
  631. {
  632. this.BeginInvoke(new System.Action(() =>
  633. {
  634. MessageBox.Show(tmsg, level == WarningEnum.Low ? "警告" : "报警", MessageBoxButtons.OK, level == WarningEnum.Low ? MessageBoxIcon.Warning : MessageBoxIcon.Error);
  635. }));
  636. }
  637. }
  638. }
  639. private void main_running(object sender, MainEventArgs e)
  640. {
  641. ShowMessage(e);
  642. }
  643. private delegate void ShowMessageDelegate(MainEventArgs e);
  644. private void ShowMessage(MainEventArgs e)
  645. {
  646. if (InvokeRequired)
  647. {
  648. ShowMessageDelegate smd = new ShowMessageDelegate(ShowMessage);
  649. this.BeginInvoke(smd, e);
  650. }
  651. else
  652. {
  653. AddTextEvent(e.Tag, e.Message, e.Warning, e.show);
  654. }
  655. }
  656. /// <summary>
  657. /// 自动运行流程显示
  658. /// </summary>
  659. /// <param name="sender"></param>
  660. /// <param name="e"></param>
  661. private void auto_runing(object sender, RunEventArgs e)
  662. {
  663. ShowUIEvent(e);
  664. }
  665. private delegate void ShowUIEventDelegate(RunEventArgs e);
  666. Bitmap bmp0;
  667. Bitmap bmp1;
  668. Bitmap bmp2;
  669. private void ReDrawDefectPoints(List<object[]> DataRowlist)
  670. {
  671. foreach (var rowItem in DataRowlist)
  672. {
  673. this.skinDataGridView1.Rows.Insert(0, rowItem);
  674. if (chart1.Series.FindByName((string)rowItem[3]) == null)//rowItem[3] 为name
  675. {
  676. chart1.Series.Add((string)rowItem[3]);
  677. var obj = SysMgr.Instance.GetDefectLabel((string)rowItem[3]);
  678. int labelIndex = obj.Value<int>("id");
  679. chart1.Series[(string)rowItem[3]].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
  680. chart1.Series[(string)rowItem[3]].MarkerSize = 5;
  681. chart1.Series[(string)rowItem[3]].MarkerColor = ChartColor[labelIndex];
  682. chart1.Series[(string)rowItem[3]].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  683. }
  684. chart1.Series[(string)rowItem[3]].Points.AddXY(rowItem[4], rowItem[5]);
  685. }
  686. //chart1.ChartAreas[0].AxisY.Maximum = ((int)(this.chart1.Series["划伤"].Points.FindMaxByValue().YValues.Max() / 10) + 1) * 10 + 5;
  687. chart1.ChartAreas[0].AxisY.ScaleView.Scroll(System.Windows.Forms.DataVisualization.Charting.ScrollType.Last);
  688. }
  689. private void LoadDefectLabelAndPrint(Product md, bool reLabel = false)
  690. {
  691. dataGridView1.Columns.Clear();
  692. DataTable dt = new DataTable(); //建立个数据表
  693. dt.Columns.Add(new DataColumn("二次判断项", typeof(string)));//在表中添加string类型的列
  694. dataGridView1.DataSource = dt;
  695. //插入按钮
  696. DataGridViewButtonColumn btn1 = new DataGridViewButtonColumn();
  697. btn1.Name = "Pause";
  698. btn1.HeaderText = "判断";
  699. //btn1.DefaultCellStyle.va = "启用";
  700. btn1.Text = "启用";
  701. btn1.UseColumnTextForButtonValue = false;
  702. btn1.DefaultCellStyle.NullValue = "启用";
  703. btn1.DefaultCellStyle.BackColor = Color.LimeGreen;
  704. dataGridView1.Columns.Add(btn1);
  705. //DataGridViewButtonColumn btn2 = new DataGridViewButtonColumn();
  706. //btn2.Name = "Print";
  707. //btn2.HeaderText = "打标";
  708. //btn2.Text = "启用";
  709. //btn2.UseColumnTextForButtonValue = false;
  710. //btn2.DefaultCellStyle.NullValue = "启用";
  711. //btn2.DefaultCellStyle.BackColor = Color.LimeGreen;
  712. //dataGridView1.Columns.Add(btn2);
  713. List<string> list = new List<string>();
  714. DataTable dts = (DataTable)dataGridView1.DataSource;
  715. dts.Clear();
  716. foreach (var item in md.QualifiedLimitList)
  717. {
  718. if (md.DefectPauseOption == null || md.DefectPauseOption.Count==0 || md.DefectPauseOption.Contains(item.Code))
  719. {
  720. //新增
  721. DataRow dr;//行
  722. dr = dts.NewRow();
  723. dr["二次判断项"] = item.NameCode;
  724. dts.Rows.Add(dr);//在表的对象的行里添加此行
  725. list.Add(item.NameCode);
  726. }
  727. }
  728. dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
  729. dataGridView1.Columns[0].DefaultCellStyle.ForeColor = Color.Black;
  730. dataGridView1.Columns[0].DefaultCellStyle.SelectionForeColor = Color.Black;
  731. if (reLabel)
  732. SysMgr.Instance.LoadDefectItemsPuase(list);
  733. }
  734. private void ReDrawDefectPoints(List<DefectInfo> DataRowlist)
  735. {
  736. try
  737. {
  738. //重新绘制
  739. chart1.Series.Clear();
  740. chart1.Series.Add("SELECT");
  741. chart1.Series["SELECT"].ChartType = SeriesChartType.Point;
  742. chart1.Series["SELECT"].MarkerSize = 25;
  743. chart1.Series["SELECT"].MarkerColor = Color.Black;
  744. chart1.Series["SELECT"].MarkerStyle = MarkerStyle.Star6;
  745. //chart1.Series["SELECT"].Enabled = false;
  746. //chart1.ChartAreas[0].AxisX.Title = "宽度(cm)";
  747. //chart1.ChartAreas[0].AxisY.Title = "长度(m)";
  748. foreach (var rowItem in DataRowlist)
  749. {
  750. //this.skinDataGridView1.Rows.Insert(0, rowItem);
  751. if (chart1.Series.FindByName((string)rowItem.Name) == null)//rowItem[3] 为name
  752. {
  753. chart1.Series.Add((string)rowItem.Name);
  754. var obj = SysMgr.Instance.GetDefectLabel((string)rowItem.Name);
  755. int labelIndex = obj.Value<int>("id");
  756. chart1.Series[(string)rowItem.Name].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point;
  757. chart1.Series[(string)rowItem.Name].MarkerSize = 5;
  758. chart1.Series[(string)rowItem.Name].MarkerColor = ChartColor[labelIndex];
  759. chart1.Series[(string)rowItem.Name].MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
  760. }
  761. chart1.Series[(string)rowItem.Name].Points.AddXY(rowItem.CentreX, rowItem.CentreY / 100);
  762. }
  763. //chart1.ChartAreas[0].AxisY.Maximum = ((int)(this.chart1.Series["划伤"].Points.FindMaxByValue().YValues.Max() / 10) + 1) * 10 + 5;
  764. chart1.ChartAreas[0].AxisY.ScaleView.Scroll(System.Windows.Forms.DataVisualization.Charting.ScrollType.Last);
  765. }
  766. catch
  767. { }
  768. }
  769. private void ShowUIEvent(RunEventArgs e)
  770. {
  771. if (InvokeRequired)
  772. {
  773. ShowUIEventDelegate smd = new ShowUIEventDelegate(ShowUIEvent);
  774. this.BeginInvoke(smd, e);
  775. }
  776. else
  777. {
  778. try
  779. {
  780. if (e.Cmd == 6) //显示主图
  781. {
  782. //this.BeginInvoke(new System.Action(() =>
  783. //{
  784. if (e.PicIndex == 1)
  785. {
  786. bmp1 = e.Pic.ToBitmap();
  787. //this.pictureBox2.Image = bmp1;
  788. //this.pictureBox2.Refresh();
  789. }
  790. else if (e.PicIndex == 2)
  791. {
  792. bmp2 = e.Pic.ToBitmap();
  793. //this.pictureBox3.Image = bmp2;
  794. //this.pictureBox3.Refresh();
  795. }
  796. else if (e.PicIndex == 0)
  797. {
  798. bmp0 = e.Pic.ToBitmap();
  799. this.pictureBox1.Image = bmp0;
  800. this.pictureBox1.Refresh();
  801. }
  802. //}));
  803. }
  804. else if (e.Cmd == 10) //测试结束
  805. {
  806. this.tsbtnStart.Enabled = true;
  807. this.tsbtnStop.Enabled = false;
  808. this.tsbtnImpStop.Enabled = false;
  809. this.cbPdtSN.Enabled = true;
  810. this.cbDefectCode.Enabled = true;
  811. }
  812. else if (e.Cmd == 11) //显示缺陷列表
  813. {
  814. //this.BeginInvoke(new System.Action(() =>
  815. //{
  816. ReDrawDefectPoints(e.DataRowlist);
  817. //显示最新缺陷
  818. //var defectInfo = SysMgr.Instance.GetDefectInfo((long)this.skinDataGridView1.Rows[0].Cells["colUid"].Value);
  819. //if (defectInfo == null)
  820. //{
  821. // return;
  822. //}
  823. //OpenCvSharp.Mat img = BitmapConverter.ToMat((Bitmap)defectInfo.image);
  824. //imageBox3.RefreshWindow(img, ImageBox.ImageModeEnum.Zoom);//可以不显示区域
  825. //this.imageBox3.Image = (defectInfo.image);
  826. //}));
  827. }
  828. else if(e.Cmd == 12) //显示处理图
  829. {
  830. //this.BeginInvoke(new System.Action(() =>
  831. //{
  832. bmp0 = (Bitmap)e.Defectimg.Clone();
  833. this.pictureBox1.Image = bmp0;
  834. this.pictureBox1.Refresh();
  835. //}));
  836. }
  837. else if (e.Cmd == 13) //显示门幅
  838. {
  839. //this.BeginInvoke(new System.Action(() =>
  840. //{
  841. List<float> ydata = new List<float>();
  842. this.lbFK.Text = "当前幅宽:" + $"{e.Points[e.Points.Count - 1][1]}";
  843. this.chart3.Series["面宽"].Points.Clear();
  844. foreach (var Item in e.Points)
  845. {
  846. ydata.Add(Item[1]);
  847. float x = Item[0] / 100; //cm -> m
  848. this.chart3.Series["面宽"].Points.AddXY((float)Math.Round(x, 2), (float)Math.Round(Item[1], 2));
  849. }
  850. chart3.ChartAreas[0].AxisY.Maximum = Math.Round(ydata.Max() + 10, 0);
  851. chart3.ChartAreas[0].AxisY.Minimum = Math.Round(ydata.Min() - 10, 0);
  852. //chart3.ChartAreas["ChartArea1"].AxisX.ScaleView.Scroll(ScrollType.Last);
  853. //}));
  854. }
  855. else if (e.Cmd == 14) //显示速度
  856. {
  857. //this.BeginInvoke(new System.Action(() =>
  858. //{
  859. lblDefectLen.Text = $"检测长度: {Math.Round(e.Len, 2)} 米";
  860. lblDefectSpeed.Text = $"检测速度: {Math.Round(e.Speed,2)} 米/分钟";
  861. //}));
  862. }
  863. else if (e.Cmd == 15) //显示处理图 new
  864. {
  865. //this.BeginInvoke(new System.Action(() =>
  866. //{
  867. bmp0 = (Bitmap)e.DefectMat.ToBitmap();
  868. this.pictureBox1.Image = bmp0;
  869. this.pictureBox1.Refresh();
  870. //}));
  871. }
  872. else if (e.Cmd == 16) //显示缓存
  873. {
  874. this.tsState.Text = $"相机1:{e.Cam1ImgCnt},相机2:{e.Cam2ImgCnt}";
  875. this.tslabelTime.Text = e._DefinfoCnt;
  876. //this.stsSaveQueue.Text = $"存图队列:{e.SaveImgCnt}";
  877. }
  878. else if (e.Cmd == 17) //显示光源亮度
  879. {
  880. //this.ucTrackBar1.Value = e.LightValue;
  881. }
  882. else if (e.Cmd == 18) //显示二次判断和打标
  883. {
  884. //this.BeginInvoke(new System.Action(() =>
  885. //{
  886. // LoadDefectLabelAndPrint(e.MD);
  887. //}));
  888. }
  889. else if (e.Cmd == 19) // 二次判定数据修改
  890. {
  891. //不能使用同步Invoke方式,会使相机超时丢帧
  892. this.BeginInvoke(new System.Action(() =>
  893. {
  894. reFreashFrm(e.ImgIndex, e.LstEditDefect, e.Records, e.LstEditInfo);
  895. #if false
  896. int liDefectCount = e.LstEditDefect.Count;
  897. if(e.LstEditInfo != null || e.LstEditDefect != null)
  898. {
  899. string oldCode;
  900. for (int i = 0; i < this.skinDataGridView1.Rows.Count; i++)
  901. {
  902. if ((int)this.skinDataGridView1.Rows[i].Cells["colIndex"].Value != e.ImgIndex)
  903. continue;
  904. long uid = (long)this.skinDataGridView1.Rows[i].Cells["colUid"].Value;
  905. foreach (var row in e.LstEditDefect)
  906. {
  907. //AddTextEvent($"二次确认", $"修改第({i + 1})行瑕疵名称,{uid} {row.uid}");
  908. if (row.uid == uid)
  909. {
  910. oldCode = this.skinDataGridView1.Rows[i].Cells["colCode"].Value.ToString();
  911. //AddTextEvent($"二次确认", $"修改第({i + 1})行瑕疵名称 ({this.skinDataGridView1.Rows[i].Cells["colDefectName"].Value})->({row.Name})");
  912. this.skinDataGridView1.Rows[i].Cells["colCode"].Value = row.Code;
  913. this.skinDataGridView1.Rows[i].Cells["colDefectName"].Value = row.Name;
  914. //this.uiDataGridView1.Refresh();
  915. if (!string.IsNullOrWhiteSpace(row.TagFilePath) && oldCode != row.Code)
  916. File.Move(row.TagFilePath, row.TagFilePath.Replace($"_类别{oldCode}", $"_类别{row.Code}"));//
  917. break;
  918. }
  919. }
  920. if (e.LstEditInfo != null)
  921. {
  922. foreach (var item in e.LstEditInfo)
  923. {
  924. if (item.uid == uid)
  925. {
  926. this.skinDataGridView1.Rows.RemoveAt(i);
  927. i--;
  928. break;
  929. }
  930. }
  931. }
  932. }
  933. //SysMgr.Instance.DelDefectEdit(e.Records, frmDefect.lstDel);
  934. //double len = (double)this.lblLen.Tag;
  935. //this.reDrawDefectPoints(curRecord.DefectInfoList, new double[] { 0, Math.Round(curRecord.FaceWidthMax + 0.005f, 2) }, new double[] { 0, len });
  936. //AddTextEvent($"二次检测", $"本次忽略{frmDefect.lstDel.Count}个瑕疵,本张图由{liDefectCount} -> {e.LstEditDefect.Count},总数{e.Records.DefectInfoList.Count}");
  937. }
  938. //this.uiMiniPagination1.TotalCount = curRecord.DefectTotalCount = curRecord.DefectInfoList.Count;
  939. //
  940. //double len = Math.Round((res.photoIndex + 1) * bmpHeight * 1.0d / Config.cm2px_y + 0.005f, 2);
  941. //重新绘制分布图
  942. ReDrawDefectPoints(e.Records.DefectInfoList);
  943. //自动继续运行设备(这里临时暂停后不能再急停,否则无法继续)
  944. SysMgr.Instance.StartMotion();
  945. #endif
  946. }));
  947. }
  948. else if (e.Cmd == 20) //显示存图缓存
  949. {
  950. //this.tsState.Text = $"相机1:{e.Cam1ImgCnt},相机2:{e.Cam2ImgCnt}";
  951. this.stsSaveQueue.Text = $"存图队列:{e.SaveImgCnt}";
  952. }
  953. else if (e.Cmd == 21) //显示二次判定界面
  954. {
  955. this.BeginInvoke(new System.Action(() =>
  956. {
  957. var pimage = (Bitmap)e.TagImg.ToBitmap().Clone();
  958. List<DefectInfo> ld = new List<DefectInfo>();
  959. foreach (var item in e.LstEditDefect)
  960. {
  961. ld.Add(item);
  962. }
  963. int index = e.ImgIndex;
  964. //Task.Run(() =>
  965. //{
  966. int liDefectCount = ld.Count;
  967. ImageShowFrm frmDefect = new ImageShowFrm(index, ld, pimage);
  968. if (frmDefect.ShowDialog() == DialogResult.OK)
  969. {
  970. SysMgr.Instance.DelDefectEdit(e.Records, frmDefect.lstDel);
  971. reFreashFrm(index, ld, e.Records, frmDefect.lstDel);
  972. AddTextEvent($"二次检测2", $"本次忽略{frmDefect.lstDel.Count}个瑕疵,本张图由{liDefectCount} -> {ld.Count},总数{e.Records.DefectInfoList.Count}");
  973. }
  974. else
  975. {
  976. AddTextEvent($"二次检测2", $"本次忽略判断");
  977. reFreashFrm(index, ld, e.Records, null);
  978. }
  979. //});
  980. }));
  981. }
  982. //Application.DoEvents();
  983. }
  984. catch (Exception ex){
  985. SysMgr.Instance.LogMeg($"显示事件,{e.Cmd}-Error:{ex.Message}");
  986. }
  987. }
  988. }
  989. #endregion
  990. #region 二次确认界面刷新
  991. void reFreashFrm(int index, List<DefectInfo> lstEditDefect, Records currRecord, List<DefectInfo> lstEditInfo)
  992. {
  993. int err = 0;
  994. try
  995. {
  996. //int liDefectCount = lstEditDefect.Count;
  997. //ImageShowFrm frmDefect = new ImageShowFrm(e.LstEditDefect, e.TagImg.ToBitmap());
  998. //frmDefect.Show();
  999. //if (frmDefect.ShowDialog() == DialogResult.OK)
  1000. if (lstEditInfo != null || lstEditDefect != null)
  1001. {
  1002. err = 1;
  1003. string oldCode;
  1004. for (int i = 0; i < this.skinDataGridView1.Rows.Count; i++)
  1005. {
  1006. if ((int)this.skinDataGridView1.Rows[i].Cells["colIndex"].Value != index)
  1007. continue;
  1008. err = 2;
  1009. long uid = (long)this.skinDataGridView1.Rows[i].Cells["colUid"].Value;
  1010. foreach (var row in lstEditDefect)
  1011. {
  1012. //AddTextEvent($"二次确认", $"修改第({i + 1})行瑕疵名称,{uid} {row.uid}");
  1013. if (row.uid == uid)
  1014. {
  1015. err = 3;
  1016. oldCode = this.skinDataGridView1.Rows[i].Cells["colCode"].Value.ToString();
  1017. //AddTextEvent($"二次确认", $"修改第({i + 1})行瑕疵名称 ({this.skinDataGridView1.Rows[i].Cells["colDefectName"].Value})->({row.Name})");
  1018. this.skinDataGridView1.Rows[i].Cells["colCode"].Value = row.Code;
  1019. this.skinDataGridView1.Rows[i].Cells["colDefectName"].Value = row.Name;
  1020. //this.uiDataGridView1.Refresh();
  1021. if (!string.IsNullOrWhiteSpace(row.TagFilePath) && oldCode != row.Code)
  1022. File.Move(row.TagFilePath, row.TagFilePath.Replace($"_类别{oldCode}", $"_类别{row.Code}"));//
  1023. break;
  1024. }
  1025. }
  1026. err = 4;
  1027. if (lstEditInfo != null)
  1028. {
  1029. foreach (var item in lstEditInfo)
  1030. {
  1031. if (item.uid == uid)
  1032. {
  1033. this.skinDataGridView1.Rows.RemoveAt(i);
  1034. i--;
  1035. break;
  1036. }
  1037. }
  1038. }
  1039. }
  1040. //SysMgr.Instance.DelDefectEdit(e.Records, frmDefect.lstDel);
  1041. //double len = (double)this.lblLen.Tag;
  1042. //this.reDrawDefectPoints(curRecord.DefectInfoList, new double[] { 0, Math.Round(curRecord.FaceWidthMax + 0.005f, 2) }, new double[] { 0, len });
  1043. //AddTextEvent($"二次检测", $"本次忽略{frmDefect.lstDel.Count}个瑕疵,本张图由{liDefectCount} -> {e.LstEditDefect.Count},总数{e.Records.DefectInfoList.Count}");
  1044. }
  1045. //this.uiMiniPagination1.TotalCount = curRecord.DefectTotalCount = curRecord.DefectInfoList.Count;
  1046. //
  1047. //double len = Math.Round((res.photoIndex + 1) * bmpHeight * 1.0d / Config.cm2px_y + 0.005f, 2);
  1048. //重新绘制分布图
  1049. err = 5;
  1050. ReDrawDefectPoints(currRecord.DefectInfoList);
  1051. err = 6;
  1052. //自动继续运行设备(这里临时暂停后不能再急停,否则无法继续)
  1053. SysMgr.Instance.StartMotion();
  1054. }catch(Exception ex)
  1055. {
  1056. MessageBox.Show($"err {err}:{ex.Message}");
  1057. }
  1058. }
  1059. #endregion
  1060. #region 后台
  1061. GetPN pn = new GetPN();
  1062. private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
  1063. {
  1064. while (backgroundWorkerDo)
  1065. {
  1066. try
  1067. {
  1068. this.Invoke(new MethodInvoker(() =>
  1069. {
  1070. this.tsslLoginTime.Text = $" 当前时间:{DateTime.Now.ToString("yyyy年MM月dd日 HH:mm:ss")}";
  1071. }));
  1072. //检测按钮和实时状态
  1073. if (SysMgr.Instance.IsInit)
  1074. {
  1075. bool sts = SysMgr.Instance.WarningShowLed(false);
  1076. if (sts)
  1077. {
  1078. this.Invoke(new MethodInvoker(() =>
  1079. {
  1080. this.tsbtnStart.Enabled = true;
  1081. this.tsbtnStop.Enabled = false;
  1082. }));
  1083. }
  1084. int stsno = 0;
  1085. stsno = SysMgr.Instance.ButtonIOTrg(false);
  1086. if (stsno == 1)
  1087. {
  1088. this.Invoke(new MethodInvoker(() =>
  1089. {
  1090. tsbtnStart_Click(null, null);
  1091. }));
  1092. }
  1093. else if (stsno == 2)
  1094. {
  1095. this.Invoke(new MethodInvoker(() =>
  1096. {
  1097. this.tsbtnStart.Enabled = true;
  1098. }));
  1099. SysMgr.Instance.LedPause();
  1100. }
  1101. else if (stsno == 3)
  1102. {
  1103. this.Invoke(new MethodInvoker(() =>
  1104. {
  1105. tsbtnReset_Click(null, null);
  1106. }));
  1107. }
  1108. }
  1109. if (pn.P(SysMgr.Instance.IsRuning))
  1110. {
  1111. //继续计时
  1112. RunStartTime.Start();
  1113. }
  1114. if (pn.N(SysMgr.Instance.IsRuning))
  1115. {
  1116. //停止计时
  1117. RunStartTime.Stop();
  1118. }
  1119. if (SysMgr.Instance.IsRuning)
  1120. {
  1121. ////实时显示
  1122. //RunStartTime.Stop();
  1123. //this.Invoke(new MethodInvoker(() =>
  1124. //{
  1125. // tslabelTime.Text = "实时测试:" + ((double)RunStartTime.ElapsedMilliseconds / 1000.0).ToString("0.000") + "s";
  1126. // //this.Refresh();
  1127. //}));
  1128. //RunStartTime.Start();
  1129. }
  1130. Thread.Sleep(100);
  1131. //Application.DoEvents();
  1132. }
  1133. catch { }
  1134. }
  1135. }
  1136. /// <summary>
  1137. /// 信号上升沿下降沿捕获
  1138. /// </summary>
  1139. class GetPN
  1140. {
  1141. bool _P = false;
  1142. bool _N = false;
  1143. /// <summary>
  1144. /// 判断上升沿
  1145. /// </summary>
  1146. /// <param name="Value"></param>
  1147. /// <returns></returns>
  1148. public bool P(bool Value)
  1149. {
  1150. if (Value && !_P)
  1151. {
  1152. _P = true;
  1153. return true;
  1154. }
  1155. if (!Value)
  1156. _P = false;
  1157. return false;
  1158. }
  1159. /// <summary>
  1160. /// 判断下降沿
  1161. /// </summary>
  1162. /// <param name="Value"></param>
  1163. /// <returns></returns>
  1164. public bool N(bool Value)
  1165. {
  1166. if (!Value && _N)
  1167. {
  1168. _N = false;
  1169. return true;
  1170. }
  1171. if (Value)
  1172. _N = true;
  1173. return false;
  1174. }
  1175. }
  1176. #endregion
  1177. #region 表格点击
  1178. private void skinDataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
  1179. {
  1180. //不再使用
  1181. //if (e.RowIndex < 0)
  1182. // return;
  1183. //var defectInfo = SysMgr.Instance.GetDefectInfo((long)this.skinDataGridView1.CurrentRow.Cells["colUid"].Value);
  1184. //if (defectInfo == null)
  1185. //{
  1186. // DialogResult dr = DialogResult.Cancel;
  1187. // dr = FrmDialog.ShowDialog(this, "此记录已不存在!", "警告", true);
  1188. // return;
  1189. //}
  1190. //OpenCvSharp.Mat img = defectInfo.image;
  1191. ////this.pictureBox4.Image = (defectInfo.image);
  1192. ////选中
  1193. //this.Invoke(new System.Action(() =>
  1194. //{
  1195. // if (chart1.Series != null && chart1.Series.FindByName("SELECT") != null)
  1196. // {
  1197. // chart1.Series["SELECT"].Points.Clear();
  1198. // chart1.Series["SELECT"].Points.AddXY(defectInfo.CentreX, defectInfo.CentreY / 100);
  1199. // chart1.Refresh();
  1200. // }
  1201. //}));
  1202. }
  1203. #endregion
  1204. #region 二次判断
  1205. private void ucSwitch1_CheckedChanged(object sender, EventArgs e)
  1206. {
  1207. SysMgr.Instance.SetDefectPause(ucSwitch1.Checked);
  1208. }
  1209. #endregion
  1210. #region 控制光源
  1211. private void ucTrackBar1_ValueChanged(object sender, EventArgs e)
  1212. {
  1213. //SysMgr.Instance.SetLightValue((int)ucTrackBar1.Value);
  1214. }
  1215. #endregion
  1216. #region 二次判断和打标表格点击
  1217. private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
  1218. {
  1219. List<string> namelist = new List<string>();
  1220. //for (int i = 0; i < this.dataGridView1.RowCount; i++)
  1221. //{
  1222. // namelist.Add(this.dataGridView1.Rows[i].Cells[0].Value.ToString());
  1223. //}
  1224. int Index = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
  1225. if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "判断")
  1226. {
  1227. DataGridViewButtonCell btn = (DataGridViewButtonCell)this.dataGridView1.CurrentCell;
  1228. if (btn.FormattedValue.ToString() == "启用")
  1229. {
  1230. this.dataGridView1.CurrentCell.Value = "禁用";
  1231. this.dataGridView1.CurrentCell.Style.BackColor = Color.Red;
  1232. }
  1233. else
  1234. {
  1235. this.dataGridView1.CurrentCell.Value = "启用";
  1236. this.dataGridView1.CurrentCell.Style.BackColor = Color.LimeGreen;
  1237. }
  1238. for (int i = 0; i < this.dataGridView1.RowCount; i++)
  1239. {
  1240. DataGridViewButtonCell btn2 = (DataGridViewButtonCell)this.dataGridView1.Rows[i].Cells[1];
  1241. if (btn2.FormattedValue.ToString() == "启用")
  1242. namelist.Add(this.dataGridView1.Rows[i].Cells[0].Value.ToString());
  1243. }
  1244. //开启该项二次判断功能
  1245. SysMgr.Instance.LoadDefectItemsPuase(namelist);
  1246. }
  1247. else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "打标")
  1248. {
  1249. //开启该项打标功能
  1250. }
  1251. }
  1252. #endregion
  1253. #region 选检测标准之后自动加载二次判断
  1254. private Service.ProductService PdtService = new Service.ProductService();
  1255. private void cbDefectCode_SelectedIndexChanged(object sender, EventArgs e)
  1256. {
  1257. Product model = SysMgr.Instance.GetProduct(cbDefectCode.Text);
  1258. if (model != null)
  1259. {
  1260. LoadDefectLabelAndPrint(model, true);
  1261. }
  1262. }
  1263. #endregion
  1264. #region 模拟键盘
  1265. private KeyBoardType keyBoardType = KeyBoardType.UCKeyBorderAll_EN;
  1266. [Description("键盘打开样式"), Category("自定义")]
  1267. public KeyBoardType KeyBoardType
  1268. {
  1269. get { return keyBoardType; }
  1270. set { keyBoardType = value; }
  1271. }
  1272. private void showKeyPanel(Control ctl)
  1273. {
  1274. //keyPanel.Top = ctl.Top + ctl.Height + 5;
  1275. //keyPanel.Left = ctl.Left;
  1276. //keyPanel.Visible = true;
  1277. //keyPanel.BringToFront();
  1278. process = Process.Start(@"C:\WINDOWS\system32\osk.exe");
  1279. }
  1280. //Froms.FrmAnchor m_frmAnchor;
  1281. private void cbPdtSN_Click(object sender, EventArgs e)
  1282. {
  1283. //showKeyPanel((Control)sender);
  1284. }
  1285. #endregion
  1286. private void skinDataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
  1287. {
  1288. }
  1289. private void tsmSysmgr_Click(object sender, EventArgs e)
  1290. {
  1291. }
  1292. private void tabControl1_Resize(object sender, EventArgs e)
  1293. {
  1294. //this.tabControl1.ItemSize = new System.Drawing.Size(this.tabControl1.Width / 2 - 10, 26);
  1295. }
  1296. private void Main_Resize(object sender, EventArgs e)
  1297. {
  1298. //this.tabControl1.ItemSize = new System.Drawing.Size(this.tabControl1.Width / 2 - 10, 26);
  1299. }
  1300. private void tbRJP_Click(object sender, EventArgs e)
  1301. {
  1302. showKeyPanel((Control)cbPdtSN);
  1303. }
  1304. }
  1305. }