public List <Layer2DCylImp> BuildLayers( double radius, double height , Vector2D dimContainer , double offsetZ /* e.g. pallet height */ , ConstraintSetAbstract constraintSet , bool keepOnlyBest) { var listLayers0 = new List <Layer2DCylImp>(); foreach (LayerPatternCyl pattern in LayerPatternCyl.All) { // not swapped vs swapped pattern for (int iSwapped = 0; iSwapped < 2; ++iSwapped) { // does swapping makes sense for this layer pattern ? if (!pattern.CanBeSwapped && (iSwapped == 1)) { continue; } // instantiate layer var layer = new Layer2DCylImp(radius, height, dimContainer, iSwapped == 1); layer.PatternName = pattern.Name; double actualLength = 0.0, actualWidth = 0.0; if (!pattern.GetLayerDimensions(layer, out actualLength, out actualWidth)) { continue; } pattern.GenerateLayer(layer, actualLength, actualWidth); listLayers0.Add(layer); } // keep only best layers if (keepOnlyBest) { // 1. get best count int bestCount = 0; foreach (Layer2DCylImp layer in listLayers0) { bestCount = Math.Max(layer.CountInHeight(constraintSet.OptMaxHeight.Value - offsetZ), bestCount); } // 2. remove any layer that does not match the best count given its orientation listLayers0.RemoveAll(layer => !(layer.CountInHeight(constraintSet.OptMaxHeight.Value - offsetZ) >= bestCount)); } listLayers0.Sort(new LayerCylComparerCount(constraintSet.OptMaxHeight.Value - offsetZ)); } return(listLayers0); }