/// <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); }
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; } }
/// <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); }
/// <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; } }
/// <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); }
/// <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("Количество ячеек доблжно быть больше нуля"); } }
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; } }
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); } }