예제 #1
0
 public Form2(RectanglesArray rectangles, SquaresArray squares, int W, int L)
 {
     blankRectangles = rectangles;
     this.squares    = squares;
     this.W          = W;
     this.L          = L;
     InitializeComponent();
 }
예제 #2
0
        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;
        }
예제 #3
0
        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);
        }