예제 #1
0
        public bool Add(VerticalBlock verticalBlock, int mLength)
        {
            MaxLength = mLength;
            if (((Length + verticalBlock.Length) <= MaxLength))
            {
                Blocks.Add(verticalBlock);
                Length = Length + verticalBlock.Length;

                Width = Math.Max(Width, verticalBlock.Width);
                Height = Math.Max(Height, verticalBlock.Height);
                MinHeight = MinHeight == 0 ? verticalBlock.Height : Math.Max(MinHeight, verticalBlock.Height);
                Mass = Mass + verticalBlock.Mass;
                RealVolume = RealVolume + verticalBlock.RealVolume;
                Count = Count + verticalBlock.Count;
                Order = verticalBlock.Order;
                return true;
            }
            if (verticalBlock.Length <= Width & (Length + verticalBlock.Width) <= MaxLength)
            {
                verticalBlock.RotateH();
                Blocks.Add(verticalBlock);
                Length = Length + verticalBlock.Length;

                Width = Math.Max(Width, verticalBlock.Width);
                Height = Math.Max(Height, verticalBlock.Height);
                Mass = Mass + verticalBlock.Mass;
                RealVolume = RealVolume + verticalBlock.RealVolume;
                Count = Count + verticalBlock.Count;
                Order = verticalBlock.Order;
                return true;
            }
            return false;
        }
예제 #2
0
 public bool ContainsVerticalBlock(VerticalBlock vBlock, List<VerticalBlock> blocks)
 {
     foreach (VerticalBlock verticalBlock in Blocks)
     {
         if (vBlock.Blocks[0].Name == verticalBlock.Blocks[0].Name)
         {
             return true;
         }
     }
     return false;
 }
 private List<Container> UnpackVerticalBlock(List<Container> tempList, VerticalBlock vBlock)
 {
     foreach (var cont in vBlock.Blocks)
     {
         if (cont is VerticalBlock)
         {
             tempList = UnpackVerticalBlock(tempList, (VerticalBlock)cont);
         }
         else if (cont is HorizontalBlock)
         {
             tempList = unpackHorizontalBlock(tempList, (HorizontalBlock)cont);
         }
         else if (cont is Container)
         {
             tempList.Add(cont);
         }
         else
         {
             MessageBox.Show("В процедуру unpackVerticalBlock передан неизвестный объект");
         }
     }
     return tempList;
 }
