Beispiel #1
0
 /// <summary>
 /// Инициализирует новый объект ответа на основе класса 
 /// </summary>
 /// <param name="image">Ссылка ни изображение</param>
 /// <param name="ID">Идентификатор</param>
 /// <param name="CellsCount">Количество ячеек для добавления в ответ </param>
 /// <param name="FirstCellDistances">Колекция дистанций от маркеров до первой ячейки</param>
 /// <param name="intercentresdistX">Расстояние между центрами ячеек</param>
 /// <param name="cellswidth">Длина ячеек</param>
 /// <param name="cellsheight">Высота ячеек</param>
 public Answer(Bitmap image, int ID, int CellsCount, Distances FirstCellDistances, int intercentresdistX, int cellswidth, int cellsheight)
 {
     _id = ID;
     _firstcelldistances = FirstCellDistances;
     _intercentresdistx = intercentresdistX;
     _cellscount = CellsCount;
     _cellsheight = cellsheight;
     _cellswidth = cellswidth;
     _contentdescription = string.Empty;
     _cells = new Cells();
     _isempty = false;
     _isdoublecross = false;
     _iswithmiss = false;
     _remarks = string.Empty;
     _cells.IntelligentAdd(image, CellsCount, FirstCellDistances, intercentresdistX, cellswidth, cellsheight);
 }
Beispiel #2
0
        public void Prerecognize()
        {
            try
               {
               _canvas = new Canvas((Bitmap)_image.Clone(), 8.0d);
               _canvas.RecognizeImage();

               testsparam t = _ge.testsparams.First(tp => tp.idt == _testid);

               t.answersparams.Load();
               IEnumerable<answersparam> answers = t.answersparams.Where(a => a.idt == t.idt);
               foreach (answersparam a in answers)
               {
                   Distances _distances = new Distances();
                   _distances.Add(_canvas.TopLeftMarker, (double)a.toplx, (double)a.toply);
                   _distances.Add(_canvas.TopRightMarker, (double)a.toprx, (double)a.topry);
                   _distances.Add(_canvas.BottomLeftMarker, (double)a.blx, (double)a.bly);
                   _distances.Add(_canvas.BottomRightMarker, (double)a.brx, (double)a.bry);

                   Answer _answer = new Answer(_canvas.CorrectedImage, (int)a.num, (int)a.cellscount, _distances, (int)a.intercellswidth, (int)a.cellswidth, (int)a.cellshight);

                   IEnumerable<cellsparam> cells = a.cellsparams.Where(c => c.ida == a.ida);
                   a.cellsparams.Load();
                   int i = 0;
                   foreach (cellsparam cp in cells)
                   {
                       _answer.Cells[i].ContentDescription = cp.description.Trim();
                       i++;
                   }

                   _canvas.Answers.Add(_answer);
               }
               OnRecItem();
               }
               catch (Exception ex) { throw ex; }
        }
Beispiel #3
0
 /// <summary>
 /// Добавляет ответ в коллекцию на основе данных о ячейках
 /// </summary>
 /// <param name="image">Ссылка на изображение</param>
 /// <param name="ID">Идентификатор ответа</param>
 /// <param name="CellsCount">Число ячеек</param>
 /// <param name="FirstCellDistances">Коллекция расстояний до превой ячейки</param>
 /// <param name="intercentresdistX">Расстояние между сетнтрами ячеек в пискселях</param>
 /// <param name="cellswidth">Ширина ячеек</param>
 /// <param name="cellsheight">Высота ячеек</param>
 public void Add(Bitmap image, int ID, int CellsCount, Distances FirstCellDistances, int intercentresdistX, int cellswidth, int cellsheight)
 {
     Answer a = new Answer(image, ID, CellsCount, FirstCellDistances, intercentresdistX, cellswidth, cellsheight);
     this.Add(a);
 }
Beispiel #4
0
        /// <summary>
        /// Изменяет положение и размер ячейки
        /// </summary>
        /// <param name="FirstCellDistanses">Коллекция дистнаций до ячейки</param>
        /// <param name="intercentresdistX">Расстояние между центрами ячеек</param>
        /// <param name="Width">Длина ячейки</param>
        /// <param name="Height">Высота ячейки</param>
        public void ReMeasure(Distances FirstCellDistanses, int intercentresdistX, int Width, int Height)
        {
            //делаем первую ячейку
             Distance d= FirstCellDistanses.FindOneGood();
             Rectangle rect = new Rectangle(_cells[0].Rect.X, _cells[0].Rect.Y, Width, Height);
             _cells[0].Rect = rect;
             _cells[0].CenterOfGravity = d.GetsCenterOfGravity;

            //делаем остальные ячейки
            for (int i = 1; i <Count; i++)
            {
                Point p = new Point(_cells[i - 1].CenterOfGravity.X + intercentresdistX, _cells[i - 1].CenterOfGravity.Y);
                rect = new Rectangle(_cells[i].Rect.X, _cells[i].Rect.Y, Width, Height);
                _cells[i].Rect = rect;
                _cells[i].CenterOfGravity = p;

            }
        }
