瀏覽代碼

202502281704

baowei 1 月之前
父節點
當前提交
7575b1d05b

+ 9 - 5
EInk.Lot3/Controllers/Lot3Controller.cs

@@ -17,6 +17,7 @@ using EInk.Lot2Lot3.Models;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Options;
 using System.Reflection;
+using DataAcquisition;
 
 namespace EInk.Controllers
 {
@@ -25,14 +26,13 @@ namespace EInk.Controllers
     public class Lot3Controller : ControllerBase
     {
         private readonly ISqlSugarClient _db;
-        private readonly IConfiguration _configuration;
+        private readonly IConfiguration _configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
         private readonly AppearancePixelEquivalent _appearancepixelequivalent;
         private readonly List<string> _Lot3AppearancePatternList;
 
         public Lot3Controller(ISqlSugarClient db)
         {
             _db = db;
-            _configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
             _appearancepixelequivalent = _configuration.GetSection("AppearancePixelEquivalent").Get<AppearancePixelEquivalent>();
             _Lot3AppearancePatternList = _configuration.GetValue<string>("Lot3AppearancePatternList").Split(",").ToList();
         }
@@ -40,10 +40,10 @@ namespace EInk.Controllers
         [HttpPost("UploadLot3")]
         public IActionResult Lot3Data([FromBody] Lot3Dto lot3Data)
         {
+            LogerHelper.RecordLogTxt($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} start,  guid:{lot3Data.id} ,slidesNumber:{lot3Data.slidesNumber}");
             string jsonStr = JsonConvert.SerializeObject(lot3Data);
             try
             {
-                LogerHelper.RecordLogTxt($"UploadLot3, Data:{jsonStr}");
                 try
                 {
                     lot3Data.Valid();
@@ -122,11 +122,13 @@ namespace EInk.Controllers
                 };
 
                 //根据guid查看是否为重复插入
-                if (_db.Ado.GetInt(string.Format("select count(*) from lot2lot3_info where lot_id='{0}'", lot3Data.id)) > 0 || lot3Data.slidesNumber == "NA")
+                if (GuidCache.GuidQueue.Contains(lot3Data.id) || lot3Data.slidesNumber == "NA")
                 {
                     lot3model.is_send = 3;
                 }
+                GuidCache.Add(lot3Data.id);
                 _db.Insertable(lot3model).ExecuteCommand();
+                LogerHelper.RecordLogTxt($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} end, guid:{lot3Data.id} ,slidesNumber:{lot3Data.slidesNumber}");
                 return Ok(ResultDto.Success());
             }
             catch (Exception ex)
@@ -229,10 +231,12 @@ namespace EInk.Controllers
                     };
 
                     //根据guid查看是否为重复插入
-                    if (_db.Ado.GetInt(string.Format("select count(*) from lot2lot3_info where lot_id='{0}'", Lot3item.id)) > 0 || Lot3item.slidesNumber == "NA")
+                    if (GuidCache.GuidQueue.Contains(Lot3item.id) || Lot3item.slidesNumber == "NA")
                     {
                         lot3model.is_send = 3;
                     }
+                    GuidCache.Add(Lot3item.id);
+
                     _db.Insertable(lot3model).ExecuteCommand();
                 }
                 _db.Ado.CommitTran();

+ 6 - 5
EInk.Lot3/Dtos/InitLot2DetailDto.cs

@@ -5,11 +5,12 @@
 
         public string ID { get; set; }
         public string Classification { get; set; }
-        public string ContourRect_X { get; set; }
-        public string ContourRect_Y { get; set; }
-        public string ContourRect_Width { get; set; }
-        public string ContourRect_Height { get; set; }
-        public string ContourRect_Area { get; set; }
+        public string CenterX { get; set; }
+        public string CenterY { get; set; }
+        public string SideXLength { get; set; }
+        public string SideYLength { get; set; }
+        //public string ContourRect_Area { get; set; }
+        public string Rotation { get; set; }
     }
 
 

+ 4 - 0
EInk.Lot3/Models/Lot2Lot3Model.cs

@@ -2,6 +2,10 @@
 
 namespace EInk.Models
 {
+    [SugarIndex("index_lot_id", nameof(lot_id), OrderByType.Asc)]
+    [SugarIndex("index_product_id", nameof(product_id), OrderByType.Asc)]
+    [SugarIndex("index_is_send", nameof(is_send), OrderByType.Asc)]
+
     [SugarTable("lot2lot3_info")]
     public class Lot2Lot3Model
     {

+ 39 - 58
EInk.Lot3/TaskThread/ReadLot2Thread.cs

@@ -45,17 +45,8 @@ namespace EInk.TaskThread
             {
                 try
                 {
-                    //int max_productid = _local_db.Ado.GetInt("select max(product_id) from lot2lot3_info");
                     List<InitLot2Model> read_list = new List<InitLot2Model>();
-                    read_list = _db.Queryable<InitLot2Model>().Where(x => x.id > product_startid).Where(x => (x.productno != null && x.station != null && x.pattern != null) && (x.result == "enOK" || x.result == "enNG")).OrderBy(x => x.id).Take(120).ToList();
-                    //if (product_startid == 0)
-                    //{
-                    //    read_list = _db.Queryable<InitLot2Model>().Where(x => x.id > max_productid).Where(x => (x.productno != null && x.station != null && x.pattern != null) && (x.result == "enOK" || x.result == "enNG")).OrderBy(x => x.id).Take(120).ToList();
-                    //}
-                    //else
-                    //{
-                    //    read_list = _db.Queryable<InitLot2Model>().Where(x => x.id >= product_startid).Where(x => x.id > max_productid).Where(x => (x.productno != null && x.station != null && x.pattern != null) && (x.result == "enOK" || x.result == "enNG")).Take(60).OrderBy(x => x.id).Take(120).ToList();
-                    //}
+                    read_list = _db.Queryable<InitLot2Model>().Where(x => x.id > product_startid).Where(x => (x.productno != null && x.station != null && x.pattern != null) ).OrderBy(x => x.id).Take(120).ToList();
                     if (read_list != null && read_list.Count > 0)
                     {
                         try
@@ -102,24 +93,20 @@ namespace EInk.TaskThread
                                     {
                                         foreach (var item in lot2JsonList)
                                         {
-                                            string defectCode = "null";
+                                            string defectCode = item.Classification;
                                             string defectName = "null";
                                             if (!string.IsNullOrEmpty(item.Classification.Trim()))
                                             {
                                                 List<DefectModel> defectCodelist = _local_db.SqlQueryable<DefectModel>("SELECT * FROM public.defect_info where classification ~* '" + item.Classification + "'").ToList();
-                                                //List<DefectModel> defectCodelist = _local_db.Queryable<DefectModel>().Where(x => x.defect_name == item.Classification).ToList();
                                                 if (defectCodelist != null && defectCodelist.Count != 0)
                                                 {
-                                                    foreach (var defect_info in defectCodelist)
+                                                    foreach (var item1 in defectCodelist)
                                                     {
-                                                        foreach (var defect_classification in defect_info.classification.Split(','))
+                                                        if (item1.classification.Split(',').Contains(item.Classification))
                                                         {
-                                                            if (item.Classification == defect_classification)
-                                                            {
-                                                                defectCode = defect_info.defect_code;
-                                                                defectName = defect_info.defect_name;
-                                                                break;
-                                                            }
+                                                            defectCode = item1.defect_code;
+                                                            defectName = item1.defect_name;
+                                                            break;
                                                         }
                                                     }
                                                 }
@@ -128,11 +115,12 @@ namespace EInk.TaskThread
                                             {
                                                 defectCode = defectCode,
                                                 defectName = defectName,
-                                                x = item.ContourRect_X,
-                                                y = item.ContourRect_Y,
-                                                width = item.ContourRect_Width,
-                                                height = item.ContourRect_Height,
-                                                area = item.ContourRect_Area
+                                                x = item.CenterX,
+                                                y = item.CenterY,
+                                                width = item.SideXLength,
+                                                height = item.SideYLength,
+                                                area = "0",
+                                                rotation = item.Rotation
                                             });
                                         }
                                     }
@@ -196,7 +184,7 @@ namespace EInk.TaskThread
                                                 Lot2ModelList[0].is_send = 3;
                                             }
                                         }
-                                        if (read_lot2.result == "enNG")
+                                        if (read_lot2.result != "enOK")
                                         {
                                             lot2Detail.result = "NG";
                                         }
@@ -212,24 +200,20 @@ namespace EInk.TaskThread
                                         {
                                             foreach (var item in lot2JsonList)
                                             {
-                                                string defectCode = "null";
+                                                string defectCode = item.Classification;
                                                 string defectName = "null";
                                                 if (!string.IsNullOrEmpty(item.Classification.Trim()))
                                                 {
                                                     List<DefectModel> defectCodelist = _local_db.SqlQueryable<DefectModel>("SELECT * FROM public.defect_info where classification ~* '" + item.Classification + "'").ToList();
-                                                    //List<DefectModel> defectCodelist = _local_db.Queryable<DefectModel>().Where(x => x.defect_name == item.Classification).ToList();
                                                     if (defectCodelist != null && defectCodelist.Count != 0)
                                                     {
-                                                        foreach (var defect_info in defectCodelist)
+                                                        foreach (var item1 in defectCodelist)
                                                         {
-                                                            foreach (var defect_classification in defect_info.classification.Split(','))
+                                                            if (item1.classification.Split(',').Contains(item.Classification))
                                                             {
-                                                                if (item.Classification == defect_classification)
-                                                                {
-                                                                    defectCode = defect_info.defect_code;
-                                                                    defectName = defect_info.defect_name;
-                                                                    break;
-                                                                }
+                                                                defectCode = item1.defect_code;
+                                                                defectName = item1.defect_name;
+                                                                break;
                                                             }
                                                         }
                                                     }
@@ -238,11 +222,12 @@ namespace EInk.TaskThread
                                                 {
                                                     defectCode = defectCode,
                                                     defectName = defectName,
-                                                    x = item.ContourRect_X,
-                                                    y = item.ContourRect_Y,
-                                                    width = item.ContourRect_Width,
-                                                    height = item.ContourRect_Height,
-                                                    area = item.ContourRect_Area
+                                                    x = item.CenterX,
+                                                    y = item.CenterY,
+                                                    width = item.SideXLength,
+                                                    height = item.SideYLength,
+                                                    area = "0",
+                                                    rotation = item.Rotation
                                                 });
                                             }
                                         }
@@ -273,24 +258,20 @@ namespace EInk.TaskThread
                                         {
                                             foreach (var item in lot2JsonList)
                                             {
-                                                string defectCode = "null";
+                                                string defectCode = item.Classification;
                                                 string defectName = "null";
                                                 if (!string.IsNullOrEmpty(item.Classification.Trim()))
                                                 {
                                                     List<DefectModel> defectCodelist = _local_db.SqlQueryable<DefectModel>("SELECT * FROM public.defect_info where classification ~* '" + item.Classification + "'").ToList();
-                                                    //List<DefectModel> defectCodelist = _local_db.Queryable<DefectModel>().Where(x => x.defect_name == item.Classification).ToList();
                                                     if (defectCodelist != null && defectCodelist.Count != 0)
                                                     {
-                                                        foreach (var defect_info in defectCodelist)
+                                                        foreach (var item1 in defectCodelist)
                                                         {
-                                                            foreach (var defect_classification in defect_info.classification.Split(','))
+                                                            if (item1.classification.Split(',').Contains(item.Classification))
                                                             {
-                                                                if (item.Classification == defect_classification)
-                                                                {
-                                                                    defectCode = defect_info.defect_code;
-                                                                    defectName = defect_info.defect_name;
-                                                                    break;
-                                                                }
+                                                                defectCode = item1.defect_code;
+                                                                defectName = item1.defect_name;
+                                                                break;
                                                             }
                                                         }
                                                     }
@@ -299,11 +280,12 @@ namespace EInk.TaskThread
                                                 {
                                                     defectCode = defectCode,
                                                     defectName = defectName,
-                                                    x = item.ContourRect_X,
-                                                    y = item.ContourRect_Y,
-                                                    width = item.ContourRect_Width,
-                                                    height = item.ContourRect_Height,
-                                                    area = item.ContourRect_Area
+                                                    x = item.CenterX,
+                                                    y = item.CenterY,
+                                                    width = item.SideXLength,
+                                                    height = item.SideYLength,
+                                                    area = "0",
+                                                    rotation = item.Rotation
                                                 });
                                             }
                                         }
@@ -321,7 +303,6 @@ namespace EInk.TaskThread
                                         _local_db.Insertable(lot2model).ExecuteCommand();
                                     }
                                 }
-                                Thread.Sleep(200);
                             }
                             _local_db.Ado.CommitTran();
                             _configuration.GetValue<int>("ProductStartID");
