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> 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> 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> 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; }