예제 #1
0
        private void AddCabinToRow(Container c)
        {
            VerticalBlock vBlock = new VerticalBlock();
            if (vBlock.Add(c, 10000) == false)
            {
                MessageBox.Show("Ошибка добавления кабины в вертикальный блок.Сообщите администратору");
                return;
            }
            //добавляем вертикальный ряд в горизонтальный ряд
            RowBlock rBlock = new RowBlock();
            rBlock.Add(vBlock, vehicle.MaxLength);

            if (vehicle.MaxLength >= rBlock.Width & vehicle.Tonnage >= rBlock.Mass + vehicle.Mass)
            {
                AddRowToVehicle(rBlock);
            }
            else
            {
                //помещаем кабину в список невместившихся контейнеров
                wasteList.Add(c);
            }
        }
예제 #2
0
        private List<Container> CreateRow3(List<Container> containers, int minHeight, int maxHeight, int maxWidth,
            int show, int maxTonnage)
        {
            //первым делом создаем вертикальные блоки нужной высоты (не меньше minHeight;  
            var vBlocks = new List<VerticalBlock>();
            var tempList = containers.OrderByDescending(c => c.Length).ToList();
            var smallContainers = new List<Container>();
            var lowBlocks = new List<VerticalBlock>();
            RowBlock result;
            //поворачиваем контейнеры которые должны стоять вдоль борта
            foreach (var c in tempList)
            {
                if ((c.Length > c.Width & c.DirLength == "x") | c.Length > maxWidth)
                {
                    c.RotateH();
                    c.DirLength = "x";
                }
            }
            if (minHeight == 0)
            {
                MessageBox.Show("Ошибка: в процедуру  CreateRow3 передан параметр minHeight с нулевым значением");
            }

            while (tempList.Any())
            {
                var firstCont = tempList[0];
                var check4 = tempList.Count();
                var sameCont1 =
                    tempList.Where(s => s.AreSame01(firstCont))
                        .OrderByDescending(s => s.Mass)
                        .ThenBy(s => s.Color)
                        .ToList();
                tempList = tempList.Where(s => (s.AreSame01(firstCont) == false)).OrderBy(s => s.Color).ToList();
                if (sameCont1.Count() + tempList.Count() != check4)
                {
                    MessageBox.Show("неправильная фильтрация контейнеров");
                }
                var vBlock = new VerticalBlock();
                foreach (var c in sameCont1)
                {
                    if (c.Height < vehicle.Height & c.Height >= maxHeight & vBlock.Count == 0)
                    {
                        //если контейнер выше чем нужно но меньше макс. высота, то добавляем его в отдельный вертикальный блок
                        if (vBlock.Add(c, vehicle.Height) == false)
                        {
                            tempList.Add(c);
                        }
                    }
                    else if (vBlock.Height <= minHeight)
                    {
                        if (vBlock.Add(c, maxHeight) == false)
                        {
                            tempList.Add(c);
                        }
                    }
                    else
                    {
                        tempList.Add(c);
                    }
                }

                if (vBlock.Height >= minHeight)
                {
                    vBlocks.Add(vBlock);
                }
                else
                {
                    lowBlocks.Add(vBlock);
                } //низкие блоки будем использовать при уплотнении самого плотного ряда
            }

            if (XmlHelper.ContainersCount(containers) - XmlHelper.ContainersCount(tempList) -
                XmlHelper.ContainersCount(vBlocks) - XmlHelper.ContainersCount(lowBlocks) != 0)
            {
                MessageBox.Show("Расхождение количества контейнеров 3");
            }
            //LoadSchemeCalculation win = new LoadSchemeCalculation(VBlocks);
            //win.ShowDialog();
            //формируем ряды
            var rBlocks = new List<RowBlock>();
            var sameWidth = 100;
            var sh = vBlocks.Count();
            while (sameWidth < vehicle.MaxLength)
            {
                CreateRows(vBlocks, sameWidth, rBlocks);
                sameWidth = sameWidth + 100;
            }
            var sh2 = VerticalBlocksDistinctCount(vBlocks);
            if (sh != sh2)
            {
                MessageBox.Show("Расхождение количества вертикальных блоков");
            }
            //выбираем самый плотный ряд 

            if (rBlocks.Any())
            {
                rBlocks = rBlocks.OrderByDescending(s => s.FullnessWidth).ThenByDescending(s => s.MinHeight).ToList();
                result = rBlocks[0];
                vBlocks = vBlocks.Where(s => result.ContainsVerticalBlock(s, vBlocks) == false).ToList();

                if ((result.FullnessWidth > 0.4 | containers.Count() == 1) & (vehicle.Mass + result.Mass) <= maxTonnage)
                // if (result.FullnessWidth > 0.4 | Containers.Count() <= 5)
                {
                    if (result.FullnessWidth < 0.9)
                    {
                        //сначала пытаемся добавить высокий блок 
                        vBlocks = AddExtraBlock(result, vBlocks);
                        //потом пытаемся добавить низкий блок
                        lowBlocks = AddExtraBlock(result, lowBlocks);
                    }
                    AddRowToVehicle(result);
                }
                else
                {
                    vBlocks.AddRange(result.Blocks);
                }
            }
            //оставшиеся низкие блоки выгружаем в общий список
            vBlocks.AddRange(lowBlocks);
            //неиспользованные вертикальные ряды выгружаем в список контейнеров
            foreach (var v in vBlocks)
            {
                v.ToContainerList(tempList);
            }
            //возвращаем маленькие контейнеры в общий список
            tempList.AddRange(smallContainers);
            //Поворачиваем контейнеры обратно;
            foreach (var c in tempList.Where(c => c.Length < c.Width))
            {
                c.RotateH();
            }
            return tempList;
        } //CreateRow3