@@ -339,7 +320,7 @@ namespace EInk.TaskThread
                 }
                 finally
                 {
-                    Thread.Sleep(10000);
+                    Thread.Sleep(500);
                 }
             }
 

+ 70 - 0
EInk.Lot3/Tools/GuidCache.cs

@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using SqlSugar;
+using EInk.Models;
+
+namespace DataAcquisition
+{
+    public class GuidCache
+    {
+        public static Queue<string> GuidQueue = new Queue<string>();
+
+        private static int capacity = 3000;
+
+        private static IConfigurationRoot config = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build();
+
+        private static ISqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
+        {
+            DbType = SqlSugar.DbType.PostgreSQL,
+            ConnectionString = config.GetValue<string>("LocalDbConnectionString"),
+            IsAutoCloseConnection = true
+        });
+
+        public static void GetGuidCache()
+        {
+            DateTime endtime = DateTime.Now;
+            endtime = endtime.AddHours(-6);
+            var QueryResult = db.Queryable<Lot2Lot3Model>().Where(x => x.create_time >= endtime).OrderBy(x => x.create_time).Select(it => it.lot_id).ToList();//返回guid字段
+            if (QueryResult != null && QueryResult.Count != 0)
+            {
+                if (QueryResult.Count < capacity)
+                {
+                    GuidQueue = new Queue<string>(QueryResult);
+                }
+                else
+                {
+                    GuidQueue = new Queue<string>(QueryResult.GetRange(QueryResult.Count - capacity, capacity));
+                }
+            }
+        }
+
+        public static bool ContainVerification(string guid)
+        {
+            if (GuidQueue.Contains(guid))
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        public static void Add(string guid)
+        {
+            if (GuidQueue.Count() >= capacity)
+            {
+                int i = GuidQueue.Count() - capacity + 1;
+                for (; i > 0; i--)
+                {
+                    GuidQueue.Dequeue();
+                }
+            }
+            GuidQueue.Enqueue(guid);
+        }
+    }
+}

+ 6 - 8
EInk.Lot3/appsettings.json

@@ -17,19 +17,17 @@
     }
   },
   "LocalDbConnectionString": "Host=127.0.0.1;Port=5432;Database=Eink;Username=postgres;Password=eink;",