예제 #4
0
 public override object Clone() 
 {
     VerticalBlock verticalBlock = new VerticalBlock
     {
         Count = Count,
         Length = Length,
         Width = Width,
         Height = Height,
         Priority = Priority,
         Kind = Kind,
         Name = Name,
         ContainerType = ContainerType,
         Mass = Mass,
         Price = Price,
         DirLength = DirLength,
         DirWidth = DirWidth,
         DirHeight = DirHeight,
         Order = Order,
         Color = Color,
         Only4Bottom = Only4Bottom,
         FirstPoint = new Point3D(FirstPoint.X, FirstPoint.Y, FirstPoint.Z)
     };
     foreach (Object obj in Blocks)
     {
         if (obj is VerticalBlock)
         {
             VerticalBlock vBlock = (VerticalBlock)obj;
             verticalBlock.Blocks.Add(vBlock.Clone() as VerticalBlock);
         }
         else if (obj is Container)
         {
             Container cont = (Container)obj;
             verticalBlock.Blocks.Add(cont.Clone() as Container);
         }
     }
     return verticalBlock;
 }
        private void AddCanvas(FlowDocument doc, VerticalBlock vBlock, int cWidth, int cHeight)
        {
            //MessageBox.Show("Количество вертикальных блоков " + rowBlock.Blocks.Count.ToString());
            var b = new BlockUIContainer();
            var canvas = new Canvas();
            canvas.Width = cWidth / scale;
            canvas.Height = cHeight / scale + 20;

            //Рисуем рамку вокруг canvas
            var r = new Rectangle();
            r.Width = cWidth / scale;
            r.Height = cHeight / scale;
            Brush brush = new SolidColorBrush();
            brush = Brushes.White;
            r.Stroke = new SolidColorBrush(Colors.Red);
            r.Fill = brush;
            Canvas.SetLeft(r, 0);
            Canvas.SetTop(r, 20);
            canvas.Children.Add(r);

            //пишем заголовок
            var t = new TextBlock();
            t.Text = "Количество контейнеров: " + vBlock.Count + " общий вес: " + vBlock.Mass;
            t.FontSize = 14;
            Canvas.SetLeft(t, 20);
            Canvas.SetTop(t, 2);
            canvas.Children.Add(t);

            vBlock.SetFirstPointVerticalBlock(new Point3D(0, 0, 0));
            //рисуем контейнеры
            foreach (var c in vBlock.Blocks)
            {
                r = new Rectangle();
                r.Width = c.Length / scale;
                r.Height = c.Height / scale;
                brush = new SolidColorBrush();
                brush = Brushes.White;
                r.Stroke = new SolidColorBrush(Colors.Black);
                r.Fill = brush;
                Canvas.SetLeft(r, c.FirstPoint.Y / scale);
                Canvas.SetTop(r, canvas.Height - c.Height / scale - c.FirstPoint.Z / scale);
                canvas.Children.Add(r);

                t = new TextBlock();
                t.Text = c.Name;
                t.FontSize = 10;
                Canvas.SetLeft(t, c.FirstPoint.Y / scale + 2);
                Canvas.SetTop(t, canvas.Height - c.Height / scale - c.FirstPoint.Z / scale + 2);
                canvas.Children.Add(t);

                t = new TextBlock();
                t.Text = "Габ: " + c.Length + "x" + c.Width + "x" + c.Height + "мм.Вес:" + c.Mass;
                t.FontSize = 10;
                Canvas.SetLeft(t, c.FirstPoint.Y / scale + 2);
                Canvas.SetTop(t, canvas.Height - c.Height / scale - c.FirstPoint.Z / scale + 15);
                canvas.Children.Add(t);

                t = new TextBlock();
                t.Text = "Цена: " + c.Price + "; Направление загрузки д: " + c.DirLength + "; ш: " + c.DirWidth +
                         "; в: " + c.DirHeight + "; ";
                t.FontSize = 10;
                Canvas.SetLeft(t, c.FirstPoint.Y / scale + 2);
                Canvas.SetTop(t, canvas.Height - c.Height / scale - c.FirstPoint.Z / scale + 28);
                canvas.Children.Add(t);

                t = new TextBlock();
                t.Text = "Порядок загрузки + " + c.Order + "; Допуст.давление: " + c.PressHeight + "; Хрупкость: " +
                         c.FragilityHeight + "; ";
                t.FontSize = 10;
                Canvas.SetLeft(t, c.FirstPoint.Y / scale + 2);
                Canvas.SetTop(t, canvas.Height - c.Height / scale - c.FirstPoint.Z / scale + 41);
                canvas.Children.Add(t);

                t = new TextBlock();
                t.Text = "Уровень: " + c.Level + "; Количество: " + c.Quantity + "; На пол: " + c.Only4Bottom + "; ";
                t.FontSize = 10;
                Canvas.SetLeft(t, c.FirstPoint.Y / scale + 2);
                Canvas.SetTop(t, canvas.Height - c.Height / scale - c.FirstPoint.Z / scale + 54);
                canvas.Children.Add(t);
            }
            b.Child = canvas;
            doc.Blocks.Add(b);
        }
예제 #6
0
 public bool AreEqual(VerticalBlock v)
 {
     if (Width == v.Width & Length == v.Length) return true;
     return false;
 }
예제 #7
0
 public bool AreSame01(VerticalBlock v)
 {
     if (0.9 * Width <= v.Width & 1.1 * Width >= v.Width) return true;
     return false;
 }
예제 #8
0
 private bool ListContainVerticalBlock(List<VerticalBlock> tempList, VerticalBlock v)
 {
     bool result = false;
     foreach (VerticalBlock t in tempList)
     {
         if (t.Blocks[0].Name == v.Name)
         {
             result = true;
         }
     }
     return result;
 }
예제 #9
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);
            }
        }
예제 #10
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
예제 #11
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;
        }
예제 #12
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;
        }
예제 #13
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;
        }