mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-08 23:46:22 -06:00
Removed related commits to Settins per Object validation and
added short validation in StartScliceJob CURA-4972
This commit is contained in:
parent
fb798ab7e5
commit
6bb42da056
6 changed files with 6 additions and 123 deletions
|
@ -19,8 +19,6 @@ class ObjectsModel(ListModel):
|
||||||
|
|
||||||
self._build_plate_number = -1
|
self._build_plate_number = -1
|
||||||
|
|
||||||
self._stacks_have_errors = None # type:Optional[bool]
|
|
||||||
|
|
||||||
def setActiveBuildPlate(self, nr):
|
def setActiveBuildPlate(self, nr):
|
||||||
self._build_plate_number = nr
|
self._build_plate_number = nr
|
||||||
self._update()
|
self._update()
|
||||||
|
@ -69,11 +67,3 @@ class ObjectsModel(ListModel):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def createObjectsModel():
|
def createObjectsModel():
|
||||||
return ObjectsModel()
|
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
|
|
|
@ -9,8 +9,7 @@ from UM.Signal import Signal, signalemitter
|
||||||
from UM.Settings.InstanceContainer import InstanceContainer
|
from UM.Settings.InstanceContainer import InstanceContainer
|
||||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||||
from UM.Logger import Logger
|
from UM.Logger import Logger
|
||||||
from UM.Settings.Validator import ValidatorState
|
|
||||||
from PyQt5.QtCore import QTimer
|
|
||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
|
|
||||||
from cura.Settings.PerObjectContainerStack import PerObjectContainerStack
|
from cura.Settings.PerObjectContainerStack import PerObjectContainerStack
|
||||||
|
@ -40,10 +39,6 @@ class SettingOverrideDecorator(SceneNodeDecorator):
|
||||||
self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId()
|
self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId()
|
||||||
|
|
||||||
self._is_non_printing_mesh = False
|
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)
|
self._stack.propertyChanged.connect(self._onSettingChanged)
|
||||||
|
|
||||||
|
@ -99,22 +94,10 @@ class SettingOverrideDecorator(SceneNodeDecorator):
|
||||||
# Trigger slice/need slicing if the value has changed.
|
# Trigger slice/need slicing if the value has changed.
|
||||||
if property_name == "value":
|
if property_name == "value":
|
||||||
self._is_non_printing_mesh = any(bool(self._stack.getProperty(setting, "value")) for setting in self._non_printing_mesh_settings)
|
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().needsSlicing()
|
||||||
Application.getInstance().getBackend().tickle()
|
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)
|
|
||||||
|
|
||||||
## Makes sure that the stack upon which the container stack is placed is
|
## Makes sure that the stack upon which the container stack is placed is
|
||||||
# kept up to date.
|
# kept up to date.
|
||||||
def _updateNextStack(self):
|
def _updateNextStack(self):
|
||||||
|
|
|
@ -136,14 +136,10 @@ class StartSliceJob(Job):
|
||||||
self.setResult(StartJobResult.MaterialIncompatible)
|
self.setResult(StartJobResult.MaterialIncompatible)
|
||||||
return
|
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.
|
# Don't slice if there is a per object setting with an error value.
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
if node.isSelectable():
|
if type(node) is not CuraSceneNode or not node.isSelectable():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if self._checkStackForErrors(node.callDecoration("getStack")):
|
if self._checkStackForErrors(node.callDecoration("getStack")):
|
||||||
|
|
|
@ -24,21 +24,8 @@ UM.TooltipArea
|
||||||
checked: addedSettingsModel.getVisible(model.key)
|
checked: addedSettingsModel.getVisible(model.key)
|
||||||
|
|
||||||
onClicked:
|
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);
|
addedSettingsModel.setVisible(model.key, checked);
|
||||||
UM.ActiveTool.triggerActionWithData("subscribeForSettingValidation", model.key)
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UM.ActiveTool.triggerActionWithData("unsubscribeForSettingValidation", model.key)
|
|
||||||
addedSettingsModel.setVisible(model.key, checked);
|
|
||||||
}
|
|
||||||
UM.ActiveTool.forceUpdate();
|
UM.ActiveTool.forceUpdate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -240,10 +240,7 @@ Item {
|
||||||
width: Math.round(UM.Theme.getSize("setting").height / 2)
|
width: Math.round(UM.Theme.getSize("setting").height / 2)
|
||||||
height: UM.Theme.getSize("setting").height
|
height: UM.Theme.getSize("setting").height
|
||||||
|
|
||||||
onClicked: {
|
onClicked: addedSettingsModel.setVisible(model.key, false)
|
||||||
addedSettingsModel.setVisible(model.key, false)
|
|
||||||
UM.ActiveTool.triggerActionWithData("unsubscribeForSettingValidation", model.key)
|
|
||||||
}
|
|
||||||
|
|
||||||
style: ButtonStyle
|
style: ButtonStyle
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,10 +10,7 @@ from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator
|
||||||
from cura.Settings.ExtruderManager import ExtruderManager
|
from cura.Settings.ExtruderManager import ExtruderManager
|
||||||
from UM.Settings.SettingInstance import SettingInstance
|
from UM.Settings.SettingInstance import SettingInstance
|
||||||
from UM.Event import Event
|
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.
|
## 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.
|
# 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()
|
self._onGlobalContainerChanged()
|
||||||
Selection.selectionChanged.connect(self._updateEnabled)
|
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):
|
def event(self, event):
|
||||||
super().event(event)
|
super().event(event)
|
||||||
|
@ -151,64 +142,3 @@ class PerObjectSettingsTool(Tool):
|
||||||
else:
|
else:
|
||||||
self._single_model_selected = True
|
self._single_model_selected = True
|
||||||
Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._advanced_mode and self._single_model_selected)
|
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)
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue