版博士V2.0程序
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 

490 行
20 KiB

  1. using CCWin.Win32;
  2. using CCWin.Win32.Const;
  3. using ImageToolKits;
  4. using MaiMuAOI.SysCtrl;
  5. using MaiMuAOI.SysUI;
  6. using Models;
  7. using OpenCvSharp;
  8. using OpenCvSharp.Flann;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.ComponentModel;
  12. using System.Data;
  13. using System.Drawing;
  14. using System.IO;
  15. using System.Linq;
  16. using System.Reflection;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. using System.Windows.Forms;
  20. using static ImageToolKits.ImageBox;
  21. using static System.Windows.Forms.VisualStyles.VisualStyleElement.Header;
  22. namespace ProductionControl.UI
  23. {
  24. public partial class FrmGetPosByPic : Form
  25. {
  26. List<ImageBox.BaseDrawParam> pickARoi = new List<ImageBox.BaseDrawParam>();
  27. Mat Img;
  28. string _Path;
  29. double[] _Points;
  30. Service.ProductService service = new Service.ProductService();
  31. Models.Product model = new Models.Product();
  32. List<TestDefectPoints> DefectPoints = new List<TestDefectPoints>();
  33. //测试项名称
  34. List<string> ItemName = new List<string>();
  35. public FrmGetPosByPic(Models.Product m, string map, double[] pointlist)
  36. {
  37. _Path = map;
  38. _Points = pointlist;
  39. pickARoi.Clear();
  40. InitializeComponent();
  41. UIStyle.SetUIStyle(this);
  42. this.uiTitel1.FatherForm = this;
  43. //lbPoslist.Items.Clear();
  44. //this.imageBox1.SetLowLevelMode(14);
  45. this.imageBox1.SetPointsLevelMode();
  46. imageBox1.DrawOverAllEventHandler += imgBox_DrawOverAllEventHandler;
  47. //显示行号与列宽度自动调整
  48. dgvPointTable.DefaultCellStyle.ForeColor = Color.Black;
  49. dgvPointTable.RowHeadersVisible = true;
  50. dgvPointTable.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
  51. dgvPointTable.RowPostPaint += (sender, e) =>
  52. {
  53. SysMgr.showRowNum_onDataGrid_RowPostPaint(this.dgvPointTable, sender, e);
  54. };
  55. model = m;
  56. if((model != null )&&(model.TestDefectPointsList != null))
  57. {
  58. DefectPoints = model.TestDefectPointsList;
  59. }
  60. else if((model != null) && (model.TestDefectPointsList == null))
  61. {
  62. model.TestDefectPointsList = new List<TestDefectPoints>();
  63. }
  64. cbPointName.SelectedIndex = 0;
  65. //加载
  66. cbPointName.Items.Clear();
  67. //反射 循环 获取数据
  68. //Type t = typeof(PointTestType);
  69. //FieldInfo[] fieldInfos = t.GetFields();
  70. //foreach (var item in fieldInfos)
  71. //{
  72. // //不是枚举字段不处理
  73. // if (item.FieldType.IsEnum)
  74. // {
  75. // //名称可以直接获取
  76. // ItemName.Add(item.Name);
  77. // cbPointName.Items.Add(item.Name);
  78. // }
  79. //}
  80. foreach (var item in ConfMgr.Instance.SizeItemParamsList)
  81. {
  82. ItemName.Add(item.Name);
  83. cbPointName.Items.Add(item.Name);
  84. }
  85. //cbPointName.Items.AddRange(fieldInfos);
  86. }
  87. public string GetMapPath()
  88. { return _Path; }
  89. public double[] GetPoints()
  90. {
  91. return _Points;
  92. }
  93. void imgBox_DrawOverAllEventHandler(object sender, List<ImageBox.BaseDrawParam> e)
  94. {
  95. if (e.Count > 0)
  96. {
  97. imageBox1.RefreshWindow(imageBox1.Image, e, ImageBox.ImageModeEnum.Part);
  98. }
  99. }
  100. private void FrmGetPosByPic_Load(object sender, EventArgs e)
  101. {
  102. imageBox1.Select();
  103. if (File.Exists(_Path))
  104. {
  105. Img = new Mat(_Path);
  106. imageBox1.RefreshWindow(Img);
  107. InitViewPoints();
  108. ShowPointCount();
  109. }
  110. else
  111. {
  112. string maop_path = ConfMgr.SelectFile();
  113. if (File.Exists(maop_path))
  114. {
  115. _Path = maop_path;
  116. Img = new Mat(maop_path);
  117. this.imageBox1.RefreshWindow(Img);
  118. }
  119. else
  120. {
  121. MessageBox.Show("无图纸图片加载!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
  122. return;
  123. }
  124. }
  125. //imageBox1.Refresh();
  126. //imageBox1.DisplayROIs(roi);
  127. //this.Refresh();
  128. }
  129. void InitViewPoints()
  130. {
  131. List<ImageBox.ColorDrawParam> lROI = new List<ImageBox.ColorDrawParam>();
  132. //按点位类型
  133. var tempStuList = model.TestDefectPointsList.GroupBy(q => q.PointCode);
  134. foreach ( var tempPoint in tempStuList )
  135. {
  136. //一个点位类型所有点位数据
  137. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == tempPoint.Key).ToList();
  138. for (int i = 0; i < t.Count; i++)
  139. {
  140. ColorDrawParam param = new ColorDrawParam();
  141. param.baseDraw = new ImageBox.Point((float)t[i].Y, (float)t[i].X);
  142. int index = 0;
  143. for (int j = 0; j < this.cbPointName.Items.Count; j++)
  144. {
  145. if (this.cbPointName.Items[j].ToString() == tempPoint.Key)
  146. {
  147. index = j;
  148. break;
  149. }
  150. }
  151. param.color = Color.FromArgb(ConfMgr.Instance.SizeItemParamsList[index].RGBcolor[0],
  152. ConfMgr.Instance.SizeItemParamsList[index].RGBcolor[1],
  153. ConfMgr.Instance.SizeItemParamsList[index].RGBcolor[2]);
  154. lROI.Add(param);
  155. }
  156. }
  157. imageBox1.RefreshWindow(imageBox1.Image, lROI);
  158. }
  159. void ShowPointCount()
  160. {
  161. //按点位类型
  162. var tempStuList = model.TestDefectPointsList.GroupBy(q => q.PointCode);
  163. int[] count = new int[ItemName.Count];
  164. foreach (var tempPoint in tempStuList)
  165. {
  166. //一个点位类型所有点位数据
  167. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == tempPoint.Key).ToList();
  168. for (int j = 0; j < this.cbPointName.Items.Count; j++)
  169. {
  170. if (this.cbPointName.Items[j].ToString() == tempPoint.Key)
  171. {
  172. count[j] = t.Count;
  173. break;
  174. }
  175. }
  176. }
  177. //stLabel.Text = $"Y轴方向PT值检测({count[0]}),线宽正面({count[1]}),反面检测({count[2]}),X轴方向PT值检测({count[3]})," +
  178. // $"主栅连接线检测(主栅间隔)({count[4]}),主栅宽度检测({count[5]}),主栅间距({count[6]}),细栅间距检测({count[7]}),\r\n背极宽度({count[8]}),"+
  179. // $"主栅长度检测({count[9]}),Mark点横向间距({count[10]}),Mark点竖向间距({count[11]}),鱼叉口长({count[12]}),鱼叉口宽({count[13]}),鱼叉口间距({count[14]})" +
  180. // $",蜈蚣角长({count[15]}),蜈蚣角宽({count[16]})";
  181. string showPointNum = "";
  182. for (int i = 0; i < ItemName.Count; i++)
  183. {
  184. showPointNum += $"{ItemName[i]}({count[i]}),";
  185. if ((i+1) % 8 == 0)
  186. showPointNum += "\r\n";
  187. }
  188. stLabel.Text = showPointNum.Remove(showPointNum.Length - 1);
  189. }
  190. #region 工具栏
  191. private void tsbtnClear_Click(object sender, EventArgs e)
  192. {
  193. if (MessageBox.Show("是否清空所有点位?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
  194. {
  195. pickARoi.Clear();
  196. DefectPoints.Clear();
  197. this.imageBox1.ClearColorPoints();
  198. this.imageBox1.RefreshWindow(Img);
  199. ShowPointCount();
  200. ShowPoints();
  201. ReflashTable();
  202. this.Refresh();
  203. }
  204. }
  205. private void tsbtnShowAll_Click(object sender, EventArgs e)
  206. {
  207. InitViewPoints();
  208. ShowPointCount();
  209. }
  210. private void tsbtnClose_Click(object sender, EventArgs e)
  211. {
  212. this.Close();
  213. }
  214. private void tsbtnSave_Click(object sender, EventArgs e)
  215. {
  216. //pickARoi = this.imageBox1.GetLowPoints();
  217. //if (pickARoi.Count == 14)
  218. //{
  219. // _Points = new double[14 * 2];
  220. // for (int i = 0; i < 14; i++)
  221. // {
  222. // _Points[2 * i] = Math.Round((pickARoi[i] as ImageBox.Point).Column, 3);
  223. // _Points[2 * i + 1] = Math.Round((pickARoi[i] as ImageBox.Point).Row, 3);
  224. // }
  225. // this.DialogResult = DialogResult.OK;
  226. //}
  227. //else if (pickARoi.Count >0)
  228. // MessageBox.Show("点位设置错误,点数不对!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
  229. //else
  230. //{
  231. // _Points = new double[14 * 2];
  232. // for (int i = 0; i < 14; i++)
  233. // {
  234. // _Points[2 * i] = 0;
  235. // _Points[2 * i + 1] = 0;
  236. // }
  237. //}
  238. try
  239. {
  240. //老点位使用
  241. bool result;
  242. if (model.Id == 0)
  243. {
  244. model.TestDefectPointsList = DefectPoints;
  245. result = service.InsertNav(model);
  246. }
  247. else
  248. {
  249. model.TestDefectPointsList = DefectPoints;
  250. result = service.UpdateNav(model);
  251. }
  252. if (!result)
  253. throw new Exception("保存失败!");
  254. MessageBox.Show("保存成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  255. this.DialogResult = DialogResult.OK;
  256. }
  257. catch (Exception ex)
  258. {
  259. MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  260. }
  261. }
  262. #endregion
  263. #region 工具按钮
  264. private void btnAdd_Click(object sender, EventArgs e)
  265. {
  266. try
  267. {
  268. //List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == this.cbPointName.Text).ToList();
  269. //DefectPoints.Add(point);
  270. DefectPoints.Add(
  271. new Models.TestDefectPoints()
  272. {
  273. PointCode = this.cbPointName.Text,
  274. X = Math.Round((imageBox1.GetPoints()[0] as ImageBox.Point).Column, 3),
  275. Y = Math.Round((imageBox1.GetPoints()[0] as ImageBox.Point).Row,3),
  276. ModifyUserCode = SysMgr.Instance.UserMgr.LoginUser.Code,
  277. CreateUserCode = SysMgr.Instance.UserMgr.LoginUser.Code
  278. });
  279. ShowPoints();
  280. ReflashTable();
  281. ShowPointCount();
  282. }
  283. catch (Exception ex)
  284. {
  285. MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  286. }
  287. }
  288. private void ShowPoints()
  289. {
  290. List<ImageBox.ColorDrawParam> lROI = new List<ImageBox.ColorDrawParam>();
  291. //按点位类型
  292. //一个点位类型所有点位数据
  293. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == this.cbPointName.Text).ToList();
  294. for (int i = 0; i < t.Count; i++)
  295. {
  296. ColorDrawParam param = new ColorDrawParam();
  297. param.baseDraw = new ImageBox.Point((float)t[i].Y, (float)t[i].X);
  298. param.color = Color.FromArgb(ConfMgr.Instance.SizeItemParamsList[cbPointName.SelectedIndex].RGBcolor[0],
  299. ConfMgr.Instance.SizeItemParamsList[cbPointName.SelectedIndex].RGBcolor[1],
  300. ConfMgr.Instance.SizeItemParamsList[cbPointName.SelectedIndex].RGBcolor[2]);
  301. lROI.Add(param);
  302. }
  303. if(imageBox1.Image == null)
  304. imageBox1.RefreshWindow(imageBox1.Image, lROI);
  305. else
  306. imageBox1.RefreshWindow(imageBox1.Image, lROI, ImageModeEnum.Part);
  307. }
  308. private void cbPointName_SelectedIndexChanged(object sender, EventArgs e)
  309. {
  310. ShowPoints();
  311. ReflashTable();
  312. }
  313. private void ReflashTable()
  314. {
  315. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == this.cbPointName.Text).ToList();
  316. dgvPointTable.Rows.Clear();
  317. for (int i = 0; i < t.Count; i++)
  318. {
  319. ColorDrawParam param = new ColorDrawParam();
  320. param.baseDraw = new ImageBox.Point((float)t[i].Y, (float)t[i].X);
  321. param.color = Color.FromArgb(ConfMgr.Instance.SizeItemParamsList[cbPointName.SelectedIndex].RGBcolor[0],
  322. ConfMgr.Instance.SizeItemParamsList[cbPointName.SelectedIndex].RGBcolor[1],
  323. ConfMgr.Instance.SizeItemParamsList[cbPointName.SelectedIndex].RGBcolor[2]);
  324. int index = dgvPointTable.Rows.Add();
  325. dgvPointTable.Rows[index].Cells[0].Value = t[i].PointCode;
  326. dgvPointTable.Rows[index].Cells[1].Value = t[i].X;
  327. dgvPointTable.Rows[index].Cells[2].Value = t[i].Y;
  328. }
  329. }
  330. private void btnInsert_Click(object sender, EventArgs e)
  331. {
  332. try {
  333. if (this.dgvPointTable.SelectedRows.Count != 1)
  334. throw new Exception("请选择要插入的位置!");
  335. int liInsertIndex = this.dgvPointTable.Rows.Count;
  336. if (this.dgvPointTable.SelectedRows.Count > 0)
  337. liInsertIndex = this.dgvPointTable.SelectedRows[0].Index;
  338. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == this.cbPointName.Text).ToList();
  339. int findIndex = DefectPoints.FindIndex(temp => (temp.X == t[liInsertIndex].X && temp.Y == t[liInsertIndex].Y) );
  340. //DefectPoints.Add(point);
  341. DefectPoints.Insert(findIndex,
  342. new Models.TestDefectPoints()
  343. {
  344. PointCode = this.cbPointName.Text,
  345. X = Math.Round((imageBox1.GetPoints()[0] as ImageBox.Point).Column, 3),
  346. Y = Math.Round((imageBox1.GetPoints()[0] as ImageBox.Point).Row, 3),
  347. ModifyUserCode = SysMgr.Instance.UserMgr.LoginUser.Code,
  348. CreateUserCode = SysMgr.Instance.UserMgr.LoginUser.Code
  349. });
  350. ShowPoints();
  351. ReflashTable();
  352. ShowPointCount();
  353. }
  354. catch (Exception ex)
  355. {
  356. MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  357. }
  358. }
  359. private void btnDel_Click(object sender, EventArgs e)
  360. {
  361. try
  362. {
  363. if (this.dgvPointTable.SelectedRows.Count != 1)
  364. throw new Exception("请选择要删除的位置!");
  365. int liRowIndex = this.dgvPointTable.SelectedRows[0].Index;
  366. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == this.cbPointName.Text).ToList();
  367. int findIndex = DefectPoints.FindIndex(temp => (temp.X == t[liRowIndex].X && temp.Y == t[liRowIndex].Y));
  368. DefectPoints.RemoveAt(findIndex);
  369. ReflashTable();
  370. if (liRowIndex >= dgvPointTable.Rows.Count - 1)
  371. liRowIndex = dgvPointTable.Rows.Count - 1;
  372. dgvPointTable.CurrentCell = dgvPointTable.Rows[liRowIndex].Cells[1];
  373. if (dgvPointTable.Rows.Count < 1)
  374. return;
  375. if (liRowIndex >= dgvPointTable.Rows.Count)
  376. liRowIndex = dgvPointTable.Rows.Count - 1;
  377. dgvPointTable.CurrentCell = dgvPointTable.Rows[liRowIndex].Cells[1];
  378. ShowPoints();
  379. ShowPointCount();
  380. }
  381. catch (Exception ex)
  382. {
  383. MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  384. }
  385. }
  386. private void btnUp_Click(object sender, EventArgs e)
  387. {
  388. try
  389. {
  390. if (this.dgvPointTable.SelectedRows.Count != 1)
  391. throw new Exception("请选择要调整顺序的位置!");
  392. int liSelIndex = this.dgvPointTable.SelectedRows[0].Index;
  393. if (liSelIndex == 0)
  394. return;
  395. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == this.cbPointName.Text).ToList();
  396. int findIndex = DefectPoints.FindIndex(temp => (temp.X == t[liSelIndex].X && temp.Y == t[liSelIndex].Y));
  397. int findIndexPre = DefectPoints.FindIndex(temp => (temp.X == t[liSelIndex - 1].X && temp.Y == t[liSelIndex - 1].Y));
  398. DefectPoints.Insert(findIndexPre, DefectPoints[findIndex]);
  399. DefectPoints.RemoveAt(findIndex + 1);
  400. ReflashTable();
  401. this.dgvPointTable.Rows[liSelIndex - 1].Selected = true;
  402. dgvPointTable.CurrentCell = dgvPointTable.Rows[liSelIndex - 1].Cells[1];
  403. ShowPoints();
  404. }
  405. catch (Exception ex)
  406. {
  407. MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  408. }
  409. }
  410. private void btnDown_Click(object sender, EventArgs e)
  411. {
  412. try
  413. {
  414. if (this.dgvPointTable.SelectedRows.Count != 1)
  415. throw new Exception("请选择要调整顺序的位置!");
  416. int liSelIndex = this.dgvPointTable.SelectedRows[0].Index;
  417. if (liSelIndex == this.dgvPointTable.Rows.Count - 1)
  418. return;
  419. List<TestDefectPoints> t = model.TestDefectPointsList.Where(q => q.PointCode == this.cbPointName.Text).ToList();
  420. int findIndex = DefectPoints.FindIndex(temp => (temp.X == t[liSelIndex].X && temp.Y == t[liSelIndex].Y));
  421. int findIndexAft = DefectPoints.FindIndex(temp => (temp.X == t[liSelIndex + 1].X && temp.Y == t[liSelIndex + 1].Y));
  422. DefectPoints.Insert(findIndexAft + 1, DefectPoints[findIndex]);
  423. DefectPoints.RemoveAt(findIndex);
  424. ReflashTable();
  425. this.dgvPointTable.Rows[liSelIndex + 1].Selected = true;
  426. dgvPointTable.CurrentCell = dgvPointTable.Rows[liSelIndex + 1].Cells[1];
  427. ShowPoints();
  428. }
  429. catch (Exception ex)
  430. {
  431. MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  432. }
  433. }
  434. #endregion
  435. }
  436. }