ProcessSlicedObjectListJob.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from UM.Job import Job
  2. from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
  3. from UM.Scene.SceneNode import SceneNode
  4. from UM.Application import Application
  5. from UM.Mesh.MeshData import MeshData
  6. from . import LayerData
  7. import numpy
  8. import struct
  9. class ProcessSlicedObjectListJob(Job):
  10. def __init__(self, message):
  11. super().__init__()
  12. self._message = message
  13. self._scene = Application.getInstance().getController().getScene()
  14. def run(self):
  15. objectIdMap = {}
  16. new_node = SceneNode()
  17. ## Put all nodes in a dict identified by ID
  18. for node in DepthFirstIterator(self._scene.getRoot()):
  19. if type(node) is SceneNode and node.getMeshData():
  20. if hasattr(node.getMeshData(), "layerData"):
  21. self._scene.getRoot().removeChild(node)
  22. else:
  23. objectIdMap[id(node)] = node
  24. settings = Application.getInstance().getActiveMachine()
  25. layerHeight = settings.getSettingValueByKey("layer_height")
  26. for object in self._message.objects:
  27. try:
  28. node = objectIdMap[object.id]
  29. except KeyError:
  30. continue
  31. mesh = MeshData()
  32. layerData = LayerData.LayerData()
  33. for layer in object.layers:
  34. for polygon in layer.polygons:
  35. points = numpy.fromstring(polygon.points, dtype="i8") # Convert bytearray to numpy array
  36. points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
  37. points = numpy.asarray(points, dtype=numpy.float32)
  38. points /= 1000
  39. points = numpy.insert(points, 1, layer.id * layerHeight, axis = 1)
  40. points[:,2] *= -1
  41. if not settings.getSettingValueByKey("machine_center_is_zero"):
  42. center = [settings.getSettingValueByKey("machine_width") / 2, 0.0, -settings.getSettingValueByKey("machine_depth") / 2]
  43. points -= numpy.array(center)
  44. #points = numpy.pad(points, ((0,0), (0,1)), "constant", constant_values=(0.0, 1.0))
  45. #inverse = node.getWorldTransformation().getInverse().getData()
  46. #points = points.dot(inverse)
  47. #points = points[:,0:3]
  48. layerData.addPolygon(layer.id, polygon.type, points)
  49. # We are done processing all the layers we got from the engine, now create a mesh out of the data
  50. layerData.build()
  51. mesh.layerData = layerData
  52. new_node.setMeshData(mesh)
  53. new_node.setParent(self._scene.getRoot())