Beispiel #5
0
        /// <summary>
        /// Добавляет несколько несколько ячеек в ответ начиная с первой
        /// </summary>
        /// <param name="image">Ссылка ни изображение</param>
        /// <param name="CellsCount">Количество ячеек для добавления в ответ</param>
        /// <param name="FirstCellDistanses">Коллекция дистанций между первой ячейкой и маркерами</param>
        /// <param name="intercentresdistX">Расстояние между центрами ячеек</param>
        /// <param name="Width">Длина ячеек</param>
        /// <param name="Height">Высота ячеек</param>
        public void IntelligentAdd(Bitmap image, int CellsCount, Distances FirstCellDistanses, int intercentresdistX, int Width, int Height)
        {
            int maxslice = intercentresdistX/2;

            //находим первую доступную дистанцию
            Distance d = FirstCellDistanses.FindOneGood();
            int maxWidth = Width +  Convert.ToInt16(Width/2);
            int maxHeigth = Height + Convert.ToInt16(Height/2);
            //увеличиваем ячейки

            this.Add(image,CellsCount,FirstCellDistanses,intercentresdistX,maxWidth,maxHeigth);

            BitmapData data = image.LockBits(_cells[0].Rect, ImageLockMode.ReadWrite, image.PixelFormat);
            BlobCounter blobCounter = new BlobCounter();

            Invert invertfilter = new Invert();
            invertfilter.ApplyInPlace(data);
            blobCounter.ProcessImage(data);

            Blob[] blobs = blobCounter.GetObjectsInformation();
            if (blobs.Length != 0)
            {
                int maxar = 0;
                int b = 0;
                for (int i = 0; i < blobs.Count(); i++)
                {
                    if (blobs[i].Area > maxar) { maxar = blobs[i].Area; b = i; }
                }
                invertfilter.ApplyInPlace(data);

                System.Drawing.Point p = new System.Drawing.Point(_cells[0].CenterOfGravity.X - ((maxWidth / 2) - Convert.ToInt16(blobs[b].CenterOfGravity.X)), _cells[0].CenterOfGravity.Y - ((maxHeigth / 2) - Convert.ToInt16(blobs[b].CenterOfGravity.Y)));
                if (Math.Abs(_cells[0].CenterOfGravity.Y - p.Y) <= maxslice) { this.ReMeasure(p, intercentresdistX, Width, Height); }
                else { this.ReMeasure(_cells[0].CenterOfGravity, intercentresdistX, Width, Height); }
            }
            image.UnlockBits(data);
        }
Beispiel #6
0
 /// <summary>
 /// Добавляет несколько ячеек в коллекцию ячеек
 /// </summary>
 /// <param name="image">Ссылка на изображение</param>
 /// <param name="CellsCount">Число ячеек для добавления</param>
 /// <param name="FirstCellDistanses">Коллекция дистанций до первой ячейки коллекции</param>
 /// <param name="intercentresdistX">Расстояние в пикселях между сентрами ячеек</param>
 /// <param name="Width">Ширина ячеек</param>
 /// <param name="Height">Высота ячеек</param>
 /// <exception cref="Exception">Количество ячеек должно быть больше нуля</exception>
 public void Add(Bitmap image, int CellsCount, Distances FirstCellDistanses,int intercentresdistX, int Width, int Height)
 {
     if (CellsCount > 0)
     {
     //находим первую доступную дистанцию
        Distance d= FirstCellDistanses.FindOneGood();
     //делаем первую ячейку
        Cell c1 = new Cell(image, d.GetsCenterOfGravity, Width, Height);
        this.Add(c1);
     //делаем остальные ячейки
     for (int i = 1; i < CellsCount; i++)
     {
         Point p=new Point(_cells[i-1].CenterOfGravity.X+intercentresdistX,_cells[i-1].CenterOfGravity.Y);
         Cell c = new Cell(image, p, Width, Height);
         this.Add(c);
     }
     }
     else { throw new Exception("Количество ячеек доблжно быть больше нуля"); }
 }
Beispiel #7
0
        private void button1_Click(object sender, EventArgs e)
        {
            // это необходимо менять
            double startx =58.8;
            double starty = 197;
            int rowscount = 31;
            int colscount = 9;
            double colsinterval = 86.6;
            double rowsinterval = 27.5;
            //

             pBaseEntities pb = new pBaseEntities();
               testsparam t = pb.testsparams.First(tp => tp.idt == (int)EnumPTests.NPNA);
               t.answersparams.Load();

            int curransverindex = 0;
            double x = startx;

            for(int col=0;col<colscount;col++)
            {
                double y = starty;

                for (int row = 0; row < rowscount;row++ )
                {
                    if (curransverindex <= t.answerscount-1)
                    {
                        Distances _distances = new Distances();
                        _distances.Add(_canvas.TopLeftMarker, (int)x, (int)y);
                        _distances.Add(_canvas.TopRightMarker, (int)x, (int)y);
                        _distances.Add(_canvas.BottomLeftMarker, (int)x, (int)y);
                        _distances.Add(_canvas.BottomRightMarker, (int)x, (int)y);

                        _canvas.Answers[curransverindex].Clear();
                        _canvas.Answers[curransverindex].Cells.ReMeasure(_distances, _canvas.Answers[curransverindex].InterCentresDistX, _canvas.Answers[curransverindex].CellsWidth, _canvas.Answers[curransverindex].CellsHeight);
                        _canvas.Answers[curransverindex].Select();
                        pb_img.Refresh();

                        //это комментить при подгонке
                        answersparam a = t.answersparams.First(ap => ap.num == curransverindex + 1);

                        a.toplx = (int)_distances[0].OnX;
                        a.toply = (int)_distances[0].OnY;

                        a.toprx = (int)_distances[1].OnX;
                        a.topry = (int)_distances[1].OnY;

                        a.blx = (int)_distances[2].OnX;
                        a.bly = (int)_distances[2].OnY;

                        a.brx = (int)_distances[3].OnX;
                        a.bry = (int)_distances[3].OnY;

                       pb.SaveChanges();

                        y += rowsinterval;

                        curransverindex++;
                    }

                }
                x += colsinterval;
            }
        }
Beispiel #8
0
        private void cmd_addtest_Click(object sender, EventArgs e)
        {
            this.lst_answ.Items.Clear();
            _canvas = new Canvas((Bitmap)this.pb_img.Image,8d);
            _canvas.RecognizeImage();
            this.pb_img.Image = _canvas.CorrectedImage;

               //KetelData td = new KetelData();
            pBaseEntities pb = new pBaseEntities();

               // modulData md = new modulData();
               // testsparam tst =  testsparam.Createtestsparam(0, "ОПРОСНИК МОДУЛЬ", 200, true);
               // for (int a = 0; a < tst.answerscount; a++)
               // {
               //     answersparam ap = answersparam.Createanswersparam(0, tst.idt, "Вопрос № " + (a + 1), 2);
               //     ap.num = a + 1;
               //     ap.buttondescription = md.answers[a].text;
               //     ap.intercellswidth = 27;
               //     ap.cellshight = 25;
               //     ap.cellswidth = 25;
               //     ap.toplx = 0;
               //     ap.toply = 0;
               //     ap.toprx = 0;
               //     ap.topry = 0;
               //     ap.blx = 0;
               //     ap.bly = 0;
               //     ap.brx = 0;
               //     ap.bry = 0;

               //     cellsparam cp = cellsparam.Createcellsparam(0, ap.ida);
               //     cp.description = "Да";
               //     cp.buttonsescription = "Да";
               //     cp.mark = md.answers[a].isYes?md.answers[a].mark:0;
               //     cellsparam cp1 = cellsparam.Createcellsparam(0, ap.ida);
               //     cp1.description = "Нет";
               //     cp1.buttonsescription = "Нет";
               //     cp1.mark = md.answers[a].isYes ? 0 : md.answers[a].mark;

               //     ap.cellsparams.Add(cp);
               //     ap.cellsparams.Add(cp1);

               //     tst.answersparams.Add(ap);

               // }

               //pb.testsparams.AddObject(tst);
               // pb.SaveChanges();

            testsparam t = pb.testsparams.First(tp => tp.idt == (int)EnumPTests.NPNA);
            t.answersparams.Load();
            IEnumerable<answersparam> answers = t.answersparams;

            foreach (answersparam ap in answers)
            {
                ListViewItem it = new ListViewItem(ap.num.ToString());
                it.SubItems.Add(ap.ida.ToString());
                it.SubItems.Add(ap.description.ToString());
                it.SubItems.Add(ap.intercellswidth.ToString());
                it.SubItems.Add(ap.cellswidth.ToString());
                it.SubItems.Add(ap.cellshight.ToString());
                it.SubItems.Add(ap.toplx.ToString());
                it.SubItems.Add(ap.toply.ToString());
                this.lst_answ.Items.Add(it);
                //добавляем вопросы на грид
                //создаем коллекцию дистанций для каждого ответа

                Distances _distances = new Distances();
                _distances.Add(_canvas.TopLeftMarker, (double)ap.toplx, (double)ap.toply);
                _distances.Add(_canvas.TopRightMarker, (double)ap.toprx, (double)ap.topry);
                _distances.Add(_canvas.BottomLeftMarker, (double)ap.blx, (double)ap.bly);
                _distances.Add(_canvas.BottomRightMarker, (double)ap.brx, (double)ap.bry);

                //_distances.Add(_canvas.TopLeftMarker, 100, 100);
                //_distances.Add(_canvas.TopRightMarker, 100, 100);
                //_distances.Add(_canvas.BottomLeftMarker, 100, 100);
                //_distances.Add(_canvas.BottomRightMarker, 100, 100);

                //создаем ответы
                Answer _answer = new Answer(_canvas.CorrectedImage, (int)ap.ida, (int)ap.cellscount, _distances, (int)ap.intercellswidth, (int)ap.cellswidth, (int)ap.cellshight);
                _answer.Select();
                _canvas.Answers.Add(_answer);

            }
        }