PrinterOutputModel.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. # Copyright (c) 2017 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot
  4. from UM.Logger import Logger
  5. from typing import Optional, List
  6. from UM.Math.Vector import Vector
  7. from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel
  8. MYPY = False
  9. if MYPY:
  10. from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
  11. from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
  12. class PrinterOutputModel(QObject):
  13. bedTemperatureChanged = pyqtSignal()
  14. targetBedTemperatureChanged = pyqtSignal()
  15. isPreheatingChanged = pyqtSignal()
  16. stateChanged = pyqtSignal()
  17. activePrintJobChanged = pyqtSignal()
  18. nameChanged = pyqtSignal()
  19. headPositionChanged = pyqtSignal()
  20. keyChanged = pyqtSignal()
  21. typeChanged = pyqtSignal()
  22. cameraChanged = pyqtSignal()
  23. def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None, firmware_version = ""):
  24. super().__init__(parent)
  25. self._bed_temperature = -1 # Use -1 for no heated bed.
  26. self._target_bed_temperature = 0
  27. self._name = ""
  28. self._key = "" # Unique identifier
  29. self._controller = output_controller
  30. self._extruders = [ExtruderOutputModel(printer=self) for i in range(number_of_extruders)]
  31. self._head_position = Vector(0, 0, 0)
  32. self._active_print_job = None # type: Optional[PrintJobOutputModel]
  33. self._firmware_version = firmware_version
  34. self._printer_state = "unknown"
  35. self._is_preheating = False
  36. self._type = ""
  37. self._camera = None
  38. @pyqtProperty(str, constant = True)
  39. def firmwareVersion(self):
  40. return self._firmware_version
  41. def setCamera(self, camera):
  42. if self._camera is not camera:
  43. self._camera = camera
  44. self.cameraChanged.emit()
  45. def updateIsPreheating(self, pre_heating):
  46. if self._is_preheating != pre_heating:
  47. self._is_preheating = pre_heating
  48. self.isPreheatingChanged.emit()
  49. @pyqtProperty(bool, notify=isPreheatingChanged)
  50. def isPreheating(self):
  51. return self._is_preheating
  52. @pyqtProperty(QObject, notify=cameraChanged)
  53. def camera(self):
  54. return self._camera
  55. @pyqtProperty(str, notify = typeChanged)
  56. def type(self):
  57. return self._type
  58. def updateType(self, type):
  59. if self._type != type:
  60. self._type = type
  61. self.typeChanged.emit()
  62. @pyqtProperty(str, notify=keyChanged)
  63. def key(self):
  64. return self._key
  65. def updateKey(self, key: str):
  66. if self._key != key:
  67. self._key = key
  68. self.keyChanged.emit()
  69. @pyqtSlot()
  70. def homeHead(self):
  71. self._controller.homeHead(self)
  72. @pyqtSlot()
  73. def homeBed(self):
  74. self._controller.homeBed(self)
  75. @pyqtSlot(str)
  76. def sendCustomCommand(self, command: str):
  77. self._controller.sendCustomCommand(self, command)
  78. @pyqtProperty("QVariantList", constant = True)
  79. def extruders(self):
  80. return self._extruders
  81. @pyqtProperty(QVariant, notify = headPositionChanged)
  82. def headPosition(self):
  83. return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position_z}
  84. def updateHeadPosition(self, x, y, z):
  85. if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z:
  86. self._head_position = Vector(x, y, z)
  87. self.headPositionChanged.emit()
  88. @pyqtProperty("long", "long", "long")
  89. @pyqtProperty("long", "long", "long", "long")
  90. def setHeadPosition(self, x, y, z, speed = 3000):
  91. self.updateHeadPosition(x, y, z)
  92. self._controller.setHeadPosition(self, x, y, z, speed)
  93. @pyqtProperty("long")
  94. @pyqtProperty("long", "long")
  95. def setHeadX(self, x, speed = 3000):
  96. self.updateHeadPosition(x, self._head_position.y, self._head_position.z)
  97. self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed)
  98. @pyqtProperty("long")
  99. @pyqtProperty("long", "long")
  100. def setHeadY(self, y, speed = 3000):
  101. self.updateHeadPosition(self._head_position.x, y, self._head_position.z)
  102. self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed)
  103. @pyqtProperty("long")
  104. @pyqtProperty("long", "long")
  105. def setHeadZ(self, z, speed = 3000):
  106. self.updateHeadPosition(self._head_position.x, self._head_position.y, z)
  107. self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed)
  108. @pyqtSlot("long", "long", "long")
  109. @pyqtSlot("long", "long", "long", "long")
  110. def moveHead(self, x = 0, y = 0, z = 0, speed = 3000):
  111. self._controller.moveHead(self, x, y, z, speed)
  112. ## Pre-heats the heated bed of the printer.
  113. #
  114. # \param temperature The temperature to heat the bed to, in degrees
  115. # Celsius.
  116. # \param duration How long the bed should stay warm, in seconds.
  117. @pyqtSlot(float, float)
  118. def preheatBed(self, temperature, duration):
  119. self._controller.preheatBed(self, temperature, duration)
  120. @pyqtSlot()
  121. def cancelPreheatBed(self):
  122. self._controller.cancelPreheatBed(self)
  123. def getController(self):
  124. return self._controller
  125. @pyqtProperty(str, notify=nameChanged)
  126. def name(self):
  127. return self._name
  128. def setName(self, name):
  129. self._setName(name)
  130. self.updateName(name)
  131. def updateName(self, name):
  132. if self._name != name:
  133. self._name = name
  134. self.nameChanged.emit()
  135. ## Update the bed temperature. This only changes it locally.
  136. def updateBedTemperature(self, temperature):
  137. if self._bed_temperature != temperature:
  138. self._bed_temperature = temperature
  139. self.bedTemperatureChanged.emit()
  140. def updateTargetBedTemperature(self, temperature):
  141. if self._target_bed_temperature != temperature:
  142. self._target_bed_temperature = temperature
  143. self.targetBedTemperatureChanged.emit()
  144. ## Set the target bed temperature. This ensures that it's actually sent to the remote.
  145. @pyqtSlot(int)
  146. def setTargetBedTemperature(self, temperature):
  147. self._controller.setTargetBedTemperature(self, temperature)
  148. self.updateTargetBedTemperature(temperature)
  149. def updateActivePrintJob(self, print_job):
  150. if self._active_print_job != print_job:
  151. old_print_job = self._active_print_job
  152. if print_job is not None:
  153. print_job.updateAssignedPrinter(self)
  154. self._active_print_job = print_job
  155. if old_print_job is not None:
  156. old_print_job.updateAssignedPrinter(None)
  157. self.activePrintJobChanged.emit()
  158. def updateState(self, printer_state):
  159. if self._printer_state != printer_state:
  160. self._printer_state = printer_state
  161. self.stateChanged.emit()
  162. @pyqtProperty(QObject, notify = activePrintJobChanged)
  163. def activePrintJob(self):
  164. return self._active_print_job
  165. @pyqtProperty(str, notify=stateChanged)
  166. def state(self):
  167. return self._printer_state
  168. @pyqtProperty(int, notify = bedTemperatureChanged)
  169. def bedTemperature(self):
  170. return self._bed_temperature
  171. @pyqtProperty(int, notify=targetBedTemperatureChanged)
  172. def targetBedTemperature(self):
  173. return self._target_bed_temperature
  174. # Does the printer support pre-heating the bed at all
  175. @pyqtProperty(bool, constant=True)
  176. def canPreHeatBed(self):
  177. if self._controller:
  178. return self._controller.can_pre_heat_bed
  179. return False
  180. # Does the printer support pause at all
  181. @pyqtProperty(bool, constant=True)
  182. def canPause(self):
  183. if self._controller:
  184. return self._controller.can_pause
  185. return False
  186. # Does the printer support abort at all
  187. @pyqtProperty(bool, constant=True)
  188. def canAbort(self):
  189. if self._controller:
  190. return self._controller.can_abort
  191. return False
  192. # Does the printer support manual control at all
  193. @pyqtProperty(bool, constant=True)
  194. def canControlManually(self):
  195. if self._controller:
  196. return self._controller.can_control_manually
  197. return False