From c5cee31e14cb7a2c28ea465000115f03716a970a Mon Sep 17 00:00:00 2001 From: jeffery Date: Fri, 8 Dec 2023 08:54:05 +0800 Subject: [PATCH 1/5] add overturn flag and fix all strange rotation_type == 5 --- py3dbp/main.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/py3dbp/main.py b/py3dbp/main.py index 9083a69..3d7299e 100644 --- a/py3dbp/main.py +++ b/py3dbp/main.py @@ -1,12 +1,14 @@ from .constants import RotationType, Axis from .auxiliary_methods import intersect, set_to_decimal +import copy + DEFAULT_NUMBER_OF_DECIMALS = 3 START_POSITION = [0, 0, 0] class Item: - def __init__(self, name, width, height, depth, weight): + def __init__(self, name, width, height, depth, weight, overturn=True): self.name = name self.width = width self.height = height @@ -15,6 +17,7 @@ def __init__(self, name, width, height, depth, weight): self.rotation_type = 0 self.position = START_POSITION self.number_of_decimals = DEFAULT_NUMBER_OF_DECIMALS + self.overturn = overturn def format_numbers(self, number_of_decimals): self.width = set_to_decimal(self.width, number_of_decimals) @@ -92,11 +95,15 @@ def get_total_weight(self): def put_item(self, item, pivot): fit = False + item = copy.deepcopy(item) valid_item_position = item.position item.position = pivot for i in range(0, len(RotationType.ALL)): item.rotation_type = i + if not item.overturn and i not in [RotationType.RT_WHD, RotationType.RT_DHW]: + continue + dimension = item.get_dimension() if ( self.width < pivot[0] + dimension[0] or From 225c12ef42f1ea202c0eb617851511b57faad5fb Mon Sep 17 00:00:00 2001 From: jeffery Date: Fri, 8 Dec 2023 11:07:02 +0800 Subject: [PATCH 2/5] fix --- py3dbp/main.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/py3dbp/main.py b/py3dbp/main.py index 3d7299e..11cc2de 100644 --- a/py3dbp/main.py +++ b/py3dbp/main.py @@ -95,13 +95,14 @@ def get_total_weight(self): def put_item(self, item, pivot): fit = False - item = copy.deepcopy(item) valid_item_position = item.position item.position = pivot for i in range(0, len(RotationType.ALL)): item.rotation_type = i if not item.overturn and i not in [RotationType.RT_WHD, RotationType.RT_DHW]: + item.position = valid_item_position + item.rotation_type = RotationType.RT_WHD continue dimension = item.get_dimension() From 3a6615f0e7ef93c2748b510125d2456fccbd7511 Mon Sep 17 00:00:00 2001 From: jeffery Date: Fri, 8 Dec 2023 11:15:26 +0800 Subject: [PATCH 3/5] restore position and rotation --- py3dbp/main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/py3dbp/main.py b/py3dbp/main.py index 11cc2de..a884ec1 100644 --- a/py3dbp/main.py +++ b/py3dbp/main.py @@ -111,6 +111,8 @@ def put_item(self, item, pivot): self.height < pivot[1] + dimension[1] or self.depth < pivot[2] + dimension[2] ): + item.position = valid_item_position + item.rotation_type = RotationType.RT_WHD continue fit = True @@ -118,22 +120,28 @@ def put_item(self, item, pivot): for current_item_in_bin in self.items: if intersect(current_item_in_bin, item): fit = False + item.position = valid_item_position + item.rotation_type = RotationType.RT_WHD break if fit: if self.get_total_weight() + item.weight > self.max_weight: fit = False + item.position = valid_item_position + item.rotation_type = RotationType.RT_WHD return fit self.items.append(item) if not fit: item.position = valid_item_position + item.rotation_type = RotationType.RT_WHD return fit if not fit: item.position = valid_item_position + item.rotation_type = RotationType.RT_WHD return fit From 1b1b6b71594b8df4a8cff96be10a325730ee807a Mon Sep 17 00:00:00 2001 From: jeffery Date: Fri, 8 Dec 2023 11:52:39 +0800 Subject: [PATCH 4/5] fix --- py3dbp/main.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/py3dbp/main.py b/py3dbp/main.py index a884ec1..57d9492 100644 --- a/py3dbp/main.py +++ b/py3dbp/main.py @@ -1,8 +1,6 @@ from .constants import RotationType, Axis from .auxiliary_methods import intersect, set_to_decimal -import copy - DEFAULT_NUMBER_OF_DECIMALS = 3 START_POSITION = [0, 0, 0] @@ -95,14 +93,14 @@ def get_total_weight(self): def put_item(self, item, pivot): fit = False + item = copy.deepcopy(item) valid_item_position = item.position item.position = pivot for i in range(0, len(RotationType.ALL)): item.rotation_type = i + if not item.overturn and i not in [RotationType.RT_WHD, RotationType.RT_DHW]: - item.position = valid_item_position - item.rotation_type = RotationType.RT_WHD continue dimension = item.get_dimension() @@ -111,8 +109,6 @@ def put_item(self, item, pivot): self.height < pivot[1] + dimension[1] or self.depth < pivot[2] + dimension[2] ): - item.position = valid_item_position - item.rotation_type = RotationType.RT_WHD continue fit = True @@ -120,28 +116,22 @@ def put_item(self, item, pivot): for current_item_in_bin in self.items: if intersect(current_item_in_bin, item): fit = False - item.position = valid_item_position - item.rotation_type = RotationType.RT_WHD break if fit: if self.get_total_weight() + item.weight > self.max_weight: fit = False - item.position = valid_item_position - item.rotation_type = RotationType.RT_WHD return fit self.items.append(item) if not fit: item.position = valid_item_position - item.rotation_type = RotationType.RT_WHD return fit if not fit: item.position = valid_item_position - item.rotation_type = RotationType.RT_WHD return fit From 294475bf179744646e7e8f323504fc9b3eb8c87e Mon Sep 17 00:00:00 2001 From: jeffery Date: Tue, 12 Dec 2023 11:28:36 +0800 Subject: [PATCH 5/5] fix --- py3dbp/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/py3dbp/main.py b/py3dbp/main.py index 57d9492..7ec9bd7 100644 --- a/py3dbp/main.py +++ b/py3dbp/main.py @@ -93,7 +93,6 @@ def get_total_weight(self): def put_item(self, item, pivot): fit = False - item = copy.deepcopy(item) valid_item_position = item.position item.position = pivot