MonitorStage.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. # Copyright (c) 2017 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. import os.path
  4. from UM.Application import Application
  5. from cura.Stages.CuraStage import CuraStage
  6. class MonitorStage(CuraStage):
  7. """Stage for monitoring a 3D printing while it's printing."""
  8. def __init__(self, parent = None):
  9. super().__init__(parent)
  10. # Wait until QML engine is created, otherwise creating the new QML components will fail
  11. Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated)
  12. self._printer_output_device = None
  13. self._active_print_job = None
  14. self._active_printer = None
  15. def _setActivePrintJob(self, print_job):
  16. if self._active_print_job != print_job:
  17. self._active_print_job = print_job
  18. def _setActivePrinter(self, printer):
  19. if self._active_printer != printer:
  20. if self._active_printer:
  21. self._active_printer.activePrintJobChanged.disconnect(self._onActivePrintJobChanged)
  22. self._active_printer = printer
  23. if self._active_printer:
  24. self._setActivePrintJob(self._active_printer.activePrintJob)
  25. # Jobs might change, so we need to listen to it's changes.
  26. self._active_printer.activePrintJobChanged.connect(self._onActivePrintJobChanged)
  27. else:
  28. self._setActivePrintJob(None)
  29. def _onActivePrintJobChanged(self):
  30. self._setActivePrintJob(self._active_printer.activePrintJob)
  31. def _onActivePrinterChanged(self):
  32. self._setActivePrinter(self._printer_output_device.activePrinter)
  33. def _onOutputDevicesChanged(self):
  34. try:
  35. # We assume that you are monitoring the device with the highest priority.
  36. new_output_device = Application.getInstance().getMachineManager().printerOutputDevices[0]
  37. if new_output_device != self._printer_output_device:
  38. if self._printer_output_device:
  39. try:
  40. self._printer_output_device.printersChanged.disconnect(self._onActivePrinterChanged)
  41. except TypeError:
  42. # Ignore stupid "Not connected" errors.
  43. pass
  44. self._printer_output_device = new_output_device
  45. self._printer_output_device.printersChanged.connect(self._onActivePrinterChanged)
  46. self._setActivePrinter(self._printer_output_device.activePrinter)
  47. except IndexError:
  48. pass
  49. def _onEngineCreated(self):
  50. # We can only connect now, as we need to be sure that everything is loaded (plugins get created quite early)
  51. Application.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged)
  52. self._onOutputDevicesChanged()
  53. plugin_path = Application.getInstance().getPluginRegistry().getPluginPath(self.getPluginId())
  54. if plugin_path is not None:
  55. menu_component_path = os.path.join(plugin_path, "MonitorMenu.qml")
  56. main_component_path = os.path.join(plugin_path, "MonitorMain.qml")
  57. self.addDisplayComponent("menu", menu_component_path)
  58. self.addDisplayComponent("main", main_component_path)