예제 #3
0
        private List<Container> CreateVerticalPalletsLevel3(List<Container> containers, int length, int width, int height,
           int maxHeight, string prefix)
        {
            FromTempListToContList fromTempListToContList = new FromTempListToContList();
            List<Container> t1 = fromTempListToContList.ToContainerList(containers);
            //используется для контроля потери контейнеров

            List<Container> only4Bottom =
                containers.Where(c => c.Length == length & c.Width == width & c.Height == height)
                    .OrderBy(c => c.Color)
                    .ToList();
            List<Container> tempList =
                containers.Where(c => c.Length != length | c.Width != width | c.Height != height).ToList();
            List<VerticalBlock> vBlocks = new List<VerticalBlock>();
            List<Container> tempList2 = new List<Container>();
            int nameCh = 0;
            while (only4Bottom.Any())
            {
                VerticalBlock vBlock = new VerticalBlock { Kind = "VerticalPallet", PressHeight = 0 };
                List<Container> sameList = only4Bottom.ToList();
                only4Bottom = new List<Container>();
                foreach (Container s in sameList)
                {
                    if (vBlock.Count == 3)
                    {
                        only4Bottom.Add(s);
                    }
                    else if (vBlock.Add(s, maxHeight) == false)
                    {
                        //MessageBox.Show("Не удалось добавить контейнер в связку.Сообщите администратору");
                        tempList2.Add(s);
                    }
                }

                if (vBlock.Count == 1)
                {
                    tempList2.Add(vBlock.Blocks[0]);
                }
                else if (vBlock.Count == 2)
                {
                    nameCh++;
                    vBlock.Name = "Связка паллет в 2 яруса  №" + prefix + nameCh;

                    vBlocks.Add(vBlock);
                }
                else if (vBlock.Count == 3)
                {
                    nameCh++;
                    vBlock.Name = "Связка паллет в 3 яруса  №" + prefix + nameCh;
                    vBlocks.Add(vBlock);
                }
            }
            tempList.AddRange(vBlocks);
            tempList.AddRange(tempList2);

            List<Container> t2 = fromTempListToContList.ToContainerList(tempList);
            //используется для контроля потери контейнеров
            if (t1.Count() != t2.Count())
            {
                MessageBox.Show("Потеря контейнеров в процедуре CreateVerticalPalletsLevel3");
            }
            return tempList;
        }
