ExtruderOutputModel.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. # Copyright (c) 2018 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
  4. from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
  5. from typing import Optional, TYPE_CHECKING
  6. if TYPE_CHECKING:
  7. from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
  8. from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
  9. class ExtruderOutputModel(QObject):
  10. hotendIDChanged = pyqtSignal()
  11. targetHotendTemperatureChanged = pyqtSignal()
  12. hotendTemperatureChanged = pyqtSignal()
  13. activeMaterialChanged = pyqtSignal()
  14. extruderConfigurationChanged = pyqtSignal()
  15. isPreheatingChanged = pyqtSignal()
  16. def __init__(self, printer: "PrinterOutputModel", position, parent=None) -> None:
  17. super().__init__(parent)
  18. self._printer = printer
  19. self._position = position
  20. self._target_hotend_temperature = 0 # type: float
  21. self._hotend_temperature = 0 # type: float
  22. self._hotend_id = ""
  23. self._active_material = None # type: Optional[MaterialOutputModel]
  24. self._extruder_configuration = ExtruderConfigurationModel()
  25. self._extruder_configuration.position = self._position
  26. self._is_preheating = False
  27. def getPrinter(self):
  28. return self._printer
  29. def getPosition(self):
  30. return self._position
  31. # Does the printer support pre-heating the bed at all
  32. @pyqtProperty(bool, constant=True)
  33. def canPreHeatHotends(self):
  34. if self._printer:
  35. return self._printer.canPreHeatHotends
  36. return False
  37. @pyqtProperty(QObject, notify = activeMaterialChanged)
  38. def activeMaterial(self) -> Optional["MaterialOutputModel"]:
  39. return self._active_material
  40. def updateActiveMaterial(self, material: Optional["MaterialOutputModel"]):
  41. if self._active_material != material:
  42. self._active_material = material
  43. self._extruder_configuration.material = self._active_material
  44. self.activeMaterialChanged.emit()
  45. self.extruderConfigurationChanged.emit()
  46. ## Update the hotend temperature. This only changes it locally.
  47. def updateHotendTemperature(self, temperature: float):
  48. if self._hotend_temperature != temperature:
  49. self._hotend_temperature = temperature
  50. self.hotendTemperatureChanged.emit()
  51. def updateTargetHotendTemperature(self, temperature: float):
  52. if self._target_hotend_temperature != temperature:
  53. self._target_hotend_temperature = temperature
  54. self.targetHotendTemperatureChanged.emit()
  55. ## Set the target hotend temperature. This ensures that it's actually sent to the remote.
  56. @pyqtSlot(float)
  57. def setTargetHotendTemperature(self, temperature: float):
  58. self._printer.getController().setTargetHotendTemperature(self._printer, self, temperature)
  59. self.updateTargetHotendTemperature(temperature)
  60. @pyqtProperty(float, notify = targetHotendTemperatureChanged)
  61. def targetHotendTemperature(self) -> float:
  62. return self._target_hotend_temperature
  63. @pyqtProperty(float, notify = hotendTemperatureChanged)
  64. def hotendTemperature(self) -> float:
  65. return self._hotend_temperature
  66. @pyqtProperty(str, notify = hotendIDChanged)
  67. def hotendID(self) -> str:
  68. return self._hotend_id
  69. def updateHotendID(self, id: str):
  70. if self._hotend_id != id:
  71. self._hotend_id = id
  72. self._extruder_configuration.hotendID = self._hotend_id
  73. self.hotendIDChanged.emit()
  74. self.extruderConfigurationChanged.emit()
  75. @pyqtProperty(QObject, notify = extruderConfigurationChanged)
  76. def extruderConfiguration(self):
  77. if self._extruder_configuration.isValid():
  78. return self._extruder_configuration
  79. return None
  80. def updateIsPreheating(self, pre_heating):
  81. if self._is_preheating != pre_heating:
  82. self._is_preheating = pre_heating
  83. self.isPreheatingChanged.emit()
  84. @pyqtProperty(bool, notify=isPreheatingChanged)
  85. def isPreheating(self):
  86. return self._is_preheating
  87. ## Pre-heats the extruder before printer.
  88. #
  89. # \param temperature The temperature to heat the extruder to, in degrees
  90. # Celsius.
  91. # \param duration How long the bed should stay warm, in seconds.
  92. @pyqtSlot(float, float)
  93. def preheatHotend(self, temperature, duration):
  94. self._printer._controller.preheatHotend(self, temperature, duration)
  95. @pyqtSlot()
  96. def cancelPreheatHotend(self):
  97. self._printer._controller.cancelPreheatHotend(self)