-  //"TargetDbConnectionString": "Host=127.0.0.1;Port=5432;Database=targetdb;Username=postgres;Password=eink;",
-  //"TargetDbConnectionString": "Host=192.168.1.108;Port=5432;Database=eink;Username=postgres;Password=eink;",
-  "TargetDbConnectionString": "",
-  "ProductStartID": 0,
+  "TargetDbConnectionString": "Host=127.0.0.1;Port=5432;Database=Line10Lot2;Username=postgres;Password=eink;",
+  "ProductStartID": 3871260,
   "MesUrl": "http://eyzms.toc.eink.com:8088",
   "MesUrlTime": 30,
   "DaysAgo": 60,
-  "Topic": "LOT2AOIData#04#04-2AOI01",
-  "ReadLot2Thread": false,
+  "Topic": "AOIData#10#10-2AOI01",
+  "ReadLot2Thread": true,
   "SendLot2Lot3Thread": false,
   "SendColourCastThread": false,
-  "DeleteDBRecordThread": true,
-  "Lot2PatternList": "wht,dot",
+  "DeleteDBRecordThread": false,
+  "Lot2PatternList": "White,DotA,Black",
   "Lot3AppearancePatternList": "PositiveAppearance,BackAppearance,BackFPC,PositiveFPC",
   "Lot3ScreenPatternList": "F_Gray_PL1,F_Red_PL1,F_White_PL1,M_Gray_PL1,M_Red_PL1,M_White_PL1",
   "AppearancePixelEquivalent": {

+ 24 - 0
Eink.AOIDefectAnalysis/Eink.AOIDefectAnalysis.csproj

@@ -0,0 +1,24 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>WinExe</OutputType>
+    <TargetFramework>net6.0-windows</TargetFramework>
+    <Nullable>enable</Nullable>
+    <UseWindowsForms>true</UseWindowsForms>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <AllowUnsafeBlocks>True</AllowUnsafeBlocks>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <None Remove="Image\gradient-palette.jpg" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Include="Image\gradient-palette.jpg" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\EInk.Lot3\EInk.Lot2Lot3.csproj" />
+  </ItemGroup>
+
+</Project>

+ 258 - 0
Eink.AOIDefectAnalysis/Form1.Designer.cs

@@ -0,0 +1,258 @@
+namespace Eink.AOIDefectAnalysis
+{
+    partial class Form1
+    {
+        /// <summary>
+        ///  Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        ///  Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        ///  Required method for Designer support - do not modify
+        ///  the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            panel1 = new Panel();
+            panel2 = new Panel();
+            generateBtn = new Button();
+            clearBtn = new Button();
+            label1 = new Label();
+            label2 = new Label();
+            startNUD = new NumericUpDown();
+            numNUD = new NumericUpDown();
+            label3 = new Label();
+            label4 = new Label();
+            label5 = new Label();
+            label6 = new Label();
+            dataGridView1 = new DataGridView();
+            Index = new DataGridViewTextBoxColumn();
+            createTime = new DataGridViewTextBoxColumn();
+            slidesNumber = new DataGridViewTextBoxColumn();
+            Result = new DataGridViewTextBoxColumn();
+            ((System.ComponentModel.ISupportInitialize)startNUD).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)numNUD).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)dataGridView1).BeginInit();
+            SuspendLayout();
+            // 
+            // panel1
+            // 
+            panel1.Location = new Point(12, 86);
+            panel1.Name = "panel1";
+            panel1.Size = new Size(480, 360);
+            panel1.TabIndex = 0;
+            // 
+            // panel2
+            // 
+            panel2.Location = new Point(510, 86);
+            panel2.Name = "panel2";
+            panel2.Size = new Size(480, 360);
+            panel2.TabIndex = 1;
+            // 
+            // generateBtn
+            // 
+            generateBtn.Location = new Point(748, 39);
+            generateBtn.Name = "generateBtn";
+            generateBtn.Size = new Size(96, 27);
+            generateBtn.TabIndex = 2;
+            generateBtn.Text = "生成";
+            generateBtn.UseVisualStyleBackColor = true;
+            generateBtn.Click += generateBtn_Click;
+            // 
+            // clearBtn
+            // 
+            clearBtn.Location = new Point(869, 39);
+            clearBtn.Name = "clearBtn";
+            clearBtn.Size = new Size(96, 27);
+            clearBtn.TabIndex = 3;
+            clearBtn.Text = "清空";
+            clearBtn.UseVisualStyleBackColor = true;
+            clearBtn.Click += clearBtn_Click;
+            // 
+            // label1
+            // 
+            label1.AutoSize = true;
+            label1.Location = new Point(47, 18);
+            label1.Name = "label1";
+            label1.Size = new Size(56, 20);
+            label1.TabIndex = 4;
+            label1.Text = "Sum:";
+            // 
+            // label2
+            // 
+            label2.AutoSize = true;
+            label2.Location = new Point(109, 18);
+            label2.Name = "label2";
+            label2.Size = new Size(18, 20);
+            label2.TabIndex = 5;
+            label2.Text = "0";
+            // 
+            // startNUD
+            // 
+            startNUD.Location = new Point(109, 49);
+            startNUD.Maximum = new decimal(new int[] { 99999, 0, 0, 0 });
+            startNUD.Name = "startNUD";
+            startNUD.Size = new Size(87, 27);
+            startNUD.TabIndex = 6;
+            startNUD.Value = new decimal(new int[] { 1, 0, 0, 0 });
+            // 
+            // numNUD
+            // 
+            numNUD.Location = new Point(280, 49);
+            numNUD.Maximum = new decimal(new int[] { 99999, 0, 0, 0 });
+            numNUD.Name = "numNUD";
+            numNUD.Size = new Size(61, 27);
+            numNUD.TabIndex = 7;
+            numNUD.Value = new decimal(new int[] { 100, 0, 0, 0 });
+            // 
+            // label3
+            // 
+            label3.AutoSize = true;
+            label3.Location = new Point(215, 52);
+            label3.Name = "label3";
+            label3.Size = new Size(59, 20);
+            label3.TabIndex = 8;
+            label3.Text = "Num:";
+            // 
+            // label4
+            // 
+            label4.AutoSize = true;
+            label4.Location = new Point(44, 52);
+            label4.Name = "label4";
+            label4.Size = new Size(59, 20);
+            label4.TabIndex = 0;
+            label4.Text = "Start:";
+            // 
+            // label5
+            // 
+            label5.AutoSize = true;
+            label5.Location = new Point(277, 18);
+            label5.Name = "label5";
+            label5.Size = new Size(18, 20);
+            label5.TabIndex = 10;
+            label5.Text = "0";
+            // 
+            // label6
+            // 
+            label6.AutoSize = true;
+            label6.Location = new Point(215, 18);
+            label6.Name = "label6";
+            label6.Size = new Size(55, 20);
+            label6.TabIndex = 9;
+            label6.Text = "Max:";
+            // 
+            // dataGridView1
+            // 
+            dataGridView1.AllowUserToAddRows = false;
+            dataGridView1.AllowUserToDeleteRows = false;
+            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+            dataGridView1.Columns.AddRange(new DataGridViewColumn[] { Index, createTime, slidesNumber, Result });
+            dataGridView1.Location = new Point(12, 462);
+            dataGridView1.Name = "dataGridView1";
+            dataGridView1.ReadOnly = true;
+            dataGridView1.RowHeadersWidth = 51;
+            dataGridView1.RowTemplate.Height = 29;
+            dataGridView1.Size = new Size(978, 360);
+            dataGridView1.TabIndex = 12;
+            dataGridView1.CellMouseClick += dataGridView1_CellMouseClick;
+            // 
+            // Index
+            // 
+            Index.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
+            Index.HeaderText = "序号";
+            Index.MinimumWidth = 6;
+            Index.Name = "Index";
+            Index.ReadOnly = true;
+            Index.Width = 68;
+            // 
+            // createTime
+            // 
+            createTime.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
+            createTime.HeaderText = "时间";
+            createTime.MinimumWidth = 6;
+            createTime.Name = "createTime";
+            createTime.ReadOnly = true;
+            createTime.Width = 68;
+            // 
+            // slidesNumber
+            // 
+            slidesNumber.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
+            slidesNumber.HeaderText = "片号";
+            slidesNumber.MinimumWidth = 6;
+            slidesNumber.Name = "slidesNumber";
+            slidesNumber.ReadOnly = true;
+            slidesNumber.Width = 68;
+            // 
+            // Result
+            // 
+            Result.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
+            Result.HeaderText = "结果";
+            Result.MinimumWidth = 6;
+            Result.Name = "Result";
+            Result.ReadOnly = true;
+            Result.Width = 68;
+            // 
+            // Form1
+            // 
+            AutoScaleDimensions = new SizeF(9F, 20F);
+            AutoScaleMode = AutoScaleMode.Font;
+            ClientSize = new Size(1002, 830);
+            Controls.Add(dataGridView1);
+            Controls.Add(label5);
+            Controls.Add(label6);
+            Controls.Add(label4);
+            Controls.Add(label3);
+            Controls.Add(numNUD);
+            Controls.Add(startNUD);
+            Controls.Add(label2);
+            Controls.Add(label1);
+            Controls.Add(clearBtn);
+            Controls.Add(generateBtn);
+            Controls.Add(panel2);
+            Controls.Add(panel1);
+            Name = "Form1";
+            Text = "Form1";
+            Load += Form1_Load;
+            ((System.ComponentModel.ISupportInitialize)startNUD).EndInit();
+            ((System.ComponentModel.ISupportInitialize)numNUD).EndInit();
+            ((System.ComponentModel.ISupportInitialize)dataGridView1).EndInit();
+            ResumeLayout(false);
+            PerformLayout();
+        }
+
+        #endregion
+
+        private Panel panel1;
+        private Panel panel2;
+        private Button generateBtn;
+        private Button clearBtn;
+        private Label label1;
+        private Label label2;
+        private NumericUpDown startNUD;
+        private NumericUpDown numNUD;
+        private Label label3;
+        private Label label4;
+        private Label label5;
+        private Label label6;
+        private DataGridView dataGridView1;
+        private DataGridViewTextBoxColumn Index;
+        private DataGridViewTextBoxColumn createTime;
+        private DataGridViewTextBoxColumn slidesNumber;
+        private DataGridViewTextBoxColumn Result;
+    }
+}

