LabelingPosition.cs 14.0 KB
using Model;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DeviceLibrary.AutoScanAndLabel
{
    public static class LabelingPosition
    {
        //public static Point MultipleChoiceLabeling(LabelParam labelParam, Point centrality, out int angle,out Bitmap bitmaps)
        //{
        //    //7寸XY偏移量
        //    int Xpianyilian_7 = ConfigHelper.Config.Get<int>("Labeling_Xpianyilian_7", 0);
        //    int Ypianyilian_7 = ConfigHelper.Config.Get<int>("Labeling_Ypianyilian_7", 0);
        //    //13寸XY偏移量
        //    int Xpianyilian_13 = ConfigHelper.Config.Get<int>("Labeling_Xpianyilian_13", 0);
        //    int Ypianyilian_13 = ConfigHelper.Config.Get<int>("Labeling_Ypianyilian_13", 0);
        //    //15寸XY偏移量
        //    int Xpianyilian_15 = ConfigHelper.Config.Get<int>("Labeling_Xpianyilian_15", 0);
        //    int Ypianyilian_15 = ConfigHelper.Config.Get<int>("Labeling_Ypianyilian_15", 0);
        //    //7寸朝那个方向贴标true顺时针,false逆时针
        //    bool istoward_7 = ConfigHelper.Config.Get<bool>("Labeling_istoward_7", true);
        //    int degree_7 = ConfigHelper.Config.Get<int>("Labeling_degree_7", 90);
        //    //13寸朝那个方向贴标true顺时针,false逆时针
        //    bool istoward_13 = ConfigHelper.Config.Get<bool>("Labeling_istoward_13", true);
        //    int degree_13 = ConfigHelper.Config.Get<int>("Labeling_degree_13", 90);
        //    //15寸朝那个方向贴标true顺时针,false逆时针
        //    bool istoward_15 = ConfigHelper.Config.Get<bool>("Labeling_istoward_15", true);
        //    int degree_15 = ConfigHelper.Config.Get<int>("Labeling_degree_15", 90);
        //    //7寸标签旋转多少度
        //    int Scalerotationdegree_7 = ConfigHelper.Config.Get<int>("Labeling_Scalerotationdegree_7", 90);
        //    //13寸标签旋转多少度
        //    int Scalerotationdegree_13 = ConfigHelper.Config.Get<int>("Labeling_Scalerotationdegree_13", 90);
        //    //15寸标签旋转多少度
        //    int Scalerotationdegree_15 = ConfigHelper.Config.Get<int>("Labeling_Scalerotationdegree_15", 90);
        //    #region 数据            
        //    //标签位置
        //    SolidBrush blue = new SolidBrush(Color.DarkBlue);
        //    //料盘中心点
        //    SolidBrush red = new SolidBrush(Color.Red);
        //    //贴标位置
        //    SolidBrush yeelow = new SolidBrush(Color.Yellow);
        //    Bitmap srcbitmap;
        //    if (File.Exists(labelParam.bitmapfilename))
        //    {
        //        srcbitmap = new Bitmap(labelParam.bitmapfilename);
        //    }
        //    else
        //    {
        //        srcbitmap = new Bitmap(3648, 3648);
        //    }
        //    Bitmap bitmap = new Bitmap(srcbitmap);
        //    Graphics g = Graphics.FromImage(bitmap);
        //    Size pointsize = new Size(60, 60);
        //    g.FillEllipse(red, new Rectangle(centrality, pointsize));

        //    int idenx = 0; //Array.FindIndex(labelParam.AMatch, x => x);
        //    if (idenx == -1)
        //    {
        //        idenx = 0;
        //    }
        //    int angles = (int)labelParam.codeInfos[idenx].Orientation;
        //    Point CalPoint = new Point(labelParam.codeInfos[idenx].X, labelParam.codeInfos[idenx].Y);
        //    g.FillEllipse(blue, new Rectangle(CalPoint, pointsize));
        //    #endregion
        //    LogNet.log.Info($"标签坐标x={CalPoint.X},y={CalPoint.Y},中心点x={centrality.X},y={centrality.Y}");
        //    Point point = new Point();
        //    switch (labelParam.PlateW)
        //    {
        //        case 13:
        //            point = LabelingAngle_13(CalPoint, centrality, out angle);
        //            break;
        //        case 15:
        //            point = LabelingAngle_15(CalPoint, centrality, out angle);
        //            break;
        //        default:
        //            point = LabelingAngle_7(CalPoint, centrality, out angle);
        //            break;
        //    }

        //    g.FillEllipse(yeelow, new Rectangle(point, pointsize));
        //    g.Save();
        //    g.Dispose();
        //    ImageSave(bitmap);
        //    bitmaps = bitmap;
        //    return point;
        //}

        public static Point MultipleChoiceLabeling_new(string pathfile,string name,Point point,Point centrality, out Bitmap bitmaps)
        {        
            #region 数据            
            //标签位置
            SolidBrush blue = new SolidBrush(Color.DarkBlue);
            //料盘中心点
            SolidBrush red = new SolidBrush(Color.Red);
            //贴标位置
            SolidBrush yeelow = new SolidBrush(Color.Yellow);
            Bitmap srcbitmap;
            if (File.Exists(pathfile))
            {
                srcbitmap = new Bitmap(pathfile);
            }
            else
            {
                srcbitmap = new Bitmap(3648, 3648);
            }
            Bitmap bitmap = new Bitmap(srcbitmap);
            Graphics g = Graphics.FromImage(bitmap);
            Size pointsize = new Size(60, 60);
            g.FillEllipse(red, new Rectangle(centrality, pointsize));

            Point CalPoint = new Point(point.X, point.Y);
            g.FillEllipse(blue, new Rectangle(CalPoint, pointsize));
            #endregion
            LogNet.log.Info($"标签坐标x={CalPoint.X},y={CalPoint.Y},中心点x={centrality.X},y={centrality.Y}");
            Point point_new = new Point();          

            g.FillEllipse(yeelow, new Rectangle(point, pointsize));
            g.Save();
            g.Dispose();
            ImageSave(bitmap);
            bitmaps = bitmap;
            return point;
        }

        public static Point LabelingAngle(string name,Point lable, Point centrality, out int angle)
        {
            //7寸XY偏移量
            int Xpianyilian_7 = ConfigHelper.Config.Get<int>("Labeling_Xpianyilian_7", 100);
            int Ypianyilian_7 = ConfigHelper.Config.Get<int>("Labeling_Ypianyilian_7", 100);
            //7寸朝那个方向贴标true顺时针,false逆时针
            bool istoward_7 = ConfigHelper.Config.Get<bool>("Labeling_istoward_7", true);
            int degree_7 = ConfigHelper.Config.Get<int>("Labeling_degree_7", 90);
            //7寸标签旋转多少度
            int Scalerotationdegree_7 = ConfigHelper.Config.Get<int>("Labeling_Scalerotationdegree_7", 90);
            Point point = lable;
            LogNet.log.Info($"7寸料盘,原标签角度={lable};中心点={centrality};");
            if (istoward_7)
            {
                point = ClockwiseRotation(lable, centrality, degree_7);
            }
            else
            {
                point = CounterclockwiseRotation(lable, centrality, degree_7);
            }
            Point Newpoint = new Point(point.X + Xpianyilian_7, point.Y + Ypianyilian_7);
            LogNet.log.Info($"7寸料盘,xy轴偏移后位置,x={Newpoint.X},y={Newpoint.Y}");
            angle = Scalerotationdegree_7;
            return Newpoint;
        }
        public static Point LabelingAngle_7(Point lable, Point centrality, out int angle)
        {
            //7寸XY偏移量
            int Xpianyilian_7 = ConfigHelper.Config.Get<int>("Labeling_Xpianyilian_7", 100);
            int Ypianyilian_7 = ConfigHelper.Config.Get<int>("Labeling_Ypianyilian_7", 100);
            //7寸朝那个方向贴标true顺时针,false逆时针
            bool istoward_7 = ConfigHelper.Config.Get<bool>("Labeling_istoward_7", true);
            int degree_7 = ConfigHelper.Config.Get<int>("Labeling_degree_7", 90);
            //7寸标签旋转多少度
            int Scalerotationdegree_7 = ConfigHelper.Config.Get<int>("Labeling_Scalerotationdegree_7", 90);
            Point point = lable;
            LogNet.log.Info($"7寸料盘,原标签角度={lable};中心点={centrality};");
            if (istoward_7)
            {
                point = ClockwiseRotation(lable, centrality, degree_7);
            }
            else
            {
                point = CounterclockwiseRotation(lable, centrality, degree_7);
            }
            Point Newpoint = new Point(point.X + Xpianyilian_7, point.Y + Ypianyilian_7);
            LogNet.log.Info($"7寸料盘,xy轴偏移后位置,x={Newpoint.X},y={Newpoint.Y}");
            angle = Scalerotationdegree_7;
            return Newpoint;
        }

        public static Point LabelingAngle_13(Point lable, Point centrality, out int angle)
        {
            //13寸XY偏移量
            int Xpianyilian_13 = ConfigHelper.Config.Get<int>("Labeling_Xpianyilian_13", 100);
            int Ypianyilian_13 = ConfigHelper.Config.Get<int>("Labeling_Ypianyilian_13", 100);
            //13寸朝那个方向贴标true顺时针,false逆时针
            bool istoward_13 = ConfigHelper.Config.Get<bool>("Labeling_istoward_13", true);
            int degree_13 = ConfigHelper.Config.Get<int>("Labeling_degree_13", 90);
            //13寸标签旋转多少度
            int Scalerotationdegree_13 = ConfigHelper.Config.Get<int>("Labeling_Scalerotationdegree_13", 90);
            Point point = lable;
            LogNet.log.Info($"13寸料盘,原标签角度={lable};中心点={centrality};");
            if (istoward_13)
            {
                point = ClockwiseRotation(lable, centrality, degree_13);
            }
            else
            {
                point = CounterclockwiseRotation(lable, centrality, degree_13);
            }
            Point Newpoint = new Point(point.X + Xpianyilian_13, point.Y + Ypianyilian_13);
            LogNet.log.Info($"13寸料盘,xy轴偏移后位置,x={Newpoint.X},y={Newpoint.Y}");
            angle = Scalerotationdegree_13;
            return Newpoint;
        }

        public static Point LabelingAngle_15(Point lable, Point centrality, out int angle)
        {
            //15寸XY偏移量
            int Xpianyilian_15 = ConfigHelper.Config.Get<int>("Labeling_Xpianyilian_15", 100);
            int Ypianyilian_15 = ConfigHelper.Config.Get<int>("Labeling_Ypianyilian_15", 100);
            //15寸朝那个方向贴标true顺时针,false逆时针
            bool istoward_15 = ConfigHelper.Config.Get<bool>("Labeling_istoward_15", true);
            int degree_15 = ConfigHelper.Config.Get<int>("Labeling_degree_15", 90);
            //15寸标签旋转多少度
            int Scalerotationdegree_15 = ConfigHelper.Config.Get<int>("Labeling_Scalerotationdegree_15", 90);
            Point point = lable;
            LogNet.log.Info($"15寸料盘,原标签角度={lable};中心点={centrality};");
            if (istoward_15)
            {
                point = ClockwiseRotation(lable, centrality, degree_15);
            }
            else
            {
                point = CounterclockwiseRotation(lable, centrality, degree_15);
            }
            Point Newpoint = new Point(point.X + Xpianyilian_15, point.Y + Ypianyilian_15);
            LogNet.log.Info($"15寸料盘,xy轴偏移后位置,x={Newpoint.X},y={Newpoint.Y}");
            angle = Scalerotationdegree_15;
            return Newpoint;
        }
        /// <summary>
        /// 顺时针旋转
        /// </summary>
        /// <param name="lable">标签坐标</param>
        /// <param name="center">中心点</param>
        /// <param name="angle">旋转角度</param>
        /// <returns></returns>
        public static Point ClockwiseRotation(Point lable, Point center, double angle)
        {           
            angle += 83;
            double theta = angle * Math.PI / 180;
            double x_new = (lable.X - center.X) * Math.Cos(theta) - (lable.Y - center.Y) * Math.Sin(theta) + center.X;
            double y_new = (lable.X - center.X) * Math.Sin(theta) + (lable.Y - center.Y) * Math.Cos(theta) + center.Y;
            LogNet.log.Info($"顺时针旋转{angle}度,x={x_new},y={y_new};");
            return new Point((int)x_new, (int)y_new);
        }

        /// <summary>
        /// 逆时针旋转
        /// </summary>
        /// <param name="lable">标签坐标</param>
        /// <param name="center">中心点</param>
        /// <param name="angle">旋转角度</param>
        /// <returns></returns>
       public static Point CounterclockwiseRotation(Point lable, Point center, double angle)
        {
            lable=ClockwiseRotation(lable, center, 0);
            double theta = angle * Math.PI / 180;
            //double x, double y, double h, double k, double angle
            //double x_new = (x - h) * Math.Cos(theta) + (y - k) * Math.Sin(theta) + h;
            //double y_new = -(x - h) * Math.Sin(theta) + (y - k) * Math.Cos(theta) + k;
            double x_new = (lable.X - center.X) * Math.Cos(theta) + (lable.Y - center.Y) * Math.Sin(theta) + center.X;
            double y_new = -(lable.X - center.X) * Math.Sin(theta) + (lable.Y - center.Y) * Math.Cos(theta) + center.Y;
            LogNet.log.Info($"逆时针旋转{angle}度,x={x_new},y={y_new};");
            return new Point((int)x_new, (int)y_new);
        }

        static void ImageSave(Bitmap bitmap)
        {
            string filepath = Application.StartupPath + "\\image\\Labeling\\";
            if (!Directory.Exists(filepath))
            {
                Directory.CreateDirectory(filepath);
            }
            else if (Directory.GetFiles(filepath).Length > 100)
            {
                try
                {
                    Directory.Delete(filepath, true);
                    Directory.CreateDirectory(filepath);
                }
                catch (Exception)
                {
                    LogNet.log.Info($"删除失败:{filepath}");
                }
            }

            Bitmap bitmaps = (Bitmap)bitmap.Clone();
            bitmaps.Save(filepath + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + DateTime.Now.Millisecond + ".jpg");
            //LabelResult?.Invoke(new LabelResult() { Bitmap = (Bitmap)bitmap.Clone() });
            //bitmap.Dispose();
        }
    }
}