diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 445f7ff676..401396f2b8 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -73,38 +73,40 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand # Add all instances that are not added, but are in visibility list for item in visible: - if settings.getInstance(item) is None: # Setting was not added already. - definition = self._stack.getSettingDefinition(item) - if definition: - new_instance = SettingInstance(definition, settings) + if settings.getInstance(item) is not None: # Setting was added already. + continue + definition = self._stack.getSettingDefinition(item) + if not definition: + Logger.log("w", f"Unable to add instance ({item}) to per-object visibility because we couldn't find the matching definition.") + continue + + new_instance = SettingInstance(definition, settings) + stack_nr = -1 + stack = None + # Check from what stack we should copy the raw property of the setting from. + if self._stack.getProperty("machine_extruder_count", "value") > 1: + if definition.limit_to_extruder != "-1": + # A limit to extruder function was set and it's a multi extrusion machine. Check what stack we do need to use. + stack_nr = str(int(round(float(self._stack.getProperty(item, "limit_to_extruder"))))) + + # Check if the found stack_number is in the extruder list of extruders. + if stack_nr not in ExtruderManager.getInstance().extruderIds and self._stack.getProperty("extruder_nr", "value") is not None: stack_nr = -1 - stack = None - # Check from what stack we should copy the raw property of the setting from. - if self._stack.getProperty("machine_extruder_count", "value") > 1: - if definition.limit_to_extruder != "-1": - # A limit to extruder function was set and it's a multi extrusion machine. Check what stack we do need to use. - stack_nr = str(int(round(float(self._stack.getProperty(item, "limit_to_extruder"))))) - # Check if the found stack_number is in the extruder list of extruders. - if stack_nr not in ExtruderManager.getInstance().extruderIds and self._stack.getProperty("extruder_nr", "value") is not None: - stack_nr = -1 + # Use the found stack number to get the right stack to copy the value from. + if stack_nr in ExtruderManager.getInstance().extruderIds: + stack = ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] + else: + stack = self._stack - # Use the found stack number to get the right stack to copy the value from. - if stack_nr in ExtruderManager.getInstance().extruderIds: - stack = ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] - else: - stack = self._stack - - # Use the raw property to set the value (so the inheritance doesn't break) - if stack is not None: - new_instance.setProperty("value", stack.getRawProperty(item, "value")) - else: - new_instance.setProperty("value", None) - new_instance.resetState() # Ensure that the state is not seen as a user state. - settings.addInstance(new_instance) - visibility_changed = True - else: - Logger.log("w", "Unable to add instance (%s) to per-object visibility because we couldn't find the matching definition", item) + # Use the raw property to set the value (so the inheritance doesn't break) + if stack is not None: + new_instance.setProperty("value", stack.getRawProperty(item, "value")) + else: + new_instance.setProperty("value", None) + new_instance.resetState() # Ensure that the state is not seen as a user state. + settings.addInstance(new_instance) + visibility_changed = True if visibility_changed: self.visibilityChanged.emit()