diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0758d76608..7cfb3c23d4 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -243,11 +243,11 @@ class MachineManager(QObject): def _onPropertyChanged(self, key, property_name): if property_name == "value": - # If a setting is not settable per extruder, but "has enabled relations" that are settable per extruder + # If a setting is not settable per extruder, but "has enabled" or "value" relations that are settable per extruder # we need to copy the value to global, so that the front-end displays the right settings. if not self._active_container_stack.getProperty(key, "settable_per_extruder"): relations = self._global_container_stack.getBottom()._getDefinition(key).relations - for relation in filter(lambda r: r.role == "enabled" and r.type == RelationType.RequiredByTarget, relations): + for relation in filter(lambda r: (r.role == "enabled" or r.role == "value") and r.type == RelationType.RequiredByTarget, relations): # Target setting is settable per extruder if self._active_container_stack.getProperty(relation.target.key, "settable_per_extruder"): new_value = self._global_container_stack.getProperty(key, "value") diff --git a/cura/Settings/SettingInheritanceManager.py b/cura/Settings/SettingInheritanceManager.py index 7989d5bebc..6bc16c1628 100644 --- a/cura/Settings/SettingInheritanceManager.py +++ b/cura/Settings/SettingInheritanceManager.py @@ -1,10 +1,17 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. + from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal import UM.Settings from UM.Application import Application import cura.Settings - +## The settingInheritance manager is responsible for checking each setting in order to see if one of the "deeper" +# containers has a setting function and the topmost one with a value has a value. We need to have this check +# because some profiles tend to have 'hardcoded' values that break our inheritance. A good example of that are the +# speed settings. If all the children of print_speed have a single value override, changing the speed won't +# actually do anything, as only the 'leaf' settings are used by the engine. class SettingInheritanceManager(QObject): def __init__(self, parent = None): super().__init__(parent) @@ -18,10 +25,6 @@ class SettingInheritanceManager(QObject): settingsWithIntheritanceChanged = pyqtSignal() - @pyqtSlot() - def test(self): - pass - ## Get the keys of all children settings with an override. @pyqtSlot(str, result = "QStringList") def getChildrenKeysWithOverride(self, key): @@ -106,7 +109,6 @@ class SettingInheritanceManager(QObject): return True return False - @pyqtProperty("QVariantList", notify = settingsWithIntheritanceChanged) def settingsWithInheritanceWarning(self): return self._settings_with_inheritance_warning @@ -126,6 +128,10 @@ class SettingInheritanceManager(QObject): if not self._active_container_stack.getProperty(key, "enabled"): return False + ## Also check if the top container is not a setting function (this happens if the inheritance is restored). + if isinstance(self._active_container_stack.getTop().getProperty(key, "value"), UM.Settings.SettingFunction): + return False + ## Mash all containers for all the stacks together. while stack: containers.extend(stack.getContainers()) @@ -144,8 +150,7 @@ class SettingInheritanceManager(QObject): if has_setting_function: break # There is a setting function somewhere, stop looking deeper. - ## Also check if the top container is not a setting function (this happens if the inheritance is restored). - return has_setting_function and not isinstance(self._active_container_stack.getTop().getProperty(key, "value"), UM.Settings.SettingFunction) and has_non_function_value + return has_setting_function and has_non_function_value def _update(self): self._settings_with_inheritance_warning = [] # Reset previous data. diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index ab9a75d1da..a33158a60f 100644 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -101,8 +101,9 @@ class SliceInfo(Extension): print_information = Application.getInstance().getPrintInformation() material_radius = 0.5 * global_container_stack.getProperty("material_diameter", "value") - # TODO: Send material per extruder instead of mashing it on a pile - material_used = math.pi * material_radius * material_radius * sum(print_information.materialLengths) #Volume of all materials used + # Send material per extruder + material_used = [str(math.pi * material_radius * material_radius * material_length) for material_length in print_information.materialLengths] + material_used = ",".join(material_used) # Bundle the collected data submitted_data = { @@ -139,4 +140,4 @@ class SliceInfo(Extension): except Exception as e: # We really can't afford to have a mistake here, as this would break the sending of g-code to a device # (Either saving or directly to a printer). The functionality of the slice data is not *that* important. - Logger.log("e", "Exception raised while sending slice info: %s" %(repr(e))) # But we should be notified about these problems of course. \ No newline at end of file + Logger.log("e", "Exception raised while sending slice info: %s" %(repr(e))) # But we should be notified about these problems of course.