public static void ExecMerge(DB_AGIN_Baccarat_Tbl tblOrg, DB_AGIN_Baccarat_Tbl tblNew, int dist)
        {
            #region For: Determine start index, for both
            int x_org_sta = -1;
            for (int x = 0; x < tblOrg.TotalCol; x++)
            {
                if (0 != tblOrg.Cells[x].Count && 2 > tblOrg.Cells[x][0].Matches.Count)
                {
                    break;
                }
                x_org_sta = x;
            }
            int x_new_sta = (tblNew.TotalCol - 1 - dist) - (tblOrg.TotalCol - 1 - x_org_sta);
            if (-1 == x_org_sta) // For: Re-calculate start index, for origin
            {
                x_org_sta = 0;
            }
            if (0 > x_new_sta) // For: Re-calculate start index, for both
            {
                x_org_sta = -x_new_sta;
                x_new_sta = 0;
            }
            #endregion
            #region For: Allocating column/row, for origin
            int col_allocating = 0 != tblOrg.TotalCol ? dist : tblNew.TotalCol;
            while (0 != col_allocating)
            {
                col_allocating--;
                tblOrg.Cells.Add(new List <DB_AGIN_Baccarat_Cell>());

                int row_allocating = 0;
                while (tblNew.TotalRow != row_allocating)
                {
                    row_allocating++;
                    tblOrg.Cells[tblOrg.Cells.Count - 1].Add(new DB_AGIN_Baccarat_Cell());
                }
            }
            #endregion
            for (int x_new = x_new_sta; x_new < tblNew.TotalCol; x_new++)
            {
                for (int y_new = 0; y_new < tblNew.TotalRow; y_new++)
                {
                    var cell_new = tblNew.Cells[x_new][y_new];
                    var cell_org = tblOrg.Cells[x_org_sta + (x_new - x_new_sta)][y_new];
                    #region For: Copy infomation, for origin
                    cell_org.PercentB = cell_new.PercentB;
                    cell_org.PercentG = cell_new.PercentG;
                    cell_org.PercentR = cell_new.PercentR;
                    cell_org.Matches  = cell_new.Matches;
                    #endregion
                }
            }
            tblOrg.UpdTotal();
            tblOrg.UpdCoordinate();
        }
        public static int DistMerge(DB_AGIN_Baccarat_Tbl tblOrg, DB_AGIN_Baccarat_Tbl tblNew, int distMax)
        {
            int  dist   = 0;
            bool merged = 0 == tblOrg.TotalCol; // For: Can merge with origin was empty

            for (int x_new = tblNew.TotalCol - 1; x_new > -1; x_new--)
            {
                // For: Determine distance, for new
                dist = tblNew.TotalCol - 1 - x_new;
                if (distMax < dist) // For: Distance too far, not merge
                {
                    break;
                }
                // For: Determine min index, for origin
                int x_org_min = tblOrg.TotalCol - tblNew.TotalCol + dist;
                if (0 > x_org_min) // For: Columns not enough, ignore it
                {
                    continue;
                }
                // For: Check cells were order, for origin
                bool flag = true;
                for (int x_org = tblOrg.TotalCol - 1; x_org > x_org_min - 1; x_org--)
                {
                    for (int y_org = tblOrg.TotalRow - 1; y_org > -1; y_org--)
                    {
                        DB_AGIN_Baccarat_Cell cell_org = tblOrg.Cells[x_org][y_org];
                        DB_AGIN_Baccarat_Cell cell_new = tblNew.Cells[x_org - x_org_min][y_org];
                        string color_org = cell_org.Matches.Contains("circle-blue") ? "circle-blue" : cell_org.Matches.Contains("circle-red") ? "circle-red" : "";
                        string color_new = cell_new.Matches.Contains("circle-blue") ? "circle-blue" : cell_new.Matches.Contains("circle-red") ? "circle-red" : "";
                        if (0 != cell_org.Order && color_org != color_new) // For: Cell was order but different, ignore it
                        {
                            flag = false;
                            break;
                        }
                    }
                    if (!flag)
                    {
                        break;
                    }
                }
                if (flag) // For: Can merge with dist, for new
                {
                    merged = true; break;
                }
            }
            return(merged ? dist : -1);
        }
        public DB_AGIN_Baccarat_Tbl Clone()
        {
            DB_AGIN_Baccarat_Tbl tbl = new DB_AGIN_Baccarat_Tbl();

            tbl.TotalCol          = TotalCol;
            tbl.TotalRow          = TotalRow;
            tbl.TotalInvalid      = TotalInvalid;
            tbl.LatestOrder       = LatestOrder;
            tbl.LatestOrderCircle = LatestOrderCircle;
            tbl.LatestOrderX      = LatestOrderX;
            tbl.LatestOrderY      = LatestOrderY;
            tbl.LatestOrderXR     = LatestOrderXR;
            tbl.LatestOrderYR     = LatestOrderYR;
            Cells.ForEach(x => {
                List <DB_AGIN_Baccarat_Cell> cells = new List <DB_AGIN_Baccarat_Cell>();
                x.ForEach(y => {
                    cells.Add(y.Clone());
                });
                tbl.Cells.Add(cells);
            });
            return(tbl);
        }
