From f59c9383dabce1b11ddf7cdeec72cf4a53945fdd Mon Sep 17 00:00:00 2001 From: mobilityapplab <50751850+mobilityapplab@users.noreply.github.com> Date: Tue, 4 Feb 2020 14:00:23 -0500 Subject: [PATCH 01/45] Update fdmprinter.def.json Add Smoothie Firmware Flavor option. --- resources/definitions/fdmprinter.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 3a222215d8..e25eedd7bf 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -369,7 +369,8 @@ "Makerbot": "Makerbot", "BFB": "Bits from Bytes", "MACH3": "Mach3", - "Repetier": "Repetier" + "Repetier": "Repetier", + "Smoothie": "Smoothie" }, "default_value": "RepRap (Marlin/Sprinter)", "settable_per_mesh": false, From 6e09e9821f204656d380bf775bec4e71dfc9acd6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 22 Mar 2020 18:23:32 +0100 Subject: [PATCH 02/45] Show support settings when support meshes are present in the scene --- cura/Scene/CuraSceneController.py | 31 +++- cura/Scene/CuraSceneNode.py | 6 + resources/definitions/fdmprinter.def.json | 175 ++++++++++++---------- 3 files changed, 129 insertions(+), 83 deletions(-) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index 36d9e68c8f..f97fde0f7e 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -6,13 +6,15 @@ from PyQt5.QtWidgets import QApplication from UM.Scene.Camera import Camera from cura.UI.ObjectsModel import ObjectsModel from cura.Machines.Models.MultiBuildPlateModel import MultiBuildPlateModel +from cura.Scene.CuraSceneNode import CuraSceneNode from UM.Application import Application from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Signal import Signal - +from UM.Settings.SettingFunction import SettingFunction +from UM.Settings.ContainerRegistry import ContainerRegistry class CuraSceneController(QObject): activeBuildPlateChanged = Signal() @@ -43,6 +45,24 @@ class CuraSceneController(QObject): self._change_timer.start() def updateMaxBuildPlate(self, *args): + global_stack = Application.getInstance().getGlobalContainerStack() + if global_stack: + scene_has_support_meshes = self._sceneHasSupportMeshes() # TODO: see if this can be cached + if scene_has_support_meshes != global_stack.getProperty("support_meshes_present", "value"): + # adjust the setting without having the setting value in an InstanceContainer + setting_definitions = global_stack.definition.findDefinitions(key="support_meshes_present") + if setting_definitions: + relations = setting_definitions[0].relations + definition_dict = setting_definitions[0].serialize_to_dict() + definition_dict["enabled"] = False + definition_dict["default_value"] = scene_has_support_meshes + setting_definitions[0].deserialize(definition_dict) + setting_definitions[0]._relations = relations # TODO: find a better way to restore relations + + # notify relations that the setting has changed + for relation in relations: + global_stack.propertyChanged.emit(relation.target.key, "enabled") + max_build_plate = self._calcMaxBuildPlate() changed = False if max_build_plate != self._max_build_plate: @@ -72,6 +92,15 @@ class CuraSceneController(QObject): max_build_plate = max(build_plate_number, max_build_plate) return max_build_plate + def _sceneHasSupportMeshes(self): + root = Application.getInstance().getController().getScene().getRoot() + for node in root.getAllChildren(): + if isinstance(node, CuraSceneNode): + per_mesh_stack = node.callDecoration("getStack") + if per_mesh_stack and per_mesh_stack.getProperty("support_mesh", "value"): + return True + return False + ## Either select or deselect an item @pyqtSlot(int) def changeSelection(self, index): diff --git a/cura/Scene/CuraSceneNode.py b/cura/Scene/CuraSceneNode.py index eb609def5a..df01c79a29 100644 --- a/cura/Scene/CuraSceneNode.py +++ b/cura/Scene/CuraSceneNode.py @@ -36,6 +36,12 @@ class CuraSceneNode(SceneNode): def isSelectable(self) -> bool: return super().isSelectable() and self.callDecoration("getBuildPlateNumber") == cura.CuraApplication.CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate + def isSupportMesh(self) -> bool: + per_mesh_stack = self.callDecoration("getStack") + if not per_mesh_stack: + return False + return per_mesh_stack.getProperty("support_mesh", "value") + ## Get the extruder used to print this node. If there is no active node, then the extruder in position zero is returned # TODO The best way to do it is by adding the setActiveExtruder decorator to every node when is loaded def getPrintingExtruder(self) -> Optional[ExtruderStack]: diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index fc9c0ac613..83f4c5943c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -890,7 +890,7 @@ "maximum_value_warning": "3 * machine_nozzle_size", "default_value": 0.4, "type": "float", - "enabled": "(support_enable or support_tree_enable)", + "enabled": "(support_enable or support_tree_enable or support_meshes_present)", "value": "line_width", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, @@ -906,7 +906,7 @@ "minimum_value_warning": "0.1 + 0.4 * machine_nozzle_size", "maximum_value_warning": "2 * machine_nozzle_size", "type": "float", - "enabled": "(support_enable or support_tree_enable) and support_interface_enable", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_interface_enable", "limit_to_extruder": "support_interface_extruder_nr", "value": "line_width", "settable_per_mesh": false, @@ -923,7 +923,7 @@ "minimum_value_warning": "0.4 * machine_nozzle_size", "maximum_value_warning": "2 * machine_nozzle_size", "type": "float", - "enabled": "(support_enable or support_tree_enable) and support_roof_enable", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_roof_enable", "limit_to_extruder": "support_roof_extruder_nr", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_line_width')", "settable_per_mesh": false, @@ -939,7 +939,7 @@ "minimum_value_warning": "0.4 * machine_nozzle_size", "maximum_value_warning": "2 * machine_nozzle_size", "type": "float", - "enabled": "(support_enable or support_tree_enable) and support_bottom_enable", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_bottom_enable", "limit_to_extruder": "support_bottom_extruder_nr", "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_line_width')", "settable_per_mesh": false, @@ -2848,7 +2848,7 @@ "maximum_value_warning": "150", "default_value": 60, "value": "speed_print", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "settable_per_mesh": false, "limit_to_extruder": "support_extruder_nr", "settable_per_extruder": true, @@ -2865,7 +2865,7 @@ "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", "value": "speed_support", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -2880,7 +2880,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_interface_extruder_nr", "value": "speed_support / 1.5", "settable_per_mesh": false, @@ -2897,7 +2897,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_roof_extruder_nr", "value": "extruderValue(support_roof_extruder_nr, 'speed_support_interface')", "settable_per_mesh": false, @@ -2913,7 +2913,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_bottom_extruder_nr", "value": "extruderValue(support_bottom_extruder_nr, 'speed_support_interface')", "settable_per_mesh": false, @@ -3188,7 +3188,7 @@ "maximum_value_warning": "10000", "default_value": 3000, "value": "acceleration_print", - "enabled": "resolveOrValue('acceleration_enabled') and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('acceleration_enabled') and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "limit_to_extruder": "support_extruder_nr", "settable_per_extruder": true, @@ -3205,7 +3205,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('acceleration_enabled') and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3221,7 +3221,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('acceleration_enabled') and support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3238,7 +3238,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "acceleration_enabled and support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "acceleration_enabled and support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3254,7 +3254,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "acceleration_enabled and support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "acceleration_enabled and support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3473,7 +3473,7 @@ "maximum_value_warning": "50", "default_value": 20, "value": "jerk_print", - "enabled": "resolveOrValue('jerk_enabled') and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('jerk_enabled') and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true, "limit_to_extruder": "support_extruder_nr", @@ -3489,7 +3489,7 @@ "value": "jerk_support", "minimum_value": "0", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('jerk_enabled') and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3504,7 +3504,7 @@ "value": "jerk_support", "minimum_value": "0", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('jerk_enabled') and support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_interface_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, @@ -3520,7 +3520,7 @@ "value": "extruderValue(support_roof_extruder_nr, 'jerk_support_interface')", "minimum_value": "0", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('jerk_enabled') and support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3535,7 +3535,7 @@ "value": "extruderValue(support_roof_extruder_nr, 'jerk_support_interface')", "minimum_value": "0", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('jerk_enabled') and support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3779,7 +3779,7 @@ "description": "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure.", "type": "bool", "default_value": true, - "enabled": "retraction_enable and (support_enable or support_tree_enable)", + "enabled": "retraction_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -4109,7 +4109,7 @@ "type": "extruder", "default_value": "0", "value": "int(defaultExtruderPosition())", - "enabled": "(support_enable or support_tree_enable) and extruders_enabled_count > 1", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and extruders_enabled_count > 1", "settable_per_mesh": false, "settable_per_extruder": false, "children": { @@ -4120,7 +4120,7 @@ "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and extruders_enabled_count > 1", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and extruders_enabled_count > 1", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -4131,7 +4131,7 @@ "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and extruders_enabled_count > 1", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and extruders_enabled_count > 1", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -4142,7 +4142,7 @@ "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and extruders_enabled_count > 1", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and extruders_enabled_count > 1", "settable_per_mesh": false, "settable_per_extruder": false, "children": @@ -4154,7 +4154,7 @@ "type": "extruder", "default_value": "0", "value": "support_interface_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and extruders_enabled_count > 1", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and extruders_enabled_count > 1", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -4165,7 +4165,7 @@ "type": "extruder", "default_value": "0", "value": "support_interface_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and extruders_enabled_count > 1", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and extruders_enabled_count > 1", "settable_per_mesh": false, "settable_per_extruder": false } @@ -4219,7 +4219,7 @@ "gyroid": "Gyroid" }, "default_value": "zigzag", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -4234,7 +4234,7 @@ "maximum_value_warning": "3", "type": "int", "value": "1 if support_tree_enable else (1 if (support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'concentric') else 0)", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -4246,7 +4246,7 @@ "type": "bool", "default_value": false, "value": "support_pattern == 'cross' or support_pattern == 'gyroid'", - "enabled": "(support_enable or support_tree_enable) and (support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid')", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and (support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid')", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -4257,7 +4257,7 @@ "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", "type": "bool", "default_value": true, - "enabled": "(support_enable or support_tree_enable) and support_pattern == 'zigzag'", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_pattern == 'zigzag'", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -4272,7 +4272,7 @@ "maximum_value_warning": "100", "default_value": 15, "value": "15 if support_enable else 0 if support_tree_enable else 15", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, @@ -4287,7 +4287,7 @@ "minimum_value": "0", "minimum_value_warning": "support_line_width", "default_value": 2.66, - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "value": "0 if support_infill_rate == 0 else (support_line_width * 100) / support_infill_rate * (2 if support_pattern == 'grid' else (3 if support_pattern == 'triangles' else 1))", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, @@ -4302,7 +4302,7 @@ "minimum_value": "0", "minimum_value_warning": "support_line_width", "default_value": 2.66, - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "value": "support_line_distance", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, @@ -4316,7 +4316,7 @@ "description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angle 0 degrees.", "type": "[int]", "default_value": "[ ]", - "enabled": "(support_enable or support_tree_enable) and support_pattern != 'concentric' and support_infill_rate > 0", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_pattern != 'concentric' and support_infill_rate > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -4327,7 +4327,7 @@ "description": "Generate a brim within the support infill regions of the first layer. This brim is printed underneath the support, not around it. Enabling this setting increases the adhesion of support to the build plate.", "type": "bool", "default_value": false, - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -4341,7 +4341,7 @@ "default_value": 8.0, "minimum_value": "0.0", "maximum_value_warning": "50.0", - "enabled": "(support_enable or support_tree_enable) and support_brim_enable", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_brim_enable", "settable_per_mesh": false, "settable_per_extruder": true, "limit_to_extruder": "support_infill_extruder_nr", @@ -4356,7 +4356,7 @@ "minimum_value": "0", "maximum_value_warning": "50 / skirt_brim_line_width", "value": "math.ceil(support_brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))", - "enabled": "(support_enable or support_tree_enable) and support_brim_enable", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_brim_enable", "settable_per_mesh": false, "settable_per_extruder": true, "limit_to_extruder": "support_infill_extruder_nr" @@ -4373,7 +4373,7 @@ "maximum_value_warning": "machine_nozzle_size", "default_value": 0.1, "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "settable_per_mesh": true, "children": { @@ -4386,7 +4386,7 @@ "maximum_value_warning": "machine_nozzle_size", "default_value": 0.1, "type": "float", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "value": "extruderValue(support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr, 'support_z_distance')", "limit_to_extruder": "support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr", "settable_per_mesh": true @@ -4402,7 +4402,7 @@ "value": "extruderValue(support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr, 'support_z_distance') if support_type == 'everywhere' else 0", "limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr", "type": "float", - "enabled": "(support_enable or support_tree_enable) and resolveOrValue('support_type') == 'everywhere'", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and resolveOrValue('support_type') == 'everywhere'", "settable_per_mesh": true } } @@ -4417,7 +4417,7 @@ "maximum_value_warning": "1.5 * machine_nozzle_tip_outer_diameter", "default_value": 0.7, "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "settable_per_mesh": true }, "support_xy_overrides_z": @@ -4432,7 +4432,7 @@ }, "default_value": "z_overrides_xy", "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable", + "enabled": "support_enable or support_meshes_present", "settable_per_mesh": true }, "support_xy_distance_overhang": @@ -4447,7 +4447,7 @@ "default_value": 0.2, "value": "machine_nozzle_size / 2", "limit_to_extruder": "support_infill_extruder_nr", - "enabled": "support_enable and support_xy_overrides_z == 'z_overrides_xy'", + "enabled": "(support_enable or support_meshes_present) and support_xy_overrides_z == 'z_overrides_xy'", "settable_per_mesh": true }, "support_bottom_stair_step_height": @@ -4460,7 +4460,7 @@ "limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr", "minimum_value": "0", "maximum_value_warning": "1.0", - "enabled": "support_enable", + "enabled": "support_enable or support_meshes_present", "settable_per_mesh": true }, "support_bottom_stair_step_width": @@ -4473,7 +4473,7 @@ "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", "minimum_value": "0", "maximum_value_warning": "10.0", - "enabled": "support_enable", + "enabled": "support_enable or support_meshes_present", "settable_per_mesh": true }, "support_join_distance": @@ -4486,7 +4486,7 @@ "limit_to_extruder": "support_infill_extruder_nr", "minimum_value_warning": "0", "maximum_value_warning": "10", - "enabled": "support_enable", + "enabled": "support_enable or support_meshes_present", "settable_per_mesh": true }, "support_offset": @@ -4499,7 +4499,7 @@ "limit_to_extruder": "support_infill_extruder_nr", "minimum_value_warning": "-1 * machine_nozzle_size", "maximum_value_warning": "10 * machine_nozzle_size", - "enabled": "support_enable", + "enabled": "support_enable or support_meshes_present", "settable_per_mesh": true }, "support_infill_sparse_thickness": @@ -4513,7 +4513,7 @@ "maximum_value_warning": "0.75 * machine_nozzle_size", "maximum_value": "resolveOrValue('layer_height') * 8", "value": "resolveOrValue('layer_height')", - "enabled": "(support_enable or support_tree_enable) and support_infill_rate > 0", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_infill_rate > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, @@ -4526,7 +4526,7 @@ "minimum_value": "0", "maximum_value_warning": "1 if (support_pattern == 'cross' or support_pattern == 'lines' or support_pattern == 'zigzag' or support_pattern == 'concentric') else 5", "maximum_value": "999999 if support_line_distance == 0 else (20 - math.log(support_line_distance) / math.log(2))", - "enabled": "(support_enable or support_tree_enable) and support_infill_rate > 0", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_infill_rate > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, @@ -4539,7 +4539,7 @@ "default_value": 1, "minimum_value": "0.0001", "minimum_value_warning": "3 * resolveOrValue('layer_height')", - "enabled": "(support_enable or support_tree_enable) and support_infill_rate > 0 and gradual_support_infill_steps > 0", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_infill_rate > 0 and gradual_support_infill_steps > 0", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false }, @@ -4552,7 +4552,7 @@ "default_value": 0.0, "minimum_value": "0", "maximum_value_warning": "5", - "enabled": "support_enable", + "enabled": "support_enable or support_meshes_present", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": true }, @@ -4563,7 +4563,7 @@ "type": "bool", "default_value": false, "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "settable_per_mesh": true, "children": { @@ -4575,7 +4575,7 @@ "default_value": false, "value": "extruderValue(support_roof_extruder_nr, 'support_interface_enable')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "settable_per_mesh": true }, "support_bottom_enable": @@ -4586,7 +4586,7 @@ "default_value": false, "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable')", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "settable_per_mesh": true } } @@ -4602,7 +4602,7 @@ "minimum_value_warning": "0.2 + layer_height", "maximum_value_warning": "10", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": true, "children": { @@ -4618,7 +4618,7 @@ "maximum_value_warning": "10", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_height')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": true }, "support_bottom_height": @@ -4633,7 +4633,7 @@ "minimum_value_warning": "min(support_bottom_distance + layer_height, support_bottom_stair_step_height)", "maximum_value_warning": "10", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": true } } @@ -4647,7 +4647,7 @@ "minimum_value": "0", "maximum_value_warning": "support_interface_height", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": true }, "support_interface_density": @@ -4660,7 +4660,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -4675,7 +4675,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_density')", "settable_per_mesh": false, "settable_per_extruder": true, @@ -4692,7 +4692,7 @@ "minimum_value_warning": "support_roof_line_width - 0.0001", "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == 'grid' else (3 if support_roof_pattern == 'triangles' else 1))", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true } @@ -4708,7 +4708,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_density')", "settable_per_mesh": false, "settable_per_extruder": true, @@ -4725,7 +4725,7 @@ "minimum_value_warning": "support_bottom_line_width - 0.0001", "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_bottom_pattern == 'grid' else (3 if support_bottom_pattern == 'triangles' else 1))", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true } @@ -4748,7 +4748,7 @@ }, "default_value": "concentric", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -4769,7 +4769,7 @@ "default_value": "concentric", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_pattern')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -4789,7 +4789,7 @@ "default_value": "concentric", "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_pattern')", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true } @@ -4805,7 +4805,7 @@ "minimum_value": "0", "minimum_value_warning": "minimum_support_area", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": true, "children": { @@ -4820,7 +4820,7 @@ "minimum_value": "0", "minimum_value_warning": "minimum_support_area", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": true }, "minimum_bottom_area": @@ -4834,7 +4834,7 @@ "minimum_value": "0", "minimum_value_warning": "minimum_support_area", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": true } } @@ -4848,7 +4848,7 @@ "default_value": 0.0, "maximum_value": "extruderValue(support_extruder_nr, 'support_offset')", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "support_interface_enable and (support_enable or support_tree_enable)", + "enabled": "support_interface_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -4863,7 +4863,7 @@ "value": "extruderValue(support_roof_extruder_nr, 'support_interface_offset')", "maximum_value": "extruderValue(support_extruder_nr, 'support_offset')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_roof_enable and (support_enable or support_tree_enable)", + "enabled": "support_roof_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -4877,7 +4877,7 @@ "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_offset')", "maximum_value": "extruderValue(support_extruder_nr, 'support_offset')", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_bottom_enable and (support_enable or support_tree_enable)", + "enabled": "support_bottom_enable and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true } @@ -4890,7 +4890,7 @@ "type": "[int]", "default_value": "[ ]", "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and support_interface_enable and support_interface_pattern != 'concentric'", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_interface_enable and support_interface_pattern != 'concentric'", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -4903,7 +4903,7 @@ "default_value": "[ ]", "value": "support_interface_angles", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and support_roof_enable and support_roof_pattern != 'concentric'", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_roof_enable and support_roof_pattern != 'concentric'", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -4915,7 +4915,7 @@ "default_value": "[ ]", "value": "support_interface_angles", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "(support_enable or support_tree_enable) and support_bottom_enable and support_bottom_pattern != 'concentric'", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_bottom_enable and support_bottom_pattern != 'concentric'", "settable_per_mesh": false, "settable_per_extruder": true } @@ -4927,7 +4927,7 @@ "description": "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support.", "type": "bool", "default_value": false, - "enabled": "support_enable or support_tree_enable", + "enabled": "support_enable or support_tree_enable or support_meshes_present", "settable_per_mesh": false }, "support_supported_skin_fan_speed": @@ -4939,7 +4939,7 @@ "maximum_value": "100", "default_value": 100, "type": "float", - "enabled": "(support_enable or support_tree_enable) and support_fan_enable", + "enabled": "(support_enable or support_tree_enable or support_meshes_present) and support_fan_enable", "settable_per_mesh": false }, "support_use_towers": @@ -5005,6 +5005,17 @@ "settable_per_extruder": false, "settable_per_meshgroup": false, "settable_globally": false + }, + "support_meshes_present": + { + "label": "Support Meshes Present", + "description": "There are support meshes present in the scene. This setting is controlled by Cura.", + "type": "bool", + "default_value": false, + "enabled": false, + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false } } }, @@ -5175,7 +5186,7 @@ "description": "Enforce brim to be printed around the model even if that space would otherwise be occupied by support. This replaces some regions of the first layer of support by brim regions.", "type": "bool", "default_value": true, - "enabled": "resolveOrValue('adhesion_type') == 'brim' and (support_enable or support_tree_enable)", + "enabled": "resolveOrValue('adhesion_type') == 'brim' and (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": true, "limit_to_extruder": "support_infill_extruder_nr" @@ -5959,7 +5970,7 @@ "description": "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle.", "type": "bool", "default_value": true, - "enabled": "not (support_enable or support_tree_enable)", + "enabled": "not (support_enable or support_tree_enable or support_meshes_present)", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -6371,7 +6382,7 @@ "description": "Skip some support line connections to make the support structure easier to break away. This setting is applicable to the Zig Zag support infill pattern.", "type": "bool", "default_value": false, - "enabled": "support_enable and (support_pattern == 'zigzag')", + "enabled": "(support_enable or support_meshes_present) and support_pattern == 'zigzag'", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -6385,7 +6396,7 @@ "default_value": 20, "minimum_value": "0", "minimum_value_warning": "support_line_distance", - "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", + "enabled": "(support_enable or support_meshes_present) and support_pattern == 'zigzag' and support_skip_some_zags", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true, @@ -6400,7 +6411,7 @@ "value": "0 if support_line_distance == 0 else round(support_skip_zag_per_mm / support_line_distance)", "minimum_value": "1", "minimum_value_warning": "3", - "enabled": "support_enable and (support_pattern == 'zigzag') and support_skip_some_zags", + "enabled": "(support_enable or support_meshes_present) and support_pattern == 'zigzag' and support_skip_some_zags", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true From 4600ee9355f1e0feda3e138a9987e31ccfb73569 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 22 Mar 2020 18:26:50 +0100 Subject: [PATCH 03/45] Change wording for clarity --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 83f4c5943c..097f599de3 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5008,7 +5008,7 @@ }, "support_meshes_present": { - "label": "Support Meshes Present", + "label": "Scene Has Support Meshes", "description": "There are support meshes present in the scene. This setting is controlled by Cura.", "type": "bool", "default_value": false, From 138dbddb1076bd1b0215dc574011505cd8ce295a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 22 Mar 2020 18:51:43 +0100 Subject: [PATCH 04/45] Restore the SettingDefinition relations without killing a puppy --- cura/Scene/CuraSceneController.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index f97fde0f7e..2857ef4ca9 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -48,19 +48,21 @@ class CuraSceneController(QObject): global_stack = Application.getInstance().getGlobalContainerStack() if global_stack: scene_has_support_meshes = self._sceneHasSupportMeshes() # TODO: see if this can be cached + if scene_has_support_meshes != global_stack.getProperty("support_meshes_present", "value"): - # adjust the setting without having the setting value in an InstanceContainer + # Adjust the setting without having the setting value in an InstanceContainer setting_definitions = global_stack.definition.findDefinitions(key="support_meshes_present") if setting_definitions: - relations = setting_definitions[0].relations + # Recreate the setting definition because the default_value is readonly definition_dict = setting_definitions[0].serialize_to_dict() - definition_dict["enabled"] = False + definition_dict["enabled"] = False # The enabled property has a value that would need to be evaluated definition_dict["default_value"] = scene_has_support_meshes + relations = setting_definitions[0].relations # Relations are wiped when deserializing from a dict setting_definitions[0].deserialize(definition_dict) - setting_definitions[0]._relations = relations # TODO: find a better way to restore relations - # notify relations that the setting has changed + # Restore relations and notify them that the setting has changed for relation in relations: + setting_definitions[0].relations.append(relation) global_stack.propertyChanged.emit(relation.target.key, "enabled") max_build_plate = self._calcMaxBuildPlate() From d00ec619f5f06a657a2af1decade3c91d15b5fa8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 22 Mar 2020 18:58:16 +0100 Subject: [PATCH 05/45] Remove unused imports --- cura/Scene/CuraSceneController.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index 2857ef4ca9..e5c89369da 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -13,8 +13,7 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection from UM.Signal import Signal -from UM.Settings.SettingFunction import SettingFunction -from UM.Settings.ContainerRegistry import ContainerRegistry + class CuraSceneController(QObject): activeBuildPlateChanged = Signal() From ca7a4b47798a37f0e07e63abe5c39edbf860aad2 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 22 Mar 2020 19:21:41 +0100 Subject: [PATCH 06/45] Disable user "unchecking" mesh type in per model settings panel --- .../PerObjectSettingsPanel.qml | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 358fec4a31..de9d0cd3fb 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -32,10 +32,7 @@ Item var type = currentMeshType // set checked state of mesh type buttons - normalButton.checked = type === normalMeshType - supportMeshButton.checked = type === supportMeshType - overhangMeshButton.checked = type === infillMeshType || type === cuttingMeshType - antiOverhangMeshButton.checked = type === antiOverhangMeshType + updateMeshTypeCheckedState(type) // update active type label for (var button in meshTypeButtons.children) @@ -49,9 +46,19 @@ Item visibility_handler.addSkipResetSetting(currentMeshType) } + function updateMeshTypeCheckedState(type) + { + // set checked state of mesh type buttons + normalButton.checked = type === normalMeshType + supportMeshButton.checked = type === supportMeshType + overlapMeshButton.checked = type === infillMeshType || type === cuttingMeshType + antiOverhangMeshButton.checked = type === antiOverhangMeshType + } + function setMeshType(type) { UM.ActiveTool.setProperty("MeshType", type) + updateMeshTypeCheckedState(type) } UM.I18nCatalog { id: catalog; name: "uranium"} @@ -95,7 +102,7 @@ Item Button { - id: overhangMeshButton + id: overlapMeshButton text: catalog.i18nc("@label", "Modify settings for overlaps") iconSource: UM.Theme.getIcon("pos_modify_overlaps"); property bool needBorder: true From cbe87a39a8f3d0d0fed704bc910b670cace2f720 Mon Sep 17 00:00:00 2001 From: grk3010 <50751850+grk3010@users.noreply.github.com> Date: Wed, 6 May 2020 22:44:39 -0400 Subject: [PATCH 07/45] Add "Always Write Active Tool" machine setting. Required for dual extruder printing with Smoothieware firmware. --- resources/definitions/fdmprinter.def.json | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e25eedd7bf..2642e4021e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -216,6 +216,16 @@ "settable_per_extruder": false, "settable_per_meshgroup": false }, + "machine_always_write_active_tool": + { + "label": "Always Write Active Tool", + "description": "Write active tool after sending temp commands to inactive tool. Required for Dual Extruder printing with Smoothie or other firmware with modal tool commands.", + "default_value": false, + "type": "bool", + "settable_per_mesh": false, + "settable_per_extruder": false, + "settable_per_meshgroup": false + }, "machine_center_is_zero": { "label": "Is Center Origin", @@ -369,8 +379,7 @@ "Makerbot": "Makerbot", "BFB": "Bits from Bytes", "MACH3": "Mach3", - "Repetier": "Repetier", - "Smoothie": "Smoothie" + "Repetier": "Repetier" }, "default_value": "RepRap (Marlin/Sprinter)", "settable_per_mesh": false, From 731455c12b5f7903c6956656eb14a749cf083c19 Mon Sep 17 00:00:00 2001 From: grk3010 <50751850+grk3010@users.noreply.github.com> Date: Wed, 6 May 2020 23:23:42 -0400 Subject: [PATCH 08/45] Create smoothie_dual.def.json --- resources/definitions/smoothie_dual.def.json | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 resources/definitions/smoothie_dual.def.json diff --git a/resources/definitions/smoothie_dual.def.json b/resources/definitions/smoothie_dual.def.json new file mode 100644 index 0000000000..3e753cf0ed --- /dev/null +++ b/resources/definitions/smoothie_dual.def.json @@ -0,0 +1,47 @@ +{ + "version": 2, + "name": "Smoothie Dual Custom", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "grk3010", + "manufacturer": "Custom", + "file_formats": "text/x-gcode", + "has_materials": true, + "has_variants": true, + "preferred_variant_name": "Sparse 0.8", + "variants_name": "Nozzle", + "machine_extruder_trains": + { + "0": "bondtech_bmgx2m_extruder_0", + "1": "bondtech_bmgx2m_extruder_1" + } + }, + "overrides": { + "machine_name": { "default_value": "Smoothie Dual Custom" }, + "machine_width": { + "default_value": 600 + }, + "machine_depth": { + "default_value": 550 + }, + "machine_height": { + "default_value": 500 + }, + "machine_center_is_zero": { + "default_value": false + }, + "machine_gcode_flavor": { + "default_value": "RepRap (Marlin/Sprinter)" + }, + "machine_extruder_count": { + "default_value": 2 + }, + "machine_start_gcode": { + "default_value": "G28 X0 Y0 ; Home X Y\nM375; Load Bed Leveling Grid\nG1 X300 Y275 F15000 ; Move to bed center\nM280 S3.0 ; Deploy probe pin\n## NOTE: Adjust \"ZX.XX\" after G30 to be the Z-offset (in mm) between the probe and the nozzle\n## This is how you adjust nozzle printing height!\nG30 Z1.25 ; Move down to find bed & set Z home offset\nM280 S7.0 ; Retract probe\nG1 Z15.0 F600 ; move extruder up 15mm\nT0; Activate Extruder 1" + }, + "machine_end_gcode": { + "default_value": "G28 X0 Y0; Home X and Y\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM107; turn off fans\nM84 ; disable motors" + } + } +} From 5c0de33e32352d7b5ab29ba55ed13f432a819da8 Mon Sep 17 00:00:00 2001 From: grk3010 <50751850+grk3010@users.noreply.github.com> Date: Wed, 6 May 2020 23:30:02 -0400 Subject: [PATCH 09/45] Add bondtech extruder definitions --- .../bondtech_bmgx2m_extruder_0.def.json | 21 +++++++++++++++++++ .../bondtech_bmgx2m_extruder_1.def.json | 21 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 resources/extruders/bondtech_bmgx2m_extruder_0.def.json create mode 100644 resources/extruders/bondtech_bmgx2m_extruder_1.def.json diff --git a/resources/extruders/bondtech_bmgx2m_extruder_0.def.json b/resources/extruders/bondtech_bmgx2m_extruder_0.def.json new file mode 100644 index 0000000000..80c853e56a --- /dev/null +++ b/resources/extruders/bondtech_bmgx2m_extruder_0.def.json @@ -0,0 +1,21 @@ +{ + "version": 2, + "name": "Left Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "smoothie_dual", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "1" + }, + "machine_nozzle_offset_x": { "default_value": 0 }, + "machine_nozzle_offset_y": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.8 }, + "material_diameter": { "default_value": 1.75 } + + } +} diff --git a/resources/extruders/bondtech_bmgx2m_extruder_1.def.json b/resources/extruders/bondtech_bmgx2m_extruder_1.def.json new file mode 100644 index 0000000000..2c5f193bc6 --- /dev/null +++ b/resources/extruders/bondtech_bmgx2m_extruder_1.def.json @@ -0,0 +1,21 @@ +{ + "version": 2, + "name": "Right Extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "smoothie_dual", + "position": "1" + }, + + "overrides": { + "extruder_nr": { + "default_value": 1, + "maximum_value": "2" + }, + "machine_nozzle_offset_x": { "default_value": 0 }, + "machine_nozzle_offset_y": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.8 }, + "material_diameter": { "default_value": 1.75 } + + } +} From b7097eed05de05433f4502a167924dbffede247f Mon Sep 17 00:00:00 2001 From: grk3010 <59886923+grk3010@users.noreply.github.com> Date: Mon, 11 May 2020 16:09:47 -0400 Subject: [PATCH 10/45] Add Hotend Definitions Add Variant definitions for Slice Engineering Mosquito Magnum Hotends --- .../variants/mosquito_magnum_0.4.inst.cfg | 32 +++++++++++++++++++ .../variants/mosquito_magnum_0.8.inst.cfg | 32 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 resources/variants/mosquito_magnum_0.4.inst.cfg create mode 100644 resources/variants/mosquito_magnum_0.8.inst.cfg diff --git a/resources/variants/mosquito_magnum_0.4.inst.cfg b/resources/variants/mosquito_magnum_0.4.inst.cfg new file mode 100644 index 0000000000..75f87c4d8d --- /dev/null +++ b/resources/variants/mosquito_magnum_0.4.inst.cfg @@ -0,0 +1,32 @@ +[general] +name = Mosquito Magnum 0.4 +version = 4 +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.4 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_id = Mosquito Magnum 0.4 +machine_nozzle_tip_outer_diameter = 2.0 +retraction_amount = 6.5 +retraction_count_max = 25 +retraction_min_travel = =line_width * 2 +retraction_prime_speed = =retraction_speed +skin_overlap = 15 +speed_print = 60 +speed_topbottom = =math.ceil(speed_print * 30 / 70) +speed_wall = =math.ceil(speed_print * 30 / 70) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_pattern = zigzag +support_top_distance = =support_z_distance +support_use_towers = True +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_amount = =machine_heat_zone_length + diff --git a/resources/variants/mosquito_magnum_0.8.inst.cfg b/resources/variants/mosquito_magnum_0.8.inst.cfg new file mode 100644 index 0000000000..5f60b0fec1 --- /dev/null +++ b/resources/variants/mosquito_magnum_0.8.inst.cfg @@ -0,0 +1,32 @@ +[general] +name = Mosquito Magnum 0.8 +version = 4 +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = variant +hardware_type = nozzle + +[values] +machine_nozzle_size = 0.8 +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_id = Mosquito Magnum 0.8 +machine_nozzle_tip_outer_diameter = 2.0 +retraction_amount = 6.5 +retraction_count_max = 25 +retraction_min_travel = =line_width * 2 +retraction_prime_speed = =retraction_speed +skin_overlap = 15 +speed_print = 60 +speed_topbottom = =math.ceil(speed_print * 30 / 70) +speed_wall = =math.ceil(speed_print * 30 / 70) +support_angle = 60 +support_bottom_distance = =support_z_distance / 2 +support_pattern = zigzag +support_top_distance = =support_z_distance +support_use_towers = True +support_z_distance = =layer_height * 2 +switch_extruder_prime_speed = =switch_extruder_retraction_speeds +switch_extruder_retraction_amount = =machine_heat_zone_length + From ab6d15141e6ceaf0b1c48e8d15879a189d8d93ce Mon Sep 17 00:00:00 2001 From: grk3010 <59886923+grk3010@users.noreply.github.com> Date: Mon, 11 May 2020 16:11:57 -0400 Subject: [PATCH 11/45] Add Quality Definitions for Smoothie based printers --- .../smoothie_dual/smoothie_0.4_fast.inst.cfg | 24 +++++++++++++++++++ .../smoothie_dual/smoothie_0.4_high.inst.cfg | 24 +++++++++++++++++++ .../smoothie_0.4_normal.inst.cfg | 24 +++++++++++++++++++ .../smoothie_dual/smoothie_0.8_fast.inst.cfg | 24 +++++++++++++++++++ .../smoothie_dual/smoothie_0.8_high.inst.cfg | 24 +++++++++++++++++++ .../smoothie_0.8_normal.inst.cfg | 24 +++++++++++++++++++ 6 files changed, 144 insertions(+) create mode 100644 resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg create mode 100644 resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg create mode 100644 resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg create mode 100644 resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg create mode 100644 resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg create mode 100644 resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg diff --git a/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg new file mode 100644 index 0000000000..7364efe490 --- /dev/null +++ b/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 4 +name = Normal +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = quality +quality_type = fast +weight = -1 +variant = Mosquito Magnum 0.4 +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.25 +wall_line_count = 4 +bottom_layers = 4 +top_layers = 4 +infill_pattern = grid +infill_sparse_density = 50 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 6 \ No newline at end of file diff --git a/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg new file mode 100644 index 0000000000..899d6ea430 --- /dev/null +++ b/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 4 +name = Extra Fine +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = quality +quality_type = high +weight = 1 +variant = Mosquito Magnum 0.4 +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.25 +wall_line_count = 3 +bottom_layers = 3 +top_layers = 3 +infill_pattern = grid +infill_sparse_density = 50 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 6 \ No newline at end of file diff --git a/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg new file mode 100644 index 0000000000..c1af449138 --- /dev/null +++ b/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 4 +name = Fine +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = quality +quality_type = normal +weight = 0 +variant = Mosquito Magnum 0.4 +global_quality = True + +[values] +layer_height = 0.2 +layer_height_0 = 0.25 +wall_line_count = 3 +bottom_layers = 3 +top_layers = 3 +infill_pattern = grid +infill_sparse_density = 30 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 6 \ No newline at end of file diff --git a/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg new file mode 100644 index 0000000000..388eac8452 --- /dev/null +++ b/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 4 +name = Sprint +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = quality +quality_type = superdraft +weight = -1 +variant = Mosquito Magnum 0.8 +global_quality = True + +[values] +layer_height = 0.4 +layer_height_0 = 0.4 +wall_line_count = 2 +bottom_layers = 2 +top_layers = 2 +infill_pattern = lines +infill_sparse_density = 20 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 6 diff --git a/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg new file mode 100644 index 0000000000..7f46b78410 --- /dev/null +++ b/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 4 +name = Dense +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = quality +quality_type = draft +weight = 1 +variant = Mosquito Magnum 0.8 +global_quality = True + +[values] +layer_height = 0.4 +layer_height_0 = 0.4 +wall_line_count = 4 +bottom_layers = 4 +top_layers = 4 +infill_pattern = grid +infill_sparse_density = 50 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 6 diff --git a/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg new file mode 100644 index 0000000000..8590eba7fd --- /dev/null +++ b/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg @@ -0,0 +1,24 @@ +[general] +version = 4 +name = Fast +definition = smoothie_dual + +[metadata] +setting_version = 11 +type = quality +quality_type = verydraft +weight = 0 +variant = Mosquito Magnum 0.8 +global_quality = True + +[values] +layer_height = 0.4 +layer_height_0 = 0.4 +wall_line_count = 3 +bottom_layers = 3 +top_layers = 3 +infill_pattern = grid +infill_sparse_density = 30 +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 6 \ No newline at end of file From b8d74c8b4d3097d7a6986b7b73904df5f983b7bc Mon Sep 17 00:00:00 2001 From: grk3010 <59886923+grk3010@users.noreply.github.com> Date: Mon, 11 May 2020 16:12:49 -0400 Subject: [PATCH 12/45] Update smoothie_dual.def.json Complete printer definition including "Machine_always_write_active_tool" setting. --- resources/definitions/smoothie_dual.def.json | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/resources/definitions/smoothie_dual.def.json b/resources/definitions/smoothie_dual.def.json index 3e753cf0ed..9b168a0cd7 100644 --- a/resources/definitions/smoothie_dual.def.json +++ b/resources/definitions/smoothie_dual.def.json @@ -7,9 +7,10 @@ "author": "grk3010", "manufacturer": "Custom", "file_formats": "text/x-gcode", - "has_materials": true, + "has_machine_quality": true, "has_variants": true, - "preferred_variant_name": "Sparse 0.8", + "preferred_variant_name": "Mosquito Magnum 0.8", + "preferred_quality_type": "normal", "variants_name": "Nozzle", "machine_extruder_trains": { @@ -34,9 +35,15 @@ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_always_write_active_tool": { + "default_value": true + }, "machine_extruder_count": { "default_value": 2 }, + "machine_heat_zone_length": { + "default_value": 15 + }, "machine_start_gcode": { "default_value": "G28 X0 Y0 ; Home X Y\nM375; Load Bed Leveling Grid\nG1 X300 Y275 F15000 ; Move to bed center\nM280 S3.0 ; Deploy probe pin\n## NOTE: Adjust \"ZX.XX\" after G30 to be the Z-offset (in mm) between the probe and the nozzle\n## This is how you adjust nozzle printing height!\nG30 Z1.25 ; Move down to find bed & set Z home offset\nM280 S7.0 ; Retract probe\nG1 Z15.0 F600 ; move extruder up 15mm\nT0; Activate Extruder 1" }, From 17c4bf7d6a84d4389dec5f486603eaae15464a5b Mon Sep 17 00:00:00 2001 From: grk3010 <59886923+grk3010@users.noreply.github.com> Date: Mon, 11 May 2020 16:28:41 -0400 Subject: [PATCH 13/45] Update to settings version 15 --- resources/definitions/fdmprinter.def.json | 2 +- resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg | 2 +- resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg | 2 +- resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg | 2 +- resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg | 2 +- resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg | 2 +- resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg | 2 +- resources/variants/mosquito_magnum_0.4.inst.cfg | 2 +- resources/variants/mosquito_magnum_0.8.inst.cfg | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2642e4021e..c3d2eca654 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -7,7 +7,7 @@ "author": "Ultimaker", "category": "Other", "manufacturer": "Unknown", - "setting_version": 11, + "setting_version": 15, "file_formats": "text/x-gcode;application/x-stl-ascii;application/x-stl-binary;application/x-wavefront-obj;application/x3g", "visible": false, "has_materials": true, diff --git a/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg index 7364efe490..8b10ee1e20 100644 --- a/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg +++ b/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg @@ -4,7 +4,7 @@ name = Normal definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = quality quality_type = fast weight = -1 diff --git a/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg index 899d6ea430..974c8a42ea 100644 --- a/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg +++ b/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg @@ -4,7 +4,7 @@ name = Extra Fine definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = quality quality_type = high weight = 1 diff --git a/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg index c1af449138..b64a3f5168 100644 --- a/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg +++ b/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg @@ -4,7 +4,7 @@ name = Fine definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = quality quality_type = normal weight = 0 diff --git a/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg index 388eac8452..2fbd0e8061 100644 --- a/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg +++ b/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg @@ -4,7 +4,7 @@ name = Sprint definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = quality quality_type = superdraft weight = -1 diff --git a/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg index 7f46b78410..75e75c2635 100644 --- a/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg +++ b/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg @@ -4,7 +4,7 @@ name = Dense definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = quality quality_type = draft weight = 1 diff --git a/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg index 8590eba7fd..b021f9a54a 100644 --- a/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg +++ b/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = quality quality_type = verydraft weight = 0 diff --git a/resources/variants/mosquito_magnum_0.4.inst.cfg b/resources/variants/mosquito_magnum_0.4.inst.cfg index 75f87c4d8d..a8486d7b5c 100644 --- a/resources/variants/mosquito_magnum_0.4.inst.cfg +++ b/resources/variants/mosquito_magnum_0.4.inst.cfg @@ -4,7 +4,7 @@ version = 4 definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = variant hardware_type = nozzle diff --git a/resources/variants/mosquito_magnum_0.8.inst.cfg b/resources/variants/mosquito_magnum_0.8.inst.cfg index 5f60b0fec1..eac2bab60a 100644 --- a/resources/variants/mosquito_magnum_0.8.inst.cfg +++ b/resources/variants/mosquito_magnum_0.8.inst.cfg @@ -4,7 +4,7 @@ version = 4 definition = smoothie_dual [metadata] -setting_version = 11 +setting_version = 15 type = variant hardware_type = nozzle From 3d412e53b72082517250f5c2debb5b44e6cd2ca9 Mon Sep 17 00:00:00 2001 From: grk3010 <59886923+grk3010@users.noreply.github.com> Date: Thu, 14 May 2020 16:05:27 -0400 Subject: [PATCH 14/45] Make Smoothie definition Generic Remove quality, extruder, and nozzle profiles to make the smoothie machine definition a generic custom configuration. --- ...oothie_dual.def.json => smoothie.def.json} | 40 ++++++------------- .../bondtech_bmgx2m_extruder_0.def.json | 21 ---------- .../bondtech_bmgx2m_extruder_1.def.json | 21 ---------- .../smoothie_dual/smoothie_0.4_fast.inst.cfg | 24 ----------- .../smoothie_dual/smoothie_0.4_high.inst.cfg | 24 ----------- .../smoothie_0.4_normal.inst.cfg | 24 ----------- .../smoothie_dual/smoothie_0.8_fast.inst.cfg | 24 ----------- .../smoothie_dual/smoothie_0.8_high.inst.cfg | 24 ----------- .../smoothie_0.8_normal.inst.cfg | 24 ----------- .../variants/mosquito_magnum_0.4.inst.cfg | 32 --------------- .../variants/mosquito_magnum_0.8.inst.cfg | 32 --------------- 11 files changed, 12 insertions(+), 278 deletions(-) rename resources/definitions/{smoothie_dual.def.json => smoothie.def.json} (57%) delete mode 100644 resources/extruders/bondtech_bmgx2m_extruder_0.def.json delete mode 100644 resources/extruders/bondtech_bmgx2m_extruder_1.def.json delete mode 100644 resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg delete mode 100644 resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg delete mode 100644 resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg delete mode 100644 resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg delete mode 100644 resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg delete mode 100644 resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg delete mode 100644 resources/variants/mosquito_magnum_0.4.inst.cfg delete mode 100644 resources/variants/mosquito_magnum_0.8.inst.cfg diff --git a/resources/definitions/smoothie_dual.def.json b/resources/definitions/smoothie.def.json similarity index 57% rename from resources/definitions/smoothie_dual.def.json rename to resources/definitions/smoothie.def.json index 9b168a0cd7..5fce686161 100644 --- a/resources/definitions/smoothie_dual.def.json +++ b/resources/definitions/smoothie.def.json @@ -1,49 +1,33 @@ { "version": 2, - "name": "Smoothie Dual Custom", + "name": "Smoothie Custom Printer", "inherits": "fdmprinter", "metadata": { "visible": true, "author": "grk3010", "manufacturer": "Custom", + "category": "Custom", "file_formats": "text/x-gcode", - "has_machine_quality": true, - "has_variants": true, - "preferred_variant_name": "Mosquito Magnum 0.8", - "preferred_quality_type": "normal", - "variants_name": "Nozzle", "machine_extruder_trains": { - "0": "bondtech_bmgx2m_extruder_0", - "1": "bondtech_bmgx2m_extruder_1" - } + "0": "custom_extruder_1", + "1": "custom_extruder_2", + "2": "custom_extruder_3", + "3": "custom_extruder_4", + "4": "custom_extruder_5", + "5": "custom_extruder_6", + "6": "custom_extruder_7", + "7": "custom_extruder_8" + }, + "first_start_actions": ["MachineSettingsAction"] }, "overrides": { - "machine_name": { "default_value": "Smoothie Dual Custom" }, - "machine_width": { - "default_value": 600 - }, - "machine_depth": { - "default_value": 550 - }, - "machine_height": { - "default_value": 500 - }, - "machine_center_is_zero": { - "default_value": false - }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, "machine_always_write_active_tool": { "default_value": true }, - "machine_extruder_count": { - "default_value": 2 - }, - "machine_heat_zone_length": { - "default_value": 15 - }, "machine_start_gcode": { "default_value": "G28 X0 Y0 ; Home X Y\nM375; Load Bed Leveling Grid\nG1 X300 Y275 F15000 ; Move to bed center\nM280 S3.0 ; Deploy probe pin\n## NOTE: Adjust \"ZX.XX\" after G30 to be the Z-offset (in mm) between the probe and the nozzle\n## This is how you adjust nozzle printing height!\nG30 Z1.25 ; Move down to find bed & set Z home offset\nM280 S7.0 ; Retract probe\nG1 Z15.0 F600 ; move extruder up 15mm\nT0; Activate Extruder 1" }, diff --git a/resources/extruders/bondtech_bmgx2m_extruder_0.def.json b/resources/extruders/bondtech_bmgx2m_extruder_0.def.json deleted file mode 100644 index 80c853e56a..0000000000 --- a/resources/extruders/bondtech_bmgx2m_extruder_0.def.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "version": 2, - "name": "Left Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "smoothie_dual", - "position": "0" - }, - - "overrides": { - "extruder_nr": { - "default_value": 0, - "maximum_value": "1" - }, - "machine_nozzle_offset_x": { "default_value": 0 }, - "machine_nozzle_offset_y": { "default_value": 0 }, - "machine_nozzle_size": { "default_value": 0.8 }, - "material_diameter": { "default_value": 1.75 } - - } -} diff --git a/resources/extruders/bondtech_bmgx2m_extruder_1.def.json b/resources/extruders/bondtech_bmgx2m_extruder_1.def.json deleted file mode 100644 index 2c5f193bc6..0000000000 --- a/resources/extruders/bondtech_bmgx2m_extruder_1.def.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "version": 2, - "name": "Right Extruder", - "inherits": "fdmextruder", - "metadata": { - "machine": "smoothie_dual", - "position": "1" - }, - - "overrides": { - "extruder_nr": { - "default_value": 1, - "maximum_value": "2" - }, - "machine_nozzle_offset_x": { "default_value": 0 }, - "machine_nozzle_offset_y": { "default_value": 0 }, - "machine_nozzle_size": { "default_value": 0.8 }, - "material_diameter": { "default_value": 1.75 } - - } -} diff --git a/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg deleted file mode 100644 index 8b10ee1e20..0000000000 --- a/resources/quality/smoothie_dual/smoothie_0.4_fast.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 4 -name = Normal -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = quality -quality_type = fast -weight = -1 -variant = Mosquito Magnum 0.4 -global_quality = True - -[values] -layer_height = 0.2 -layer_height_0 = 0.25 -wall_line_count = 4 -bottom_layers = 4 -top_layers = 4 -infill_pattern = grid -infill_sparse_density = 50 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 6 \ No newline at end of file diff --git a/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg deleted file mode 100644 index 974c8a42ea..0000000000 --- a/resources/quality/smoothie_dual/smoothie_0.4_high.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 4 -name = Extra Fine -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = quality -quality_type = high -weight = 1 -variant = Mosquito Magnum 0.4 -global_quality = True - -[values] -layer_height = 0.2 -layer_height_0 = 0.25 -wall_line_count = 3 -bottom_layers = 3 -top_layers = 3 -infill_pattern = grid -infill_sparse_density = 50 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 6 \ No newline at end of file diff --git a/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg deleted file mode 100644 index b64a3f5168..0000000000 --- a/resources/quality/smoothie_dual/smoothie_0.4_normal.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 4 -name = Fine -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = quality -quality_type = normal -weight = 0 -variant = Mosquito Magnum 0.4 -global_quality = True - -[values] -layer_height = 0.2 -layer_height_0 = 0.25 -wall_line_count = 3 -bottom_layers = 3 -top_layers = 3 -infill_pattern = grid -infill_sparse_density = 30 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 6 \ No newline at end of file diff --git a/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg deleted file mode 100644 index 2fbd0e8061..0000000000 --- a/resources/quality/smoothie_dual/smoothie_0.8_fast.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 4 -name = Sprint -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = quality -quality_type = superdraft -weight = -1 -variant = Mosquito Magnum 0.8 -global_quality = True - -[values] -layer_height = 0.4 -layer_height_0 = 0.4 -wall_line_count = 2 -bottom_layers = 2 -top_layers = 2 -infill_pattern = lines -infill_sparse_density = 20 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 6 diff --git a/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg deleted file mode 100644 index 75e75c2635..0000000000 --- a/resources/quality/smoothie_dual/smoothie_0.8_high.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 4 -name = Dense -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = quality -quality_type = draft -weight = 1 -variant = Mosquito Magnum 0.8 -global_quality = True - -[values] -layer_height = 0.4 -layer_height_0 = 0.4 -wall_line_count = 4 -bottom_layers = 4 -top_layers = 4 -infill_pattern = grid -infill_sparse_density = 50 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 6 diff --git a/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg b/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg deleted file mode 100644 index b021f9a54a..0000000000 --- a/resources/quality/smoothie_dual/smoothie_0.8_normal.inst.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[general] -version = 4 -name = Fast -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = quality -quality_type = verydraft -weight = 0 -variant = Mosquito Magnum 0.8 -global_quality = True - -[values] -layer_height = 0.4 -layer_height_0 = 0.4 -wall_line_count = 3 -bottom_layers = 3 -top_layers = 3 -infill_pattern = grid -infill_sparse_density = 30 -adhesion_type = skirt -skirt_line_count = 2 -skirt_gap = 6 \ No newline at end of file diff --git a/resources/variants/mosquito_magnum_0.4.inst.cfg b/resources/variants/mosquito_magnum_0.4.inst.cfg deleted file mode 100644 index a8486d7b5c..0000000000 --- a/resources/variants/mosquito_magnum_0.4.inst.cfg +++ /dev/null @@ -1,32 +0,0 @@ -[general] -name = Mosquito Magnum 0.4 -version = 4 -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = variant -hardware_type = nozzle - -[values] -machine_nozzle_size = 0.4 -machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_id = Mosquito Magnum 0.4 -machine_nozzle_tip_outer_diameter = 2.0 -retraction_amount = 6.5 -retraction_count_max = 25 -retraction_min_travel = =line_width * 2 -retraction_prime_speed = =retraction_speed -skin_overlap = 15 -speed_print = 60 -speed_topbottom = =math.ceil(speed_print * 30 / 70) -speed_wall = =math.ceil(speed_print * 30 / 70) -support_angle = 60 -support_bottom_distance = =support_z_distance / 2 -support_pattern = zigzag -support_top_distance = =support_z_distance -support_use_towers = True -support_z_distance = =layer_height * 2 -switch_extruder_prime_speed = =switch_extruder_retraction_speeds -switch_extruder_retraction_amount = =machine_heat_zone_length - diff --git a/resources/variants/mosquito_magnum_0.8.inst.cfg b/resources/variants/mosquito_magnum_0.8.inst.cfg deleted file mode 100644 index eac2bab60a..0000000000 --- a/resources/variants/mosquito_magnum_0.8.inst.cfg +++ /dev/null @@ -1,32 +0,0 @@ -[general] -name = Mosquito Magnum 0.8 -version = 4 -definition = smoothie_dual - -[metadata] -setting_version = 15 -type = variant -hardware_type = nozzle - -[values] -machine_nozzle_size = 0.8 -machine_nozzle_cool_down_speed = 0.9 -machine_nozzle_id = Mosquito Magnum 0.8 -machine_nozzle_tip_outer_diameter = 2.0 -retraction_amount = 6.5 -retraction_count_max = 25 -retraction_min_travel = =line_width * 2 -retraction_prime_speed = =retraction_speed -skin_overlap = 15 -speed_print = 60 -speed_topbottom = =math.ceil(speed_print * 30 / 70) -speed_wall = =math.ceil(speed_print * 30 / 70) -support_angle = 60 -support_bottom_distance = =support_z_distance / 2 -support_pattern = zigzag -support_top_distance = =support_z_distance -support_use_towers = True -support_z_distance = =layer_height * 2 -switch_extruder_prime_speed = =switch_extruder_retraction_speeds -switch_extruder_retraction_amount = =machine_heat_zone_length - From 885fe32fb0cbf5104c8d09d27dcc556149804cad Mon Sep 17 00:00:00 2001 From: grk3010 <59886923+grk3010@users.noreply.github.com> Date: Thu, 14 May 2020 16:15:12 -0400 Subject: [PATCH 15/45] Update smoothie.def.json remove depreciated "category" --- resources/definitions/smoothie.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/smoothie.def.json b/resources/definitions/smoothie.def.json index 5fce686161..a2313487f7 100644 --- a/resources/definitions/smoothie.def.json +++ b/resources/definitions/smoothie.def.json @@ -6,7 +6,6 @@ "visible": true, "author": "grk3010", "manufacturer": "Custom", - "category": "Custom", "file_formats": "text/x-gcode", "machine_extruder_trains": { From a232e12cc3cb12f2f2b37cd71eda19b3b3c3cd01 Mon Sep 17 00:00:00 2001 From: Jeff Rogers Date: Sat, 16 May 2020 14:37:57 -0700 Subject: [PATCH 16/45] Fix extruder and feed rate after extruder-only moves in post stretch script (issue 7755) --- plugins/PostProcessingPlugin/scripts/Stretch.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/PostProcessingPlugin/scripts/Stretch.py b/plugins/PostProcessingPlugin/scripts/Stretch.py index 480ba60606..e56a9f48b1 100644 --- a/plugins/PostProcessingPlugin/scripts/Stretch.py +++ b/plugins/PostProcessingPlugin/scripts/Stretch.py @@ -289,6 +289,13 @@ class Stretcher: self.layergcode = self.layergcode + sout + "\n" ipos = ipos + 1 else: + # The command is intended to be passed through unmodified via + # the comment field. In the case of an extruder only move, though, + # the extruder and potentially the feed rate are modified. + # We need to update self.outpos accordingly so that subsequent calls + # to stepToGcode() knows about the extruder and feed rate change. + self.outpos.step_e = layer_steps[i].step_e + self.outpos.step_f = layer_steps[i].step_f self.layergcode = self.layergcode + layer_steps[i].comment + "\n" def workOnSequence(self, orig_seq, modif_seq): From ba705176fe704323977e211d081513a8d24e4e5c Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Tue, 2 Jun 2020 14:13:04 +0200 Subject: [PATCH 17/45] Remove extraneous logging --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index c562f7988e..f9d53b6b65 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -88,8 +88,6 @@ class CloudOutputDeviceManager: if self._syncing: return - Logger.info("Syncing cloud printer clusters") - self._syncing = True self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SYNCING) self._api.getClusters(self._onGetRemoteClustersFinished, self._onGetRemoteClusterFailed) From a06035cf3858cf6cdc60d2865d877013c32c07ed Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 2 Jun 2020 16:12:05 +0200 Subject: [PATCH 18/45] Display appropriate tooltip message when cloud printer is offline Display a different message in the popup tooltip when the internet is reachable but the printer is offline. CURA-7460 --- .../qml/PrinterSelector/MachineSelector.qml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/resources/qml/PrinterSelector/MachineSelector.qml b/resources/qml/PrinterSelector/MachineSelector.qml index 2896588341..56a3d858ec 100644 --- a/resources/qml/PrinterSelector/MachineSelector.qml +++ b/resources/qml/PrinterSelector/MachineSelector.qml @@ -38,12 +38,23 @@ Cura.ExpandablePopup readonly property string connectionStatusMessage: { if (connectionStatus == "printer_cloud_not_available") { - if(Cura.API.connectionStatus.isInternetReachable){ - return catalog.i18nc("@status", "The cloud connection is currently unavailable. Please check your internet connection and sign in to connect to the cloud printer.") - } else { + if(Cura.API.connectionStatus.isInternetReachable) + { + if (Cura.API.account.isLoggedIn) + { + return catalog.i18nc("@status", "The cloud printer is offline. Please check if the printer is turned on and connected to the internet.") + } + else + { + return catalog.i18nc("@status", "The cloud connection is currently unavailable. Please sign in to connect to the cloud printer.") + } + } else + { return catalog.i18nc("@status", "The cloud connection is currently unavailable. Please check your internet connection.") } - } else { + } + else + { return "" } } From 80a5b53aadf8ef42fcd6911067d51a66c7f1b975 Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Wed, 3 Jun 2020 13:59:51 +0200 Subject: [PATCH 19/45] Store the printer cluster size as a metadata entry on the machine This makes the cluster size also available when the machine is offline. Also fixes an issue where the cluster size is improperly restored once the internet connection comes back online, resulting in the printer showing as a single printer until next sync CURA-7347 --- cura/Settings/MachineManager.py | 6 +++++- plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py | 2 +- .../src/Cloud/CloudOutputDeviceManager.py | 1 + .../src/Models/Http/CloudClusterResponse.py | 4 +++- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e5286e7032..cbb986010e 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -488,7 +488,11 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = printerConnectedStatusChanged) def activeMachineIsGroup(self) -> bool: - return bool(self._printer_output_devices) and len(self._printer_output_devices[0].printers) > 1 + if self.activeMachine is None: + return False + + group_size = int(self.activeMachine.getMetaDataEntry("group_size", "-1")) + return group_size > 1 @pyqtProperty(bool, notify = printerConnectedStatusChanged) def activeMachineHasNetworkConnection(self) -> bool: diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py index b8c5a30524..4abab245e8 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py @@ -74,7 +74,7 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice): b"name": cluster.friendly_name.encode() if cluster.friendly_name else b"", b"firmware_version": cluster.host_version.encode() if cluster.host_version else b"", b"printer_type": cluster.printer_type.encode() if cluster.printer_type else b"", - b"cluster_size": b"1" # cloud devices are always clusters of at least one + b"cluster_size": str(cluster.printer_count).encode() if cluster.printer_count else b"1" } super().__init__( diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index f9d53b6b65..6f2c68e5fb 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -265,6 +265,7 @@ class CloudOutputDeviceManager: machine.setName(device.name) machine.setMetaDataEntry(self.META_CLUSTER_ID, device.key) machine.setMetaDataEntry("group_name", device.name) + machine.setMetaDataEntry("group_size", device.clusterSize) machine.setMetaDataEntry("removal_warning", self.I18N_CATALOG.i18nc( "@label ({} is printer name)", "{} will be removed until the next account sync.
To remove {} permanently, " diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py b/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py index 94f20b65c6..a9107db3c8 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py @@ -11,7 +11,7 @@ class CloudClusterResponse(BaseModel): def __init__(self, cluster_id: str, host_guid: str, host_name: str, is_online: bool, status: str, host_internal_ip: Optional[str] = None, host_version: Optional[str] = None, - friendly_name: Optional[str] = None, printer_type: str = "ultimaker3", **kwargs) -> None: + friendly_name: Optional[str] = None, printer_type: str = "ultimaker3", printer_count: int = 1, **kwargs) -> None: """Creates a new cluster response object. :param cluster_id: The secret unique ID, e.g. 'kBEeZWEifXbrXviO8mRYLx45P8k5lHVGs43XKvRniPg='. @@ -23,6 +23,7 @@ class CloudClusterResponse(BaseModel): :param host_internal_ip: The internal IP address of the host printer. :param friendly_name: The human readable name of the host printer. :param printer_type: The machine type of the host printer. + :param printer_count: The amount of printers in the print cluster. 1 for a single printer """ self.cluster_id = cluster_id @@ -34,6 +35,7 @@ class CloudClusterResponse(BaseModel): self.host_internal_ip = host_internal_ip self.friendly_name = friendly_name self.printer_type = printer_type + self.printer_count = printer_count super().__init__(**kwargs) # Validates the model, raising an exception if the model is invalid. From 1d6c722505c5ef9a347473fbf3fa8bec936fd6e8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Jun 2020 13:14:56 +0200 Subject: [PATCH 20/45] Indent using spaces, not a mix of tabs and spaces Contributes to issue CURA-7450. --- resources/definitions/smoothie.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/smoothie.def.json b/resources/definitions/smoothie.def.json index a2313487f7..463fbc92c2 100644 --- a/resources/definitions/smoothie.def.json +++ b/resources/definitions/smoothie.def.json @@ -25,7 +25,7 @@ "default_value": "RepRap (Marlin/Sprinter)" }, "machine_always_write_active_tool": { - "default_value": true + "default_value": true }, "machine_start_gcode": { "default_value": "G28 X0 Y0 ; Home X Y\nM375; Load Bed Leveling Grid\nG1 X300 Y275 F15000 ; Move to bed center\nM280 S3.0 ; Deploy probe pin\n## NOTE: Adjust \"ZX.XX\" after G30 to be the Z-offset (in mm) between the probe and the nozzle\n## This is how you adjust nozzle printing height!\nG30 Z1.25 ; Move down to find bed & set Z home offset\nM280 S7.0 ; Retract probe\nG1 Z15.0 F600 ; move extruder up 15mm\nT0; Activate Extruder 1" From 2e5f4764bdf288e065c4bd54cd2d7fe1633ec976 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Jun 2020 13:37:30 +0200 Subject: [PATCH 21/45] Remove duplicated version upgrade plug-in These two version upgraders do the same operation. Their code is copied. Instead, we can just let one version upgrader upgrade both versions of the files. Contributes to issue CURA-7413. --- .../VersionUpgrade45to46/__init__.py | 9 ++ .../VersionUpgrade46bto46.py | 86 ------------------- .../VersionUpgrade46bto46/__init__.py | 59 ------------- .../VersionUpgrade46bto46/plugin.json | 8 -- 4 files changed, 9 insertions(+), 153 deletions(-) delete mode 100644 plugins/VersionUpgrade/VersionUpgrade46bto46/VersionUpgrade46bto46.py delete mode 100644 plugins/VersionUpgrade/VersionUpgrade46bto46/__init__.py delete mode 100644 plugins/VersionUpgrade/VersionUpgrade46bto46/plugin.json diff --git a/plugins/VersionUpgrade/VersionUpgrade45to46/__init__.py b/plugins/VersionUpgrade/VersionUpgrade45to46/__init__.py index 090f8a109c..e9e835555c 100644 --- a/plugins/VersionUpgrade/VersionUpgrade45to46/__init__.py +++ b/plugins/VersionUpgrade/VersionUpgrade45to46/__init__.py @@ -21,6 +21,15 @@ def getMetaData() -> Dict[str, Any]: ("quality_changes", 4000011): ("quality_changes", 4000013, upgrade.upgradeInstanceContainer), ("quality", 4000011): ("quality", 4000013, upgrade.upgradeInstanceContainer), ("user", 4000011): ("user", 4000013, upgrade.upgradeInstanceContainer), + + # Setting version 12 was also used during the 4.6 beta, but had no changes. + ("preferences", 6000012): ("preferences", 6000013, upgrade.upgradePreferences), + ("machine_stack", 4000012): ("machine_stack", 4000013, upgrade.upgradeStack), + ("extruder_train", 4000012): ("extruder_train", 4000013, upgrade.upgradeStack), + ("definition_changes", 4000012): ("definition_changes", 4000013, upgrade.upgradeInstanceContainer), + ("quality_changes", 4000012): ("quality_changes", 4000013, upgrade.upgradeInstanceContainer), + ("quality", 4000012): ("quality", 4000013, upgrade.upgradeInstanceContainer), + ("user", 4000012): ("user", 4000013, upgrade.upgradeInstanceContainer), }, "sources": { "preferences": { diff --git a/plugins/VersionUpgrade/VersionUpgrade46bto46/VersionUpgrade46bto46.py b/plugins/VersionUpgrade/VersionUpgrade46bto46/VersionUpgrade46bto46.py deleted file mode 100644 index 7d1b865e19..0000000000 --- a/plugins/VersionUpgrade/VersionUpgrade46bto46/VersionUpgrade46bto46.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2020 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -import configparser -from typing import Tuple, List -import io -from UM.VersionUpgrade import VersionUpgrade - -class VersionUpgrade46bto46(VersionUpgrade): - def getCfgVersion(self, serialised: str) -> int: - parser = configparser.ConfigParser(interpolation = None) - parser.read_string(serialised) - format_version = int(parser.get("general", "version")) # Explicitly give an exception when this fails. That means that the file format is not recognised. - setting_version = int(parser.get("metadata", "setting_version", fallback = "0")) - return format_version * 1000000 + setting_version - - def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - """ - Upgrades preferences to have the new version number. - :param serialized: The original contents of the preferences file. - :param filename: The file name of the preferences file. - :return: A list of new file names, and a list of the new contents for - those files. - """ - parser = configparser.ConfigParser(interpolation = None) - parser.read_string(serialized) - - # Update version number. - parser["metadata"]["setting_version"] = "13" - - result = io.StringIO() - parser.write(result) - return [filename], [result.getvalue()] - - def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - """ - Upgrades instance containers to have the new version number. - - This changes the maximum deviation setting if that setting was present - in the profile. - :param serialized: The original contents of the instance container. - :param filename: The original file name of the instance container. - :return: A list of new file names, and a list of the new contents for - those files. - """ - parser = configparser.ConfigParser(interpolation = None, comment_prefixes = ()) - parser.read_string(serialized) - - # Update version number. - parser["metadata"]["setting_version"] = "13" - - if "values" in parser: - # Maximum Deviation's effect was corrected. Previously the deviation - # ended up being only half of what the user had entered. This was - # fixed in Cura 4.7 so there we need to halve the deviation that the - # user had entered. - if "meshfix_maximum_deviation" in parser["values"]: - maximum_deviation = parser["values"]["meshfix_maximum_deviation"] - if maximum_deviation.startswith("="): - maximum_deviation = maximum_deviation[1:] - maximum_deviation = "=(" + maximum_deviation + ") / 2" - parser["values"]["meshfix_maximum_deviation"] = maximum_deviation - - result = io.StringIO() - parser.write(result) - return [filename], [result.getvalue()] - - def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]: - """ - Upgrades stacks to have the new version number. - :param serialized: The original contents of the stack. - :param filename: The original file name of the stack. - :return: A list of new file names, and a list of the new contents for - those files. - """ - parser = configparser.ConfigParser(interpolation = None) - parser.read_string(serialized) - - # Update version number. - if "metadata" not in parser: - parser["metadata"] = {} - parser["metadata"]["setting_version"] = "13" - - result = io.StringIO() - parser.write(result) - return [filename], [result.getvalue()] diff --git a/plugins/VersionUpgrade/VersionUpgrade46bto46/__init__.py b/plugins/VersionUpgrade/VersionUpgrade46bto46/__init__.py deleted file mode 100644 index 9f099110ea..0000000000 --- a/plugins/VersionUpgrade/VersionUpgrade46bto46/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (c) 2020 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from typing import Any, Dict, TYPE_CHECKING - -from . import VersionUpgrade46bto46 - -if TYPE_CHECKING: - from UM.Application import Application - -upgrade = VersionUpgrade46bto46.VersionUpgrade46bto46() - -def getMetaData() -> Dict[str, Any]: - return { - "version_upgrade": { - # From To Upgrade function - ("preferences", 6000012): ("preferences", 6000013, upgrade.upgradePreferences), - ("machine_stack", 4000012): ("machine_stack", 4000013, upgrade.upgradeStack), - ("extruder_train", 4000012): ("extruder_train", 4000013, upgrade.upgradeStack), - ("definition_changes", 4000012): ("definition_changes", 4000013, upgrade.upgradeInstanceContainer), - ("quality_changes", 4000012): ("quality_changes", 4000013, upgrade.upgradeInstanceContainer), - ("quality", 4000012): ("quality", 4000013, upgrade.upgradeInstanceContainer), - ("user", 4000012): ("user", 4000013, upgrade.upgradeInstanceContainer), - }, - "sources": { - "preferences": { - "get_version": upgrade.getCfgVersion, - "location": {"."} - }, - "machine_stack": { - "get_version": upgrade.getCfgVersion, - "location": {"./machine_instances"} - }, - "extruder_train": { - "get_version": upgrade.getCfgVersion, - "location": {"./extruders"} - }, - "definition_changes": { - "get_version": upgrade.getCfgVersion, - "location": {"./definition_changes"} - }, - "quality_changes": { - "get_version": upgrade.getCfgVersion, - "location": {"./quality_changes"} - }, - "quality": { - "get_version": upgrade.getCfgVersion, - "location": {"./quality"} - }, - "user": { - "get_version": upgrade.getCfgVersion, - "location": {"./user"} - } - } - } - - -def register(app: "Application") -> Dict[str, Any]: - return {"version_upgrade": upgrade} diff --git a/plugins/VersionUpgrade/VersionUpgrade46bto46/plugin.json b/plugins/VersionUpgrade/VersionUpgrade46bto46/plugin.json deleted file mode 100644 index 5100528017..0000000000 --- a/plugins/VersionUpgrade/VersionUpgrade46bto46/plugin.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "Version Upgrade 4.6-beta to 4.6.0", - "author": "Ultimaker B.V.", - "version": "1.0.0", - "description": "Upgrades configurations from Cura 4.6-BETA to Cura 4.6.", - "api": "7.2.0", - "i18n-catalog": "cura" -} From 2ebf32831a06f5773dc0b4e9d94822c45d6603df Mon Sep 17 00:00:00 2001 From: Gabriel Vogel Date: Thu, 4 Jun 2020 13:50:24 +0200 Subject: [PATCH 22/45] remove duplicate updates for model properties --- .../src/Models/Http/ClusterPrintJobStatus.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobStatus.py index 8c8b187288..6e46c12cf0 100644 --- a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobStatus.py +++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobStatus.py @@ -125,9 +125,6 @@ class ClusterPrintJobStatus(BaseModel): model.updateOwner(self.owner) model.updateState(self.status) model.setCompatibleMachineFamilies(self.compatible_machine_families) - model.updateTimeTotal(self.time_total) - model.updateTimeElapsed(self.time_elapsed) - model.updateOwner(self.owner) status_set_by_impediment = False for impediment in self.impediments_to_printing: From c095cb1f226a0fdaaf9f8da5ab245cd8820266d8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jun 2020 14:06:03 +0200 Subject: [PATCH 23/45] Converted the listview into a RowLayout I have no idea why i thought a listview was needed for this when this was made. The data shouldn't be flicable, so it makes way more sense to use a row layout CURA-7480 --- .../ConfigurationMenu/ConfigurationMenu.qml | 109 +++++++++--------- 1 file changed, 54 insertions(+), 55 deletions(-) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml index f0ada92810..9891fc1d69 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml @@ -4,6 +4,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Controls.Styles 1.4 +import QtQuick.Layouts 1.3 import UM 1.2 as UM import Cura 1.0 as Cura @@ -37,70 +38,68 @@ Cura.ExpandablePopup headerItem: Item { // Horizontal list that shows the extruders and their materials - ListView + RowLayout { - id: extrudersList - - orientation: ListView.Horizontal anchors.fill: parent - model: extrudersModel - visible: Cura.MachineManager.activeMachine.hasMaterials - - delegate: Item + Repeater { - height: parent.height - width: Math.round(ListView.view.width / extrudersModel.count) - - // Extruder icon. Shows extruder index and has the same color as the active material. - Cura.ExtruderIcon + model: extrudersModel + delegate: Item { - id: extruderIcon - materialColor: model.color - extruderEnabled: model.enabled - height: parent.height - width: height - } + Layout.fillWidth: true + Layout.fillHeight: true - // Label for the brand of the material - Label - { - id: typeAndBrandNameLabel - - text: model.material_brand + " " + model.material - elide: Text.ElideRight - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - renderType: Text.NativeRendering - - anchors + // Extruder icon. Shows extruder index and has the same color as the active material. + Cura.ExtruderIcon { - top: extruderIcon.top - left: extruderIcon.right - leftMargin: UM.Theme.getSize("default_margin").width - right: parent.right - rightMargin: UM.Theme.getSize("default_margin").width + id: extruderIcon + materialColor: model.color + extruderEnabled: model.enabled + height: parent.height + width: height } - } - // Label that shows the name of the variant - Label - { - id: variantLabel - visible: Cura.MachineManager.activeMachine.hasVariants - - text: model.variant - elide: Text.ElideRight - font: UM.Theme.getFont("default_bold") - color: UM.Theme.getColor("text") - renderType: Text.NativeRendering - - anchors + // Label for the brand of the material + Label { - left: extruderIcon.right - leftMargin: UM.Theme.getSize("default_margin").width - top: typeAndBrandNameLabel.bottom - right: parent.right - rightMargin: UM.Theme.getSize("default_margin").width + id: typeAndBrandNameLabel + + text: model.material_brand + " " + model.material + elide: Text.ElideRight + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + renderType: Text.NativeRendering + + anchors + { + top: extruderIcon.top + left: extruderIcon.right + leftMargin: UM.Theme.getSize("default_margin").width + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } + } + // Label that shows the name of the variant + Label + { + id: variantLabel + + visible: Cura.MachineManager.activeMachine.hasVariants + + text: model.variant + elide: Text.ElideRight + font: UM.Theme.getFont("default_bold") + color: UM.Theme.getColor("text") + renderType: Text.NativeRendering + + anchors + { + left: extruderIcon.right + leftMargin: UM.Theme.getSize("default_margin").width + top: typeAndBrandNameLabel.bottom + right: parent.right + rightMargin: UM.Theme.getSize("default_margin").width + } } } } From fd2a7689cc822f1bce87736b4a8dbc9bb958c4d3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jun 2020 14:32:37 +0200 Subject: [PATCH 24/45] Remove overly spammy logging --- cura/API/Account.py | 3 --- plugins/Toolbox/src/CloudSync/CloudPackageChecker.py | 1 - 2 files changed, 4 deletions(-) diff --git a/cura/API/Account.py b/cura/API/Account.py index 581a91da04..ef46368474 100644 --- a/cura/API/Account.py +++ b/cura/API/Account.py @@ -112,9 +112,6 @@ class Account(QObject): :param service_name: A unique name for your service, such as `plugins` or `backups` :param state: One of SyncState """ - - Logger.info("Service {service} enters sync state {state}", service = service_name, state = state) - prev_state = self._sync_state self._sync_services[service_name] = state diff --git a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py index ef8e82f576..7c39354317 100644 --- a/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py +++ b/plugins/Toolbox/src/CloudSync/CloudPackageChecker.py @@ -62,7 +62,6 @@ class CloudPackageChecker(QObject): def _getUserSubscribedPackages(self) -> None: self._application.getCuraAPI().account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SYNCING) - Logger.debug("Requesting subscribed packages metadata from server.") url = CloudApiModel.api_url_user_packages self._application.getHttpRequestManager().get(url, callback = self._onUserPackagesRequestFinished, From 22b9bb77efb0a0268dc1968b6a9eb41aa0eaf90b Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 5 Jun 2020 12:59:31 +0200 Subject: [PATCH 25/45] Fix reporting the [WinError 10038] exception traceback on sign-in Surround the serve_forever function of the web server with a try-catch on Windows, in order to avoid printing the entire (useless) traceback. Now a warning message is be displayed in the log instead. The behavior is untouched in other platforms --- cura/OAuth2/LocalAuthorizationServer.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index f819042ae0..211b59683f 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -1,6 +1,6 @@ # Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. - +import sys import threading from typing import Any, Callable, Optional, TYPE_CHECKING @@ -71,7 +71,7 @@ class LocalAuthorizationServer: self._web_server.setState(state) # Start the server on a new thread. - self._web_server_thread = threading.Thread(None, self._web_server.serve_forever, daemon = self._daemon) + self._web_server_thread = threading.Thread(None, self._serve_forever, daemon = self._daemon) self._web_server_thread.start() def stop(self) -> None: @@ -87,3 +87,20 @@ class LocalAuthorizationServer: pass self._web_server = None self._web_server_thread = None + + def _serve_forever(self) -> None: + """ + If the platform is windows, this function calls the serve_forever function of the _web_server, catching any + OSErrors that may occur in the thread, thus making the reported message more log-friendly. + If it is any other platform, it just calls the serve_forever function immediately. + + :return: None + """ + if sys.platform == "win32": + try: + self._web_server.serve_forever() + except OSError as e: + Logger.warning(str(e)) + else: + # Leave the default behavior in non-windows platforms + self._web_server.serve_forever() From ea6a73e76d4712d7a9371ee9b61d365e190d797a Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 5 Jun 2020 13:18:48 +0200 Subject: [PATCH 26/45] Fix mypy complains --- cura/OAuth2/LocalAuthorizationServer.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index 211b59683f..a41de2d406 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -96,11 +96,12 @@ class LocalAuthorizationServer: :return: None """ - if sys.platform == "win32": - try: + if self._web_server: + if sys.platform == "win32": + try: + self._web_server.serve_forever() + except OSError as e: + Logger.warning(str(e)) + else: + # Leave the default behavior in non-windows platforms self._web_server.serve_forever() - except OSError as e: - Logger.warning(str(e)) - else: - # Leave the default behavior in non-windows platforms - self._web_server.serve_forever() From 42daef0a7511969950d2c8b417f7e8a49f373809 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 5 Jun 2020 13:20:38 +0200 Subject: [PATCH 27/45] Remove spam info message --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 7ee8322ba1..30c26a2c24 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -91,8 +91,6 @@ class CloudOutputDeviceManager: if self._syncing: return - Logger.info("Syncing cloud printer clusters") - self._syncing = True self._account.setSyncState(self.SYNC_SERVICE_NAME, SyncState.SYNCING) self._api.getClusters(self._onGetRemoteClustersFinished, self._onGetRemoteClusterFailed) From 670f1df6c7f1674f3bd19c3a5cc3046b9abc1abb Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 5 Jun 2020 13:29:21 +0200 Subject: [PATCH 28/45] Show latest version nr. available in firmware-update-checker-message. --- .../FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 4 ++-- .../FirmwareUpdateCheckerMessage.py | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index f049542db1..2c869195bc 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Application import Application @@ -114,7 +114,7 @@ class FirmwareUpdateCheckerJob(Job): # notify the user when no new firmware version is available. if (checked_version != "") and (checked_version != current_version): Logger.log("i", "Showing firmware update message for new version: {version}".format(version = current_version)) - message = FirmwareUpdateCheckerMessage(machine_id, self._machine_name, + message = FirmwareUpdateCheckerMessage(machine_id, self._machine_name, current_version, self._lookups.getRedirectUserUrl()) message.actionTriggered.connect(self._callback) message.show() diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py index 58c00850cb..ca253e3ec6 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py @@ -1,4 +1,4 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.i18n import i18nCatalog @@ -11,11 +11,12 @@ i18n_catalog = i18nCatalog("cura") class FirmwareUpdateCheckerMessage(Message): STR_ACTION_DOWNLOAD = "download" - def __init__(self, machine_id: int, machine_name: str, download_url: str) -> None: + def __init__(self, machine_id: int, machine_name: str, latest_version: str, download_url: str) -> None: super().__init__(i18n_catalog.i18nc( "@info Don't translate {machine_name}, since it gets replaced by a printer name!", - "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( - machine_name = machine_name), + "New features or bug-fixes may be available for your {machine_name}! If not already at the latest version, " + "it is recommended to update the firmware on your printer to version {latest_version}.").format( + machine_name = machine_name, latest_version = latest_version), title = i18n_catalog.i18nc( "@info:title The %s gets replaced with the printer name.", "New %s firmware available") % machine_name) From 306f58f96e3b3b6db79048d4b115ff871a6393b2 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 5 Jun 2020 14:13:36 +0200 Subject: [PATCH 29/45] Fix contentWidth reference error in ActionButton --- resources/qml/ActionButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ActionButton.qml b/resources/qml/ActionButton.qml index d55c64029b..b0849ea6b8 100644 --- a/resources/qml/ActionButton.qml +++ b/resources/qml/ActionButton.qml @@ -98,7 +98,7 @@ Button target: buttonText property: "width" value: button.fixedWidthMode ? button.width - button.leftPadding - button.rightPadding - : ((maximumWidth != 0 && contentWidth > maximumWidth) ? maximumWidth : undefined) + : ((maximumWidth != 0 && parent.contentWidth > maximumWidth) ? maximumWidth : undefined) } } From ec62cd5671b6b3b317b6dfe31c1c914f66030069 Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 5 Jun 2020 14:20:52 +0200 Subject: [PATCH 30/45] Fix "Unable to assing null to double" QmlWarning --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 46297659ff..db19ed89df 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -73,8 +73,6 @@ Item height: textLabel.contentHeight + 2 * UM.Theme.getSize("narrow_margin").height hoverEnabled: true - baselineOffset: null // If we don't do this, there is a binding loop. WHich is a bit weird, since we override the contentItem anyway... - contentItem: RowLayout { spacing: 0 From 336bd2bd16a06ebf79c64632385366c59051a6ac Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jun 2020 14:03:14 +0200 Subject: [PATCH 31/45] Use extruderList rather than deprecated extruders property Done during Turbo Testing and Tooling. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 1382f53027..1e21ba3b2e 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -466,10 +466,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_info.intent_info = instance_container_info_dict[intent_id] if not machine_conflict and containers_found_dict["machine"]: - if position not in global_stack.extruders: + if int(position) >= len(global_stack.extrurderList): continue - existing_extruder_stack = global_stack.extruders[position] + existing_extruder_stack = global_stack.extruderList[int(position)] # check if there are any changes at all in any of the container stacks. id_list = self._getContainerIdListFromSerialized(serialized) for index, container_id in enumerate(id_list): From 43980e90cda1e9e899b651311b3ac6ad5981b8ba Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jun 2020 14:07:00 +0200 Subject: [PATCH 32/45] Use extruderList rather than extruders property Done during Turbo Testing and Tooling. --- plugins/SliceInfoPlugin/SliceInfo.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 630c0abb1b..20a563c291 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -101,7 +101,7 @@ class SliceInfo(QObject, Extension): user_modified_setting_keys = set() # type: Set[str] - for stack in [global_stack] + list(global_stack.extruders.values()): + for stack in [global_stack] + global_stack.extruderList: # Get all settings in user_changes and quality_changes all_keys = stack.userChanges.getAllKeys() | stack.qualityChanges.getAllKeys() user_modified_setting_keys |= all_keys @@ -152,7 +152,7 @@ class SliceInfo(QObject, Extension): # add extruder specific data to slice info data["extruders"] = [] - extruders = list(global_stack.extruders.values()) + extruders = global_stack.extruderList extruders = sorted(extruders, key = lambda extruder: extruder.getMetaDataEntry("position")) for extruder in extruders: From 44abd08b3249a1896992efb4467295c0f7ecc0c2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jun 2020 14:09:13 +0200 Subject: [PATCH 33/45] Use newer extruderList rather than deprecated extruders property Done during Turbo Testing and Tooling. --- plugins/UFPWriter/UFPWriter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index bcafc7545c..3c241670b0 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -97,7 +97,7 @@ class UFPWriter(MeshWriter): Logger.log("w", "The material extension: %s was already added", material_extension) added_materials = [] - for extruder_stack in global_stack.extruders.values(): + for extruder_stack in global_stack.extruderList: material = extruder_stack.material try: material_file_name = material.getMetaData()["base_file"] + ".xml.fdm_material" From 9404fe0fb993247bd9495ce1a7ec161a266fd77a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jun 2020 14:17:21 +0200 Subject: [PATCH 34/45] Fix getting contentWidth in variable width mode Undefined seems to work fine as well though. Done during Turbo Testing and Tooling to reduce the number of warnings in our log. --- resources/qml/ActionButton.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/ActionButton.qml b/resources/qml/ActionButton.qml index b0849ea6b8..a38b47df8f 100644 --- a/resources/qml/ActionButton.qml +++ b/resources/qml/ActionButton.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2018 Ultimaker B.V. +// Copyright (c) 2020 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.7 @@ -98,7 +98,7 @@ Button target: buttonText property: "width" value: button.fixedWidthMode ? button.width - button.leftPadding - button.rightPadding - : ((maximumWidth != 0 && parent.contentWidth > maximumWidth) ? maximumWidth : undefined) + : ((maximumWidth != 0 && button.contentWidth > maximumWidth) ? maximumWidth : undefined) } } From 3073d7c349f7a802d5c20132e465b0234c32556f Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 5 Jun 2020 15:54:53 +0200 Subject: [PATCH 35/45] Fix height binding loop QmlWarning in ConfigurationListView Done during Turbo Testing and Tooling --- resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml index b47d77243c..b68d37d1ea 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml @@ -96,7 +96,7 @@ Item id: configurationList spacing: UM.Theme.getSize("narrow_margin").height width: container.width - ((height > container.maximumHeight) ? container.ScrollBar.vertical.background.width : 0) //Make room for scroll bar if there is any. - height: childrenRect.height + height: contentHeight interactive: false // let the ScrollView process scroll events. section.property: "modelData.printerType" From ac98caee5427bc73c558764c949f3d5a6d12c8b7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Jun 2020 15:31:37 +0200 Subject: [PATCH 36/45] Remove debugging code --- cura/CuraApplication.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 26b3e9c3f7..de7da13d1c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1909,7 +1909,6 @@ class CuraApplication(QtApplication): return selection_pass = cast(SelectionPass, self.getRenderer().getRenderPass("selection")) if not selection_pass: # If you right-click before the rendering has been initialised there might not be a selection pass yet. - print("--------------ding! Got the crash.") return node = self.getController().getScene().findObject(selection_pass.getIdAtPosition(x, y)) if not node: From 773edfd533acf258f1d785092506c0746a93808c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jun 2020 10:24:59 +0200 Subject: [PATCH 37/45] Prevent crash when camera tool was not found --- cura/CuraApplication.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index de7da13d1c..75b1d67697 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -886,8 +886,9 @@ class CuraApplication(QtApplication): # Initialize camera tool camera_tool = controller.getTool("CameraTool") - camera_tool.setOrigin(Vector(0, 100, 0)) - camera_tool.setZoomRange(0.1, 2000) + if camera_tool: + camera_tool.setOrigin(Vector(0, 100, 0)) + camera_tool.setZoomRange(0.1, 2000) # Initialize camera animations self._camera_animation = CameraAnimation.CameraAnimation() From 83fd35424b5b75b47e26fc53e5dcb8a88a596198 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jun 2020 10:31:40 +0200 Subject: [PATCH 38/45] Store data for metadata first This should help with providing data to sentry to find out what the hell is going wrong --- cura/Machines/Models/QualitySettingsModel.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Machines/Models/QualitySettingsModel.py b/cura/Machines/Models/QualitySettingsModel.py index 20d8fd20ff..c88e103f3a 100644 --- a/cura/Machines/Models/QualitySettingsModel.py +++ b/cura/Machines/Models/QualitySettingsModel.py @@ -100,7 +100,8 @@ class QualitySettingsModel(ListModel): # the settings in that quality_changes_group. if quality_changes_group is not None: container_registry = ContainerRegistry.getInstance() - global_containers = container_registry.findContainers(id = quality_changes_group.metadata_for_global["id"]) + metadata_for_global = quality_changes_group.metadata_for_global + global_containers = container_registry.findContainers(id = metadata_for_global["id"]) global_container = None if len(global_containers) == 0 else global_containers[0] extruders_containers = {pos: container_registry.findContainers(id = quality_changes_group.metadata_per_extruder[pos]["id"]) for pos in quality_changes_group.metadata_per_extruder} extruders_container = {pos: None if not containers else containers[0] for pos, containers in extruders_containers.items()} From 7e10e74e9e7433ee928a1696048834bad7e48a91 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 8 Jun 2020 17:55:07 +0200 Subject: [PATCH 39/45] Don't send print job in chunks Previously the print job was sent with multiple PUT requests. This was necessary since the request was made with the Python Requests library, which freezes the interface while it's running. By breaking the upload up in chunks, it would at least periodically keep updating the interface (4 times per second or so, depending on your internet speed and Ultimaker's). Later on, this was replaced by a QNetworkRequest which doesn't freeze the interface in a refactor, but it was still broken up in chunks. Recently that was again refactored to use Uranium's HttpRequestManager, which under the covers also uses QNetworkRequest. This also doesn't freeze while uploading, which is good. However for some reason the second chunk would always give a QNetworkReply::ProtocolUnknownError, which is a bit of a catch-all error for any HTTP status codes not supported by Qt. I was not able to figure out what was really going wrong there, but it has something to do with the content-range header and making multiple requests. Instead of fixing that, I've removed the chunking. This simplifies the code a lot and doesn't have any implications for the user, since it still doesn't freeze the interface while the network request is ongoing. It should be slightly faster to upload, and reduce load on the server too. However the disadvantage is that the original bug is probably still there if it was a bug in the HttpRequestManager. If it was a bug in the ToolPathUploader I probably deleted the bug here. Contributes to issue CURA-7488. --- .../src/Cloud/ToolPathUploader.py | 56 ++++--------------- 1 file changed, 12 insertions(+), 44 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py b/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py index 246c33b0c7..01242c402f 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py @@ -20,9 +20,6 @@ class ToolPathUploader: # The HTTP codes that should trigger a retry. RETRY_HTTP_CODES = {500, 502, 503, 504} - # The amount of bytes to send per request - BYTES_PER_REQUEST = 256 * 1024 - def __init__(self, http: HttpRequestManager, print_job: CloudPrintJobResponse, data: bytes, on_finished: Callable[[], Any], on_progress: Callable[[int], Any], on_error: Callable[[], Any] ) -> None: @@ -44,7 +41,6 @@ class ToolPathUploader: self._on_progress = on_progress self._on_error = on_error - self._sent_bytes = 0 self._retries = 0 self._finished = False @@ -54,23 +50,14 @@ class ToolPathUploader: return self._print_job - def _chunkRange(self) -> Tuple[int, int]: - """Determines the bytes that should be uploaded next. - - :return: A tuple with the first and the last byte to upload. - """ - last_byte = min(len(self._data), self._sent_bytes + self.BYTES_PER_REQUEST) - return self._sent_bytes, last_byte - def start(self) -> None: """Starts uploading the mesh.""" if self._finished: # reset state. - self._sent_bytes = 0 self._retries = 0 self._finished = False - self._uploadChunk() + self._upload() def stop(self): """Stops uploading the mesh, marking it as finished.""" @@ -78,26 +65,18 @@ class ToolPathUploader: Logger.log("i", "Stopped uploading") self._finished = True - def _uploadChunk(self) -> None: - """Uploads a chunk of the mesh to the cloud.""" - + def _upload(self) -> None: + """ + Uploads the print job to the cloud printer. + """ if self._finished: raise ValueError("The upload is already finished") - first_byte, last_byte = self._chunkRange() - content_range = "bytes {}-{}/{}".format(first_byte, last_byte - 1, len(self._data)) - - headers = { - "Content-Type": cast(str, self._print_job.content_type), - "Content-Range": content_range - } # type: Dict[str, str] - - Logger.log("i", "Uploading %s to %s", content_range, self._print_job.upload_url) - + Logger.log("i", "Uploading print to {upload_url}".format(upload_url = self._print_job.upload_url)) self._http.put( url = cast(str, self._print_job.upload_url), - headers_dict = headers, - data = self._data[first_byte:last_byte], + headers_dict = {"Content-Type": cast(str, self._print_job.content_type)}, + data = self._data, callback = self._finishedCallback, error_callback = self._errorCallback, upload_progress_callback = self._progressCallback @@ -111,8 +90,7 @@ class ToolPathUploader: """ Logger.log("i", "Progress callback %s / %s", bytes_sent, bytes_total) if bytes_total: - total_sent = self._sent_bytes + bytes_sent - self._on_progress(int(total_sent / len(self._data) * 100)) + self._on_progress(int(bytes_sent / len(self._data) * 100)) ## Handles an error uploading. def _errorCallback(self, reply: QNetworkReply, error: QNetworkReply.NetworkError) -> None: @@ -136,7 +114,7 @@ class ToolPathUploader: self._retries += 1 Logger.log("i", "Retrying %s/%s request %s", self._retries, self.MAX_RETRIES, reply.url().toString()) try: - self._uploadChunk() + self._upload() except ValueError: # Asynchronously it could have completed in the meanwhile. pass return @@ -148,16 +126,6 @@ class ToolPathUploader: Logger.log("d", "status_code: %s, Headers: %s, body: %s", status_code, [bytes(header).decode() for header in reply.rawHeaderList()], bytes(reply.readAll()).decode()) - self._chunkUploaded() - def _chunkUploaded(self) -> None: - """Handles a chunk of data being uploaded, starting the next chunk if needed.""" - - # We got a successful response. Let's start the next chunk or report the upload is finished. - first_byte, last_byte = self._chunkRange() - self._sent_bytes += last_byte - first_byte - if self._sent_bytes >= len(self._data): - self.stop() - self._on_finished() - else: - self._uploadChunk() + self.stop() + self._on_finished() From c6af6565a367ffb8dc8b2c65acca1076d743669c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 8 Jun 2020 17:58:42 +0200 Subject: [PATCH 40/45] More descriptive and appropriate logging Contributes to issue CURA-7488. --- plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py b/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py index 01242c402f..3c80565fa1 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py @@ -62,8 +62,9 @@ class ToolPathUploader: def stop(self): """Stops uploading the mesh, marking it as finished.""" - Logger.log("i", "Stopped uploading") - self._finished = True + Logger.log("i", "Finished uploading") + self._finished = True # Signal to any ongoing retries that we should stop retrying. + self._on_finished() def _upload(self) -> None: """ @@ -88,7 +89,7 @@ class ToolPathUploader: :param bytes_sent: The amount of bytes sent in the current request. :param bytes_total: The amount of bytes to send in the current request. """ - Logger.log("i", "Progress callback %s / %s", bytes_sent, bytes_total) + Logger.debug("Cloud upload progress %s / %s", bytes_sent, bytes_total) if bytes_total: self._on_progress(int(bytes_sent / len(self._data) * 100)) @@ -128,4 +129,3 @@ class ToolPathUploader: [bytes(header).decode() for header in reply.rawHeaderList()], bytes(reply.readAll()).decode()) self.stop() - self._on_finished() From f66e723866bad093c789f2061d1b4f75049c382b Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Tue, 9 Jun 2020 15:12:26 +0200 Subject: [PATCH 41/45] Fix Authorization server not properly stopping after flow completes. CURA-7490 --- cura/OAuth2/AuthorizationRequestServer.py | 3 ++- cura/OAuth2/LocalAuthorizationServer.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/OAuth2/AuthorizationRequestServer.py b/cura/OAuth2/AuthorizationRequestServer.py index 74b0b5f012..4ed3975638 100644 --- a/cura/OAuth2/AuthorizationRequestServer.py +++ b/cura/OAuth2/AuthorizationRequestServer.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from http.server import HTTPServer +from socketserver import ThreadingMixIn from typing import Callable, Any, TYPE_CHECKING if TYPE_CHECKING: @@ -9,7 +10,7 @@ if TYPE_CHECKING: from cura.OAuth2.AuthorizationHelpers import AuthorizationHelpers -class AuthorizationRequestServer(HTTPServer): +class AuthorizationRequestServer(ThreadingMixIn, HTTPServer): """The authorization request callback handler server. This subclass is needed to be able to pass some data to the request handler. This cannot be done on the request diff --git a/cura/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py index a41de2d406..0e017c5318 100644 --- a/cura/OAuth2/LocalAuthorizationServer.py +++ b/cura/OAuth2/LocalAuthorizationServer.py @@ -81,6 +81,7 @@ class LocalAuthorizationServer: if self._web_server: try: + self._web_server.shutdown() self._web_server.server_close() except OSError: # OS error can happen if the socket was already closed. We really don't care about that case. From 8c6a7d30987d3effacbb3c8d3adc11352fadaa6c Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 9 Jun 2020 15:56:13 +0200 Subject: [PATCH 42/45] Remove definitionChanges before removing a printer When removing a printer, the files in %appdata%/cura// /definition_changes/ remained intact. This commit fixes that by making sure that the definitionChanges are removed before removing the machine. --- cura/Settings/ExtruderManager.py | 1 + cura/Settings/MachineManager.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 2dc01425fc..2cc9ec4631 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -302,6 +302,7 @@ class ExtruderManager(QObject): for extruder in self.getMachineExtruders(machine_id): ContainerRegistry.getInstance().removeContainer(extruder.userChanges.getId()) + ContainerRegistry.getInstance().removeContainer(extruder.definitionChanges.getId()) ContainerRegistry.getInstance().removeContainer(extruder.getId()) if machine_id in self._extruder_trains: del self._extruder_trains[machine_id] diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e5286e7032..f98030a7b1 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -720,6 +720,8 @@ class MachineManager(QObject): containers = CuraContainerRegistry.getInstance().findInstanceContainersMetadata(type = "user", machine = machine_id) for container in containers: CuraContainerRegistry.getInstance().removeContainer(container["id"]) + machine_stack = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine", name = machine_id)[0] + CuraContainerRegistry.getInstance().removeContainer(machine_stack.definitionChanges.getId()) CuraContainerRegistry.getInstance().removeContainer(machine_id) # If the printer that is being removed is a network printer, the hidden printers have to be also removed From b734830fcf4ca45a517801d8b298fbc55680d063 Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Tue, 9 Jun 2020 17:02:21 +0200 Subject: [PATCH 43/45] Sort new_devices on online status first, name second Since the first device might be activated in case there is no active printer yet, it would be nice to prioritize online devices CURA-7493 --- .../src/Cloud/CloudOutputDeviceManager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index 30c26a2c24..ae0e47ad64 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -163,7 +163,11 @@ class CloudOutputDeviceManager: self._connectToActiveMachine() return - new_devices.sort(key = lambda x: x.name.lower()) + # Sort new_devices on online status first, alphabetical (case-sensitive) second. + # Since the first device might be activated in case there is no active printer yet, + # it would be nice to prioritize online devices + online_cluster_names = {c.friendly_name for c in clusters if c.is_online} + new_devices.sort(key = lambda x: "a{}".format(x.name) if x.name in online_cluster_names else "b{}".format(x.name)) image_path = os.path.join( CuraApplication.getInstance().getPluginRegistry().getPluginPath("UM3NetworkPrinting") or "", From 29442e29e4f91e2d08844cf60fb54d8eb7425c44 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 9 Jun 2020 17:28:02 +0200 Subject: [PATCH 44/45] Make printer name sorting case insensitive again. part of CURA-7493 --- .../src/Cloud/CloudOutputDeviceManager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index ae0e47ad64..d6868d108b 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -163,11 +163,11 @@ class CloudOutputDeviceManager: self._connectToActiveMachine() return - # Sort new_devices on online status first, alphabetical (case-sensitive) second. + # Sort new_devices on online status first, alphabetical second. # Since the first device might be activated in case there is no active printer yet, # it would be nice to prioritize online devices - online_cluster_names = {c.friendly_name for c in clusters if c.is_online} - new_devices.sort(key = lambda x: "a{}".format(x.name) if x.name in online_cluster_names else "b{}".format(x.name)) + online_cluster_names = {c.friendly_name.lower() for c in clusters if c.is_online} + new_devices.sort(key = lambda x: ("a{}" if x.name.lower() in online_cluster_names else "b{}").format(x.name.lower())) image_path = os.path.join( CuraApplication.getInstance().getPluginRegistry().getPluginPath("UM3NetworkPrinting") or "", From a38fac9e6752d36c2d766c165bbf11bab0fd3366 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 9 Jun 2020 17:34:23 +0200 Subject: [PATCH 45/45] Fix typing. --- .../UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py index d6868d108b..89419c4dd4 100644 --- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py +++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py @@ -166,7 +166,7 @@ class CloudOutputDeviceManager: # Sort new_devices on online status first, alphabetical second. # Since the first device might be activated in case there is no active printer yet, # it would be nice to prioritize online devices - online_cluster_names = {c.friendly_name.lower() for c in clusters if c.is_online} + online_cluster_names = {c.friendly_name.lower() for c in clusters if c.is_online and not c.friendly_name is None} new_devices.sort(key = lambda x: ("a{}" if x.name.lower() in online_cluster_names else "b{}").format(x.name.lower())) image_path = os.path.join(