CURA-4557 First version of model checker

This commit is contained in:
Jack Ha 2018-03-19 16:17:24 +01:00
parent 9848c07a0e
commit ef7139d3b2

View file

@ -6,7 +6,17 @@ from cura.Scene.CuraSceneNode import CuraSceneNode
from UM.Application import Application from UM.Application import Application
from UM.Extension import Extension from UM.Extension import Extension
from UM.Logger import Logger from UM.Message import Message
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
SHRINKAGE_THRESHOLD = 0.5
WARNING_SIZE_XY = 150
WARNING_SIZE_Z = 100
MESSAGE_LIFETIME = 10
class ModelChecker(Extension): class ModelChecker(Extension):
@ -14,25 +24,63 @@ class ModelChecker(Extension):
super().__init__() super().__init__()
self._update_timer = QTimer() self._update_timer = QTimer()
self._update_timer.setInterval(2000) self._update_timer.setInterval(5000)
self._update_timer.setSingleShot(True) self._update_timer.setSingleShot(True)
self._update_timer.timeout.connect(self.checkObjects) self._update_timer.timeout.connect(self.checkObjects)
self._nodes_to_check = set() self._nodes_to_check = set()
self._warning_model_names = set() # Collect the names of models so we show the next warning with timeout
## Reacting to an event. ## ## Reacting to an event. ##
Application.getInstance().mainWindowChanged.connect(self.logMessage) #When the main window is created, log a message.
Application.getInstance().getController().getScene().sceneChanged.connect(self._onSceneChanged) Application.getInstance().getController().getScene().sceneChanged.connect(self._onSceneChanged)
## Adds a message to the log, as an example of how to listen to events.
def logMessage(self):
Logger.log("i", "This is an example log message. yeaaa")
def checkObjects(self): def checkObjects(self):
Logger.log("d", "############# checking....") warning_nodes = []
global_container_stack = Application.getInstance().getGlobalContainerStack()
material_shrinkage = {}
need_check = False
# Get all shrinkage values of materials used
for extruder_position, extruder in global_container_stack.extruders.items():
shrinkage = extruder.material.getProperty("material_shrinkage_ratio_percentage", "value")
if shrinkage is None:
shrinkage = 0
if shrinkage > SHRINKAGE_THRESHOLD:
need_check = True
material_shrinkage[extruder_position] = shrinkage
# Check if we can bail out fast
if not need_check:
return
# Check node material shrinkage and bounding box size
for node in self._nodes_to_check:
node_extruder_position = node.callDecoration("getActiveExtruderPosition")
if material_shrinkage[node_extruder_position] > SHRINKAGE_THRESHOLD:
bbox = node.getBoundingBox()
if bbox.width >= WARNING_SIZE_XY or bbox.depth >= WARNING_SIZE_XY or bbox.height >= WARNING_SIZE_Z:
warning_nodes.append(node)
# Display warning message
if warning_nodes:
message_lifetime = MESSAGE_LIFETIME
for node in warning_nodes:
if node.getName() not in self._warning_model_names:
message_lifetime = 0 # infinite
self._warning_model_names.add(node.getName())
caution_message = Message(catalog.i18nc(
"@info:warning",
"Some models may not be printed optimal due to object size and material chosen [%s].\n"
"Tips that may be useful to improve the print quality:\n"
"1) Use rounded corners\n"
"2) Turn the fan off (only if the are no tiny details on the model)\n"
"3) Use a different material") % ", ".join([n.getName() for n in warning_nodes]),
lifetime = message_lifetime,
title = catalog.i18nc("@info:title", "Model Warning"))
caution_message.show()
def _onSceneChanged(self, source): def _onSceneChanged(self, source):
if isinstance(source, CuraSceneNode) and source.callDecoration("isSliceable"): if isinstance(source, CuraSceneNode) and source.callDecoration("isSliceable"):
Logger.log("d", "triggurrrr")
self._nodes_to_check.add(source) self._nodes_to_check.add(source)
self._update_timer.start() self._update_timer.start()