diff options
author | alekseisasin <a.sasin@ultimaker.com> | 2017-09-06 17:58:17 +0300 |
---|---|---|
committer | alekseisasin <a.sasin@ultimaker.com> | 2017-09-06 17:58:17 +0300 |
commit | c614f02d0ff9cbaf8476fb764ac7849c49fc0e45 (patch) | |
tree | dfadba8c9ef5ed4cd5cd993fbbe940d9f4f885fe /cura/BuildVolume.py | |
parent | b239eb9eaf597ca15f548272f4f6eefbd6d6455b (diff) |
Fixed settings update. After each change in the settings the build volume was rebuilding
CURA-4271
Diffstat (limited to 'cura/BuildVolume.py')
-rwxr-xr-x | cura/BuildVolume.py | 94 |
1 files changed, 64 insertions, 30 deletions
diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index bc5398cb1c..ccdc3cea40 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -90,10 +90,15 @@ class BuildVolume(SceneNode): #Objects loaded at the moment. We are connected to the property changed events of these objects. self._scene_objects = set() - self._change_timer = QTimer() - self._change_timer.setInterval(100) - self._change_timer.setSingleShot(True) - self._change_timer.timeout.connect(self._onChangeTimerFinished) + self._scene_change_timer = QTimer() + self._scene_change_timer.setInterval(100) + self._scene_change_timer.setSingleShot(True) + self._scene_change_timer.timeout.connect(self._onSceneChangeTimerFinished) + + self._setting_change_timer = QTimer() + self._setting_change_timer.setInterval(100) + self._setting_change_timer.setSingleShot(True) + self._setting_change_timer.timeout.connect(self._onSettingChangeTimerFinished) self._build_volume_message = Message(catalog.i18nc("@info:status", "The build volume height has been reduced due to the value of the" @@ -104,15 +109,19 @@ class BuildVolume(SceneNode): # activeQualityChanged is always emitted after setActiveVariant, setActiveMaterial and setActiveQuality. # Therefore this works. Application.getInstance().getMachineManager().activeQualityChanged.connect(self._onStackChanged) + # This should also ways work, and it is semantically more correct, # but it does not update the disallowed areas after material change Application.getInstance().getMachineManager().activeStackChanged.connect(self._onStackChanged) + # list of settings which were updated + self._changed_settings_since_last_rebuild = [] + def _onSceneChanged(self, source): if self._global_container_stack: - self._change_timer.start() + self._scene_change_timer.start() - def _onChangeTimerFinished(self): + def _onSceneChangeTimerFinished(self): root = Application.getInstance().getController().getScene().getRoot() new_scene_objects = set(node for node in BreadthFirstIterator(root) if node.callDecoration("isSliceable")) if new_scene_objects != self._scene_objects: @@ -562,43 +571,68 @@ class BuildVolume(SceneNode): self._engine_ready = True self.rebuild() - def _onSettingPropertyChanged(self, setting_key: str, property_name: str): - if property_name != "value": - return - + def _onSettingChangeTimerFinished(self): 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" and len(self._scene_objects) > 1: - self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), machine_height) - if self._height < machine_height: - self._build_volume_message.show() + update_disallowed_areas = False + update_raft_thickness = False + update_extra_z_clearance = True + for setting_key in self._changed_settings_since_last_rebuild: + 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" and len( + self._scene_objects) > 1: + self._height = min(self._global_container_stack.getProperty("gantry_height", "value"), + machine_height) + if self._height < machine_height: + self._build_volume_message.show() + else: + self._build_volume_message.hide() else: + self._height = self._global_container_stack.getProperty("machine_height", "value") self._build_volume_message.hide() - else: - self._height = self._global_container_stack.getProperty("machine_height", "value") - self._build_volume_message.hide() - rebuild_me = True + rebuild_me = True + + if setting_key in self._skirt_settings or setting_key in self._prime_settings or setting_key in self._tower_settings or setting_key == "print_sequence" or setting_key in self._ooze_shield_settings or setting_key in self._distance_settings or setting_key in self._extruder_settings: + update_disallowed_areas = True + rebuild_me = True + + if setting_key in self._raft_settings: + update_raft_thickness = True + rebuild_me = True + + if setting_key in self._extra_z_settings: + update_extra_z_clearance = True + rebuild_me = True - if setting_key in self._skirt_settings or setting_key in self._prime_settings or setting_key in self._tower_settings or setting_key == "print_sequence" or setting_key in self._ooze_shield_settings or setting_key in self._distance_settings or setting_key in self._extruder_settings: + if setting_key in self._limit_to_extruder_settings: + update_disallowed_areas = True + rebuild_me = True + + # We only want to update all of them once. + if update_disallowed_areas: self._updateDisallowedAreas() - rebuild_me = True - if setting_key in self._raft_settings: + if update_raft_thickness: self._updateRaftThickness() - rebuild_me = True - if setting_key in self._extra_z_settings: + if update_extra_z_clearance: self._updateExtraZClearance() - rebuild_me = True - - if setting_key in self._limit_to_extruder_settings: - self._updateDisallowedAreas() - rebuild_me = True if rebuild_me: self.rebuild() + # We just did a rebuild, reset the list. + self._changed_settings_since_last_rebuild = [] + + def _onSettingPropertyChanged(self, setting_key: str, property_name: str): + if property_name != "value": + return + + if setting_key not in self._changed_settings_since_last_rebuild: + self._changed_settings_since_last_rebuild.append(setting_key) + self._setting_change_timer.start() + def hasErrors(self) -> bool: return self._has_errors |