From b3f98c7ab8b34960f8bb935a4cf0770099aeddef Mon Sep 17 00:00:00 2001 From: Loc Date: Tue, 23 Jun 2020 10:01:44 +0800 Subject: [PATCH 1/7] add pack_pose --- README.md | 1 + TEST_2DBIN_PACKER.py | 80 ++++++++++++++++ TEST_3DBIN_PACKER.py | 106 +++++++++++++++++++++ cube3d_display_test.py | 37 ++++++++ docs/maxrects.png | Bin 11239 -> 29532 bytes docs/skyline.png | Bin 11253 -> 29532 bytes rectpack/maxrects.py | 57 ++++++++++-- rectpack/packer.py | 207 ++++++++++++++++++++++++++++++++++++++++- 8 files changed, 476 insertions(+), 12 deletions(-) create mode 100644 TEST_2DBIN_PACKER.py create mode 100644 TEST_3DBIN_PACKER.py create mode 100644 cube3d_display_test.py diff --git a/README.md b/README.md index df6e251..2cbf865 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # rectpack [![Build Status](https://travis-ci.org/secnot/rectpack.svg?branch=master)](https://travis-ci.org/secnot/rectpack) +Improvement of RectPack with preset items - Loc Nguyen Rectpack is a collection of heuristic algorithms for solving the 2D knapsack problem, also known as the bin packing problem. In essence packing a set of rectangles into the diff --git a/TEST_2DBIN_PACKER.py b/TEST_2DBIN_PACKER.py new file mode 100644 index 0000000..7dc30ac --- /dev/null +++ b/TEST_2DBIN_PACKER.py @@ -0,0 +1,80 @@ +# -*- coding: utf-8 -*- +""" +Test 2D Bin Packing +Author: +""" +from rectpack.packer import newPacker +from rectpack import * + +import random +import time + + +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle +from PIL import Image + + + +rectangles = [(100, 30), (40, 60), (30, 30),(70, 70), (100, 50), (30, 30),(55,77),(48,72)] +bins = [(150, 170)]#[(300, 450), (80, 40), (200, 150)] + +packer = newPacker(mode=PackingMode.Online, + bin_algo=PackingBin.BBF, + pack_algo=MaxRectsBssf, + sort_algo=SORT_AREA, + rotation=True) + + + +plt.figure(figsize=(10,10)) +plt.xlabel('Bin Packing 2D - SolPacker') +plt.xlim(0,bins[0][0]) +plt.ylim(0,bins[0][1]) +# Get the current reference +ax = plt.gca() + +print("display finished!") + +# Add the bins where the rectangles will be placed +for b in bins: + packer.add_bin(*b) + +count=0 +# INITIALIZE +r_list=[(89, 36),( 49, 87),(84, 39),(69, 74)] +r_preset=[(0, 0, 36, 89),(36, 0, 87, 49),(36, 49, 39, 84),(75, 49, 74, 69)] + +start= time.time() + +#Octomap +packer.add_preset_rect(*r_preset[0]) +packer.add_preset_rect(*r_preset[1]) #packer.py line 184 +packer.add_preset_rect(*r_preset[2]) +packer.add_preset_rect(*r_preset[3]) + +#Pack last item +rect=packer.add_rect(24, 36) +print("---",rect) +rect=packer.add_rect(240, 260) +print("---",rect) +rect=packer.add_rect(24, 46) +print("---",rect) +rect=packer.add_rect(24, 86) +print("---",rect) +#Display +count=0 +for abin in packer: + print(abin.bid) # Bin id if it has one + for rect in abin: + # Create a Rectangle patch + rect2D = Rectangle((rect.x,rect.y),rect.width,rect.height,linewidth=2,edgecolor=(0,0,0),facecolor=(random.uniform(0.2, 1), random.uniform(0.2, 1), random.uniform(0.2, 1))) + + # Add the patch to the Axes + ax.add_patch(rect2D) + count+=1 + ax.text(rect.x+rect.width/2,rect.y+rect.height/2, str(count), fontsize=15) + print(rect) + +end = time.time() +print("Pack time=", end - start) diff --git a/TEST_3DBIN_PACKER.py b/TEST_3DBIN_PACKER.py new file mode 100644 index 0000000..4fec4ea --- /dev/null +++ b/TEST_3DBIN_PACKER.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +""" +Test 3D Bin Packing +Author: Loc Nguyen +""" +from rectpack.packer import SolPalletization +from rectpack import * + +import random +import time +import random + + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.patches import Rectangle +from PIL import Image + +# This import registers the 3D projection, but is otherwise unused. +from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import + + + +preset_cuboids =[]# [[0,0,0,50,50,60],[50,0,0,50,50,150],[200,200,0,50,50,300]] +pack_cuiboid=[0,0,0,40,50,10] +bin_size = (300,300,450) + +#generate grid +grid_size_w=28 +grid_size_h=28 + +step_w=bin_size[0]/grid_size_w +step_h=bin_size[1]/grid_size_h + +for i in range(grid_size_w): + for j in range(grid_size_h): + if random.uniform(0,1)>0.5: + preset_cuboids.append([step_w*i,step_h*j,0,step_w,step_h,random.uniform(bin_size[2]/5, bin_size[2]*5/6) ]) + + + +pack3D=SolPalletization(_bin_size=bin_size) +print("Bin Size (W,H,D)=",pack3D.bin_size) +#print("free rect number=",len(pack3D.packer2D._max_rects)) +start= time.time() +success,pack_pose=pack3D.pack(preset_cuboids,pack_cuiboid,box_pose=np.identity(4),pick_pose=np.identity(4), level_num=20,display2D=True) + +end = time.time() +print("Pack time=", end - start) + +#DISPLAY by ROS scene +if success: + print("SUCCESS! pack_pose=\n",pack_pose) + file1 = open("D:\\packing.scene","w") + + # \n is placed to indicate EOL (End of Line) + file1.write("Scene Objects for ROS \n") + + file1.writelines("BIN\n\n") + file1.writelines("1\nbox\n") + file1.writelines(str(bin_size[0])+" "+str(bin_size[1])+" "+str(bin_size[2])+"\n") + file1.writelines(str(bin_size[0]/2)+" "+str(bin_size[1]/2)+" "+str(bin_size[2]/2)+"\n") + file1.writelines("0 0 0 1"+"\n") + file1.writelines("0 0 0 0"+"\n") + + file1.writelines("PACKED_CUIBOID\n\n") + file1.writelines("1\nbox\n") + file1.writelines(str(pack3D.result[3])+" "+str(pack3D.result[4])+" "+str(pack3D.result[5])+"\n") + file1.writelines(str(pack3D.result[0]+pack3D.result[3]/2)+" "+str(pack3D.result[1]+pack3D.result[4]/2)+" "+str(pack3D.result[2]+pack3D.result[5]/2)+"\n") + file1.writelines("0 0 0 1"+"\n") + file1.writelines("0 0 0 0"+"\n") + + + for i,cuboid in enumerate(preset_cuboids): + file1.writelines("cuboid "+str(i)+"\n\n") + file1.writelines("1\nbox\n") + file1.writelines(str(cuboid[3])+" "+str(cuboid[4])+" "+str(cuboid[5])+"\n") + file1.writelines(str(cuboid[0]+cuboid[3]/2)+" "+str(cuboid[1]+cuboid[4]/2)+" "+str(cuboid[2]+cuboid[5]/2)+"\n") + file1.writelines("0 0 0 1"+"\n") + file1.writelines("0 0 0 0"+"\n") + file1.close() #to change file access modes + +#=========================================== +''' +# prepare some coordinates +x, y, z = np.indices((28, 28,28)) + +# draw cuboids in the top left and bottom right corners, and a link between them +voxels = (x < 0) & (y < 0) & (z <0) + + + +for i,cuboid in enumerate(preset_cuboids): + #if i<4: + c2 = (x >= cuboid[0]/step_w) &(x <(cuboid[0]+cuboid[3])/step_w)& (y >= cuboid[1]/step_h) &(y <(cuboid[1]+cuboid[4])/step_h)& (z >= cuboid[2]*8/bin_size[2]) &(z <(cuboid[2]+cuboid[5])*8/bin_size[2]) + voxels = voxels | c2 + +# and plot everything +fig = plt.figure() +ax = fig.gca(projection='3d') +ax.voxels(voxels, edgecolor='k')#colors facecolors='y', + +plt.show() +''' +#=========================================== + \ No newline at end of file diff --git a/cube3d_display_test.py b/cube3d_display_test.py new file mode 100644 index 0000000..faae747 --- /dev/null +++ b/cube3d_display_test.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +""" +Created on Wed Jun 17 11:00:58 2020 + +@author: Loc +""" + +import matplotlib.pyplot as plt +import numpy as np + +# This import registers the 3D projection, but is otherwise unused. +from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import + + +# prepare some coordinates +x, y, z = np.indices((8, 8, 8)) + +# draw cuboids in the top left and bottom right corners, and a link between them +cube1 = (x < 3) & (y < 3) & (z < 3) +cube2 = (x >= 5) & (y >= 5) & (z >= 5) +link = abs(x - y) + abs(y - z) + abs(z - x) <= 2 + +# combine the objects into a single boolean array +voxels = cube1 | cube2# | link + +# set the colors of each object +colors = np.empty(voxels.shape, dtype=object) +colors[link] = 'red' +colors[cube1] = 'blue' +colors[cube2] = 'green' + +# and plot everything +fig = plt.figure() +ax = fig.gca(projection='3d') +ax.voxels(voxels, facecolors=colors, edgecolor='k') + +plt.show() \ No newline at end of file diff --git a/docs/maxrects.png b/docs/maxrects.png index 0491f054e99e46e1631167e7e5feabb8c69db98b..9028e49626ce81289b8262e7e7831829d2fd2f5e 100644 GIT binary patch literal 29532 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�{!E!2O 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 CcJG$} literal 11239 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 X9pcUXMk~+)3hJDPN)Phx8~ObgOW*&k diff --git a/docs/skyline.png b/docs/skyline.png index c433a413a53356da1784591eca7aa7d1dcc95e45..9028e49626ce81289b8262e7e7831829d2fd2f5e 100644 GIT binary patch literal 29532 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�{!E!2O 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 CcJG$} literal 11253 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 diff --git a/rectpack/maxrects.py b/rectpack/maxrects.py index 5af8d61..12136e1 100644 --- a/rectpack/maxrects.py +++ b/rectpack/maxrects.py @@ -10,9 +10,12 @@ class MaxRects(PackingAlgorithm): - + minWH=0.000000001 def __init__(self, width, height, rot=True, *args, **kwargs): super(MaxRects, self).__init__(width, height, rot, *args, **kwargs) + #self.minWH=0.000000001 + self.current_pack2D_result=None + #print("base init...") def _rect_fitness(self, max_rect, width, height): """ @@ -82,13 +85,13 @@ def _generate_splits(self, m, r): """ new_rects = [] - if r.left > m.left: + if r.left - m.left>=self.minWH:#ORIGINAL CODE: r.left > m.left new_rects.append(Rectangle(m.left, m.bottom, r.left-m.left, m.height)) - if r.right < m.right: + if m.right-r.right >=self.minWH: new_rects.append(Rectangle(r.right, m.bottom, m.right-r.right, m.height)) - if r.top < m.top: + if m.top-r.top>=self.minWH: new_rects.append(Rectangle(m.left, r.top, m.width, m.top-r.top)) - if r.bottom > m.bottom: + if r.bottom - m.bottom>=self.minWH: new_rects.append(Rectangle(m.left, m.bottom, m.width, r.bottom-m.bottom)) return new_rects @@ -169,7 +172,8 @@ def add_rect(self, width, height, rid=None): # Search best position and orientation rect, _ = self._select_position(width, height) - if not rect: + self.current_pack2D_result=rect + if not rect: return None # Subdivide all the max rectangles intersecting with the selected @@ -184,6 +188,36 @@ def add_rect(self, width, height, rid=None): self.rectangles.append(rect) return rect + def add_preset_rect(self, x,y,width, height, rid=None): + """ + Add rectangle of widthxheight dimensions. + + Arguments: + width (int, float): Rectangle width + height (int, float): Rectangle height + rid: Optional rectangle user id + + Returns: + Rectangle: Rectangle with placemente coordinates + None: If the rectangle couldn be placed. + """ + assert(width > 0 and height >0) + + # Search best position and orientation + rect =Rectangle(x,y,width, height) + + # Subdivide all the max rectangles intersecting with the selected + # rectangle. + self._split(rect) + + # Remove any max_rect contained by another + self._remove_duplicates() + + # Store and return rectangle position. + rect.rid = rid + self.rectangles.append(rect) + return rect + def reset(self): super(MaxRects, self).reset() self._max_rects = [Rectangle(0, 0, self.width, self.height)] @@ -217,13 +251,20 @@ def _select_position(self, w, h): return Rectangle(m.x, m.y, w, h), m -class MaxRectsBssf(MaxRects): +class MaxRectsBssf(MaxRects): + def print_value(): + print("=====value=123") """Best Sort Side Fit minimize short leftover side""" def _rect_fitness(self, max_rect, width, height): if width > max_rect.width or height > max_rect.height: return None - return min(max_rect.width-width, max_rect.height-height) + #Loc 20200618 replace condition + #return min(max_rect.width-width, max_rect.height-height) + #pack along Y + #return max_rect.x+max_rect.y+height/2+min(max_rect.width-width, max_rect.height-height) + #pack along X + return max_rect.x+max_rect.y+width/2+min(max_rect.width-width, max_rect.height-height) class MaxRectsBaf(MaxRects): """Best Area Fit pick maximal rectangle with smallest area diff --git a/rectpack/packer.py b/rectpack/packer.py index dba3f07..9c1ff71 100644 --- a/rectpack/packer.py +++ b/rectpack/packer.py @@ -4,7 +4,21 @@ import itertools import collections +import time import decimal +from operator import itemgetter + + +import random +import time + +import numpy as np +from numpy.linalg import inv +from scipy.spatial.transform import Rotation as RotMat + +import matplotlib.pyplot as plt +from matplotlib.patches import Rectangle +from PIL import Image # Float to Decimal helper def float2dec(ft, decimal_digits): @@ -164,8 +178,9 @@ def add_rect(self, width, height, rid=None): fit = (b for b in fit if b[0] is not None) try: _, best_bin = min(fit, key=self.first_item) - best_bin.add_rect(width, height, rid) - return True + + return best_bin.add_rect(width, height, rid) + #return True except ValueError: pass @@ -178,10 +193,33 @@ def add_rect(self, width, height, rid=None): # _new_open_bin may return a bin that's too small, # so we have to double-check - if new_bin.add_rect(width, height, rid): - return True + return new_bin.add_rect(width, height, rid) + #if self.result2D: + # return True + def add_preset_rect(self, x, y , width, height, rid=None): + + # Try packing into open bins + fit = ((b.fitness(width, height), b) for b in self._open_bins) + fit = (b for b in fit if b[0] is not None) + try: + _, best_bin = min(fit, key=self.first_item) + best_bin.add_preset_rect(x,y,width, height, rid) + return True + except ValueError: + pass + + # Try packing into one of the empty bins + while True: + # can we find an unopened bin that will hold this rect? + new_bin = self._new_open_bin(width, height, rid=rid) + if new_bin is None: + return False + # _new_open_bin may return a bin that's too small, + # so we have to double-check + if new_bin.add_preset_rect(x,y,width, height, rid): + return True class PackerOnline(object): """ @@ -578,3 +616,164 @@ def newPacker(mode=PackingMode.Offline, return packer_class(pack_algo=pack_algo, rotation=rotation) +class SolPalletization: + """ + SolPalletization for 3D packing with point cloud + + Note: Rotation is Euler Angle following Fanuc Robot definition: rx,ry,rz + cuboid(x,y,z,w,h,d) + Arguments: + Bin Size: (Width,Height,Depth) + Preset Cuboids: [(x,y,z,w,h,d)] + Pack N Cuboids:[(w,h,d)] + Robot N Picking Pose: [(x,y,z,rx,ry,rz)] + + Returns: + Pack N Cuboids Pose:[(x,y,z,rx,ry,rz)] + """ + def __init__(self, _bin_size=(600,380,450),_bin_pose=np.identity(4), rot=True): + self.bin_size=_bin_size + self.bin_width=_bin_size[0] + self.bin_height=_bin_size[1] + self.bin_depth=_bin_size[2] + self.bin_pose=_bin_pose + self.result=None + def get_level_list(self, preset_cuboid=[],pack_cuboid=[], level_num=20): + search_list=[] + total_area = self.bin_width * self.bin_height + pack_cuboid_area=pack_cuboid[3]*pack_cuboid[4] + + #get list of (depth, area) for cuboid + level_list= [ [x[2]+x[5],x[3]*x[4]] for x in preset_cuboid if (x[2]+x[5])>0 and (x[2]+x[5]+pack_cuboid[5])total_area): + delete_indices.append( list(range(i,len(level_list))) ) + break #skip checking other cuboids + + #keep level only + level_list_filter = [v for i,v in enumerate(level_list) if i not in delete_indices] + + #remove level that available not fit + if len(level_list_filter)>level_num and level_num>0: + max_level=self.bin_depth#level_list_filter[0][0] + min_level=0#level_list_filter[len(level_list_filter)-1][0] + #Loop for level_num + step=(max_level-min_level)/level_num + + start_index=0 + + # search all + for i in range(-1,level_num): + group_i=[v[0] for v in level_list_filter if v[0]>min_level+i*step and v[0]<=min_level+(i+1)*step] + if (len(group_i)>0): + search_list.append(max(group_i)) + return search_list + else: + level_list_filter.sort(key=itemgetter(0)) + return [v[0] for v in level_list_filter] + + + def pack(self, preset_cuboid=[],pack_cuboid=[],box_pose=np.identity(4),pick_pose=np.identity(4),level_num=20, display2D=False): + #Get level list + level_list=self.get_level_list(preset_cuboid,pack_cuboid,level_num) + print("Number of searching level=",len(level_list)) + print("List of searching level=",level_list) + + #Start Packing + for i,level in enumerate(level_list): + start= time.time() + packer = newPacker(mode=PackingMode.Online, + bin_algo=PackingBin.BBF, + pack_algo=MaxRectsBssf,#( self.bin_width,self.bin_height), + sort_algo=SORT_AREA, + rotation=True) + packer.add_bin(self.bin_width,self.bin_height) + + + #Note: packer._pack_alg is a class name + #minWH is class attribute + packer._pack_algo.minWH= min(pack_cuboid[3],pack_cuboid[4]) + + for cuboid in preset_cuboid: + if(cuboid[2]+cuboid[5]>level): + packer.add_preset_rect(cuboid[0],cuboid[1],cuboid[3],cuboid[4]) + + print("packer._pack_algo.minWH=",packer._pack_algo.minWH) + + end_preset = time.time() + + #print("pack2d result=",packer._pack_algo.current_pack2D_result) + if (packer.add_rect(pack_cuboid[3], pack_cuboid[4])): + print("SUCCESS level=",i," depth value=",level) + current_pack2D_result=packer[0][len(packer[0])-1] + self.result=[current_pack2D_result.x,current_pack2D_result.y,level,current_pack2D_result.width, current_pack2D_result.height,pack_cuboid[5]] + + #pick pose in box pose coordinate + pick_pose_2_box_pose=(inv(box_pose)).dot(pick_pose) + + pack_pose=np.identity(4) + #checking rotatation of box + if abs(current_pack2D_result.width-pack_cuboid[3])<0.00001 and abs(current_pack2D_result.height-pack_cuboid[4])<0.00001: + #NOT rotated + #cuboid pose in bin coordinate + cuboid_2_bin_pose_tran= np.identity(4) + cuboid_2_bin_pose_tran[:3, 3] = [current_pack2D_result.x,current_pack2D_result.y,level] + + pack_pose=self.bin_pose.dot(cuboid_2_bin_pose_tran.dot(pick_pose_2_box_pose)) + else: + print("NOTE: Box is rotated 90 degrees!") + cuboid_2_bin_pose_tran= np.identity(4) + cuboid_2_bin_pose_tran[:3, 3] = [current_pack2D_result.x+current_pack2D_result.width,current_pack2D_result.y,level] + + cuboid_2_bin_pose_rot= np.identity(4) + cuboid_2_bin_pose_rot[:3, :3] = RotMat.from_euler('z', 90, degrees=True).as_matrix() + + pack_pose=self.bin_pose.dot(cuboid_2_bin_pose_tran.dot(cuboid_2_bin_pose_rot.dot(pick_pose_2_box_pose))) + + + #DRAWING for DEBUG + if (display2D): + plt.figure(figsize=(10,10)) + plt.xlabel('Bin Packing 2D - SolPacker') + plt.xlim(0,self.bin_width) + plt.ylim(0,self.bin_height) + # Get the current reference + ax = plt.gca() + + print("packer[0]=",packer[0]) + for abin in packer: + print("abin.bid=",abin.bid) # Bin id if it has one + for count,rect in enumerate(abin): + # Create a Rectangle patch + rect2D = Rectangle((rect.x,rect.y),rect.width,rect.height,linewidth=2,edgecolor=(0,0,0),facecolor=(random.uniform(0.2, 1), random.uniform(0.2, 1), random.uniform(0.2, 1))) + + # Add the patch to the Axes + ax.add_patch(rect2D) + + ax.text(rect.x+rect.width/2,rect.y+rect.height/2, str(count), fontsize=15) + #print(rect) + + return True,pack_pose + #print("============",packer._pack_algo.minWH) + + print("Retry Fail",i,"Preset Time (s)=", end_preset - start,"Packing 1 cuboid Time (s)=", time.time() -end_preset) + self.result=None + print("PACKING FAIL!") + return False,None + + + + + From 5d73051f2f882f46a8702dccc8c3b7d70966c257 Mon Sep 17 00:00:00 2001 From: locnx1984 Date: Tue, 23 Jun 2020 10:05:11 +0800 Subject: [PATCH 2/7] Update README.md --- README.md | 215 +----------------------------------------------------- 1 file changed, 1 insertion(+), 214 deletions(-) diff --git a/README.md b/README.md index 2cbf865..6a84148 100644 --- a/README.md +++ b/README.md @@ -24,220 +24,7 @@ pip install rectpack ``` ## Basic Usage - -Packing rectangles into a number of bins is very simple: - -```python -from rectpack import newPacker - -rectangles = [(100, 30), (40, 60), (30, 30),(70, 70), (100, 50), (30, 30)] -bins = [(300, 450), (80, 40), (200, 150)] - -packer = newPacker() - -# Add the rectangles to packing queue -for r in rectangles: - packer.add_rect(*r) - -# Add the bins where the rectangles will be placed -for b in bins: - packer.add_bin(*b) - -# Start packing -packer.pack() -``` - -Once the rectangles have been packed the results can be accessed individually - -```python -# Obtain number of bins used for packing -nbins = len(packer) - -# Index first bin -abin = packer[0] - -# Bin dimmensions (bins can be reordered during packing) -width, height = abin.width, abin.height - -# Number of rectangles packed into first bin -nrect = len(packer[0]) - -# Second bin first rectangle -rect = packer[1][0] - -# rect is a Rectangle object -x = rect.x # rectangle bottom-left x coordinate -y = rect.y # rectangle bottom-left y coordinate -w = rect.width -h = rect.height -``` - -looping over all of them - -```python -for abin in packer: - print(abin.bid) # Bin id if it has one - for rect in abin: - print(rect) -``` - -or using **rect_list()** - -```python -# Full rectangle list -all_rects = packer.rect_list() -for rect in all_rects: - b, x, y, w, h, rid = rect - -# b - Bin index -# x - Rectangle bottom-left corner x coordinate -# y - Rectangle bottom-left corner y coordinate -# w - Rectangle width -# h - Rectangle height -# rid - User asigned rectangle id or None -``` - -Lastly all the dimmension (bins and rectangles) must be integers or decimals to avoid -collisions caused by floating point rounding. If your data is floating point use -float2dec to convert float values to decimals (see float below) - - -## API - -A more detailed description of API calls: - -* class **newPacker**([, mode][, bin_algo][, pack_algo][, sort_algo][, rotation]) - Return a new packer object - * mode: Mode of operations - * PackingMode.Offline: The set of rectangles is known beforehand, packing won't - start until *pack()* is called. - * PackingMode.Online: The rectangles are unknown at the beginning of the job, and - will be packed as soon as they are added. - * bin_algo: Bin selection heuristic - * PackingBin.BNF: (Bin Next Fit) If a rectangle doesn't fit into the current bin, - close it and try next one. - * PackingBin.BFF: (Bin First Fit) Pack rectangle into the first bin it fits (without closing) - * PackingBin.BBF: (Bin Best Fit) Pack rectangle into the bin that gives best fitness. - * PackingBin.Global: For each bin pack the rectangle with the best fitness until it is full, - then continue with next bin. - * pack_algo: One of the supported packing algorithms (see list below) - * sort_algo: Rectangle sort order before packing (only for offline mode) - * SORT_NONE: Rectangles left unsorted. - * SORT_AREA: Sort by descending area. - * SORT_PERI: Sort by descending perimeter. - * SORT_DIFF: Sort by difference of rectangle sides. - * SORT_SSIDE: Sort by shortest side. - * SORT_LSIDE: Sort by longest side. - * SORT_RATIO: Sort by ration between sides. - * rotation: Enable or disable rectangle rotation. - - -* packer.**add_bin**(width, height[, count][, bid]) - Add empty bin or bins to a packer - * width: Bin width - * height: Bin height - * count: Number of bins to add, 1 by default. It's possible to add infinie bins - with *count=float("inf")* - * bid: Optional bin identifier - - -* packer.**add_rect**(width, height[, rid]) - Add rectangle to packing queue - * width: Rectangle width - * height: Rectangle height - * rid: User assigned rectangle id - - -* packer.**pack**(): - Starts packing process (only for offline mode). - - -* packer.**rect_list**(): - Returns the list of packed rectangles, each one represented by the tuple (b, x, y, w, h, rid) where: - * b: Index for the bin the rectangle was packed into - * x: X coordinate for the rectangle bottom-left corner - * y: Y coordinate for the rectangle bottom-left corner - * w: Rectangle width - * h: Rectangle height - * rid: User provided id or None - - -## Supported Algorithms - -This library implements three of the algorithms described in [1] Skyline, Maxrects, -and Guillotine, with the following variants: - -* MaxRects - * MaxRectsBl - * MaxRectsBssf - * MaxRectsBaf - * MaxRectsBlsf - - -* Skyline - * SkylineBl - * SkylineBlWm - * SkylineMwf - * SkylineMwfl - * SkylineMwfWm - * SkylineMwflWm - - -* Guillotine - * GuillotineBssfSas - * GuillotineBssfLas - * GuillotineBssfSlas - * GuillotineBssfLlas - * GuillotineBssfMaxas - * GuillotineBssfMinas - * GuillotineBlsfSas - * GuillotineBlsfLas - * GuillotineBlsfSlas - * GuillotineBlsfLlas - * GuillotineBlsfMaxas - * GuillotineBlsfMinas - * GuillotineBafSas - * GuillotineBafLas - * GuillotineBafSlas - * GuillotineBafLlas - * GuillotineBafMaxas - * GuillotineBafMinas - -I recommend to use the default algorithm unless the packing is too slow, in that -case switch to one of the Guillotine variants for example *GuillotineBssfSas*. -You can learn more about the algorithms in [1]. - -## Testing - -Rectpack is thoroughly tested, run the tests with: - -```bash -python setup.py test -``` - -or - -```bash -python -m unittest discover -``` - -## Float - -If you need to use floats just convert them to fixed-point using a Decimal type, -be carefull rounding up so the actual rectangle size is always smaller than -the conversion. Rectpack provides helper funcion **float2dec** for this task, -it accepts a number and the number of decimals to round to, and returns -the rounded Decimal. - -```python - from rectpack import float2dec, newPacker - - float_rects = [...] - dec_rects = [(float2dec(r[0], 3), float2dec(r[1], 3)) for r in float_rects] - - p = newPacker() - ... -``` + ## References From 3c812a8911d98156201150a81926706a788e0d83 Mon Sep 17 00:00:00 2001 From: Loc Date: Tue, 23 Jun 2020 10:07:25 +0800 Subject: [PATCH 3/7] images --- docs/maxrects.png | Bin 29532 -> 29493 bytes docs/skyline.png | Bin 29532 -> 29520 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/maxrects.png b/docs/maxrects.png index 9028e49626ce81289b8262e7e7831829d2fd2f5e..29579f299a1d834e2dd03b7d246f89eb06bf1e38 100644 GIT binary patch literal 29493 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 z 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�{!E!2O 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 CcJG$} diff --git a/docs/skyline.png b/docs/skyline.png index 9028e49626ce81289b8262e7e7831829d2fd2f5e..b9376baca20178ef818b4fed438cb0a8685263d1 100644 GIT binary patch literal 29520 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 PR1fa!|68hI^ZI`Pp09k( literal 29532 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�{!E!2O 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 CcJG$} From 852a41e53b9e25c04eccc57e3238e27b0dbb98ac Mon Sep 17 00:00:00 2001 From: locnx1984 Date: Tue, 23 Jun 2020 10:09:39 +0800 Subject: [PATCH 4/7] Update README.md --- README.md | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/README.md b/README.md index 6a84148..f9bf0f3 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,89 @@ pip install rectpack ## Basic Usage +# -*- coding: utf-8 -*- +""" +Test 3D Bin Packing +Author: Loc Nguyen +""" +from rectpack.packer import SolPalletization +from rectpack import * +import random +import time +import random + + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.patches import Rectangle +from PIL import Image + +# This import registers the 3D projection, but is otherwise unused. +from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import + + + +preset_cuboids =[]# [[0,0,0,50,50,60],[50,0,0,50,50,150],[200,200,0,50,50,300]] +pack_cuiboid=[0,0,0,40,50,10] +bin_size = (300,300,450) + +#generate grid +grid_size_w=28 +grid_size_h=28 + +step_w=bin_size[0]/grid_size_w +step_h=bin_size[1]/grid_size_h + +for i in range(grid_size_w): + for j in range(grid_size_h): + if random.uniform(0,1)>0.5: + preset_cuboids.append([step_w*i,step_h*j,0,step_w,step_h,random.uniform(bin_size[2]/5, bin_size[2]*5/6) ]) + + + +pack3D=SolPalletization(_bin_size=bin_size) +print("Bin Size (W,H,D)=",pack3D.bin_size) +#print("free rect number=",len(pack3D.packer2D._max_rects)) +start= time.time() +success,pack_pose=pack3D.pack(preset_cuboids,pack_cuiboid,box_pose=np.identity(4),pick_pose=np.identity(4), level_num=20,display2D=True) + +end = time.time() +print("Pack time=", end - start) + +#DISPLAY by ROS scene +if success: + print("SUCCESS! pack_pose=\n",pack_pose) + file1 = open("D:\\packing.scene","w") + + # \n is placed to indicate EOL (End of Line) + file1.write("Scene Objects for ROS \n") + + file1.writelines("BIN\n\n") + file1.writelines("1\nbox\n") + file1.writelines(str(bin_size[0])+" "+str(bin_size[1])+" "+str(bin_size[2])+"\n") + file1.writelines(str(bin_size[0]/2)+" "+str(bin_size[1]/2)+" "+str(bin_size[2]/2)+"\n") + file1.writelines("0 0 0 1"+"\n") + file1.writelines("0 0 0 0"+"\n") + + file1.writelines("PACKED_CUIBOID\n\n") + file1.writelines("1\nbox\n") + file1.writelines(str(pack3D.result[3])+" "+str(pack3D.result[4])+" "+str(pack3D.result[5])+"\n") + file1.writelines(str(pack3D.result[0]+pack3D.result[3]/2)+" "+str(pack3D.result[1]+pack3D.result[4]/2)+" "+str(pack3D.result[2]+pack3D.result[5]/2)+"\n") + file1.writelines("0 0 0 1"+"\n") + file1.writelines("0 0 0 0"+"\n") + + + for i,cuboid in enumerate(preset_cuboids): + file1.writelines("cuboid "+str(i)+"\n\n") + file1.writelines("1\nbox\n") + file1.writelines(str(cuboid[3])+" "+str(cuboid[4])+" "+str(cuboid[5])+"\n") + file1.writelines(str(cuboid[0]+cuboid[3]/2)+" "+str(cuboid[1]+cuboid[4]/2)+" "+str(cuboid[2]+cuboid[5]/2)+"\n") + file1.writelines("0 0 0 1"+"\n") + file1.writelines("0 0 0 0"+"\n") + file1.close() #to change file access modes + +#=========================================== ## References [1] Jukka Jylang - A Thousand Ways to Pack the Bin - A Practical Approach to Two-Dimensional From 8472d6f8ed16752bf266655aa08bdb43d7da3c5d Mon Sep 17 00:00:00 2001 From: locnx1984 Date: Tue, 23 Jun 2020 10:12:32 +0800 Subject: [PATCH 5/7] Update README.md --- README.md | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index f9bf0f3..9b2e68d 100644 --- a/README.md +++ b/README.md @@ -42,13 +42,8 @@ import matplotlib.pyplot as plt import numpy as np from matplotlib.patches import Rectangle from PIL import Image - -# This import registers the 3D projection, but is otherwise unused. -from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import - - - -preset_cuboids =[]# [[0,0,0,50,50,60],[50,0,0,50,50,150],[200,200,0,50,50,300]] + +preset_cuboids =[[0,0,0,50,50,60],[50,0,0,50,50,150],[200,200,0,50,50,300]] pack_cuiboid=[0,0,0,40,50,10] bin_size = (300,300,450) @@ -64,8 +59,6 @@ for i in range(grid_size_w): if random.uniform(0,1)>0.5: preset_cuboids.append([step_w*i,step_h*j,0,step_w,step_h,random.uniform(bin_size[2]/5, bin_size[2]*5/6) ]) - - pack3D=SolPalletization(_bin_size=bin_size) print("Bin Size (W,H,D)=",pack3D.bin_size) #print("free rect number=",len(pack3D.packer2D._max_rects)) From a5c47883ac7f3487077a7de22780545470ffacbc Mon Sep 17 00:00:00 2001 From: Loc Date: Tue, 23 Jun 2020 10:25:30 +0800 Subject: [PATCH 6/7] pack pose with dimension --- TEST_3DBIN_PACKER.py | 9 +++++---- rectpack/packer.py | 13 ++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/TEST_3DBIN_PACKER.py b/TEST_3DBIN_PACKER.py index 4fec4ea..790231d 100644 --- a/TEST_3DBIN_PACKER.py +++ b/TEST_3DBIN_PACKER.py @@ -43,14 +43,15 @@ print("Bin Size (W,H,D)=",pack3D.bin_size) #print("free rect number=",len(pack3D.packer2D._max_rects)) start= time.time() -success,pack_pose=pack3D.pack(preset_cuboids,pack_cuiboid,box_pose=np.identity(4),pick_pose=np.identity(4), level_num=20,display2D=True) +success,pack_pose,pack_cuboid3D=pack3D.pack(preset_cuboids,pack_cuiboid,box_pose=np.identity(4),pick_pose=np.identity(4), level_num=20,display2D=True) end = time.time() print("Pack time=", end - start) #DISPLAY by ROS scene if success: - print("SUCCESS! pack_pose=\n",pack_pose) + print("SUCCESS! \npack_pose=\n",pack_pose) + print("pack_cuboid3D=\n",pack_cuboid3D) file1 = open("D:\\packing.scene","w") # \n is placed to indicate EOL (End of Line) @@ -65,8 +66,8 @@ file1.writelines("PACKED_CUIBOID\n\n") file1.writelines("1\nbox\n") - file1.writelines(str(pack3D.result[3])+" "+str(pack3D.result[4])+" "+str(pack3D.result[5])+"\n") - file1.writelines(str(pack3D.result[0]+pack3D.result[3]/2)+" "+str(pack3D.result[1]+pack3D.result[4]/2)+" "+str(pack3D.result[2]+pack3D.result[5]/2)+"\n") + file1.writelines(str(pack_cuboid3D[3])+" "+str(pack_cuboid3D[4])+" "+str(pack_cuboid3D[5])+"\n") + file1.writelines(str(pack_cuboid3D[0]+pack_cuboid3D[3]/2)+" "+str(pack_cuboid3D[1]+pack_cuboid3D[4]/2)+" "+str(pack_cuboid3D[2]+pack_cuboid3D[5]/2)+"\n") file1.writelines("0 0 0 1"+"\n") file1.writelines("0 0 0 0"+"\n") diff --git a/rectpack/packer.py b/rectpack/packer.py index 9c1ff71..282b496 100644 --- a/rectpack/packer.py +++ b/rectpack/packer.py @@ -636,8 +636,7 @@ def __init__(self, _bin_size=(600,380,450),_bin_pose=np.identity(4), rot=True): self.bin_width=_bin_size[0] self.bin_height=_bin_size[1] self.bin_depth=_bin_size[2] - self.bin_pose=_bin_pose - self.result=None + self.bin_pose=_bin_pose def get_level_list(self, preset_cuboid=[],pack_cuboid=[], level_num=20): search_list=[] total_area = self.bin_width * self.bin_height @@ -718,7 +717,7 @@ def pack(self, preset_cuboid=[],pack_cuboid=[],box_pose=np.identity(4),pick_pose if (packer.add_rect(pack_cuboid[3], pack_cuboid[4])): print("SUCCESS level=",i," depth value=",level) current_pack2D_result=packer[0][len(packer[0])-1] - self.result=[current_pack2D_result.x,current_pack2D_result.y,level,current_pack2D_result.width, current_pack2D_result.height,pack_cuboid[5]] + pack_cuboid3D=[current_pack2D_result.x,current_pack2D_result.y,level,current_pack2D_result.width, current_pack2D_result.height,pack_cuboid[5]] #pick pose in box pose coordinate pick_pose_2_box_pose=(inv(box_pose)).dot(pick_pose) @@ -763,15 +762,15 @@ def pack(self, preset_cuboid=[],pack_cuboid=[],box_pose=np.identity(4),pick_pose ax.add_patch(rect2D) ax.text(rect.x+rect.width/2,rect.y+rect.height/2, str(count), fontsize=15) - #print(rect) + - return True,pack_pose + return True,pack_pose,pack_cuboid3D #print("============",packer._pack_algo.minWH) print("Retry Fail",i,"Preset Time (s)=", end_preset - start,"Packing 1 cuboid Time (s)=", time.time() -end_preset) - self.result=None + print("PACKING FAIL!") - return False,None + return False,None,None From cb71657ba7f38e80a453203af52581683bbbf800 Mon Sep 17 00:00:00 2001 From: locnx1984 Date: Tue, 23 Jun 2020 10:28:40 +0800 Subject: [PATCH 7/7] Update README.md license --- README.md | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9b2e68d..631db06 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,27 @@ -# rectpack [![Build Status](https://travis-ci.org/secnot/rectpack.svg?branch=master)](https://travis-ci.org/secnot/rectpack) +# SolPacker Python version [![Build Status](https://travis-ci.org/secnot/rectpack.svg?branch=master)](https://travis-ci.org/secnot/rectpack) + +Packing 3D cuboids with preset items based on rectpack +Copyright (c) 2020 - Loc Nguyen +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. -Improvement of RectPack with preset items - Loc Nguyen Rectpack is a collection of heuristic algorithms for solving the 2D knapsack problem, also known as the bin packing problem. In essence packing a set of rectangles into the