|
@@ -1,4 +1,4 @@
|
|
|
-# Copyright (c) 2015 Ultimaker B.V.
|
|
|
+# Copyright (c) 2016 Ultimaker B.V.
|
|
|
# Cura is released under the terms of the AGPLv3 or higher.
|
|
|
|
|
|
from UM.Job import Job
|
|
@@ -19,10 +19,10 @@ import numpy
|
|
|
|
|
|
catalog = i18nCatalog("cura")
|
|
|
|
|
|
-class ProcessSlicedObjectListJob(Job):
|
|
|
- def __init__(self, message):
|
|
|
+class ProcessSlicedLayersJob(Job):
|
|
|
+ def __init__(self, layers):
|
|
|
super().__init__()
|
|
|
- self._message = message
|
|
|
+ self._layers = layers
|
|
|
self._scene = Application.getInstance().getController().getScene()
|
|
|
self._progress = None
|
|
|
self._abort_requested = False
|
|
@@ -50,13 +50,12 @@ class ProcessSlicedObjectListJob(Job):
|
|
|
|
|
|
object_id_map = {}
|
|
|
new_node = SceneNode()
|
|
|
- ## Put all nodes in a dictionary identified by ID
|
|
|
+
|
|
|
+ ## Remove old layer data (if any)
|
|
|
for node in DepthFirstIterator(self._scene.getRoot()):
|
|
|
if type(node) is SceneNode and node.getMeshData():
|
|
|
if node.callDecoration("getLayerData"):
|
|
|
self._scene.getRoot().removeChild(node)
|
|
|
- else:
|
|
|
- object_id_map[id(node)] = node
|
|
|
Job.yieldThread()
|
|
|
if self._abort_requested:
|
|
|
if self._progress:
|
|
@@ -67,56 +66,45 @@ class ProcessSlicedObjectListJob(Job):
|
|
|
|
|
|
mesh = MeshData()
|
|
|
layer_data = LayerData.LayerData()
|
|
|
-
|
|
|
- layer_count = 0
|
|
|
- for i in range(self._message.repeatedMessageCount("objects")):
|
|
|
- layer_count += self._message.getRepeatedMessage("objects", i).repeatedMessageCount("layers")
|
|
|
+ layer_count = len(self._layers)
|
|
|
|
|
|
current_layer = 0
|
|
|
- for object_position in range(self._message.repeatedMessageCount("objects")):
|
|
|
- current_object = self._message.getRepeatedMessage("objects", object_position)
|
|
|
- try:
|
|
|
- node = object_id_map[current_object.id]
|
|
|
- except KeyError:
|
|
|
- continue
|
|
|
-
|
|
|
- for l in range(current_object.repeatedMessageCount("layers")):
|
|
|
- layer = current_object.getRepeatedMessage("layers", l)
|
|
|
-
|
|
|
- layer_data.addLayer(layer.id)
|
|
|
- layer_data.setLayerHeight(layer.id, layer.height)
|
|
|
- layer_data.setLayerThickness(layer.id, layer.thickness)
|
|
|
-
|
|
|
- for p in range(layer.repeatedMessageCount("polygons")):
|
|
|
- polygon = layer.getRepeatedMessage("polygons", p)
|
|
|
-
|
|
|
- points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array
|
|
|
- points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
|
|
|
-
|
|
|
- # Create a new 3D-array, copy the 2D points over and insert the right height.
|
|
|
- # This uses manual array creation + copy rather than numpy.insert since this is
|
|
|
- # faster.
|
|
|
- new_points = numpy.empty((len(points), 3), numpy.float32)
|
|
|
- new_points[:,0] = points[:,0]
|
|
|
- new_points[:,1] = layer.height
|
|
|
- new_points[:,2] = -points[:,1]
|
|
|
-
|
|
|
- new_points /= 1000
|
|
|
-
|
|
|
- layer_data.addPolygon(layer.id, polygon.type, new_points, polygon.line_width)
|
|
|
- Job.yieldThread()
|
|
|
+
|
|
|
+ for layer in self._layers:
|
|
|
+ layer_data.addLayer(layer.id)
|
|
|
+ layer_data.setLayerHeight(layer.id, layer.height)
|
|
|
+ layer_data.setLayerThickness(layer.id, layer.thickness)
|
|
|
+
|
|
|
+ for p in range(layer.repeatedMessageCount("polygons")):
|
|
|
+ polygon = layer.getRepeatedMessage("polygons", p)
|
|
|
+
|
|
|
+ points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array
|
|
|
+ points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
|
|
|
+
|
|
|
+ # Create a new 3D-array, copy the 2D points over and insert the right height.
|
|
|
+ # This uses manual array creation + copy rather than numpy.insert since this is
|
|
|
+ # faster.
|
|
|
+ new_points = numpy.empty((len(points), 3), numpy.float32)
|
|
|
+ new_points[:,0] = points[:,0]
|
|
|
+ new_points[:,1] = layer.height
|
|
|
+ new_points[:,2] = -points[:,1]
|
|
|
+
|
|
|
+ new_points /= 1000
|
|
|
+
|
|
|
+ layer_data.addPolygon(layer.id, polygon.type, new_points, polygon.line_width)
|
|
|
Job.yieldThread()
|
|
|
- current_layer += 1
|
|
|
- progress = (current_layer / layer_count) * 100
|
|
|
- # TODO: Rebuild the layer data mesh once the layer has been processed.
|
|
|
- # This needs some work in LayerData so we can add the new layers instead of recreating the entire mesh.
|
|
|
-
|
|
|
- if self._abort_requested:
|
|
|
- if self._progress:
|
|
|
- self._progress.hide()
|
|
|
- return
|
|
|
+ Job.yieldThread()
|
|
|
+ current_layer += 1
|
|
|
+ progress = (current_layer / layer_count) * 100
|
|
|
+ # TODO: Rebuild the layer data mesh once the layer has been processed.
|
|
|
+ # This needs some work in LayerData so we can add the new layers instead of recreating the entire mesh.
|
|
|
+
|
|
|
+ if self._abort_requested:
|
|
|
if self._progress:
|
|
|
- self._progress.setProgress(progress)
|
|
|
+ self._progress.hide()
|
|
|
+ return
|
|
|
+ if self._progress:
|
|
|
+ self._progress.setProgress(progress)
|
|
|
|
|
|
# We are done processing all the layers we got from the engine, now create a mesh out of the data
|
|
|
layer_data.build()
|