From 98a759196d376a2dae35807d439d5d8f2f47528a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 14 Sep 2016 13:25:29 +0200 Subject: [PATCH 1/2] Simplified Buildvolume CURA-2245 --- cura/BuildVolume.py | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 91aa5a176d..4b8fa3e068 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -81,10 +81,6 @@ class BuildVolume(SceneNode): Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged) self._onGlobalContainerStackChanged() - self._active_extruder_stack = None - ExtruderManager.getInstance().activeExtruderChanged.connect(self._onActiveExtruderStackChanged) - self._onActiveExtruderStackChanged() - self._has_errors = False def setWidth(self, width): @@ -215,11 +211,7 @@ class BuildVolume(SceneNode): minimum = Vector(min_w, min_h - 1.0, min_d), maximum = Vector(max_w, max_h - self._raft_thickness, max_d)) - bed_adhesion_size = 0.0 - - container_stack = Application.getInstance().getGlobalContainerStack() - if container_stack: - bed_adhesion_size = self._getBedAdhesionSize(container_stack) + bed_adhesion_size = self._getBedAdhesionSize() # As this works better for UM machines, we only add the disallowed_area_size for the z direction. # This is probably wrong in all other cases. TODO! @@ -285,13 +277,6 @@ class BuildVolume(SceneNode): self.rebuild() - def _onActiveExtruderStackChanged(self): - if self._active_extruder_stack: - self._active_extruder_stack.propertyChanged.disconnect(self._onSettingPropertyChanged) - self._active_extruder_stack = ExtruderManager.getInstance().getActiveExtruderStack() - if self._active_extruder_stack: - self._active_extruder_stack.propertyChanged.connect(self._onSettingPropertyChanged) - def _onSettingPropertyChanged(self, setting_key, property_name): if property_name != "value": return @@ -364,7 +349,7 @@ class BuildVolume(SceneNode): [prime_x - PRIME_CLEARANCE, prime_y + PRIME_CLEARANCE], ]) - bed_adhesion_size = self._getBedAdhesionSize(self._global_container_stack) + bed_adhesion_size = self._getBedAdhesionSize() if disallowed_areas: # Extend every area already in the disallowed_areas with the skirt size. @@ -426,7 +411,10 @@ class BuildVolume(SceneNode): self._disallowed_areas = areas ## Convenience function to calculate the size of the bed adhesion in directions x, y. - def _getBedAdhesionSize(self, container_stack): + def _getBedAdhesionSize(self): + if not self._global_container_stack: + return 0 + container_stack = self._global_container_stack skirt_size = 0.0 # If we are printing one at a time, we need to add the bed adhesion size to the disallowed areas of the objects From 277123d1d31ff7c8551bb5d42fe1237497729858 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 15 Sep 2016 09:42:13 +0200 Subject: [PATCH 2/2] Brim, raft & skirt settings are now retrieved from correct extruder (if any) CURA-2245 --- cura/BuildVolume.py | 33 ++++++++++++++++++++++++++++----- cura/ConvexHullDecorator.py | 37 +++++++++++++++++++++++++++++-------- 2 files changed, 57 insertions(+), 13 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 4b8fa3e068..acce9ee480 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -22,6 +22,8 @@ catalog = i18nCatalog("cura") import numpy import copy +import UM.Settings.ContainerRegistry + # Setting for clearance around the prime PRIME_CLEARANCE = 10 @@ -256,11 +258,17 @@ class BuildVolume(SceneNode): def _onGlobalContainerStackChanged(self): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onSettingPropertyChanged) + extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + for extruder in extruders: + extruder.propertyChanged.disconnect(self._onSettingPropertyChanged) self._global_container_stack = Application.getInstance().getGlobalContainerStack() if self._global_container_stack: self._global_container_stack.propertyChanged.connect(self._onSettingPropertyChanged) + extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()) + for extruder in extruders: + extruder.propertyChanged.connect(self._onSettingPropertyChanged) self._width = self._global_container_stack.getProperty("machine_width", "value") machine_height = self._global_container_stack.getProperty("machine_height", "value") @@ -410,6 +418,21 @@ class BuildVolume(SceneNode): self._has_errors = collision self._disallowed_areas = areas + ## Private convenience function to get a setting from the correct extruder (as defined by limit_to_extruder property). + def _getSettingProperty(self, setting_key, property = "value"): + multi_extrusion = self._global_container_stack.getProperty("machine_extruder_count", "value") > 1 + + if not multi_extrusion: + return self._global_container_stack.getProperty(setting_key, property) + + extruder_index = self._global_container_stack.getProperty(setting_key, "limit_to_extruder") + if extruder_index == "-1": # If extruder index is -1 use global instead + return self._global_container_stack.getProperty(setting_key, property) + + extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] + stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = extruder_stack_id)[0] + return stack.getProperty(setting_key, property) + ## Convenience function to calculate the size of the bed adhesion in directions x, y. def _getBedAdhesionSize(self): if not self._global_container_stack: @@ -423,13 +446,13 @@ class BuildVolume(SceneNode): adhesion_type = container_stack.getProperty("adhesion_type", "value") if adhesion_type == "skirt": - skirt_distance = container_stack.getProperty("skirt_gap", "value") - skirt_line_count = container_stack.getProperty("skirt_line_count", "value") - skirt_size = skirt_distance + (skirt_line_count * container_stack.getProperty("skirt_brim_line_width", "value")) + skirt_distance = self._getSettingProperty("skirt_gap", "value") + skirt_line_count = self._getSettingProperty("skirt_line_count", "value") + skirt_size = skirt_distance + (skirt_line_count * self._getSettingProperty("skirt_brim_line_width", "value")) elif adhesion_type == "brim": - skirt_size = container_stack.getProperty("brim_line_count", "value") * container_stack.getProperty("skirt_brim_line_width", "value") + skirt_size = self._getSettingProperty("brim_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value") elif adhesion_type == "raft": - skirt_size = container_stack.getProperty("raft_margin", "value") + skirt_size = self._getSettingProperty("raft_margin", "value") if container_stack.getProperty("draft_shield_enabled", "value"): skirt_size += container_stack.getProperty("draft_shield_dist", "value") diff --git a/cura/ConvexHullDecorator.py b/cura/ConvexHullDecorator.py index 770ed42a9f..4397251b6e 100644 --- a/cura/ConvexHullDecorator.py +++ b/cura/ConvexHullDecorator.py @@ -1,9 +1,11 @@ from UM.Scene.SceneNodeDecorator import SceneNodeDecorator from UM.Application import Application - +from cura.Settings.ExtruderManager import ExtruderManager from UM.Math.Polygon import Polygon from . import ConvexHullNode +import UM.Settings.ContainerRegistry + import numpy ## The convex hull decorator is a scene node decorator that adds the convex hull functionality to a scene node. @@ -227,18 +229,15 @@ class ConvexHullDecorator(SceneNodeDecorator): # Add extra margin depending on adhesion type adhesion_type = self._global_stack.getProperty("adhesion_type", "value") extra_margin = 0 - machine_head_coords = numpy.array( - self._global_stack.getProperty("machine_head_with_fans_polygon", "value"), - numpy.float32) if adhesion_type == "raft": - extra_margin = max(0, self._global_stack.getProperty("raft_margin", "value")) + extra_margin = max(0, self._getSettingProperty("raft_margin", "value")) elif adhesion_type == "brim": - extra_margin = max(0, self._global_stack.getProperty("brim_line_count", "value") * self._global_stack.getProperty("skirt_brim_line_width", "value")) + extra_margin = max(0, self._getSettingProperty("brim_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value")) elif adhesion_type == "skirt": extra_margin = max( - 0, self._global_stack.getProperty("skirt_gap", "value") + - self._global_stack.getProperty("skirt_line_count", "value") * self._global_stack.getProperty("skirt_brim_line_width", "value")) + 0, self._getSettingProperty("skirt_gap", "value") + + self._getSettingPropertyy("skirt_line_count", "value") * self._getSettingProperty("skirt_brim_line_width", "value")) # adjust head_and_fans with extra margin if extra_margin > 0: @@ -268,6 +267,9 @@ class ConvexHullDecorator(SceneNodeDecorator): if self._global_stack: self._global_stack.propertyChanged.disconnect(self._onSettingValueChanged) self._global_stack.containersChanged.disconnect(self._onChanged) + extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_stack.getId()) + for extruder in extruders: + extruder.propertyChanged.disconnect(self._onSettingValueChanged) self._global_stack = Application.getInstance().getGlobalContainerStack() @@ -275,8 +277,27 @@ class ConvexHullDecorator(SceneNodeDecorator): self._global_stack.propertyChanged.connect(self._onSettingValueChanged) self._global_stack.containersChanged.connect(self._onChanged) + extruders = ExtruderManager.getInstance().getMachineExtruders(self._global_stack.getId()) + for extruder in extruders: + extruder.propertyChanged.connect(self._onSettingValueChanged) + self._onChanged() + ## Private convenience function to get a setting from the correct extruder (as defined by limit_to_extruder property). + def _getSettingProperty(self, setting_key, property="value"): + multi_extrusion = self._global_stack.getProperty("machine_extruder_count", "value") > 1 + + if not multi_extrusion: + return self._global_stack.getProperty(setting_key, property) + + extruder_index = self._global_stack.getProperty(setting_key, "limit_to_extruder") + if extruder_index == "-1": # If extruder index is -1 use global instead + return self._global_stack.getProperty(setting_key, property) + + extruder_stack_id = ExtruderManager.getInstance().extruderIds[str(extruder_index)] + stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id=extruder_stack_id)[0] + return stack.getProperty(setting_key, property) + ## Returns true if node is a descendent or the same as the root node. def __isDescendant(self, root, node): if node is None: