diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index d3bd3be61f..9a2a0b9c7a 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -175,10 +175,17 @@ class ConvexHullDecorator(SceneNodeDecorator): self._convex_hull_node = None return - convex_hull = self.getConvexHull() + if self._global_stack \ + and self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" \ + and not self.hasGroupAsParent(self._node): + # In one-at-a-time mode, every printed object gets it's own adhesion + printing_area = self.getAdhesionArea() + else: + printing_area = self.getConvexHull() + if self._convex_hull_node: self._convex_hull_node.setParent(None) - hull_node = ConvexHullNode.ConvexHullNode(self._node, convex_hull, self._raft_thickness, root) + hull_node = ConvexHullNode.ConvexHullNode(self._node, printing_area, self._raft_thickness, root) self._convex_hull_node = hull_node def _onSettingValueChanged(self, key: str, property_name: str) -> None: diff --git a/cura/Scene/ConvexHullNode.py b/cura/Scene/ConvexHullNode.py index 90bf536308..6aa71223e5 100644 --- a/cura/Scene/ConvexHullNode.py +++ b/cura/Scene/ConvexHullNode.py @@ -43,6 +43,7 @@ class ConvexHullNode(SceneNode): # The node this mesh is "watching" self._node = node + # Area of the head + fans for display as a shadow on the buildplate self._convex_hull_head_mesh = None self._node.decoratorsChanged.connect(self._onNodeDecoratorsChanged) @@ -76,14 +77,17 @@ class ConvexHullNode(SceneNode): if self.getParent(): if self.getMeshData() and isinstance(self._node, SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getMultiBuildPlateModel().activeBuildPlate: + # The object itself (+ adhesion in one-at-a-time mode) renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8) if self._convex_hull_head_mesh: + # The full head. Rendered as a hint to the user: If this area overlaps another object A; this object + # cannot be printed after A, because the head would hit A while printing the current object renderer.queueNode(self, shader = ConvexHullNode.shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8) return True def _onNodeDecoratorsChanged(self, node: SceneNode) -> None: - convex_hull_head = self._node.callDecoration("getConvexHullHead") + convex_hull_head = self._node.callDecoration("getConvexHullHeadFull") if convex_hull_head: convex_hull_head_builder = MeshBuilder() convex_hull_head_builder.addConvexPolygon(convex_hull_head.getPoints(), self._mesh_height - self._thickness)