SettingForm.cs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. using CCDCount.DLL;
  2. using CCDCount.MODEL.CameraClass;
  3. using CCDCount.MODEL.ConfigModel;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Data;
  8. using System.Drawing;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. using System.Windows.Forms;
  15. namespace CCDCount.Forms
  16. {
  17. public partial class SettingForm : Form
  18. {
  19. int Nowindex = -1;
  20. List<MainThreadClass> LoadLsMainThread = null;
  21. List<MainThreadClass> NowLoadLsMianThread = new List<MainThreadClass>();
  22. MainThreadClass LoadMainThread = null;
  23. SaveConfigModel NowLoadConfig = null;
  24. //从外部加载的信息
  25. List<SaveConfigModel> LoadConfigs = new List<SaveConfigModel>();
  26. //将要保存的信息
  27. List<SaveConfigModel> Configs = new List<SaveConfigModel>();
  28. CameraClass CameraClass = new CameraClass();
  29. public SettingForm(List<MainThreadClass> lsMainThread)
  30. {
  31. InitializeComponent();
  32. LoadLsMainThread = lsMainThread;
  33. }
  34. /// <summary>
  35. /// 保存参数
  36. /// </summary>
  37. public void SaveConfig()
  38. {
  39. if (!Directory.Exists(".\\Config\\")) Directory.CreateDirectory(".\\Config\\");
  40. {
  41. XmlStorage.SerializeToXml(Configs, ".\\Config\\CCDCountConfig.xml");
  42. }
  43. }
  44. private void SettingForm_Load(object sender, EventArgs e)
  45. {
  46. CameraConfig cameraConfig = null;
  47. ShuLiConfigClass shuLiConfig = null;
  48. for (int i = 0; i < LoadLsMainThread.Count; i++)
  49. {
  50. LoadLsMainThread[i].GetAllConfigValue(out cameraConfig, out shuLiConfig);
  51. LoadConfigs.Add(new SaveConfigModel() {
  52. CameraConfig = cameraConfig,
  53. ShuLiConfigClass = shuLiConfig
  54. });
  55. }
  56. InitIdentifyCountCobBox();
  57. InitCameraCobox();
  58. radioButton1.Checked = true;
  59. }
  60. private void InitIdentifyCountCobBox()
  61. {
  62. IdentifyCountCobBox.Items.Clear();
  63. for (int i = 1; i <= 4; i++)
  64. {
  65. IdentifyCountCobBox.Items.Add(i);
  66. }
  67. IdentifyCountCobBox.SelectedIndex = 0;
  68. }
  69. private void InitCameraCobox()
  70. {
  71. List<CameraInfoClass> CameraInfoList = new List<CameraInfoClass>();
  72. CameraClass.GetCameraList(out CameraInfoList);
  73. if (CameraInfoList.Count > 0)
  74. {
  75. CameraConbox.Items.Clear();
  76. CameraConbox.Items.Add("请选择相机");
  77. foreach (var item in CameraInfoList)
  78. {
  79. CameraConbox.Items.Add(item.DeviceName + "_" + item.DeviceSN);
  80. }
  81. CameraConbox.SelectedIndex = 0;
  82. }
  83. }
  84. private void IdentifyCountCobBox_SelectedIndexChanged(object sender, EventArgs e)
  85. {
  86. TabPanel.Controls.Clear();
  87. Configs.Clear();
  88. NowLoadLsMianThread.Clear();
  89. string ButtonText = string.Empty;
  90. for (int i = 1; i <= (int)IdentifyCountCobBox.SelectedItem; i++)
  91. {
  92. ButtonText = "数粒" + i;
  93. //创建一个按钮,加载与此相机绑定的配置
  94. if (i <= LoadConfigs.Count())
  95. {
  96. string camername = LoadConfigs[i - 1].CameraConfig.CameraName;
  97. if(camername == string.Empty) camername = "数粒" + i;
  98. ButtonText = camername;
  99. //重新的CameraNo排序
  100. LoadConfigs[i-1].CameraConfig.CamerNo = i-1;
  101. //将从外加载的配置文件复制进当前加载的配置文件
  102. Configs.Add(LoadConfigs[i-1]);
  103. }
  104. //没有与此相机绑定的配置文件,创建一个配置实例
  105. else
  106. {
  107. Configs.Add(new SaveConfigModel()
  108. {
  109. CameraConfig = new CameraConfig() { CamerNo = i - 1 },
  110. ShuLiConfigClass = new ShuLiConfigClass()
  111. });
  112. }
  113. if (i <= LoadLsMainThread.Count())
  114. {
  115. NowLoadLsMianThread.Add(LoadLsMainThread[i-1]);
  116. }
  117. else
  118. {
  119. NowLoadLsMianThread.Add(new MainThreadClass(
  120. Configs[i - 1].ShuLiConfigClass,
  121. Configs[i - 1].CameraConfig
  122. ));
  123. }
  124. Button button = new Button()
  125. {
  126. Text = ButtonText,
  127. Name = string.Format("ShuLiConfigBtn_{0}", i-1),
  128. Size = new Size(120, TabPanel.Height - 1),
  129. Location = new Point(120 * (i - 1), 0)
  130. };
  131. if(i <= Configs.Count())
  132. {
  133. button.Click += ShuLiConfigBtn_Click;
  134. }
  135. TabPanel.Controls.Add(button);
  136. }
  137. }
  138. private void ShuLiConfigBtn_Click(object sender, EventArgs e)
  139. {
  140. string buttonName = string.Empty;
  141. if (sender is Button thisbutton)
  142. {
  143. buttonName = thisbutton.Name;
  144. }
  145. if (buttonName != string.Empty)
  146. {
  147. Nowindex = Convert.ToInt32(buttonName.Split('_')[1]);
  148. }
  149. if (Nowindex < Configs.Count() && Nowindex != -1)
  150. {
  151. LoadMainThread = NowLoadLsMianThread[Nowindex];
  152. NowLoadConfig = Configs[Nowindex];
  153. LoadConfigToForm(Configs[Nowindex]);
  154. }
  155. }
  156. private void LoadConfigToForm(SaveConfigModel LoadConfig)
  157. {
  158. if(LoadMainThread != null)
  159. {
  160. //判断是否已经绑定相机
  161. if(LoadMainThread.cameraConfig.CameraSNNum!=string.Empty)
  162. {
  163. //相机选择框尝试选择绑定的相机
  164. CameraConbox.SelectedItem = LoadMainThread.cameraConfig.DeviceName + "_" + LoadMainThread.cameraConfig.CameraSNNum;
  165. }
  166. if(CameraConbox.SelectedItem.ToString()!=string.Empty&&CameraConbox.SelectedItem.ToString()!= "请选择相机")
  167. {
  168. ExposureTimeTbx.Text = NowLoadConfig.CameraConfig.ExposureTimeValue.ToString();
  169. AcquistionLineRateLabTbx.Text = NowLoadConfig.CameraConfig.AcquistionLineRateValue.ToString();
  170. ImageWidthTbx.Text = NowLoadConfig.CameraConfig.Width.ToString();
  171. ImageHeightTbx.Text = NowLoadConfig.CameraConfig.Height.ToString();
  172. CamUserNameTbx.Text = NowLoadConfig.CameraConfig.CameraName;
  173. CamOffsetXTbx.Text = NowLoadConfig.CameraConfig.OffsetX.ToString();
  174. }
  175. RegionThresholdTbx.Text = NowLoadConfig.ShuLiConfigClass.RegionThreshold.ToString();
  176. ChannelTbx.Text = NowLoadConfig.ShuLiConfigClass.Channel.ToString();
  177. NoiseFilterTbx.Text = NowLoadConfig.ShuLiConfigClass.NoiseFilter_Threshold.ToString();
  178. //切换识别模式
  179. switch(NowLoadConfig.ShuLiConfigClass.PandingCode)
  180. {
  181. case -1:
  182. radioButton1.Checked = true;
  183. break;
  184. case 0:
  185. radioButton2.Checked = true;
  186. break;
  187. case 1:
  188. radioButton3.Checked = true;
  189. break;
  190. case 2:
  191. radioButton4.Checked = true;
  192. break;
  193. }
  194. }
  195. }
  196. private void SaveAllConfig_Click(object sender, EventArgs e)
  197. {
  198. SaveConfig();
  199. }
  200. private void radioButton1_CheckedChanged(object sender, EventArgs e)
  201. {
  202. if(radioButton1.Checked)
  203. {
  204. PanDuanParaPanel.Controls.Clear();
  205. PanDuanParaPanel.Height = 10;
  206. if(NowLoadConfig == null) return;
  207. NowLoadConfig.ShuLiConfigClass.PandingCode = -1;
  208. Configs[Nowindex] = NowLoadConfig;
  209. }
  210. }
  211. private void radioButton2_CheckedChanged(object sender, EventArgs e)
  212. {
  213. if (radioButton2.Checked)
  214. {
  215. PanDuanParaPanel.Controls.Clear();
  216. PanDuanParaPanel.Height = 150;
  217. if (NowLoadConfig == null) return;
  218. Label label5 = new Label()
  219. {
  220. Text = "合格粒宽范围:",
  221. Location = new Point(10, 10),
  222. AutoSize = true
  223. };
  224. PanDuanParaPanel.Controls.Add(label5);
  225. TextBox textBox1 = new TextBox()
  226. {
  227. Location = new Point(10, 30),
  228. Name = "MIN_OBJECT_WIDTH_TBX",
  229. Width = 50,
  230. Text = NowLoadConfig.ShuLiConfigClass.MIN_OBJECT_WIDTH.ToString(),
  231. };
  232. PanDuanParaPanel.Controls.Add(textBox1);
  233. Label label2 = new Label()
  234. {
  235. Text = "-",
  236. Location = new Point(75, 35),
  237. AutoSize = true
  238. };
  239. PanDuanParaPanel.Controls.Add(label2);
  240. TextBox textBox2 = new TextBox()
  241. {
  242. Name = "MAX_OBJECT_WIDTH_TBX",
  243. Location = new Point(100, 30),
  244. Width = 50,
  245. Text = NowLoadConfig.ShuLiConfigClass.MAX_OBJECT_WIDTH.ToString(),
  246. };
  247. PanDuanParaPanel.Controls.Add(textBox2);
  248. Label label3 = new Label()
  249. {
  250. Text = "合格粒高范围:",
  251. Location = new Point(10, 60),
  252. AutoSize = true
  253. };
  254. PanDuanParaPanel.Controls.Add(label3);
  255. TextBox textBox3 = new TextBox()
  256. {
  257. Location = new Point(10, 80),
  258. Name = "MIN_OBJECT_HEIGHT_TBX",
  259. Width = 50,
  260. Text = NowLoadConfig.ShuLiConfigClass.MIN_OBJECT_HEIGHT.ToString(),
  261. };
  262. PanDuanParaPanel.Controls.Add(textBox3);
  263. Label label4 = new Label()
  264. {
  265. Text = "-",
  266. Location = new Point(75, 85),
  267. AutoSize = true
  268. };
  269. PanDuanParaPanel.Controls.Add(label4);
  270. TextBox textBox4 = new TextBox()
  271. {
  272. Location = new Point(100, 80),
  273. Name = "MAX_OBJECT_HEIGHT_TBX",
  274. Width = 50,
  275. Text = NowLoadConfig.ShuLiConfigClass.MAX_OBJECT_HEIGHT.ToString(),
  276. };
  277. PanDuanParaPanel.Controls.Add(textBox4);
  278. NowLoadConfig.ShuLiConfigClass.PandingCode = 1;
  279. Configs[Nowindex] = NowLoadConfig;
  280. }
  281. }
  282. private void radioButton3_CheckedChanged(object sender, EventArgs e)
  283. {
  284. if (radioButton3.Checked)
  285. {
  286. PanDuanParaPanel.Controls.Clear();
  287. PanDuanParaPanel.Height = 100;
  288. if (NowLoadConfig == null) return;
  289. Label label5 = new Label()
  290. {
  291. Text = "合格粒面积范围:",
  292. Location = new Point(10, 10),
  293. AutoSize = true
  294. };
  295. PanDuanParaPanel.Controls.Add(label5);
  296. TextBox textBox1 = new TextBox()
  297. {
  298. Location = new Point(100, 30),
  299. Name = "MaxArea_TBX",
  300. Width = 50,
  301. Text = NowLoadConfig.ShuLiConfigClass.MaxArea.ToString(),
  302. };
  303. PanDuanParaPanel.Controls.Add(textBox1);
  304. Label label2 = new Label()
  305. {
  306. Text = "-",
  307. Location = new Point(75, 35),
  308. AutoSize = true
  309. };
  310. PanDuanParaPanel.Controls.Add(label2);
  311. TextBox textBox2 = new TextBox()
  312. {
  313. Name = "MinArea_TBX",
  314. Location = new Point(10, 30),
  315. Width = 50,
  316. Text = NowLoadConfig.ShuLiConfigClass.MinArea.ToString(),
  317. };
  318. PanDuanParaPanel.Controls.Add(textBox2);
  319. NowLoadConfig.ShuLiConfigClass.PandingCode = 2;
  320. Configs[Nowindex] = NowLoadConfig;
  321. }
  322. }
  323. private void radioButton4_CheckedChanged(object sender, EventArgs e)
  324. {
  325. if (radioButton4.Checked)
  326. {
  327. PanDuanParaPanel.Controls.Clear();
  328. PanDuanParaPanel.Height = 160;
  329. if (NowLoadConfig == null) return;
  330. Label label5 = new Label()
  331. {
  332. Text = "合格粒宽范围:",
  333. Location = new Point(10, 10),
  334. AutoSize = true
  335. };
  336. PanDuanParaPanel.Controls.Add(label5);
  337. TextBox textBox1 = new TextBox()
  338. {
  339. Location = new Point(10, 30),
  340. Name = "MIN_OBJECT_WIDTH_TBX",
  341. Width = 50,
  342. Text = NowLoadConfig.ShuLiConfigClass.MIN_OBJECT_WIDTH.ToString(),
  343. };
  344. PanDuanParaPanel.Controls.Add(textBox1);
  345. Label label2 = new Label()
  346. {
  347. Text = "-",
  348. Location = new Point(75, 35),
  349. AutoSize = true
  350. };
  351. PanDuanParaPanel.Controls.Add(label2);
  352. TextBox textBox2 = new TextBox()
  353. {
  354. Name = "MAX_OBJECT_WIDTH_TBX",
  355. Location = new Point(100, 30),
  356. Width = 50,
  357. Text = NowLoadConfig.ShuLiConfigClass.MAX_OBJECT_WIDTH.ToString(),
  358. };
  359. PanDuanParaPanel.Controls.Add(textBox2);
  360. Label label3 = new Label()
  361. {
  362. Text = "合格粒高范围:",
  363. Location = new Point(10, 60),
  364. AutoSize = true
  365. };
  366. PanDuanParaPanel.Controls.Add(label3);
  367. TextBox textBox3 = new TextBox()
  368. {
  369. Location = new Point(10, 80),
  370. Name = "MIN_OBJECT_HEIGHT_TBX",
  371. Width = 50,
  372. Text = NowLoadConfig.ShuLiConfigClass.MIN_OBJECT_HEIGHT.ToString(),
  373. };
  374. PanDuanParaPanel.Controls.Add(textBox3);
  375. Label label4 = new Label()
  376. {
  377. Text = "-",
  378. Location = new Point(75, 85),
  379. AutoSize = true
  380. };
  381. PanDuanParaPanel.Controls.Add(label4);
  382. TextBox textBox4 = new TextBox()
  383. {
  384. Location = new Point(100, 80),
  385. Name = "MAX_OBJECT_HEIGHT_TBX",
  386. Width = 50,
  387. Text = NowLoadConfig.ShuLiConfigClass.MAX_OBJECT_HEIGHT.ToString(),
  388. };
  389. PanDuanParaPanel.Controls.Add(textBox4);
  390. Label label6 = new Label()
  391. {
  392. Text = "合格粒面积范围:",
  393. Location = new Point(10, 110),
  394. AutoSize = true
  395. };
  396. PanDuanParaPanel.Controls.Add(label6);
  397. TextBox textBox5 = new TextBox()
  398. {
  399. Location = new Point(10, 130),
  400. Name = "MinArea_TBX",
  401. Width = 50,
  402. Text = NowLoadConfig.ShuLiConfigClass.MinArea.ToString(),
  403. };
  404. PanDuanParaPanel.Controls.Add(textBox5);
  405. Label label7 = new Label()
  406. {
  407. Text = "-",
  408. Location = new Point(75, 135),
  409. AutoSize = true
  410. };
  411. PanDuanParaPanel.Controls.Add(label7);
  412. TextBox textBox6 = new TextBox()
  413. {
  414. Name = "MaxArea_TBX",
  415. Location = new Point(100, 130),
  416. Width = 50,
  417. Text = NowLoadConfig.ShuLiConfigClass.MaxArea.ToString(),
  418. };
  419. PanDuanParaPanel.Controls.Add(textBox6);
  420. NowLoadConfig.ShuLiConfigClass.PandingCode = 3;
  421. Configs[Nowindex] = NowLoadConfig;
  422. }
  423. }
  424. private void CameraConbox_SelectedIndexChanged(object sender, EventArgs e)
  425. {
  426. string ThisItemSN = CameraConbox.SelectedItem.ToString();
  427. if(LoadMainThread == null || ThisItemSN == LoadMainThread.cameraConfig.DeviceName + "_" + LoadMainThread.cameraConfig.CameraSNNum) return;
  428. if (ThisItemSN != string.Empty && ThisItemSN != "请选择相机")
  429. {
  430. try
  431. {
  432. ThisItemSN = ThisItemSN.Split('_')[1];
  433. }
  434. catch (Exception)
  435. {
  436. ThisItemSN = string.Empty;
  437. }
  438. if (ThisItemSN == string.Empty) return;
  439. if (LoadMainThread.CameraRunStatic)
  440. {
  441. var confirmResult = MessageBox.Show("检测到正在识别,切换相机需要关闭识别,是否继续切换",
  442. "切换确认", MessageBoxButtons.YesNo);
  443. if (confirmResult == DialogResult.No)
  444. {
  445. CameraConbox.SelectedItem = LoadMainThread.cameraConfig.DeviceName + "_" + LoadMainThread.cameraConfig.CameraSNNum;
  446. return;
  447. }
  448. LoadMainThread.StopMianThread();
  449. }
  450. if (LoadMainThread.ReLoadCamera(ThisItemSN))
  451. {
  452. CameraConfig CameraConfig = LoadMainThread.GetCameraConfig();
  453. if (CameraConfig != null)
  454. {
  455. ExposureTimeTbx.Text = CameraConfig.ExposureTimeValue.ToString();
  456. NowLoadConfig.CameraConfig.ExposureTimeValue = CameraConfig.ExposureTimeValue;
  457. AcquistionLineRateLabTbx.Text = CameraConfig.AcquistionLineRateValue.ToString();
  458. NowLoadConfig.CameraConfig.AcquistionLineRateValue = CameraConfig.AcquistionLineRateValue;
  459. ImageWidthTbx.Text = CameraConfig.Width.ToString();
  460. NowLoadConfig.CameraConfig.Width = CameraConfig.Width;
  461. ImageHeightTbx.Text = CameraConfig.Height.ToString();
  462. NowLoadConfig.CameraConfig.Height = CameraConfig.Height;
  463. CamUserNameTbx.Text = CameraConfig.CameraName;
  464. NowLoadConfig.CameraConfig.CameraName = CameraConfig.CameraName;
  465. CamOffsetXTbx.Text = CameraConfig.OffsetX.ToString();
  466. NowLoadConfig.CameraConfig.OffsetX = CameraConfig.OffsetX;
  467. NowLoadConfig.CameraConfig.CameraSNNum = CameraConfig.CameraSNNum;
  468. NowLoadConfig.CameraConfig.CameraName = CameraConfig.CameraName;
  469. NowLoadConfig.CameraConfig.DeviceName = CameraConfig.DeviceName;
  470. NowLoadConfig.ShuLiConfigClass.CameraSN = CameraConfig.CameraSNNum;
  471. Configs[Nowindex] = NowLoadConfig;
  472. }
  473. }
  474. else
  475. {
  476. MessageBox.Show("切换相机失败!");
  477. CameraConbox.SelectedItem = LoadMainThread.cameraConfig.DeviceName + "_" + LoadMainThread.cameraConfig.CameraSNNum;
  478. return;
  479. }
  480. }
  481. else
  482. {
  483. if (LoadMainThread.CameraRunStatic)
  484. {
  485. var confirmResult = MessageBox.Show("检测到正在识别,切换相机需要关闭识别,是否继续切换",
  486. "切换确认", MessageBoxButtons.YesNo);
  487. if (confirmResult == DialogResult.No)
  488. {
  489. CameraConbox.SelectedItem = LoadMainThread.cameraConfig.DeviceName + "_" + LoadMainThread.cameraConfig.CameraSNNum;
  490. return;
  491. }
  492. LoadMainThread.StopMianThread();
  493. }
  494. else
  495. {
  496. LoadMainThread.DisposeCamera();
  497. }
  498. ExposureTimeTbx.Text = string.Empty;
  499. NowLoadConfig.CameraConfig.ExposureTimeValue = 0;
  500. AcquistionLineRateLabTbx.Text = string.Empty;
  501. NowLoadConfig.CameraConfig.AcquistionLineRateValue = 0;
  502. ImageWidthTbx.Text = string.Empty;
  503. NowLoadConfig.CameraConfig.Width = 0;
  504. ImageHeightTbx.Text = string.Empty;
  505. NowLoadConfig.CameraConfig.Height = 0;
  506. CamUserNameTbx.Text = string.Empty;
  507. NowLoadConfig.CameraConfig.CameraName = string.Empty;
  508. CamOffsetXTbx.Text = string.Empty;
  509. NowLoadConfig.CameraConfig.OffsetX = 0;
  510. NowLoadConfig.CameraConfig.CameraSNNum = string.Empty;
  511. NowLoadConfig.CameraConfig.CameraName = string.Empty;
  512. NowLoadConfig.CameraConfig.DeviceName = string.Empty;
  513. NowLoadConfig.ShuLiConfigClass.CameraSN = string.Empty;
  514. Configs[Nowindex] = NowLoadConfig;
  515. }
  516. }
  517. }
  518. }