using MaiMuAOI.SysCtrl; using MaiMuAOI.SysUI.DefectPicShow; using MaiMuAOI.SysUI.SysSet; using MaiMuControl.Device; using MaiMuControl.Device.CamDev; using Newtonsoft.Json; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web.UI.WebControls; using System.Windows.Forms; using System.Xml.Linq; namespace ProductionControl.UI { public partial class UIScannerDev : UserControl { SynchronizationContext SyncContext = null; public Action GetParamsEvent; private List pathList = new List(); // private ScannerDevProp prop; private CamDev _dev; public UIScannerDev(CamDev dev) { _dev = dev; InitializeComponent(); propertyGrid1.PropertyValueChanged += propertyGrid1_PropertyValueChanged; refreshUIState(); //获取UI线程同步上下文 SyncContext = SynchronizationContext.Current; //init(); } public string getParamsData() { return prop.serialize(); } public void setParamsData(string json) { if (json == "") return; prop.deserialize(json); this.propertyGrid1.Refresh(); } private void refreshUIState() { foreach (ToolStripItem item in this.toolStrip1.Items) { if (item.Text == "打开设备") item.Visible = (_dev == null ); else this.propertyGrid1.Enabled = item.Enabled = !(_dev == null); } } public void init(ScannerType scannerType = ScannerType.GENTL) { pathList.Clear(); this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null); prop = new ScannerDevProp(scannerType); this.propertyGrid1.SelectedObject = prop; //dev.getParam(); //prop.ExposureTime = dev.ExposureTime; //prop.Gain = dev.Gain; //prop.ResultingFrameRate = dev.ResultingFrameRate; refreshUIState(); } protected override void OnHandleDestroyed(EventArgs e) { base.OnHandleDestroyed(e); // 在此添加需要手动释放资源的代码 if(frm != null) frm.Close(); } private void tbtnExport_Click(object sender, EventArgs e) { string filePath = ConfMgr.SaveAsFile($"Scanner_config.json", "JSON|*.json"); if (filePath != "") { string jsonText = prop.serialize(); File.WriteAllText(filePath, jsonText); MessageBox.Show("保存成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void tbtnImport_Click(object sender, EventArgs e) { string filePath = ConfMgr.SelectFile("JSON|*.json"); if (filePath != "") { string jsonText = File.ReadAllText(filePath); prop.deserialize(jsonText); this.propertyGrid1.Refresh(); //this.propertyGrid1.SelectedObject= prop; //MessageBox.Show("加载成功!", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information); } } private void propertyGrid1_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { //其中包含了两个重要的属性:OldValue和ChangeItem。 //ChangeItem是“PropertyDescriptorGridEntry”类型。一般可以通过ChangeItem.PropertyDescriptor.ComponentType查找到属性的实际类型。 //而通过ChangeItem的Label,则可以查看到当前在属性编辑输入框中显示的值。 string className = e.ChangedItem.PropertyDescriptor.ComponentType.Name; string propertyName = e.ChangedItem.PropertyDescriptor.Name; var oldValue = e.OldValue; var newValue = e.ChangedItem.Value; //switch (propertyName) //{ //case "ChannelIndex": // if((int)newValue <1 || (int)newValue >4) // { // prop.ChannelIndex = (int)oldValue; // this.refreshUI(); // } // else // { // dev.getDigitalValue((int)newValue); // } // break; //} } private void tbtnSave_Click(object sender, EventArgs e) { GetParamsEvent?.Invoke(prop.serialize()); } DebugTestFrm frm; private void tsbDebug_Click(object sender, EventArgs e) { if ((frm == null) || (frm.IsDisposed)) frm = new DebugTestFrm(); frm.TopMost = true; frm.Show(); } private void tbtnRun_Click(object sender, EventArgs e) { try { _dev.SetExposure(prop.ExposureTime); _dev.SetGain(prop.Gain); _dev.SetResultingFrameRate(prop.ResultingFrameRate); Acquisition acq = _dev.Snap(1, 5000); if (acq.GrabStatus != "GrabPass") { txtLog.Text = $"相机采集照片失败!"; return; } txtLog.Text = $"相机采集照片完成。"; //显示 Mat img = CamDev.HImageToMat(acq.Image.CopyObj(1, -1)); Bitmap bp; bp = CamDev.HImageToBitmap(acq.Image.CopyObj(1, -1)); CamImageFrm frm = new CamImageFrm(img, bp); frm.ShowDialog(); } catch(Exception ex) { txtLog.Text = $"拍照错误:"+ ex.Message; } } } }