XYConvertManager.cs 7.8 KB
using log4net.Filter;
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TSA_V.Common;
using TSA_V.DeviceLibrary;

namespace TSA_V 
{
    public  class XYConvertManager
    {
        private static List<ConBaseInfo> conList = null;
        public static List<ConBaseInfo> ConList
        {
            get
            {
                if (conList == null)
                {
                    try
                    {
                        conList = JsonHelper.DeserializeJsonToObject<List<ConBaseInfo>>(Setting_NInit.Data_LastCalibrateInfo);
                    }
                    catch (Exception ex)
                    {
                        LogUtil.error("转换lastCalibrateBean出错:" + ex.ToString());
                    }
                }
                return conList;

            }
            set
            {
                conList = value;
                Setting_NInit.Data_LastCalibrateInfo = JsonHelper.SerializeObject(conList);
            }
        }

        public static void SaveData(BoardInfo board)
        {
            List<ConBaseInfo> data = new List<ConBaseInfo>() {
                new ConBaseInfo(new Point(0,0),board.calInfo.leftUpPoint),
                new ConBaseInfo(new Point(board.boardWidth,board.boardLength),board.calInfo.rightBottomPoint),
                };
        }



        public static  SMTPointInfo CalPointNodePosition(SMTPointInfo smtPoint, List<SMTPointInfo> checkOKList)
        {
            try
            {
                if (smtPoint.CheckOK&& Setting_NInit.Work_UseCheckOK)
                {
                    //校准点不再自动计算
                    return smtPoint;
                }
                if (checkOKList.Count < 2)
                {
                    return smtPoint;
                }
                double oldX = smtPoint.NodePositionX;
                double oldY = smtPoint.NodePositionY;
                //SMTPointInfo APoint = GetPoint(smtPoint, checkOKList);

                //SMTPointInfo BPoint = GetPoint(APoint, checkOKList);
                SMTPointInfo APoint = checkOKList[0];
                SMTPointInfo BPoint = checkOKList[1];



                //计算坐标    
                if (Math.Abs(smtPoint.PositionX - APoint.PositionX) < 0.01)
                {
                    smtPoint.NodePositionX = APoint.NodePositionX;
                }
                else
                {
                    smtPoint.NodePositionX = APoint.NodePositionX + (BPoint.NodePositionX - APoint.NodePositionX) * (smtPoint.PositionX - APoint.PositionX) / (BPoint.PositionX - APoint.PositionX);
                    if (double.IsNaN(smtPoint.NodePositionX) || double.IsInfinity(smtPoint.NodePositionX))
                    {
                        smtPoint.NodePositionX = APoint.NodePositionX;
                    }
                }
                if (Math.Abs(smtPoint.PositionY - APoint.PositionY) < 0.01)
                {
                    smtPoint.NodePositionY = APoint.NodePositionY;
                }
                else
                {
                    smtPoint.NodePositionY = APoint.NodePositionY + (BPoint.NodePositionY - APoint.NodePositionY) * (smtPoint.PositionY - APoint.PositionY) / (BPoint.PositionY - APoint.PositionY);
                    if (double.IsNaN(smtPoint.NodePositionY) || double.IsInfinity(smtPoint.NodePositionY))
                    {
                        smtPoint.NodePositionY = APoint.NodePositionY;
                    }
                }
                if (smtPoint.NodePositionX <= 0)
                {
                    smtPoint.NodePositionX = 1;
                }
                else if (smtPoint.NodePositionX > FrmProjectorScreen.instance.BoundsWidth)
                {
                    smtPoint.NodePositionX = FrmProjectorScreen.instance.BoundsWidth;
                }
                if (smtPoint.NodePositionY <= 0)
                {
                    smtPoint.NodePositionY = 1;
                }
                else if (smtPoint.NodePositionY > FrmProjectorScreen.instance.BoundsHeight)
                {
                    smtPoint.NodePositionY = FrmProjectorScreen.instance.BoundsHeight;
                }

                if (smtPoint.PointSizeX < 1 || smtPoint.PointSizeX > 255)
                {
                    smtPoint.PointSizeX = Setting_NInit.Device_DefaultPointSize;
                }
                if (smtPoint.PointSizeY < 1 || smtPoint.PointSizeY > 255)
                {
                    smtPoint.PointSizeY = Setting_NInit.Device_DefaultPointSize;
                }


                double xXishu = (BPoint.NodePositionX - APoint.NodePositionX) / (BPoint.PositionX - APoint.PositionX);
                double yXishu = (BPoint.NodePositionY - APoint.NodePositionY) / (BPoint.PositionY - APoint.PositionY);
                //计算点大小
                if (smtPoint.imgP?.uTime > smtPoint.pUTime)
                {
                    smtPoint.PointSizeX = (int)((BPoint.NodePositionX - APoint.NodePositionX) * smtPoint.imgP.SizeX / (BPoint.PositionX - APoint.PositionX));
                    smtPoint.PointSizeY = (int)((BPoint.NodePositionY - APoint.NodePositionY) * smtPoint.imgP.SizeY / (BPoint.PositionY - APoint.PositionY));
                    smtPoint.PenWidth = (int)((BPoint.NodePositionX - APoint.NodePositionX) * smtPoint.imgP.PWidth / (BPoint.PositionX - APoint.PositionX));

                }

                //smtPoint.PointSize = 4;
                //smtPoint.NodePositionX = BPoint.NodePositionX - (BPoint.NodePositionX - APoint.NodePositionX) * (BPoint.PositionX - smtPoint.PositionX) / (BPoint.PositionX - APoint.PositionX);
                //smtPoint.NodePositionY = BPoint.NodePositionY - (BPoint.NodePositionY - APoint.NodePositionY) * (BPoint.PositionY - smtPoint.PositionY) / (BPoint.PositionY - APoint.PositionY);
                LogUtil.info($" 【{smtPoint.PN}】图片坐标【{smtPoint.PositionX},{smtPoint.PositionY}】旧坐标【{oldX},{oldY}】新坐标【{smtPoint.NodePositionX},{smtPoint.NodePositionY}】" +
                    $"点尺寸({smtPoint.PointSizeX},{smtPoint.PointSizeY}),画笔宽{smtPoint.PenWidth}");
                return smtPoint;

            }
            catch (Exception ex)
            {
                LogUtil.error(" 【" + smtPoint.PN + "】图片坐标【" + smtPoint.PositionX + "," + smtPoint.PositionY + "】校准坐标出错:" + ex.ToString());

            }
            return smtPoint;
        }



        private SMTPointInfo GetPoint(SMTPointInfo smtPoint, List<SMTPointInfo> checkOKList)
        {
            SMTPointInfo p = null;
            double maxPingFang = 0;
            foreach (SMTPointInfo sm in checkOKList)
            {
                if (sm.pointNum.Equals(smtPoint.pointNum))
                {
                    continue;
                }
                double xjuli = sm.PositionX - smtPoint.PositionX;
                double yjuli = sm.PositionY - smtPoint.PositionY;
                double cping = xjuli * xjuli + yjuli * yjuli;
                if (cping > maxPingFang)
                {
                    p = sm;
                    maxPingFang = cping;
                    continue;
                }
            }
            if (p != null)
            {
                return p;
            }
            return null;
        }
    }

    public class ConBaseInfo
    {
        public ConBaseInfo()
        {

        }
        public ConBaseInfo(Point point1,Point point2)
        {
            this.IPoint = point1;
            this.Point = point2;
        }
        /// <summary>
        /// 板子实际坐标
        /// </summary>
        public Point IPoint = new Point();
        /// <summary>
        /// 投影对应坐标
        /// </summary>
        public Point Point = new Point(); 
    }
}