From e19f5ee330d31abe9d7246ed9c109d4bb54e520c Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Thu, 6 Mar 2025 10:58:54 +0100 Subject: [PATCH] Do not move objects if auto-arrange fails CURA-12169 When doing an explicit auto-arrange that can not find a complete solution, it is better not to move the objects because they will probably end up in a weird position --- cura/Arranging/ArrangeObjectsJob.py | 2 +- cura/Arranging/Arranger.py | 10 +++++++--- cura/MultiplyObjectsJob.py | 1 + 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index 48d2436482..d494a79327 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -40,7 +40,7 @@ class ArrangeObjectsJob(Job): found_solution_for_all = False try: - found_solution_for_all = arranger.arrange() + found_solution_for_all = arranger.arrange(only_if_full_success = True) except: # If the thread crashes, the message should still close Logger.logException("e", "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.") diff --git a/cura/Arranging/Arranger.py b/cura/Arranging/Arranger.py index fd93ab1846..d0a78431f6 100644 --- a/cura/Arranging/Arranger.py +++ b/cura/Arranging/Arranger.py @@ -16,12 +16,16 @@ class Arranger: """ raise NotImplementedError - def arrange(self, add_new_nodes_in_scene: bool = False) -> bool: + def arrange(self, add_new_nodes_in_scene: bool = False, only_if_full_success: bool = False) -> bool: """ Find placement for a set of scene nodes, and move them by using a single grouped operation. :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations :return: found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects """ grouped_operation, not_fit_count = self.createGroupOperationForArrange(add_new_nodes_in_scene) - grouped_operation.push() - return not_fit_count == 0 + full_success = not_fit_count == 0 + + if full_success or not only_if_full_success: + grouped_operation.push() + + return full_success diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 889b6f5d1a..024baa50f5 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -84,6 +84,7 @@ class MultiplyObjectsJob(Job): arranger = Nest2DArrange(nodes, Application.getInstance().getBuildVolume(), fixed_nodes, factor=1000) group_operation, not_fit_count = arranger.createGroupOperationForArrange(add_new_nodes_in_scene=True) + found_solution_for_all = not_fit_count == 0 if nodes_to_add_without_arrange: for nested_node in nodes_to_add_without_arrange: