From bc300d111653a39688525460c01e44b1a423506e Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Tue, 20 Sep 2016 15:06:28 +0600 Subject: [PATCH 01/90] T524: Added theme picker --- resources/qml/Preferences/GeneralPage.qml | 68 +++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 6d3cc9c1e7..1d3d149324 100644 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -162,6 +162,74 @@ UM.PreferencesPage width: UM.Theme.getSize("default_margin").width } + Row + { + spacing: UM.Theme.getSize("default_margin").width + Label + { + id: themeLabel + text: catalog.i18nc("@label","Theme:") + anchors.verticalCenter: themeComboBox.verticalCenter + } + + ComboBox + { + id: themeComboBox + model: ListModel + { + id: themeList + + Component.onCompleted: { + append({ text: catalog.i18nc("@item:inlistbox", "Ultimaker"), code: "cura" }) + } + } + + currentIndex: + { + var code = UM.Preferences.getValue("general/theme"); + for(var i = 0; i < themeList.count; ++i) + { + if(model.get(i).code == code) + { + return i + } + } + } + onActivated: UM.Preferences.setValue("general/theme", model.get(index).code) + + Component.onCompleted: + { + // Because ListModel is stupid and does not allow using qsTr() for values. + for(var i = 0; i < themeList.count; ++i) + { + themeList.setProperty(i, "text", catalog.i18n(themeList.get(i).text)); + } + + // Glorious hack time. ComboBox does not update the text properly after changing the + // model. So change the indices around to force it to update. + currentIndex += 1; + currentIndex -= 1; + } + } + } + + Label + { + id: themeCaption + + //: Theme change warning + text: catalog.i18nc("@label", "You will need to restart the application for theme changes to have effect.") + wrapMode: Text.WordWrap + font.italic: true + } + + Item + { + //: Spacer + height: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("default_margin").width + } + Label { font.bold: true From 7adc1f4870fe65bc156b453ed64a1a23d09d2b0b Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Mon, 14 Nov 2016 14:20:39 +0600 Subject: [PATCH 02/90] T576: Added aliases --- plugins/CuraEngineBackend/StartSliceJob.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index ade86e231d..bbf55a4803 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -251,6 +251,9 @@ class StartSliceJob(Job): settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode + settings["print_bed_temperature"] = settings["material_bed_temperature"] + settings["print_temperature"] = settings["material_print_temperature"] + for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key @@ -260,6 +263,8 @@ class StartSliceJob(Job): setting_message.value = str(value).encode("utf-8") Job.yieldThread() + + ## Sends for some settings which extruder they should fallback to if not # set. # From dbb971fef5f1169e8fbfe060602b70c871d982ca Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Mon, 14 Nov 2016 14:51:25 +0600 Subject: [PATCH 03/90] T576: Added date and time keywords --- plugins/CuraEngineBackend/StartSliceJob.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index bbf55a4803..4b0ec77ca0 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -4,6 +4,7 @@ import numpy from string import Formatter from enum import IntEnum +import time from UM.Job import Job from UM.Application import Application @@ -254,6 +255,16 @@ class StartSliceJob(Job): settings["print_bed_temperature"] = settings["material_bed_temperature"] settings["print_temperature"] = settings["material_print_temperature"] + settings["time"] = time.strftime('%H:%M:%S') + settings["date"] = time.strftime('%d-%m-%Y') + settings["day"] = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][int(time.strftime('%w'))] + + settings["print_time"] = Application.getInstance().getPrintInformation().currentPrintTime + settings["filament_amount"] = Application.getInstance().getPrintInformation().materialLengths + settings["filament_weight"] = Application.getInstance().getPrintInformation().materialWeights + settings["filament_cost"] = None + settings["profile_string"] = None + for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key @@ -263,8 +274,6 @@ class StartSliceJob(Job): setting_message.value = str(value).encode("utf-8") Job.yieldThread() - - ## Sends for some settings which extruder they should fallback to if not # set. # From 67aae55640052e669cd3288915ad58d64bbc759e Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Wed, 23 Nov 2016 12:38:02 +0600 Subject: [PATCH 04/90] T576: Added print statistics --- plugins/CuraEngineBackend/CuraEngineBackend.py | 10 +++++++++- plugins/CuraEngineBackend/StartSliceJob.py | 6 ------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index cf53475fb4..0e7f938804 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -13,7 +13,7 @@ from UM.Resources import Resources from UM.Settings.Validator import ValidatorState #To find if a setting is in an error state. We can't slice then. from UM.Platform import Platform from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator - +from UM.Qt.Duration import DurationFormat import cura.Settings @@ -386,6 +386,14 @@ class CuraEngineBackend(Backend): self.backendStateChange.emit(BackendState.Done) self.processingProgress.emit(1.0) + for line in self._scene.gcode_list: + replaced = line.replace("{print_time}", str(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601))) + replaced = replaced.replace("{filament_amount}", str(Application.getInstance().getPrintInformation().materialLengths)) + replaced = replaced.replace("{filament_weight}", str(Application.getInstance().getPrintInformation().materialWeights)) + replaced = replaced.replace("{filament_cost}", "Not yet implemented") + + self._scene.gcode_list[self._scene.gcode_list.index(line)] = replaced + self._slicing = False Logger.log("d", "Slicing took %s seconds", time() - self._slice_start_time ) if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()): diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 4b0ec77ca0..ea5bb1f57c 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -259,12 +259,6 @@ class StartSliceJob(Job): settings["date"] = time.strftime('%d-%m-%Y') settings["day"] = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][int(time.strftime('%w'))] - settings["print_time"] = Application.getInstance().getPrintInformation().currentPrintTime - settings["filament_amount"] = Application.getInstance().getPrintInformation().materialLengths - settings["filament_weight"] = Application.getInstance().getPrintInformation().materialWeights - settings["filament_cost"] = None - settings["profile_string"] = None - for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") setting_message.name = key From 7c3728632ff4d237af32ba3d945e06d437954a97 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 24 Nov 2016 14:03:53 +0600 Subject: [PATCH 05/90] T576: Added {jobname} keyword --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 0e7f938804..91bd13c9b6 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -390,7 +390,9 @@ class CuraEngineBackend(Backend): replaced = line.replace("{print_time}", str(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601))) replaced = replaced.replace("{filament_amount}", str(Application.getInstance().getPrintInformation().materialLengths)) replaced = replaced.replace("{filament_weight}", str(Application.getInstance().getPrintInformation().materialWeights)) + # TODO: calculate filament cost replaced = replaced.replace("{filament_cost}", "Not yet implemented") + replaced = replaced.replace("{jobname}", str(Application.getInstance().getPrintInformation().jobName)) self._scene.gcode_list[self._scene.gcode_list.index(line)] = replaced From 9302f4e9c60d2c3028076cf87e7e98cfe5c77cfe Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 16 Mar 2017 11:14:53 +0100 Subject: [PATCH 06/90] JSON feat: support_bottom_stair_step_width (CURA-3380) --- resources/definitions/fdmprinter.def.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index a951d6aca6..46055ba0c2 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3025,6 +3025,19 @@ "enabled": "support_enable", "settable_per_mesh": true }, + "support_bottom_stair_step_width": + { + "label": "Support Stair Step Maximum Width", + "description": "The maximum width of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures.", + "unit": "mm", + "type": "float", + "default_value": 5.0, + "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "minimum_value": "0", + "maximum_value_warning": "10.0", + "enabled": "support_enable", + "settable_per_mesh": true + }, "support_join_distance": { "label": "Support Join Distance", From 36420070fa5f25f30ec05045983da4f11044f826 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Thu, 16 Mar 2017 13:02:50 +0100 Subject: [PATCH 07/90] JSOn fix: more description on support_bottom_stair_step_height (CURA-3380) --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 46055ba0c2..971ee91372 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3015,7 +3015,7 @@ "support_bottom_stair_step_height": { "label": "Support Stair Step Height", - "description": "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures.", + "description": "The height of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures. Set to zero to turn off the stair-like behaviour.", "unit": "mm", "type": "float", "default_value": 0.3, From ab3d2e35700e3f64422c8f27494ae132d16383a5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 10:41:27 +0100 Subject: [PATCH 08/90] Fix typo in support interface description Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 273f3ad265..eb62c40d17 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1864,7 +1864,7 @@ "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.", + "description": "The speed at which the roofs and bottoms of support are printed. Printing them at lower speeds can improve overhang quality.", "unit": "mm/s", "type": "float", "default_value": 40, From 03ae29838955b87d68d93aa9c5fd609aa47147bc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 10:43:01 +0100 Subject: [PATCH 09/90] Add support roof and bottom speeds They can now be separately adjusted instead of just support interface. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 37 ++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index eb62c40d17..10de93e514 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1875,7 +1875,42 @@ "limit_to_extruder": "support_interface_extruder_nr", "value": "speed_support / 1.5", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": + { + "speed_support_bottom": + { + "label": "Support Bottom Speed", + "description": "The speed at which the bottoms of support are printed. Printing them at lower speeds can improve overhang quality.", + "unit": "mm/s", + "type": "float", + "default_value": 40, + "minimum_value": "0.1", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "150", + "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "value": "speed_support_interface", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "speed_support_roof": + { + "label": "Support Roof Speed", + "description": "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality.", + "unit": "mm/s", + "type": "float", + "default_value": 40, + "minimum_value": "0.1", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "150", + "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "value": "speed_support_interface", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } } } }, From c15e70a6a6d43a55822031a9e8f3a11bce75e9fa Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 11:13:30 +0100 Subject: [PATCH 10/90] Make support bottom speed description more accurate It doesn't affect overhang really. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 10de93e514..30dc8b58f3 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1897,7 +1897,7 @@ "speed_support_roof": { "label": "Support Roof Speed", - "description": "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality.", + "description": "The speed at which the roofs of support are printed. Printing them at lower speeds can improve adhesion of support on top of your model.", "unit": "mm/s", "type": "float", "default_value": 40, From 250995611aff6b66b3a9a6bc467308ca44128b10 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 11:14:02 +0100 Subject: [PATCH 11/90] Fix typo in Support Interface Acceleration Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 30dc8b58f3..79c5143ea2 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2185,7 +2185,7 @@ "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.", + "description": "The acceleration with which the roofs and bottoms of support are printed. Printing them at lower acceleration can improve overhang quality.", "unit": "mm/s²", "type": "float", "default_value": 3000, From 65daa86fb0002e3bed6062b0ac18f04a05f4a9ca Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 11:14:48 +0100 Subject: [PATCH 12/90] Add separate settings for support roof and bottom acceleration You can now tune them separately. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 37 ++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 79c5143ea2..a3731edff7 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2196,7 +2196,42 @@ "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", "limit_to_extruder": "support_interface_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": + { + "acceleration_support_bottom": + { + "label": "Support Bottom Acceleration", + "description": "The accelerations with which the bottoms of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "acceleration_support_interface", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "acceleration_support_roof": + { + "label": "Support Roof Acceleration", + "description": "The accelerations with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "acceleration_support_interface", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } } } }, From d33c8e843611a66fbc0e3eb88d80c6f1bd8f0d90 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 11:24:10 +0100 Subject: [PATCH 13/90] Fix spelling of support interface acceleration descriptions My own copy-paste mistake here. Contributes to issue CURA-3491. --- 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 a3731edff7..f5402dd294 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2202,7 +2202,7 @@ "acceleration_support_bottom": { "label": "Support Bottom Acceleration", - "description": "The accelerations with which the bottoms of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model.", + "description": "The acceleration with which the bottoms of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model.", "unit": "mm/s²", "type": "float", "default_value": 3000, @@ -2218,7 +2218,7 @@ "acceleration_support_roof": { "label": "Support Roof Acceleration", - "description": "The accelerations with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality.", + "description": "The acceleration with which the roofs of support are printed. Printing them at lower acceleration can improve overhang quality.", "unit": "mm/s²", "type": "float", "default_value": 3000, From 933ca7089006f78021c9757c479757c8daec22b9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 11:29:33 +0100 Subject: [PATCH 14/90] Add separate settings for support roof/bottom jerk You can now tune them separately. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 37 ++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index f5402dd294..cebac1e0c7 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -2470,7 +2470,42 @@ "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", "limit_to_extruder": "support_interface_extruder_nr", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": + { + "jerk_support_bottom": + { + "label": "Support Bottom Jerk", + "description": "The maximum instantaneous velocity change with which the bottoms of support are printed.", + "unit": "mm/s", + "type": "float", + "default_value": 20, + "value": "jerk_support_interface", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "jerk_support_roof": + { + "label": "Support Roof Jerk", + "description": "The maximum instantaneous velocity change with which the roofs of support are printed.", + "unit": "mm/s", + "type": "float", + "default_value": 20, + "value": "jerk_support_interface", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } } } }, From cdaeb13c3abf57d3ec7a9117462b790b31967f93 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 13:29:15 +0100 Subject: [PATCH 15/90] Use support infill density instead of line distance Making these profiles use line distance prevents the user from setting their own density. This density is exactly equivalent. Contributes to issue CURA-3491. --- resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg | 2 +- resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg | 2 +- .../quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg index e9370877e7..0f61ccb0cd 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Draft_Print.inst.cfg @@ -28,7 +28,7 @@ raft_margin = 15 retraction_count_max = 80 skin_overlap = 30 speed_layer_0 = 25 -support_interface_line_distance = 0.4 +support_interface_density = 87.5 support_interface_pattern = lines support_pattern = zigzag wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg index cdb37b8f12..103198fc59 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Fast_Print.inst.cfg @@ -29,7 +29,7 @@ raft_margin = 15 retraction_count_max = 80 skin_overlap = 30 speed_layer_0 = 25 -support_interface_line_distance = 0.4 +support_interface_density = 87.5 support_interface_pattern = lines support_pattern = zigzag wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg index f5e91fa71b..eb76d8c42a 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_High_Quality.inst.cfg @@ -27,7 +27,7 @@ raft_margin = 15 retraction_count_max = 80 skin_overlap = 30 speed_layer_0 = 25 -support_interface_line_distance = 0.4 +support_interface_density = 87.5 support_interface_pattern = lines support_pattern = zigzag wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) diff --git a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg index d391e9df4f..364ff16bf6 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PC_Normal_Quality.inst.cfg @@ -26,7 +26,7 @@ raft_margin = 15 retraction_count_max = 80 skin_overlap = 30 speed_layer_0 = 25 -support_interface_line_distance = 0.4 +support_interface_density = 87.5 support_interface_pattern = lines support_pattern = zigzag wall_line_width_x = =round(line_width * 0.4 / 0.35, 2) From 3e464964db445dbfaa534d767257d493041e66cc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 14:47:17 +0100 Subject: [PATCH 16/90] Split support interface density into roof/bottom Each has its own line distance setting. The original support interface line distance is no longer used then. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 65 ++++++++++++++++++++--- 1 file changed, 57 insertions(+), 8 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cebac1e0c7..b282ac8fd2 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3252,20 +3252,69 @@ "settable_per_extruder": true, "children": { - "support_interface_line_distance": + "support_bottom_density": { - "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", + "label": "Support Bottom Density", + "description": "Adjusts the density of the bottoms of the support structure. A higher value results in better adhesion of the support on top of the model.", + "unit": "%", "type": "float", - "default_value": 0.4, + "default_value": 100, "minimum_value": "0", - "minimum_value_warning": "support_interface_line_width - 0.0001", - "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))", + "maximum_value": "100", "limit_to_extruder": "support_interface_extruder_nr", "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": + { + "support_bottom_line_distance": + { + "label": "Support Bottom Line Distance", + "description": "Distance between the printed support bottom lines. This setting is calculated by the Support Bottom Density, but can be adjusted separately.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0", + "minimum_value_warning": "support_interface_line_width - 0.0001", + "value": "0 if support_bottom_density == 0 else (support_interface_line_width * 100) / support_bottom_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", + "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } + }, + "support_roof_density": + { + "label": "Support Roof Density", + "description": "Adjusts the density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "unit": "%", + "type": "float", + "default_value": 100, + "minimum_value": "0", + "maximum_value": "100", + "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "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.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0", + "minimum_value_warning": "support_interface_line_width - 0.0001", + "value": "0 if support_roof_density == 0 else (support_interface_line_width * 100) / support_roof_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", + "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } } } }, From 8de0bd60c795202452b022c9ecbf021e9a8d509d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 15:02:44 +0100 Subject: [PATCH 17/90] Split support inerface line width into roof and bottom This way you can change them separately. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 45 ++++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b282ac8fd2..2d837f90af 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -757,7 +757,42 @@ "limit_to_extruder": "support_interface_extruder_nr", "value": "line_width", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": + { + "support_bottom_line_width": + { + "label": "Support Bottom Line Width", + "description": "Width of a single support bottom line.", + "unit": "mm", + "default_value": 0.4, + "minimum_value": "0.001", + "minimum_value_warning": "0.4 * machine_nozzle_size", + "maximum_value_warning": "2 * machine_nozzle_size", + "type": "float", + "enabled": "support_enable and support_interface_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "value": "support_interface_line_width", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_roof_line_width": + { + "label": "Support Roof Line Width", + "description": "Width of a single support roof line.", + "unit": "mm", + "default_value": 0.4, + "minimum_value": "0.001", + "minimum_value_warning": "0.4 * machine_nozzle_size", + "maximum_value_warning": "2 * machine_nozzle_size", + "type": "float", + "enabled": "support_enable and support_interface_enable", + "limit_to_extruder": "support_interface_extruder_nr", + "value": "support_interface_line_width", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } }, "prime_tower_line_width": { @@ -3275,8 +3310,8 @@ "type": "float", "default_value": 0.4, "minimum_value": "0", - "minimum_value_warning": "support_interface_line_width - 0.0001", - "value": "0 if support_bottom_density == 0 else (support_interface_line_width * 100) / support_bottom_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", + "minimum_value_warning": "support_bottom_line_width - 0.0001", + "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", "limit_to_extruder": "support_interface_extruder_nr", "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, @@ -3307,8 +3342,8 @@ "type": "float", "default_value": 0.4, "minimum_value": "0", - "minimum_value_warning": "support_interface_line_width - 0.0001", - "value": "0 if support_roof_density == 0 else (support_interface_line_width * 100) / support_roof_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", + "minimum_value_warning": "support_roof_line_width - 0.0001", + "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", "limit_to_extruder": "support_interface_extruder_nr", "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, From 2d9b2216a3909c4a24530a3af49ea99b9d6d7af9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 17 Mar 2017 15:55:18 +0100 Subject: [PATCH 18/90] Allow printing support roof and bottom with different extruders Note that currently the support_interface_extruder_nr is still used by the engine for some things and therefore the build volume calculations may not be 100% correct. I'll fix that up soon. Contributes to issue CURA-3491. --- cura/BuildVolume.py | 2 +- cura/Settings/ExtruderManager.py | 3 +- resources/definitions/fdmprinter.def.json | 91 +++++++++++++++-------- 3 files changed, 61 insertions(+), 35 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 1b04e0390a..4ad5a81552 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -899,4 +899,4 @@ class BuildVolume(SceneNode): _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y"] _ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"] _distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts"] - _extruder_settings = ["support_enable", "support_interface_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_interface_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used. + _extruder_settings = ["support_enable", "support_interface_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used. diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index f6c1759078..55621d0e3b 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -370,7 +370,8 @@ class ExtruderManager(QObject): used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_infill_extruder_nr", "value"))]) used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_extruder_nr_layer_0", "value"))]) if support_interface_enabled: - used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_interface_extruder_nr", "value"))]) + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_roof_extruder_nr", "value"))]) + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_bottom_extruder_nr", "value"))]) #The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2d837f90af..1e7da3228f 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -771,7 +771,7 @@ "maximum_value_warning": "2 * machine_nozzle_size", "type": "float", "enabled": "support_enable and support_interface_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "limit_to_extruder": "support_bottom_extruder_nr", "value": "support_interface_line_width", "settable_per_mesh": false, "settable_per_extruder": true @@ -787,7 +787,7 @@ "maximum_value_warning": "2 * machine_nozzle_size", "type": "float", "enabled": "support_enable and support_interface_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "limit_to_extruder": "support_roof_extruder_nr", "value": "support_interface_line_width", "settable_per_mesh": false, "settable_per_extruder": true @@ -1923,8 +1923,8 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", "value": "speed_support_interface", "settable_per_mesh": false, "settable_per_extruder": true @@ -1939,8 +1939,8 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_roof_extruder_nr", "value": "speed_support_interface", "settable_per_mesh": false, "settable_per_extruder": true @@ -2245,8 +2245,8 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -2261,8 +2261,8 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true } @@ -2519,8 +2519,8 @@ "minimum_value": "0.1", "minimum_value_warning": "5", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -2535,8 +2535,8 @@ "minimum_value": "0.1", "minimum_value_warning": "5", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "limit_to_extruder": "support_interface_extruder_nr", + "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true } @@ -2980,7 +2980,32 @@ "value": "support_extruder_nr", "enabled": "support_enable and machine_extruder_count > 1", "settable_per_mesh": false, - "settable_per_extruder": false + "settable_per_extruder": false, + "children": + { + "support_bottom_extruder_nr": + { + "label": "Support Bottom Extruder", + "description": "The extruder train to use for printing the bottoms of the support. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "support_interface_extruder_nr", + "enabled": "support_enable and machine_extruder_count > 1", + "settable_per_mesh": false, + "settable_per_extruder": false + }, + "support_roof_extruder_nr": + { + "label": "Support Roof Extruder", + "description": "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion.", + "type": "extruder", + "default_value": "0", + "value": "support_interface_extruder_nr", + "enabled": "support_enable and machine_extruder_count > 1", + "settable_per_mesh": false, + "settable_per_extruder": false + } + } } } }, @@ -3102,7 +3127,7 @@ "type": "float", "enabled": "support_enable", "value": "extruderValue(support_extruder_nr, 'support_z_distance')", - "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_roof_extruder_nr if support_interface_enable else support_infill_extruder_nr", "settable_per_mesh": true }, "support_bottom_distance": @@ -3114,7 +3139,7 @@ "maximum_value_warning": "machine_nozzle_size", "default_value": 0.1, "value": "extruderValue(support_extruder_nr, 'support_z_distance') if resolveOrValue('support_type') == 'everywhere' else 0", - "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_bottom_extruder_nr if support_interface_enable else support_infill_extruder_nr", "type": "float", "enabled": "support_enable and resolveOrValue('support_type') == 'everywhere'", "settable_per_mesh": true @@ -3170,7 +3195,7 @@ "unit": "mm", "type": "float", "default_value": 0.3, - "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_bottom_extruder_nr if support_interface_enable else support_infill_extruder_nr", "minimum_value": "0", "maximum_value_warning": "1.0", "enabled": "support_enable", @@ -3237,9 +3262,9 @@ "minimum_value": "0", "minimum_value_warning": "3 * resolveOrValue('layer_height')", "maximum_value_warning": "10", - "value": "extruderValue(support_interface_extruder_nr, 'support_interface_height')", - "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "value": "extruderValue(support_roof_extruder_nr, 'support_interface_height')", + "limit_to_extruder": "support_roof_extruder_nr", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": true }, "support_bottom_height": @@ -3249,12 +3274,12 @@ "unit": "mm", "type": "float", "default_value": 1, - "value": "extruderValue(support_interface_extruder_nr, 'support_interface_height')", + "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_height')", "minimum_value": "0", - "minimum_value_warning": "min(3 * resolveOrValue('layer_height'), extruderValue(support_interface_extruder_nr, 'support_bottom_stair_step_height'))", + "minimum_value_warning": "min(3 * resolveOrValue('layer_height'), extruderValue(support_bottom_extruder_nr, 'support_bottom_stair_step_height'))", "maximum_value_warning": "10", - "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": true } } @@ -3296,8 +3321,8 @@ "default_value": 100, "minimum_value": "0", "maximum_value": "100", - "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3312,8 +3337,8 @@ "minimum_value": "0", "minimum_value_warning": "support_bottom_line_width - 0.0001", "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", - "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -3328,8 +3353,8 @@ "default_value": 100, "minimum_value": "0", "maximum_value": "100", - "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_roof_extruder_nr", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3344,8 +3369,8 @@ "minimum_value": "0", "minimum_value_warning": "support_roof_line_width - 0.0001", "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", - "limit_to_extruder": "support_interface_extruder_nr", - "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", + "limit_to_extruder": "support_roof_extruder_nr", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } From 5d6f2d93dc9557a913678ee4ebd19fcdb487b68a Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Mar 2017 09:13:57 +0100 Subject: [PATCH 19/90] Make support angle depend on support roof extruder instead of interface It's the roof that matters for the overhang angle. The bottom has no influence. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 1e7da3228f..ae6525234d 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3035,7 +3035,7 @@ "maximum_value": "90", "maximum_value_warning": "80", "default_value": 50, - "limit_to_extruder": "support_interface_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_roof_extruder_nr if support_interface_enable else support_infill_extruder_nr", "enabled": "support_enable", "settable_per_mesh": true }, From 3bae49f1d47368347f1ff645dd093f580ad5625b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Mar 2017 09:26:35 +0100 Subject: [PATCH 20/90] Split support interface pattern in two You can select a pattern separately for roof and bottom. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 51 +++++++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ae6525234d..b844e55991 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3336,7 +3336,7 @@ "default_value": 0.4, "minimum_value": "0", "minimum_value_warning": "support_bottom_line_width - 0.0001", - "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", + "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_bottom_pattern == 'grid' else (3 if support_bottom_pattern == 'triangles' else 1))", "limit_to_extruder": "support_bottom_extruder_nr", "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, @@ -3368,7 +3368,7 @@ "default_value": 0.4, "minimum_value": "0", "minimum_value_warning": "support_roof_line_width - 0.0001", - "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_interface_pattern == 'grid' else (3 if support_interface_pattern == 'triangles' else 1))", + "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == 'grid' else (3 if support_roof_pattern == 'triangles' else 1))", "limit_to_extruder": "support_roof_extruder_nr", "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, @@ -3396,7 +3396,52 @@ "limit_to_extruder": "support_interface_extruder_nr", "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", "settable_per_mesh": false, - "settable_per_extruder": true + "settable_per_extruder": true, + "children": + { + "support_bottom_pattern": + { + "label": "Support Bottom Pattern", + "description": "The pattern with which the bottoms of the support are printed.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "concentric_3d": "Concentric 3D", + "zigzag": "Zig Zag" + }, + "default_value": "concentric", + "value": "support_interface_pattern", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "support_roof_pattern": + { + "label": "Support Roof Pattern", + "description": "The pattern with which the bottoms of the support are printed.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "concentric_3d": "Concentric 3D", + "zigzag": "Zig Zag" + }, + "default_value": "concentric", + "value": "support_interface_pattern", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } }, "support_use_towers": { From 92d34a8d7293923646224054c2afcfa57504847e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Mar 2017 09:40:54 +0100 Subject: [PATCH 21/90] Split support interface resolution into roof and bottom You can now tune them separately. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 35 +++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b844e55991..af36b6fb73 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3287,7 +3287,7 @@ "support_interface_skip_height": { "label": "Support Interface Resolution", - "description": "When checking where there's model above the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface.", + "description": "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface.", "unit": "mm", "type": "float", "default_value": 0.3, @@ -3295,7 +3295,38 @@ "maximum_value_warning": "support_interface_height", "limit_to_extruder": "support_interface_extruder_nr", "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": + { + "support_bottom_skip_height": + { + "label": "Support Bottom Resolution", + "description": "When checking where there's model below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been the bottom of support.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "value": "support_interface_skip_height", + "minimum_value": "0", + "maximum_value_warning": "support_bottom_height", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "settable_per_mesh": true + }, + "support_roof_skip_height": + { + "label": "Support Roof Resolution", + "description": "When checking where there's model above the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been roof on the support.", + "unit": "mm", + "type": "float", + "default_value": 0.3, + "value": "support_interface_skip_height", + "minimum_value": "0", + "maximum_value_warning": "support_roof_height", + "limit_to_extruder": "support_roof_extruder_nr", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "settable_per_mesh": true + } + } }, "support_interface_density": { From 2f1d957f99f791d0472e915a37e472473c098ab0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Mar 2017 10:47:37 +0100 Subject: [PATCH 22/90] Split support_interface_enable into roof and bottom You can activate the roof and bottom separately now. If you want, of course. The original interface setting sets both of them unless overwritten. Contributes to issue CURA-3491. --- cura/BuildVolume.py | 2 +- cura/Settings/ExtruderManager.py | 14 +++-- resources/definitions/fdmprinter.def.json | 71 +++++++++++++++-------- 3 files changed, 58 insertions(+), 29 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 4ad5a81552..35138a5ea7 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -899,4 +899,4 @@ class BuildVolume(SceneNode): _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y"] _ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"] _distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts"] - _extruder_settings = ["support_enable", "support_interface_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used. + _extruder_settings = ["support_enable", "support_bottom_enable", "support_roof_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used. diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 55621d0e3b..85b30ba9d6 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -346,7 +346,8 @@ class ExtruderManager(QObject): #Get the extruders of all meshes in the scene. support_enabled = False - support_interface_enabled = False + support_bottom_enabled = False + support_roof_enabled = False scene_root = Application.getInstance().getController().getScene().getRoot() meshes = [node for node in DepthFirstIterator(scene_root) if type(node) is SceneNode and node.isSelectable()] #Only use the nodes that will be printed. for mesh in meshes: @@ -359,19 +360,22 @@ class ExtruderManager(QObject): per_mesh_stack = mesh.callDecoration("getStack") if per_mesh_stack: support_enabled |= per_mesh_stack.getProperty("support_enable", "value") - support_interface_enabled |= per_mesh_stack.getProperty("support_interface_enable", "value") + support_bottom_enabled |= per_mesh_stack.getProperty("support_bottom_enable", "value") + support_roof_enabled |= per_mesh_stack.getProperty("support_roof_enable", "value") else: #Take the setting from the build extruder stack. extruder_stack = container_registry.findContainerStacks(id = extruder_stack_id)[0] support_enabled |= extruder_stack.getProperty("support_enable", "value") - support_interface_enabled |= extruder_stack.getProperty("support_enable", "value") + support_bottom_enabled |= extruder_stack.getProperty("support_bottom_enable", "value") + support_roof_enabled |= extruder_stack.getProperty("support_roof_enable", "value") #The support extruders. if support_enabled: used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_infill_extruder_nr", "value"))]) used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_extruder_nr_layer_0", "value"))]) - if support_interface_enabled: - used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_roof_extruder_nr", "value"))]) + if support_bottom_enabled: used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_bottom_extruder_nr", "value"))]) + if support_roof_enabled: + used_extruder_stack_ids.add(self.extruderIds[str(global_stack.getProperty("support_roof_extruder_nr", "value"))]) #The platform adhesion extruder. Not used if using none. if global_stack.getProperty("adhesion_type", "value") != "none": diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index af36b6fb73..498b6334a2 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -770,7 +770,7 @@ "minimum_value_warning": "0.4 * machine_nozzle_size", "maximum_value_warning": "2 * machine_nozzle_size", "type": "float", - "enabled": "support_enable and support_interface_enable", + "enabled": "support_enable and support_bottom_enable", "limit_to_extruder": "support_bottom_extruder_nr", "value": "support_interface_line_width", "settable_per_mesh": false, @@ -786,7 +786,7 @@ "minimum_value_warning": "0.4 * machine_nozzle_size", "maximum_value_warning": "2 * machine_nozzle_size", "type": "float", - "enabled": "support_enable and support_interface_enable", + "enabled": "support_enable and support_roof_enable", "limit_to_extruder": "support_roof_extruder_nr", "value": "support_interface_line_width", "settable_per_mesh": false, @@ -1923,7 +1923,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "limit_to_extruder": "support_bottom_extruder_nr", "value": "speed_support_interface", "settable_per_mesh": false, @@ -1939,7 +1939,7 @@ "minimum_value": "0.1", "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", "maximum_value_warning": "150", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "limit_to_extruder": "support_roof_extruder_nr", "value": "speed_support_interface", "settable_per_mesh": false, @@ -2245,7 +2245,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -2261,7 +2261,7 @@ "minimum_value": "0.1", "minimum_value_warning": "100", "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -2519,7 +2519,7 @@ "minimum_value": "0.1", "minimum_value_warning": "5", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "limit_to_extruder": "support_bottom_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -2535,7 +2535,7 @@ "minimum_value": "0.1", "minimum_value_warning": "5", "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true @@ -3035,7 +3035,7 @@ "maximum_value": "90", "maximum_value_warning": "80", "default_value": 50, - "limit_to_extruder": "support_roof_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr", "enabled": "support_enable", "settable_per_mesh": true }, @@ -3127,7 +3127,7 @@ "type": "float", "enabled": "support_enable", "value": "extruderValue(support_extruder_nr, 'support_z_distance')", - "limit_to_extruder": "support_roof_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr", "settable_per_mesh": true }, "support_bottom_distance": @@ -3139,7 +3139,7 @@ "maximum_value_warning": "machine_nozzle_size", "default_value": 0.1, "value": "extruderValue(support_extruder_nr, 'support_z_distance') if resolveOrValue('support_type') == 'everywhere' else 0", - "limit_to_extruder": "support_bottom_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr", "type": "float", "enabled": "support_enable and resolveOrValue('support_type') == 'everywhere'", "settable_per_mesh": true @@ -3195,7 +3195,7 @@ "unit": "mm", "type": "float", "default_value": 0.3, - "limit_to_extruder": "support_bottom_extruder_nr if support_interface_enable else support_infill_extruder_nr", + "limit_to_extruder": "support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr", "minimum_value": "0", "maximum_value_warning": "1.0", "enabled": "support_enable", @@ -3235,7 +3235,32 @@ "default_value": false, "limit_to_extruder": "support_interface_extruder_nr", "enabled": "support_enable", - "settable_per_mesh": true + "settable_per_mesh": true, + "children": + { + "support_bottom_enable": + { + "label": "Enable Support Bottom", + "description": "Generate a dense flooring below the support where it rests on the model. This will create a skin between the model and support.", + "type": "bool", + "default_value": false, + "value": "support_interface_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "support_interface_enable", + "settable_per_mesh": true + }, + "support_roof_enable": + { + "label": "Enable Support Roof", + "description": "Generate a dense roof above the support where the model rests on the support. This will create a skin between the model and support.", + "type": "bool", + "default_value": false, + "value": "support_interface_enable", + "limit_to_extruder": "support_roof_extruder_nr", + "enabled": "support_interface_enable", + "settable_per_mesh": true + } + } }, "support_interface_height": { @@ -3264,7 +3289,7 @@ "maximum_value_warning": "10", "value": "extruderValue(support_roof_extruder_nr, 'support_interface_height')", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "settable_per_mesh": true }, "support_bottom_height": @@ -3279,7 +3304,7 @@ "minimum_value_warning": "min(3 * resolveOrValue('layer_height'), extruderValue(support_bottom_extruder_nr, 'support_bottom_stair_step_height'))", "maximum_value_warning": "10", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "settable_per_mesh": true } } @@ -3309,7 +3334,7 @@ "minimum_value": "0", "maximum_value_warning": "support_bottom_height", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "settable_per_mesh": true }, "support_roof_skip_height": @@ -3323,7 +3348,7 @@ "minimum_value": "0", "maximum_value_warning": "support_roof_height", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "settable_per_mesh": true } } @@ -3353,7 +3378,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3369,7 +3394,7 @@ "minimum_value_warning": "support_bottom_line_width - 0.0001", "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_bottom_pattern == 'grid' else (3 if support_bottom_pattern == 'triangles' else 1))", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -3385,7 +3410,7 @@ "minimum_value": "0", "maximum_value": "100", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true, "children": @@ -3401,7 +3426,7 @@ "minimum_value_warning": "support_roof_line_width - 0.0001", "value": "0 if support_roof_density == 0 else (support_roof_line_width * 100) / support_roof_density * (2 if support_roof_pattern == 'grid' else (3 if support_roof_pattern == 'triangles' else 1))", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } @@ -3447,7 +3472,7 @@ "default_value": "concentric", "value": "support_interface_pattern", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -3468,7 +3493,7 @@ "default_value": "concentric", "value": "support_interface_pattern", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_interface_enable') and support_enable", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_roof_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true } From 7915dfa103640c8d23df6e9b714c850501dc05f3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 20 Mar 2017 10:55:04 +0100 Subject: [PATCH 23/90] Enable support roof/bottom enabled settings when support is active Their enabling shouldn't be dependent on the setting they are themselves dependent on. The settings are still effective even if support_interface_enable is off, if they are just overwritten. Contributes to issue CURA-3491. --- 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 498b6334a2..5565737242 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3246,7 +3246,7 @@ "default_value": false, "value": "support_interface_enable", "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_interface_enable", + "enabled": "support_enable", "settable_per_mesh": true }, "support_roof_enable": @@ -3257,7 +3257,7 @@ "default_value": false, "value": "support_interface_enable", "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "support_interface_enable", + "enabled": "support_enable", "settable_per_mesh": true } } From aa79ca1d30d5dbc35b8a39e0a53e266e4b27e83b Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 20 Mar 2017 15:49:27 +0100 Subject: [PATCH 24/90] Layer view menu items now have Cura colors, not the system colors. --- plugins/LayerView/LayerView.qml | 12 ++++++++++++ resources/themes/cura/styles.qml | 7 +++++++ 2 files changed, 19 insertions(+) mode change 100644 => 100755 plugins/LayerView/LayerView.qml mode change 100644 => 100755 resources/themes/cura/styles.qml diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml old mode 100644 new mode 100755 index cb8a27d55d..b52aa5bfda --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -58,6 +58,7 @@ Item anchors.left: parent.left text: catalog.i18nc("@label","View Mode: Layers") font.bold: true + style: UM.Theme.styles.text } Label @@ -75,6 +76,7 @@ Item text: catalog.i18nc("@label","Color scheme") visible: !UM.LayerView.compatibilityMode Layout.fillWidth: true + style: UM.Theme.styles.text } ListModel // matches LayerView.py @@ -102,6 +104,7 @@ Item Layout.preferredWidth: UM.Theme.getSize("layerview_row").width model: layerViewTypes visible: !UM.LayerView.compatibilityMode + style: UM.Theme.styles.combobox property int layer_view_type: UM.Preferences.getValue("layerview/layer_view_type") currentIndex: layer_view_type // index matches type_id @@ -174,6 +177,7 @@ Item Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox } } @@ -197,6 +201,7 @@ Item Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox } CheckBox { checked: view_settings.show_helpers @@ -218,6 +223,7 @@ Item Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox } CheckBox { checked: view_settings.show_skin @@ -239,6 +245,7 @@ Item Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox } CheckBox { checked: view_settings.show_infill @@ -260,6 +267,7 @@ Item Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox } CheckBox { checked: view_settings.only_show_top_layers @@ -268,6 +276,7 @@ Item } text: catalog.i18nc("@label", "Only Show Top Layers") visible: UM.LayerView.compatibilityMode + style: UM.Theme.styles.checkbox } CheckBox { checked: view_settings.top_layer_count == 5 @@ -276,6 +285,7 @@ Item } text: catalog.i18nc("@label", "Show 5 Detailed Layers On Top") visible: UM.LayerView.compatibilityMode + style: UM.Theme.styles.checkbox } Label @@ -297,6 +307,7 @@ Item Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width visible: view_settings.show_legend + style: UM.Theme.styles.text } Label @@ -319,6 +330,7 @@ Item Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width visible: view_settings.show_legend + style: UM.Theme.styles.text } } diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml old mode 100644 new mode 100755 index 64b4436622..bc5cd786b1 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -594,6 +594,13 @@ QtObject { } } + property Component text: Component { + TextFieldStyle { + textColor: Theme.getColor("text"); + font: Theme.getFont("default"); + } + } + property Component sidebar_action_button: Component { ButtonStyle { From e09dc40dff2bd76d3957c572a28c3372b0d79181 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Apr 2017 13:33:42 +0200 Subject: [PATCH 25/90] Switch descriptions of support top and bottom speed Had it wrong way around on what it affects. Contributes to issue CURA-3491. --- 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 5565737242..d30c27e861 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1916,7 +1916,7 @@ "speed_support_bottom": { "label": "Support Bottom Speed", - "description": "The speed at which the bottoms of support are printed. Printing them at lower speeds can improve overhang quality.", + "description": "The speed at which the bottoms of support are printed. Printing them at lower speeds can improve adhesion of support on top of your model.", "unit": "mm/s", "type": "float", "default_value": 40, @@ -1932,7 +1932,7 @@ "speed_support_roof": { "label": "Support Roof Speed", - "description": "The speed at which the roofs of support are printed. Printing them at lower speeds can improve adhesion of support on top of your model.", + "description": "The speed at which the roofs of support are printed. Printing them at lower speeds can improve overhang quality.", "unit": "mm/s", "type": "float", "default_value": 40, From d65cc00c6971b7aea30aea425a67c1dbd7bb6781 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Apr 2017 13:39:03 +0200 Subject: [PATCH 26/90] Rephrase description of enable support bottoms It must have a different phrasing than 'support bottom', or else it won't give an actual explanation of what support bottoms are, but 'flooring' was not acceptable. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d30c27e861..6404c01f8d 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3241,7 +3241,7 @@ "support_bottom_enable": { "label": "Enable Support Bottom", - "description": "Generate a dense flooring below the support where it rests on the model. This will create a skin between the model and support.", + "description": "Generate dense floors below the support where it rests on the model. This will create a skin between the model and support.", "type": "bool", "default_value": false, "value": "support_interface_enable", From 945c438c229f53eee8a526d7fda5f885ce882504 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Apr 2017 14:02:19 +0200 Subject: [PATCH 27/90] Remove support interface resolution settings This reverts commit 92d34a8d7293923646224054c2afcfa57504847e, but not entirely because I wanted to retain the new description for support interface resolution itself. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 36 ++--------------------- 1 file changed, 2 insertions(+), 34 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6404c01f8d..b2a53c6484 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3309,8 +3309,7 @@ } } }, - "support_interface_skip_height": - { + "support_interface_skip_height": { "label": "Support Interface Resolution", "description": "When checking where there's model above and below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been support interface.", "unit": "mm", @@ -3320,38 +3319,7 @@ "maximum_value_warning": "support_interface_height", "limit_to_extruder": "support_interface_extruder_nr", "enabled": "extruderValue(support_interface_extruder_nr, 'support_interface_enable') and support_enable", - "settable_per_mesh": true, - "children": - { - "support_bottom_skip_height": - { - "label": "Support Bottom Resolution", - "description": "When checking where there's model below the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been the bottom of support.", - "unit": "mm", - "type": "float", - "default_value": 0.3, - "value": "support_interface_skip_height", - "minimum_value": "0", - "maximum_value_warning": "support_bottom_height", - "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", - "settable_per_mesh": true - }, - "support_roof_skip_height": - { - "label": "Support Roof Resolution", - "description": "When checking where there's model above the support, take steps of the given height. Lower values will slice slower, while higher values may cause normal support to be printed in some places where there should have been roof on the support.", - "unit": "mm", - "type": "float", - "default_value": 0.3, - "value": "support_interface_skip_height", - "minimum_value": "0", - "maximum_value_warning": "support_roof_height", - "limit_to_extruder": "support_roof_extruder_nr", - "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", - "settable_per_mesh": true - } - } + "settable_per_mesh": true }, "support_interface_density": { From 89b296ef655d81b901b07134cf1355a3025a669c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Apr 2017 14:06:23 +0200 Subject: [PATCH 28/90] Describe the value of the support interface density settings rather than the action We use an object form rather than a verb form. Contributes to issue CURA-3491. --- 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 b2a53c6484..1eacae635d 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3339,7 +3339,7 @@ "support_bottom_density": { "label": "Support Bottom Density", - "description": "Adjusts the density of the bottoms of the support structure. A higher value results in better adhesion of the support on top of the model.", + "description": "The density of the bottoms of the support structure. A higher value results in better adhesion of the support on top of the model.", "unit": "%", "type": "float", "default_value": 100, @@ -3371,7 +3371,7 @@ "support_roof_density": { "label": "Support Roof Density", - "description": "Adjusts the density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", + "description": "The density of the roofs of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", "unit": "%", "type": "float", "default_value": 100, From 041481107963232cb58d658a20417d798dd58060 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 5 Apr 2017 14:07:45 +0200 Subject: [PATCH 29/90] Correct description of support roof pattern This was a copy-paste error. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 1eacae635d..8d6f4fd997 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3447,7 +3447,7 @@ "support_roof_pattern": { "label": "Support Roof Pattern", - "description": "The pattern with which the bottoms of the support are printed.", + "description": "The pattern with which the roofs of the support are printed.", "type": "enum", "options": { From 548338440a289742ba9eb1c41aa7476fcf626e66 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 13 Apr 2017 17:11:36 +0200 Subject: [PATCH 30/90] Rename all support bottom settings to support floor Only in the front-end though. No settings are renamed. No documentation updated. As far as the back-end implementation is concerned, it's still called support bottom. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 48 +++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4b634c3b76..dd2755e7b8 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -746,7 +746,7 @@ "support_interface_line_width": { "label": "Support Interface Line Width", - "description": "Width of a single support interface line.", + "description": "Width of a single line of support roof or floor.", "unit": "mm", "default_value": 0.4, "minimum_value": "0.001", @@ -762,8 +762,8 @@ { "support_bottom_line_width": { - "label": "Support Bottom Line Width", - "description": "Width of a single support bottom line.", + "label": "Support Floor Line Width", + "description": "Width of a single support floor line.", "unit": "mm", "default_value": 0.4, "minimum_value": "0.001", @@ -1958,7 +1958,7 @@ "speed_support_interface": { "label": "Support Interface Speed", - "description": "The speed at which the roofs and bottoms of support are printed. Printing them at lower speeds can improve overhang quality.", + "description": "The speed at which the roofs and floors of support are printed. Printing them at lower speeds can improve overhang quality.", "unit": "mm/s", "type": "float", "default_value": 40, @@ -1974,8 +1974,8 @@ { "speed_support_bottom": { - "label": "Support Bottom Speed", - "description": "The speed at which the bottoms of support are printed. Printing them at lower speeds can improve adhesion of support on top of your model.", + "label": "Support Floor Speed", + "description": "The speed at which the floor of support is printed. Printing it at lower speed can improve adhesion of support on top of your model.", "unit": "mm/s", "type": "float", "default_value": 40, @@ -2279,7 +2279,7 @@ "acceleration_support_interface": { "label": "Support Interface Acceleration", - "description": "The acceleration with which the roofs and bottoms of support are printed. Printing them at lower acceleration can improve overhang quality.", + "description": "The acceleration with which the roofs and floors of support are printed. Printing them at lower acceleration can improve overhang quality.", "unit": "mm/s²", "type": "float", "default_value": 3000, @@ -2295,8 +2295,8 @@ { "acceleration_support_bottom": { - "label": "Support Bottom Acceleration", - "description": "The acceleration with which the bottoms of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model.", + "label": "Support Floor Acceleration", + "description": "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model.", "unit": "mm/s²", "type": "float", "default_value": 3000, @@ -2553,7 +2553,7 @@ "jerk_support_interface": { "label": "Support Interface Jerk", - "description": "The maximum instantaneous velocity change with which the roofs and bottoms of support are printed.", + "description": "The maximum instantaneous velocity change with which the roofs and floors of support are printed.", "unit": "mm/s", "type": "float", "default_value": 20, @@ -2569,8 +2569,8 @@ { "jerk_support_bottom": { - "label": "Support Bottom Jerk", - "description": "The maximum instantaneous velocity change with which the bottoms of support are printed.", + "label": "Support Floor Jerk", + "description": "The maximum instantaneous velocity change with which the floors of support are printed.", "unit": "mm/s", "type": "float", "default_value": 20, @@ -3044,8 +3044,8 @@ { "support_bottom_extruder_nr": { - "label": "Support Bottom Extruder", - "description": "The extruder train to use for printing the bottoms of the support. This is used in multi-extrusion.", + "label": "Support Floor Extruder", + "description": "The extruder train to use for printing the floors of the support. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", "value": "support_interface_extruder_nr", @@ -3299,8 +3299,8 @@ { "support_bottom_enable": { - "label": "Enable Support Bottom", - "description": "Generate dense floors below the support where it rests on the model. This will create a skin between the model and support.", + "label": "Enable Support Floor", + "description": "Generate a dense slab of material below the support where it rests on the model. This will create a skin between the model and support.", "type": "bool", "default_value": false, "value": "support_interface_enable", @@ -3353,8 +3353,8 @@ }, "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.", + "label": "Support Floor Thickness", + "description": "The thickness of the support floors. This controls the number of dense layers that are printed on top of places of a model on which support rests.", "unit": "mm", "type": "float", "default_value": 1, @@ -3397,8 +3397,8 @@ { "support_bottom_density": { - "label": "Support Bottom Density", - "description": "The density of the bottoms of the support structure. A higher value results in better adhesion of the support on top of the model.", + "label": "Support Floor Density", + "description": "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model.", "unit": "%", "type": "float", "default_value": 100, @@ -3412,8 +3412,8 @@ { "support_bottom_line_distance": { - "label": "Support Bottom Line Distance", - "description": "Distance between the printed support bottom lines. This setting is calculated by the Support Bottom Density, but can be adjusted separately.", + "label": "Support Floor Line Distance", + "description": "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately.", "unit": "mm", "type": "float", "default_value": 0.4, @@ -3484,8 +3484,8 @@ { "support_bottom_pattern": { - "label": "Support Bottom Pattern", - "description": "The pattern with which the bottoms of the support are printed.", + "label": "Support Floor Pattern", + "description": "The pattern with which the floors of the support are printed.", "type": "enum", "options": { From fb29948f888b48937ba7cfdef01d90384962c956 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 13 Apr 2017 18:10:28 +0200 Subject: [PATCH 31/90] Update description of support_roof/bottom_enable Better terminology according to our UX designer. Contributes to issue CURA-3491. --- 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 dd2755e7b8..3199398eba 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3300,7 +3300,7 @@ "support_bottom_enable": { "label": "Enable Support Floor", - "description": "Generate a dense slab of material below the support where it rests on the model. This will create a skin between the model and support.", + "description": "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support.", "type": "bool", "default_value": false, "value": "support_interface_enable", @@ -3311,7 +3311,7 @@ "support_roof_enable": { "label": "Enable Support Roof", - "description": "Generate a dense roof above the support where the model rests on the support. This will create a skin between the model and support.", + "description": "Generate a dense slab of material between the top of support and the model. This will create a skin between the model and support.", "type": "bool", "default_value": false, "value": "support_interface_enable", From fdf20fcb154d00c7680e95701b5a2cbac55e9e00 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Tue, 18 Apr 2017 13:49:55 +0200 Subject: [PATCH 32/90] fix: forgotten floor in descriptions (CURA-3491) --- 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 3199398eba..1ae26bc40f 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3033,7 +3033,7 @@ "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.", + "description": "The extruder train to use for printing the roofs and floors of the support. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", "value": "support_extruder_nr", @@ -3383,7 +3383,7 @@ "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.", + "description": "Adjusts the density of the roofs and floors of the support structure. A higher value results in better overhangs, but the supports are harder to remove.", "unit": "%", "type": "float", "default_value": 100, From 9ce8f6cf660c6ad9b4f2426b57c26fd7178ea9cd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 18 Apr 2017 13:48:22 +0200 Subject: [PATCH 33/90] Added new icons CURA-3577 --- .../themes/cura/icons/material_not_selected.svg | 15 +++++++++++++++ resources/themes/cura/icons/material_selected.svg | 15 +++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 resources/themes/cura/icons/material_not_selected.svg create mode 100644 resources/themes/cura/icons/material_selected.svg diff --git a/resources/themes/cura/icons/material_not_selected.svg b/resources/themes/cura/icons/material_not_selected.svg new file mode 100644 index 0000000000..2d4fb7cfd3 --- /dev/null +++ b/resources/themes/cura/icons/material_not_selected.svg @@ -0,0 +1,15 @@ + + + + Artboard 3 + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/resources/themes/cura/icons/material_selected.svg b/resources/themes/cura/icons/material_selected.svg new file mode 100644 index 0000000000..87ffdf55da --- /dev/null +++ b/resources/themes/cura/icons/material_selected.svg @@ -0,0 +1,15 @@ + + + + Artboard 3 Copy + Created with Sketch. + + + + + + + + + + \ No newline at end of file From 06cc0e9a63ffcb9eaf208f27e8afef8aef85972e Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:39:43 +0200 Subject: [PATCH 34/90] Move the ContextMenu to its own file Contributes to CURA-3609 --- resources/qml/Cura.qml | 98 +---------------------------- resources/qml/Menus/ContextMenu.qml | 96 ++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 96 deletions(-) create mode 100644 resources/qml/Menus/ContextMenu.qml diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index b0e6d09080..0a48725011 100755 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -594,102 +594,8 @@ UM.MainWindow } } - Menu - { - id: objectContextMenu; - - property variant objectId: -1; - MenuItem { action: Cura.Actions.centerObject; } - MenuItem { action: Cura.Actions.deleteObject; } - MenuItem { action: Cura.Actions.multiplyObject; } - MenuSeparator { } - MenuItem { action: Cura.Actions.selectAll; } - MenuItem { action: Cura.Actions.arrangeAll; } - MenuItem { action: Cura.Actions.deleteAll; } - MenuItem { action: Cura.Actions.reloadAll; } - MenuItem { action: Cura.Actions.resetAllTranslation; } - MenuItem { action: Cura.Actions.resetAll; } - MenuSeparator { } - MenuItem { action: Cura.Actions.groupObjects; } - MenuItem { action: Cura.Actions.mergeObjects; } - MenuItem { action: Cura.Actions.unGroupObjects; } - - Connections - { - target: Cura.Actions.deleteObject - onTriggered: - { - if(objectContextMenu.objectId != 0) - { - CuraApplication.deleteObject(objectContextMenu.objectId); - objectContextMenu.objectId = 0; - } - } - } - - MultiplyObjectOptions - { - id: multiplyObjectOptions - } - - Connections - { - target: Cura.Actions.multiplyObject - onTriggered: - { - if(objectContextMenu.objectId != 0) - { - multiplyObjectOptions.objectId = objectContextMenu.objectId; - multiplyObjectOptions.visible = true; - multiplyObjectOptions.reset(); - objectContextMenu.objectId = 0; - } - } - } - - Connections - { - target: Cura.Actions.centerObject - onTriggered: - { - if(objectContextMenu.objectId != 0) - { - CuraApplication.centerObject(objectContextMenu.objectId); - objectContextMenu.objectId = 0; - } - } - } - } - - Menu - { - id: contextMenu; - MenuItem { action: Cura.Actions.selectAll; } - MenuItem { action: Cura.Actions.arrangeAll; } - MenuItem { action: Cura.Actions.deleteAll; } - MenuItem { action: Cura.Actions.reloadAll; } - MenuItem { action: Cura.Actions.resetAllTranslation; } - MenuItem { action: Cura.Actions.resetAll; } - MenuSeparator { } - MenuItem { action: Cura.Actions.groupObjects; } - MenuItem { action: Cura.Actions.mergeObjects; } - MenuItem { action: Cura.Actions.unGroupObjects; } - } - - Connections - { - target: UM.Controller - onContextMenuRequested: - { - if(objectId == 0) - { - contextMenu.popup(); - } else - { - objectContextMenu.objectId = objectId; - objectContextMenu.popup(); - } - } + ContextMenu { + id: contextMenu } Connections diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml new file mode 100644 index 0000000000..fdb1ef6817 --- /dev/null +++ b/resources/qml/Menus/ContextMenu.qml @@ -0,0 +1,96 @@ +// Copyright (c) 2016 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.Dialogs 1.2 +import QtQuick.Window 2.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Menu +{ + id: base + + // Selection-related actions. + MenuItem { action: Cura.Actions.centerSelection; } + MenuItem { action: Cura.Actions.deleteSelection; } + MenuItem { action: Cura.Actions.multiplySelection; } + + // Global actions + MenuSeparator { } + MenuItem { action: Cura.Actions.selectAll; } + MenuItem { action: Cura.Actions.arrangeAll; } + MenuItem { action: Cura.Actions.deleteAll; } + MenuItem { action: Cura.Actions.reloadAll; } + MenuItem { action: Cura.Actions.resetAllTranslation; } + MenuItem { action: Cura.Actions.resetAll; } + + // Group actions + MenuSeparator { } + MenuItem { action: Cura.Actions.groupObjects; } + MenuItem { action: Cura.Actions.mergeObjects; } + MenuItem { action: Cura.Actions.unGroupObjects; } + + Connections + { + target: UM.Controller + onContextMenuRequested: base.popup(); + } + + Connections + { + target: Cura.Actions.multiplySelection + onTriggered: multiplyDialog.open() + } + + Dialog + { + id: multiplyDialog + + title: catalog.i18ncp("@title:window", "Multiply Selected Model", "Multiply Selected Models", UM.Selection.selectionCount) + + width: 400 * Screen.devicePixelRatio + height: 80 * Screen.devicePixelRatio + + signal reset() + onReset: + { + copiesField.value = 1; + copiesField.focus = true; + } + + standardButtons: StandardButton.Ok | StandardButton.Cancel + + Row + { + spacing: UM.Theme.getSize("default_margin").width + + Label + { + text: catalog.i18nc("@label", "Number of Copies") + anchors.verticalCenter: copiesField.verticalCenter + } + + SpinBox + { + id: copiesField + minimumValue: 1 + maximumValue: 99 + } + } + } + + function findItemIndex(item) + { + for(var i in base.items) + { + if(base.items[i] == item) + return i; + } + return -1; + } + + UM.I18nCatalog { id: catalog; name: "cura" } +} From dd73c53eceaf76b8b9f1ccbe80a2a4cdcbb760bf Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:18:12 +0200 Subject: [PATCH 35/90] Introduce center and multiply actions that work on the entire selection Instead of working on a single object. Contributes to CURA-3609 --- resources/qml/Actions.qml | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index b5f5823ece..e0d9060ee2 100755 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -18,6 +18,8 @@ Item property alias redo: redoAction; property alias deleteSelection: deleteSelectionAction; + property alias centerSelection: centerSelectionAction; + property alias multiplySelection: multiplySelectionAction; property alias deleteObject: deleteObjectAction; property alias centerObject: centerObjectAction; @@ -181,13 +183,29 @@ Item Action { id: deleteSelectionAction; - text: catalog.i18nc("@action:inmenu menubar:edit","Delete &Selection"); - enabled: UM.Controller.toolsEnabled; + text: catalog.i18ncp("@action:inmenu menubar:edit", "Delete &Selected Model", "Delete &Selected Models", UM.Selection.selectionCount); + enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection; iconName: "edit-delete"; shortcut: StandardKey.Delete; onTriggered: CuraApplication.deleteSelection(); } + Action + { + id: centerSelectionAction; + text: catalog.i18ncp("@action:inmenu menubar:edit", "Center Selected Model", "Center Selected Models", UM.Selection.selectionCount); + enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection; + iconName: "align-vertical-center"; + } + + Action + { + id: multiplySelectionAction; + text: catalog.i18ncp("@action:inmenu menubar:edit", "Multiply Selected Model", "Multiply Selected Models", UM.Selection.selectionCount); + enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection; + iconName: "edit-duplicate"; + } + Action { id: deleteObjectAction; From 8e95c894fbb73de7207f90ba6147965d43b9922f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:18:55 +0200 Subject: [PATCH 36/90] Add material and variant names to ExtruderModel Contributes to CURA-3609 --- cura/Settings/ExtrudersModel.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index 7f4a77eb5f..26e425c116 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -1,12 +1,12 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. -from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty +from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty, pyqtSlot import UM.Qt.ListModel from UM.Application import Application -from cura.Settings.ExtruderManager import ExtruderManager +from .ExtruderManager import ExtruderManager ## Model that holds extruders. # @@ -33,6 +33,12 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): # The ID of the definition of the extruder. DefinitionRole = Qt.UserRole + 5 + # The material of the extruder. + MaterialRole = Qt.UserRole + 6 + + # The variant of the extruder. + VariantRole = Qt.UserRole + 7 + ## List of colours to display if there is no material or the material has no known # colour. defaultColors = ["#ffc924", "#86ec21", "#22eeee", "#245bff", "#9124ff", "#ff24c8"] @@ -49,6 +55,8 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): self.addRoleName(self.ColorRole, "color") self.addRoleName(self.IndexRole, "index") self.addRoleName(self.DefinitionRole, "definition") + self.addRoleName(self.MaterialRole, "material") + self.addRoleName(self.VariantRole, "variant") self._add_global = False self._simple_names = False @@ -140,6 +148,7 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): for extruder in manager.getMachineExtruders(global_container_stack.getId()): extruder_name = extruder.getName() material = extruder.findContainer({ "type": "material" }) + variant = extruder.findContainer({"type": "variant"}) position = extruder.getMetaDataEntry("position", default = "0") # Get the position try: position = int(position) @@ -152,7 +161,9 @@ class ExtrudersModel(UM.Qt.ListModel.ListModel): "name": extruder_name, "color": color, "index": position, - "definition": extruder.getBottom().getId() + "definition": extruder.getBottom().getId(), + "material": material.getName() if material else "", + "variant": variant.getName() if variant else "", } items.append(item) changed = True From 97fd35c21d2d8e90c0f078f4e9529b03383760e8 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:22:39 +0200 Subject: [PATCH 37/90] Add a centerSelection method to CuraActions Can be used to center all selected objects. Contributes to CURA-3609 --- cura/CuraActions.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index df26a9a9a6..7e9cbebd94 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -1,9 +1,16 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + from PyQt5.QtCore import QObject, QUrl from PyQt5.QtGui import QDesktopServices from UM.FlameProfiler import pyqtSlot from UM.Event import CallFunctionEvent from UM.Application import Application +from UM.Math.Vector import Vector +from UM.Scene.Selection import Selection +from UM.Operations.GroupedOperation import GroupedOperation +from UM.Operations.SetTransformOperation import SetTransformOperation class CuraActions(QObject): @@ -23,5 +30,18 @@ class CuraActions(QObject): event = CallFunctionEvent(self._openUrl, [QUrl("http://github.com/Ultimaker/Cura/issues")], {}) Application.getInstance().functionEvent(event) + ## Center all objects in the selection + @pyqtSlot() + def centerSelection(self) -> None: + operation = GroupedOperation() + for node in Selection.getAllSelectedObjects(): + current_node = node + while current_node.getParent() and current_node.getParent().callDecoration("isGroup"): + current_node = current_node.getParent() + + center_operation = SetTransformOperation(current_node, Vector()) + operation.addOperation(center_operation) + operation.push() + def _openUrl(self, url): - QDesktopServices.openUrl(url) \ No newline at end of file + QDesktopServices.openUrl(url) From 905e59354b314db9806374111616c8ba775d3136 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:25:05 +0200 Subject: [PATCH 38/90] Change MultiplyObjectsJob to work on a list of objects This makes MultiplyObjectsJob able to handle a list of objects instead of a single object ID. Contributes to CURA-3609 --- cura/CuraApplication.py | 9 +++++- cura/MultiplyObjectsJob.py | 58 ++++++++++++++++++++------------------ 2 files changed, 39 insertions(+), 28 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ce2d029ae4..65f1ae5631 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -855,7 +855,14 @@ class CuraApplication(QtApplication): # \param min_offset minimum offset to other objects. @pyqtSlot("quint64", int) def multiplyObject(self, object_id, count, min_offset = 8): - job = MultiplyObjectsJob(object_id, count, min_offset) + node = self.getController().getScene().findObject(object_id) + if not node: + node = Selection.getSelectedObject(0) + + while node.getParent() and node.getParent().callDecoration("isGroup"): + node = node.getParent() + + job = MultiplyObjectsJob([node], count, min_offset) job.start() return diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 40dbc221d6..a795e0bc10 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -24,9 +24,9 @@ from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation class MultiplyObjectsJob(Job): - def __init__(self, object_id, count, min_offset = 8): + def __init__(self, objects, count, min_offset = 8): super().__init__() - self._object_id = object_id + self._objects = objects self._count = count self._min_offset = min_offset @@ -35,38 +35,42 @@ class MultiplyObjectsJob(Job): dismissable=False, progress=0) status_message.show() scene = Application.getInstance().getController().getScene() - node = scene.findObject(self._object_id) - if not node and self._object_id != 0: # Workaround for tool handles overlapping the selected object - node = Selection.getSelectedObject(0) - - # If object is part of a group, multiply group - current_node = node - while current_node.getParent() and current_node.getParent().callDecoration("isGroup"): - current_node = current_node.getParent() + total_progress = len(self._objects) * self._count + current_progress = 0 root = scene.getRoot() arranger = Arrange.create(scene_root=root) - node_too_big = False - if node.getBoundingBox().width < 300 or node.getBoundingBox().depth < 300: - offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(current_node, min_offset=self._min_offset) - else: - node_too_big = True nodes = [] - found_solution_for_all = True - for i in range(self._count): - # We do place the nodes one by one, as we want to yield in between. - if not node_too_big: - node, solution_found = arranger.findNodePlacement(current_node, offset_shape_arr, hull_shape_arr) - if node_too_big or not solution_found: - found_solution_for_all = False - new_location = node.getPosition() - new_location = new_location.set(z = 100 - i * 20) - node.setPosition(new_location) + for node in self._objects: + # If object is part of a group, multiply group + current_node = node + while current_node.getParent() and current_node.getParent().callDecoration("isGroup"): + current_node = current_node.getParent() + + node_too_big = False + if node.getBoundingBox().width < 300 or node.getBoundingBox().depth < 300: + offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(current_node, min_offset=self._min_offset) + else: + node_too_big = True + + found_solution_for_all = True + for i in range(self._count): + # We do place the nodes one by one, as we want to yield in between. + if not node_too_big: + node, solution_found = arranger.findNodePlacement(current_node, offset_shape_arr, hull_shape_arr) + if node_too_big or not solution_found: + found_solution_for_all = False + new_location = node.getPosition() + new_location = new_location.set(z = 100 - i * 20) + node.setPosition(new_location) + + nodes.append(node) + current_progress += 1 + status_message.setProgress((current_progress / total_progress) * 100) + Job.yieldThread() - nodes.append(node) Job.yieldThread() - status_message.setProgress((i + 1) / self._count * 100) if nodes: op = GroupedOperation() From c21895de978c79edf177b6162da50a095bca1740 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:25:53 +0200 Subject: [PATCH 39/90] Add a multiplySelection method to CuraActions Contributes to CURA-3609 --- cura/CuraActions.py | 9 +++++++++ resources/qml/Menus/ContextMenu.qml | 2 ++ 2 files changed, 11 insertions(+) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 7e9cbebd94..4fd51a8513 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -12,6 +12,7 @@ from UM.Scene.Selection import Selection from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.SetTransformOperation import SetTransformOperation +from .MultiplyObjectsJob import MultiplyObjectsJob class CuraActions(QObject): def __init__(self, parent = None): @@ -43,5 +44,13 @@ class CuraActions(QObject): operation.addOperation(center_operation) operation.push() + ## Multiply all objects in the selection + # + # \param count The number of times to multiply the selection. + @pyqtSlot(int) + def multiplySelection(self, count: int) -> None: + job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, 8) + job.start() + return def _openUrl(self, url): QDesktopServices.openUrl(url) diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index fdb1ef6817..be3713be6c 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -54,6 +54,8 @@ Menu width: 400 * Screen.devicePixelRatio height: 80 * Screen.devicePixelRatio + onAccepted: CuraActions.multiplySelection(copiesField.value) + signal reset() onReset: { From b56802a52305ed1edc1588dfb51d3d16e99314f5 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:26:49 +0200 Subject: [PATCH 40/90] Add a deleteSelection method to CuraActions It does the same as CuraApplication::deleteSelection but this is a better place for it. Contributes to CURA-3609 --- cura/CuraActions.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 4fd51a8513..c617980bc5 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -10,8 +10,10 @@ from UM.Application import Application from UM.Math.Vector import Vector from UM.Scene.Selection import Selection from UM.Operations.GroupedOperation import GroupedOperation +from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.SetTransformOperation import SetTransformOperation +from .SetParentOperation import SetParentOperation from .MultiplyObjectsJob import MultiplyObjectsJob class CuraActions(QObject): @@ -52,5 +54,25 @@ class CuraActions(QObject): job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, 8) job.start() return + + ## Delete all selected objects. + @pyqtSlot() + def deleteSelection(self) -> None: + if not Application.getInstance().getController().getToolsEnabled(): + return + + removed_group_nodes = [] + op = GroupedOperation() + nodes = Selection.getAllSelectedObjects() + for node in nodes: + op.addOperation(RemoveSceneNodeOperation(node)) + group_node = node.getParent() + if group_node and group_node.callDecoration("isGroup") and group_node not in removed_group_nodes: + remaining_nodes_in_group = list(set(group_node.getChildren()) - set(nodes)) + if len(remaining_nodes_in_group) == 1: + removed_group_nodes.append(group_node) + op.addOperation(SetParentOperation(remaining_nodes_in_group[0], group_node.getParent())) + op.addOperation(RemoveSceneNodeOperation(group_node)) + op.push() def _openUrl(self, url): QDesktopServices.openUrl(url) From 03ccdec861dfe2f1962724bec5442c1316edd96b Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:27:28 +0200 Subject: [PATCH 41/90] Call the right methods of CuraActions in Actions.qml Contributes to CURA-3609 --- resources/qml/Actions.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index e0d9060ee2..b9eef11a55 100755 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -187,7 +187,7 @@ Item enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection; iconName: "edit-delete"; shortcut: StandardKey.Delete; - onTriggered: CuraApplication.deleteSelection(); + onTriggered: CuraActions.deleteSelection(); } Action @@ -196,6 +196,7 @@ Item text: catalog.i18ncp("@action:inmenu menubar:edit", "Center Selected Model", "Center Selected Models", UM.Selection.selectionCount); enabled: UM.Controller.toolsEnabled && UM.Selection.hasSelection; iconName: "align-vertical-center"; + onTriggered: CuraActions.centerSelection(); } Action From 61f542c215c0b45bf8b4121bc4705c760c334aa9 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:28:52 +0200 Subject: [PATCH 42/90] Add a SetObjectExtruderOperation class It handles setting an extruder for an object. Contributes to CURA-3609 --- cura/Settings/SetObjectExtruderOperation.py | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 cura/Settings/SetObjectExtruderOperation.py diff --git a/cura/Settings/SetObjectExtruderOperation.py b/cura/Settings/SetObjectExtruderOperation.py new file mode 100644 index 0000000000..31c996529a --- /dev/null +++ b/cura/Settings/SetObjectExtruderOperation.py @@ -0,0 +1,27 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + +from UM.Scene.SceneNode import SceneNode +from UM.Operations.Operation import Operation + +from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator + +## Simple operation to set the extruder a certain object should be printed with. +class SetObjectExtruderOperation(Operation): + def __init__(self, node: SceneNode, extruder_id: str) -> None: + self._node = node + self._extruder_id = extruder_id + self._previous_extruder_id = None + self._decorator_added = False + + def undo(self): + if self._previous_extruder_id: + self._node.callDecoration("setActiveExtruder", self._previous_extruder_id) + + def redo(self): + stack = self._node.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway. + if not stack: + self._node.addDecorator(SettingOverrideDecorator()) + + self._previous_extruder_id = self._node.callDecoration("getActiveExtruder") + self._node.callDecoration("setActiveExtruder", self._extruder_id) From 5f65cb25c60513e539c2e0bf4407f7fbe578b1f7 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:29:41 +0200 Subject: [PATCH 43/90] Add a setSelectionExtruder method to CuraActions Can be used to set the extruder used for the selection Contributes to CURA-3609 --- cura/CuraActions.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index c617980bc5..0a1657e512 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -16,6 +16,8 @@ from UM.Operations.SetTransformOperation import SetTransformOperation from .SetParentOperation import SetParentOperation from .MultiplyObjectsJob import MultiplyObjectsJob +from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation + class CuraActions(QObject): def __init__(self, parent = None): super().__init__(parent) @@ -74,5 +76,15 @@ class CuraActions(QObject): op.addOperation(SetParentOperation(remaining_nodes_in_group[0], group_node.getParent())) op.addOperation(RemoveSceneNodeOperation(group_node)) op.push() + + @pyqtSlot(str) + def setSelectionExtruder(self, extruder_id: str) -> None: + operation = GroupedOperation() + for node in Selection.getAllSelectedObjects(): + if node.callDecoration("getActiveExtruder") == extruder_id: + continue + operation.addOperation(SetObjectExtruderOperation(node, extruder_id)) + operation.push() + def _openUrl(self, url): QDesktopServices.openUrl(url) From 9fd0239cd53b4e270ff4d5fb7691ad0715c14b2a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:33:32 +0200 Subject: [PATCH 44/90] Add a selectedObjectExtruders property to ExtruderManager It exposes a list of the extruders used by the current selection. Contributes to CURA-3609 --- cura/Settings/ExtruderManager.py | 36 ++++++++++++++++++++++- cura/Settings/SettingOverrideDecorator.py | 1 + 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index d21480b11b..75fa1ece3a 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -8,12 +8,13 @@ from UM.Application import Application #To get the global container stack to fin from UM.Logger import Logger from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode +from UM.Scene.Selection import Selection from UM.Settings.ContainerRegistry import ContainerRegistry #Finding containers by ID. from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.SettingFunction import SettingFunction from UM.Settings.ContainerStack import ContainerStack from UM.Settings.DefinitionContainer import DefinitionContainer -from typing import Optional +from typing import Optional, List ## Manages all existing extruder stacks. # @@ -34,10 +35,13 @@ class ExtruderManager(QObject): super().__init__(parent) self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs. self._active_extruder_index = 0 + self._selected_object_extruders = [] Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) self._global_container_stack_definition_id = None self._addCurrentMachineExtruders() + Selection.selectionChanged.connect(self.resetSelectedObjectExtruders) + ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -117,6 +121,34 @@ class ExtruderManager(QObject): except IndexError: return "" + ## Emitted whenever the selectedObjectExtruders property changes. + selectedObjectExtrudersChanged = pyqtSignal() + + ## Provides a list of extruder IDs used by the current selected objects. + @pyqtProperty("QVariantList", notify = selectedObjectExtrudersChanged) + def selectedObjectExtruders(self) -> List[str]: + if not self._selected_object_extruders: + object_extruders = set() + for node in Selection.getAllSelectedObjects(): + extruder = node.callDecoration("getActiveExtruder") + if extruder: + object_extruders.add(extruder) + else: + global_stack = Application.getInstance().getGlobalContainerStack() + object_extruders.add(self._extruder_trains[global_stack.getId()]["0"].getId()) + + self._selected_object_extruders = list(object_extruders) + + return self._selected_object_extruders + + ## Reset the internal list used for the selectedObjectExtruders property + # + # This will trigger a recalculation of the extruders used for the + # selection. + def resetSelectedObjectExtruders(self) -> None: + self._selected_object_extruders = [] + self.selectedObjectExtrudersChanged.emit() + def getActiveExtruderStack(self) -> ContainerStack: global_container_stack = Application.getInstance().getGlobalContainerStack() @@ -444,6 +476,8 @@ class ExtruderManager(QObject): self.globalContainerStackDefinitionChanged.emit() self.activeExtruderChanged.emit() + self.resetSelectedObjectExtruders() + ## Adds the extruders of the currently active machine. def _addCurrentMachineExtruders(self) -> None: global_stack = Application.getInstance().getGlobalContainerStack() diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 76c155cb99..d754b6bc6d 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -109,6 +109,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): def setActiveExtruder(self, extruder_stack_id): self._extruder_stack = extruder_stack_id self._updateNextStack() + ExtruderManager.getInstance().resetSelectedObjectExtruders() self.activeExtruderChanged.emit() def getStack(self): From e108bd062709ea96703b8794c0deae36e5f46875 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:40:50 +0200 Subject: [PATCH 45/90] Add extruder selection to Context menu Contributes to CURA-3609 --- resources/qml/Menus/ContextMenu.qml | 30 +++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index be3713be6c..a4285f1621 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -13,11 +13,32 @@ Menu { id: base + property bool shouldShowExtruders: machineExtruderCount.properties.value > 1; + // Selection-related actions. MenuItem { action: Cura.Actions.centerSelection; } MenuItem { action: Cura.Actions.deleteSelection; } MenuItem { action: Cura.Actions.multiplySelection; } + // Extruder selection - only visible if there is more than 1 extruder + MenuSeparator { visible: base.shouldShowExtruders } + MenuItem { id: extruderHeader; text: catalog.i18ncp("@label", "Print Selected Model With:", "Print Selected Models With:", UM.Selection.selectionCount); enabled: false; visible: base.shouldShowExtruders } + Instantiator + { + model: Cura.ExtrudersModel { id: extrudersModel } + MenuItem { + text: "%1: %2 - %3".arg(model.name).arg(model.material).arg(model.variant) + visible: base.shouldShowExtruders + enabled: UM.Selection.hasSelection + checkable: true + checked: ExtruderManager.selectedObjectExtruders.indexOf(model.id) != -1 + onTriggered: CuraActions.setSelectionExtruder(model.id) + shortcut: "Ctrl+" + (model.index + 1) + } + onObjectAdded: base.insertItem(base.findItemIndex(extruderHeader) + index, object) + onObjectRemoved: base.removeItem(object) + } + // Global actions MenuSeparator { } MenuItem { action: Cura.Actions.selectAll; } @@ -45,6 +66,15 @@ Menu onTriggered: multiplyDialog.open() } + UM.SettingPropertyProvider + { + id: machineExtruderCount + + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_extruder_count" + watchedProperties: [ "value" ] + } + Dialog { id: multiplyDialog From 05e1de2fb39dd2c0bf2fe6c1946a5869e0deb65b Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:34:31 +0200 Subject: [PATCH 46/90] Deprecate the delete/multiply/center methods in CuraApplication Since they should no longer be used by the UI. Contributes to CURA-3609 --- cura/CuraApplication.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 65f1ae5631..e7a6ac07c1 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -26,6 +26,7 @@ from UM.Message import Message from UM.i18n import i18nCatalog from UM.Workspace.WorkspaceReader import WorkspaceReader from UM.Platform import Platform +from UM.Decorators import deprecated from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation @@ -807,6 +808,7 @@ class CuraApplication(QtApplication): # Remove all selected objects from the scene. @pyqtSlot() + @deprecated("Moved to CuraActions", "2.6") def deleteSelection(self): if not self.getController().getToolsEnabled(): return @@ -827,6 +829,7 @@ class CuraApplication(QtApplication): ## Remove an object from the scene. # Note that this only removes an object if it is selected. @pyqtSlot("quint64") + @deprecated("Use deleteSelection instead", "2.6") def deleteObject(self, object_id): if not self.getController().getToolsEnabled(): return @@ -854,6 +857,7 @@ class CuraApplication(QtApplication): # \param count number of copies # \param min_offset minimum offset to other objects. @pyqtSlot("quint64", int) + @deprecated("Use CuraActions::multiplySelection", "2.6") def multiplyObject(self, object_id, count, min_offset = 8): node = self.getController().getScene().findObject(object_id) if not node: @@ -868,6 +872,7 @@ class CuraApplication(QtApplication): ## Center object on platform. @pyqtSlot("quint64") + @deprecated("Use CuraActions::centerSelection", "2.6") def centerObject(self, object_id): node = self.getController().getScene().findObject(object_id) if not node and object_id != 0: # Workaround for tool handles overlapping the selected object From 3d5e535b6985ce77aa61fec476e0b545a6dd0f99 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 20 Apr 2017 17:53:05 +0200 Subject: [PATCH 47/90] Select the object underneath the cursor on context menu request Contributes to CURA-3609 --- cura/CuraApplication.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index e7a6ac07c1..0ab3c1c1cf 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -219,6 +219,7 @@ class CuraApplication(QtApplication): self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) + self.getController().contextMenuRequested.connect(self._onContextMenuRequested) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") @@ -1332,3 +1333,10 @@ class CuraApplication(QtApplication): except Exception as e: Logger.log("e", "Could not check file %s: %s", file_url, e) return False + + def _onContextMenuRequested(self, x, y): + # Ensure we select the object if we request a context menu over an object without having a selection. + if not Selection.hasSelection(): + node = self.getController().getScene().findObject(self.getRenderer().getRenderPass("selection").getIdAtPosition(x, y)) + if node: + Selection.add(node) From c1fa92711817b3956f5ef9aa225c60e231bbd0ae Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 22 Apr 2017 23:07:13 +0200 Subject: [PATCH 48/90] Make the general settings page options draggable only in the vertical direction ... to match other scrollviews. Fixes #1723 --- resources/qml/Preferences/GeneralPage.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index bb397baf08..214e5aea8f 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -95,6 +95,8 @@ UM.PreferencesPage width: parent.width height: parent.height + flickableItem.flickableDirection: Flickable.VerticalFlick; + Column { //: Model used to check if a plugin exists From 2297a6e80ba9345b1a6426ffc7bcae8f92e61cf2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Apr 2017 13:05:39 +0200 Subject: [PATCH 49/90] Fixed inhertiance manager crashing if there is no parent --- cura/Settings/SettingInheritanceManager.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 2f81526813..49cf5c7c83 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -109,8 +109,11 @@ class SettingInheritanceManager(QObject): self._settings_with_inheritance_warning.remove(key) settings_with_inheritance_warning_changed = True - # Find the topmost parent (Assumed to be a category) parent = definitions[0].parent + if parent is None: + return + + # Find the topmost parent (Assumed to be a category) while parent.parent is not None: parent = parent.parent From fb0df3109c4d050cf623a4551cb7b6ac467cb46f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 24 Apr 2017 13:10:33 +0200 Subject: [PATCH 50/90] Fixed inhertiance manager getting update from a Category setting --- cura/Settings/SettingInheritanceManager.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 49cf5c7c83..ff0d1d81c0 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -110,12 +110,12 @@ class SettingInheritanceManager(QObject): settings_with_inheritance_warning_changed = True parent = definitions[0].parent - if parent is None: - return - # Find the topmost parent (Assumed to be a category) - while parent.parent is not None: - parent = parent.parent + if parent is not None: + while parent.parent is not None: + parent = parent.parent + else: + parent = definitions[0] # Already at a category if parent.key not in self._settings_with_inheritance_warning and has_overwritten_inheritance: # Category was not in the list yet, so needs to be added now. From 49bdb78219a4f1655c07f45c4acd87d8eb938f7a Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 13:11:04 +0200 Subject: [PATCH 51/90] Use cura. for imports instead of relative imports` Matches the style of the rest of the file. --- cura/CuraActions.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 0a1657e512..6c2aea5de1 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -13,9 +13,8 @@ from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.SetTransformOperation import SetTransformOperation -from .SetParentOperation import SetParentOperation -from .MultiplyObjectsJob import MultiplyObjectsJob - +from cura.SetParentOperation import SetParentOperation +from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation class CuraActions(QObject): From e571b8aeac6349131b9c9b8420b44de5a975e693 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 13:11:16 +0200 Subject: [PATCH 52/90] Remove superfluous return statement --- cura/CuraActions.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 6c2aea5de1..79c7679120 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -54,7 +54,6 @@ class CuraActions(QObject): def multiplySelection(self, count: int) -> None: job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, 8) job.start() - return ## Delete all selected objects. @pyqtSlot() From 78603bed635354b0907cf397dcd3e787e58161c8 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 13:12:00 +0200 Subject: [PATCH 53/90] Rename setSelectionExtruder to setExtruderForSelection This matches more closely with the naming of the other selection actions. --- cura/CuraActions.py | 5 ++++- resources/qml/Menus/ContextMenu.qml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 79c7679120..5c89232639 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -75,8 +75,11 @@ class CuraActions(QObject): op.addOperation(RemoveSceneNodeOperation(group_node)) op.push() + ## Set the extruder that should be used to print the selection. + # + # \param extruder_id The ID of the extruder stack to use for the selected objects. @pyqtSlot(str) - def setSelectionExtruder(self, extruder_id: str) -> None: + def setExtruderForSelection(self, extruder_id: str) -> None: operation = GroupedOperation() for node in Selection.getAllSelectedObjects(): if node.callDecoration("getActiveExtruder") == extruder_id: diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index a4285f1621..14395aba6c 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -32,7 +32,7 @@ Menu enabled: UM.Selection.hasSelection checkable: true checked: ExtruderManager.selectedObjectExtruders.indexOf(model.id) != -1 - onTriggered: CuraActions.setSelectionExtruder(model.id) + onTriggered: CuraActions.setExtruderForSelection(model.id) shortcut: "Ctrl+" + (model.index + 1) } onObjectAdded: base.insertItem(base.findItemIndex(extruderHeader) + index, object) From 8c4ec804e7c09dfbd78ea10ca2680fff7e6c7a87 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 13:12:21 +0200 Subject: [PATCH 54/90] Add type hinting to _onContextMenuRequested --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0ab3c1c1cf..5f71495f77 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1334,7 +1334,7 @@ class CuraApplication(QtApplication): Logger.log("e", "Could not check file %s: %s", file_url, e) return False - def _onContextMenuRequested(self, x, y): + def _onContextMenuRequested(self, x: float, y: float) -> None: # Ensure we select the object if we request a context menu over an object without having a selection. if not Selection.hasSelection(): node = self.getController().getScene().findObject(self.getRenderer().getRenderPass("selection").getIdAtPosition(x, y)) From 27256cae9e8c65689688aade431368194dcc6c86 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 13:12:36 +0200 Subject: [PATCH 55/90] Revert import change --- cura/Settings/ExtrudersModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/ExtrudersModel.py b/cura/Settings/ExtrudersModel.py index 26e425c116..62b1f0af2c 100644 --- a/cura/Settings/ExtrudersModel.py +++ b/cura/Settings/ExtrudersModel.py @@ -6,7 +6,7 @@ from PyQt5.QtCore import Qt, pyqtSignal, pyqtProperty, pyqtSlot import UM.Qt.ListModel from UM.Application import Application -from .ExtruderManager import ExtruderManager +from cura.Settings.ExtruderManager import ExtruderManager ## Model that holds extruders. # From bca27ad11fc34fbd2872d14da3dfc942d9052fec Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 13:13:00 +0200 Subject: [PATCH 56/90] Document findItemIndex function in ContextMenu --- resources/qml/Menus/ContextMenu.qml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 14395aba6c..43867a4cc1 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -114,12 +114,22 @@ Menu } } + // Find the index of an item in the list of child items of this menu. + // + // This is primarily intended as a helper function so we do not have to + // hard-code the position of the extruder selection actions. + // + // \param item The item to find the index of. + // + // \return The index of the item or -1 if it was not found. function findItemIndex(item) { for(var i in base.items) { if(base.items[i] == item) + { return i; + } } return -1; } From 2eae1cdf228048a8c5603ca43d54f7c5be8fa1e0 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 24 Apr 2017 14:28:10 +0200 Subject: [PATCH 57/90] Move support roof settings above support bottom settings This was deemed the most logical ordering. Contributes to issue CURA-3491. --- resources/definitions/fdmprinter.def.json | 268 +++++++++++----------- 1 file changed, 134 insertions(+), 134 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 1ae26bc40f..3cc47b2633 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -760,22 +760,6 @@ "settable_per_extruder": true, "children": { - "support_bottom_line_width": - { - "label": "Support Floor Line Width", - "description": "Width of a single support floor line.", - "unit": "mm", - "default_value": 0.4, - "minimum_value": "0.001", - "minimum_value_warning": "0.4 * machine_nozzle_size", - "maximum_value_warning": "2 * machine_nozzle_size", - "type": "float", - "enabled": "support_enable and support_bottom_enable", - "limit_to_extruder": "support_bottom_extruder_nr", - "value": "support_interface_line_width", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "support_roof_line_width": { "label": "Support Roof Line Width", @@ -791,6 +775,22 @@ "value": "support_interface_line_width", "settable_per_mesh": false, "settable_per_extruder": true + }, + "support_bottom_line_width": + { + "label": "Support Floor Line Width", + "description": "Width of a single support floor line.", + "unit": "mm", + "default_value": 0.4, + "minimum_value": "0.001", + "minimum_value_warning": "0.4 * machine_nozzle_size", + "maximum_value_warning": "2 * machine_nozzle_size", + "type": "float", + "enabled": "support_enable and support_bottom_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "value": "support_interface_line_width", + "settable_per_mesh": false, + "settable_per_extruder": true } } }, @@ -1972,22 +1972,6 @@ "settable_per_extruder": true, "children": { - "speed_support_bottom": - { - "label": "Support Floor Speed", - "description": "The speed at which the floor of support is printed. Printing it at lower speed can improve adhesion of support on top of your model.", - "unit": "mm/s", - "type": "float", - "default_value": 40, - "minimum_value": "0.1", - "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", - "maximum_value_warning": "150", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", - "limit_to_extruder": "support_bottom_extruder_nr", - "value": "speed_support_interface", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "speed_support_roof": { "label": "Support Roof Speed", @@ -2003,6 +1987,22 @@ "value": "speed_support_interface", "settable_per_mesh": false, "settable_per_extruder": true + }, + "speed_support_bottom": + { + "label": "Support Floor Speed", + "description": "The speed at which the floor of support is printed. Printing it at lower speed can improve adhesion of support on top of your model.", + "unit": "mm/s", + "type": "float", + "default_value": 40, + "minimum_value": "0.1", + "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)", + "maximum_value_warning": "150", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "value": "speed_support_interface", + "settable_per_mesh": false, + "settable_per_extruder": true } } } @@ -2293,22 +2293,6 @@ "settable_per_extruder": true, "children": { - "acceleration_support_bottom": - { - "label": "Support Floor Acceleration", - "description": "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model.", - "unit": "mm/s²", - "type": "float", - "default_value": 3000, - "value": "acceleration_support_interface", - "minimum_value": "0.1", - "minimum_value_warning": "100", - "maximum_value_warning": "10000", - "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", - "limit_to_extruder": "support_bottom_extruder_nr", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "acceleration_support_roof": { "label": "Support Roof Acceleration", @@ -2324,6 +2308,22 @@ "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true + }, + "acceleration_support_bottom": + { + "label": "Support Floor Acceleration", + "description": "The acceleration with which the floors of support are printed. Printing them at lower acceleration can improve adhesion of support on top of your model.", + "unit": "mm/s²", + "type": "float", + "default_value": 3000, + "value": "acceleration_support_interface", + "minimum_value": "0.1", + "minimum_value_warning": "100", + "maximum_value_warning": "10000", + "enabled": "resolveOrValue('acceleration_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true } } } @@ -2567,22 +2567,6 @@ "settable_per_extruder": true, "children": { - "jerk_support_bottom": - { - "label": "Support Floor Jerk", - "description": "The maximum instantaneous velocity change with which the floors of support are printed.", - "unit": "mm/s", - "type": "float", - "default_value": 20, - "value": "jerk_support_interface", - "minimum_value": "0.1", - "minimum_value_warning": "5", - "maximum_value_warning": "50", - "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", - "limit_to_extruder": "support_bottom_extruder_nr", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "jerk_support_roof": { "label": "Support Roof Jerk", @@ -2598,6 +2582,22 @@ "limit_to_extruder": "support_roof_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true + }, + "jerk_support_bottom": + { + "label": "Support Floor Jerk", + "description": "The maximum instantaneous velocity change with which the floors of support are printed.", + "unit": "mm/s", + "type": "float", + "default_value": 20, + "value": "jerk_support_interface", + "minimum_value": "0.1", + "minimum_value_warning": "5", + "maximum_value_warning": "50", + "enabled": "resolveOrValue('jerk_enabled') and extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "settable_per_mesh": false, + "settable_per_extruder": true } } } @@ -3042,10 +3042,10 @@ "settable_per_extruder": false, "children": { - "support_bottom_extruder_nr": + "support_roof_extruder_nr": { - "label": "Support Floor Extruder", - "description": "The extruder train to use for printing the floors of the support. This is used in multi-extrusion.", + "label": "Support Roof Extruder", + "description": "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", "value": "support_interface_extruder_nr", @@ -3053,10 +3053,10 @@ "settable_per_mesh": false, "settable_per_extruder": false }, - "support_roof_extruder_nr": + "support_bottom_extruder_nr": { - "label": "Support Roof Extruder", - "description": "The extruder train to use for printing the roofs of the support. This is used in multi-extrusion.", + "label": "Support Floor Extruder", + "description": "The extruder train to use for printing the floors of the support. This is used in multi-extrusion.", "type": "extruder", "default_value": "0", "value": "support_interface_extruder_nr", @@ -3297,17 +3297,6 @@ "settable_per_mesh": true, "children": { - "support_bottom_enable": - { - "label": "Enable Support Floor", - "description": "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support.", - "type": "bool", - "default_value": false, - "value": "support_interface_enable", - "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "support_enable", - "settable_per_mesh": true - }, "support_roof_enable": { "label": "Enable Support Roof", @@ -3318,6 +3307,17 @@ "limit_to_extruder": "support_roof_extruder_nr", "enabled": "support_enable", "settable_per_mesh": true + }, + "support_bottom_enable": + { + "label": "Enable Support Floor", + "description": "Generate a dense slab of material between the bottom of the support and the model. This will create a skin between the model and support.", + "type": "bool", + "default_value": false, + "value": "support_interface_enable", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "support_enable", + "settable_per_mesh": true } } }, @@ -3395,38 +3395,6 @@ "settable_per_extruder": true, "children": { - "support_bottom_density": - { - "label": "Support Floor Density", - "description": "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model.", - "unit": "%", - "type": "float", - "default_value": 100, - "minimum_value": "0", - "maximum_value": "100", - "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", - "settable_per_mesh": false, - "settable_per_extruder": true, - "children": - { - "support_bottom_line_distance": - { - "label": "Support Floor Line Distance", - "description": "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately.", - "unit": "mm", - "type": "float", - "default_value": 0.4, - "minimum_value": "0", - "minimum_value_warning": "support_bottom_line_width - 0.0001", - "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_bottom_pattern == 'grid' else (3 if support_bottom_pattern == 'triangles' else 1))", - "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", - "settable_per_mesh": false, - "settable_per_extruder": true - } - } - }, "support_roof_density": { "label": "Support Roof Density", @@ -3458,6 +3426,38 @@ "settable_per_extruder": true } } + }, + "support_bottom_density": + { + "label": "Support Floor Density", + "description": "The density of the floors of the support structure. A higher value results in better adhesion of the support on top of the model.", + "unit": "%", + "type": "float", + "default_value": 100, + "minimum_value": "0", + "maximum_value": "100", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true, + "children": + { + "support_bottom_line_distance": + { + "label": "Support Floor Line Distance", + "description": "Distance between the printed support floor lines. This setting is calculated by the Support Floor Density, but can be adjusted separately.", + "unit": "mm", + "type": "float", + "default_value": 0.4, + "minimum_value": "0", + "minimum_value_warning": "support_bottom_line_width - 0.0001", + "value": "0 if support_bottom_density == 0 else (support_bottom_line_width * 100) / support_bottom_density * (2 if support_bottom_pattern == 'grid' else (3 if support_bottom_pattern == 'triangles' else 1))", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true + } + } } } }, @@ -3482,27 +3482,6 @@ "settable_per_extruder": true, "children": { - "support_bottom_pattern": - { - "label": "Support Floor Pattern", - "description": "The pattern with which the floors of the support are printed.", - "type": "enum", - "options": - { - "lines": "Lines", - "grid": "Grid", - "triangles": "Triangles", - "concentric": "Concentric", - "concentric_3d": "Concentric 3D", - "zigzag": "Zig Zag" - }, - "default_value": "concentric", - "value": "support_interface_pattern", - "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", - "settable_per_mesh": false, - "settable_per_extruder": true - }, "support_roof_pattern": { "label": "Support Roof Pattern", @@ -3523,6 +3502,27 @@ "enabled": "extruderValue(support_bottom_extruder_nr, 'support_roof_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true + }, + "support_bottom_pattern": + { + "label": "Support Floor Pattern", + "description": "The pattern with which the floors of the support are printed.", + "type": "enum", + "options": + { + "lines": "Lines", + "grid": "Grid", + "triangles": "Triangles", + "concentric": "Concentric", + "concentric_3d": "Concentric 3D", + "zigzag": "Zig Zag" + }, + "default_value": "concentric", + "value": "support_interface_pattern", + "limit_to_extruder": "support_bottom_extruder_nr", + "enabled": "extruderValue(support_bottom_extruder_nr, 'support_bottom_enable') and support_enable", + "settable_per_mesh": false, + "settable_per_extruder": true } } }, From b4c557679cdbc95b8ed9ee7ea357245328cb8ab0 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 17:08:19 +0200 Subject: [PATCH 58/90] Change the selected extruder for all child nodes of a group Instead of setting the extruder for the group node, go through all children and set their extruders instead. Fixes extruder selection on groups. Contributes to CURA-3609 --- cura/CuraActions.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 5c89232639..64db7c9372 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -9,6 +9,7 @@ from UM.Event import CallFunctionEvent from UM.Application import Application from UM.Math.Vector import Vector from UM.Scene.Selection import Selection +from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.SetTransformOperation import SetTransformOperation @@ -81,9 +82,31 @@ class CuraActions(QObject): @pyqtSlot(str) def setExtruderForSelection(self, extruder_id: str) -> None: operation = GroupedOperation() + + nodes_to_change = [] for node in Selection.getAllSelectedObjects(): + # Do not change any nodes that already have the right extruder set. if node.callDecoration("getActiveExtruder") == extruder_id: continue + + # If the node is a group, apply the active extruder to all children of the group. + if node.callDecoration("isGroup"): + for grouped_node in BreadthFirstIterator(node): + if grouped_node.callDecoration("getActiveExtruder") == extruder_id: + continue + + if grouped_node.callDecoration("isGroup"): + continue + + nodes_to_change.append(grouped_node) + continue + + nodes_to_change.append(node) + + if not nodes_to_change: + return + + for node in nodes_to_change: operation.addOperation(SetObjectExtruderOperation(node, extruder_id)) operation.push() From 86d3cbadca3e0254aee754f7dcbf1e32c29b02a9 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 17:09:18 +0200 Subject: [PATCH 59/90] Also search through groups when figuring out the extruders of the selection Contributes to CURA-3609 --- cura/Settings/ExtruderManager.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 75fa1ece3a..43d580001f 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -9,6 +9,7 @@ from UM.Logger import Logger from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection +from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Settings.ContainerRegistry import ContainerRegistry #Finding containers by ID. from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.SettingFunction import SettingFunction @@ -129,7 +130,21 @@ class ExtruderManager(QObject): def selectedObjectExtruders(self) -> List[str]: if not self._selected_object_extruders: object_extruders = set() + + # First, build a list of the actual selected objects (including children of groups, excluding group nodes) + selected_nodes = [] for node in Selection.getAllSelectedObjects(): + if node.callDecoration("isGroup"): + for grouped_node in BreadthFirstIterator(node): + if grouped_node.callDecoration("isGroup"): + continue + + selected_nodes.append(grouped_node) + else: + selected_nodes.append(node) + + # Then, figure out which nodes are used by those selected nodes. + for node in selected_nodes: extruder = node.callDecoration("getActiveExtruder") if extruder: object_extruders.add(extruder) From 89310cb41e669ff3adad1600e443a90f1a71b97f Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 17:10:00 +0200 Subject: [PATCH 60/90] Select the group when right clicking an object that is part of a group Instead of selecting the individual object. Contributes to CURA-3609 --- cura/CuraApplication.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 5f71495f77..5786c82147 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1339,4 +1339,7 @@ class CuraApplication(QtApplication): if not Selection.hasSelection(): node = self.getController().getScene().findObject(self.getRenderer().getRenderPass("selection").getIdAtPosition(x, y)) if node: + while(node.getParent() and node.getParent().callDecoration("isGroup")): + node = node.getParent() + Selection.add(node) From ada614e413dbaaa9b40bd60ca58c2c0ebd59bb12 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Mon, 24 Apr 2017 17:11:37 +0200 Subject: [PATCH 61/90] Workaround a tiny display issue with checkable MenuItems If there are no changes to make, we still need to reset the selected extruders. This is a workaround for checked menu items being deselected while they actually should still be selected. Contributes to CURA-3609 --- cura/CuraActions.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 64db7c9372..eeebd3b6b2 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -17,6 +17,7 @@ from UM.Operations.SetTransformOperation import SetTransformOperation from cura.SetParentOperation import SetParentOperation from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation +from cura.Settings.ExtruderManager import ExtruderManager class CuraActions(QObject): def __init__(self, parent = None): @@ -104,6 +105,10 @@ class CuraActions(QObject): nodes_to_change.append(node) if not nodes_to_change: + # If there are no changes to make, we still need to reset the selected extruders. + # This is a workaround for checked menu items being deselected while still being + # selected. + ExtruderManager.getInstance().resetSelectedObjectExtruders() return for node in nodes_to_change: From 15593de404396ef3c0e47060bbf6372622cdafba Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 24 Apr 2017 17:31:07 +0200 Subject: [PATCH 62/90] Fix extruder number dependency of support roof pattern It was depending on support bottom extruder. Contributes to issue CURA-3491. --- 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 3cc47b2633..40467ecec9 100755 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3498,8 +3498,8 @@ }, "default_value": "concentric", "value": "support_interface_pattern", - "limit_to_extruder": "support_bottom_extruder_nr", - "enabled": "extruderValue(support_bottom_extruder_nr, 'support_roof_enable') and support_enable", + "limit_to_extruder": "support_roof_extruder_nr", + "enabled": "extruderValue(support_roof_extruder_nr, 'support_roof_enable') and support_enable", "settable_per_mesh": false, "settable_per_extruder": true }, From 09f23f5f91070fd7d24673b98bcaec12f4817ef7 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 25 Apr 2017 11:31:59 +0200 Subject: [PATCH 63/90] Styling fixes in Toolbar QML --- resources/qml/Toolbar.qml | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 60fc6fd723..6363aa4e42 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -8,26 +8,30 @@ import QtQuick.Layouts 1.1 import UM 1.0 as UM -Item { +Item +{ id: base; width: buttons.width; height: buttons.height property int activeY - ColumnLayout { + Column + { id: buttons; anchors.bottom: parent.bottom; anchors.left: parent.left; spacing: UM.Theme.getSize("button_lining").width - Repeater { + Repeater + { id: repeat model: UM.ToolModel { } - Button { + Button + { text: model.name iconSource: UM.Theme.getIcon(model.icon); @@ -45,9 +49,11 @@ Item { } //Workaround since using ToolButton"s onClicked would break the binding of the checked property, instead //just catch the click so we do not trigger that behaviour. - MouseArea { + MouseArea + { anchors.fill: parent; - onClicked: { + onClicked: + { forceActiveFocus() //First grab focus, so all the text fields are updated if(parent.checked) { @@ -63,7 +69,8 @@ Item { } } - UM.PointingRectangle { + UM.PointingRectangle + { id: panelBorder; anchors.left: parent.right; @@ -75,7 +82,8 @@ Item { target: Qt.point(parent.right, base.activeY + UM.Theme.getSize("button").height/2) arrowSize: UM.Theme.getSize("default_arrow").width - width: { + width: + { if (panel.item && panel.width > 0){ return Math.max(panel.width + 2 * UM.Theme.getSize("default_margin").width) } @@ -90,7 +98,8 @@ Item { color: UM.Theme.getColor("lining"); - UM.PointingRectangle { + UM.PointingRectangle + { id: panelBackground; color: UM.Theme.getColor("tool_panel_background"); @@ -105,7 +114,8 @@ Item { } } - Loader { + Loader + { id: panel x: UM.Theme.getSize("default_margin").width; @@ -116,6 +126,8 @@ Item { } } + // This rectangle displays the information about the current angle etc. when + // dragging a tool handle. Rectangle { x: -base.x + base.mouseX + UM.Theme.getSize("default_margin").width From c85f63512500e47c0888ec5bc02bfc33cf826d37 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 25 Apr 2017 16:09:51 +0200 Subject: [PATCH 64/90] Add support for overriding the background color of a Tool button Contributes to CURA-3577 --- resources/themes/cura/styles.qml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index a7c7dcb6cd..625ca4996c 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -206,7 +206,10 @@ QtObject { property bool down: control.pressed || (control.checkable && control.checked); color: { - if(control.checkable && control.checked && control.hovered) { + if(control.customColor !== undefined && control.customColor !== null) { + return control.customColor + } + else if(control.checkable && control.checked && control.hovered) { return Theme.getColor("button_active_hover"); } else if(control.pressed || (control.checkable && control.checked)) { return Theme.getColor("button_active"); From 48baf272b4caaaf6c99dcec1302a341a77629fca Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 25 Apr 2017 16:10:44 +0200 Subject: [PATCH 65/90] Fix the extruder icons to have a proper square aspect ratio Contributes to CURA-3577 --- .../cura/icons/material_not_selected.svg | 90 +++++++++++++++--- .../themes/cura/icons/material_selected.svg | 91 ++++++++++++++++--- 2 files changed, 153 insertions(+), 28 deletions(-) diff --git a/resources/themes/cura/icons/material_not_selected.svg b/resources/themes/cura/icons/material_not_selected.svg index 2d4fb7cfd3..9b3cad88bd 100644 --- a/resources/themes/cura/icons/material_not_selected.svg +++ b/resources/themes/cura/icons/material_not_selected.svg @@ -1,15 +1,77 @@ - - - - Artboard 3 - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + Artboard 3 + + + + + + Artboard 3 + Created with Sketch. + + + + + + + - \ No newline at end of file + + diff --git a/resources/themes/cura/icons/material_selected.svg b/resources/themes/cura/icons/material_selected.svg index 87ffdf55da..6589eac416 100644 --- a/resources/themes/cura/icons/material_selected.svg +++ b/resources/themes/cura/icons/material_selected.svg @@ -1,15 +1,78 @@ - - - - Artboard 3 Copy - Created with Sketch. - - - - - - - - + + + + + + image/svg+xml + + Artboard 3 Copy + + + + + + Artboard 3 Copy + Created with Sketch. + + + + + + + - \ No newline at end of file + + From 89e6313143589500a6f9cd77475ee79de0f2d845 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 25 Apr 2017 16:11:31 +0200 Subject: [PATCH 66/90] Add buttons to select the extruder for the selection to the toolbar Contributes to CURA-3577 --- resources/qml/ExtruderButton.qml | 86 ++++++++++++++++++++++++++++++++ resources/qml/Toolbar.qml | 22 +++++++- 2 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 resources/qml/ExtruderButton.qml diff --git a/resources/qml/ExtruderButton.qml b/resources/qml/ExtruderButton.qml new file mode 100644 index 0000000000..8a088890a9 --- /dev/null +++ b/resources/qml/ExtruderButton.qml @@ -0,0 +1,86 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Button +{ + id: base + + property var extruder; + + text: catalog.i18ncp("@label", "Print Selected Model with %1", "Print Selected Models With %1", UM.Selection.selectionCount).arg(extruder.name) + + style: UM.Theme.styles.tool_button; + iconSource: checked ? UM.Theme.getIcon("material_selected") : UM.Theme.getIcon("material_not_selected"); + + checkable: true; + checked: ExtruderManager.selectedObjectExtruders.indexOf(extruder.id) != -1 + enabled: UM.Selection.hasSelection + + property color customColor: base.hovered ? UM.Theme.getColor("button_hover") : UM.Theme.getColor("button"); + + Rectangle + { + anchors.fill: parent + anchors.margins: UM.Theme.getSize("default_lining").width; + + color: "transparent" + + border.width: base.checked ? UM.Theme.getSize("default_lining").width : 0; + border.color: UM.Theme.getColor("button_text") + } + + Item + { + anchors + { + right: parent.right; + top: parent.top; + margins: UM.Theme.getSize("default_lining").width * 3 + } + width: UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("default_margin").height + + Text + { + anchors.centerIn: parent; + text: index + 1; + color: parent.enabled ? UM.Theme.getColor("button_text") : UM.Theme.getColor("button_disabled_text") + font: UM.Theme.getFont("default_bold"); + } + } + + Rectangle + { + anchors + { + left: parent.left; + top: parent.top; + margins: UM.Theme.getSize("default_lining").width * 3 + } + + color: model.color + + width: UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("default_margin").height + + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining"); + } + + // See line 51, same workaround + MouseArea + { + anchors.fill: parent; + onClicked: + { + forceActiveFocus() //First grab focus, so all the text fields are updated + CuraActions.setExtruderForSelection(extruder.id); + } + } +} diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 6363aa4e42..0f930d532b 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -6,7 +6,8 @@ import QtQuick.Controls 1.1 import QtQuick.Controls.Styles 1.1 import QtQuick.Layouts 1.1 -import UM 1.0 as UM +import UM 1.2 as UM +import Cura 1.0 as Cura Item { @@ -67,6 +68,14 @@ Item } } } + + Item { height: UM.Theme.getSize("default_margin").height; width: 1; visible: machineExtruderCount.properties.value > 1 } + + Repeater + { + model: Cura.ExtrudersModel { id: extrudersModel } + ExtruderButton { extruder: model } + } } UM.PointingRectangle @@ -147,4 +156,15 @@ Item visible: toolHint.text != ""; } + + UM.SettingPropertyProvider + { + id: machineExtruderCount + + containerStackId: Cura.MachineManager.activeMachineId + key: "machine_extruder_count" + watchedProperties: [ "value" ] + } + + UM.I18nCatalog { id: catalog; name: "cura" } } From 78221738817dbc5b19873cbc1156cf157317f8cf Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 25 Apr 2017 16:12:03 +0200 Subject: [PATCH 67/90] Remove extruder selection from per-object settings tool Contributes to CURA-3577 --- .../PerObjectSettingsPanel.qml | 123 ------------------ 1 file changed, 123 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index cb65da635b..c3c7249155 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -26,129 +26,6 @@ Item { spacing: UM.Theme.getSize("default_margin").height - Row - { - spacing: UM.Theme.getSize("default_margin").width - Label - { - text: catalog.i18nc("@label Followed by extruder selection drop-down.", "Print model with") - anchors.verticalCenter: extruderSelector.verticalCenter - - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - visible: extruderSelector.visible - } - ComboBox - { - id: extruderSelector - - model: Cura.ExtrudersModel - { - id: extrudersModel - onModelChanged: extruderSelector.color = extrudersModel.getItem(extruderSelector.currentIndex).color - } - property string color: extrudersModel.getItem(extruderSelector.currentIndex).color - visible: machineExtruderCount.properties.value > 1 - textRole: "name" - width: UM.Theme.getSize("setting_control").width - height: UM.Theme.getSize("section").height - MouseArea - { - anchors.fill: parent - acceptedButtons: Qt.NoButton - onWheel: wheel.accepted = true; - } - - style: ComboBoxStyle - { - background: Rectangle - { - color: - { - if(extruderSelector.hovered || base.activeFocus) - { - return UM.Theme.getColor("setting_control_highlight"); - } - else - { - return UM.Theme.getColor("setting_control"); - } - } - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("setting_control_border") - } - label: Item - { - Rectangle - { - id: swatch - height: UM.Theme.getSize("setting_control").height / 2 - width: height - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_lining").width - anchors.verticalCenter: parent.verticalCenter - - color: extruderSelector.color - border.width: UM.Theme.getSize("default_lining").width - border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : UM.Theme.getColor("setting_control_border") - } - Label - { - anchors.left: swatch.right - anchors.leftMargin: UM.Theme.getSize("default_lining").width - anchors.right: downArrow.left - anchors.rightMargin: UM.Theme.getSize("default_lining").width - anchors.verticalCenter: parent.verticalCenter - - text: extruderSelector.currentText - font: UM.Theme.getFont("default") - color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") - - elide: Text.ElideRight - verticalAlignment: Text.AlignVCenter - } - - UM.RecolorImage - { - id: downArrow - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 - anchors.verticalCenter: parent.verticalCenter - - source: UM.Theme.getIcon("arrow_bottom") - width: UM.Theme.getSize("standard_arrow").width - height: UM.Theme.getSize("standard_arrow").height - sourceSize.width: width + 5 - sourceSize.height: width + 5 - - color: UM.Theme.getColor("setting_control_text") - } - } - } - - onActivated: - { - UM.ActiveTool.setProperty("SelectedActiveExtruder", extrudersModel.getItem(index).id); - extruderSelector.color = extrudersModel.getItem(index).color; - } - onModelChanged: updateCurrentIndex(); - - function updateCurrentIndex() - { - for(var i = 0; i < extrudersModel.rowCount(); ++i) - { - if(extrudersModel.getItem(i).id == UM.ActiveTool.properties.getValue("SelectedActiveExtruder")) - { - extruderSelector.currentIndex = i; - extruderSelector.color = extrudersModel.getItem(i).color; - return; - } - } - extruderSelector.currentIndex = -1; - } - } - } - Column { // This is to ensure that the panel is first increasing in size up to 200 and then shows a scrollbar. From 0fad973181209d2f8680cf434de21d465d40f0fd Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 25 Apr 2017 16:12:36 +0200 Subject: [PATCH 68/90] Never enable the per-object tool when in simple mode Contributes to CURA-3577 --- plugins/PerObjectSettingsTool/PerObjectSettingsTool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index 865401804c..b2d14942ba 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -112,4 +112,4 @@ class PerObjectSettingsTool(Tool): self._single_model_selected = False # Group is selected, so tool needs to be disabled else: self._single_model_selected = True - Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, (self._advanced_mode or self._multi_extrusion) and self._single_model_selected) \ No newline at end of file + Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._advanced_mode and self._single_model_selected) From 0b9f451103cd26abbd05c6e9c509f6755c4e16b9 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 25 Apr 2017 18:15:04 +0200 Subject: [PATCH 69/90] Apply color to layerview legend labels directly The Label style property should not be confused with e TextField style property --- plugins/LayerView/LayerView.qml | 8 ++++---- resources/themes/cura/styles.qml | 7 ------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 0453e3468e..5652637c99 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -58,7 +58,7 @@ Item anchors.left: parent.left text: catalog.i18nc("@label","View Mode: Layers") font.bold: true - style: UM.Theme.styles.text + color: UM.Theme.getColor("text") } Label @@ -76,7 +76,7 @@ Item text: catalog.i18nc("@label","Color scheme") visible: !UM.LayerView.compatibilityMode Layout.fillWidth: true - style: UM.Theme.styles.text + color: UM.Theme.getColor("text") } ListModel // matches LayerView.py @@ -307,7 +307,7 @@ Item Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width visible: view_settings.show_legend - style: UM.Theme.styles.text + color: UM.Theme.getColor("text") } Label @@ -330,7 +330,7 @@ Item Layout.preferredHeight: UM.Theme.getSize("layerview_row").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width visible: view_settings.show_legend - style: UM.Theme.styles.text + color: UM.Theme.getColor("text") } } diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index 51e6501d29..a7c7dcb6cd 100755 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -632,13 +632,6 @@ QtObject { } } - property Component text: Component { - TextFieldStyle { - textColor: Theme.getColor("text"); - font: Theme.getFont("default"); - } - } - property Component sidebar_action_button: Component { ButtonStyle { From 49880d54adde69176d503100f0d6dfc55c328a9e Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 25 Apr 2017 18:45:43 +0200 Subject: [PATCH 70/90] Remove code repetition while touching up layout --- plugins/LayerView/LayerView.qml | 210 +++++++++++++------------------- 1 file changed, 83 insertions(+), 127 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 5652637c99..8a78e751b5 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -175,100 +175,67 @@ Item visible: !UM.LayerView.compatibilityMode enabled: index + 1 <= 4 Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width style: UM.Theme.styles.checkbox } } - CheckBox { - checked: view_settings.show_travel_moves - onClicked: { - UM.Preferences.setValue("layerview/show_travel_moves", checked); + Repeater { + model: ListModel { + id: typesLegenModel + Component.onCompleted: + { + typesLegenModel.append({ + label: catalog.i18nc("@label", "Show Travels"), + initialValue: view_settings.show_travel_moves, + preference: "layerview/show_travel_moves", + colorId: "layerview_move_combing" + }); + typesLegenModel.append({ + label: catalog.i18nc("@label", "Show Helpers"), + initialValue: view_settings.show_helpers, + preference: "layerview/show_helpers", + colorId: "layerview_support" + }); + typesLegenModel.append({ + label: catalog.i18nc("@label", "Show Shell"), + initialValue: view_settings.show_skin, + preference: "layerview/show_skin", + colorId: "layerview_inset_0" + }); + typesLegenModel.append({ + label: catalog.i18nc("@label", "Show Infill"), + initialValue: view_settings.show_infill, + preference: "layerview/show_infill", + colorId: "layerview_infill" + }); + } } - text: catalog.i18nc("@label", "Show Travels") - Rectangle { - anchors.top: parent.top - anchors.topMargin: 2 - anchors.right: parent.right - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor("layerview_move_combing") - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend + + CheckBox { + checked: model.initialValue + onClicked: { + UM.Preferences.setValue(model.preference, checked); + } + text: label + Rectangle { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor(model.colorId) + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + style: UM.Theme.styles.checkbox } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - style: UM.Theme.styles.checkbox - } - CheckBox { - checked: view_settings.show_helpers - onClicked: { - UM.Preferences.setValue("layerview/show_helpers", checked); - } - text: catalog.i18nc("@label", "Show Helpers") - Rectangle { - anchors.top: parent.top - anchors.topMargin: 2 - anchors.right: parent.right - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor("layerview_support") - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend - } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - style: UM.Theme.styles.checkbox - } - CheckBox { - checked: view_settings.show_skin - onClicked: { - UM.Preferences.setValue("layerview/show_skin", checked); - } - text: catalog.i18nc("@label", "Show Shell") - Rectangle { - anchors.top: parent.top - anchors.topMargin: 2 - anchors.right: parent.right - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor("layerview_inset_0") - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend - } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - style: UM.Theme.styles.checkbox - } - CheckBox { - checked: view_settings.show_infill - onClicked: { - UM.Preferences.setValue("layerview/show_infill", checked); - } - text: catalog.i18nc("@label", "Show Infill") - Rectangle { - anchors.top: parent.top - anchors.topMargin: 2 - anchors.right: parent.right - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor("layerview_infill") - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend - } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - style: UM.Theme.styles.checkbox } + CheckBox { checked: view_settings.only_show_top_layers onClicked: { @@ -288,51 +255,40 @@ Item style: UM.Theme.styles.checkbox } - Label - { - id: topBottomLabel - anchors.left: parent.left - text: catalog.i18nc("@label","Top / Bottom") - Rectangle { - anchors.top: parent.top - anchors.topMargin: 2 - anchors.right: parent.right - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor("layerview_skin") - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") + Repeater { + model: ListModel { + id: typesLegenModelNoCheck + Component.onCompleted: + { + typesLegenModelNoCheck.append({ + label: catalog.i18nc("@label", "Top / Bottom"), + colorId: "layerview_skin" + }); + typesLegenModelNoCheck.append({ + label: catalog.i18nc("@label", "Inner Wall"), + colorId: "layerview_inset_x" + }); + } } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - visible: view_settings.show_legend - color: UM.Theme.getColor("text") - } - Label - { - id: innerWallLabel - anchors.left: parent.left - text: catalog.i18nc("@label","Inner Wall") - Rectangle { - anchors.top: parent.top - anchors.topMargin: 2 - anchors.right: parent.right - width: UM.Theme.getSize("layerview_legend_size").width - height: UM.Theme.getSize("layerview_legend_size").height - color: UM.Theme.getColor("layerview_inset_x") - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: view_settings.show_legend + Label { + text: label + Rectangle { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: UM.Theme.getColor(model.colorId) + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: view_settings.show_legend + } + Layout.fillWidth: true + Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height + Layout.preferredWidth: UM.Theme.getSize("layerview_row").width + color: UM.Theme.getColor("text") } - Layout.fillWidth: true - Layout.preferredHeight: UM.Theme.getSize("layerview_row").height - Layout.preferredWidth: UM.Theme.getSize("layerview_row").width - visible: view_settings.show_legend - color: UM.Theme.getColor("text") } - } Item From 9371b28cb3096edc48c20ee8009ac701045be111 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 25 Apr 2017 18:55:25 +0200 Subject: [PATCH 71/90] Add color swatch for "by material" view style and show proper extruder names --- plugins/LayerView/LayerView.qml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/plugins/LayerView/LayerView.qml b/plugins/LayerView/LayerView.qml index 8a78e751b5..3078b278df 100755 --- a/plugins/LayerView/LayerView.qml +++ b/plugins/LayerView/LayerView.qml @@ -7,6 +7,7 @@ import QtQuick.Layouts 1.1 import QtQuick.Controls.Styles 1.1 import UM 1.0 as UM +import Cura 1.0 as Cura Item { @@ -164,16 +165,26 @@ Item } Repeater { - model: UM.LayerView.extruderCount + model: Cura.ExtrudersModel{} CheckBox { checked: view_settings.extruder_opacities[index] > 0.5 || view_settings.extruder_opacities[index] == undefined || view_settings.extruder_opacities[index] == "" onClicked: { view_settings.extruder_opacities[index] = checked ? 1.0 : 0.0 UM.Preferences.setValue("layerview/extruder_opacities", view_settings.extruder_opacities.join("|")); } - text: catalog.i18nc("@label", "Extruder %1").arg(index + 1) + text: model.name visible: !UM.LayerView.compatibilityMode enabled: index + 1 <= 4 + Rectangle { + anchors.verticalCenter: parent.verticalCenter + anchors.right: parent.right + width: UM.Theme.getSize("layerview_legend_size").width + height: UM.Theme.getSize("layerview_legend_size").height + color: model.color + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: !view_settings.show_legend + } Layout.fillWidth: true Layout.preferredHeight: UM.Theme.getSize("layerview_row").height + UM.Theme.getSize("default_lining").height Layout.preferredWidth: UM.Theme.getSize("layerview_row").width From f573802e8db0ef16afae527cd307cd4931d7bae5 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 26 Apr 2017 13:01:14 +0200 Subject: [PATCH 72/90] Fix to make the extruders line up below the label CURA-3609 --- resources/qml/Menus/ContextMenu.qml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 43867a4cc1..d5a30a7875 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -35,12 +35,12 @@ Menu onTriggered: CuraActions.setExtruderForSelection(model.id) shortcut: "Ctrl+" + (model.index + 1) } - onObjectAdded: base.insertItem(base.findItemIndex(extruderHeader) + index, object) + onObjectAdded: base.insertItem( index, object) onObjectRemoved: base.removeItem(object) } // Global actions - MenuSeparator { } + MenuSeparator {} MenuItem { action: Cura.Actions.selectAll; } MenuItem { action: Cura.Actions.arrangeAll; } MenuItem { action: Cura.Actions.deleteAll; } @@ -49,7 +49,7 @@ Menu MenuItem { action: Cura.Actions.resetAll; } // Group actions - MenuSeparator { } + MenuSeparator {} MenuItem { action: Cura.Actions.groupObjects; } MenuItem { action: Cura.Actions.mergeObjects; } MenuItem { action: Cura.Actions.unGroupObjects; } From d0a95426cb797503aa347d4aa43c5a2bbfbae156 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 26 Apr 2017 13:19:01 +0200 Subject: [PATCH 73/90] Remove space.. --- resources/qml/Menus/ContextMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index d5a30a7875..8d1a6dc02c 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -35,7 +35,7 @@ Menu onTriggered: CuraActions.setExtruderForSelection(model.id) shortcut: "Ctrl+" + (model.index + 1) } - onObjectAdded: base.insertItem( index, object) + onObjectAdded: base.insertItem(index, object) onObjectRemoved: base.removeItem(object) } From b4f27f0af7c1fd640638e77f773a84b4a9781f47 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 26 Apr 2017 16:17:54 +0200 Subject: [PATCH 74/90] Remove checkable property and MouseArea in favor of onClicked on the button It turns out, setting checkable: true causes binding breakage. Without checkable, checked still works and we can use onClicked of the button directly. --- resources/qml/ExtruderButton.qml | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/resources/qml/ExtruderButton.qml b/resources/qml/ExtruderButton.qml index 8a088890a9..ba503dba2b 100644 --- a/resources/qml/ExtruderButton.qml +++ b/resources/qml/ExtruderButton.qml @@ -18,7 +18,6 @@ Button style: UM.Theme.styles.tool_button; iconSource: checked ? UM.Theme.getIcon("material_selected") : UM.Theme.getIcon("material_not_selected"); - checkable: true; checked: ExtruderManager.selectedObjectExtruders.indexOf(extruder.id) != -1 enabled: UM.Selection.hasSelection @@ -73,14 +72,9 @@ Button border.color: UM.Theme.getColor("lining"); } - // See line 51, same workaround - MouseArea + onClicked: { - anchors.fill: parent; - onClicked: - { - forceActiveFocus() //First grab focus, so all the text fields are updated - CuraActions.setExtruderForSelection(extruder.id); - } + forceActiveFocus() //First grab focus, so all the text fields are updated + CuraActions.setExtruderForSelection(extruder.id); } } From 80bf6988caed91b082a644084929a775fe412eee Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 26 Apr 2017 16:18:14 +0200 Subject: [PATCH 75/90] Remove unnecessary Catalog and SettingPropertyProvider --- resources/qml/Toolbar.qml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 0f930d532b..5100a0dacb 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -69,10 +69,11 @@ Item } } - Item { height: UM.Theme.getSize("default_margin").height; width: 1; visible: machineExtruderCount.properties.value > 1 } + Item { height: UM.Theme.getSize("default_margin").height; width: 1; visible: extruders.count > 0 } Repeater { + id: extruders model: Cura.ExtrudersModel { id: extrudersModel } ExtruderButton { extruder: model } } @@ -156,15 +157,4 @@ Item visible: toolHint.text != ""; } - - UM.SettingPropertyProvider - { - id: machineExtruderCount - - containerStackId: Cura.MachineManager.activeMachineId - key: "machine_extruder_count" - watchedProperties: [ "value" ] - } - - UM.I18nCatalog { id: catalog; name: "cura" } } From 60339eb44bced2362277623c749faad84999a6c8 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Wed, 26 Apr 2017 16:18:23 +0200 Subject: [PATCH 76/90] Minor codestyle fix --- resources/themes/cura/styles.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index 625ca4996c..899ea3cf79 100644 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -208,8 +208,7 @@ QtObject { color: { if(control.customColor !== undefined && control.customColor !== null) { return control.customColor - } - else if(control.checkable && control.checked && control.hovered) { + } else if(control.checkable && control.checked && control.hovered) { return Theme.getColor("button_active_hover"); } else if(control.pressed || (control.checkable && control.checked)) { return Theme.getColor("button_active"); From 58a857403ce68ace7ccc3537a712b736d8b5f384 Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 27 Apr 2017 16:37:01 +0600 Subject: [PATCH 77/90] Added resetting of theme --- resources/qml/Preferences/GeneralPage.qml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 0cba617456..b135b31419 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -25,6 +25,17 @@ UM.PreferencesPage } } + function setDefaultTheme(defaultThemeCode) + { + for(var i = 0; i < themeList.count; i++) + { + if (themeComboBox.model.get(i).code == defaultThemeCode) + { + themeComboBox.currentIndex = i + } + } + } + function setDefaultDiscardOrKeepProfile(code) { for (var i = 0; i < choiceOnProfileOverrideDropDownButton.model.count; i++) @@ -55,6 +66,10 @@ UM.PreferencesPage var defaultLanguage = UM.Preferences.getValue("general/language") setDefaultLanguage(defaultLanguage) + UM.Preferences.resetPreference("general/theme") + var defaultTheme = UM.Preferences.getValue("general/theme") + setDefaultTheme(defaultTheme) + UM.Preferences.resetPreference("physics/automatic_push_free") pushFreeCheckbox.checked = boolCheck(UM.Preferences.getValue("physics/automatic_push_free")) UM.Preferences.resetPreference("physics/automatic_drop_down") From 4f446bfcbc95c510a29b1c103bdc606c968c76fd Mon Sep 17 00:00:00 2001 From: Victor Larchenko Date: Thu, 27 Apr 2017 16:44:43 +0600 Subject: [PATCH 78/90] Added filament cost keyword replacement --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 4a1d280aeb..f32993fd20 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -446,8 +446,7 @@ class CuraEngineBackend(QObject, Backend): replaced = line.replace("{print_time}", str(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601))) replaced = replaced.replace("{filament_amount}", str(Application.getInstance().getPrintInformation().materialLengths)) replaced = replaced.replace("{filament_weight}", str(Application.getInstance().getPrintInformation().materialWeights)) - # TODO: calculate filament cost - replaced = replaced.replace("{filament_cost}", "Not yet implemented") + replaced = replaced.replace("{filament_cost}", str(Application.getInstance().getPrintInformation().materialCosts)) replaced = replaced.replace("{jobname}", str(Application.getInstance().getPrintInformation().jobName)) self._scene.gcode_list[self._scene.gcode_list.index(line)] = replaced From 98aca201977a6760ded9dffc6524e8f79409c8d1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 30 Apr 2017 22:27:07 +0200 Subject: [PATCH 79/90] Fix hover effect on "enable support" checkbox --- resources/qml/SidebarSimple.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 8f43e411ff..915530bbaf 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -240,6 +240,8 @@ Item CheckBox { id: enableSupportCheckBox + property alias _hovered: enableSupportMouseArea.containsMouse + anchors.top: parent.top anchors.left: enableSupportLabel.right anchors.leftMargin: UM.Theme.getSize("default_margin").width From 0c6a5328c8a1e1f4fcc986d8d904b4023de7e939 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 30 Apr 2017 22:52:54 +0200 Subject: [PATCH 80/90] Add hover effect to mode switch control While simplifying theme additions --- resources/qml/Sidebar.qml | 14 ++++++++++++-- resources/themes/cura/styles.qml | 30 ++++++++++++++++++------------ resources/themes/cura/theme.json | 17 +++++++++++------ 3 files changed, 41 insertions(+), 20 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index ba5106c767..68427cad8c 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -412,7 +412,7 @@ Rectangle { id: toggleLeftText anchors.right: modeToggleSwitch.left - anchors.rightMargin: UM.Theme.getSize("toggle_button_text_anchoring_margin").width + anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter text: "" color: UM.Theme.getColor("toggle_active_text") @@ -438,9 +438,19 @@ Rectangle id: modeToggleSwitch checked: false anchors.right: toggleRightText.left - anchors.rightMargin: UM.Theme.getSize("toggle_button_text_anchoring_margin").width + anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter + property alias _hovered: enableSupportMouseArea.containsMouse + + MouseArea + { + id: enableSupportMouseArea + anchors.fill: parent + hoverEnabled: true + acceptedButtons: Qt.NoButton + } + onClicked: { var index = 0; diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index 899ea3cf79..9d302c3494 100755 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -11,16 +11,22 @@ QtObject { property Component toggle_button: Component { SwitchStyle { groove: Rectangle { - implicitWidth: UM.Theme.getSize("toggle_button_background_implicit_size").width - implicitHeight: UM.Theme.getSize("toggle_button_background_implicit_size").height - radius: UM.Theme.getSize("toggle_button_radius").width - border.color: { - if (control.pressed || (control.checkable && control.checked)) { - return UM.Theme.getColor("sidebar_header_active"); - } else if(control.hovered) { - return UM.Theme.getColor("sidebar_header_hover"); + implicitWidth: UM.Theme.getSize("toggle_button").width + implicitHeight: UM.Theme.getSize("toggle_button").height + radius: implicitHeight / 2 + color: { + if(control.hovered || control._hovered) { + return UM.Theme.getColor("toggle_button_hover"); } else { - return UM.Theme.getColor("sidebar_header_bar"); + return UM.Theme.getColor("toggle_button"); + } + } + Behavior on color { ColorAnimation { duration: 50; } } + border.color: { + if(control.hovered || control._hovered) { + return UM.Theme.getColor("toggle_button_border_hover"); + } else { + return UM.Theme.getColor("toggle_button_border"); } } Behavior on border.color { ColorAnimation { duration: 50; } } @@ -28,9 +34,9 @@ QtObject { } handle: Rectangle { - implicitWidth: UM.Theme.getSize("toggle_button_knob_implicit_size").width - implicitHeight: UM.Theme.getSize("toggle_button_knob_implicit_size").height - radius: UM.Theme.getSize("toggle_button_radius").width + implicitWidth: implicitHeight + implicitHeight: UM.Theme.getSize("toggle_button").height + radius: implicitHeight / 2 color: { if (control.pressed || (control.checkable && control.checked)) { diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 084ee27bb2..531b233fec 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -175,6 +175,15 @@ "checkbox_mark": [24, 41, 77, 255], "checkbox_text": [24, 41, 77, 255], + "toggle_button": [255, 255, 255, 255], + "toggle_button_hover": [255, 255, 255, 255], + "toggle_button_border": [127, 127, 127, 255], + "toggle_button_border_hover": [12, 169, 227, 255], + "toggle_button_handle": [24, 41, 77, 255], + "toggle_button_text": [24, 41, 77, 255], + "toggle_button_text_hover": [24, 41, 77, 255], + "toggle_button_text_selected": [24, 41, 77, 255], + "tooltip": [12, 169, 227, 255], "tooltip_text": [255, 255, 255, 255], @@ -301,6 +310,7 @@ "layerview_row_spacing": [0.0, 0.5], "checkbox": [2.0, 2.0], + "toggle_button": [2.0, 1.0], "tooltip": [20.0, 10.0], "tooltip_margins": [1.0, 1.0], @@ -319,11 +329,6 @@ "infill_button_margin": [0.5, 0.5], - "jobspecs_line": [2.0, 2.0], - - "toggle_button_text_anchoring_margin": [1.0, 1.0], - "toggle_button_radius": [1.0, 1.0], - "toggle_button_background_implicit_size": [2.0, 1.0], - "toggle_button_knob_implicit_size": [1.0, 1.0] + "jobspecs_line": [2.0, 2.0] } } From 93197cd173cd095821c4c8781bf50c1665821fae Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 30 Apr 2017 23:21:49 +0200 Subject: [PATCH 81/90] Add hover effect to mode switch text labels --- resources/qml/Sidebar.qml | 44 +++++++++++++++++++++++++++----- resources/themes/cura/theme.json | 2 +- 2 files changed, 39 insertions(+), 7 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 68427cad8c..f4d264b12c 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -408,18 +408,34 @@ Rectangle } ExclusiveGroup { id: modeMenuGroup; } - Text + Label { id: toggleLeftText anchors.right: modeToggleSwitch.left anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter text: "" - color: UM.Theme.getColor("toggle_active_text") + color: + { + if(toggleLeftTextMouseArea.containsMouse) + { + return UM.Theme.getColor("toggle_button_text_hover"); + } + else if(!modeToggleSwitch.checked) + { + return UM.Theme.getColor("toggle_button_text_checked"); + } + else + { + return UM.Theme.getColor("toggle_button_text"); + } + } font: UM.Theme.getFont("default") MouseArea { + id: toggleLeftTextMouseArea + hoverEnabled: true anchors.fill: parent onClicked: { @@ -441,11 +457,11 @@ Rectangle anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter - property alias _hovered: enableSupportMouseArea.containsMouse + property bool _hovered: modeToggleSwitchMouseArea.containsMouse || toggleLeftTextMouseArea.containsMouse || toggleRightTextMouseArea.containsMouse MouseArea { - id: enableSupportMouseArea + id: modeToggleSwitchMouseArea anchors.fill: parent hoverEnabled: true acceptedButtons: Qt.NoButton @@ -470,17 +486,33 @@ Rectangle style: UM.Theme.styles.toggle_button } - Text + Label { id: toggleRightText anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter text: "" - color: UM.Theme.getColor("toggle_active_text") + color: + { + if(toggleRightTextMouseArea.containsMouse) + { + return UM.Theme.getColor("toggle_button_text_hover"); + } + else if(modeToggleSwitch.checked) + { + return UM.Theme.getColor("toggle_button_text_checked"); + } + else + { + return UM.Theme.getColor("toggle_button_text"); + } + } font: UM.Theme.getFont("default") MouseArea { + id: toggleRightTextMouseArea + hoverEnabled: true anchors.fill: parent onClicked: { diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 531b233fec..37267046b0 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -182,7 +182,7 @@ "toggle_button_handle": [24, 41, 77, 255], "toggle_button_text": [24, 41, 77, 255], "toggle_button_text_hover": [24, 41, 77, 255], - "toggle_button_text_selected": [24, 41, 77, 255], + "toggle_button_text_checked": [12, 169, 227, 255], "tooltip": [12, 169, 227, 255], "tooltip_text": [255, 255, 255, 255], From f18947681a6ba9eefd24ddd024c41231057c07f6 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sun, 30 Apr 2017 23:25:14 +0200 Subject: [PATCH 82/90] Disambiguate theme name --- resources/qml/Sidebar.qml | 14 +++++++------- resources/themes/cura/styles.qml | 16 ++++++++-------- resources/themes/cura/theme.json | 18 +++++++++--------- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index f4d264b12c..132d1d2f41 100755 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -419,15 +419,15 @@ Rectangle { if(toggleLeftTextMouseArea.containsMouse) { - return UM.Theme.getColor("toggle_button_text_hover"); + return UM.Theme.getColor("mode_switch_text_hover"); } else if(!modeToggleSwitch.checked) { - return UM.Theme.getColor("toggle_button_text_checked"); + return UM.Theme.getColor("mode_switch_text_checked"); } else { - return UM.Theme.getColor("toggle_button_text"); + return UM.Theme.getColor("mode_switch_text"); } } font: UM.Theme.getFont("default") @@ -483,7 +483,7 @@ Rectangle UM.Preferences.setValue("cura/active_mode", index); } - style: UM.Theme.styles.toggle_button + style: UM.Theme.styles.mode_switch } Label @@ -496,15 +496,15 @@ Rectangle { if(toggleRightTextMouseArea.containsMouse) { - return UM.Theme.getColor("toggle_button_text_hover"); + return UM.Theme.getColor("mode_switch_text_hover"); } else if(modeToggleSwitch.checked) { - return UM.Theme.getColor("toggle_button_text_checked"); + return UM.Theme.getColor("mode_switch_text_checked"); } else { - return UM.Theme.getColor("toggle_button_text"); + return UM.Theme.getColor("mode_switch_text"); } } font: UM.Theme.getFont("default") diff --git a/resources/themes/cura/styles.qml b/resources/themes/cura/styles.qml index 9d302c3494..ffe866f2c6 100755 --- a/resources/themes/cura/styles.qml +++ b/resources/themes/cura/styles.qml @@ -8,25 +8,25 @@ import QtQuick.Controls.Styles 1.1 import UM 1.1 as UM QtObject { - property Component toggle_button: Component { + property Component mode_switch: Component { SwitchStyle { groove: Rectangle { - implicitWidth: UM.Theme.getSize("toggle_button").width - implicitHeight: UM.Theme.getSize("toggle_button").height + implicitWidth: UM.Theme.getSize("mode_switch").width + implicitHeight: UM.Theme.getSize("mode_switch").height radius: implicitHeight / 2 color: { if(control.hovered || control._hovered) { - return UM.Theme.getColor("toggle_button_hover"); + return UM.Theme.getColor("mode_switch_hover"); } else { - return UM.Theme.getColor("toggle_button"); + return UM.Theme.getColor("mode_switch"); } } Behavior on color { ColorAnimation { duration: 50; } } border.color: { if(control.hovered || control._hovered) { - return UM.Theme.getColor("toggle_button_border_hover"); + return UM.Theme.getColor("mode_switch_border_hover"); } else { - return UM.Theme.getColor("toggle_button_border"); + return UM.Theme.getColor("mode_switch_border"); } } Behavior on border.color { ColorAnimation { duration: 50; } } @@ -35,7 +35,7 @@ QtObject { handle: Rectangle { implicitWidth: implicitHeight - implicitHeight: UM.Theme.getSize("toggle_button").height + implicitHeight: UM.Theme.getSize("mode_switch").height radius: implicitHeight / 2 color: { diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index 37267046b0..da58af4c14 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -175,14 +175,14 @@ "checkbox_mark": [24, 41, 77, 255], "checkbox_text": [24, 41, 77, 255], - "toggle_button": [255, 255, 255, 255], - "toggle_button_hover": [255, 255, 255, 255], - "toggle_button_border": [127, 127, 127, 255], - "toggle_button_border_hover": [12, 169, 227, 255], - "toggle_button_handle": [24, 41, 77, 255], - "toggle_button_text": [24, 41, 77, 255], - "toggle_button_text_hover": [24, 41, 77, 255], - "toggle_button_text_checked": [12, 169, 227, 255], + "mode_switch": [255, 255, 255, 255], + "mode_switch_hover": [255, 255, 255, 255], + "mode_switch_border": [127, 127, 127, 255], + "mode_switch_border_hover": [12, 169, 227, 255], + "mode_switch_handle": [24, 41, 77, 255], + "mode_switch_text": [24, 41, 77, 255], + "mode_switch_text_hover": [24, 41, 77, 255], + "mode_switch_text_checked": [12, 169, 227, 255], "tooltip": [12, 169, 227, 255], "tooltip_text": [255, 255, 255, 255], @@ -310,7 +310,7 @@ "layerview_row_spacing": [0.0, 0.5], "checkbox": [2.0, 2.0], - "toggle_button": [2.0, 1.0], + "mode_switch": [2.0, 1.0], "tooltip": [20.0, 10.0], "tooltip_margins": [1.0, 1.0], From be21cd7f7d4c2c8e7c1716dcdf7c59339cb81a4a Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 1 May 2017 13:25:13 +0200 Subject: [PATCH 83/90] Fix preference category double name --- resources/qml/Preferences/GeneralPage.qml | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index b22f2300e7..85039b3c32 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -277,19 +277,6 @@ UM.PreferencesPage font.italic: true } - Item - { - //: Spacer - height: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("default_margin").width - } - - Label - { - font.bold: true - text: catalog.i18nc("@label","Viewport behavior") - } - Item { //: Spacer @@ -313,7 +300,7 @@ UM.PreferencesPage text: catalog.i18nc("@option:check","Slice automatically"); } } - + Item { //: Spacer From 5b8e1f25b7895b976796fb178e4eb321dde62d38 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 1 May 2017 14:24:49 +0200 Subject: [PATCH 84/90] Don't add prime tower area if single extrusion Simple papercut fix. --- cura/BuildVolume.py | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index fbf4ba5080..9c22d5ae3a 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -600,20 +600,21 @@ class BuildVolume(SceneNode): result_areas[extruder_id].append(polygon) #Don't perform the offset on these. # Add prime tower location as disallowed area. - prime_tower_collision = False - prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) - for extruder_id in prime_tower_areas: - for prime_tower_area in prime_tower_areas[extruder_id]: - for area in result_areas[extruder_id]: - if prime_tower_area.intersectsPolygon(area) is not None: - prime_tower_collision = True + if len(used_extruders) > 1: #No prime tower in single-extrusion. + prime_tower_collision = False + prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders) + for extruder_id in prime_tower_areas: + for prime_tower_area in prime_tower_areas[extruder_id]: + for area in result_areas[extruder_id]: + if prime_tower_area.intersectsPolygon(area) is not None: + prime_tower_collision = True + break + if prime_tower_collision: #Already found a collision. break - if prime_tower_collision: #Already found a collision. - break - if not prime_tower_collision: - result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) - else: - self._error_areas.extend(prime_tower_areas[extruder_id]) + if not prime_tower_collision: + result_areas[extruder_id].extend(prime_tower_areas[extruder_id]) + else: + self._error_areas.extend(prime_tower_areas[extruder_id]) self._has_errors = len(self._error_areas) > 0 From f612a535636749f055cd54ca18f9db90c1c1b93b Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 May 2017 09:52:12 +0200 Subject: [PATCH 85/90] Detect more temperature settings in start g-code Other settings such as the layer 0 temperatures are now also properly detected. --- plugins/CuraEngineBackend/StartSliceJob.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index c8cbbe8040..279112051c 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -247,8 +247,11 @@ class StartSliceJob(Job): Job.yieldThread() start_gcode = settings["machine_start_gcode"] - settings["material_bed_temp_prepend"] = "{material_bed_temperature}" not in start_gcode #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend - settings["material_print_temp_prepend"] = "{material_print_temperature}" not in start_gcode + #Pre-compute material material_bed_temp_prepend and material_print_temp_prepend + bed_temperature_settings = {"material_bed_temperature", "material_bed_temperature_layer_0"} + settings["material_bed_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in bed_temperature_settings)) + print_temperature_settings = {"material_print_temperature", "material_print_temperature_layer_0", "default_material_print_temperature", "material_initial_print_temperature", "material_final_print_temperature", "material_standby_temperature"} + settings["material_print_temp_prepend"] = all(("{" + setting + "}" not in start_gcode for setting in print_temperature_settings)) for key, value in settings.items(): #Add all submessages for each individual setting. setting_message = self._slice_message.getMessage("global_settings").addRepeatedMessage("settings") From bb0e9c3fdc7c1ee98313d0cc60d1f81970d1c539 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 May 2017 12:36:25 +0200 Subject: [PATCH 86/90] Split interface line distance into two in user's profiles This hasn't been deep-tested yet, but I assume that'll happen when the plug-in is reactivated in the source code. Contributes to issue CURA-3491. --- .../VersionUpgrade24to25.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py b/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py index 99a0f95a77..9e27759285 100644 --- a/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py +++ b/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py @@ -10,6 +10,10 @@ _removed_settings = { #Settings that were removed in 2.5. "start_layers_at_same_position" } +_split_settings = { #These settings should be copied to all settings it was split into. + "support_interface_line_distance": {"support_roof_line_distance", "support_bottom_line_distance"} +} + ## A collection of functions that convert the configuration of the user in Cura # 2.4 to a configuration for Cura 2.5. # @@ -42,7 +46,15 @@ class VersionUpgrade24to25(VersionUpgrade): #Remove settings from the visible_settings. if parser.has_section("general") and "visible_settings" in parser["general"]: visible_settings = parser["general"]["visible_settings"].split(";") - visible_settings = filter(lambda setting: setting not in _removed_settings, visible_settings) + new_visible_settings = [] + for setting in visible_settings: + if setting in _removed_settings: + continue #Skip. + if setting in _split_settings: + for replaced_setting in _split_settings[setting]: + new_visible_settings.append(replaced_setting) + continue #Don't add the original. + new_visible_settings.append(setting) #No special handling, so just add the original visible setting back. parser["general"]["visible_settings"] = ";".join(visible_settings) #Change the version number in the file. @@ -66,6 +78,10 @@ class VersionUpgrade24to25(VersionUpgrade): if parser.has_section("values"): for removed_setting in (_removed_settings & parser["values"].keys()): #Both in keys that need to be removed and in keys present in the file. del parser["values"][removed_setting] + for replaced_setting in (_split_settings.keys() & parser["values"].keys()): + for replacement in _split_settings[replaced_setting]: + parser["values"][replacement] = parser["values"][replaced_setting] #Copy to replacement before removing the original! + del replaced_setting #Change the version number in the file. if parser.has_section("general"): From 0e1748b705709e5940babae9abdf5065535797da Mon Sep 17 00:00:00 2001 From: Mark Date: Tue, 2 May 2017 12:55:37 +0200 Subject: [PATCH 87/90] Small layout fix so the comboboxes are aligned --- resources/qml/Preferences/GeneralPage.qml | 133 ++++++++++------------ 1 file changed, 60 insertions(+), 73 deletions(-) diff --git a/resources/qml/Preferences/GeneralPage.qml b/resources/qml/Preferences/GeneralPage.qml index 85039b3c32..689f7aafa9 100755 --- a/resources/qml/Preferences/GeneralPage.qml +++ b/resources/qml/Preferences/GeneralPage.qml @@ -126,9 +126,11 @@ UM.PreferencesPage text: catalog.i18nc("@label","Interface") } - Row + GridLayout { - spacing: UM.Theme.getSize("default_margin").width + id: interfaceGrid + columns: 4 + Label { id: languageLabel @@ -189,94 +191,79 @@ UM.PreferencesPage { id: currencyLabel text: catalog.i18nc("@label","Currency:") - anchors.verticalCenter: languageComboBox.verticalCenter + anchors.verticalCenter: currencyField.verticalCenter } + TextField { id: currencyField text: UM.Preferences.getValue("cura/currency") onTextChanged: UM.Preferences.setValue("cura/currency", text) } + + Label + { + id: themeLabel + text: catalog.i18nc("@label","Theme:") + anchors.verticalCenter: themeComboBox.verticalCenter + } + + ComboBox + { + id: themeComboBox + + model: ListModel + { + id: themeList + + Component.onCompleted: { + append({ text: catalog.i18nc("@item:inlistbox", "Ultimaker"), code: "cura" }) + } + } + + currentIndex: + { + var code = UM.Preferences.getValue("general/theme"); + for(var i = 0; i < themeList.count; ++i) + { + if(model.get(i).code == code) + { + return i + } + } + } + onActivated: UM.Preferences.setValue("general/theme", model.get(index).code) + + Component.onCompleted: + { + // Because ListModel is stupid and does not allow using qsTr() for values. + for(var i = 0; i < themeList.count; ++i) + { + themeList.setProperty(i, "text", catalog.i18n(themeList.get(i).text)); + } + + // Glorious hack time. ComboBox does not update the text properly after changing the + // model. So change the indices around to force it to update. + currentIndex += 1; + currentIndex -= 1; + } + + } } - Label + + + + Label { id: languageCaption //: Language change warning - text: catalog.i18nc("@label", "You will need to restart the application for language changes to have effect.") + text: catalog.i18nc("@label", "You will need to restart the application for these changes to have effect.") wrapMode: Text.WordWrap font.italic: true } - Item - { - //: Spacer - height: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("default_margin").width - } - - Row - { - spacing: UM.Theme.getSize("default_margin").width - Label - { - id: themeLabel - text: catalog.i18nc("@label","Theme:") - anchors.verticalCenter: themeComboBox.verticalCenter - } - - ComboBox - { - id: themeComboBox - model: ListModel - { - id: themeList - - Component.onCompleted: { - append({ text: catalog.i18nc("@item:inlistbox", "Ultimaker"), code: "cura" }) - } - } - - currentIndex: - { - var code = UM.Preferences.getValue("general/theme"); - for(var i = 0; i < themeList.count; ++i) - { - if(model.get(i).code == code) - { - return i - } - } - } - onActivated: UM.Preferences.setValue("general/theme", model.get(index).code) - - Component.onCompleted: - { - // Because ListModel is stupid and does not allow using qsTr() for values. - for(var i = 0; i < themeList.count; ++i) - { - themeList.setProperty(i, "text", catalog.i18n(themeList.get(i).text)); - } - - // Glorious hack time. ComboBox does not update the text properly after changing the - // model. So change the indices around to force it to update. - currentIndex += 1; - currentIndex -= 1; - } - } - } - - Label - { - id: themeCaption - - //: Theme change warning - text: catalog.i18nc("@label", "You will need to restart the application for theme changes to have effect.") - wrapMode: Text.WordWrap - font.italic: true - } - Item { //: Spacer From 7a9a4ae290ac873f9fa33de640b5debab488b214 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 May 2017 12:57:44 +0200 Subject: [PATCH 88/90] Revert "Change Label to Text because of ugle font rendering" This reverts commit 8c9eccd1f4f49a0d0584b3f56985f4fa16e48915. This element is in a modal window, where the fonts should get the system themeing. --- resources/qml/AddMachineDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/AddMachineDialog.qml b/resources/qml/AddMachineDialog.qml index ba3f40260d..756badc4d2 100644 --- a/resources/qml/AddMachineDialog.qml +++ b/resources/qml/AddMachineDialog.qml @@ -180,7 +180,7 @@ UM.Dialog anchors.bottom:parent.bottom spacing: UM.Theme.getSize("default_margin").width - Text + Label { text: catalog.i18nc("@label", "Printer Name:") anchors.verticalCenter: machineName.verticalCenter From d006db5b2c961bd2d517eb656163c255c62d1737 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 May 2017 13:38:28 +0200 Subject: [PATCH 89/90] Slightly reduce minimum window size This should make it possible to work with Cura on 1024x768 screens. I interpolated this from the 800p screens, since it seems to render smaller on my computer anyway. --- resources/themes/cura/theme.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/themes/cura/theme.json b/resources/themes/cura/theme.json index da58af4c14..5f0b3656c8 100644 --- a/resources/themes/cura/theme.json +++ b/resources/themes/cura/theme.json @@ -247,7 +247,7 @@ }, "sizes": { - "window_minimum_size": [70, 54], + "window_minimum_size": [70, 50], "window_margin": [1.0, 1.0], "default_margin": [1.0, 1.0], "default_lining": [0.08, 0.08], From 5176b98f6e3a54ac31924307568c63245bfc21c7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 2 May 2017 13:58:11 +0200 Subject: [PATCH 90/90] Set the correct result in visible settings Oops. Contributes to issue CURA-3491. --- .../VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py b/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py index 9e27759285..1af2e7405a 100644 --- a/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py +++ b/plugins/VersionUpgrade/VersionUpgrade24to25/VersionUpgrade24to25.py @@ -55,7 +55,7 @@ class VersionUpgrade24to25(VersionUpgrade): new_visible_settings.append(replaced_setting) continue #Don't add the original. new_visible_settings.append(setting) #No special handling, so just add the original visible setting back. - parser["general"]["visible_settings"] = ";".join(visible_settings) + parser["general"]["visible_settings"] = ";".join(new_visible_settings) #Change the version number in the file. if parser.has_section("general"): #It better have!