Put slice-time in slice-data-sharing.

part of CURA-10299
This commit is contained in:
Remco Burema 2023-02-23 16:03:20 +01:00
parent 5970524b3a
commit 4efa8e3ab4
3 changed files with 61 additions and 13 deletions

View file

@ -143,7 +143,7 @@ class CuraEngineBackend(QObject, Backend):
self._last_num_objects = defaultdict(int) #type: Dict[int, int] # Count number of objects to see if there is something changed self._last_num_objects = defaultdict(int) #type: Dict[int, int] # Count number of objects to see if there is something changed
self._postponed_scene_change_sources = [] #type: List[SceneNode] # scene change is postponed (by a tool) self._postponed_scene_change_sources = [] #type: List[SceneNode] # scene change is postponed (by a tool)
self._slice_start_time = None #type: Optional[float] self._time_start_process = None #type: Optional[float]
self._is_disabled = False #type: bool self._is_disabled = False #type: bool
application.getPreferences().addPreference("general/auto_slice", False) application.getPreferences().addPreference("general/auto_slice", False)
@ -171,10 +171,24 @@ class CuraEngineBackend(QObject, Backend):
) )
self._slicing_error_message.actionTriggered.connect(self._reportBackendError) self._slicing_error_message.actionTriggered.connect(self._reportBackendError)
self._resetLastSliceTimeStats()
self._snapshot = None #type: Optional[QImage] self._snapshot = None #type: Optional[QImage]
application.initializationFinished.connect(self.initialize) application.initializationFinished.connect(self.initialize)
def _resetLastSliceTimeStats(self) -> None:
self._time_start_process = None
self._time_send_message = None
self._time_end_slice = None
def resetAndReturnLastSliceTimeStats(self) -> Dict[str, float]:
return {
"time_start_process": self._time_start_process,
"time_send_message": self._time_send_message,
"time_end_slice": self._time_end_slice
}
self._resetLastSliceTimeStats()
def initialize(self) -> None: def initialize(self) -> None:
application = CuraApplication.getInstance() application = CuraApplication.getInstance()
self._multi_build_plate_model = application.getMultiBuildPlateModel() self._multi_build_plate_model = application.getMultiBuildPlateModel()
@ -288,7 +302,7 @@ class CuraEngineBackend(QObject, Backend):
self._createSnapshot() self._createSnapshot()
Logger.log("i", "Starting to slice...") Logger.log("i", "Starting to slice...")
self._slice_start_time = time() self._time_start_process = time()
if not self._build_plates_to_be_sliced: if not self._build_plates_to_be_sliced:
self.processingProgress.emit(1.0) self.processingProgress.emit(1.0)
Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.") Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.")
@ -512,8 +526,10 @@ class CuraEngineBackend(QObject, Backend):
# Notify the user that it's now up to the backend to do it's job # Notify the user that it's now up to the backend to do it's job
self.setState(BackendState.Processing) self.setState(BackendState.Processing)
if self._slice_start_time: # Handle time reporting.
Logger.log("d", "Sending slice message took %s seconds", time() - self._slice_start_time ) self._time_send_message = time()
if self._time_start_process:
Logger.log("d", "Sending slice message took %s seconds", self._time_send_message - self._time_start_process)
def determineAutoSlicing(self) -> bool: def determineAutoSlicing(self) -> bool:
"""Determine enable or disable auto slicing. Return True for enable timer and False otherwise. """Determine enable or disable auto slicing. Return True for enable timer and False otherwise.
@ -750,6 +766,7 @@ class CuraEngineBackend(QObject, Backend):
self.setState(BackendState.Done) self.setState(BackendState.Done)
self.processingProgress.emit(1.0) self.processingProgress.emit(1.0)
self._time_end_slice = time()
try: try:
gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically. gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically.
@ -766,8 +783,8 @@ class CuraEngineBackend(QObject, Backend):
gcode_list[index] = replaced gcode_list[index] = replaced
self._slicing = False self._slicing = False
if self._slice_start_time: if self._time_start_process:
Logger.log("d", "Slicing took %s seconds", time() - self._slice_start_time ) Logger.log("d", "Slicing took %s seconds", time() - self._time_start_process)
Logger.log("d", "Number of models per buildplate: %s", dict(self._numObjectsPerBuildPlate())) Logger.log("d", "Number of models per buildplate: %s", dict(self._numObjectsPerBuildPlate()))
# See if we need to process the sliced layers job. # See if we need to process the sliced layers job.

View file

@ -1,4 +1,4 @@
# Copyright (c) 2021 Ultimaker B.V. # Copyright (c) 2023 UltiMaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
import json import json
@ -27,7 +27,7 @@ catalog = i18nCatalog("cura")
class SliceInfo(QObject, Extension): class SliceInfo(QObject, Extension):
"""This Extension runs in the background and sends several bits of information to the Ultimaker servers. """This Extension runs in the background and sends several bits of information to the UltiMaker servers.
The data is only sent when the user in question gave permission to do so. All data is anonymous and The data is only sent when the user in question gave permission to do so. All data is anonymous and
no model files are being sent (Just a SHA256 hash of the model). no model files are being sent (Just a SHA256 hash of the model).
@ -277,6 +277,26 @@ class SliceInfo(QObject, Extension):
# Send the name of the output device type that is used. # Send the name of the output device type that is used.
data["output_to"] = type(output_device).__name__ data["output_to"] = type(output_device).__name__
# Engine Statistics (Slicing Time, ...)
# Call it backend-time, sice we might want to get the actual slice time from the engine itself,
# to also identify problems in between the users pressing the button and the engine actually starting
# (and the other way around with data that arrives back from the engine).
time_setup = 0.0
time_backend = 0.0
if not print_information.preSliced:
backend_info = self._application.getBackend().resetAndReturnLastSliceTimeStats()
time_start_process = backend_info["time_start_process"]
time_send_message = backend_info["time_send_message"]
time_end_slice = backend_info["time_end_slice"]
if time_start_process and time_send_message and time_end_slice:
time_setup = time_send_message - time_start_process
time_backend = time_end_slice - time_send_message
data["engine_stats"] = {
"is_presliced": int(print_information.preSliced),
"time_setup": int(round(time_setup)),
"time_backend": int(round(time_backend)),
}
# Convert data to bytes # Convert data to bytes
binary_data = json.dumps(data).encode("utf-8") binary_data = json.dumps(data).encode("utf-8")

View file

@ -1,3 +1,7 @@
<!-- Copyright (c) 2023 UltiMaker B.V.
Cura is released under the terms of the LGPLv3 or higher.
-->
<html> <html>
<body> <body>
<b>Cura Version:</b> 4.8<br/> <b>Cura Version:</b> 4.8<br/>
@ -63,11 +67,18 @@
<h3>Print Times:</h3> <h3>Print Times:</h3>
<ul> <ul>
<li>Infill: 61200 sec.</li> <li><b>Infill:</b> 61200 sec.</li>
<li>Support: 25480 sec.</li> <li><b>Support:</b> 25480 sec.</li>
<li>Travel: 6224 sec.</li> <li><b>Travel:</b> 6224 sec.</li>
<li>Walls: 10225 sec.</li> <li><b>Walls:</b> 10225 sec.</li>
<li>Total: 103129 sec.</li> <li><b>Total:</b> 103129 sec.</li>
</ul>
<h3>Engine Statistics:</h3>
<ul>
<li><b>Is Pre-Sliced:</b> no</li>
<li><b>Pre-Process Time:</b> 7 sec.</li>
<li><b>Slicing Time:</b> 69 sec.</li>
</ul> </ul>
</body> </body>
</html> </html>