From 2402ba3d0ea4ce977c5f927d3a338117dc880da0 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Aug 2016 14:30:48 +0200 Subject: [PATCH 1/6] Bed temperature is now either a resolved value or a global value. Contributes to CURA-2007 --- cura/CuraApplication.py | 1 + plugins/CuraEngineBackend/StartSliceJob.py | 8 +++++++- resources/definitions/fdmprinter.def.json | 1 + resources/qml/Settings/SettingItem.qml | 13 ++++++++++++- resources/qml/Settings/SettingTextField.qml | 11 ++++++++++- resources/qml/Settings/SettingView.qml | 5 +++-- 6 files changed, 34 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 337cac8ef0..ec1240252a 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -98,6 +98,7 @@ class CuraApplication(QtApplication): SettingDefinition.addSupportedProperty("settable_per_meshgroup", DefinitionPropertyType.Any, default = True) SettingDefinition.addSupportedProperty("settable_globally", DefinitionPropertyType.Any, default = True) SettingDefinition.addSupportedProperty("global_inherits_stack", DefinitionPropertyType.Function, default = "-1") + SettingDefinition.addSupportedProperty("resolve", DefinitionPropertyType.Function, default = None) SettingDefinition.addSettingType("extruder", None, str, Validator) SettingFunction.registerOperator("extruderValues", cura.Settings.ExtruderManager.getExtruderValues) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 5b948c90ab..38bfe00ce8 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -203,7 +203,13 @@ class StartSliceJob(Job): keys = stack.getAllKeys() settings = {} for key in keys: - settings[key] = stack.getProperty(key, "value") + # Use resolvement value if available, or take the value + resolved_value = stack.getProperty(key, "resolve") + if resolved_value is not None: + settings[key] = resolved_value + else: + # Normal case + settings[key] = stack.getProperty(key, "value") 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 diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 33d41332a1..714f4a081a 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1089,6 +1089,7 @@ "description": "The temperature used for the heated bed. Set at 0 to pre-heat the printer manually.", "unit": "°C", "type": "float", + "resolve": "sum(extruderValues('material_bed_temperature')) / len(extruderValues('material_bed_temperature'))", "default_value": 60, "minimum_value": "0", "maximum_value_warning": "260", diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index dae9953690..3e7ca95dbc 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -28,6 +28,9 @@ Item { // Create properties to put property provider stuff in (bindings break in qt 5.5.1 otherwise) property var state: propertyProvider.properties.state property var settablePerExtruder: propertyProvider.properties.settable_per_extruder + property var value: propertyProvider.properties.value + property var globalValue: globalPropertyProvider.properties.value + property var resolve: propertyProvider.properties.resolve property var stackLevels: propertyProvider.stackLevels property var stackLevel: stackLevels[0] @@ -150,7 +153,15 @@ Item { iconSource: UM.Theme.getIcon("link") - onEntered: { hoverTimer.stop(); base.showTooltip(catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders")) } + onEntered: { + hoverTimer.stop(); + var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders") + "."; + if ((resolve != "None") && (globalValue == null)) { + // We come here if a setting has a resolve and the setting is not manually edited. + tooltipText += " " + catalog.i18nc("@label", "The value is resolved from the individual value ") + value + "."; + } + base.showTooltip(tooltipText); + } onExited: base.showTooltip(base.tooltipText); } diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 18a55c7a50..0893590a70 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -106,7 +106,16 @@ SettingItem { target: input property: "text" - value: propertyProvider.properties.value + value: { + if (propertyProvider.properties.resolve != "None") { + // We have a resolve function. Indicates that the setting is not settable per extruder and that + // we have to choose between the resolved value (default) and the global value + // (if user has explicitly set this). + return (globalPropertyProvider.properties.value != null) ? globalPropertyProvider.properties.value : propertyProvider.properties.resolve; + } else { + return propertyProvider.properties.value; + } + } when: !input.activeFocus } } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 978e2dcaed..95e75a742f 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -57,6 +57,7 @@ ScrollView property var definition: model property var settingDefinitionsModel: definitionsModel property var propertyProvider: provider + property var globalPropertyProvider: inheritStackProvider //Qt5.4.2 and earlier has a bug where this causes a crash: https://bugreports.qt.io/browse/QTBUG-35989 //In addition, while it works for 5.5 and higher, the ordering of the actual combo box drop down changes, @@ -118,7 +119,7 @@ ScrollView id: inheritStackProvider containerStackId: Cura.MachineManager.activeMachineId key: model.key - watchedProperties: [ "global_inherits_stack"] + watchedProperties: [ "global_inherits_stack", "value" ] } UM.SettingPropertyProvider @@ -127,7 +128,7 @@ ScrollView containerStackId: Cura.MachineManager.activeMachineId key: model.key ? model.key : "" - watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder" ] + watchedProperties: [ "value", "enabled", "state", "validationState", "settable_per_extruder", "resolve" ] storeIndex: 0 } From c0dd19ce089b21881f299f0db8e8616776cf3ad4 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 4 Aug 2016 19:23:23 +0200 Subject: [PATCH 2/6] Seems to work, except for the tooltip (shows global value). CURA-2007 --- resources/qml/Settings/SettingItem.qml | 2 +- resources/qml/Settings/SettingTextField.qml | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 68cbea1b2a..6eb2c2da11 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -155,7 +155,7 @@ Item { onEntered: { hoverTimer.stop(); var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders") + "."; - if ((resolve != "None") && (globalValue == null)) { + if ((resolve != "None") && (stackLevel != 0)) { // We come here if a setting has a resolve and the setting is not manually edited. tooltipText += " " + catalog.i18nc("@label", "The value is resolved from the individual value ") + value + "."; } diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 7ed7105354..629e942554 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -107,14 +107,11 @@ SettingItem target: input property: "text" value: { - if (propertyProvider.properties.resolve != "None") { + if ((propertyProvider.properties.resolve != "None") && (stackLevel != 0)) { // We have a resolve function. Indicates that the setting is not settable per extruder and that // we have to choose between the resolved value (default) and the global value // (if user has explicitly set this). - if (definition.key == "material_bed_temperature") { - CuraApplication.log("## global value " + globalPropertyProvider.properties.value); - } - return (globalPropertyProvider.properties.value != null) ? globalPropertyProvider.properties.value : propertyProvider.properties.resolve; + return propertyProvider.properties.resolve; } else { return propertyProvider.properties.value; } From 97f9bcacf14d474c37383d48c39e59a0b5d970a7 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 8 Aug 2016 13:39:54 +0200 Subject: [PATCH 3/6] Tooltip for bed temperature displays values where it resolves from. CURA-2007 --- cura/Settings/ExtruderManager.py | 11 +++++++++++ resources/qml/Settings/SettingItem.qml | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 8861334237..b3a067b09c 100644 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -316,6 +316,17 @@ class ExtruderManager(QObject): return result + ## Get all extruder values for a certain setting. + # + # This is exposed to qml for display purposes + # + # \param key The key of the setting to retieve values for. + # + # \return String representing the extruder values + @pyqtSlot(str, result="QList") + def getInstanceExtruderValues(self, key): + return ExtruderManager.getExtruderValues(key) + ## Get the value for a setting from a specific extruder. # # This is exposed to SettingFunction to use in value functions. diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index 6eb2c2da11..c30318defb 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -157,7 +157,9 @@ Item { var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders") + "."; if ((resolve != "None") && (stackLevel != 0)) { // We come here if a setting has a resolve and the setting is not manually edited. - tooltipText += " " + catalog.i18nc("@label", "The value is resolved from the individual value ") + value + "."; + // Individual value does not work yet. + + tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + ExtruderManager.getInstanceExtruderValues(definition.key) + "]."; } base.showTooltip(tooltipText); } From 5a92269a085455fe792cf6efc2d77e422477bdb6 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 15 Aug 2016 09:32:51 +0200 Subject: [PATCH 4/6] Testing. CURA-2007 --- resources/qml/Settings/SettingTextField.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 389c91f6e4..2e47fbc821 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -107,6 +107,9 @@ SettingItem target: input property: "text" value: { + if (definition.key === "material_bed_temperature") { + CuraApplication.log("## " + propertyProvider.properties.resolve + " " + stackLevel); + } if ((propertyProvider.properties.resolve != "None") && (stackLevel != 0)) { // We have a resolve function. Indicates that the setting is not settable per extruder and that // we have to choose between the resolved value (default) and the global value From 0268bf3f569c18072ff386326a7ba49acca58e3a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 23 Aug 2016 13:18:20 +0200 Subject: [PATCH 5/6] Cleanup. CURA-2007 --- resources/qml/Settings/SettingItem.qml | 4 ---- resources/qml/Settings/SettingTextField.qml | 3 --- 2 files changed, 7 deletions(-) diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index c30318defb..449a244b80 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -27,8 +27,6 @@ Item { // Create properties to put property provider stuff in (bindings break in qt 5.5.1 otherwise) property var state: propertyProvider.properties.state - property var value: propertyProvider.properties.value - property var globalValue: globalPropertyProvider.properties.value property var resolve: propertyProvider.properties.resolve property var stackLevels: propertyProvider.stackLevels property var stackLevel: stackLevels[0] @@ -157,8 +155,6 @@ Item { var tooltipText = catalog.i18nc("@label", "This setting is always shared between all extruders. Changing it here will change the value for all extruders") + "."; if ((resolve != "None") && (stackLevel != 0)) { // We come here if a setting has a resolve and the setting is not manually edited. - // Individual value does not work yet. - tooltipText += " " + catalog.i18nc("@label", "The value is resolved from per-extruder values ") + "[" + ExtruderManager.getInstanceExtruderValues(definition.key) + "]."; } base.showTooltip(tooltipText); diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 2e47fbc821..389c91f6e4 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -107,9 +107,6 @@ SettingItem target: input property: "text" value: { - if (definition.key === "material_bed_temperature") { - CuraApplication.log("## " + propertyProvider.properties.resolve + " " + stackLevel); - } if ((propertyProvider.properties.resolve != "None") && (stackLevel != 0)) { // We have a resolve function. Indicates that the setting is not settable per extruder and that // we have to choose between the resolved value (default) and the global value From 9521a853189510c9f6a2177c4ea9df7fb4a262d8 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 24 Aug 2016 11:36:10 +0200 Subject: [PATCH 6/6] Fix resolve in profile bug. Removed unnecessary imports. Removed unnecessary watch. Contributes to CURA-2007 --- cura/CuraApplication.py | 4 +--- resources/qml/Settings/SettingTextField.qml | 2 +- resources/qml/Settings/SettingView.qml | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 04c666f7b9..14e93148a1 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -13,7 +13,6 @@ from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Mesh.ReadMeshJob import ReadMeshJob from UM.Logger import Logger from UM.Preferences import Preferences -from UM.Platform import Platform from UM.JobQueue import JobQueue from UM.SaveFile import SaveFile from UM.Scene.Selection import Selection @@ -50,12 +49,12 @@ from PyQt5.QtGui import QColor, QIcon from PyQt5.QtWidgets import QMessageBox from PyQt5.QtQml import qmlRegisterUncreatableType, qmlRegisterSingletonType, qmlRegisterType -import platform import sys import os.path import numpy import copy import urllib + numpy.seterr(all="ignore") try: @@ -929,5 +928,4 @@ class CuraApplication(QtApplication): @pyqtSlot(str) def log(self, msg): - from UM.Logger import Logger Logger.log("d", msg) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 389c91f6e4..9121fbd1c3 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -107,7 +107,7 @@ SettingItem target: input property: "text" value: { - if ((propertyProvider.properties.resolve != "None") && (stackLevel != 0)) { + if ((propertyProvider.properties.resolve != "None") && (stackLevel != 0) && (stackLevel != 1)) { // We have a resolve function. Indicates that the setting is not settable per extruder and that // we have to choose between the resolved value (default) and the global value // (if user has explicitly set this). diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index a3b5cbc6d0..b99b619878 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -125,7 +125,7 @@ ScrollView id: inheritStackProvider containerStackId: Cura.MachineManager.activeMachineId key: model.key - watchedProperties: [ "global_inherits_stack", "value" ] + watchedProperties: [ "global_inherits_stack" ] } UM.SettingPropertyProvider