예제 #4
0
        private List<Container> CreateVerticalPalletsLevel2(List<Container> containers, int maxHeight)
        {
            FromTempListToContList fromTempListToContList = new FromTempListToContList();
            List<Container> t1 = fromTempListToContList.ToContainerList(containers);
            //используется для контроля потери контейнеров
            //контейнеры которые штабелируются в два яруса и ставятся только на пол
            List<Container> tempOnly4Bottom =
                containers.Where(c => c.Only4Bottom == 2).OrderBy(c => c.ContainerType).ToList();
            List<Container> tempList = containers.Where(c => c.Only4Bottom != 2).ToList();

            int nameCh = 0;

            while (tempOnly4Bottom.Any())
            {
                VerticalBlock vBlock = new VerticalBlock { Kind = "VerticalPallet" };
                nameCh++;
                vBlock.Name = "Связка паллет в 2 яруса №" + nameCh;
                vBlock.Only4Bottom = 2;

                Container firstContainer = tempOnly4Bottom[0];
                List<Container> sameList =
                    tempOnly4Bottom.Where(c => c.ContainerType == firstContainer.ContainerType)
                        .OrderByDescending(c => c.Mass)
                        .ToList();
                tempOnly4Bottom = tempOnly4Bottom.Where(c => c.ContainerType != firstContainer.ContainerType).ToList();

                foreach (Container s in sameList)
                {
                    if (vBlock.Count < 2)
                    {
                        if (vBlock.Add(s, maxHeight) == false)
                        {
                            tempOnly4Bottom.Add(s);
                        }
                    }
                    else
                    {
                        tempOnly4Bottom.Add(s);
                    }
                }
                if (vBlock.Count == 2)
                {
                    vBlock.PressHeight = 0;
                    tempList.Add(vBlock);
                }
                else if (vBlock.Count == 1)
                {
                    tempList.Add(vBlock.Blocks[0]);
                }
            }
            List<Container> t2 = fromTempListToContList.ToContainerList(tempList);
            //используется для контроля потери контейнеров
            if (t1.Count() > t2.Count())
            {
                MessageBox.Show("Ошибка! Потеря контейнеров в процедуре CreateVerticalPalletsLevel2");
            }
            else if (t1.Count() < t2.Count())
            {
                MessageBox.Show("Ошибка! Дублирование контейнеров в процедуре CreateVerticalPalletsLevel2");
            }
            return tempList;
        }
예제 #5
0
        private List<Container> ProcessingChassis(List<Container> tempList, int maxTonnage)
        {
            List<Container> tempRama =
                tempList.Where(s => s.Length > 1500 & s.Width > 6000).OrderBy(s => s.Width).ToList();
            tempList = tempList.Where(s => s.Length <= 1500 | s.Width <= 6000).ToList();
            if (!tempRama.Any())
            {
                return tempList;
            }
            HorizontalBlock hBlock = new HorizontalBlock();
            hBlock.RowCount = 2;
            hBlock.Width = tempRama[0].Width + 800;
            hBlock.Length = 2400;
            //добавляем в подушку ящики размеров 1200х800х800
            List<Container> temp500 = tempList.Where(s => s.Length == 1200 & s.Width == 800 & s.Height == 800).ToList();
            if (temp500.Count() >= 6)
            {
                tempList = tempList.Where(s => s.Length != 1200 | s.Width != 800 | s.Height != 800).ToList();
                foreach (Container c in temp500)
                {
                    if (hBlock.Add(c))
                    {
                        /*продолжаем*/
                    }
                    else
                    {
                        tempList.Add(c);
                    }
                }
            }
            //добавляем в подушку ящики размеров 1100х800х720
            temp500 = tempList.Where(s => s.Length == 1100 & s.Width == 800 & s.Height == 720).ToList();

            if (NotEmpty() | temp500.Count() >= 6)
            {
                tempList = tempList.Where(s => s.Length != 1100 | s.Width != 800 | s.Height != 720).ToList();
                foreach (Container c in temp500)
                {
                    if (!hBlock.Add(c))
                    {
                        tempList.Add(c);
                    }
                }
            }

            VerticalBlock vBlock = new VerticalBlock();
            if (hBlock.NotEmpty() & (vehicle.Mass + hBlock.Mass) <= maxTonnage)
            {
                vBlock.Add(hBlock, vehicle.Height - 250);
            }
            else
            {
                hBlock.ToContainerList(tempList);
            }

            foreach (Container r in tempRama)
            {
                if ((vehicle.Mass + r.Mass) <= maxTonnage)
                {
                    if (vBlock.Add(r, vehicle.Height - 350) == false)
                    {
                        MessageBox.Show("не удалось добавить раму в вертикальный блок.Сообщите администратору");
                        tempList.Add(r);
                    }
                }
            }
            RowBlock rBlock = new RowBlock();
            rBlock.Add(vBlock, vehicle.Width);
            AddRowToVehicle(rBlock);
            return tempList;
        }