+ 298 - 0
Eink.AOIDefectAnalysis/Form1.cs

@@ -0,0 +1,298 @@
+using System;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using System.Windows.Forms;
+using EInk.Dtos;
+using EInk.Models;
+using Newtonsoft.Json;
+using SqlSugar;
+using SqlSugar.Extensions;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.Rebar;
+
+namespace Eink.AOIDefectAnalysis
+{
+    public partial class Form1 : Form
+    {
+        private List<HeatPoint> HeatPoints = new List<HeatPoint>();
+        Bitmap bMap;
+        Bitmap bMap_New;
+        ISqlSugarClient db;
+        List<Lot2Lot3Model> Lot2DataList;
+        private int Intense = 25;
+        private int drift_x;
+        private int drift_y;
+
+        public Form1()
+        {
+            InitializeComponent();
+            Reset();
+            db = new SqlSugarClient(new ConnectionConfig()
+            {
+                DbType = DbType.PostgreSQL,
+                ConnectionString = "Host=127.0.0.1;Port=5432;Database=Eink;Username=postgres;Password=eink;",
+                IsAutoCloseConnection = true
+            });
+            drift_x = panel1.Width / 2;
+            drift_y = panel1.Height / 2;
+        }
+
+        private void generateBtn_Click(object sender, EventArgs e)
+        {
+            Reset();
+            for (int i = (int)startNUD.Value - 1; i < (int)startNUD.Value + (int)numNUD.Value - 1; i++)
+            {
+                Lot2Lot3Dto? lot2lot3 = JsonConvert.DeserializeObject<Lot2Lot3Dto>(Lot2DataList[i].content);
+                if (lot2lot3 != null && lot2lot3.result == "NG" && !generate_Picture(lot2lot3))
+                {
+                    dataGridView1.Rows.Add(new string[] { (i + 1).ToString(), lot2lot3.createTime, lot2lot3.slidesNumber, lot2lot3.result });
+                }
+            }
+        }
+
+        private void clearBtn_Click(object sender, EventArgs e)
+        {
+            HeatPoints.Clear();
+            bMap = new Bitmap((int)panel1.Width, (int)panel1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+            using (Graphics g = Graphics.FromImage(bMap))
+            {
+                g.Clear(System.Drawing.Color.White);
+            }
+            bMap_New = new Bitmap((int)panel1.Width, (int)panel1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+            UpdateView();
+        }
+
+        private void UpdateView()
+        {
+            // 生成灰度热力图
+            bMap_New = CreateIntensityMask(bMap_New, HeatPoints);
+            var bMap_byte_new = BitmapToByteArray(bMap_New);
+            var bMap_byte = BitmapToByteArray(bMap);
+            for (int i = 0; i < bMap_byte_new.Length; i++)
+            {
+                if (bMap_byte_new[i] != 255)
+                {
+                    bMap_byte_new[i] = (byte)(255 - Intense);
+                    bMap_byte[i] = (byte)(bMap_byte[i] - Intense);
+                }
+            }
+            label5.Text = ((255 - bMap_byte.Min()) / Intense).ToString();
+            bMap = ByteArrayToBitmap(bMap_byte, bMap.Width, bMap.Height);
+            bMap_New = bMap;
+            panel1.BackgroundImage = bMap_New;
+            // 上色
+            bMap_New = Colorize(bMap_New, 255);
+            panel2.BackgroundImage = bMap_New;
+        }
+
+        private Bitmap CreateIntensityMask(Bitmap bSurface, List<HeatPoint> aHeatPoints)
+        {
+            using (Graphics DrawSurface = Graphics.FromImage(bSurface))
+            {
+                DrawSurface.Clear(System.Drawing.Color.White);
+                foreach (HeatPoint DataPoint in aHeatPoints)
+                {
+                    DrawHeatPoint(DrawSurface, DataPoint); // 绘制单色矩形
+                }
+            }
+            return bSurface;
+        }
+
+        private void DrawHeatPoint(Graphics Canvas, HeatPoint HeatPoint)
+        {
+            // 定义矩形区域
+            Rectangle rect = new Rectangle(
+                HeatPoint.X - HeatPoint.Width / 2,
+                HeatPoint.Y - HeatPoint.Height / 2,
+                HeatPoint.Width,
+                HeatPoint.Height
+            );
+
+            // 创建图形路径
+            using (GraphicsPath path = new GraphicsPath())
+            {
+                path.AddRectangle(rect);
+                // 创建路径渐变笔刷
+                using (PathGradientBrush brush = new PathGradientBrush(path))
+                {
+                    var state = Canvas.Save();
+                    // 设置中心颜色(保留原始透明度)
+                    System.Drawing.Color centerColor = System.Drawing.Color.FromArgb(HeatPoint.Intensity, System.Drawing.Color.Black);
+                    brush.CenterColor = centerColor;
+
+                    //设置边缘颜色为完全透明
+                    System.Drawing.Color[] surroundColors = { System.Drawing.Color.Transparent };
+                    brush.SurroundColors = surroundColors;
+
+                    //设置渐变焦点(控制渐变范围)
+                    brush.FocusScales = new PointF(0.6f, 1f); // 控制虚化范围
+
+                    // 保存绘图状态
+
+                    // 坐标变换
+                    Canvas.TranslateTransform(HeatPoint.X, HeatPoint.Y);
+                    Canvas.RotateTransform(-HeatPoint.Rotation);
+                    Canvas.TranslateTransform(-HeatPoint.X, -HeatPoint.Y);
+
+                    // 填充路径
+                    Canvas.FillPath(brush, path);
+
+                    // 恢复绘图状态
+                    Canvas.Restore(state);
+                }
+            }
+
+        }
+
+        public static Bitmap Colorize(Bitmap Mask, byte Alpha)
+        {
+            Bitmap Output = new Bitmap(Mask.Width, Mask.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+            Graphics Surface = Graphics.FromImage(Output);
+            Surface.Clear(System.Drawing.Color.Transparent);
+
+            // 构建一组颜色映射以将我们的灰度蒙版重新映射为全色
+            // 接受一个 alpha 字节来指定输出图像的透明度
+            ColorMap[] Colors = CreatePaletteIndex(Alpha);
+
+            // 创建新的图像属性类来处理颜色重新映射
+            // 注入我们的颜色映射数组来指示图像属性类如何进行着色
+            ImageAttributes Remapper = new ImageAttributes();
+            Remapper.SetRemapTable(Colors);
+
+            // 使用新的颜色映射方案将我们的蒙版绘制到我们的内存位图工作表面上
+            Surface.DrawImage(Mask, new System.Drawing.Rectangle(0, 0, Mask.Width, Mask.Height), 0, 0, Mask.Width, Mask.Height, GraphicsUnit.Pixel, Remapper);
+            return Output;
+        }
+
+        private static ColorMap[] CreatePaletteIndex(byte Alpha)
+        {
+            ColorMap[] OutputMap = new ColorMap[256];
+
+            Assembly myAssembly = Assembly.GetExecutingAssembly();
+            Stream myStream = myAssembly.GetManifestResourceStream("Eink.AOIDefectAnalysis.Image.gradient-palette.jpg");
+            Bitmap Palette = new Bitmap(myStream);
+            for (int X = 0; X <= 255; X++)
+            {
+                OutputMap[X] = new ColorMap();
+                OutputMap[X].OldColor = System.Drawing.Color.FromArgb(X, X, X);
+                OutputMap[X].NewColor = System.Drawing.Color.FromArgb(Alpha, Palette.GetPixel(X, 0));
+            }
+            return OutputMap;
+        }
+
+        private void Form1_Load(object sender, EventArgs e)
+        {
+            dataGridView1.RowsDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
+
+            Lot2DataList = db.Queryable<Lot2Lot3Model>().Where(x => x.create_time >= DateTime.Parse($"2025-02-26 08:00:00")).ToList();
+            label2.Text = Lot2DataList.Count.ToString();
+        }
+
+        public byte[] BitmapToByteArray(Bitmap bmp)
+        {
+            BitmapData bitmapData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
+                ImageLockMode.ReadOnly, bmp.PixelFormat);
+            // 计算Byte[]数组的大小
+            int bytesCount = bitmapData.Stride * bitmapData.Height;
+            byte[] bmp_byte = new byte[bytesCount];
+
+            // 将像素数据复制到Byte[]数组
+            System.Runtime.InteropServices.Marshal.Copy(bitmapData.Scan0, bmp_byte, 0, bytesCount);
+            // 释放资源
+            bmp.UnlockBits(bitmapData);
+            return bmp_byte;
+        }
+
+        private Bitmap ByteArrayToBitmap(byte[] rgbaData, int width, int height)
+        {
+            var pixelFormat = PixelFormat.Format32bppArgb;
+            Bitmap bitmap = new Bitmap(width, height, pixelFormat);
+
+            BitmapData bitmapData = bitmap.LockBits(
+                new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height),
+                ImageLockMode.WriteOnly,
+                pixelFormat);
+
+            IntPtr intPtr = bitmapData.Scan0;
+            System.Runtime.InteropServices.Marshal.Copy(rgbaData, 0, intPtr, rgbaData.Length);
+            bitmap.UnlockBits(bitmapData);
+
+            return bitmap;
+        }
+
+        private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
+        {
+            HeatPoints.Clear();
+            bMap = new Bitmap((int)panel1.Width, (int)panel1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+            using (Graphics g = Graphics.FromImage(bMap))
+            {
+                g.Clear(System.Drawing.Color.White);
+            }
+            bMap_New = new Bitmap((int)panel1.Width, (int)panel1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+            UpdateView();
+
+
+            var dataGridViewRow = dataGridView1.CurrentRow;
+            int index = dataGridViewRow.Cells["Index"].Value.ObjToInt();
+            Lot2Lot3Dto? lot2lot3 = JsonConvert.DeserializeObject<Lot2Lot3Dto>(Lot2DataList[index - 1].content);
+            if (lot2lot3 != null && lot2lot3.result == "NG")
+            {
+                generate_Picture(lot2lot3);
+            }
+        }
+
+        private bool generate_Picture(Lot2Lot3Dto lot2lot3)
+        {
+            bool skipflag = false;
+            foreach (var itemCheckData in lot2lot3.itemCheckDatas)
+            {
+                if (skipflag || itemCheckData.details.Count >= 150)
+                {
+                    skipflag = true;
+                    continue;
+                }
+                foreach (var detail in itemCheckData.details)
+                {
+
+                    try
+                    {
+                        int iX = (int)(Convert.ToDouble(detail.x) * 3 / 2 + drift_x);
+                        int iY = (int)(Convert.ToDouble(detail.y) * 3 / 2 + drift_y);
+                        int Width = (int)(Convert.ToDouble(detail.width) * 3 / 2);
+                        int iWidth = Width <= 5 ? 5 : Width;
+                        int Height = (int)(Convert.ToDouble(detail.height) * 3 / 2);
+                        int iHeight = Height < 5 ? 5 : Height;
+                        byte iIntense = (byte)Intense;
+                        float iRotation = float.Parse(detail.rotation);
+                        HeatPoints.Add(new HeatPoint(iX, iY, iWidth, iHeight, iIntense, iRotation));
+                    }
+                    catch (Exception)
+                    {
+                        continue;
+                    }
+                }
+            }
+            if (!skipflag)
+            {
+                UpdateView();
+                HeatPoints.Clear();
+            }
+            return skipflag;
+        }
+
+        private void Reset()
+        {
+            HeatPoints.Clear();
+            dataGridView1.Rows.Clear();
+            bMap = new Bitmap((int)panel1.Width, (int)panel1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+            using (Graphics g = Graphics.FromImage(bMap))
+            {
+                g.Clear(System.Drawing.Color.White);
+            }
+            bMap_New = new Bitmap((int)panel1.Width, (int)panel1.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
+        }
+
+    }
+}

+ 132 - 0
Eink.AOIDefectAnalysis/Form1.resx

@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!--
+    Microsoft ResX Schema
+
+    Version 2.0
+
+    The primary goals of this format is to allow a simple XML format
+    that is mostly human readable. The generation and parsing of the
+    various data types are done through the TypeConverter classes
+    associated with the data types.
+
+    Example:
+
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+
+    There are any number of "resheader" rows that contain simple
+    name/value pairs.
+
+    Each data row contains a name, and value. The row also contains a
+    type or mimetype. Type corresponds to a .NET class that support
+    text/value conversion through the TypeConverter architecture.
+    Classes that don't support this are serialized and stored with the
+    mimetype set.
+
+    The mimetype is used for serialized objects, and tells the
+    ResXResourceReader how to depersist the object. This is currently not
+    extensible. For a given mimetype the value must be set accordingly:
+
+    Note - application/x-microsoft.net.object.binary.base64 is the format
+    that the ResXResourceWriter will generate, however the reader can
+    read any of the formats listed below.
+
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <metadata name="Index.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="createTime.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="slidesNumber.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+  <metadata name="Result.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
+    <value>True</value>
+  </metadata>
+</root>

+ 27 - 0
Eink.AOIDefectAnalysis/HeatPoint.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Eink.AOIDefectAnalysis
+{
+    class HeatPoint
+    {
+        public int X;
+        public int Y;
+        public int Width;
+        public int Height;
+        public float Rotation;
+        public byte Intensity;
+        public HeatPoint(int iX, int iY, int iWidth, int iHeight, byte bIntensity,float iRotation)
+        {
+            X = iX;
+            Y = iY;
+            Width = iWidth;
+            Height = iHeight;
+            Rotation = iRotation;
+            Intensity = bIntensity;
+        }
+    }
+}

二進制
Eink.AOIDefectAnalysis/Image/gradient-palette.jpg


二進制
Eink.AOIDefectAnalysis/Image/gradient-paletteold.jpg


+ 17 - 0
Eink.AOIDefectAnalysis/Program.cs

@@ -0,0 +1,17 @@
+namespace Eink.AOIDefectAnalysis
+{
+    internal static class Program
+    {
+        /// <summary>
+        ///  The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            // To customize application configuration such as set high DPI settings or default font,
+            // see https://aka.ms/applicationconfiguration.
+            ApplicationConfiguration.Initialize();
+            Application.Run(new Form1());
+        }
+    }
+}

+ 6 - 0
Eink.sln

@@ -5,6 +5,8 @@ VisualStudioVersion = 17.10.35013.160
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EInk.Lot2Lot3", "EInk.Lot3\EInk.Lot2Lot3.csproj", "{0C0961A1-494F-4FFC-82B9-1623AA58F174}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Eink.AOIDefectAnalysis", "Eink.AOIDefectAnalysis\Eink.AOIDefectAnalysis.csproj", "{DB51AE8F-4FFD-4E24-9508-A83CB808223D}"
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Any CPU = Debug|Any CPU
@@ -15,6 +17,10 @@ Global
 		{0C0961A1-494F-4FFC-82B9-1623AA58F174}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0C0961A1-494F-4FFC-82B9-1623AA58F174}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0C0961A1-494F-4FFC-82B9-1623AA58F174}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DB51AE8F-4FFD-4E24-9508-A83CB808223D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DB51AE8F-4FFD-4E24-9508-A83CB808223D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DB51AE8F-4FFD-4E24-9508-A83CB808223D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DB51AE8F-4FFD-4E24-9508-A83CB808223D}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE