StartSliceJob.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. # Copyright (c) 2015 Ultimaker B.V.
  2. # Cura is released under the terms of the AGPLv3 or higher.
  3. import time
  4. import numpy
  5. from UM.Job import Job
  6. from UM.Application import Application
  7. from UM.Logger import Logger
  8. from UM.Scene.SceneNode import SceneNode
  9. from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
  10. from cura.OneAtATimeIterator import OneAtATimeIterator
  11. from . import Cura_pb2
  12. ## Job class that handles sending the current scene data to CuraEngine
  13. class StartSliceJob(Job):
  14. def __init__(self, profile, socket):
  15. super().__init__()
  16. self._scene = Application.getInstance().getController().getScene()
  17. self._profile = profile
  18. self._socket = socket
  19. def run(self):
  20. self._scene.acquireLock()
  21. for node in DepthFirstIterator(self._scene.getRoot()):
  22. if node.callDecoration("getLayerData"):
  23. node.getParent().removeChild(node)
  24. break
  25. object_groups = []
  26. if self._profile.getSettingValue("print_sequence") == "one_at_a_time":
  27. for node in OneAtATimeIterator(self._scene.getRoot()):
  28. temp_list = []
  29. if getattr(node, "_outside_buildarea", False):
  30. continue
  31. children = node.getAllChildren()
  32. children.append(node)
  33. for child_node in children:
  34. if type(child_node) is SceneNode and child_node.getMeshData() and child_node.getMeshData().getVertices() is not None:
  35. temp_list.append(child_node)
  36. if temp_list:
  37. object_groups.append(temp_list)
  38. Job.yieldThread()
  39. else:
  40. temp_list = []
  41. for node in DepthFirstIterator(self._scene.getRoot()):
  42. if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None:
  43. if not getattr(node, "_outside_buildarea", False):
  44. temp_list.append(node)
  45. Job.yieldThread()
  46. if temp_list:
  47. object_groups.append(temp_list)
  48. self._scene.releaseLock()
  49. if not object_groups:
  50. return
  51. self._sendSettings(self._profile)
  52. slice_message = Cura_pb2.Slice()
  53. for group in object_groups:
  54. group_message = slice_message.object_lists.add()
  55. for object in group:
  56. mesh_data = object.getMeshData().getTransformed(object.getWorldTransformation())
  57. obj = group_message.objects.add()
  58. obj.id = id(object)
  59. verts = numpy.array(mesh_data.getVertices())
  60. verts[:,[1,2]] = verts[:,[2,1]]
  61. verts[:,1] *= -1
  62. obj.vertices = verts.tostring()
  63. self._handlePerObjectSettings(object, obj)
  64. Job.yieldThread()
  65. Logger.log("d", "Sending data to engine for slicing.")
  66. self._socket.sendMessage(slice_message)
  67. self.setResult(True)
  68. def _sendSettings(self, profile):
  69. msg = Cura_pb2.SettingList()
  70. for key, value in profile.getAllSettingValues(include_machine = True).items():
  71. s = msg.settings.add()
  72. s.name = key
  73. s.value = str(value).encode("utf-8")
  74. self._socket.sendMessage(msg)
  75. def _handlePerObjectSettings(self, node, message):
  76. profile = node.callDecoration("getProfile")
  77. if profile:
  78. for key, value in profile.getAllSettingValues().items():
  79. setting = message.settings.add()
  80. setting.name = key
  81. setting.value = str(value).encode()
  82. Job.yieldThread()
  83. object_settings = node.callDecoration("getAllSettingValues")
  84. if not object_settings:
  85. return
  86. for key, value in object_settings.items():
  87. setting = message.settings.add()
  88. setting.name = key
  89. setting.value = str(value).encode()
  90. Job.yieldThread()