kingno
2025-06-17 007782bf44e49b4e3d5166ef361ac9fd03cad9c2
src/Bro.M141.Process/M141Process_ImageCheck.cs
@@ -8,7 +8,9 @@
using Microsoft.VisualBasic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using NPOI.SS.UserModel;
using NPOI.Util;
using NPOI.XSSF.UserModel;
using Sunny.UI;
using System.Data;
using System.Data.SqlTypes;
@@ -439,6 +441,8 @@
            return msg;
        }
        [ProcessMethod("", "ProductDataUpload", "产品数据汇总", InvokeType.TestInvoke)]
@@ -503,6 +507,109 @@
        }
        private bool _isDemoStarted = false;
        [ProcessMethod("OfflineDemo", "OfflineDemo", "离线测试", InvokeType.CalibInvoke)]
        public ResponseMessage OfflineDemo(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice)
        {
            if (config is OfflineDemoOperationConfig opConfig)
            {
                if (_isDemoStarted)
                {
                    _isDemoStarted = false;
                }
                else
                {
                    _isDemoStarted = true;
                    OfflineDemoAsync(opConfig.ImageFolder);
                }
            }
            return new ResponseMessage();
        }
        private async void OfflineDemoAsync(string imageFolder)
        {
            await Task.Run(() =>
            {
                var imageFileNames = new DirectoryInfo(imageFolder).GetFiles().Select(u => u.FullName).ToList();
                for (int i = 0; i < imageFileNames.Count; i++)
                {
                    if (!_isDemoStarted)
                    {
                        return;
                    }
                    var imageFile = Path.GetFileNameWithoutExtension(imageFileNames[i]);
                    if (imageFile.EndsWith("Fit"))
                    {
                        continue;
                    }
                    var nameDatas = imageFile.Split(new char[] { '_'}, StringSplitOptions.RemoveEmptyEntries).ToList();
                    if (nameDatas.Count != 5)
                    {
                        LogAsync(DateTime.Now, EnumHelper.LogLevel.Error, $"文件{imageFile}命名不符合规范,不执行离线测试");
                        continue;
                    }
                    var sn = nameDatas[0];
                    var imageSeq = nameDatas[1];
                    var measureBind = M141Config.MeasureBindCollection.FirstOrDefault(u => u.ImageSaveSeq == imageSeq);
                    if (measureBind == null || !measureBind.IsFixed)
                    {
                        LogAsync(DateTime.Now, EnumHelper.LogLevel.Assist, $"离线测试,工位{(measureBind == null ? "未匹配" : $"{measureBind.WorkPosition}未开启")}");
                        continue;
                    }
                    LogAsync(DateTime.Now, EnumHelper.LogLevel.Action, $"离线测试,产品{sn}开始工位{measureBind.WorkPosition}离线检测");
                    MLImageSet imgSet = new MLImageSet();
                    imgSet.HImage = new HalconDotNet.HImage(imageFileNames[i]);
                    imgSet.PID = sn;
                    var detectResults = ML.RunMLDetectionSync(imgSet, null, measureBind.DetectionId);
                    imgSet.HImage?.Dispose();
                    imgSet.HImage = null;
                    //var defectFields = M141Config.DefectLocationSettings.FirstOrDefault(u => u.PositionCode == measureBind.WorkPosition);
                    //var list = detectResults.SelectMany(u => u.NetResults.SelectMany(m => m.DetectDetails)).ToList();
                    ////if (list.Count > 0)
                    ////{
                    ////    //list.ForEach(d =>
                    ////    //{
                    ////    //    //if (defectFields == null)
                    ////    //    //{
                    ////    //    //    d.Tag = "";
                    ////    //    //}
                    ////    //    //else
                    ////    //    //{
                    ////    //    //    RectangleF rect = new RectangleF(d.Rect.Point_LU.X, d.Rect.Point_LU.Y, d.Rect.Width, d.Rect.Height);
                    ////    //    //    //var rectList = defectFields.Display.RectDict.Where(u => rect.IntersectsWith(u.Value)).ToList();
                    ////    //    //    //if (rectList.Count > 0)
                    ////    //    //    //{
                    ////    //    //    //    d.Tag = string.Join(" ", rectList.Select(u => u.Key).OrderBy(u => u));
                    ////    //    //    //}
                    ////    //    //    //else
                    ////    //    //    //{
                    ////    //    //    //    d.Tag = "";
                    ////    //    //    //}
                    ////    //    //}
                    ////    //});
                    ////}
                    //Bitmap originImage = new Bitmap(imageFileNames[i]);
                    //DetectResultSaveExcelAsync(detectResults, sn, originImage, DateTime.Now);
                }
            });
        }
        [ProcessMethod("printer", "printer", "打印机打印", InvokeType.TestInvoke)]
        public ResponseMessage Printer(IOperationConfig config, IDevice invokeDevice, IDevice sourceDevice)
@@ -560,6 +667,9 @@
            return specList;
        }
        protected void FillSpecResults(string pid, List<ISpec> detectSpec, List<double> results, string SEQUENCE)
        {
            detectSpec.ForEach(s =>