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; }
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; }
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); }
public bool AreEqual(VerticalBlock v) { if (Width == v.Width & Length == v.Length) return true; return false; }
public bool AreSame01(VerticalBlock v) { if (0.9 * Width <= v.Width & 1.1 * Width >= v.Width) return true; return false; }
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; }
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); } }
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
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; }
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; }
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; }