public Form2(RectanglesArray rectangles, SquaresArray squares, int W, int L) { blankRectangles = rectangles; this.squares = squares; this.W = W; this.L = L; InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) //Рассчитать { textBox3.Text = ""; textBox4.Text = ""; dataGridView2.Rows.Clear(); int nSquares = 0; //Ввод данных if (!Int32.TryParse((textBox1.Text), out L) || (!Int32.TryParse((textBox2.Text), out W))) { MessageBox.Show("Введите корректные размеры листа!", "Ошибка"); return; } try { for (int i = 0; i < dataGridView1.RowCount; i++) { if ((Convert.ToInt32(dataGridView1["side", i].Value) > 0) && (Convert.ToInt32(dataGridView1["count", i].Value) > 0)) { nSquares++; } } } catch (Exception) { MessageBox.Show("Введите корректные размеры квадратов!", "Критическая ошибка"); return; } if (nSquares == 0) { MessageBox.Show("Введите хотя бы одну сторону квадрата!", "Ошибка"); return; } squares = new SquaresArray(0); //Ввод квадратов try { for (int i = 0; i < dataGridView1.RowCount; i++) { if (Convert.ToInt32(dataGridView1["side", i].Value) > 0) { for (int j = 0; j < Convert.ToInt32(dataGridView1["count", i].Value); j++) { squares.Add(new Square(0, 0, Convert.ToInt32(dataGridView1["side", i].Value))); } } } } catch (Exception) { MessageBox.Show("Введите корректные размеры квадратов!", "Критическая ошибка"); return; } squares.DecreasingSort(); if (squares[0].size > Math.Min(L, W)) { MessageBox.Show("Квадраты не влезают на лист! Увеличьте размеры листа", "Ошибка"); return; } blankRectangles = new RectanglesArray(0); int k; //Разделение листов for (int i = 0; i < squares.length; i++) { k = 0; //Индекс пустого прямоугольника blankRectangles.Sort(); //Добавляем новый лист, если нужно if ((blankRectangles.length == 0) || (squares[i].size > Math.Min(blankRectangles[blankRectangles.length - 1].w, blankRectangles[blankRectangles.length - 1].l))) { blankRectangles.numberOfPlates++; blankRectangles.Add(new Rectangle(0, 0, W, L, blankRectangles.numberOfPlates)); blankRectangles.Sort(); } //Основная часть разделения и подсчета листов while (!blankRectangles.DivideByTwo(k, squares, i)) { k++; } } //Вывод количества листов textBox4.Text = Convert.ToString(blankRectangles.numberOfPlates); //Вывод во вторую таблицу информации о квадратах for (int i = 0; i < squares.length; i++) { dataGridView2.Rows.Add(); } for (int i = 0; i < squares.length; i++) { dataGridView2["number", i].Value = i + 1; dataGridView2["side", i].Value = squares[i].size; dataGridView2["plate", i].Value = squares[i].plate; } //Подсчет количества размеров прямоугольников List <int> squaresSingle = new List <int>(); for (int i = 0; i < dataGridView1.RowCount; i++) { if (Convert.ToInt32(dataGridView1["side", i].Value) > 0) { squaresSingle.Add(Convert.ToInt32(dataGridView1["side", i].Value)); } } squaresSingle = squaresSingle.Distinct().ToList(); //Подсчет необходимой информации о листах и вывод в TextBox int n; int maxW, maxL; for (int i = 1; i <= blankRectangles.numberOfPlates; i++) { //Задействованные размеры листа maxW = 0; maxL = 0; for (int j = 0; j < squares.length; j++) { if (squares[j].plate == i) { if (squares[j].y + squares[j].size > maxW) { maxW = squares[j].y + squares[j].size; } if (squares[j].x + squares[j].size > maxL) { maxL = squares[j].x + squares[j].size; } } } textBox3.Text += "------------------Лист №" + i + "--------------"; textBox3.Text += Environment.NewLine; textBox3.Text += "Использованные размеры листа " + Environment.NewLine + "(Длина x Ширина): " + maxL + " x " + maxW; textBox3.Text += Environment.NewLine; textBox3.Text += "Использованные квадраты:"; textBox3.Text += Environment.NewLine; //Количество квадратов одного размера на листе for (int j = 0; j < squaresSingle.Count; j++) { n = 0; for (int l = 0; l < squares.length; l++) { if (squares[l].plate == i) { if (squares[l].size == squaresSingle[j]) { n++; } } } if (n != 0) { textBox3.Text += n + " шт. \t" + squaresSingle[j] + " \tx\t" + squaresSingle[j] + " \t " + Environment.NewLine; } } } button2.Enabled = true; }
public bool DivideByTwo(int rectangleIndex, SquaresArray squares, int squareIndex) { if (rectangleIndex >= length) { throw new Exception("Выход за пределы массива!"); } int side = squares[squareIndex].size; //Проверка возможности соединить соседние прямоугольники if (side > Rectangles[rectangleIndex].w && side > Rectangles[rectangleIndex].l) { return(false); } if (!Combine(rectangleIndex, side)) { return(false); } //Сохранение номера пластины и координат squares.SetPlate(squareIndex, Rectangles[rectangleIndex].plate); squares.SetCoordinates(squareIndex, Rectangles[rectangleIndex].x, Rectangles[rectangleIndex].y); if ((side == Rectangles[rectangleIndex].w) && (side == Rectangles[rectangleIndex].l)) { RemoveOne(rectangleIndex); return(true); } int x = Rectangles[rectangleIndex].x; int y = Rectangles[rectangleIndex].y; int w = Rectangles[rectangleIndex].w; int l = Rectangles[rectangleIndex].l; if (w == side) { Rectangles[rectangleIndex].x += side; Rectangles[rectangleIndex].l -= side; return(true); } if (l == side) { Rectangles[rectangleIndex].y += side; Rectangles[rectangleIndex].w -= side; return(true); } if (l >= w) { Rectangles[rectangleIndex].x += side; Rectangles[rectangleIndex].l -= side; Add(new Rectangle(x, y + side, w - side, side, Rectangles[rectangleIndex].plate)); } if (l < w) { Rectangles[rectangleIndex].y += side; Rectangles[rectangleIndex].w -= side; Add(new Rectangle(x + side, y, side, l - side, Rectangles[rectangleIndex].plate)); } return(true); }