From 8feea03e4ff2bd4f6db21928e7989f0b72686867 Mon Sep 17 00:00:00 2001
From: xcd <834800634@qq.com>
Date: 星期二, 30 六月 2020 18:43:08 +0800
Subject: [PATCH] 修改流程取图方式。添加M071流程OK/NG/原图保存。
---
src/Bro.M071.Process/M071Process.cs | 195 +++++++++++++++++++++++++++++++++++++-----------
src/Bro.M071.Process/M071Config.cs | 14 +++
src/Bro.Process/ProcessControl.cs | 2
src/Bro.M071.Process/M071Models.cs | 28 ++++++-
4 files changed, 188 insertions(+), 51 deletions(-)
diff --git a/src/Bro.M071.Process/M071Config.cs b/src/Bro.M071.Process/M071Config.cs
index 2cdacf0..b3ae3f3 100644
--- a/src/Bro.M071.Process/M071Config.cs
+++ b/src/Bro.M071.Process/M071Config.cs
@@ -1,4 +1,5 @@
-锘縰sing Bro.Common.Helper;
+锘縰sing Bro.Common.Base;
+using Bro.Common.Helper;
using Bro.Common.Model;
using Bro.Process;
using System;
@@ -62,5 +63,16 @@
[TypeConverter(typeof(CollectionCountConvert))]
[Editor(typeof(ComplexCollectionEditor<MeasurementUint>), typeof(UITypeEditor))]
public List<MeasurementUint> MeasurementUnitCollection { get; set; } = new List<MeasurementUint>();
+
+ [Category("鍥剧墖淇濆瓨閰嶇疆")]
+ [Description("鍗曢敭鍥剧墖淇濆瓨閰嶇疆")]
+ [TypeConverter(typeof(ComplexObjectConvert))]
+ [Editor(typeof(PropertyObjectEditor), typeof(UITypeEditor))]
+ public ImageSaveOption ImageSaveOption { get; set; } = new ImageSaveOption();
+
+ [Category("鍥剧墖淇濆瓨閰嶇疆")]
+ [Description("鍗曢敭鍥剧墖淇濆瓨鐩綍璺緞")]
+ [Editor(typeof(FoldDialogEditor),typeof(UITypeEditor))]
+ public string ImageSaveFolder { get; set; } = "";
}
}
diff --git a/src/Bro.M071.Process/M071Models.cs b/src/Bro.M071.Process/M071Models.cs
index be596b7..d9a40ac 100644
--- a/src/Bro.M071.Process/M071Models.cs
+++ b/src/Bro.M071.Process/M071Models.cs
@@ -3,6 +3,7 @@
using Bro.Common.Helper;
using Bro.Common.Interface;
using Bro.Common.Model;
+using HalconDotNet;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
@@ -11,6 +12,7 @@
using System.Drawing.Design;
using System.Linq;
using System.Text;
+using System.Threading;
using System.Threading.Tasks;
namespace Bro.M071.Process
@@ -195,18 +197,20 @@
public class ProductionMeasurement : INotifyPropertyChanged, IDisposable
{
- public string Barcode { get; set; }
+ public string Barcode;
- public List<MeasurementUint> Measurements { get; set; } = new List<MeasurementUint>();
+ public List<MeasurementUint> Measurements = new List<MeasurementUint>();
+
+ public List<IShapeElement> ElementList = new List<IShapeElement>();
public event PropertyChangedEventHandler PropertyChanged;
public void Dispose()
{
- Barcode = null;
-
Measurements?.ForEach(m => m?.Dispose());
Measurements = null;
+
+ Barcode = null;
GC.Collect();
}
@@ -304,6 +308,10 @@
[TypeConverter(typeof(KeyUnitResultConverter))]
public string KeyResult { get; set; } = "";
+
+ public List<HImage> KeyImages = new List<HImage>();
+
+ public volatile int ImageSaveStatus = 0;
//[Browsable(false)]
//public NoticedDictionary<string, double?> MeasureValueDict { get; set; } = new NoticedDictionary<string, double?>();
@@ -335,6 +343,18 @@
public void Dispose()
{
+ SpinWait wait = new SpinWait();
+ while (ImageSaveStatus != 0)
+ {
+ wait.SpinOnce();
+ }
+
+ KeyImages?.ForEach(i =>
+ {
+ i?.Dispose();
+ i = null;
+ });
+ KeyImages = null;
MeasureValueDict = null;
}
diff --git a/src/Bro.M071.Process/M071Process.cs b/src/Bro.M071.Process/M071Process.cs
index 1c79a4f..2667c4f 100644
--- a/src/Bro.M071.Process/M071Process.cs
+++ b/src/Bro.M071.Process/M071Process.cs
@@ -7,6 +7,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
+using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
@@ -200,11 +201,17 @@
if (camera == null)
return;
- IImageSet imgSet = camera.Snapshot(s.CameraOp.OpConfig);
- if (imgSet == null)
- return;
+ //IImageSet imgSet = camera.Snapshot(s.CameraOp.OpConfig);
+ //if (imgSet == null)
+ // return;
- RunImageHandle(camera, s.CameraOp.OpConfig, imgSet, s.Id, s.Name, pMeasure.Measurements);
+ HImage hImage = CollectHImage(camera, s.CameraOp.OpConfig, out string imgSetId);
+ if (string.IsNullOrWhiteSpace(imgSetId))
+ {
+ return;
+ }
+
+ RunImageHandle(camera, s.CameraOp.OpConfig, hImage, s.Id, s.Name, pMeasure.Measurements);
});
BarCode = "";
@@ -243,72 +250,163 @@
_pauseHandle.WaitResult = !_pauseHandle.WaitResult;
return new ProcessResponse(_pauseHandle.WaitResult);
}
+
#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"))}", "");
+ }
}
}
+
+ //杈撳嚭鍥惧舰鍩哄厓鍒扮晫闈� todo
+ OnElementUpdated?.BeginInvoke(null, 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;
+
+
+ //MES杈撳嚭 todo
+
+ //Excel鎶ヨ〃杈撳嚭 todo
+
+ //鏁版嵁搴撲繚瀛� todo
+
+ SaveWholeImage(pMeasure);
+ pMeasure.Dispose();
}
-
- //MES杈撳嚭 todo
-
- //Excel鎶ヨ〃杈撳嚭 todo
-
- //鏁版嵁搴撲繚瀛� todo
-
- //MeasureDict.Remove(pMeasure.Barcode);
- pMeasure.Dispose();
}
}
- private async void RunImageHandle(CameraBase camera, IOperationConfig opConfig, IImageSet imgSet, string snapshotId, string snapshotName, List<MeasurementUint> measureList)
+ #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, MeasurementUint 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(MeasurementUint 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, HImage hImage, string snapshotId, string snapshotName, List<MeasurementUint> measureList)
{
await Task.Run(() =>
{
@@ -316,7 +414,7 @@
var keyBindCollection = measureList.SelectMany(u => u.KeyUnitCollection).Where(u => keys.Any(k => k.Key == u.Key)).ToList();
string toolKey = (opConfig as CameraOprerationConfigBase).AlgorithemPath;
- HObject images = imgSet.HImage;
+ HObject images = hImage;
if (!string.IsNullOrWhiteSpace(toolKey))
{
@@ -328,7 +426,7 @@
return;
}
- _halconToolDict[toolKey].InputImageDic["INPUT_Image"] = imgSet.HImage;
+ _halconToolDict[toolKey].InputImageDic["INPUT_Image"] = hImage;
if (!_halconToolDict[toolKey].RunProcedure(out string error))
{
LogAsync(DateTime.Now, $"{snapshotName}鍙栧浘绠楁硶寮傚父锛寋error}", "");
@@ -398,14 +496,21 @@
}
}
- 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();
+ {
+ hImage?.Dispose();
+ hImage = null;
+ }
});
}
#endregion
diff --git a/src/Bro.Process/ProcessControl.cs b/src/Bro.Process/ProcessControl.cs
index aa74dc0..0edf765 100644
--- a/src/Bro.Process/ProcessControl.cs
+++ b/src/Bro.Process/ProcessControl.cs
@@ -628,7 +628,7 @@
TimeRecordCSV(DateTime.Now, camera.Name, methodCode + "閲囧浘", (int)sw.ElapsedMilliseconds);
}
- imgSetId = set.Id;
+ imgSetId = set?.Id;
return set.HImage;
}
--
Gitblit v1.8.0