Fix SettingOverrideDecorator for non printing meshes

CURA-4705

- Do not set a "secret" property in the SceneNode to indicate whether a
  node is a non-printing-mesh because SceneNode will not copy that
  property during a deepcopy. Store it in the SettingOverrideDecorator
  and make it accessible through a decorator call
- Try to trigger an auto-slice AFTER the non-printing-meshes flag is
  updated, not before.
This commit is contained in:
Lipu Fei 2017-12-20 12:19:01 +01:00
parent a860154831
commit 1a6a6f74d5

View file

@ -37,6 +37,8 @@ class SettingOverrideDecorator(SceneNodeDecorator):
self._stack.addContainer(InstanceContainer(container_id = "SettingOverrideInstanceContainer"))
self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId()
self._is_non_printing_mesh = False
self._stack.propertyChanged.connect(self._onSettingChanged)
Application.getInstance().getContainerRegistry().addContainer(self._stack)
@ -57,6 +59,8 @@ class SettingOverrideDecorator(SceneNodeDecorator):
# Properly set the right extruder on the copy
deep_copy.setActiveExtruder(self._extruder_stack)
deep_copy._is_non_printing_mesh = self._is_non_printing_mesh
return deep_copy
## Gets the currently active extruder to print this object with.
@ -80,14 +84,17 @@ class SettingOverrideDecorator(SceneNodeDecorator):
container_stack = containers[0]
return container_stack.getMetaDataEntry("position", default=None)
def isNonPrintingMesh(self):
return self._is_non_printing_mesh
def _onSettingChanged(self, instance, property_name): # Reminder: 'property' is a built-in function
# Trigger slice/need slicing if the value has changed.
if property_name == "value":
self._is_non_printing_mesh = any(bool(self._stack.getProperty(setting, "value")) for setting in self._non_printing_mesh_settings)
Application.getInstance().getBackend().needsSlicing()
Application.getInstance().getBackend().tickle()
self._node._non_printing_mesh = any(self._stack.getProperty(setting, "value") for setting in self._non_printing_mesh_settings)
## Makes sure that the stack upon which the container stack is placed is
# kept up to date.
def _updateNextStack(self):