From 7f723632ea19576ef7c501e054192e2dcfad5a17 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 21 Sep 2016 13:07:29 +0200 Subject: [PATCH 1/4] Build size is now only changed for one at a time mode if there is more than one object CURA-2312 --- cura/BuildVolume.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index c4ae75b514..91ccc1362a 100644 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -4,6 +4,7 @@ from cura.Settings.ExtruderManager import ExtruderManager from UM.i18n import i18nCatalog from UM.Scene.Platform import Platform +from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Application import Application from UM.Resources import Resources @@ -14,7 +15,7 @@ from UM.Math.AxisAlignedBox import AxisAlignedBox from UM.Math.Polygon import Polygon from UM.Message import Message from UM.Signal import Signal - +from PyQt5.QtCore import QTimer from UM.View.RenderBatch import RenderBatch from UM.View.GL.OpenGL import OpenGL catalog = i18nCatalog("cura") @@ -84,6 +85,29 @@ class BuildVolume(SceneNode): self._onGlobalContainerStackChanged() self._has_errors = False + Application.getInstance().getController().getScene().sceneChanged.connect(self._onSceneChanged) + + # Number of objects loaded at the moment. + self._number_of_objects = 0 + + self._change_timer = QTimer() + self._change_timer.setInterval(100) + self._change_timer.setSingleShot(True) + self._change_timer.timeout.connect(self._onChangeTimerFinished) + + def _onSceneChanged(self, source): + self._change_timer.start() + + def _onChangeTimerFinished(self): + root = Application.getInstance().getController().getScene().getRoot() + new_number_of_objects = len([node for node in BreadthFirstIterator(root) if node.getMeshData() and type(node) is SceneNode]) + if new_number_of_objects != self._number_of_objects: + recalculate = False + if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time": + recalculate = (new_number_of_objects < 2 and self._number_of_objects > 1) or (new_number_of_objects > 1 and self._number_of_objects < 2) + self._number_of_objects = new_number_of_objects + if recalculate: + self._onSettingPropertyChanged("print_sequence", "value") # Create fake event, so right settings are triggered. def setWidth(self, width): if width: self._width = width @@ -272,7 +296,7 @@ class BuildVolume(SceneNode): self._width = self._global_container_stack.getProperty("machine_width", "value") machine_height = self._global_container_stack.getProperty("machine_height", "value") - if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time": + if self._global_container_stack.getProperty("print_sequence", "value") == "one_at_a_time" and self._number_of_objects > 1: self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height) if self._height < machine_height: self._buildVolumeMessage() @@ -292,7 +316,7 @@ class BuildVolume(SceneNode): rebuild_me = False if setting_key == "print_sequence": machine_height = self._global_container_stack.getProperty("machine_height", "value") - if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time": + if Application.getInstance().getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and self._number_of_objects > 1: self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height) if self._height < machine_height: self._buildVolumeMessage() From 6b613fd86bae4db44ae509551e5a1c04c0e4cf3d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 21 Sep 2016 13:37:41 +0200 Subject: [PATCH 2/4] If the stack number is 0 it's now correctly used by perobject settings CURA-2319 --- .../PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 56cec25db8..c075f6895b 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -63,7 +63,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand if definition.limit_to_extruder and self._stack.getProperty("machine_extruder_count", "value") > 1: #Obtain the value from the correct container stack. Only once, upon adding the setting. stack_nr = str(int(round(float(self._stack.getProperty(item, "limit_to_extruder"))))) #Stack to get the setting from. Round it and remove the fractional part. - if stack_nr not in ExtruderManager.getInstance().extruderIds and self._stack.getProperty("extruder_nr", "value"): #Property not defined, but we have an extruder number. + if stack_nr not in ExtruderManager.getInstance().extruderIds and self._stack.getProperty("extruder_nr", "value") is not None: #Property not defined, but we have an extruder number. stack_nr = str(int(round(float(self._stack.getProperty("extruder_nr", "value"))))) if stack_nr in ExtruderManager.getInstance().extruderIds: #We have either a limit_to_extruder or an extruder_nr. stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] From ddc4c73f8bfe3b60aef8447524ad1fa38a47303e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 21 Sep 2016 13:56:02 +0200 Subject: [PATCH 3/4] Updated documentation for perobject visiblity CURA-2319 --- .../PerObjectSettingVisibilityHandler.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index c075f6895b..e7b182c670 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -55,20 +55,27 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand # Add all instances that are not added, but are in visibility list for item in visible: - if not settings.getInstance(item): + if not settings.getInstance(item): # Setting was not added already. definition = self._stack.getSettingDefinition(item) if definition: new_instance = SettingInstance(definition, settings) stack_nr = -1 - if definition.limit_to_extruder and self._stack.getProperty("machine_extruder_count", "value") > 1: - #Obtain the value from the correct container stack. Only once, upon adding the setting. - stack_nr = str(int(round(float(self._stack.getProperty(item, "limit_to_extruder"))))) #Stack to get the setting from. Round it and remove the fractional part. - if stack_nr not in ExtruderManager.getInstance().extruderIds and self._stack.getProperty("extruder_nr", "value") is not None: #Property not defined, but we have an extruder number. + # Check from what stack we should copy the raw property of the setting from. + if definition.limit_to_extruder != "-1" and self._stack.getProperty("machine_extruder_count", "value") > 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 = str(int(round(float(self._stack.getProperty("extruder_nr", "value"))))) - if stack_nr in ExtruderManager.getInstance().extruderIds: #We have either a limit_to_extruder or an extruder_nr. + + # Use the found stack number to get the right stack to copy the value from. + if stack_nr in ExtruderManager.getInstance().extruderIds: stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] else: stack = UM.Application.getInstance().getGlobalContainerStack() + + # Use the raw property to set the value (so the intheritance doesn't break) new_instance.setProperty("value", stack.getRawProperty(item, "value")) new_instance.resetState() # Ensure that the state is not seen as a user state. settings.addInstance(new_instance) From c13003c960185a8f5d77a8235d6f7f4aa4befa03 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 21 Sep 2016 14:15:48 +0200 Subject: [PATCH 4/4] Switching between stacks now ensures that right value is used for perobject CURA-2319 --- .../PerObjectSettingVisibilityHandler.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index e7b182c670..1396a02b13 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -60,6 +60,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand if definition: 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 definition.limit_to_extruder != "-1" and self._stack.getProperty("machine_extruder_count", "value") > 1: # A limit to extruder function was set and it's a multi extrusion machine. Check what stack we do need to use. @@ -67,16 +68,17 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand # 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 = str(int(round(float(self._stack.getProperty("extruder_nr", "value"))))) + 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 = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = ExtruderManager.getInstance().extruderIds[stack_nr])[0] - else: - stack = UM.Application.getInstance().getGlobalContainerStack() + stack = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id=ExtruderManager.getInstance().extruderIds[stack_nr])[0] # Use the raw property to set the value (so the intheritance doesn't break) - new_instance.setProperty("value", stack.getRawProperty(item, "value")) + 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