Beispiel #4
0
        public void HdlAGIN(string name)
        {
            try
            {
                string file_path = Path.Combine(CONFIG_DAFANBA_DIR_PRINT, name);
                if (File.Exists(file_path))
                {
                    AGIN_3840x2160_Baccarat agin_3840x2160_baccarat = null;
                    ImageHelper.AnalysisImg_AGIN_3840x2160(file_path, out agin_3840x2160_baccarat);

                    List <DB_AGIN_Baccarat> agins_img = DB_AGIN_Baccarat.ExtractImg(agin_3840x2160_baccarat, name, DateTime.Now, 0, DateTime.Now, 0);
                    foreach (DB_AGIN_Baccarat agin_img in agins_img)
                    {
                        DB_AGIN_Baccarat agin_latest = LatestAGINs.Where(x => x.CoordinateX == agin_img.CoordinateX && x.CoordinateY == agin_img.CoordinateY).FirstOrDefault();
                        #region For: Save/Clean baccarat
                        if (!new int[3] {
                            0, 203, 204
                        }.Contains(agin_img.DataAnalysis.TotalInvalid))
                        {
                            agin_img.SaveDbTrack(ConnHelper);
                        }
                        if (0 != agin_img.DataAnalysis.TotalInvalid)
                        {
                            continue;
                        }
                        agin_img.Id = 0;
                        agin_img.DataAnalysis.DelEmpty();
                        #endregion
                        #region For: Merge baccarat
                        bool merged = false;
                        if (null != agin_latest)
                        {
                            int dist = DB_AGIN_Baccarat_Tbl.DistMerge(
                                agin_latest.DataAnalysis, agin_img.DataAnalysis,
                                DB_AGIN_Baccarat_Tbl.DistMax(agin_latest.DataAnalysis, agin_img.DataAnalysis));
                            if (-1 != dist)
                            {
                                DB_AGIN_Baccarat_Tbl.ExecMerge(agin_latest.DataAnalysis, agin_img.DataAnalysis, dist);
                                agin_latest.FileNames      = Regex.Replace(agin_latest.FileNames + agin_img.FileNames, @"(;;)", ";");
                                agin_latest.LastModifiedOn = agin_img.LastModifiedOn;
                                agin_latest.LastModifiedBy = agin_img.LastModifiedBy;
                                merged = true;
                            }
                        }
                        #endregion
                        #region For: Add baccarat
                        if (!merged)
                        {
                            if (null != agin_latest)
                            {
                                LatestAGINs.Remove(agin_latest);
                            }
                            LatestAGINs.Add(agin_img);
                            agin_latest = LatestAGINs.Single(x => x.CoordinateX == agin_img.CoordinateX && x.CoordinateY == agin_img.CoordinateY);
                        }
                        #endregion
                        #region For: Order baccarat
                        agin_latest.DataAnalysis.UpdOrder(
                            agin_latest.DataAnalysis.LatestOrder, agin_latest.DataAnalysis.LatestOrderCircle,
                            agin_latest.DataAnalysis.LatestOrderX, agin_latest.DataAnalysis.LatestOrderY,
                            agin_latest.DataAnalysis.LatestOrderXR, agin_latest.DataAnalysis.LatestOrderYR);
                        #endregion
                        #region For: Save baccarat
                        agin_latest.SaveDb(ConnHelper);
                        #endregion
                        #region For: Alert via pattern(s)
                        #region For: Baccarat pattern
                        IEnumerable <DB_AGIN_Baccarat_Check_RstItem> pattern = agin_latest.ChkPattern(CONFIG_DAFANBA_ALERT_BACCARAT_PATTERN);
                        foreach (DB_AGIN_Baccarat_Check_RstItem item in pattern)
                        {
                            AlertBaccaratPattern(agin_latest.CoordinateX, agin_latest.CoordinateY, item.NFreq, item.CellsFreq.Count, item.CellsSub.Count, item.ColorsFreq, file_path);
                        }
                        #endregion
                        #endregion
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception(string.Format("{0}{1}", ex.Message, ex.StackTrace), ex);
            }
        }
 public static int DistMax(DB_AGIN_Baccarat_Tbl tblOrg, DB_AGIN_Baccarat_Tbl tblNew)
 {
     return(tblNew.TotalCol / 2);
 }
 public DB_AGIN_Baccarat()
 {
     DataAnalysis = new DB_AGIN_Baccarat_Tbl();
     AlertPattern = new List <DB_AGIN_Baccarat_Check_RstItem>();
 }