using OpenCvSharp; using OS.Spin.BusinessLayer.MainBusiness; using OS.Spin.BusinessLayer.SubBusiness; using OS.Spin.Common; using OS.Spin.Modle.BusinessLayer; using OS.Spin.ViewModle.Flaw; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Runtime.InteropServices; using System.Threading; using static OS.Spin.BusinessLayer.MainBusiness.FlawDetectionBl; namespace OS.Spin.Commands { public class Controller { private static Controller _cer = null; private static object _objLock = new object(); public delegate void AddNewFlawShot(MFlawInfo flaw); public delegate void FlawViewShowDialog(ref MGoodFlaws flaws); public FlawViewShowDialog FlawViewShowDialogEvent; public delegate void WindowsControl(int cmd); public WindowsControl WindowsControlEvent; public AddNewFlawShot DoAddFlawShot; public RunningEvent Running; private int _flawCount = 0; [DllImport("user32.dll")] public static extern int MessageBoxTimeoutA(IntPtr hWnd, string msg, string Caps, int type, int Id, int time); private int _tScore = 0; private List _cacheGreyGloths = new List(); private List _cacheGoods = new List(); public int Scores { get { return _tScore; } } public int FlawCount { get { return _flawCount; } } //public Dictionary> public delegate void ViewZeroing(); public ViewZeroing DoViewZeroing; private const int CAMERA_COUNT = 3; private List _flaws = new List(); private ObservableCollection _viewFlaws = new ObservableCollection(); public List Flaws { get { return _flaws; } } private FlawDetectionBl _flawBl; public static Controller GetInstance() { lock (_objLock) { return _cer ?? (_cer = new Controller()); } } /// /// 改变布匹种类 /// /// public void ChangedClokdKind(int kind) { _flawBl.UploadClothsKind(kind); } public void DoTrigger(int type, double meter) { _flawBl.TimerRecived(type, meter); } /// /// 瑕疵误报 /// public void MisReport() { if (ImageSavingBl.Getinstance().lstManMade == null || ImageSavingBl.Getinstance().lstManMade.Count == 0) { MessageBoxTimeoutA((IntPtr)0, "未检测到瑕疵!", "瑕疵忽略", 0, 0, 1500); } else { Thread _th = new Thread(new ParameterizedThreadStart(ImageCopy)); _th.Start(ImageSavingBl.Getinstance().lstManMade); } } /// /// 将要忽略的瑕疵图片复制到新目录并删除原文件 /// /// private void ImageCopy(object lst) { try { foreach (string imgPath in (lst as List)) { string newPath = imgPath.Replace(@"Flaws\AutoMade", "MissReport"); if (!Directory.Exists(Path.GetDirectoryName(newPath))) { Directory.CreateDirectory(Path.GetDirectoryName(newPath)); } if (File.Exists(imgPath)) { File.Copy(imgPath, newPath, true); } File.Delete(imgPath);//删除旧图 } MessageBoxTimeoutA((IntPtr)0, "当前瑕疵已忽略!", "瑕疵忽略", 0, 0, 1500); } catch (Exception ex) { LogisTrac.WriteLog(string.Format("MisReport:{0}", ex.Message)); } } /// /// 单次拍照 /// public void SnapShoting() { try { while (!_flawBl.CanTrigger) { System.Threading.Thread.Sleep(5); } //var last = OS.Spin.Running.Cache.GetInstance().AutoFlaw; //OS.Spin.Running.Cache.GetInstance().AutoFlaw = false; var meter = OS.Spin.Running.Cache.GetInstance().CMeter; _flawBl.CameraTrigger(meter); while (!_flawBl.CanTrigger) { System.Threading.Thread.Sleep(5); } System.Threading.Thread.Sleep(200); ImageSavingBl.Getinstance().PutCopy(new MFileCopy(2, OS.Spin.Running.Cache.GetInstance().CacheImgId, CAMERA_COUNT)); //OS.Spin.Running.Cache.GetInstance().AutoFlaw = last; MessageBoxTimeoutA((IntPtr)0, "瑕疵拍照成功!", "瑕疵拍照", 0, 0, 1500); } catch (Exception ex) { LogisTrac.WriteLog(string.Format("SnapShoting:{0}", ex.Message)); } } private Controller() { _flawBl = new FlawDetectionBl(CAMERA_COUNT) { DoAddFlawShot = AddFlawShot }; _flawBl.TlWorker = DoBlCmd; } public void DoBlCmd(int type) { WindowsControlEvent?.Invoke(11); } public void Banding() { _flawBl.Running = Running; } private MGoodFlaws good = new MGoodFlaws(); public void SaveGoods() { //return; try { if (OS.Spin.Running.Cache.GetInstance().CMeter < 5) { return; } bool isBreak = false; for (var i = good.Flaws.Count - 1; i >= 0; i--) { var flaws = good.Flaws[i].Flaws; var score = 0; foreach (var flaw in flaws) { score += int.Parse(flaw.Score); //if (flaw.Meter < OS.Spin.Running.Cache.GetInstance().CMeter - 5) //{ // isBreak = true; // break; //} } if (isBreak) { break; } _tScore += score; //good.Flaws.RemoveAt(i); } //for(var flaws in _viewFlaws) //var good = new MGoodFlaws //{ good.FinishedTime = DateTime.Now; good.Score = string.Format("-{0}", Scores); good.SnNo = _snNo; good.Level = Scores <= 16 ? "A" : "B"; good.Meter = OS.Spin.Running.Cache.GetInstance().CMeter; //}; _viewFlaws = new ObservableCollection(); //FlawViewShowDialogEvent?.Invoke(ref good); _cacheGoods.Add(good); good = new MGoodFlaws(); // 清零 Zero(); // 下一个编号 NextSnNo(); SaveReports(); } catch (Exception ex) { LogisTrac.WriteLog(ex); } } public void SaveReports() { try { if (null == _cacheGoods || 0 == _cacheGoods.Count) { return; } var rbl = new ReportsSavingBl(); rbl.SaveReport(_cacheGoods); _cacheGoods.Clear(); MessageBoxTimeoutA((IntPtr)0, "报告保存成功!", "报告保存", 0, 0, 1500); //MessageBox.Show("报告保存成功!"); } catch (Exception ex) { LogisTrac.WriteLog(string.Format("SaveReports:", ex.Message)); } } public void Zero() { try { good = new MGoodFlaws(); DoAddFlawShot?.Invoke(null); OS.Spin.Running.Cache.GetInstance().CacheImgId = 0; OS.Spin.Running.Cache.GetInstance().CMeter = 0; WindowsControlEvent?.Invoke(10); _flawBl.ReSetDp(); _tScore = 0; _flawCount = 0; _flaws.Clear(); OS.Spin.Running.Cache.GetInstance().FlawId = 1; } catch (Exception ex) { LogisTrac.WriteLog(string.Format("Zero:{0}", ex.Message)); } } private string _snNo = "A20190529A0002"; public void MinWindows() { WindowsControlEvent?.Invoke(0); } public string SnNo { get { return _snNo; } } /// /// 改变编号 /// public void ChangeSnNo(string sn) { try { var no = sn.Substring(sn.Length - 3, 3); int rNo; if (!int.TryParse(no, out rNo)) { return; } _snNo = sn; } catch (Exception ex) { LogisTrac.WriteLog(string.Format("ChangeSnNo:{0}", ex.Message)); } } public void NextSnNo() { try { if (string.IsNullOrEmpty(_snNo)) { return; } var no = _snNo.Substring(_snNo.Length - 3, 3); var sn = _snNo.Substring(0, _snNo.Length - 3); int rNo; if (!int.TryParse(no, out rNo)) { return; } rNo++; no = string.Format("{0:d3}", rNo); _snNo = sn + no; } catch (Exception ex) { LogisTrac.WriteLog(string.Format("NextSnNo:{0}", ex.Message)); } } public void Exit() { //Stopwatch sw = new Stopwatch(); //sw.Start(); //LogisTrac.WriteLog("关闭"); //System.Environment.Exit(0); //LogisTrac.WriteLog("关闭成功"); //LogisTrac.WriteLog("1" + sw.ElapsedMilliseconds.ToString()); //_flawBl.Dispose(); //LogisTrac.WriteLog("_flawBl" + sw.ElapsedMilliseconds.ToString()); //ImageSavingBl.Getinstance().Dispose(); //LogisTrac.WriteLog("ImageSavingBl" + sw.ElapsedMilliseconds.ToString()); WindowsControlEvent?.Invoke(1); //LogisTrac.WriteLog(sw.ElapsedMilliseconds.ToString()); //System.Environment.Exit(0); //LogisTrac.WriteLog(sw.ElapsedMilliseconds.ToString()); } public void TestTrigger(double meter) { _flawBl.CameraTrigger(meter); } public void AddFlawByUser() { ImageSavingBl.Getinstance().PutCopy(new MFileCopy(1, OS.Spin.Running.Cache.GetInstance().CacheImgId, CAMERA_COUNT)); MessageBoxTimeoutA((IntPtr)0, "瑕疵抓拍成功!", "瑕疵抓拍", 0, 0, 1500); } private void AddFlawShot(MFlawInfo flaw) { //_flaws.Add(flaw); //ViewFlaws.Add() try { MFlawRow flawRow = new MFlawRow() { Id = (good.Flaws.Count + 1).ToString(), }; //flawRow.MatImg = mergeCols(flaw.Mats); var id = 0; foreach (var f in flaw.FinalFlaws) { var cflaw = new MFlaw() { Id = string.Format("{0}:{1}", _viewFlaws.Count, id), FlawName = f.FlawName, Score = string.Format("-{0}", f.Scores), Meter = f.Meter }; flawRow.Flaws.Add(cflaw); _flawCount += 1; _tScore += f.Scores; } good.Flaws.Add(flawRow); DoAddFlawShot?.Invoke(flaw); } catch (Exception ex) { LogisTrac.WriteInfoLog("AddFlawShot"); LogisTrac.WriteLog(ex); } } private Mat mergeCols(List mats) { //CV_ASSERT(A.cols == B.cols && A.type() == B.type()); try { if (0 == mats.Count) { return null; } if (1 == mats.Count) { return mats[0]; } if (null == mats[0]) { return null; } int totalCols = mats[0].Cols * mats.Count; Mat mergedDescriptors = new Mat(mats[0].Rows, totalCols, mats[0].Type()); for (var i = 0; i < mats.Count; i++) { var mat = mats[i]; if (null == mat) { return null; } Mat submat = mergedDescriptors.ColRange(mat.Cols * i, mat.Cols * (i + 1)); mat.CopyTo(submat); } return mergedDescriptors; } catch (Exception ex) { LogisTrac.WriteInfoLog("mergeCols"); LogisTrac.WriteLog(ex); } return null; } } }