private List<VerticalBlock> AddExtraBlock(RowBlock rBlock, List<VerticalBlock> vBlocks) { int length = rBlock.MaxLength - rBlock.Length; List<VerticalBlock> extraBlocks = vBlocks.Where( v => (v.Length <= length & v.Width <= rBlock.Width) | (v.Length <= rBlock.Width & v.Width <= length)) .OrderByDescending(v => v.RealVolume) .ToList(); List<VerticalBlock> tempBlocks = vBlocks.Where( v => ((v.Length <= length & v.Width <= rBlock.Width) | (v.Length <= rBlock.Width & v.Width <= length)) == false).ToList(); if (extraBlocks.Count() + tempBlocks.Count() != vBlocks.Count()) { MessageBox.Show("Ошибка при фильтрации блоков. AddExtraBlock"); } if (extraBlocks.Any()) { VerticalBlock extraBlock = extraBlocks[0]; //MessageBox.Show("Подобрано дополнительных блоков: " + extraBlocks.Count().ToString()); if (extraBlock.Length > (rBlock.MaxLength - rBlock.Length) | extraBlock.Width > rBlock.Width) { extraBlock.RotateH(); } rBlock.Add(extraBlock, vehicle.Width); tempBlocks.AddRange(extraBlocks.Where(v => v != extraBlock)); } return tempBlocks; }
private void CreateRows(List<VerticalBlock> vBlocks, int sameWidth, List<RowBlock> rBlocks) { List<VerticalBlock> sameBlock = vBlocks.Where(s => s.IsSuitableWidth(sameWidth)).OrderByDescending(s => s.Width).ToList(); while (sameBlock.Any()) { List<VerticalBlock> tempBlocks = new List<VerticalBlock>(); RowBlock rBlock = new RowBlock(); foreach (VerticalBlock s in sameBlock) { VerticalBlock tempS; if (s.Length <= sameWidth & s.Length > sameWidth - 100) //если нужно, то поворачиваем блок { tempS = s.Clone() as VerticalBlock; tempS.RotateH(); } else { tempS = s; } if (tempS.Length > vehicle.Width) { /*пропускаем блок т.к. он не подходит по ширине и длине*/ } else if (rBlock.Add(tempS, vehicle.Width) == false) { tempBlocks.Add(tempS); } } if (rBlock.Count > 0) { rBlocks.Add(rBlock); } sameBlock = tempBlocks.ToList(); } }
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> 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; }