using Advantech.Motion; using Newtonsoft.Json; using ProductionControl.Device; using ProductionControl.Utils; 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; using static ProductionControl.Device.ScannerDev; namespace ProductionControl.UI { public partial class UIScannerDev : UserControl { SynchronizationContext SyncContext = null; public Action GetParamsEvent; public ScannerType devType { get; set; } private List pathList = new List(); // private ScannerDevProp prop; private ScannerDev dev; public UIScannerDev() { 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 || !dev.IsInit); else this.propertyGrid1.Enabled = item.Enabled = !(dev == null || !dev.IsInit); } } public void init(ScannerType devType) { pathList.Clear(); this.tbtnSave.Visible = tssSave.Visible = (GetParamsEvent != null); prop = new ScannerDevProp(devType); this.propertyGrid1.SelectedObject = prop; dev = new ScannerDev(prop.DeviceType); dev.WarningEvent = (level, info) => { txtLog.Text = $"({level}){info}"; }; //DATA dev.ScanEventPath += new System.Action((num, path) => { //string path = Config.Scnaner_Bmp_SavePath + "\\" + DateTime.Now.Ticks + ".bmp"; //bmp.Save(path, ImageFormat.Bmp); //MemoryStream ms = new MemoryStream(); //bmp.Save(ms, ImageFormat.Bmp); //byte[] bs = ms.ToArray(); //GetBuffer(); //ms.Close(); //ms.Dispose(); pathList.Add(path); prop.ImageList=pathList.ToArray(); this.refreshUI(); if (!dev.isContinuousMode) updateViewWin(read2Bmp(path)); }); dev.ScanEvent += new System.Action((num, bmp) => { string path; if(prop.DeviceType== ScannerType.GENTL) path = Config.appBasePath + "\\temp\\" + DateTime.Now.Ticks + ".bmp"; else path = Config.appBasePath + "\\temp\\" + DateTime.Now.Ticks + ".bmp"; bmp.Save(path, ImageFormat.Bmp); //MemoryStream ms = new MemoryStream(); //bmp.Save(ms, ImageFormat.Bmp); //byte[] bs = ms.ToArray(); //GetBuffer(); //ms.Close(); //ms.Dispose(); pathList.Add(path); prop.ImageList = pathList.ToArray(); this.refreshUI(); if (!dev.isContinuousMode) updateViewWin(bmp); }); if (!dev.open()) { this.closeDev(); return; } if (!dev.start(IntPtr.Zero, Config.appBasePath + "\\temp\\")) { this.closeDev(); return; } dev.getParam(); prop.ExposureTime = dev.ExposureTime; prop.Gain = dev.Gain; prop.ResultingFrameRate = dev.ResultingFrameRate; refreshUIState(); } private void updateViewWin(Bitmap bmp) { if(frm!=null && API.IsWindow(frm.Handle)) frm.updateBmp(bmp); } private Bitmap read2Bmp(string path) { MemoryStream ms = new System.IO.MemoryStream(File.ReadAllBytes(path)); Bitmap bmp = new Bitmap(ms); ms.Close(); ms.Dispose(); return bmp; } private void refreshUI() { SyncContext.Post(m => { var result = m as string; propertyGrid1.Refresh(); //tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog"; //tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG); }, "异步操作完成结果"); } private void closeDev() { try { if (dev == null) return; dev.stop(); dev.close(); } catch (Exception ex) { refreshUIState(); //MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } protected override void OnHandleDestroyed(EventArgs e) { base.OnHandleDestroyed(e); // 在此添加需要手动释放资源的代码 this.closeDev(); } private void tbtnRun_Click(object sender, EventArgs e) { try { dev.setParam(prop.ExposureTime,prop.Gain,prop.ResultingFrameRate); dev.getParam(); prop.ExposureTime = dev.ExposureTime; prop.Gain = dev.Gain; prop.ResultingFrameRate = dev.ResultingFrameRate; } catch(Exception ex) { MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void tbtnExport_Click(object sender, EventArgs e) { string filePath = FileUtil.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 = FileUtil.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 tbtnScan_Click(object sender, EventArgs e) { prop.ImageList = new string[dev.isContinuousMode ? 2 : 1]; dev.scan(prop.ImageList.Length); } 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 tbtnMode_Click(object sender, EventArgs e) { if (!dev.isContinuousMode) { dev.setMode(true); tbtnMode.Text = "软触发"; updateViewWin(null); dev.setPreviewWin(frm.picHwnd); } else { dev.setMode(false); tbtnMode.Text = "连续"; dev.setPreviewWin(IntPtr.Zero); } } FrmScannerShow frm; private void tbtnShow_Click(object sender, EventArgs e) { if(frm!=null && !frm.IsDisposed) frm.Close(); frm = new FrmScannerShow(dev.size); frm.Show(); if(dev.isContinuousMode) dev.setPreviewWin(frm.picHwnd); } private void tbtnSave_Click(object sender, EventArgs e) { GetParamsEvent?.Invoke(prop.serialize()); } private void tsbtnOpenDev_Click(object sender, EventArgs e) { init(devType); } } }