From f4698c7cd4f1d58e0a8fbd0367131c2d96a5d508 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 27 Jul 2016 10:18:19 +0200 Subject: [PATCH 01/63] feat: support_bottom_height and support_interface_height (CURA-1013) --- resources/definitions/fdmprinter.def.json | 39 ++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 950c856a6e..303f06288e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2365,10 +2365,10 @@ "enabled": "support_enable", "settable_per_mesh": true }, - "support_roof_height": + "support_interface_height": { - "label": "Support Roof Thickness", - "description": "The thickness of the support roofs.", + "label": "Support Interface Thickness", + "description": "The thickness of the interface of the support where it touches with the model on the bottom or the top.", "unit": "mm", "type": "float", "default_value": 1, @@ -2376,7 +2376,38 @@ "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", "enabled": "support_roof_enable and support_enable", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": + { + "support_roof_height": + { + "label": "Support Roof Thickness", + "description": "The thickness of the support roofs. This controls the amount of dense layers at the top of the support on which the model rests.", + "unit": "mm", + "type": "float", + "default_value": 1, + "value": "support_interface_height", + "minimum_value": "0", + "global_inherits_stack": "support_extruder_nr", + "maximum_value_warning": "10", + "enabled": "support_roof_enable and support_enable", + "settable_per_mesh": true + }, + "support_bottom_height": + { + "label": "Support Bottom Thickness", + "description": "The thickness of the support bottoms. This controls the number of dense layers are printed on top of places of a model on which support rests.", + "unit": "mm", + "type": "float", + "default_value": 1, + "value": "support_interface_height", + "minimum_value": "0", + "global_inherits_stack": "support_extruder_nr", + "maximum_value_warning": "10", + "enabled": "support_roof_enable and support_enable", + "settable_per_mesh": true + } + } }, "support_roof_density": { From 17b455d2ed920e04161b0ee6d909ce2f61aa9832 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 27 Jul 2016 10:34:41 +0200 Subject: [PATCH 02/63] JSON rename: Support Roof ==> Support Interface (CURA-1013) the support roof settings are now used for support bottoms as well --- resources/definitions/fdmprinter.def.json | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 303f06288e..8a53f4859a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -636,8 +636,8 @@ }, "support_roof_line_width": { - "label": "Support Roof Line Width", - "description": "Width of a single support roof line.", + "label": "Support Interface Line Width", + "description": "Width of a single support interface line.", "unit": "mm", "default_value": 0.4, "minimum_value": "0.0001", @@ -1468,8 +1468,8 @@ }, "speed_support_roof": { - "label": "Support Roof Speed", - "description": "The speed at which the roofs of support are printed. Printing the support roof at lower speeds can improve overhang quality.", + "label": "Support Interface Speed", + "description": "The speed at which the roofs and bottoms of support are printed. Printing the them at lower speeds can improve overhang quality.", "unit": "mm/s", "type": "float", "default_value": 40, @@ -1671,8 +1671,8 @@ "settable_per_extruder": false }, "acceleration_support_roof": { - "label": "Support Roof Acceleration", - "description": "The acceleration with which the roofs of support are printed. Printing the support roof at lower accelerations can improve overhang quality.", + "label": "Support Interface Acceleration", + "description": "The acceleration with which the roofs and bottoms of support are printed. Printing them at lower accelerations can improve overhang quality.", "unit": "mm/s²", "type": "float", "default_value": 3000, @@ -1862,8 +1862,8 @@ "settable_per_extruder": false }, "jerk_support_roof": { - "label": "Support Roof Jerk", - "description": "The maximum instantaneous velocity change with which the roofs of support are printed.", + "label": "Support Interface Jerk", + "description": "The maximum instantaneous velocity change with which the roofs and bottoms of support are printed.", "unit": "mm/s", "type": "float", "default_value": 20, @@ -2357,8 +2357,8 @@ }, "support_roof_enable": { - "label": "Enable Support Roof", - "description": "Generate a dense top skin at the top of the support on which the model is printed.", + "label": "Enable Support Interface", + "description": "Generate a dense interface between the model and the support. This will create a skin at the top of the support on which the model is printed and at the bottom of the support, where it rests on the model.", "type": "bool", "default_value": false, "global_inherits_stack": "support_extruder_nr", @@ -2411,8 +2411,8 @@ }, "support_roof_density": { - "label": "Support Roof Density", - "description": "Adjusts the density of the roof of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "label": "Support Interface Density", + "description": "Adjusts the density of the roofs and bottoms of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", "unit": "%", "type": "float", "default_value": 100, @@ -2425,8 +2425,8 @@ { "support_roof_line_distance": { - "label": "Support Roof Line Distance", - "description": "Distance between the printed support roof lines. This setting is calculated by the support roof Density, but can be adjusted separately.", + "label": "Support Interface Line Distance", + "description": "Distance between the printed support interface lines. This setting is calculated by the Support Interface Density, but can be adjusted separately.", "unit": "mm", "type": "float", "default_value": 0.4, @@ -2440,8 +2440,8 @@ }, "support_roof_pattern": { - "label": "Support Roof Pattern", - "description": "The pattern with which the top of the support is printed.", + "label": "Support Interface Pattern", + "description": "The pattern with which the interface of the support with the model is printed.", "type": "enum", "options": { @@ -3089,8 +3089,8 @@ }, "support_roof_extruder_nr": { - "label": "Support Roof Extruder", - "description": "The extruder train to use for printing the roof of the support. This is used in multi-extrusion.", + "label": "Support Interface Extruder", + "description": "The extruder train to use for printing the roofs and bottoms of the support. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", "value": "support_extruder_nr", From 358a48dfbb7c5fe4e593d3ebdee7356ad8abeee4 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 27 Jul 2016 12:14:25 +0200 Subject: [PATCH 03/63] JSON fix: support_bottom_height now warns if below support_bottom_stair_step_dist (CURA-1013) --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8a53f4859a..0e07121539 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2402,6 +2402,7 @@ "default_value": 1, "value": "support_interface_height", "minimum_value": "0", + "minimum_value_warning": "support_bottom_stair_step_height", "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", "enabled": "support_roof_enable and support_enable", From 1f903b9fccd9cfe15a36070e381d3bd23bcd39dc Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 28 Jul 2016 14:06:00 +0200 Subject: [PATCH 04/63] JSON renames: support_roof_... ==> support_interface... (CURA-1013) --- cura/CuraApplication.py | 2 +- resources/definitions/fdmprinter.def.json | 42 +++++++++++------------ 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c51207862e..5daae559d6 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -235,7 +235,7 @@ class CuraApplication(QtApplication): support support_enable support_type - support_roof_density + support_interface_density platform_adhesion adhesion_type brim_width diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 66748a9482..9866e1a35d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -633,7 +633,7 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "support_roof_line_width": + "support_interface_line_width": { "label": "Support Interface Line Width", "description": "Width of a single support interface line.", @@ -642,7 +642,7 @@ "minimum_value": "0.0001", "maximum_value_warning": "machine_nozzle_size * 2", "type": "float", - "enabled": "support_roof_enable", + "enabled": "support_interface_enable", "value": "line_width", "settable_per_mesh": false, "settable_per_extruder": true @@ -1462,7 +1462,7 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "speed_support_roof": + "speed_support_interface": { "label": "Support Interface Speed", "description": "The speed at which the roofs and bottoms of support are printed. Printing the them at lower speeds can improve overhang quality.", @@ -1472,7 +1472,7 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "150", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_interface_enable and support_enable", "value": "speed_support / 1.5", "settable_per_mesh": false, "settable_per_extruder": true @@ -1663,7 +1663,7 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "acceleration_support_roof": { + "acceleration_support_interface": { "label": "Support Interface Acceleration", "description": "The acceleration with which the roofs and bottoms of support are printed. Printing them at lower accelerations can improve overhang quality.", "unit": "mm/s²", @@ -1673,7 +1673,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "acceleration_enabled and support_roof_enable and support_enable", + "enabled": "acceleration_enabled and support_interface_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -1851,7 +1851,7 @@ "settable_per_mesh": false, "settable_per_extruder": true }, - "jerk_support_roof": { + "jerk_support_interface": { "label": "Support Interface Jerk", "description": "The maximum instantaneous velocity change with which the roofs and bottoms of support are printed.", "unit": "mm/s", @@ -1861,7 +1861,7 @@ "minimum_value": "0.1", "minimum_value_warning": "5", "maximum_value_warning": "50", - "enabled": "jerk_enabled and support_roof_enable and support_enable", + "enabled": "jerk_enabled and support_interface_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -2344,7 +2344,7 @@ "enabled": "support_enable", "settable_per_mesh": true }, - "support_roof_enable": + "support_interface_enable": { "label": "Enable Support Interface", "description": "Generate a dense interface between the model and the support. This will create a skin at the top of the support on which the model is printed and at the bottom of the support, where it rests on the model.", @@ -2364,7 +2364,7 @@ "minimum_value": "0", "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": true, "children": { @@ -2379,7 +2379,7 @@ "minimum_value": "0", "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": true }, "support_bottom_height": @@ -2394,12 +2394,12 @@ "minimum_value_warning": "support_bottom_stair_step_height", "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": true } } }, - "support_roof_density": + "support_interface_density": { "label": "Support Interface Density", "description": "Adjusts the density of the roofs and bottoms of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", @@ -2408,12 +2408,12 @@ "default_value": 100, "minimum_value": "0", "maximum_value_warning": "100", - "enabled":"support_roof_enable and support_enable", + "enabled":"support_interface_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": { - "support_roof_line_distance": + "support_interface_line_distance": { "label": "Support Interface Line Distance", "description": "Distance between the printed support interface lines. This setting is calculated by the Support Interface Density, but can be adjusted separately.", @@ -2421,14 +2421,14 @@ "type": "float", "default_value": 0.4, "minimum_value": "0", - "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))", - "enabled": "support_roof_enable and support_enable", + "value": "0 if support_interface_density == 0 else (support_interface_line_width * 100) / support_interface_density * (2 if support_interface_pattern == \"grid\" else (3 if support_interface_pattern == \"triangles\" else 1))", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } } }, - "support_roof_pattern": + "support_interface_pattern": { "label": "Support Interface Pattern", "description": "The pattern with which the interface of the support with the model is printed.", @@ -2442,7 +2442,7 @@ "zigzag": "Zig Zag" }, "default_value": "concentric", - "enabled": "support_roof_enable and support_enable", + "enabled": "support_interface_enable and support_enable", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -3077,14 +3077,14 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "support_roof_extruder_nr": + "support_interface_extruder_nr": { "label": "Support Interface Extruder", "description": "The extruder train to use for printing the roofs and bottoms of the support. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "support_enable and support_roof_enable", + "enabled": "support_enable and support_interface_enable", "settable_per_mesh": false, "settable_per_extruder": false } From 1e46ab9eea4179024b233d47320abc01b0905838 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 13:45:24 +0200 Subject: [PATCH 05/63] Remove stale AddMachineWizard file --- resources/qml/AddMachineWizard.qml | 32 ------------------------------ 1 file changed, 32 deletions(-) delete mode 100644 resources/qml/AddMachineWizard.qml diff --git a/resources/qml/AddMachineWizard.qml b/resources/qml/AddMachineWizard.qml deleted file mode 100644 index 1c743834de..0000000000 --- a/resources/qml/AddMachineWizard.qml +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2015 Ultimaker B.V. -// Cura is released under the terms of the AGPLv3 or higher. - -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.1 - -import UM 1.1 as UM -import Cura 1.0 as Cura - -import "WizardPages" - -UM.Wizard -{ - id: base; - - title: catalog.i18nc("@title:window", "Add Printer") - - // This part is optional - // This part checks whether there is a printer -> if not: some of the functions (delete for example) are disabled - firstRun: false - - Component.onCompleted: { - base.appendPage(Qt.resolvedUrl("WizardPages/AddMachine.qml"), catalog.i18nc("@title", "Add Printer")); - base.currentPage = 0; - } - - Item { - UM.I18nCatalog { id: catalog; name: "cura"; } - } -} From 4adadd86ebe80b66049ed533b8936a51aefb7c91 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Aug 2016 14:13:57 +0200 Subject: [PATCH 06/63] Fix defaults of some settings It was saying 'default' instead of 'default_value'. Must've been translated wrong from 2.1. --- .../definitions/mankati_fullscale_xt_plus.def.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/definitions/mankati_fullscale_xt_plus.def.json b/resources/definitions/mankati_fullscale_xt_plus.def.json index eb8b99aaf9..72c8ebdd86 100644 --- a/resources/definitions/mankati_fullscale_xt_plus.def.json +++ b/resources/definitions/mankati_fullscale_xt_plus.def.json @@ -54,13 +54,13 @@ "speed_travel": { "default_value": 150 }, "speed_layer_0": { "minimum_value": "0.1", - "default": 15.0 + "default_value": 15.0 }, - "infill_overlap": { "default": 10 }, - "cool_fan_enabled": { "default": false }, - "cool_fan_speed": { "default": 0 }, - "skirt_line_count": { "default": 3 }, - "skirt_gap": { "default": 4 }, - "skirt_brim_minimal_length": { "default": 200 } + "infill_overlap": { "default_value": 10 }, + "cool_fan_enabled": { "default_value": false }, + "cool_fan_speed": { "default_value": 0 }, + "skirt_line_count": { "default_value": 3 }, + "skirt_gap": { "default_value": 4 }, + "skirt_brim_minimal_length": { "default_value": 200 } } } From dc6482853a39da83ba8e01566f6024cc94aee8ee Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Aug 2016 14:14:58 +0200 Subject: [PATCH 07/63] Split acceleration_layer_0 and jerk_layer_0 into print/travel Exactly the same as how it's done with speed_layer_0. Contributes to issue CURA-1507. --- resources/definitions/fdmprinter.def.json | 65 +++++++++++++++++++++-- 1 file changed, 62 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e7445b6061..2864093b7d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1545,7 +1545,6 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "300", - "settable_per_mesh": true, "settable_per_extruder": true } } @@ -1748,7 +1747,37 @@ "minimum_value_warning": "100", "maximum_value_warning": "10000", "enabled": "acceleration_enabled", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": { + "acceleration_print_layer_0": + { + "label": "Initial Layer Print Acceleration", + "description": "The acceleration during the printing of the initial layer.", + "unit": "mm/s", + "type": "float", + "default_value": 3000, + "value": "acceleration_layer_0", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "acceleration_enabled", + "settable_per_mesh": true + }, + "acceleration_travel_layer_0": + { + "label": "Initial Layer Travel Acceleration", + "description": "The acceleration for travel moves in the initial layer.", + "unit": "mm/s", + "type": "float", + "default_value": 3000, + "value": "acceleration_layer_0 * acceleration_travel / acceleration_print", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "acceleration_enabled", + "settable_per_extruder": true + } + } }, "acceleration_skirt_brim": { "label": "Skirt/Brim Acceleration", @@ -1936,7 +1965,37 @@ "minimum_value_warning": "5", "maximum_value_warning": "50", "enabled": "jerk_enabled", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": { + "jerk_print_layer_0": + { + "label": "Initial Layer Print Jerk", + "description": "The maximum instantaneous velocity change during the printing of the initial layer.", + "unit": "mm/s", + "type": "float", + "default_value": 20, + "value": "jerk_layer_0", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "jerk_enabled", + "settable_per_mesh": true + }, + "jerk_travel_layer_0": + { + "label": "Initial Layer Travel Jerk", + "description": "The acceleration for travel moves in the initial layer.", + "unit": "mm/s", + "type": "float", + "default_value": 20, + "value": "jerk_layer_0 * jerk_travel / jerk_print", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "jerk_enabled", + "settable_per_extruder": true + } + } }, "jerk_skirt_brim": { "label": "Skirt/Brim Jerk", From 70acdb168b307d3908f75d7362da226784cfde5f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Aug 2016 14:56:18 +0200 Subject: [PATCH 08/63] Automate removing settings from old profiles for renames So we don't have to edit the actual code for simple setting renames. --- .../VersionUpgrade21to22.py | 25 ++----------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py index 64ea1ac665..611a290633 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py @@ -146,32 +146,11 @@ class VersionUpgrade21to22(VersionUpgrade): for key, value in settings.items(): if key == "fill_perimeter_gaps": #Setting is removed. del settings[key] - elif key == "remove_overlapping_walls_0_enabled": #Setting is functionally replaced. - del settings[key] - settings["travel_compensate_overlapping_walls_0_enabled"] = value - elif key == "remove_overlapping_walls_enabled": #Setting is functionally replaced. - del settings[key] - settings["travel_compensate_overlapping_walls_enabled"] = value - elif key == "remove_overlapping_walls_x_enabled": #Setting is functionally replaced. - del settings[key] - settings["travel_compensate_overlapping_walls_x_enabled"] = value elif key == "retraction_combing": #Combing was made into an enum instead of a boolean. settings[key] = "off" if (value == "False") else "all" - elif key == "retraction_hop": #Setting key was changed. + elif key in _setting_name_translations: del settings[key] - settings["retraction_hop_enabled"] = value - elif key == "skirt_minimal_length": #Setting key was changed. - del settings[key] - settings["skirt_brim_minimal_length"] = value - elif key == "skirt_line_width": #Setting key was changed. - del settings[key] - settings["skirt_brim_line_width"] = value - elif key == "skirt_speed": #Setting key was changed. - del settings[key] - settings["skirt_brim_speed"] = value - elif key == "speed_support_lines": #Setting key was changed. - del settings[key] - settings["speed_support_infill"] = value + settings[_setting_name_translations[key]] = value return settings ## Translates a setting name for the change from Cura 2.1 to 2.2. From f759b2403442dc7f23921f55c89f98146ce31b95 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Aug 2016 15:03:14 +0200 Subject: [PATCH 09/63] Add translations for support roof to support interface These setting names were changed. Contributes to issue CURA-1013. --- .../VersionUpgrade21to22/VersionUpgrade21to22.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py index 611a290633..a871f969a5 100644 --- a/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py +++ b/plugins/VersionUpgrade/VersionUpgrade21to22/VersionUpgrade21to22.py @@ -34,7 +34,14 @@ _setting_name_translations = { "skirt_line_width": "skirt_brim_line_width", "skirt_minimal_length": "skirt_brim_minimal_length", "skirt_speed": "skirt_brim_speed", - "speed_support_lines": "speed_support_infill" + "speed_support_lines": "speed_support_infill", + "speed_support_roof": "speed_support_interface", + "support_roof_density": "support_interface_density", + "support_roof_enable": "support_interface_enable", + "support_roof_extruder_nr": "support_interface_extruder_nr", + "support_roof_line_distance": "support_interface_line_distance", + "support_roof_line_width": "support_interface_line_width", + "support_roof_pattern": "support_interface_pattern" } ## How to translate variants of specific machines from the old version to the From a9ed562a5886f47615c84b6e76f77f3ff87f6ac6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 15:21:12 +0200 Subject: [PATCH 10/63] Allow machine actions to reference the dialog they are shown in This way they can respond to the onAccepted and onRejected actions of the dialog Contributes to CURA-2019 --- resources/qml/MachineAction.qml | 4 ++++ resources/qml/Preferences/MachinesPage.qml | 1 + 2 files changed, 5 insertions(+) diff --git a/resources/qml/MachineAction.qml b/resources/qml/MachineAction.qml index 59fb3946a3..2c43f9f96d 100644 --- a/resources/qml/MachineAction.qml +++ b/resources/qml/MachineAction.qml @@ -3,6 +3,10 @@ import QtQuick 2.2 Item { id: contentItem + + // Point to the dialog containing the displayItem + property var dialog + // Connect the finished property change to completed signal. property var finished: manager.finished onFinishedChanged: if(manager.finished) {completed()} diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index b057a33d52..e5b04d1ee9 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -106,6 +106,7 @@ UM.ManagementPage { contents = content; content.onCompleted.connect(hide) + content.dialog = actionDialog } rightButtons: Button { From 0c8d0a11a90feb87e7bc7f8112d9ff76fb5a410c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 15:22:21 +0200 Subject: [PATCH 11/63] Fix a couple of qml casting errors --- resources/qml/AddMachineDialog.qml | 3 ++- resources/qml/Cura.qml | 1 + resources/qml/Preferences/MachinesPage.qml | 6 +++--- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index 350435d1ca..8d0ff9af02 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -16,6 +16,7 @@ UM.Dialog { id: base title: catalog.i18nc("@title:window", "Add Printer") + property bool firstRun: false property string preferredCategory: "Ultimaker" property string activeCategory: preferredCategory @@ -32,7 +33,7 @@ UM.Dialog signal machineAdded(string id) function getMachineName() { - var name = machineList.model.get(machineList.currentIndex).name + var name = machineList.model.get(machineList.currentIndex) != undefined ? machineList.model.get(machineList.currentIndex).name : "" return name } diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index ae72353e0e..5f45a062b8 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -677,6 +677,7 @@ UM.MainWindow id: addMachineDialog onMachineAdded: { + machineActionsWizard.firstRun = addMachineDialog.firstRun machineActionsWizard.start(id) } } diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index e5b04d1ee9..e48448ae4c 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -83,7 +83,7 @@ UM.ManagementPage Repeater { id: machineActionRepeater - model: Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) + model: base.currentItem ? Cura.MachineActionManager.getSupportedActions(Cura.MachineManager.getDefinitionByMachineId(base.currentItem.id)) : null Button { @@ -125,8 +125,8 @@ UM.ManagementPage spacing: UM.Theme.getSize("default_margin").height - Label { text: catalog.i18nc("@label", "Type") } - Label { text: base.currentItem ? base.currentItem.metadata.definition_name : "" } + Label { text: catalog.i18nc("@label", "Type"); visible: base.currentItem } + Label { text: (base.currentItem && base.currentItem.metadata) ? base.currentItem.metadata.definition_name : "" } } UM.I18nCatalog { id: catalog; name: "uranium"; } From 1808c44d026082a9db5a3212c3fbe937fcd8edb8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 15:36:43 +0200 Subject: [PATCH 12/63] Change behavior of the "Close" button on a machineaction dialog Pressing close now "rejects" the action, similar to pressing "cancel" in the add machine wizard (instead of accepting, like pressing "ok"). CURA-2019 --- resources/qml/Preferences/MachinesPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index e48448ae4c..0baa0c0f90 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -112,7 +112,7 @@ UM.ManagementPage { text: catalog.i18nc("@action:button", "Close") iconName: "dialog-close" - onClicked: actionDialog.accept() + onClicked: actionDialog.reject() } } From 7b873fc397ef33d8a1b5a12d859eba9aadb9a331 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 16:05:57 +0200 Subject: [PATCH 13/63] Fix renaming profiles CURA-2017 --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 9e09ad83be..ce60c6d3a6 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -553,7 +553,7 @@ class MachineManager(QObject): return "" @pyqtSlot(str, str) - def renameQualityContainer(self, container_id, nbalew_name): + def renameQualityContainer(self, container_id, new_name): containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id, type = "quality") if containers: new_name = self._createUniqueName("quality", containers[0].getName(), new_name, From e7452cd64428f9f9c50b32ea3bc6129443e44e9e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 Aug 2016 16:35:48 +0200 Subject: [PATCH 14/63] Make speed_layer_0 and cousin settings not per-mesh Fixed up some of the settable_per stuff. Contributes to issue CURA-1507. --- resources/definitions/fdmprinter.def.json | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2864093b7d..2b37d88eac 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1545,7 +1545,8 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "300", - "settable_per_extruder": true + "settable_per_extruder": true, + "settable_per_mesh": false } } }, @@ -1775,7 +1776,8 @@ "minimum_value_warning": "100", "maximum_value_warning": "10000", "enabled": "acceleration_enabled", - "settable_per_extruder": true + "settable_per_extruder": true, + "settable_per_mesh": false } } }, @@ -1993,7 +1995,8 @@ "minimum_value_warning": "5", "maximum_value_warning": "50", "enabled": "jerk_enabled", - "settable_per_extruder": true + "settable_per_extruder": true, + "settable_per_mesh": false } } }, From 68fc9af4c2b4b0e1f4eab987e685dfa5a9904174 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 16:38:31 +0200 Subject: [PATCH 15/63] Fix removing extruder stacks and extruder user profile CURA-1898 broke fix for CURA-1896 --- cura/Settings/MachineManager.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index ce60c6d3a6..6a180593c5 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -744,10 +744,7 @@ class MachineManager(QObject): # If the machine that is being removed is the currently active machine, set another machine as the active machine. activate_new_machine = (self._global_container_stack and self._global_container_stack.getId() == machine_id) - stacks = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = machine_id) - if not stacks: - return - ExtruderManager.getInstance().removeMachineExtruders(stacks[0].getBottom().getId()) + ExtruderManager.getInstance().removeMachineExtruders(machine_id) containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "user", machine = machine_id) for container in containers: From 0d9d4b88ce0d419d150ea19a20766d645fc62ca7 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 16:56:56 +0200 Subject: [PATCH 16/63] Hide "Type" label when no printer is selected on the manager printers page --- resources/qml/Preferences/MachinesPage.qml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index 0baa0c0f90..88323a2e26 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -125,8 +125,14 @@ UM.ManagementPage spacing: UM.Theme.getSize("default_margin").height - Label { text: catalog.i18nc("@label", "Type"); visible: base.currentItem } - Label { text: (base.currentItem && base.currentItem.metadata) ? base.currentItem.metadata.definition_name : "" } + Label + { + text: catalog.i18nc("@label", "Type") + visible: base.currentItem && base.currentItem.metadata + } + Label { + text: (base.currentItem && base.currentItem.metadata) ? base.currentItem.metadata.definition_name : "" + } } UM.I18nCatalog { id: catalog; name: "uranium"; } From b765855ba5d3bb96d7113e485e34c4e8b8f3cd49 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 25 May 2016 10:55:02 +0200 Subject: [PATCH 17/63] Show "ghosts" for all objects on the buildplate in layerview CURA-1601 --- plugins/LayerView/LayerView.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index f60d492ec7..7c7246361e 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -33,7 +33,7 @@ class LayerView(View): def __init__(self): super().__init__() self._shader = None - self._selection_shader = None + self._ghost_shader = None self._num_layers = 0 self._layer_percentage = 0 # what percentage of layers need to be shown (Slider gives value between 0 - 100) self._proxy = LayerViewProxy.LayerViewProxy() @@ -84,10 +84,9 @@ class LayerView(View): scene = self.getController().getScene() renderer = self.getRenderer() - if not self._selection_shader: - self._selection_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) - self._selection_shader.setUniformValue("u_color", Color(32, 32, 32, 128)) - + if not self._ghost_shader: + self._ghost_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) + self._ghost_shader.setUniformValue("u_color", Color(32, 32, 32, 96)) for node in DepthFirstIterator(scene.getRoot()): # We do not want to render ConvexHullNode as it conflicts with the bottom layers. # However, it is somewhat relevant when the node is selected, so do render it then. @@ -96,8 +95,7 @@ class LayerView(View): if not node.render(renderer): if node.getMeshData() and node.isVisible(): - if Selection.isSelected(node): - renderer.queueNode(node, transparent = True, shader = self._selection_shader) + renderer.queueNode(node, transparent = True, shader = self._ghost_shader) layer_data = node.callDecoration("getLayerData") if not layer_data: continue @@ -113,13 +111,13 @@ class LayerView(View): end += counts # This uses glDrawRangeElements internally to only draw a certain range of lines. - renderer.queueNode(node, mesh = layer_data, mode = RenderBatch.RenderMode.Lines, range = (start, end)) + renderer.queueNode(node, mesh = layer_data, mode = RenderBatch.RenderMode.Lines, overlay = True, range = (start, end)) if self._current_layer_mesh: - renderer.queueNode(node, mesh = self._current_layer_mesh) + renderer.queueNode(node, mesh = self._current_layer_mesh, overlay = True) if self._current_layer_jumps: - renderer.queueNode(node, mesh = self._current_layer_jumps) + renderer.queueNode(node, mesh = self._current_layer_jumps, overlay = True) def setLayer(self, value): if self._current_layer_num != value: From 42fc25ab09abd044fcd3a12e87586b4edb286460 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 1 Aug 2016 19:17:08 +0200 Subject: [PATCH 18/63] Move sorting of DefinitionContainerModel out of qml Add printer dialog now has sections by a configurable metadata property. A prefered section is set to always show on top. Add weights to the Ultimaker printer definitions to create a sensible list (newest on top). CURA-1593 --- resources/definitions/ultimaker2.def.json | 1 + .../definitions/ultimaker2_extended.def.json | 1 + .../ultimaker2_extended_plus.def.json | 1 + resources/definitions/ultimaker2_go.def.json | 1 + .../definitions/ultimaker2_plus.def.json | 1 + .../definitions/ultimaker_original.def.json | 1 + .../ultimaker_original_plus.def.json | 1 + resources/qml/AddMachineDialog.qml | 43 ++++++------------- 8 files changed, 20 insertions(+), 30 deletions(-) diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index d8e73a7e14..3b246ba682 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -8,6 +8,7 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "category": "Ultimaker", + "weight": 3, "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "ultimaker2_platform.obj", diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json index fb443365f2..889046694c 100644 --- a/resources/definitions/ultimaker2_extended.def.json +++ b/resources/definitions/ultimaker2_extended.def.json @@ -7,6 +7,7 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "category": "Ultimaker", + "weight": 3, "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "ultimaker2_platform.obj", diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index f4190be83d..ea97033878 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -7,6 +7,7 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "category": "Ultimaker", + "weight": 2, "file_formats": "text/x-gcode", "platform": "ultimaker2_platform.obj", "platform_texture": "Ultimaker2ExtendedPlusbackplate.png", diff --git a/resources/definitions/ultimaker2_go.def.json b/resources/definitions/ultimaker2_go.def.json index 27b179eef9..107d413296 100644 --- a/resources/definitions/ultimaker2_go.def.json +++ b/resources/definitions/ultimaker2_go.def.json @@ -7,6 +7,7 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "category": "Ultimaker", + "weight": 3, "file_formats": "text/x-gcode", "icon": "icon_ultimaker2.png", "platform": "ultimaker2go_platform.obj", diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json index d5a7c9f4f1..4c7279b178 100644 --- a/resources/definitions/ultimaker2_plus.def.json +++ b/resources/definitions/ultimaker2_plus.def.json @@ -7,6 +7,7 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "category": "Ultimaker", + "weight": 1, "file_formats": "text/x-gcode", "platform": "ultimaker2_platform.obj", "platform_texture": "Ultimaker2Plusbackplate.png", diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json index 0815aeee02..3dd4766afa 100644 --- a/resources/definitions/ultimaker_original.def.json +++ b/resources/definitions/ultimaker_original.def.json @@ -8,6 +8,7 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "category": "Ultimaker", + "weight": 4, "file_formats": "text/x-gcode", "icon": "icon_ultimaker.png", "platform": "ultimaker_platform.stl", diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json index 4d39a39a78..4f787896d0 100644 --- a/resources/definitions/ultimaker_original_plus.def.json +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -7,6 +7,7 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "category": "Ultimaker", + "weight": 4, "file_formats": "text/x-gcode", "icon": "icon_ultimaker.png", "platform": "ultimaker2_platform.obj", diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index 8d0ff9af02..a2b7c1586f 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -33,7 +33,7 @@ UM.Dialog signal machineAdded(string id) function getMachineName() { - var name = machineList.model.get(machineList.currentIndex) != undefined ? machineList.model.get(machineList.currentIndex).name : "" + var name = machineList.model.getItem(machineList.currentIndex) != undefined ? machineList.model.getItem(machineList.currentIndex).name : "" return name } @@ -53,27 +53,15 @@ UM.Dialog { id: machineList - model: ListModel + model: UM.DefinitionContainersModel { - id: sortedMachineDefinitionsModel - Component.onCompleted: { - // DefinitionContainersModel is sorted alphabetically, but we want the preferred - // category on top so we create a custom-sorted ListModel from it. - var items = []; - for(var i in machineDefinitionsModel.items) { - var item = machineDefinitionsModel.getItem(i); - if (item["category"] == preferredCategory) - sortedMachineDefinitionsModel.append(item); - else - items.push(item); - } - for(var i in items) { - sortedMachineDefinitionsModel.append(items[i]); - } - } + id: machineDefinitionsModel + filter: { "visible": true } + sectionProperty: "category" + preferredSectionValue: preferredCategory } - section.property: "category" + section.property: "section" section.delegate: Button { text: section @@ -112,11 +100,11 @@ UM.Dialog onClicked: { base.activeCategory = section; - if (machineList.model.get(machineList.currentIndex).category != section) { - // Find the first machine from this category + if (machineList.model.getItem(machineList.currentIndex).section != section) { + // Find the first machine from this section for(var i = 0; i < sortedMachineDefinitionsModel.count; i++) { - var item = sortedMachineDefinitionsModel.get(i); - if (item.category == section) { + var item = sortedMachineDefinitionsModel.getItem(i); + if (item.section == section) { machineList.currentIndex = i; break; } @@ -151,7 +139,7 @@ UM.Dialog states: State { name: "collapsed"; - when: base.activeCategory != model.category; + when: base.activeCategory != model.section; PropertyChanges { target: machineButton; opacity: 0; height: 0; } } @@ -198,7 +186,7 @@ UM.Dialog onClicked: { base.visible = false - var item = machineList.model.get(machineList.currentIndex); + var item = machineList.model.getItem(machineList.currentIndex); Cura.MachineManager.addMachine(machineName.text, item.id) base.machineAdded(item.id) // Emit signal that the user added a machine. } @@ -211,11 +199,6 @@ UM.Dialog id: catalog; name: "cura"; } - UM.DefinitionContainersModel - { - id: machineDefinitionsModel - filter: { "visible": true } - } SystemPalette { id: palette } ExclusiveGroup { id: printerGroup; } } From a2fa8246b63829891c74dd46184d92070f1f2bdc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 2 Aug 2016 09:50:42 +0200 Subject: [PATCH 19/63] Disable UM2 material-related settings depending on gcode flavor... ...instead of hardcoding them as disabled. The fdmprinter inheritance-functions for "enabled" are combined with a check for the flavor. This way it will be easier to switch an UM2 to a functional Reprap flavor in a variant. CURA-580 --- resources/definitions/ultimaker2.def.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json index 3b246ba682..9985dea764 100644 --- a/resources/definitions/ultimaker2.def.json +++ b/resources/definitions/ultimaker2.def.json @@ -83,10 +83,10 @@ "default_value": 45 }, "material_print_temperature": { - "enabled": "False" + "enabled": "not (material_flow_dependent_temperature) and machine_gcode_flavor != \"UltiGCode\"" }, "material_bed_temperature": { - "enabled": "False" + "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"" }, "machine_max_feedrate_x": { "default_value": 300 @@ -104,22 +104,22 @@ "default_value": 3000 }, "material_diameter": { - "enabled": "False" + "enabled": "machine_gcode_flavor != \"UltiGCode\"" }, "material_flow": { - "enabled": "False" + "enabled": "machine_gcode_flavor != \"UltiGCode\"" }, "retraction_amount": { - "enabled": "False" + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" }, "retraction_speed": { - "enabled": "False" + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" }, "retraction_retract_speed": { - "enabled": "False" + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" }, "retraction_prime_speed": { - "enabled": "False" + "enabled": "retraction_enable and machine_gcode_flavor != \"UltiGCode\"" } } } From 7d65e0d62bc4c1750f7e6490fc0657fa9627fc21 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 2 Aug 2016 09:51:58 +0200 Subject: [PATCH 20/63] Add title to machine action window --- resources/qml/Preferences/MachinesPage.qml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index 88323a2e26..c149185808 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -87,12 +87,13 @@ UM.ManagementPage Button { - text: machineActionRepeater.model[index].label; + text: machineActionRepeater.model[index].label onClicked: { - actionDialog.content = machineActionRepeater.model[index].displayItem - machineActionRepeater.model[index].displayItem.reset() - actionDialog.show() + actionDialog.content = machineActionRepeater.model[index].displayItem; + machineActionRepeater.model[index].displayItem.reset(); + actionDialog.title = machineActionRepeater.model[index].label; + actionDialog.show(); } } } From 9773a16bc61e34863aed2c68025bbf3310186ba2 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 11:33:23 +0200 Subject: [PATCH 21/63] Properly set active extruder when deepcopying SettingOverrideDecorator Fixes CURA-2022 --- cura/Settings/SettingOverrideDecorator.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index f1e34a939a..183d84d2f4 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -37,10 +37,15 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._updateNextStack() def __deepcopy__(self, memo): + print("deepcopy settingoverridedecorator") ## Create a fresh decorator object deep_copy = SettingOverrideDecorator() ## Copy the instance deep_copy._instance = copy.deepcopy(self._instance, memo) + + # Properly set the right extruder on the copy + deep_copy.setActiveExtruder(self._extruder_stack) + ## Set the copied instance as the first (and only) instance container of the stack. deep_copy._stack.replaceContainer(0, deep_copy._instance) return deep_copy From 186cd2034c76d8b080dc6b6e16784556d4a2cf12 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 11:42:04 +0200 Subject: [PATCH 22/63] Remove forced setting of extruder 0 on component complete This would force the object's extruder to 0 every time the per object panel would update, causing the extruder to be reset. Fixes CURA-2026 --- plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 482fb73b0f..75cf522c14 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -127,11 +127,7 @@ Item { } } } - Component.onCompleted: - { - // Ensure primary extruder is set as active - UM.ActiveTool.setProperty("SelectedActiveExtruder", extruders_model.getItem(0).id) - } + onActivated: UM.ActiveTool.setProperty("SelectedActiveExtruder", extruders_model.getItem(index).id); onModelChanged: updateCurrentIndex(); From dc3d22f148f6c8b1200134f17292922df82879f7 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 2 Aug 2016 11:48:47 +0200 Subject: [PATCH 23/63] JSON: disabled flow temp again (CURA-1174) --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2b37d88eac..b8ac173306 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1066,6 +1066,7 @@ "unit": "[[mm³,°C]]", "type": "str", "default_value": "[[3.5,200],[7.0,240]]", + "enabled": "False", "comments": "old enabled function: material_flow_dependent_temperature", "settable_per_mesh": false, "settable_per_extruder": true From 0f9b989ae86fa319269a715d960b533f2a51c09d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 2 Aug 2016 12:30:22 +0200 Subject: [PATCH 24/63] Revert "Show "ghosts" for all objects on the buildplate in layerview" This reverts commit b765855ba5d3bb96d7113e485e34c4e8b8f3cd49. --- plugins/LayerView/LayerView.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/plugins/LayerView/LayerView.py b/plugins/LayerView/LayerView.py index 7c7246361e..f60d492ec7 100644 --- a/plugins/LayerView/LayerView.py +++ b/plugins/LayerView/LayerView.py @@ -33,7 +33,7 @@ class LayerView(View): def __init__(self): super().__init__() self._shader = None - self._ghost_shader = None + self._selection_shader = None self._num_layers = 0 self._layer_percentage = 0 # what percentage of layers need to be shown (Slider gives value between 0 - 100) self._proxy = LayerViewProxy.LayerViewProxy() @@ -84,9 +84,10 @@ class LayerView(View): scene = self.getController().getScene() renderer = self.getRenderer() - if not self._ghost_shader: - self._ghost_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) - self._ghost_shader.setUniformValue("u_color", Color(32, 32, 32, 96)) + if not self._selection_shader: + self._selection_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader")) + self._selection_shader.setUniformValue("u_color", Color(32, 32, 32, 128)) + for node in DepthFirstIterator(scene.getRoot()): # We do not want to render ConvexHullNode as it conflicts with the bottom layers. # However, it is somewhat relevant when the node is selected, so do render it then. @@ -95,7 +96,8 @@ class LayerView(View): if not node.render(renderer): if node.getMeshData() and node.isVisible(): - renderer.queueNode(node, transparent = True, shader = self._ghost_shader) + if Selection.isSelected(node): + renderer.queueNode(node, transparent = True, shader = self._selection_shader) layer_data = node.callDecoration("getLayerData") if not layer_data: continue @@ -111,13 +113,13 @@ class LayerView(View): end += counts # This uses glDrawRangeElements internally to only draw a certain range of lines. - renderer.queueNode(node, mesh = layer_data, mode = RenderBatch.RenderMode.Lines, overlay = True, range = (start, end)) + renderer.queueNode(node, mesh = layer_data, mode = RenderBatch.RenderMode.Lines, range = (start, end)) if self._current_layer_mesh: - renderer.queueNode(node, mesh = self._current_layer_mesh, overlay = True) + renderer.queueNode(node, mesh = self._current_layer_mesh) if self._current_layer_jumps: - renderer.queueNode(node, mesh = self._current_layer_jumps, overlay = True) + renderer.queueNode(node, mesh = self._current_layer_jumps) def setLayer(self, value): if self._current_layer_num != value: From 22b6ab9c42ab24e8095dfd0e331c916af7fa554a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 13:53:31 +0200 Subject: [PATCH 25/63] Set the extruder stack to a proper default when creating SettingOverrideDecorator Turns out it otherwise fails to send the right data. Fixes CURA-2032 --- cura/Settings/SettingOverrideDecorator.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 183d84d2f4..674c61b87c 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -10,6 +10,8 @@ from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry import UM.Logger +import cura.Settings + from UM.Application import Application ## A decorator that adds a container stack to a Node. This stack should be queried for all settings regarding @@ -26,7 +28,11 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._stack.setDirty(False) # This stack does not need to be saved. self._instance = InstanceContainer(container_id = "SettingOverrideInstanceContainer") self._stack.addContainer(self._instance) - self._extruder_stack = None #Stack upon which our stack is based. + + if cura.Settings.ExtruderManager.getInstance().extruderCount > 1: + self._extruder_stack = cura.Settings.ExtruderManager.getInstance().activeExtruderStackId + else: + self._extruder_stack = None self._stack.propertyChanged.connect(self._onSettingChanged) @@ -66,7 +72,11 @@ class SettingOverrideDecorator(SceneNodeDecorator): if self._extruder_stack: extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = self._extruder_stack) if extruder_stack: - old_extruder_stack_id = self._stack.getNextStack().getId() + if self._stack.getNextStack(): + old_extruder_stack_id = self._stack.getNextStack().getId() + else: + old_extruder_stack_id = "" + self._stack.setNextStack(extruder_stack[0]) if self._stack.getNextStack().getId() != old_extruder_stack_id: #Only reslice if the extruder changed. Application.getInstance().getBackend().forceSlice() From b97b694f414029c5d1ae2cc629480624b090e20f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 13:57:55 +0200 Subject: [PATCH 26/63] Force recreating the socket when using external-backend This may recreate the socket with a new port number but at least it recreates the socket now. Partially fixes CURA-1877 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index a822512218..910705df42 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -181,6 +181,11 @@ class CuraEngineBackend(Backend): self.slicingCancelled.emit() self.processingProgress.emit(0) Logger.log("d", "Attempting to kill the engine process") + + if Application.getInstance().getCommandLineOption("external-backend", False): + self._createSocket() + return + if self._process is not None: Logger.log("d", "Killing engine process") try: From 4f9fab94188f1597f6505eb03811de4f8a6bfbec Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 14:49:57 +0200 Subject: [PATCH 27/63] Set the right default extruder for the main property provider Fixes CURA-2024 --- resources/qml/Settings/SettingView.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 009dbf09a9..978e2dcaed 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -125,7 +125,7 @@ ScrollView { id: provider - containerStackId: delegate.stackId + containerStackId: Cura.MachineManager.activeMachineId key: model.key ? model.key : "" watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder" ] storeIndex: 0 From 0f1c59c92599772b739a0e74f94150508ac208a1 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 15:20:03 +0200 Subject: [PATCH 28/63] Properly catch when either extruder or global quality is not properly set Cornercase, but it avoids bubbling odd error messages to the UI. Fixes CURA-1997 --- plugins/GCodeWriter/GCodeWriter.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index 8e3be15ffe..c2a932b68c 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -90,12 +90,20 @@ class GCodeWriter(MeshWriter): prefix_length = len(prefix) container_with_profile = stack.findContainer({"type": "quality"}) + if not container_with_profile: + Logger.log("e", "No valid quality profile found, not writing settings to GCode!") + return "" + flat_global_container = self._createFlattenedContainerInstance(stack.getTop(),container_with_profile) serialized = flat_global_container.serialize() data = {"global_quality": serialized} for extruder in ExtruderManager.getInstance().getMachineExtruders(stack.getId()): extruder_quality = extruder.findContainer({"type": "quality"}) + if not extruder_quality: + Logger.log("w", "No extruder quality profile found, not writing quality for extruder %s to file!", extruder.getId()) + continue + flat_extruder_quality = self._createFlattenedContainerInstance(extruder.getTop(), extruder_quality) extruder_serialized = flat_extruder_quality.serialize() From ab843b8187665e6d853fe671797a5ae13ba84ede Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 2 Aug 2016 15:57:01 +0200 Subject: [PATCH 29/63] Reset qml component when resetting a Machine Action Contributes to CURA-2019 and fixes CURA-1978 --- cura/MachineAction.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/MachineAction.py b/cura/MachineAction.py index 6a4df0fce1..b9ff938303 100644 --- a/cura/MachineAction.py +++ b/cura/MachineAction.py @@ -44,6 +44,7 @@ class MachineAction(QObject, PluginObject): # /sa _reset @pyqtSlot() def reset(self): + self._component = None self._finished = False self._reset() From 95b06f317ae3817c7699dc73842780b61c84d493 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 2 Aug 2016 16:13:17 +0200 Subject: [PATCH 30/63] Fix "create" button on profiles page CURA-2036 --- resources/qml/Preferences/ProfilesPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index 119a16facc..c090a8468d 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -75,7 +75,7 @@ UM.ManagementPage onClicked: { var selectedContainer; - if (objectList.currentItem.id == Cura.MachineManager.activeQualityId) { + if (base.currentItem.id == Cura.MachineManager.activeQualityId) { selectedContainer = Cura.MachineManager.newQualityContainerFromQualityAndUser(); } else { selectedContainer = Cura.MachineManager.duplicateContainer(base.currentItem.id); From 5bd3d83c9e31debea3a36ccf7756a9ed02b97650 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 Aug 2016 14:21:42 +0200 Subject: [PATCH 31/63] Fix typos in documentation Contributes to issue CURA-2011. --- .../PerObjectSettingVisibilityHandler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 181c3dea18..57864eac34 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -7,8 +7,8 @@ import UM.Settings.Models from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator -## The per object setting visibility handler ensures that only setting defintions that have a matching instance Container -# are returned as visible. +## The per object setting visibility handler ensures that only setting +# definitions that have a matching instance Container are returned as visible. class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler): def __init__(self, parent = None, *args, **kwargs): super().__init__(parent = parent, *args, **kwargs) @@ -57,7 +57,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand settings.addInstance(SettingInstance(definition, settings)) visibility_changed = True else: - Logger.log("w", "Unable to add instance (%s) to perobject visibility because we couldn't find the matching definition", item) + Logger.log("w", "Unable to add instance (%s) to per-object visibility because we couldn't find the matching definition", item) if visibility_changed: self.visibilityChanged.emit() From f568014e67860bbb16e5f521350574e2ef734898 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 Aug 2016 16:49:28 +0200 Subject: [PATCH 32/63] Add setting with value from support extruder stack Upon adding the setting (making it visible) it takes the setting from the support extruder stack. It doesn't update afterwards. Contributes to issue CURA-2011. --- .../PerObjectSettingVisibilityHandler.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 57864eac34..c50a70d950 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -1,10 +1,14 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal + from UM.Application import Application from UM.Settings.SettingInstance import SettingInstance from UM.Logger import Logger - import UM.Settings.Models +from cura.Settings.ExtruderManager import ExtruderManager #To get global-inherits-stack setting values from different extruders. from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator ## The per object setting visibility handler ensures that only setting @@ -54,7 +58,13 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand if not settings.getInstance(item): definition = self._stack.getSettingDefinition(item) if definition: - settings.addInstance(SettingInstance(definition, settings)) + new_instance = SettingInstance(definition, settings) + if definition.global_inherits_stack: + #Obtain the value from the correct container stack. Only once, upon adding the setting. + stack_nr = self._stack.getProperty(item, "global_inherits_stack") #Stack to get the setting from. + extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] + new_instance.value = extruder_stack.getProperty(item, "value") + settings.addInstance(new_instance) visibility_changed = True else: Logger.log("w", "Unable to add instance (%s) to per-object visibility because we couldn't find the matching definition", item) From b102a6cedddd4ebbbd5567b26ed14210fe8a8fe5 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 19:33:59 +0200 Subject: [PATCH 33/63] Expose an extruderValues() function to value functions It returns a list of values for all extruders so that things like max() work. Contributes to CURA-2009 --- cura/CuraApplication.py | 3 ++- cura/Settings/ExtruderManager.py | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 53d509b71c..79233022c6 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -28,6 +28,7 @@ from cura.SetParentOperation import SetParentOperation from UM.Settings.SettingDefinition import SettingDefinition, DefinitionPropertyType from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.SettingFunction import SettingFunction from UM.i18n import i18nCatalog @@ -71,7 +72,6 @@ except ImportError: CuraVersion = "master" # [CodeStyle: Reflecting imported value] CuraBuildType = "" - class CuraApplication(QtApplication): class ResourceTypes: QmlFiles = Resources.UserType + 1 @@ -100,6 +100,7 @@ class CuraApplication(QtApplication): SettingDefinition.addSupportedProperty("global_inherits_stack", DefinitionPropertyType.Function, default = "-1") SettingDefinition.addSettingType("extruder", None, str, Validator) + SettingFunction.registerOperator("extruderValues", cura.Settings.ExtruderManager.getExtruderValues) ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 47359a5e97..3925f67295 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -273,3 +273,25 @@ class ExtruderManager(QObject): global_stack = UM.Application.getInstance().getGlobalContainerStack() if global_stack and global_stack.getBottom(): self.addMachineExtruders(global_stack.getBottom(), global_stack.getId()) + + @staticmethod + def getExtruderValues(name): + global_stack = UM.Application.getInstance().getGlobalContainerStack() + + result = [] + for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): + value = extruder.getRawProperty(name, "value", use_next = False) + + if not value: + continue + + if isinstance(value, UM.Settings.SettingFunction): + value = value(extruder) + + result.append(value) + + if not result: + result.append(global_stack.getProperty(name, "value")) + + return result + From 3c35830cb8d08e8172b9e2c3f544b3e4e4b4b3a4 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 19:34:46 +0200 Subject: [PATCH 34/63] Expose an extruderValue() function to value functions It returns the value of a setting of a specific extruder. Contributes to CURA-2009 --- cura/CuraApplication.py | 2 ++ cura/Settings/ExtruderManager.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 79233022c6..5e78aeeed1 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -101,6 +101,8 @@ class CuraApplication(QtApplication): SettingDefinition.addSettingType("extruder", None, str, Validator) SettingFunction.registerOperator("extruderValues", cura.Settings.ExtruderManager.getExtruderValues) + SettingFunction.registerOperator("extruderValue", cura.Settings.ExtruderManager.getExtruderValue) + ## Add the 4 types of profiles to storage. Resources.addStorageType(self.ResourceTypes.QualityInstanceContainer, "quality") Resources.addStorageType(self.ResourceTypes.VariantInstanceContainer, "variants") diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 3925f67295..641b5a8642 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -6,6 +6,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject, QVariant # import UM.Application #To get the global container stack to find the current machine. import UM.Logger import UM.Settings.ContainerRegistry #Finding containers by ID. +import UM.Settings.SettingFunction ## Manages all existing extruder stacks. @@ -92,6 +93,15 @@ class ExtruderManager(QObject): return self._extruder_trains[global_container_stack.getId()][str(self._active_extruder_index)] return None + ## Get an extruder stack by index + def getExtruderStack(self, index): + global_container_stack = UM.Application.getInstance().getGlobalContainerStack() + if global_container_stack: + if global_container_stack.getId() in self._extruder_trains: + if str(index) in self._extruder_trains[global_container_stack.getId()]: + return self._extruder_trains[global_container_stack.getId()][str(index)] + return None + ## Adds all extruders of a specific machine definition to the extruder # manager. # @@ -295,3 +305,10 @@ class ExtruderManager(QObject): return result + @staticmethod + def getExtruderValue(extruder_index, name): + extruder = ExtruderManager.getInstance().getExtruderStack(extruder_index) + if extruder: + return extruder.getRawProperty(name, "value", use_next = False) + + return None From a7187e7fe39101f060e47626df457c07444b3a93 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 19:40:34 +0200 Subject: [PATCH 35/63] Document getExtruderValues --- cura/Settings/ExtruderManager.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 641b5a8642..2506c0bc0b 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -284,13 +284,21 @@ class ExtruderManager(QObject): if global_stack and global_stack.getBottom(): self.addMachineExtruders(global_stack.getBottom(), global_stack.getId()) + ## Get all extruder values for a certain setting. + # + # This is exposed to SettingFunction so it can be used in value functions. + # + # \param key The key of the setting to retieve values for. + # + # \return A list of values for all extruders. If an extruder does not have a value, it will not be in the list. + # If no extruder has the value, the list will contain the global value. @staticmethod - def getExtruderValues(name): + def getExtruderValues(key): global_stack = UM.Application.getInstance().getGlobalContainerStack() result = [] for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): - value = extruder.getRawProperty(name, "value", use_next = False) + value = extruder.getRawProperty(key, "value", use_next = False) if not value: continue @@ -301,7 +309,7 @@ class ExtruderManager(QObject): result.append(value) if not result: - result.append(global_stack.getProperty(name, "value")) + result.append(global_stack.getProperty(key, "value")) return result From 791d51df2a86ddd5f70f819f161b68100bf2d4f5 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 19:41:23 +0200 Subject: [PATCH 36/63] Expose an extruderValue() function to value functions It can be used to get the value of a specific extruder Contributes to CURA-2009 --- cura/Settings/ExtruderManager.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 2506c0bc0b..71bd58ded5 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -313,10 +313,23 @@ class ExtruderManager(QObject): return result + ## Get the value for a setting from a specific extruder. + # + # This is exposed to SettingFunction to use in value functions. + # + # \param extruder_index The index of the extruder to get the value from. + # \param key The key of the setting to get the value of. + # + # \return The value of the setting for the specified extruder or None if not found. @staticmethod - def getExtruderValue(extruder_index, name): + def getExtruderValue(extruder_index, key): extruder = ExtruderManager.getInstance().getExtruderStack(extruder_index) - if extruder: - return extruder.getRawProperty(name, "value", use_next = False) + value = None - return None + if extruder: + value = extruder.getRawProperty(key, "value", use_next = False) + + if isinstance(value, UM.Settings.SettingFunction): + value = value(extruder) + + return value From 78aaf4caf07bc69d759b43468e4360cbc6af0a7c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 2 Aug 2016 19:41:54 +0200 Subject: [PATCH 37/63] Use the new extruderValues() function to determine max_warning of layer_height Contributes to CURA-2009 --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b8ac173306..84b5d3219e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -506,7 +506,7 @@ "default_value": 0.1, "minimum_value": "0.001", "minimum_value_warning": "0.04", - "maximum_value_warning": "0.8 * machine_nozzle_size", + "maximum_value_warning": "0.8 * min(extruderValues('machine_nozzle_size'))", "settable_per_mesh": false, "settable_per_extruder": false }, @@ -519,7 +519,7 @@ "default_value": 0.3, "minimum_value": "0.001", "minimum_value_warning": "0.04", - "maximum_value_warning": "0.8 * machine_nozzle_size", + "maximum_value_warning": "0.8 * min(extruderValues('machine_nozzle_size'))", "settable_per_mesh": false, "settable_per_extruder": false }, From df1b6b8e88dce6801365a06be7fba489bcc28cfe Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 3 Aug 2016 10:27:17 +0200 Subject: [PATCH 38/63] Only get from extruder if global_inherits_stack is valid Sometimes it is set to give -1 for some settings. Contributes to issue CURA-2040. --- .../PerObjectSettingVisibilityHandler.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index c50a70d950..ebb372ad96 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -62,8 +62,9 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand if definition.global_inherits_stack: #Obtain the value from the correct container stack. Only once, upon adding the setting. stack_nr = self._stack.getProperty(item, "global_inherits_stack") #Stack to get the setting from. - extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] - new_instance.value = extruder_stack.getProperty(item, "value") + if int(stack_nr) >= 0: #Only if it defines an extruder stack. + extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] + new_instance.value = extruder_stack.getProperty(item, "value") settings.addInstance(new_instance) visibility_changed = True else: From 557044b11c3bfa3469ff49a217910c126dcc35c2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 3 Aug 2016 12:39:01 +0200 Subject: [PATCH 39/63] Remove print statement Wasn't meant to be committed, I reckon. Contributes to issue CURA-2022. --- cura/Settings/SettingOverrideDecorator.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 674c61b87c..f547d283a4 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -43,7 +43,6 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._updateNextStack() def __deepcopy__(self, memo): - print("deepcopy settingoverridedecorator") ## Create a fresh decorator object deep_copy = SettingOverrideDecorator() ## Copy the instance From 7d48ad7872db119b9f4afb53b08f6c288430fb17 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Aug 2016 18:15:06 +0200 Subject: [PATCH 40/63] Fix qml warning in Printers page after adding a printer --- resources/qml/Preferences/MachinesPage.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index c149185808..ca9184ae6b 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -129,10 +129,10 @@ UM.ManagementPage Label { text: catalog.i18nc("@label", "Type") - visible: base.currentItem && base.currentItem.metadata + visible: base.currentItem && "definition_name" in base.currentItem.metadata } Label { - text: (base.currentItem && base.currentItem.metadata) ? base.currentItem.metadata.definition_name : "" + text: (base.currentItem && "definition_name" in base.currentItem.metadata) ? base.currentItem.metadata.definition_name : "" } } From 16e9c1b2bdc4aeabb2645c95b6664f501022de24 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 3 Aug 2016 22:14:39 +0200 Subject: [PATCH 41/63] Tweak general preference page spacing --- resources/qml/Preferences/GeneralPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 223b7eda85..07a188713f 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -69,6 +69,7 @@ UM.PreferencesPage Row { + spacing: UM.Theme.getSize("default_margin").width Label { id: languageLabel From d97c9f6e4c37a09bb2ef9efd0ff80ce4a1da1c19 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Aug 2016 11:36:45 +0200 Subject: [PATCH 42/63] Don't use extruder fallback on single-extrusion machines Due to a gnawing feeling in the back of my head, I tested this with an UM2 and adding settings failed there. This fixes it. Contributes to issue CURA-2011. --- .../PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index ebb372ad96..8386095ee1 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -59,7 +59,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand definition = self._stack.getSettingDefinition(item) if definition: new_instance = SettingInstance(definition, settings) - if definition.global_inherits_stack: + if definition.global_inherits_stack and self._stack.getProperty("machine_extruder_count", "value") > 1: #Obtain the value from the correct container stack. Only once, upon adding the setting. stack_nr = self._stack.getProperty(item, "global_inherits_stack") #Stack to get the setting from. if int(stack_nr) >= 0: #Only if it defines an extruder stack. From ee95e90b4b4a5cbbb9d7cd79f93f911435d46814 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Aug 2016 12:36:33 +0200 Subject: [PATCH 43/63] Fix display update bug in per-object panel Setting .value creates a new Python attribute in the object. Setting with setProperty creates the setting property, like we wanted. Contributes to issue CURA-2011. --- .../PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 8386095ee1..a580382845 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -64,7 +64,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand stack_nr = self._stack.getProperty(item, "global_inherits_stack") #Stack to get the setting from. if int(stack_nr) >= 0: #Only if it defines an extruder stack. extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] - new_instance.value = extruder_stack.getProperty(item, "value") + new_instance.setProperty("value", extruder_stack.getProperty(item, "value")) settings.addInstance(new_instance) visibility_changed = True else: From b89a9a81130a59fd6f658aba77f7cd4841b698a6 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Aug 2016 12:50:03 +0200 Subject: [PATCH 44/63] Allow freezing temperatures But not on Ultimaker printers, because they crash. --- resources/definitions/fdmprinter.def.json | 6 +++--- resources/definitions/ultimaker.def.json | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 33d41332a1..5118966d5a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1053,7 +1053,7 @@ "unit": "°C", "type": "float", "default_value": 210, - "minimum_value": "0", + "minimum_value": "-273.15", "maximum_value_warning": "260", "enabled": "not (material_flow_dependent_temperature)", "settable_per_mesh": false, @@ -1090,7 +1090,7 @@ "unit": "°C", "type": "float", "default_value": 60, - "minimum_value": "0", + "minimum_value": "-273.15", "maximum_value_warning": "260", "enabled": "machine_heated_bed", "settable_per_mesh": false, @@ -1269,7 +1269,7 @@ "type": "float", "unit": "°C", "default_value": 150, - "minimum_value": "0", + "minimum_value": "-273.15", "maximum_value_warning": "260", "settable_per_mesh": false, "settable_per_extruder": true diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json index 5df38d07cb..dc52b00dcc 100644 --- a/resources/definitions/ultimaker.def.json +++ b/resources/definitions/ultimaker.def.json @@ -7,5 +7,16 @@ "author": "Ultimaker", "manufacturer": "Ultimaker", "visible": false + }, + "overrides": { + "material_print_temperature": { + "minimum_value": "0" + }, + "material_bed_temperature": { + "minimum_value": "0" + }, + "material_standby_temperature": { + "minimum_value": "0" + } } } From a74d5dd8cb60b8f808a1ef128e3897c66bdc493a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Aug 2016 13:25:28 +0200 Subject: [PATCH 45/63] Show error text in print monitor CURA-1990 --- cura/PrinterOutputDevice.py | 13 +++++++++++++ resources/qml/MonitorButton.qml | 34 +++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 212ed86ab3..f42c365ca3 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -35,6 +35,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._time_total = 0 self._job_state = "" self._job_name = "" + self._error_text = "" def requestWrite(self, node, file_name = None, filter_by_machine = False): raise NotImplementedError("requestWrite needs to be implemented") @@ -77,6 +78,8 @@ class PrinterOutputDevice(QObject, OutputDevice): jobNameChanged = pyqtSignal() + errorTextChanged = pyqtSignal() + @pyqtProperty(str, notify = jobStateChanged) def jobState(self): return self._job_state @@ -102,6 +105,16 @@ class PrinterOutputDevice(QObject, OutputDevice): self._job_name = name self.jobNameChanged.emit() + @pyqtProperty(str, notify = errorTextChanged) + def errorText(self): + return self._error_text + + ## Set the error-text that is shown in the print monitor in case of an error + def setErrorText(self, error_text): + if self._error_text != error_text: + self._error_text = error_text + self.errorTextChanged.emit() + ## Get the bed temperature of the bed (if any) # This function is "final" (do not re-implement) # /sa _getBedTemperature implementation function diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 4a33b347d3..01365433a9 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -43,24 +43,30 @@ Rectangle { if(!printerConnected) { - return catalog.i18nc("@label:", "Not connected to a printer") - } else if(Cura.MachineManager.printerOutputDevices[0].jobState == "offline") - { - return catalog.i18nc("@label:", "Lost connection with the printer") - } else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing") - { - return catalog.i18nc("@label:", "Printing...") - } else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused") - { - return catalog.i18nc("@label:", "Paused") + return catalog.i18nc("@label:MonitorStatus", "Not connected to a printer") } - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "pre_print") + var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] + if(printerOutputDevice.jobState == "offline") { - return catalog.i18nc("@label:", "Preparing...") + return catalog.i18nc("@label:MonitorStatus", "Lost connection with the printer") + } else if(printerOutputDevice.jobState == "printing") + { + return catalog.i18nc("@label:MonitorStatus", "Printing...") + } else if(printerOutputDevice.jobState == "paused") + { + return catalog.i18nc("@label:MonitorStatus", "Paused") } - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "wait_cleanup") + else if(printerOutputDevice.jobState == "pre_print") { - return catalog.i18nc("@label:", "Waiting for cleanup...") + return catalog.i18nc("@label:MonitorStatus", "Preparing...") + } + else if(printerOutputDevice.jobState == "wait_cleanup") + { + return catalog.i18nc("@label:MonitorStatus", "Please remove the print") + } + else if(printerOutputDevice.jobState == "error") + { + return printerOutputDevice.errorText } else { From de7f32da195858805f399aeececa4c89c6959ee8 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Aug 2016 13:25:51 +0200 Subject: [PATCH 46/63] Convert global_inherits_stack to int before slicing Sometimes it was accidentally converted to a float when it passes through Javascript. Contributes to issue CURA-2055. --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- .../PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 5b948c90ab..fc9fd05b44 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -227,7 +227,7 @@ class StartSliceJob(Job): # global_inherits_stack property. def _buildGlobalInheritsStackMessage(self, stack): for key in stack.getAllKeys(): - extruder = int(stack.getProperty(key, "global_inherits_stack")) + extruder = int(round(float(stack.getProperty(key, "global_inherits_stack")))) if extruder >= 0: #Set to a specific extruder. setting_extruder = self._slice_message.addRepeatedMessage("global_inherits_stack") setting_extruder.name = key diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index a580382845..e487870d8a 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -62,7 +62,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand if definition.global_inherits_stack and self._stack.getProperty("machine_extruder_count", "value") > 1: #Obtain the value from the correct container stack. Only once, upon adding the setting. stack_nr = self._stack.getProperty(item, "global_inherits_stack") #Stack to get the setting from. - if int(stack_nr) >= 0: #Only if it defines an extruder stack. + if float(stack_nr) >= 0: #Only if it defines an extruder stack. extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] new_instance.setProperty("value", extruder_stack.getProperty(item, "value")) settings.addInstance(new_instance) From f3a119f9bbee912573631a83714ed06414c8a9ce Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Aug 2016 13:34:59 +0200 Subject: [PATCH 47/63] Use correct extruder's value when inheriting global_inheritance_stack settings This uses the new function extruderValue() which picks the value from a different extruder. Every setting that has the global_inheritance_stack property is now referenced via the extruderValue() setting in all functions. Contributes to issue CURA-2024. --- resources/definitions/fdmprinter.def.json | 44 +++++++++++------------ 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 5118966d5a..39eb066a9e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -644,7 +644,7 @@ "minimum_value": "0.0001", "maximum_value_warning": "machine_nozzle_size * 2", "type": "float", - "enabled": "support_interface_enable", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable')", "value": "line_width", "settable_per_mesh": false, "settable_per_extruder": true @@ -1473,7 +1473,7 @@ "minimum_value": "0.1", "maximum_value": "299792458000", "maximum_value_warning": "150", - "enabled": "support_interface_enable and support_enable", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "value": "speed_support / 1.5", "settable_per_mesh": false, "settable_per_extruder": true @@ -1704,7 +1704,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "acceleration_enabled and support_interface_enable and support_enable", + "enabled": "acceleration_enabled and extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -1923,7 +1923,7 @@ "minimum_value": "0.1", "minimum_value_warning": "5", "maximum_value_warning": "50", - "enabled": "jerk_enabled and support_interface_enable and support_enable", + "enabled": "jerk_enabled and extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -2270,7 +2270,7 @@ "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", "type": "bool", "default_value": true, - "enabled": "support_enable and (support_pattern == \"zigzag\")", + "enabled": "support_enable and (extruderValue(support_extruder_nr, 'support_pattern') == \"zigzag\")", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -2326,7 +2326,7 @@ "default_value": 0.15, "type": "float", "enabled": "support_enable", - "value": "support_z_distance", + "value": "extruderValue(support_extruder_nr, 'support_z_distance')", "global_inherits_stack": "support_extruder_nr", "settable_per_mesh": true }, @@ -2341,7 +2341,7 @@ "value": "0.1 if support_type == 'everywhere' else 0", "global_inherits_stack": "support_extruder_nr", "type": "float", - "enabled": "support_enable and support_type == 'everywhere'", + "enabled": "support_enable and extruderValue(support_extruder_nr, 'support_type') == 'everywhere'", "settable_per_mesh": true } } @@ -2382,7 +2382,7 @@ "default_value": 0.2, "value": "machine_nozzle_size / 2", "global_inherits_stack": "support_extruder_nr", - "enabled": "support_enable and support_xy_overrides_z=='z_overrides_xy'", + "enabled": "support_enable and extruderValue(support_extruder_nr, 'support_xy_overrides_z') == 'z_overrides_xy'", "settable_per_mesh": true }, "support_bottom_stair_step_height": @@ -2457,7 +2457,7 @@ "minimum_value": "0", "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", - "enabled": "support_interface_enable and support_enable", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": true, "children": { @@ -2468,11 +2468,11 @@ "unit": "mm", "type": "float", "default_value": 1, - "value": "support_interface_height", + "value": "extruderValue(support_extruder_nr, 'support_interface_height')", "minimum_value": "0", "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", - "enabled": "support_interface_enable and support_enable", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": true }, "support_bottom_height": @@ -2482,12 +2482,12 @@ "unit": "mm", "type": "float", "default_value": 1, - "value": "support_interface_height", + "value": "extruderValue(support_extruder_nr, 'support_interface_height')", "minimum_value": "0", - "minimum_value_warning": "support_bottom_stair_step_height", + "minimum_value_warning": "extruderValue(support_extruder_nr, 'support_bottom_stair_step_height')", "global_inherits_stack": "support_extruder_nr", "maximum_value_warning": "10", - "enabled": "support_interface_enable and support_enable", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": true } } @@ -2501,7 +2501,7 @@ "default_value": 100, "minimum_value": "0", "maximum_value_warning": "100", - "enabled":"support_interface_enable and support_enable", + "enabled":"extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -2515,7 +2515,7 @@ "default_value": 0.4, "minimum_value": "0", "value": "0 if support_interface_density == 0 else (support_interface_line_width * 100) / support_interface_density * (2 if support_interface_pattern == \"grid\" else (3 if support_interface_pattern == \"triangles\" else 1))", - "enabled": "support_interface_enable and support_enable", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -2535,7 +2535,7 @@ "zigzag": "Zig Zag" }, "default_value": "concentric", - "enabled": "support_interface_enable and support_enable", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -2559,7 +2559,7 @@ "global_inherits_stack": "support_extruder_nr", "minimum_value": "0", "maximum_value_warning": "10", - "enabled": "support_enable and support_use_towers", + "enabled": "support_enable and extruderValue(support_extruder_nr, 'support_use_towers')", "settable_per_mesh": true }, "support_minimal_diameter": @@ -2572,8 +2572,8 @@ "global_inherits_stack": "support_extruder_nr", "minimum_value": "0", "maximum_value_warning": "10", - "maximum_value": "support_tower_diameter", - "enabled": "support_enable and support_use_towers", + "maximum_value": "extruderValue(support_extruder_nr, 'support_tower_diameter')", + "enabled": "support_enable and extruderValue(support_extruder_nr, 'support_use_towers')", "settable_per_mesh": true }, "support_tower_roof_angle": @@ -2586,7 +2586,7 @@ "maximum_value": "90", "default_value": 65, "global_inherits_stack": "support_extruder_nr", - "enabled": "support_enable and support_use_towers", + "enabled": "support_enable and extruderValue(support_extruder_nr, 'support_use_towers')", "settable_per_mesh": true } } @@ -3177,7 +3177,7 @@ "type": "extruder", "default_value": "0", "value": "support_extruder_nr", - "enabled": "support_enable and support_interface_enable", + "enabled": "support_enable and extruderValue(support_extruder_nr, 'support_interface_enable')", "settable_per_mesh": false, "settable_per_extruder": false } From ed669925ad35a3647f2ae50983dd4617ce894757 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Aug 2016 15:06:22 +0200 Subject: [PATCH 48/63] Disable print monitor if the printer is not (yet) ready to receive commands CURA-1851 --- cura/PrinterOutputDevice.py | 13 +++++++++++++ resources/qml/MonitorButton.qml | 6 ++++-- resources/qml/PrintMonitor.qml | 4 ++-- resources/qml/Sidebar.qml | 1 + 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index f42c365ca3..0fac851aba 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -36,6 +36,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._job_state = "" self._job_name = "" self._error_text = "" + self._accepts_commands = True def requestWrite(self, node, file_name = None, filter_by_machine = False): raise NotImplementedError("requestWrite needs to be implemented") @@ -80,6 +81,8 @@ class PrinterOutputDevice(QObject, OutputDevice): errorTextChanged = pyqtSignal() + acceptsCommandsChanged = pyqtSignal() + @pyqtProperty(str, notify = jobStateChanged) def jobState(self): return self._job_state @@ -115,6 +118,16 @@ class PrinterOutputDevice(QObject, OutputDevice): self._error_text = error_text self.errorTextChanged.emit() + @pyqtProperty(str, notify = acceptsCommandsChanged) + def acceptsCommands(self): + return self._accepts_commands + + ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands + def setAcceptsCommands(self, accepts_commands): + if self._accepts_commands != accepts_commands: + self._accepts_commands = accepts_commands + self.acceptsCommandsChanged.emit() + ## Get the bed temperature of the bed (if any) # This function is "final" (do not re-implement) # /sa _getBedTemperature implementation function diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 01365433a9..982b3df967 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -126,7 +126,8 @@ Rectangle id: abortButton visible: printerConnected - enabled: printerConnected && (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing") + enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && + (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing") height: UM.Theme.getSize("save_button_save_to_button").height anchors.top: progressBar.bottom @@ -173,7 +174,8 @@ Rectangle id: pauseButton visible: printerConnected - enabled: printerConnected && (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing") + enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && + (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing") height: UM.Theme.getSize("save_button_save_to_button").height anchors.top: progressBar.bottom diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index ba2f3f822c..434cb50b3a 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -73,7 +73,7 @@ Column Label { text: label - color: printerConnected ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + color: printerConnected && printerAcceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") font: UM.Theme.getFont("default") width: base.width * 0.4 elide: Text.ElideRight @@ -82,7 +82,7 @@ Column Label { text: value - color: printerConnected ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + color: printerConnected && printerAcceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") font: UM.Theme.getFont("default") anchors.verticalCenter: parent.verticalCenter } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 8ab776af6a..8e2c571a3e 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -28,6 +28,7 @@ Rectangle // Is there an output device for this printer? property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands color: UM.Theme.getColor("sidebar"); UM.I18nCatalog { id: catalog; name:"cura"} From 0faa7f4abb56190466343821626fbf5603cbe061 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Aug 2016 15:49:07 +0200 Subject: [PATCH 49/63] Fix error in PrinterOutputDevice.acceptsCommands CURA-1851 --- cura/PrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 0fac851aba..153e5f7c42 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -118,7 +118,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._error_text = error_text self.errorTextChanged.emit() - @pyqtProperty(str, notify = acceptsCommandsChanged) + @pyqtProperty(bool, notify = acceptsCommandsChanged) def acceptsCommands(self): return self._accepts_commands From 5f3c051ec6fbafe96b14d66ebbb169fd05a94ca0 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Aug 2016 16:02:05 +0200 Subject: [PATCH 50/63] Code cleanup CURA-1990 --- resources/qml/MonitorButton.qml | 176 ++++++++++++++++++++------------ 1 file changed, 110 insertions(+), 66 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 982b3df967..6ea9ba482f 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -15,25 +15,32 @@ Rectangle UM.I18nCatalog { id: catalog; name:"cura"} property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 - property real progress: printerConnected ? Cura.MachineManager.printerOutputDevices[0].progress : 0; - property int backendState: UM.Backend.state; + property real progress: printerConnected ? Cura.MachineManager.printerOutputDevices[0].progress : 0 + property int backendState: UM.Backend.state property variant statusColor: { if(!printerConnected) - return UM.Theme.getColor("status_offline") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing" || Cura.MachineManager.printerOutputDevices[0].jobState == "pre_print" || Cura.MachineManager.printerOutputDevices[0].jobState == "wait_cleanup" ) - return UM.Theme.getColor("status_busy") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "ready" || Cura.MachineManager.printerOutputDevices[0].jobState == "") - return UM.Theme.getColor("status_ready") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused") - return UM.Theme.getColor("status_paused") - else if (Cura.MachineManager.printerOutputDevices[0].jobState == "error") - return UM.Theme.getColor("status_stopped") - else if (Cura.MachineManager.printerOutputDevices[0].jobState == "offline") - return UM.Theme.getColor("status_offline") - else - return UM.Theme.getColor("text") + return UM.Theme.getColor("status_offline"); + + switch(Cura.MachineManager.printerOutputDevices[0].jobState) + { + case "printing": + case "pre_print": + case "wait_cleanup": + return UM.Theme.getColor("status_busy"); + case "ready": + case "": + return UM.Theme.getColor("status_ready"); + case "paused": + return UM.Theme.getColor("status_paused"); + case "error": + return UM.Theme.getColor("status_stopped"); + case "offline": + return UM.Theme.getColor("status_offline"); + default: + return UM.Theme.getColor("text"); + } } property bool activity: Printer.getPlatformActivity; @@ -42,37 +49,26 @@ Rectangle property string statusText: { if(!printerConnected) - { return catalog.i18nc("@label:MonitorStatus", "Not connected to a printer") - } - var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] - if(printerOutputDevice.jobState == "offline") - { - return catalog.i18nc("@label:MonitorStatus", "Lost connection with the printer") - } else if(printerOutputDevice.jobState == "printing") - { - return catalog.i18nc("@label:MonitorStatus", "Printing...") - } else if(printerOutputDevice.jobState == "paused") - { - return catalog.i18nc("@label:MonitorStatus", "Paused") - } - else if(printerOutputDevice.jobState == "pre_print") - { - return catalog.i18nc("@label:MonitorStatus", "Preparing...") - } - else if(printerOutputDevice.jobState == "wait_cleanup") - { - return catalog.i18nc("@label:MonitorStatus", "Please remove the print") - } - else if(printerOutputDevice.jobState == "error") - { - return printerOutputDevice.errorText - } - else - { - return " " - } + var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] + switch(printerOutputDevice.jobState) + { + case "offline": + return catalog.i18nc("@label:MonitorStatus", "Lost connection with the printer"); + case "printing": + return catalog.i18nc("@label:MonitorStatus", "Printing..."); + case "paused": + return catalog.i18nc("@label:MonitorStatus", "Paused"); + case "pre_print": + return catalog.i18nc("@label:MonitorStatus", "Preparing..."); + case "wait_cleanup": + return catalog.i18nc("@label:MonitorStatus", "Please remove the print"); + case "error": + return printerOutputDevice.errorText; + default: + return " "; + } } Label @@ -85,7 +81,7 @@ Rectangle color: base.statusColor font: UM.Theme.getFont("large") - text: statusText; + text: statusText } Label @@ -96,7 +92,7 @@ Rectangle color: base.statusColor font: UM.Theme.getFont("large") - text: Math.round(progress) + "%"; + text: Math.round(progress) + "%" visible: printerConnected } @@ -136,7 +132,7 @@ Rectangle anchors.rightMargin: UM.Theme.getSize("default_margin").width text: catalog.i18nc("@label:", "Abort Print") - onClicked: { Cura.MachineManager.printerOutputDevices[0].setJobState("abort") } + onClicked: Cura.MachineManager.printerOutputDevices[0].setJobState("abort") style: ButtonStyle @@ -144,12 +140,28 @@ Rectangle background: Rectangle { border.width: UM.Theme.getSize("default_lining").width - border.color: !control.enabled ? UM.Theme.getColor("action_button_disabled_border") : - control.pressed ? UM.Theme.getColor("action_button_active_border") : - control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border") - color: !control.enabled ? UM.Theme.getColor("action_button_disabled") : - control.pressed ? UM.Theme.getColor("action_button_active") : - control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") + border.color: + { + if(!control.enabled) + return UM.Theme.getColor("action_button_disabled_border"); + else if(control.pressed) + return UM.Theme.getColor("action_button_active_border"); + else if(control.hovered) + return UM.Theme.getColor("action_button_hovered_border"); + else + return UM.Theme.getColor("action_button_border"); + } + color: + { + if(!control.enabled) + return UM.Theme.getColor("action_button_disabled"); + else if(control.pressed) + return UM.Theme.getColor("action_button_active"); + else if(control.hovered) + return UM.Theme.getColor("action_button_hovered"); + else + return UM.Theme.getColor("action_button"); + } Behavior on color { ColorAnimation { duration: 50; } } implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2) @@ -158,9 +170,17 @@ Rectangle { id: actualLabel anchors.centerIn: parent - color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") : - control.pressed ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : UM.Theme.getColor("action_button_text") + color: + { + if(!control.enabled) + return UM.Theme.getColor("action_button_disabled_text"); + else if(control.pressed) + return UM.Theme.getColor("action_button_active_text"); + else if(control.hovered) + return UM.Theme.getColor("action_button_hovered_text"); + else + return UM.Theme.getColor("action_button_text"); + } font: UM.Theme.getFont("action_button") text: control.text; } @@ -184,19 +204,35 @@ Rectangle anchors.rightMargin: UM.Theme.getSize("default_margin").width text: printerConnected ? Cura.MachineManager.printerOutputDevices[0].jobState == "paused" ? catalog.i18nc("@label:", "Resume") : catalog.i18nc("@label:", "Pause") : "" - onClicked: { Cura.MachineManager.printerOutputDevices[0].jobState == "paused" ? Cura.MachineManager.printerOutputDevices[0].setJobState("print") : Cura.MachineManager.printerOutputDevices[0].setJobState("pause") } + onClicked: Cura.MachineManager.printerOutputDevices[0].setJobState(Cura.MachineManager.printerOutputDevices[0].jobState == "paused" ? "print" : "pause") style: ButtonStyle { background: Rectangle { border.width: UM.Theme.getSize("default_lining").width - border.color: !control.enabled ? UM.Theme.getColor("action_button_disabled_border") : - control.pressed ? UM.Theme.getColor("action_button_active_border") : - control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border") - color: !control.enabled ? UM.Theme.getColor("action_button_disabled") : - control.pressed ? UM.Theme.getColor("action_button_active") : - control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button") + border.color: + { + if(!control.enabled) + return UM.Theme.getColor("action_button_disabled_border"); + else if(control.pressed) + return UM.Theme.getColor("action_button_active_border"); + else if(control.hovered) + return UM.Theme.getColor("action_button_hovered_border"); + else + return UM.Theme.getColor("action_button_border"); + } + color: + { + if(!control.enabled) + return UM.Theme.getColor("action_button_disabled"); + else if(control.pressed) + return UM.Theme.getColor("action_button_active"); + else if(control.hovered) + return UM.Theme.getColor("action_button_hovered"); + else + return UM.Theme.getColor("action_button"); + } Behavior on color { ColorAnimation { duration: 50; } } implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2) @@ -205,9 +241,17 @@ Rectangle { id: actualLabel anchors.centerIn: parent - color: !control.enabled ? UM.Theme.getColor("action_button_disabled_text") : - control.pressed ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : UM.Theme.getColor("action_button_text") + color: + { + if(!control.enabled) + return UM.Theme.getColor("action_button_disabled_text"); + else if(control.pressed) + return UM.Theme.getColor("action_button_active_text"); + else if(control.hovered) + return UM.Theme.getColor("action_button_hovered_text"); + else + return UM.Theme.getColor("action_button_text"); + } font: UM.Theme.getFont("action_button") text: control.text; } From cf06df8b07e72807e0ef8d499472721309e557df Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Aug 2016 16:39:46 +0200 Subject: [PATCH 51/63] Add a sidebar state for when a printer is not accepting commands CURA-1851 --- resources/qml/MonitorButton.qml | 11 ++- resources/qml/Sidebar.qml | 35 ++++--- .../themes/cura/icons/tab_monitor_unknown.svg | 97 +++++++++++++++++++ 3 files changed, 126 insertions(+), 17 deletions(-) create mode 100644 resources/themes/cura/icons/tab_monitor_unknown.svg diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 6ea9ba482f..4be04b1eab 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -15,13 +15,14 @@ Rectangle UM.I18nCatalog { id: catalog; name:"cura"} property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands property real progress: printerConnected ? Cura.MachineManager.printerOutputDevices[0].progress : 0 property int backendState: UM.Backend.state property variant statusColor: { - if(!printerConnected) - return UM.Theme.getColor("status_offline"); + if(!printerConnected || !printerAcceptsCommands) + return UM.Theme.getColor("text"); switch(Cura.MachineManager.printerOutputDevices[0].jobState) { @@ -49,7 +50,9 @@ Rectangle property string statusText: { if(!printerConnected) - return catalog.i18nc("@label:MonitorStatus", "Not connected to a printer") + return catalog.i18nc("@label:MonitorStatus", "Not connected to a printer"); + if(!printerAcceptsCommands) + return catalog.i18nc("@label:MonitorStatus", "Printer does not accept commands"); var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] switch(printerOutputDevice.jobState) @@ -253,7 +256,7 @@ Rectangle return UM.Theme.getColor("action_button_text"); } font: UM.Theme.getFont("action_button") - text: control.text; + text: control.text } } label: Item { } diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 8e2c571a3e..aa51fcfefe 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -108,19 +108,28 @@ Rectangle onClicked: monitoringPrint = true iconSource: { if(!printerConnected) - return UM.Theme.getIcon("tab_monitor") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing" || Cura.MachineManager.printerOutputDevices[0].jobState == "pre_print" || Cura.MachineManager.printerOutputDevices[0].jobState == "wait_cleanup" ) - return UM.Theme.getIcon("tab_monitor_busy") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "ready" || Cura.MachineManager.printerOutputDevices[0].jobState == "") - return UM.Theme.getIcon("tab_monitor_connected") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused") - return UM.Theme.getIcon("tab_monitor_paused") - else if (Cura.MachineManager.printerOutputDevices[0].jobState == "error") - return UM.Theme.getIcon("tab_monitor_stopped") - else if (Cura.MachineManager.printerOutputDevices[0].jobState == "offline") - return UM.Theme.getIcon("tab_monitor_offline") - else - return UM.Theme.getIcon("tab_monitor") + return UM.Theme.getIcon("tab_monitor"); + else if(!printerAcceptsCommands) + return UM.Theme.getIcon("tab_monitor_unknown"); + + switch(Cura.MachineManager.printerOutputDevices[0].jobState) + { + case "printing": + case "pre_print": + case "wait_cleanup": + return UM.Theme.getIcon("tab_monitor_busy"); + case "ready": + case "": + return UM.Theme.getIcon("tab_monitor_connected") + case "paused": + return UM.Theme.getIcon("tab_monitor_paused") + case "error": + return UM.Theme.getIcon("tab_monitor_stopped") + case "offline": + return UM.Theme.getIcon("tab_monitor_offline") + default: + return UM.Theme.getIcon("tab_monitor") + } } checkable: true checked: monitoringPrint diff --git a/resources/themes/cura/icons/tab_monitor_unknown.svg b/resources/themes/cura/icons/tab_monitor_unknown.svg new file mode 100644 index 0000000000..cf95b28ab3 --- /dev/null +++ b/resources/themes/cura/icons/tab_monitor_unknown.svg @@ -0,0 +1,97 @@ + + + + + + image/svg+xml + + Fill 1 Copy 3 + + + + + + Fill 1 Copy 3 + Created with Sketch. + + + + + + + + + + + From 93f6f5d8d3e96f9a0c04ca07a05177487fc8d4f3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Aug 2016 16:20:06 +0200 Subject: [PATCH 52/63] Don't use extruderValue on settings that have no global_inherits_stack It's unnecessary and seems to break things. Contributes to issue CURA-2024. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 39eb066a9e..814417f2b8 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2270,7 +2270,7 @@ "description": "Connect the ZigZags. This will increase the strength of the zig zag support structure.", "type": "bool", "default_value": true, - "enabled": "support_enable and (extruderValue(support_extruder_nr, 'support_pattern') == \"zigzag\")", + "enabled": "support_enable and (support_pattern == 'zigzag')", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -2341,7 +2341,7 @@ "value": "0.1 if support_type == 'everywhere' else 0", "global_inherits_stack": "support_extruder_nr", "type": "float", - "enabled": "support_enable and extruderValue(support_extruder_nr, 'support_type') == 'everywhere'", + "enabled": "support_enable and support_type == 'everywhere'", "settable_per_mesh": true } } From 50cd98f2bba8c90586a55967f117e27be92412f7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 4 Aug 2016 16:54:29 +0200 Subject: [PATCH 53/63] Allow extruderValue(s) to fallback to global If a setting is not defined in the extruder stack, fall back to global. At least it still tries to get the extruder value from the correct stack first. If that stack has no value, then so be it, use global anyway. Contributes to issue CURA-2024. Also could affect issue CURA-2006. --- cura/Settings/ExtruderManager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 71bd58ded5..05a6f859af 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -298,7 +298,7 @@ class ExtruderManager(QObject): result = [] for extruder in ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): - value = extruder.getRawProperty(key, "value", use_next = False) + value = extruder.getRawProperty(key, "value") if not value: continue @@ -327,7 +327,7 @@ class ExtruderManager(QObject): value = None if extruder: - value = extruder.getRawProperty(key, "value", use_next = False) + value = extruder.getRawProperty(key, "value") if isinstance(value, UM.Settings.SettingFunction): value = value(extruder) From 6cf8536404356696bf84e90fa3ddfc6e6a3cc69c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Aug 2016 18:22:35 +0200 Subject: [PATCH 54/63] Rename pause button to pause/resume button for clarity CURA-1851 --- resources/qml/MonitorButton.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 4be04b1eab..8aefe52f9f 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -194,11 +194,7 @@ Rectangle Button { - id: pauseButton - - visible: printerConnected - enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && - (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing") + id: pauseResumeButton height: UM.Theme.getSize("save_button_save_to_button").height anchors.top: progressBar.bottom @@ -206,6 +202,10 @@ Rectangle anchors.right: abortButton.left anchors.rightMargin: UM.Theme.getSize("default_margin").width + visible: printerConnected + enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && + (Cura.MachineManager.printerOutputDevices[0].jobState == "paused" || Cura.MachineManager.printerOutputDevices[0].jobState == "printing") + text: printerConnected ? Cura.MachineManager.printerOutputDevices[0].jobState == "paused" ? catalog.i18nc("@label:", "Resume") : catalog.i18nc("@label:", "Pause") : "" onClicked: Cura.MachineManager.printerOutputDevices[0].setJobState(Cura.MachineManager.printerOutputDevices[0].jobState == "paused" ? "print" : "pause") From a46f6cc14d17e57d48dd88bf0689aab13b09587b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Aug 2016 11:36:16 +0200 Subject: [PATCH 55/63] Properly fallback to global if no extruders This fixes the extruderValue function for printers such as the Ultimaker 2+. --- cura/Settings/ExtruderManager.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 05a6f859af..0cb9322fd9 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -328,8 +328,9 @@ class ExtruderManager(QObject): if extruder: value = extruder.getRawProperty(key, "value") - - if isinstance(value, UM.Settings.SettingFunction): - value = value(extruder) + if isinstance(value, UM.Settings.SettingFunction): + value = value(extruder) + else: #Just a value from global. + value = UM.Application.getInstance().getGlobalContainerStack().getProperty(key, "value") return value From 92b154f5fe6a5185718f44daa4543a0493d64861 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Aug 2016 11:59:32 +0200 Subject: [PATCH 56/63] More defensive check for global_inherits_stack extruder This should never give the keyerror any more and always default back to non-global_inherits_stack mode. Contributes to issue CURA-2067. --- .../PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index e487870d8a..8eab144158 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -62,7 +62,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand if definition.global_inherits_stack and self._stack.getProperty("machine_extruder_count", "value") > 1: #Obtain the value from the correct container stack. Only once, upon adding the setting. stack_nr = self._stack.getProperty(item, "global_inherits_stack") #Stack to get the setting from. - if float(stack_nr) >= 0: #Only if it defines an extruder stack. + if stack_nr in ExtruderManager.getInstance().extruderIds: #Only if it defines an extruder stack. extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] new_instance.setProperty("value", extruder_stack.getProperty(item, "value")) settings.addInstance(new_instance) From 51d972941ec8b91d092726b7fed2ba8407ed9d44 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Aug 2016 12:05:01 +0200 Subject: [PATCH 57/63] Handle rounding errors in stack_nr Wouldn't want it to index extruder '1.0'. Contributes to issue CURA-2067. --- .../PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 8eab144158..cf86a9b48e 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -61,7 +61,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand new_instance = SettingInstance(definition, settings) if definition.global_inherits_stack and self._stack.getProperty("machine_extruder_count", "value") > 1: #Obtain the value from the correct container stack. Only once, upon adding the setting. - stack_nr = self._stack.getProperty(item, "global_inherits_stack") #Stack to get the setting from. + stack_nr = str(int(round(float(self._stack.getProperty(item, "global_inherits_stack"))))) #Stack to get the setting from. Round it and remove the fractional part. if stack_nr in ExtruderManager.getInstance().extruderIds: #Only if it defines an extruder stack. extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] new_instance.setProperty("value", extruder_stack.getProperty(item, "value")) From 09801db5f8cc2d83f04686bfef8e8f5b852cce88 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Aug 2016 13:48:04 +0200 Subject: [PATCH 58/63] Fix support interface density and pattern global inherits stack These depend on values that are obtained through global_inherits_stack, so they must also have global_inherits_stack. Contributes to issue CURA-2024. --- resources/definitions/fdmprinter.def.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 814417f2b8..7662ed4a6d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2501,7 +2501,8 @@ "default_value": 100, "minimum_value": "0", "maximum_value_warning": "100", - "enabled":"extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", + "global_inherits_stack": "support_extruder_nr", + "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -2515,6 +2516,7 @@ "default_value": 0.4, "minimum_value": "0", "value": "0 if support_interface_density == 0 else (support_interface_line_width * 100) / support_interface_density * (2 if support_interface_pattern == \"grid\" else (3 if support_interface_pattern == \"triangles\" else 1))", + "global_inherits_stack": "support_extruder_nr", "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true @@ -2535,6 +2537,7 @@ "zigzag": "Zig Zag" }, "default_value": "concentric", + "global_inherits_stack": "support_extruder_nr", "enabled": "extruderValue(support_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true From 2edda6802188723a93292ce0f5462fc91ba58925 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Aug 2016 15:12:13 +0200 Subject: [PATCH 59/63] Improve validator for numeric fields Do not accept fractional input for "int" settings Also only accept a "-" as the first character --- resources/qml/Settings/SettingTextField.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 18a55c7a50..4d05bef2b9 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -100,7 +100,7 @@ SettingItem maximumLength: 10; - validator: RegExpValidator { regExp: /[0-9.,-]{0,10}/ } + validator: RegExpValidator { regExp: (type == "int") ? /^-?[0-9]{0,10}/ : /^-?[0-9.,]{0,10}/ } //"type" property from parent loader used to disallow fractional number entry Binding { From ea3e2225ed02866ffdba4f82a0d114659e1c4a8c Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Aug 2016 15:23:47 +0200 Subject: [PATCH 60/63] Don't pass support_angle to shader unless it is valid CURA-2058 --- plugins/SolidView/SolidView.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index 0329fb53e2..d80f077416 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -8,6 +8,7 @@ from UM.Resources import Resources from UM.Application import Application from UM.Preferences import Preferences from UM.View.Renderer import Renderer +from UM.Settings.Validator import ValidatorState from UM.View.GL.OpenGL import OpenGL @@ -43,7 +44,7 @@ class SolidView(View): if Application.getInstance().getGlobalContainerStack(): if Preferences.getInstance().getValue("view/show_overhang"): angle = Application.getInstance().getGlobalContainerStack().getProperty("support_angle", "value") - if angle is not None: + if angle is not None and Application.getInstance().getGlobalContainerStack().getProperty("support_angle", "validationState") == ValidatorState.Valid: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(90 - angle))) else: self._enabled_shader.setUniformValue("u_overhangAngle", math.cos(math.radians(0))) #Overhang angle of 0 causes no area at all to be marked as overhang. From fa0d8f912f62eb1c5d1b98d7de47a308556bb86b Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Aug 2016 16:02:10 +0200 Subject: [PATCH 61/63] Don't show UMO upgrades page for UMO+ --- resources/definitions/ultimaker_original_plus.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker_original_plus.def.json b/resources/definitions/ultimaker_original_plus.def.json index 4f787896d0..2c83070add 100644 --- a/resources/definitions/ultimaker_original_plus.def.json +++ b/resources/definitions/ultimaker_original_plus.def.json @@ -12,7 +12,8 @@ "icon": "icon_ultimaker.png", "platform": "ultimaker2_platform.obj", "platform_texture": "UltimakerPlusbackplate.png", - "supported_actions":["UMOCheckup", "UpgradeFirmware", "BedLevel"] + "first_start_actions": ["UMOCheckup", "BedLevel"], + "supported_actions": ["UMOCheckup", "BedLevel", "UpgradeFirmware"] }, "overrides": { From 78848567e0be0e8e503fadab4b0f3af2781aadc8 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Aug 2016 16:04:51 +0200 Subject: [PATCH 62/63] Add printer when pressing enter in Add Printer page instead of closing page CURA-1354 --- resources/qml/AddMachineDialog.qml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index a2b7c1586f..e37629306b 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -183,13 +183,17 @@ UM.Dialog text: catalog.i18nc("@action:button", "Add Printer") anchors.bottom: parent.bottom anchors.right: parent.right - onClicked: - { - base.visible = false - var item = machineList.model.getItem(machineList.currentIndex); - Cura.MachineManager.addMachine(machineName.text, item.id) - base.machineAdded(item.id) // Emit signal that the user added a machine. - } + onClicked: addMachine() + } + + onAccepted: addMachine() + + function addMachine() + { + base.visible = false + var item = machineList.model.getItem(machineList.currentIndex); + Cura.MachineManager.addMachine(machineName.text, item.id) + base.machineAdded(item.id) // Emit signal that the user added a machine. } Item From 021a33d6bd5114d3ff7edb8fa0a85c91ba55d08d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 5 Aug 2016 17:30:11 +0200 Subject: [PATCH 63/63] Always set value of added setting instance The value property was sometimes not set. In the default case, this just added an empty setting instance (for a particular key), which appeared to do nothing until you've changed it. This appears correct because if it's not changed then it should be the same as the extruder's value, but if you then change the extruder's value it doesn't update its visible value but still has no value in the setting instance, so the value still falls back to the extruder and the setting ends up different from what is being displayed. Contributes to issue CURA-1988. --- .../PerObjectSettingVisibilityHandler.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index cf86a9b48e..e7295c3f97 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -59,12 +59,17 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand definition = self._stack.getSettingDefinition(item) if definition: new_instance = SettingInstance(definition, settings) + stack_nr = -1 if definition.global_inherits_stack and self._stack.getProperty("machine_extruder_count", "value") > 1: #Obtain the value from the correct container stack. Only once, upon adding the setting. stack_nr = str(int(round(float(self._stack.getProperty(item, "global_inherits_stack"))))) #Stack to get the setting from. Round it and remove the fractional part. - if stack_nr in ExtruderManager.getInstance().extruderIds: #Only if it defines an extruder stack. - extruder_stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] - new_instance.setProperty("value", extruder_stack.getProperty(item, "value")) + if stack_nr not in ExtruderManager.getInstance().extruderIds and self._stack.getProperty("extruder_nr", "value"): #Property not defined, but we have an extruder number. + stack_nr = str(int(round(float(self._stack.getProperty("extruder_nr", "value"))))) + if stack_nr in ExtruderManager.getInstance().extruderIds: #We have either a global_inherits_stack or an extruder_nr. + stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] + else: + stack = UM.Application.getInstance().getGlobalContainerStack() + new_instance.setProperty("value", stack.getProperty(item, "value")) settings.addInstance(new_instance) visibility_changed = True else: