版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

185 строки
6.3 KiB

  1. using MaiMuAOI.SysCtrl;
  2. using MaiMuAOI.SysUI.DefectPicShow;
  3. using MaiMuAOI.SysUI.SysSet;
  4. using MaiMuControl.Device;
  5. using MaiMuControl.Device.CamDev;
  6. using Newtonsoft.Json;
  7. using OpenCvSharp;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel;
  11. using System.Data;
  12. using System.Drawing;
  13. using System.Drawing.Imaging;
  14. using System.IO;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading;
  18. using System.Threading.Tasks;
  19. using System.Web.UI.WebControls;
  20. using System.Windows.Forms;
  21. using System.Xml.Linq;
  22. namespace ProductionControl.UI
  23. {
  24. public partial class UIScannerDev : UserControl
  25. {
  26. SynchronizationContext SyncContext = null;
  27. public Action<string> GetParamsEvent;
  28. private List<string> pathList = new List<string>();
  29. //
  30. private ScannerDevProp prop;
  31. private CamDev _dev;
  32. public UIScannerDev(CamDev dev)
  33. {
  34. _dev = dev;
  35. InitializeComponent();
  36. propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged;
  37. refreshUIState();
  38. //获取UI线程同步上下文
  39. SyncContext = SynchronizationContext.Current;
  40. //init();
  41. }
  42. public string getParamsData()
  43. {
  44. return prop.serialize();
  45. }
  46. public void setParamsData(string json)
  47. {
  48. if (json == "") return;
  49. prop.deserialize(json);
  50. this.propertyGrid1.Refresh();
  51. }
  52. private void refreshUIState()
  53. {
  54. foreach (ToolStripItem item in this.toolStrip1.Items)
  55. {
  56. if (item.Text == "打开设备")
  57. item.Visible = (_dev == null );
  58. else
  59. this.propertyGrid1.Enabled = item.Enabled = !(_dev == null);
  60. }
  61. }
  62. public void init(ScannerType scannerType = ScannerType.GENTL)
  63. {
  64. pathList.Clear();
  65. this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null);
  66. prop = new ScannerDevProp(scannerType);
  67. this.propertyGrid1.SelectedObject = prop;
  68. //dev.getParam();
  69. //prop.ExposureTime = dev.ExposureTime;
  70. //prop.Gain = dev.Gain;
  71. //prop.ResultingFrameRate = dev.ResultingFrameRate;
  72. refreshUIState();
  73. }
  74. protected override void OnHandleDestroyed(EventArgs e)
  75. {
  76. base.OnHandleDestroyed(e);
  77. // 在此添加需要手动释放资源的代码
  78. if(frm != null)
  79. frm.Close();
  80. }
  81. private void tbtnExport_Click(object sender, EventArgs e)
  82. {
  83. string filePath = ConfMgr.SaveAsFile($"Scanner_config.json", "JSON|*.json");
  84. if (filePath != "")
  85. {
  86. string jsonText = prop.serialize();
  87. File.WriteAllText(filePath, jsonText);
  88. MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
  89. }
  90. }
  91. private void tbtnImport_Click(object sender, EventArgs e)
  92. {
  93. string filePath = ConfMgr.SelectFile("JSON|*.json");
  94. if (filePath != "")
  95. {
  96. string jsonText = File.ReadAllText(filePath);
  97. prop.deserialize(jsonText);
  98. this.propertyGrid1.Refresh();
  99. //this.propertyGrid1.SelectedObject= prop;
  100. //MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
  101. }
  102. }
  103. private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e)
  104. {
  105. //其中包含了两个重要的属性:OldValue和ChangeItem。
  106. //ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。
  107. //而通过ChangeItem的Label,则可以查看到当前在属性编辑输入框中显示的值。
  108. string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name;
  109. string propertyName = e.ChangedItem.PropertyDescriptor.Name;
  110. var oldValue = e.OldValue;
  111. var newValue = e.ChangedItem.Value;
  112. //switch (propertyName)
  113. //{
  114. //case "ChannelIndex":
  115. // if((int)newValue <1 || (int)newValue >4)
  116. // {
  117. // prop.ChannelIndex = (int)oldValue;
  118. // this.refreshUI();
  119. // }
  120. // else
  121. // {
  122. // dev.getDigitalValue((int)newValue);
  123. // }
  124. // break;
  125. //}
  126. }
  127. private void tbtnSave_Click(object sender, EventArgs e)
  128. {
  129. GetParamsEvent?.Invoke(prop.serialize());
  130. }
  131. DebugTestFrm frm;
  132. private void tsbDebug_Click(object sender, EventArgs e)
  133. {
  134. if ((frm == null) || (frm.IsDisposed))
  135. frm = new DebugTestFrm();
  136. frm.TopMost = true;
  137. frm.Show();
  138. }
  139. private void tbtnRun_Click(object sender, EventArgs e)
  140. {
  141. try
  142. {
  143. _dev.SetExposure(prop.ExposureTime);
  144. _dev.SetGain(prop.Gain);
  145. _dev.SetResultingFrameRate(prop.ResultingFrameRate);
  146. Acquisition acq = _dev.Snap(1, 5000);
  147. if (acq.GrabStatus != "GrabPass")
  148. {
  149. txtLog.Text = $"相机采集照片失败!";
  150. return;
  151. }
  152. txtLog.Text = $"相机采集照片完成。";
  153. //显示
  154. Mat img = CamDev.HImageToMat(acq.Image.CopyObj(1, -1));
  155. Bitmap bp;
  156. bp = CamDev.HImageToBitmap(acq.Image.CopyObj(1, -1));
  157. CamImageFrm frm = new CamImageFrm(img, bp);
  158. frm.ShowDialog();
  159. }
  160. catch(Exception ex)
  161. {
  162. txtLog.Text = $"拍照错误:"+ ex.Message;
  163. }
  164. }
  165. }
  166. }