From da0da2d1238555c4ff488dbaaae1371ba4cf6827 Mon Sep 17 00:00:00 2001 From: wells.liu <wells.liu@broconcentric.com> Date: 星期四, 09 七月 2020 17:22:51 +0800 Subject: [PATCH] Merge branch 'master' of http://gitblit.broconcentric.com:8088/r/M071 --- src/Bro.M071.Process/M071Process.cs | 544 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 444 insertions(+), 100 deletions(-) diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs index 13fde83..6b0702d 100644 --- a/src/Bro.M071.Process/M071Process.cs +++ b/src/Bro.M071.Process/M071Process.cs @@ -2,15 +2,22 @@ using Bro.Common.Helper; using Bro.Common.Interface; using Bro.Common.Model; +using Bro.M071.DBManager; +using Bro.M071.Model; +using Bro.M071.Model.Model; using Bro.Process; using HalconDotNet; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; +using System.Drawing; using System.IO; using System.Linq; using System.Text; +using System.Threading; using System.Threading.Tasks; +using static Bro.Common.Helper.EnumHelper; namespace Bro.M071.Process { @@ -31,8 +38,10 @@ #region 浜嬩欢 public event Action OnMeasureStart; - public event Action<string> OnBarcodeChanged; + public event Action OnClearBarcode; public event Action<IShapeElement> OnElementUpdated; + public event Action<MachineState> OnMachineStateChanged; + public event Action OnFullResetDone; #endregion public override void Open() @@ -40,10 +49,23 @@ InitialSetting(); base.Open(); + + SwitchBeep(false); + SwitchLightGreen(false); + SwitchLightRed(false); + SwitchLightYellow(false); + + Reset(null, null, null); + FullReset(null); } private void InitialSetting() { + //鏁版嵁搴撹縼绉绘鏌� + DatabaseInitialize.Initialize(); + + MotionCardSettingCheck(); + Config.SnapshotPointCollection.ForEach(u => { u.GetHalconToolPathList().ForEach(path => @@ -59,21 +81,21 @@ var snapshotPoint = Config.SnapshotPointCollection.FirstOrDefault(s => s.Id == u.SnapshotPointId && s.IsEnabled); if (snapshotPoint == null) - throw new ProcessException($"{u.AlignName}鏈缃彲鐢ㄦ媿鐓х偣浣�"); + throw new ProcessException($"{u.AliasName}鏈缃彲鐢ㄦ媿鐓х偣浣�"); if (u.ImageSeq < 1) - throw new ProcessException($"{u.AlignName}鍥剧墖搴忓彿灏忎簬1"); + throw new ProcessException($"{u.AliasName}鍥剧墖搴忓彿灏忎簬1"); var algo = Config.KeyAlgorithemCollection.FirstOrDefault(a => a.Id == u.KeyAlgorithemId); if (algo == null) - throw new ProcessException($"{u.AlignName}鏈缃娴嬬畻娉�"); + throw new ProcessException($"{u.AliasName}鏈缃娴嬬畻娉�"); u.KeyAlgorithemPath = algo.AlgorithemPath; - LoadHalconTool(u.KeyAlgorithemPath, u.AlignName); + LoadHalconTool(u.KeyAlgorithemPath, u.AliasName); var resultSet = Config.KeyResultCollection.FirstOrDefault(r => r.Id == u.KeyResultId); if (resultSet == null) - throw new ProcessException($"{u.AlignName}鏈缃娴嬬粨鏋滈厤缃�"); + throw new ProcessException($"{u.AliasName}鏈缃娴嬬粨鏋滈厤缃�"); u.KeyResultList = new List<string>(resultSet.Results); }); @@ -98,7 +120,7 @@ if (keyRespone.Count == 0) throw new ProcessException($"{u.GetDisplayText()}瀵瑰簲鐨勫崟閿笉瀛樺湪鎴栦笉鍙敤"); - if (b.KeyResult == "All") + if (b.KeyResultId == "All") { keyRespone.SelectMany(kr => kr.KeyResultList).ToList().ForEach(r => { @@ -107,184 +129,495 @@ } else { - b.MeasureValueDict[b.KeyResult] = null; + b.MeasureValueDict[b.KeyResultId] = null; } }); }); } - #region InitialHalconTool - //protected override void InitialHalconTool() - //{ - // base.InitialHalconTool(); - - // Config.SnapshotPointCollection.ForEach(u => - // { - // u.GetHalconToolPathList().ForEach(path => - // { - // if (!string.IsNullOrWhiteSpace(path)) - // { - // string directoryPath = Path.GetDirectoryName(path); - // string fileName = Path.GetFileNameWithoutExtension(path); - - // HDevEngineTool tool = new HDevEngineTool(directoryPath); - // tool.LoadProcedure(fileName); - - // //浣跨敤鈥渱鈥濅綔涓洪棿闅旂 - // _halconToolDict[u.Id + "|" + path] = tool; - // } - // }); - // }); - //} - #endregion - - //Dictionary<string, ProductionMeasurement> MeasureDict = new Dictionary<string, ProductionMeasurement>(); - - private string barCode = ""; - public string BarCode + #region 娴佺▼涓姏鍑哄紓甯� + public override void ExceptionRaisedInMonitor(Exception ex) { - get => barCode; - set + if (ex is ProcessException pEx) { - if (barCode != value) + if (pEx.Level >= ExceptionLevel.Fatal) { - barCode = value; - OnBarcodeChanged?.Invoke(value); + RaisedAlarm(pEx.Message); + MachineState = MachineState.Alarm; } } + else + { + RaisedAlarm(ex.Message); + MachineState = MachineState.Alarm; + } } + #endregion + + public string BarCode { get; set; } + + List<ProductionMeasurement> productionList = new List<ProductionMeasurement>(); [ProcessMethod("", "StartJob", "寮�濮嬫壂鎻�", InvokeType.TestInvoke)] public ProcessResponse StartJob(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) { + if (MachineState != MachineState.Ready) + throw new ProcessException("鏈哄彴鏈氨缁紝璇峰嬁寮�濮嬫祴閲�", null, ExceptionLevel.Fatal); + if (string.IsNullOrWhiteSpace(BarCode)) { + OnClearBarcode?.Invoke(); throw new ProcessException("鏈緭鍏ヤ骇鍝佹潯鐮侊紝璇峰嬁寮�濮嬫祴閲�"); } + MachineState = MachineState.Running; OnMeasureStart?.BeginInvoke(null, null); var measurements = Config.MeasurementUnitCollection.Where(u => u.IsEnabled).ToList().DeepSerializeClone(); measurements.ForEach(m => { m.InitialKeyUnitMeasureChanged(); - //m.KeyUnitCollection.ForEach(k => k.InitialMeasureValueDictPropertyChanged()); }); - - //MeasureDict[BarCode] = new ProductionMeasurement() - //{ - // Barcode = BarCode, - // Measurements = measurements, - //}; - - //MeasureDict[BarCode].InitialMeasurementsPropertyChanged(); - //MeasureDict[BarCode].PropertyChanged += MeasureProduction_PropertyChanged; var pMeasure = new ProductionMeasurement() { Barcode = BarCode, Measurements = measurements, + StartTime = DateTime.Now, }; + + var existedProduction = productionList.FirstOrDefault(u => u.Barcode == pMeasure.Barcode); + if (existedProduction != null) + { + productionList.Remove(existedProduction); + existedProduction.Dispose(); + existedProduction = null; + } + + productionList.Add(pMeasure); pMeasure.InitialMeasurementsPropertyChanged(); pMeasure.PropertyChanged += MeasureProduction_PropertyChanged; Config.SnapshotPointCollection.Where(u => u.IsEnabled).ToList().ForEach(s => { - IDevice device = DeviceCollection.FirstOrDefault(u => u.Id == s.MotionDevice); + _pauseHandle.WaitHandle.WaitOne(); + + IDevice device = DeviceCollection.FirstOrDefault(u => u.Id == s.MotionOp.Device); if (device == null) throw new ProcessException($"{s.Name}鎷嶇収鐐逛綅鏈缃繍鍔ㄨ澶�"); - IMotion motionDevice = device as IMotion; + IMotionCard motionDevice = device as IMotionCard; if (motionDevice == null) throw new ProcessException($"{s.Name}鎷嶇収鐐逛綅璁剧疆{device.Name}涓嶆槸杩愬姩璁惧"); - if (!motionDevice.MoveToPoint(null)) + var response = motionDevice.Run(s.MotionOp.OpConfig); + if (!response.Result) { - throw new ProcessException("杩愬姩涓", null, ExceptionLevel.Info); + throw new ProcessException($"{device.Name}寮傚父锛寋response.Message}", null, ExceptionLevel.Fatal); } CameraBase camera = DeviceCollection.FirstOrDefault(u => u.Id == s.CameraOp.Device) as CameraBase; if (camera == null) return; - ImageSet imgSet = camera.Snapshot(s.CameraOp.OpConfig); - if (imgSet == null) - return; + IImageSet set = null; + try + { + set = CollectHImage(camera, s.CameraOp.OpConfig); + } + catch (ProcessException pEx) + { + pEx.Level = ExceptionLevel.Fatal; + throw pEx; + } - RunImageHandle(camera, s.CameraOp.OpConfig, imgSet, s.Id, s.Name, pMeasure.Measurements); + if (set == null) + { + return; + } + + RunImageHandle(camera, s.CameraOp.OpConfig, set, s.Id, s.Name, pMeasure.Measurements); }); BarCode = ""; + LogAsync(DateTime.Now, $"{pMeasure.Barcode}娴嬮噺鍔ㄤ綔瀹屾垚", ""); + return new ProcessResponse(true); } + #region 鍙屾墜鍚姩 + bool isLeftStart = false; + bool IsLeftStart + { + get => isLeftStart; + set + { + isLeftStart = value; + StartCheck(); + } + } + + bool isRightStart = false; + bool IsRightStart + { + get => isRightStart; + set + { + isRightStart = value; + StartCheck(); + } + } + + private void StartCheck() + { + if (isRightStart && isLeftStart) + { + StartJob(null, null, null); + } + } + + [ProcessMethod("", "Start_Left", "宸︽墜鍚姩", InvokeType.TestInvoke)] + public ProcessResponse Start_Left(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) + { + if (opConfig.InputPara != null && opConfig.InputPara.Count > 0) + { + IsLeftStart = opConfig.InputPara[0] == 1; + } + + return new ProcessResponse(); + } + + [ProcessMethod("", "Start_Right", "鍙虫墜鍚姩", InvokeType.TestInvoke)] + public ProcessResponse Start_Right(IOperationConfig opConfig, IDevice invokeDevice, IDevice sourceDevice) + { + if (opConfig.InputPara != null && opConfig.InputPara.Count > 0) + { + IsRightStart = opConfig.InputPara[0] == 1; + } + + return new ProcessResponse(); + } + #endregion + + #region 绉佹湁鏂规硶 private void MeasureProduction_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (sender is ProductionMeasurement pMeasure) { - //妫�鏌ユ槸鍚﹀叏閮ㄥ畬鎴� - pMeasure.Measurements.ForEach(m => + lock (pMeasure) { - if (m.KeyUnitCollection.All(k => k.IsDone != null)) + //妫�鏌ユ槸鍚﹀叏閮ㄥ畬鎴� + pMeasure.Measurements.ForEach(m => { - if (!m.IsUpdated) + if (m.KeyUnitCollection.All(k => k.IsDone != null)) { - if (m.KeyUnitCollection.Any(k => k.IsDone == false)) + if (!m.IsUpdated) { - m.Spec.ActualValue = -999; - } - else - { - string toolKey = m.Id + "|" + m.Spec.AlgorithemPath; - if (!_halconToolDict.ContainsKey(toolKey)) + if (m.KeyUnitCollection.Any(k => k.IsDone == false)) { - LogAsync(DateTime.Now, $"{m.GetDisplayText()}{m.Spec.Code}绠楁硶鏈垵濮嬪寲", ""); m.Spec.ActualValue = -999; } else { - var array = m.KeyUnitCollection.SelectMany(u => u.MeasureValueDict.Values.ToList().ConvertAll(v => v ?? -999)).ToArray(); - _halconToolDict[toolKey].InputTupleDic["INPUT_Params"] = new HTuple(array); - if (!_halconToolDict[toolKey].RunProcedure(out string error)) + string toolKey = m.Id + "|" + m.Spec.AlgorithemPath; + if (!_halconToolDict.ContainsKey(toolKey)) { - LogAsync(DateTime.Now, $"{m.GetDisplayText()}{m.Spec.Code}绠楁硶寮傚父,{error}", ""); + LogAsync(DateTime.Now, $"{m.GetDisplayText()}{m.Spec.Code}绠楁硶鏈垵濮嬪寲", ""); m.Spec.ActualValue = -999; } else { - m.Spec.ActualValue = _halconToolDict[toolKey].GetResultTuple("OUTPUT_Result").D; - LogAsync(DateTime.Now, $"{m.GetDisplayText()}鏁版嵁{m.Spec.ActualValue}锛岀粨鏋渰(m.Spec.MeasureResult == null ? "TBD" : (m.Spec.MeasureResult == true ? "OK" : "NG"))}", ""); + var array = m.KeyUnitCollection.SelectMany(u => u.MeasureValueDict.Values.ToList().ConvertAll(v => v ?? -999)).ToArray(); + _halconToolDict[toolKey].InputTupleDic["INPUT_Params"] = new HTuple(array); + if (!_halconToolDict[toolKey].RunProcedure(out string error)) + { + LogAsync(DateTime.Now, $"{m.GetDisplayText()}{m.Spec.Code}绠楁硶寮傚父,{error}", ""); + m.Spec.ActualValue = -999; + } + else + { + m.Spec.ActualValue = _halconToolDict[toolKey].GetResultTuple("OUTPUT_Result").D; + LogAsync(DateTime.Now, $"{m.GetDisplayText()}鏁版嵁{m.Spec.ActualValue}锛岀粨鏋渰(m.Spec.MeasureResult == null ? "TBD" : (m.Spec.MeasureResult == true ? "OK" : "NG"))}", ""); + } } } + + LogAsync(DateTime.Now, $"{m.GetDisplayText()}妫�娴嬬粨鏋�", $"{((m.Spec.MeasureResult ?? false) ? "OK" : "NG")}"); + + IShapeElement indicator = null; + pMeasure.ElementList.Add(indicator); + //杈撳嚭鍥惧舰鍩哄厓鍒扮晫闈� + OnElementUpdated?.BeginInvoke(indicator, null, null); + + SaveKeyImages(pMeasure.Barcode, m); + + m.IsUpdated = true; } - - //杈撳嚭鍥惧舰鍩哄厓鍒扮晫闈� todo - OnElementUpdated?.BeginInvoke(null, null, null); - - m.IsUpdated = true; } - } - }); + }); - if (!pMeasure.Measurements.All(m => m.IsUpdated)) - { - return; + if (!pMeasure.Measurements.All(m => m.IsUpdated)) + { + return; + } } + + pMeasure.EndTime = DateTime.Now; + bool pResult = pMeasure.Measurements.All(u => u.Spec.MeasureResult == true); + pMeasure.PResult = pResult ? "OK" : "NG"; + OnUpdateResult?.Invoke(DateTime.Now, pResult ? 1 : 0); + OnUpdateCT?.Invoke((float)(pMeasure.EndTime.Value - pMeasure.StartTime.Value).TotalSeconds); + + LogAsync(DateTime.Now, $"{pMeasure.Barcode} 妫�娴嬪畬鎴愶紝缁撴灉 {pMeasure.PResult}", ""); + + if (MachineState == MachineState.Running) + MachineState = MachineState.Ready; + + var measurementUnitResultAndKeyUnitDataSet = GetMeasurementUnitResultAndKeyUnitData(pMeasure); //MES杈撳嚭 todo - //Excel鎶ヨ〃杈撳嚭 todo + //Excel鎶ヨ〃杈撳嚭 锛堝崟涓骇鍝佺殑excel瀵煎嚭锛� + ExportProductionExcel(measurementUnitResultAndKeyUnitDataSet); + //鏁版嵁搴撲繚瀛� + SaveProductionData(measurementUnitResultAndKeyUnitDataSet); - //鏁版嵁搴撲繚瀛� todo + SaveWholeImage(pMeasure); - //MeasureDict.Remove(pMeasure.Barcode); + productionList.RemoveAll(p => p.Barcode == pMeasure.Barcode); pMeasure.Dispose(); } } - private async void RunImageHandle(CameraBase camera, IOperationConfig opConfig, ImageSet imgSet, string snapshotId, string snapshotName, List<MeasurementUint> measureList) + KeyUnitDataManager keyUnitDataManager = new KeyUnitDataManager(); + MeasurementUnitResultManager measurementUnitResultManager = new MeasurementUnitResultManager(); + MeasurementAndKeyDataRelationManager measurementAndKeyDataRelationManager = new MeasurementAndKeyDataRelationManager(); + ProductionMeasurementRecordsManager productionMeasurementRecordsManager = new ProductionMeasurementRecordsManager(); + + static object dataSaveLock = new object(); + + private async void SaveProductionData(ProductionMeasurementUnitResultAndKeyUnitDataSet measurementUnitResultAndKeyUnitDataSet) + { + await Task.Run(() => + { + try + { + lock (dataSaveLock) + { + // 鑾峰彇 浜у搧鏁版嵁 骞朵繚瀛� + var productionMeasurementRecords = measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord; + productionMeasurementRecordsManager.CreateModel(productionMeasurementRecords); + + // 鑾峰彇 鍘熷鏁版嵁 骞朵繚瀛� + var keyUnitDatas = measurementUnitResultAndKeyUnitDataSet.KeyUnitDataList; + keyUnitDataManager.BatchAddKeyUnitData(keyUnitDatas); + + // 鑾峰彇 妫�娴嬬粨鏋滄暟鎹� 骞朵繚瀛� + var measurementUnitResults = measurementUnitResultAndKeyUnitDataSet.MeasurementUnitResultList; + measurementUnitResultManager.BatchAddMeasurementUnitResult(measurementUnitResults); + + // 鑾峰彇 鍏崇郴鏁版嵁骞朵繚瀛� + var measurementAndKeyDataRelationList = measurementUnitResultAndKeyUnitDataSet.MeasurementAndKeyDataRelationList; + measurementAndKeyDataRelationManager.BatchAddMeasurementAndKeyDataRelation(measurementAndKeyDataRelationList); + } + } + catch (Exception ex) + { + LogAsync(DateTime.Now, "鏁版嵁淇濆瓨寮傚父", ex.GetExceptionMessage()); + } + }); + } + + private ProductionMeasurementUnitResultAndKeyUnitDataSet GetMeasurementUnitResultAndKeyUnitData(ProductionMeasurement pData) + { + ProductionMeasurementUnitResultAndKeyUnitDataSet measurementUnitResultAndKeyUnitDataSet = new ProductionMeasurementUnitResultAndKeyUnitDataSet(); + + try + { + + //浜у搧鏁版嵁 + ProductionMeasurementRecords productionMeasurementRecords = new ProductionMeasurementRecords(); + //鍏崇郴鏁版嵁 + List<MeasurementAndKeyDataRelation> measurementAndKeyDataRelationList = new List<MeasurementAndKeyDataRelation>(); + //鍘熷鏁版嵁 + List<KeyUnitData> keyUnitDatas = new List<KeyUnitData>(); + // 鍗曚釜浜у搧鐨勬祴閲忔眹鎬� + List<MeasurementUnitResult> measurementUnitResults = new List<MeasurementUnitResult>(); + + productionMeasurementRecords.ProductionBarcode = pData.Barcode; + productionMeasurementRecords.ProductionCode = ProductionCode; + productionMeasurementRecords.ProductionResult = pData.PResult; + productionMeasurementRecords.OperationStartTime = pData.StartTime.GetValueOrDefault(); + productionMeasurementRecords.OperationEndTime = pData.EndTime.GetValueOrDefault(); + + measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord = productionMeasurementRecords; + + foreach (var MeasurementUnitResult in pData.Measurements)//鑾峰彇鍒板崟涓祴閲忛」缁撴灉 + { + MeasurementUnitResult measurementUnitResult = new MeasurementUnitResult(); + measurementUnitResult.ProductionMeasurementRecordsId = productionMeasurementRecords.ID; + measurementUnitResult.MeasurementName = MeasurementUnitResult.Name; + measurementUnitResult.MeasurementType = MeasurementUnitResult.MeasureType; + measurementUnitResult.MeasurementValue = ""; + measurementUnitResult.MeasurementResult = MeasurementUnitResult.Spec.MeasureResult.Value ? "OK" : "NG"; + + measurementUnitResults.Add(measurementUnitResult); + + foreach (var keyUnit in MeasurementUnitResult.KeyUnitCollection)//鑾峰彇鍗曚釜閿殑娴嬮噺缁撴灉 + { + foreach (var keyValue in keyUnit.MeasureValueDict)//鑾峰彇鍗曚釜閿殑鍗曚釜娴嬮噺item 缁撴灉 + { + KeyUnitData keyUnitData = new KeyUnitData(); + keyUnitData.Key = keyUnit.Key; + keyUnitData.MeasurementItem = keyValue.Key; + keyUnitData.ItemValue = keyValue.Value.ToString(); + keyUnitDatas.Add(keyUnitData); + + MeasurementAndKeyDataRelation measurementAndKeyDataRelation = new MeasurementAndKeyDataRelation(); + measurementAndKeyDataRelation.MeasurementUnitResultId = measurementUnitResult.ID; + measurementAndKeyDataRelation.KeyUnitDataId = keyUnitData.ID; + measurementAndKeyDataRelationList.Add(measurementAndKeyDataRelation); + + } + } + } + measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord = productionMeasurementRecords; + measurementUnitResultAndKeyUnitDataSet.MeasurementAndKeyDataRelationList = measurementAndKeyDataRelationList; + measurementUnitResultAndKeyUnitDataSet.KeyUnitDataList = keyUnitDatas; + measurementUnitResultAndKeyUnitDataSet.MeasurementUnitResultList = measurementUnitResults; + } + catch (Exception ex) + { + LogAsync(DateTime.Now, "鏁版嵁鑾峰彇寮傚父", ex.GetExceptionMessage()); + } + return measurementUnitResultAndKeyUnitDataSet; + } + + private async void ExportProductionExcel(ProductionMeasurementUnitResultAndKeyUnitDataSet measurementUnitResultAndKeyUnitDataSet) + { + await Task.Run(() => + { + ExcelExportSet excelExportDto = new ExcelExportSet(); + excelExportDto.Worksheets = new List<string>() { "鍘熷鏁版嵁", "妫�娴嬬粨鏋�" }; + var keyUnitColumns = new Dictionary<string, string>() + { + {"Key", "閿�"}, + {"MeasurementItem", "妫�娴嬮」"}, + {"ItemValue", "妫�娴嬪��"} + }; + var measurementUnitResultColumns = new Dictionary<string, string>() + { + {"MeasurementName", "妫�娴嬪悕绉�"}, + {"MeasurementType", "妫�娴嬬被鍨�"}, + {"MeasurementValue", "妫�娴嬪��"}, + {"MeasurementResult", "妫�娴嬬粨鏋�"}, + }; + excelExportDto.WorksheetColumns[excelExportDto.Worksheets[0]] = keyUnitColumns; + excelExportDto.WorksheetColumns[excelExportDto.Worksheets[1]] = measurementUnitResultColumns; + + excelExportDto.WorksheetDataTable[excelExportDto.Worksheets[0]] = ExcelExportHelper.ListToDataTable(measurementUnitResultAndKeyUnitDataSet.KeyUnitDataList, keyUnitColumns); + excelExportDto.WorksheetDataTable[excelExportDto.Worksheets[1]] = ExcelExportHelper.ListToDataTable(measurementUnitResultAndKeyUnitDataSet.MeasurementUnitResultList, measurementUnitResultColumns); ; + + byte[] filecontent = ExcelExportHelper.ExportExcel(excelExportDto, false); + string dir = Path.Combine(Config.ImageSaveFolder, DateTime.Now.ToString("yyyyMMdd")); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + + FileStream fs = new FileStream(Path.Combine(dir, $"{measurementUnitResultAndKeyUnitDataSet.ProductionMeasurementRecord.ProductionBarcode}_{DateTime.Now.ToString("HHmmss")}.xlsx"), FileMode.Create, FileAccess.Write); + fs.Write(filecontent, 0, filecontent.Length); + fs.Flush(); + fs.Close(); + }); + } + + #region 鍥惧儚淇濆瓨 + private void SaveWholeImage(ProductionMeasurement pMeasure) + { + try + { + Bitmap backImage = (Bitmap)Bitmap.FromFile(Config.BackgroundImagePath); + + Bitmap map = new Bitmap(backImage.Width, backImage.Height); + using (Graphics g = Graphics.FromImage(map)) + { + g.DrawImage(backImage, new PointF(0, 0)); + + pMeasure.ElementList.ForEach(e => + { + e.Draw(g); + }); + } + + string dir = Path.Combine(Config.ImageSaveFolder, "TopView", DateTime.Now.ToString("yyyyMMdd")); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + + map.Save(Path.Combine(dir, $"{pMeasure.Barcode}_{DateTime.Now.ToString("HHmmss")}.bmp")); + } + catch (Exception ex) + { + LogAsync(DateTime.Now, "鏁翠綋鍥剧墖淇濆瓨寮傚父", ex.GetExceptionMessage()); + } + } + + private void SaveKeyImages(string barCode, MeasurementUnit measureUnit) + { + string measureName = measureUnit.GetDisplayText(); + if (Config.ImageSaveOption.IsSaveOriginImage) + { + measureUnit.KeyUnitCollection.ForEach(u => u.ImageSaveStatus++); + + string dir = Path.Combine(Config.ImageSaveFolder, "Origin", DateTime.Now.ToString("yyyyMMdd"), barCode, measureUnit.MeasureType); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + + SaveKeyImages(measureUnit, measureName, dir); + } + + string result = (measureUnit.Spec.MeasureResult ?? false) ? "OK" : "NG"; + if (Config.ImageSaveOption.AddtionalSaveType.ToUpper().Contains(result)) + { + measureUnit.KeyUnitCollection.ForEach(u => u.ImageSaveStatus++); + + string dir = Path.Combine(Config.ImageSaveFolder, result, DateTime.Now.ToString("yyyyMMdd"), barCode, measureUnit.MeasureType); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + + SaveKeyImages(measureUnit, measureName, dir); + } + } + + private async void SaveKeyImages(MeasurementUnit measureUnit, string measureName, string dir) + { + await Task.Run(() => + { + measureUnit.KeyUnitCollection.ForEach(u => + { + int i = 0; + u.KeyImages?.ForEach(image => + { + string fileName = Path.Combine(dir, $"{measureName}_{u.Key}{(i == 0 ? "" : $"-{i}")}_{DateTime.Now.ToString("HHmmss")}.tiff"); + image.WriteImage("tiff", 0, fileName); + i++; + }); + + u.ImageSaveStatus--; + }); + }); + } + #endregion + + private async void RunImageHandle(CameraBase camera, IOperationConfig opConfig, IImageSet imgSet, string snapshotId, string snapshotName, List<MeasurementUnit> measureList) { await Task.Run(() => { @@ -293,6 +626,7 @@ string toolKey = (opConfig as CameraOprerationConfigBase).AlgorithemPath; HObject images = imgSet.HImage; + LaserScanParam scanParam = JsonConvert.DeserializeObject<LaserScanParam>(imgSet.ImageData); if (!string.IsNullOrWhiteSpace(toolKey)) { @@ -327,7 +661,7 @@ var excludeKeys = keys.Where(u => u.ImageSeq > count).ToList(); if (excludeKeys.Count > 0) { - LogAsync(DateTime.Now, $"{string.Join(" ", excludeKeys.Select(u => u.AlignName))}鏈湪鍥剧墖鑾峰彇搴忓垪涓�", ""); + LogAsync(DateTime.Now, $"{string.Join(" ", excludeKeys.Select(u => u.AliasName))}鏈湪鍥剧墖鑾峰彇搴忓垪涓�", ""); keyBindCollection.Where(k => excludeKeys.Any(u => u.Key == k.Key)).ToList().ForEach(k => { k.FillKeyValues(null); @@ -344,24 +678,26 @@ var keyBindList = keyBindCollection.Where(u => u.Key == k.Key).ToList(); - string keyToolKey = k.AlignName + "|" + k.KeyAlgorithemPath; + string keyToolKey = k.AliasName + "|" + k.KeyAlgorithemPath; if (!_halconToolDict.ContainsKey(keyToolKey)) { - LogAsync(DateTime.Now, $"{k.AlignName}妫�娴嬬畻娉曟湭鍒濆鍖�", ""); + LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曟湭鍒濆鍖�", ""); } else { _halconToolDict[keyToolKey].InputImageDic["INPUT_Image"] = image; + _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_X"] = scanParam.Resolution_X; + _halconToolDict[keyToolKey].InputTupleDic["INPUT_Resolution_Z"] = scanParam.Resolution_Z; if (!_halconToolDict[keyToolKey].RunProcedure(out string error)) { - LogAsync(DateTime.Now, $"{k.AlignName}妫�娴嬬畻娉曞紓甯革紝{error}", ""); + LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬畻娉曞紓甯革紝{error}", ""); } else { var results = _halconToolDict[keyToolKey].GetResultTuple("OUTPUT_Results").HTupleToDouble(); if (results.Count == 0 || results.Any(u => u < 0)) { - LogAsync(DateTime.Now, $"{k.AlignName}妫�娴嬬粨鏋滃紓甯�", ""); + LogAsync(DateTime.Now, $"{k.AliasName}妫�娴嬬粨鏋滃紓甯�", ""); } else { @@ -374,15 +710,23 @@ } } - keyBindList.ForEach(kb => kb.FillKeyValues(resultDict)); + keyBindList.ForEach(kb => + { + kb.KeyImages.Add(image.Clone() as HImage); + kb.FillKeyValues(resultDict); + }); }); image.Dispose(); }); - if (count.I != 1) - imgSet.HImage.Dispose(); + //if (count.I != 1) + //{ + // hImage?.Dispose(); + // hImage = null; + //} }); } + #endregion } } -- Gitblit v1.8.0