mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 22:47:29 -06:00
CURA-4525 layer data viewing seems fixed, although after moving an object to a different build plate triggers the reslice only after deselecting
This commit is contained in:
parent
c732470169
commit
040cc31079
4 changed files with 32 additions and 41 deletions
|
@ -7,13 +7,11 @@ class BuildPlateDecorator(SceneNodeDecorator):
|
||||||
def __init__(self, build_plate_number = -1):
|
def __init__(self, build_plate_number = -1):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._build_plate_number = None
|
self._build_plate_number = None
|
||||||
self._previous_build_plate_number = None
|
|
||||||
self.setBuildPlateNumber(build_plate_number)
|
self.setBuildPlateNumber(build_plate_number)
|
||||||
|
|
||||||
def setBuildPlateNumber(self, nr):
|
def setBuildPlateNumber(self, nr):
|
||||||
# Make sure that groups are set correctly
|
# Make sure that groups are set correctly
|
||||||
# setBuildPlateForSelection in CuraActions makes sure that no single childs are set.
|
# setBuildPlateForSelection in CuraActions makes sure that no single childs are set.
|
||||||
self._previous_build_plate_number = self._build_plate_number
|
|
||||||
self._build_plate_number = nr
|
self._build_plate_number = nr
|
||||||
if self._node and self._node.callDecoration("isGroup"):
|
if self._node and self._node.callDecoration("isGroup"):
|
||||||
for child in self._node.getChildren():
|
for child in self._node.getChildren():
|
||||||
|
@ -22,12 +20,5 @@ class BuildPlateDecorator(SceneNodeDecorator):
|
||||||
def getBuildPlateNumber(self):
|
def getBuildPlateNumber(self):
|
||||||
return self._build_plate_number
|
return self._build_plate_number
|
||||||
|
|
||||||
# Used to determine from what build plate the node moved.
|
|
||||||
def getPreviousBuildPlateNumber(self):
|
|
||||||
return self._previous_build_plate_number
|
|
||||||
|
|
||||||
def removePreviousBuildPlateNumber(self):
|
|
||||||
self._previous_build_plate_number = None
|
|
||||||
|
|
||||||
def __deepcopy__(self, memo):
|
def __deepcopy__(self, memo):
|
||||||
return BuildPlateDecorator()
|
return BuildPlateDecorator()
|
||||||
|
|
|
@ -177,6 +177,7 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
self._createSocket()
|
self._createSocket()
|
||||||
|
|
||||||
if self._process_layers_job: # We were processing layers. Stop that, the layers are going to change soon.
|
if self._process_layers_job: # We were processing layers. Stop that, the layers are going to change soon.
|
||||||
|
Logger.log("d", "Aborting process layers job...")
|
||||||
self._process_layers_job.abort()
|
self._process_layers_job.abort()
|
||||||
self._process_layers_job = None
|
self._process_layers_job = None
|
||||||
|
|
||||||
|
@ -201,12 +202,19 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.")
|
Logger.log("w", "Slice unnecessary, nothing has changed that needs reslicing.")
|
||||||
return
|
return
|
||||||
|
|
||||||
|
if self._process_layers_job:
|
||||||
|
Logger.log("d", " ## Process layers job still busy, trying later")
|
||||||
|
self._invokeSlice()
|
||||||
|
return
|
||||||
|
|
||||||
# see if we really have to slice
|
# see if we really have to slice
|
||||||
build_plate_to_be_sliced = self._build_plates_to_be_sliced.pop(0)
|
build_plate_to_be_sliced = self._build_plates_to_be_sliced.pop(0)
|
||||||
|
Logger.log("d", "Going to slice build plate [%s]!" % build_plate_to_be_sliced)
|
||||||
num_objects = self._numObjects()
|
num_objects = self._numObjects()
|
||||||
if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0:
|
if build_plate_to_be_sliced not in num_objects or num_objects[build_plate_to_be_sliced] == 0:
|
||||||
Logger.log("d", " ## Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced)
|
Logger.log("d", " ## Build plate %s has 0 objects to be sliced, skipping", build_plate_to_be_sliced)
|
||||||
self._invokeSlice()
|
self._invokeSlice()
|
||||||
|
return
|
||||||
|
|
||||||
self._stored_layer_data = []
|
self._stored_layer_data = []
|
||||||
self._stored_optimized_layer_data[build_plate_to_be_sliced] = []
|
self._stored_optimized_layer_data[build_plate_to_be_sliced] = []
|
||||||
|
@ -326,17 +334,18 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
else:
|
else:
|
||||||
self.backendStateChange.emit(BackendState.NotStarted)
|
self.backendStateChange.emit(BackendState.NotStarted)
|
||||||
|
|
||||||
if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice:
|
# Doesn't occur anymore, is handled in slice()
|
||||||
if Application.getInstance().platformActivity:
|
# if job.getResult() == StartSliceJob.StartJobResult.NothingToSlice:
|
||||||
self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."),
|
# if Application.getInstance().platformActivity:
|
||||||
title = catalog.i18nc("@info:title", "Unable to slice"))
|
# self._error_message = Message(catalog.i18nc("@info:status", "Nothing to slice because none of the models fit the build volume. Please scale or rotate models to fit."),
|
||||||
self._error_message.show()
|
# title = catalog.i18nc("@info:title", "Unable to slice"))
|
||||||
#self.backendStateChange.emit(BackendState.Error)
|
# self._error_message.show()
|
||||||
else:
|
# #self.backendStateChange.emit(BackendState.Error)
|
||||||
#self.backendStateChange.emit(BackendState.NotStarted)
|
# else:
|
||||||
pass
|
# #self.backendStateChange.emit(BackendState.NotStarted)
|
||||||
self._invokeSlice()
|
# pass
|
||||||
return
|
# self._invokeSlice()
|
||||||
|
# return
|
||||||
|
|
||||||
# Preparation completed, send it to the backend.
|
# Preparation completed, send it to the backend.
|
||||||
self._socket.sendMessage(job.getSliceMessage())
|
self._socket.sendMessage(job.getSliceMessage())
|
||||||
|
@ -397,38 +406,24 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
if source == self._scene.getRoot():
|
if source == self._scene.getRoot():
|
||||||
# we got the root node
|
# we got the root node
|
||||||
num_objects = self._numObjects()
|
num_objects = self._numObjects()
|
||||||
# num_objects = defaultdict(int)
|
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
|
||||||
# # Only count sliceable objects
|
|
||||||
# if node.callDecoration("isSliceable"):
|
|
||||||
# build_plate_number = node.callDecoration("getBuildPlateNumber")
|
|
||||||
# num_objects[build_plate_number] += 1
|
|
||||||
node.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time
|
|
||||||
for build_plate_number in list(self._last_num_objects.keys()) + list(num_objects.keys()):
|
for build_plate_number in list(self._last_num_objects.keys()) + list(num_objects.keys()):
|
||||||
if build_plate_number not in self._last_num_objects or num_objects[build_plate_number] != self._last_num_objects[build_plate_number]:
|
if build_plate_number not in self._last_num_objects or num_objects[build_plate_number] != self._last_num_objects[build_plate_number]:
|
||||||
self._last_num_objects[build_plate_number] = num_objects[build_plate_number]
|
self._last_num_objects[build_plate_number] = num_objects[build_plate_number]
|
||||||
build_plate_changed.add(build_plate_number)
|
build_plate_changed.add(build_plate_number)
|
||||||
else:
|
else:
|
||||||
# we got a single scenenode, how do we know if it's changed?
|
# we got a single scenenode
|
||||||
# build_plate_changed.add(source_build_plate_number)
|
|
||||||
# build_plate_changed.add(source.callDecoration("getPreviousBuildPlateNumber"))
|
|
||||||
# source.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time
|
|
||||||
if not source.callDecoration("isGroup"):
|
if not source.callDecoration("isGroup"):
|
||||||
if source.getMeshData() is None:
|
if source.getMeshData() is None:
|
||||||
return
|
return
|
||||||
if source.getMeshData().getVertices() is None:
|
if source.getMeshData().getVertices() is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
# we got a single object and it passed all the tests of being changed
|
|
||||||
build_plate_changed.add(source_build_plate_number)
|
build_plate_changed.add(source_build_plate_number)
|
||||||
build_plate_changed.add(source.callDecoration("getPreviousBuildPlateNumber"))
|
|
||||||
source.callDecoration("removePreviousBuildPlateNumber") # use the previous build plate number one time
|
|
||||||
|
|
||||||
build_plate_changed.discard(None)
|
build_plate_changed.discard(None)
|
||||||
build_plate_changed.discard(-1) # object not on build plate
|
build_plate_changed.discard(-1) # object not on build plate
|
||||||
if not build_plate_changed:
|
if not build_plate_changed:
|
||||||
return
|
return
|
||||||
# Logger.log("d", " #### build plates changed: %s", build_plate_changed)
|
|
||||||
|
|
||||||
if self._tool_active:
|
if self._tool_active:
|
||||||
# do it later, each source only has to be done once
|
# do it later, each source only has to be done once
|
||||||
|
@ -443,9 +438,9 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
self._build_plates_to_be_sliced.append(build_plate_number)
|
self._build_plates_to_be_sliced.append(build_plate_number)
|
||||||
self.processingProgress.emit(0.0)
|
self.processingProgress.emit(0.0)
|
||||||
self.backendStateChange.emit(BackendState.NotStarted)
|
self.backendStateChange.emit(BackendState.NotStarted)
|
||||||
if not self._use_timer:
|
# if not self._use_timer:
|
||||||
# With manually having to slice, we want to clear the old invalid layer data.
|
# With manually having to slice, we want to clear the old invalid layer data.
|
||||||
self._clearLayerData(build_plate_changed)
|
self._clearLayerData(build_plate_changed)
|
||||||
|
|
||||||
self._invokeSlice()
|
self._invokeSlice()
|
||||||
|
|
||||||
|
@ -568,6 +563,7 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
active_build_plate = Application.getInstance().activeBuildPlate
|
active_build_plate = Application.getInstance().activeBuildPlate
|
||||||
if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()) and active_build_plate == self._start_slice_job_build_plate:
|
if self._layer_view_active and (self._process_layers_job is None or not self._process_layers_job.isRunning()) and active_build_plate == self._start_slice_job_build_plate:
|
||||||
self._startProcessSlicedLayersJob(active_build_plate)
|
self._startProcessSlicedLayersJob(active_build_plate)
|
||||||
|
# self._onActiveViewChanged()
|
||||||
self._start_slice_job_build_plate = None
|
self._start_slice_job_build_plate = None
|
||||||
|
|
||||||
Logger.log("d", "See if there is more to slice...")
|
Logger.log("d", "See if there is more to slice...")
|
||||||
|
@ -676,7 +672,6 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
self._process_layers_job.setBuildPlate(build_plate_number)
|
self._process_layers_job.setBuildPlate(build_plate_number)
|
||||||
self._process_layers_job.finished.connect(self._onProcessLayersFinished)
|
self._process_layers_job.finished.connect(self._onProcessLayersFinished)
|
||||||
self._process_layers_job.start()
|
self._process_layers_job.start()
|
||||||
del self._stored_optimized_layer_data[build_plate_number]
|
|
||||||
|
|
||||||
## Called when the user changes the active view mode.
|
## Called when the user changes the active view mode.
|
||||||
def _onActiveViewChanged(self):
|
def _onActiveViewChanged(self):
|
||||||
|
@ -689,7 +684,7 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
# There is data and we're not slicing at the moment
|
# There is data and we're not slicing at the moment
|
||||||
# if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment.
|
# if we are slicing, there is no need to re-calculate the data as it will be invalid in a moment.
|
||||||
# TODO: what build plate I am slicing
|
# TODO: what build plate I am slicing
|
||||||
if active_build_plate in self._stored_optimized_layer_data and not self._slicing:
|
if active_build_plate in self._stored_optimized_layer_data and not self._slicing and not self._process_layers_job:
|
||||||
self._startProcessSlicedLayersJob(active_build_plate)
|
self._startProcessSlicedLayersJob(active_build_plate)
|
||||||
else:
|
else:
|
||||||
self._layer_view_active = False
|
self._layer_view_active = False
|
||||||
|
@ -726,7 +721,10 @@ class CuraEngineBackend(QObject, Backend):
|
||||||
self._onChanged()
|
self._onChanged()
|
||||||
|
|
||||||
def _onProcessLayersFinished(self, job):
|
def _onProcessLayersFinished(self, job):
|
||||||
|
del self._stored_optimized_layer_data[job.getBuildPlate()]
|
||||||
self._process_layers_job = None
|
self._process_layers_job = None
|
||||||
|
Logger.log("d", "See if there is more to slice(2)...")
|
||||||
|
self._invokeSlice()
|
||||||
|
|
||||||
## Connect slice function to timer.
|
## Connect slice function to timer.
|
||||||
def enableTimer(self):
|
def enableTimer(self):
|
||||||
|
|
|
@ -65,6 +65,9 @@ class ProcessSlicedLayersJob(Job):
|
||||||
def setBuildPlate(self, new_value):
|
def setBuildPlate(self, new_value):
|
||||||
self._build_plate_number = new_value
|
self._build_plate_number = new_value
|
||||||
|
|
||||||
|
def getBuildPlate(self):
|
||||||
|
return self._build_plate_number
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
Logger.log("d", "########## Processing new layer for [%s]..." % self._build_plate_number)
|
Logger.log("d", "########## Processing new layer for [%s]..." % self._build_plate_number)
|
||||||
start_time = time()
|
start_time = time()
|
||||||
|
|
|
@ -120,7 +120,7 @@ class StartSliceJob(Job):
|
||||||
with self._scene.getSceneLock():
|
with self._scene.getSceneLock():
|
||||||
# Remove old layer data.
|
# Remove old layer data.
|
||||||
for node in DepthFirstIterator(self._scene.getRoot()):
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
||||||
if node.callDecoration("getLayerData"):
|
if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number:
|
||||||
node.getParent().removeChild(node)
|
node.getParent().removeChild(node)
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -155,7 +155,6 @@ class StartSliceJob(Job):
|
||||||
temp_list.append(node)
|
temp_list.append(node)
|
||||||
Job.yieldThread()
|
Job.yieldThread()
|
||||||
|
|
||||||
Logger.log("d", " objects to be sliced: %s", temp_list)
|
|
||||||
if temp_list:
|
if temp_list:
|
||||||
object_groups.append(temp_list)
|
object_groups.append(temp_list)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue