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/9] 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/9] 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: From 790ad4a09ea5769641bf1223c5aab5462c978735 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 15 Sep 2016 10:20:25 +0200 Subject: [PATCH 3/9] Show simple extruder names in Printers menu --- resources/qml/Cura.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index eba803ef28..d9942f3298 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -140,7 +140,7 @@ UM.MainWindow Instantiator { - model: Cura.ExtrudersModel { } + model: Cura.ExtrudersModel { simpleNames: true } Menu { title: model.name visible: machineExtruderCount.properties.value > 1 From b914aefac638d5b40fe1ab875f4fd4a6d45f94c3 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 15 Sep 2016 11:48:48 +0200 Subject: [PATCH 4/9] Allow fractional input --- .../MachineSettingsAction.qml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index 3c1839e07f..2e491b0d38 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -77,7 +77,7 @@ Cura.MachineAction { id: buildAreaWidthField text: machineWidthProvider.properties.value - validator: RegExpValidator { regExp: /[0-9]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } onEditingFinished: { machineWidthProvider.setPropertyValue("value", text); manager.forceUpdate() } } Label @@ -93,7 +93,7 @@ Cura.MachineAction { id: buildAreaDepthField text: machineDepthProvider.properties.value - validator: RegExpValidator { regExp: /[0-9]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } onEditingFinished: { machineDepthProvider.setPropertyValue("value", text); manager.forceUpdate() } } Label @@ -109,7 +109,7 @@ Cura.MachineAction { id: buildAreaHeightField text: machineHeightProvider.properties.value - validator: RegExpValidator { regExp: /[0-9]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } onEditingFinished: { machineHeightProvider.setPropertyValue("value", text); manager.forceUpdate() } } Label @@ -182,7 +182,7 @@ Cura.MachineAction { id: printheadXMinField text: getHeadPolygonCoord("x", "min") - validator: RegExpValidator { regExp: /[0-9]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } onEditingFinished: setHeadPolygon() } Label @@ -198,7 +198,7 @@ Cura.MachineAction { id: printheadYMinField text: getHeadPolygonCoord("y", "min") - validator: RegExpValidator { regExp: /[0-9]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } onEditingFinished: setHeadPolygon() } Label @@ -214,7 +214,7 @@ Cura.MachineAction { id: printheadXMaxField text: getHeadPolygonCoord("x", "max") - validator: RegExpValidator { regExp: /[0-9]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } onEditingFinished: setHeadPolygon() } Label @@ -230,7 +230,7 @@ Cura.MachineAction { id: printheadYMaxField text: getHeadPolygonCoord("y", "max") - validator: RegExpValidator { regExp: /[0-9]{0,6}/ } + validator: RegExpValidator { regExp: /[0-9\.]{0,6}/ } onEditingFinished: setHeadPolygon() } Label From c223044541cac81ff4176635528bbeab70507587 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 15 Sep 2016 12:45:20 +0200 Subject: [PATCH 5/9] Don't modify original dict while iterating over it Just store the results in a new dict and return that one. --- .../VersionUpgrade21to22.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py index 286667f5b0..2c1289e3f5 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py @@ -390,17 +390,20 @@ class VersionUpgrade21to22(VersionUpgrade): # \return The same dictionary. @staticmethod def translateSettings(settings): + new_settings = {} for key, value in settings.items(): if key in _removed_settings: - del settings[key] - elif key == "retraction_combing": #Combing was made into an enum instead of a boolean. - settings[key] = "off" if (value == "False") else "all" - elif key in _setting_name_translations: - del settings[key] - settings[_setting_name_translations[key]] = value + continue + if key == "retraction_combing": #Combing was made into an enum instead of a boolean. + new_settings[key] = "off" if (value == "False") else "all" + continue + if key in _setting_name_translations: + new_settings[_setting_name_translations[key]] = value + continue + new_settings[key] = value if "infill_overlap" in settings: # New setting, added in 2.3 - settings["skin_overlap"] = settings["infill_overlap"] - return settings + new_settings["skin_overlap"] = settings["infill_overlap"] + return new_settings ## Translates a setting name for the change from Cura 2.1 to 2.2. # From ef3b6905b7412809ad7af348ba40db7bfa9a4d55 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 15 Sep 2016 12:47:31 +0200 Subject: [PATCH 6/9] Translate skin overlap properly From this dict it also gets updated in other places, such as the preferences. Contributes to issue CURA-844. --- .../VersionUpgrade21to22/VersionUpgrade21to22.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py index 2c1289e3f5..2b5fc1f7ee 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py @@ -130,6 +130,7 @@ _setting_name_translations = { "remove_overlapping_walls_enabled": "travel_compensate_overlapping_walls_enabled", "remove_overlapping_walls_x_enabled": "travel_compensate_overlapping_walls_x_enabled", "retraction_hop": "retraction_hop_enabled", + "skin_overlap": "infill_overlap", "skirt_line_width": "skirt_brim_line_width", "skirt_minimal_length": "skirt_brim_minimal_length", "skirt_speed": "skirt_brim_speed", @@ -401,8 +402,6 @@ class VersionUpgrade21to22(VersionUpgrade): new_settings[_setting_name_translations[key]] = value continue new_settings[key] = value - if "infill_overlap" in settings: # New setting, added in 2.3 - new_settings["skin_overlap"] = settings["infill_overlap"] return new_settings ## Translates a setting name for the change from Cura 2.1 to 2.2. From 0af26cc4a7fd08daa11335b0642412b3f7402c3b Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 15 Sep 2016 13:15:19 +0200 Subject: [PATCH 7/9] Prevent qml warning when no printer is connected --- resources/qml/Menus/MaterialMenu.qml | 8 ++++++-- resources/qml/Menus/NozzleMenu.qml | 8 ++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index d2e6bc03ce..534be456ed 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -20,8 +20,12 @@ Menu id: automaticMaterial text: { - var materialName = Cura.MachineManager.printerOutputDevices[0].materialNames[extruderIndex]; - return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(materialName); + if(printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex) + { + var materialName = Cura.MachineManager.printerOutputDevices[0].materialNames[extruderIndex]; + return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(materialName); + } + return ""; } visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex onTriggered: diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index 7f1c652c4a..f377690219 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -20,8 +20,12 @@ Menu id: automaticNozzle text: { - var nozzleName = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; - return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(nozzleName); + if(printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex) + { + var nozzleName = Cura.MachineManager.printerOutputDevices[0].hotendIds[extruderIndex]; + return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(nozzleName); + } + return ""; } visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].hotendIds.length > extruderIndex onTriggered: From d0ad654108bfc56a9cb554d95e960e6702ffec67 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 15 Sep 2016 13:39:41 +0200 Subject: [PATCH 8/9] Re-enable selectMultiple for the open file dialog Fixes CURA-2198 --- resources/qml/Cura.qml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index d9942f3298..89f58d76f9 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -641,8 +641,7 @@ UM.MainWindow //: File open dialog title title: catalog.i18nc("@title:window","Open file") modality: UM.Application.platform == "linux" ? Qt.NonModal : Qt.WindowModal; - //TODO: Support multiple file selection, workaround bug in KDE file dialog - //selectMultiple: true + selectMultiple: true nameFilters: UM.MeshFileHandler.supportedReadFileTypes; folder: CuraApplication.getDefaultPath("dialog_load_path") onAccepted: @@ -653,7 +652,12 @@ UM.MainWindow folder = f; CuraApplication.setDefaultPath("dialog_load_path", folder); - UM.MeshFileHandler.readLocalFile(fileUrl) + + for(var i in fileUrls) + { + UM.MeshFileHandler.readLocalFile(fileUrls[i]) + } + var meshName = backgroundItem.getMeshName(fileUrl.toString()) backgroundItem.hasMesh(decodeURIComponent(meshName)) } From 04ce21d48e136c0fb90904da85e7e36e14c28abf Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 15 Sep 2016 14:44:40 +0200 Subject: [PATCH 9/9] Only show additional components info for the currently active printer CURA-2276 --- resources/qml/Preferences/MachinesPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index a5e985efe0..f2937c04e6 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -207,6 +207,7 @@ UM.ManagementPage anchors.topMargin: UM.Theme.getSize("default_margin").width spacing: UM.Theme.getSize("default_margin").width + visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId Component.onCompleted: {