Example #1
0
 public EkraFiducailOffsetInputPara(Ekra_PrinterData data, RotationResult rResult, CenterOffsetResult cResult)
 {
     FM = new List <System.Windows.Point>();
     foreach (var fm in data.EkraFMs)
     {
         var point = new System.Windows.Point(fm.P.X, fm.P.Y);
         FM.Add(point);
     }
     Theta  = rResult.Theta;
     Center = new System.Windows.Point(rResult.Center.X, rResult.Center.Y);
     Dx     = cResult.Dx;
     Dy     = cResult.Dy;
 }
        public override object Calculate(List <Box> CandidateBoxes, InspectedPanel panel, object para)
        {
            //Point shiftedC = (Point)para;
            Point shiftedC = (para as CenterOffsetResult).ShiftedCenter;
            Point _padC    = (para as CenterOffsetResult)._PadCenter;
            Point _solderC = (para as CenterOffsetResult)._SolderCenter;

            RotationResult result = new RotationResult();
            //0. 原點
            Point origin0;

            origin0.X = panel.Panel.FullCadRect.X;
            origin0.Y = panel.Panel.FullCadRect.Y;
            //4. 以板子1/2為pad中心, 計算整板旋轉角 <= 原本註解
            Point originC;

            originC.X = panel.Panel.FullCadRect.Width * 0.5;
            originC.Y = panel.Panel.FullCadRect.Height * 0.5;



            double X0, Y0, X1, Y1;
            double Sum1 = 0, Sum2 = 0;

            foreach (Box box in CandidateBoxes)
            {
                //double padX, padY;
                Point pad;

                pad.X  = box.CadRect.X + box.CadRect.Width * 0.5;
                pad.Y  = box.CadRect.Y + box.CadRect.Height * 0.5;
                pad.X -= origin0.X;
                pad.Y -= origin0.Y;

                //double solderX, solderY;
                Point solder;
                solder.X = pad.X + box.ShiftGlobalX;
                solder.Y = pad.Y + box.ShiftGlobalY;

                X0 = solder.X - shiftedC.X;
                Y0 = solder.Y - shiftedC.Y;


                X1 = pad.X - originC.X; //pad -> solder
                Y1 = pad.Y - originC.Y; //pad -> solder

                Sum1 += X1 * Y0 - X0 * Y1;
                Sum2 += X1 * X0 + Y1 * Y0;
            }

            if (Sum2 == 0)
            {
                return(result);//return null會造成後續寫檔錯誤
            }
            //原本的計算在這邊被改變,但return後還是會再改一次
            //Dx = solderCx - padCx;
            //Dy = solderCy - padCy;

            result.Theta = Math.Atan(-Sum1 / Sum2) * 180 / Math.PI;

            result.Center.X = shiftedC.X;
            result.Center.Y = shiftedC.Y;


            //最後轉檔base on CommonSettingVM
            if (Settings.IsMoveStencil)
            {
                result.Theta    = -result.Theta;
                result.Center.X = _padC.X;
                result.Center.Y = _padC.Y;//[原註解]padCxCy must be the centerOfRotate when rotate solder to pad.
            }
            else
            {
                result.Center.X = _solderC.X;
                result.Center.Y = _solderC.Y;//[原註解]solderCxy must be the centerOfRotate when rotate pad to solder.
            }


            // [原註解]一般認知的情況下+Theta角為逆時針方向,isCCWRotate應為true。
            if (Settings.IsCCWRotate == false)
            {
                result.Theta *= -1;
            }



            return(result);
        }