using OpenNest.Geometry; using OpenNest.Math; namespace OpenNest.RectanglePacking { internal class FillNoRotation : FillEngine { public FillNoRotation(Bin bin) : base(bin) { } public NestDirection NestDirection { get; set; } public override void Fill(Item item) { var ycount = (int)System.Math.Floor((Bin.Length + Tolerance.Epsilon) / item.Length); var xcount = (int)System.Math.Floor((Bin.Width + Tolerance.Epsilon) / item.Width); for (int i = 0; i < xcount; i++) { var x = item.Width * i + Bin.X; for (int j = 0; j < ycount; j++) { var y = item.Length * j + Bin.Y; var addedItem = item.Clone() as Item; addedItem.Location = new Vector(x, y); Bin.Items.Add(addedItem); } } } public override void Fill(Item item, int maxCount) { var ycount = (int)System.Math.Floor((Bin.Length + Tolerance.Epsilon) / item.Length); var xcount = (int)System.Math.Floor((Bin.Width + Tolerance.Epsilon) / item.Width); var count = ycount * xcount; if (count <= maxCount) { Fill(item); return; } var columns = 0; var rows = 0; if (NestDirection == NestDirection.Vertical) { columns = (int)System.Math.Ceiling((double)maxCount / ycount); rows = (int)System.Math.Ceiling((double)maxCount / columns); } else { rows = (int)System.Math.Ceiling((double)maxCount / xcount); columns = (int)System.Math.Ceiling((double)maxCount / rows); } Bin.Items.AddRange(FillGrid(item, rows, columns, maxCount, columnMajor: item.Width > item.Length)); } } }