diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index d7077d3d85..f02e8b4db5 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -19,8 +19,6 @@ class ObjectsModel(ListModel): self._build_plate_number = -1 - self._stacks_have_errors = None # type:Optional[bool] - def setActiveBuildPlate(self, nr): self._build_plate_number = nr self._update() @@ -69,11 +67,3 @@ class ObjectsModel(ListModel): @staticmethod def createObjectsModel(): return ObjectsModel() - - ## Check if none of the model's stacks contain error states - # The setting applied for the settings per model - def stacksHaveErrors(self) -> bool: - return bool(self._stacks_have_errors) - - def setStacksHaveErrors(self, value): - self._stacks_have_errors = value \ No newline at end of file diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index 6e98f014dc..24d94e4955 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -9,8 +9,7 @@ from UM.Signal import Signal, signalemitter from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Logger import Logger -from UM.Settings.Validator import ValidatorState -from PyQt5.QtCore import QTimer + from UM.Application import Application from cura.Settings.PerObjectContainerStack import PerObjectContainerStack @@ -40,10 +39,6 @@ class SettingOverrideDecorator(SceneNodeDecorator): self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() self._is_non_printing_mesh = False - self._error_check_timer = QTimer() - self._error_check_timer.setInterval(250) - self._error_check_timer.setSingleShot(True) - self._error_check_timer.timeout.connect(self._checkStackForErrors) self._stack.propertyChanged.connect(self._onSettingChanged) @@ -99,21 +94,9 @@ class SettingOverrideDecorator(SceneNodeDecorator): # 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) - if not self._is_non_printing_mesh: - # self._error_check_timer.start() - self._checkStackForErrors() - Application.getInstance().getBackend().needsSlicing() - Application.getInstance().getBackend().tickle() - def _checkStackForErrors(self): - hasErrors = False; - for key in self._stack.getAllKeys(): - validation_state = self._stack.getProperty(key, "validationState") - if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError): - Logger.log("w", "Setting Per Object %s is not valid.", key) - hasErrors = True - break - Application.getInstance().getObjectsModel().setStacksHaveErrors(hasErrors) + Application.getInstance().getBackend().needsSlicing() + Application.getInstance().getBackend().tickle() ## Makes sure that the stack upon which the container stack is placed is # kept up to date. diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 8b7205f8b2..afbc816cc5 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -136,14 +136,10 @@ class StartSliceJob(Job): self.setResult(StartJobResult.MaterialIncompatible) return - # Validate settings per selectable model - if Application.getInstance().getObjectsModel().stacksHaveErrors(): - self.setResult(StartJobResult.ObjectSettingError) - return # Don't slice if there is a per object setting with an error value. for node in DepthFirstIterator(self._scene.getRoot()): - if node.isSelectable(): + if type(node) is not CuraSceneNode or not node.isSelectable(): continue if self._checkStackForErrors(node.callDecoration("getStack")): diff --git a/plugins/PerObjectSettingsTool/PerObjectItem.qml b/plugins/PerObjectSettingsTool/PerObjectItem.qml index 1317c00b19..559ad2bf81 100644 --- a/plugins/PerObjectSettingsTool/PerObjectItem.qml +++ b/plugins/PerObjectSettingsTool/PerObjectItem.qml @@ -25,20 +25,7 @@ UM.TooltipArea onClicked: { - // Important first set visible and then subscribe - // otherwise the setting is not yet in list - // For unsubscribe is important first remove the subscription and then - // set as invisible - if(checked) - { - addedSettingsModel.setVisible(model.key, checked); - UM.ActiveTool.triggerActionWithData("subscribeForSettingValidation", model.key) - } - else - { - UM.ActiveTool.triggerActionWithData("unsubscribeForSettingValidation", model.key) - addedSettingsModel.setVisible(model.key, checked); - } + addedSettingsModel.setVisible(model.key, checked); UM.ActiveTool.forceUpdate(); } } diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index e72e1224df..03a2ce1bf4 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -240,10 +240,7 @@ Item { width: Math.round(UM.Theme.getSize("setting").height / 2) height: UM.Theme.getSize("setting").height - onClicked: { - addedSettingsModel.setVisible(model.key, false) - UM.ActiveTool.triggerActionWithData("unsubscribeForSettingValidation", model.key) - } + onClicked: addedSettingsModel.setVisible(model.key, false) style: ButtonStyle { diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py index 11e26a033a..d2db5ff420 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsTool.py @@ -10,10 +10,7 @@ from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator from cura.Settings.ExtruderManager import ExtruderManager from UM.Settings.SettingInstance import SettingInstance from UM.Event import Event -from UM.Settings.Validator import ValidatorState -from UM.Logger import Logger -from PyQt5.QtCore import QTimer ## This tool allows the user to add & change settings per node in the scene. # The settings per object are kept in a ContainerStack, which is linked to a node by decorator. @@ -37,12 +34,6 @@ class PerObjectSettingsTool(Tool): self._onGlobalContainerChanged() Selection.selectionChanged.connect(self._updateEnabled) - self._scene = Application.getInstance().getController().getScene() - - self._error_check_timer = QTimer() - self._error_check_timer.setInterval(250) - self._error_check_timer.setSingleShot(True) - self._error_check_timer.timeout.connect(self._updateStacksHaveErrors) def event(self, event): super().event(event) @@ -151,64 +142,3 @@ class PerObjectSettingsTool(Tool): else: self._single_model_selected = True Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._advanced_mode and self._single_model_selected) - - - def _onPropertyChanged(self, key: str, property_name: str) -> None: - if property_name == "validationState": - # self._error_check_timer.start() - return - - def _updateStacksHaveErrors(self) -> None: - return - # self._checkStacksHaveErrors() - - - def _checkStacksHaveErrors(self): - - for node in DepthFirstIterator(self._scene.getRoot()): - - # valdiate only objects which can be selected because the settings per object - # can be applied only for them - if not node.isSelectable(): - continue - - hasErrors = self._checkStackForErrors(node.callDecoration("getStack")) - Application.getInstance().getObjectsModel().setStacksHaveErrors(hasErrors) - - #If any of models has an error then no reason check next objects on the build plate - if hasErrors: - break - - - def _checkStackForErrors(self, stack): - if stack is None: - return False - - for key in stack.getAllKeys(): - validation_state = stack.getProperty(key, "validationState") - if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError): - Logger.log("w", "Setting Per Object %s is not valid.", key) - return True - return False - - def subscribeForSettingValidation(self, setting_name): - selected_object = Selection.getSelectedObject(0) - stack = selected_object.callDecoration("getStack") # Don't try to get the active extruder since it may be None anyway. - if not stack: - return "" - - settings = stack.getTop() - setting_instance = settings.getInstance(setting_name) - if setting_instance: - setting_instance.propertyChanged.connect(self._onPropertyChanged) - - def unsubscribeForSettingValidation(self, setting_name): - selected_object = Selection.getSelectedObject(0) - stack = selected_object.callDecoration("getStack") # Don't try to get the active extruder since it may be None anyway. - if not stack: - return "" - - settings = stack.getTop() - setting_instance = settings.getInstance(setting_name) - if setting_instance: - setting_instance.propertyChanged.disconnect(self._onPropertyChanged)