123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628 |
- from UM.i18n import i18nCatalog
- from UM.OutputDevice.OutputDevice import OutputDevice
- from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer
- from PyQt5.QtWidgets import QMessageBox
- from enum import IntEnum
- from UM.Settings.ContainerRegistry import ContainerRegistry
- from UM.Logger import Logger
- from UM.Signal import signalemitter
- i18n_catalog = i18nCatalog("cura")
- @signalemitter
- class PrinterOutputDevice(QObject, OutputDevice):
- def __init__(self, device_id, parent = None):
- super().__init__(device_id = device_id, parent = parent)
- self._container_registry = ContainerRegistry.getInstance()
- self._target_bed_temperature = 0
- self._bed_temperature = 0
- self._num_extruders = 1
- self._hotend_temperatures = [0] * self._num_extruders
- self._target_hotend_temperatures = [0] * self._num_extruders
- self._material_ids = [""] * self._num_extruders
- self._hotend_ids = [""] * self._num_extruders
- self._progress = 0
- self._head_x = 0
- self._head_y = 0
- self._head_z = 0
- self._connection_state = ConnectionState.closed
- self._connection_text = ""
- self._time_elapsed = 0
- self._time_total = 0
- self._job_state = ""
- self._job_name = ""
- self._error_text = ""
- self._accepts_commands = True
- self._preheat_bed_timeout = 900
- self._preheat_bed_timer = QTimer()
- self._preheat_bed_timer.setSingleShot(True)
- self._preheat_bed_timer.timeout.connect(self.cancelPreheatBed)
- self._printer_state = ""
- self._printer_type = "unknown"
- self._camera_active = False
- def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None):
- raise NotImplementedError("requestWrite needs to be implemented")
-
-
- bedTemperatureChanged = pyqtSignal()
-
- targetBedTemperatureChanged = pyqtSignal()
-
- progressChanged = pyqtSignal()
-
- hotendTemperaturesChanged = pyqtSignal()
-
- targetHotendTemperaturesChanged = pyqtSignal()
-
- headPositionChanged = pyqtSignal()
-
- materialIdChanged = pyqtSignal(int, str, arguments = ["index", "id"])
-
- hotendIdChanged = pyqtSignal(int, str, arguments = ["index", "id"])
-
-
- connectionStateChanged = pyqtSignal(str)
- connectionTextChanged = pyqtSignal()
- timeElapsedChanged = pyqtSignal()
- timeTotalChanged = pyqtSignal()
- jobStateChanged = pyqtSignal()
- jobNameChanged = pyqtSignal()
- errorTextChanged = pyqtSignal()
- acceptsCommandsChanged = pyqtSignal()
- printerStateChanged = pyqtSignal()
- printerTypeChanged = pyqtSignal()
-
- preheatBedRemainingTimeChanged = pyqtSignal()
- @pyqtProperty(str, notify=printerTypeChanged)
- def printerType(self):
- return self._printer_type
- @pyqtProperty(str, notify=printerStateChanged)
- def printerState(self):
- return self._printer_state
- @pyqtProperty(str, notify = jobStateChanged)
- def jobState(self):
- return self._job_state
- def _updatePrinterType(self, printer_type):
- if self._printer_type != printer_type:
- self._printer_type = printer_type
- self.printerTypeChanged.emit()
- def _updatePrinterState(self, printer_state):
- if self._printer_state != printer_state:
- self._printer_state = printer_state
- self.printerStateChanged.emit()
- def _updateJobState(self, job_state):
- if self._job_state != job_state:
- self._job_state = job_state
- self.jobStateChanged.emit()
- @pyqtSlot(str)
- def setJobState(self, job_state):
- self._setJobState(job_state)
- def _setJobState(self, job_state):
- Logger.log("w", "_setJobState is not implemented by this output device")
- @pyqtSlot()
- def startCamera(self):
- self._camera_active = True
- self._startCamera()
- def _startCamera(self):
- Logger.log("w", "_startCamera is not implemented by this output device")
- @pyqtSlot()
- def stopCamera(self):
- self._camera_active = False
- self._stopCamera()
- def _stopCamera(self):
- Logger.log("w", "_stopCamera is not implemented by this output device")
- @pyqtProperty(str, notify = jobNameChanged)
- def jobName(self):
- return self._job_name
- def setJobName(self, name):
- if self._job_name != name:
- self._job_name = name
- self.jobNameChanged.emit()
-
- @pyqtProperty(str, constant = True)
- def address(self):
- Logger.log("w", "address is not implemented by this output device.")
-
- @pyqtProperty(str, constant = True)
- def name(self):
- Logger.log("w", "name is not implemented by this output device.")
- return ""
- @pyqtProperty(str, notify = errorTextChanged)
- def errorText(self):
- return self._error_text
-
- def setErrorText(self, error_text):
- if self._error_text != error_text:
- self._error_text = error_text
- self.errorTextChanged.emit()
- @pyqtProperty(bool, notify = acceptsCommandsChanged)
- def acceptsCommands(self):
- return self._accepts_commands
-
- def setAcceptsCommands(self, accepts_commands):
- if self._accepts_commands != accepts_commands:
- self._accepts_commands = accepts_commands
- self.acceptsCommandsChanged.emit()
-
-
-
- @pyqtProperty(float, notify = bedTemperatureChanged)
- def bedTemperature(self):
- return self._bed_temperature
-
-
-
-
- @pyqtSlot(int)
- def setTargetBedTemperature(self, temperature):
- self._setTargetBedTemperature(temperature)
- if self._target_bed_temperature != temperature:
- self._target_bed_temperature = temperature
- self.targetBedTemperatureChanged.emit()
-
-
-
- @pyqtProperty(int, constant = True)
- def preheatBedTimeout(self):
- return self._preheat_bed_timeout
-
-
-
-
- @pyqtProperty(str, notify = preheatBedRemainingTimeChanged)
- def preheatBedRemainingTime(self):
- if not self._preheat_bed_timer.isActive():
- return ""
- period = self._preheat_bed_timer.remainingTime()
- if period <= 0:
- return ""
- minutes, period = divmod(period, 60000)
- seconds, _ = divmod(period, 1000)
- if minutes <= 0 and seconds <= 0:
- return ""
- return "%d:%02d" % (minutes, seconds)
-
-
- @pyqtProperty(float, notify = timeElapsedChanged)
- def timeElapsed(self):
- return self._time_elapsed
-
-
- @pyqtProperty(float, notify=timeTotalChanged)
- def timeTotal(self):
- return self._time_total
- @pyqtSlot(float)
- def setTimeTotal(self, new_total):
- if self._time_total != new_total:
- self._time_total = new_total
- self.timeTotalChanged.emit()
- @pyqtSlot(float)
- def setTimeElapsed(self, time_elapsed):
- if self._time_elapsed != time_elapsed:
- self._time_elapsed = time_elapsed
- self.timeElapsedChanged.emit()
-
-
-
- @pyqtSlot()
- def homeHead(self):
- self._homeHead()
-
-
- def _homeHead(self):
- Logger.log("w", "_homeHead is not implemented by this output device")
-
-
-
- @pyqtSlot()
- def homeBed(self):
- self._homeBed()
-
-
-
- def _homeBed(self):
- Logger.log("w", "_homeBed is not implemented by this output device")
-
-
-
- def _setTargetBedTemperature(self, temperature):
- Logger.log("w", "_setTargetBedTemperature is not implemented by this output device")
-
-
-
-
-
- @pyqtSlot(float, float)
- def preheatBed(self, temperature, duration):
- Logger.log("w", "preheatBed is not implemented by this output device.")
-
-
-
- @pyqtSlot()
- def cancelPreheatBed(self):
- Logger.log("w", "cancelPreheatBed is not implemented by this output device.")
-
-
-
- def _setBedTemperature(self, temperature):
- if self._bed_temperature != temperature:
- self._bed_temperature = temperature
- self.bedTemperatureChanged.emit()
-
- @pyqtProperty(int, notify = targetBedTemperatureChanged)
- def targetBedTemperature(self):
- return self._target_bed_temperature
-
-
-
-
-
- @pyqtSlot(int, int)
- def setTargetHotendTemperature(self, index, temperature):
- self._setTargetHotendTemperature(index, temperature)
- if self._target_hotend_temperatures[index] != temperature:
- self._target_hotend_temperatures[index] = temperature
- self.targetHotendTemperaturesChanged.emit()
-
-
-
-
- def _setTargetHotendTemperature(self, index, temperature):
- Logger.log("w", "_setTargetHotendTemperature is not implemented by this output device")
- @pyqtProperty("QVariantList", notify = targetHotendTemperaturesChanged)
- def targetHotendTemperatures(self):
- return self._target_hotend_temperatures
- @pyqtProperty("QVariantList", notify = hotendTemperaturesChanged)
- def hotendTemperatures(self):
- return self._hotend_temperatures
-
-
-
-
- def _setHotendTemperature(self, index, temperature):
- if self._hotend_temperatures[index] != temperature:
- self._hotend_temperatures[index] = temperature
- self.hotendTemperaturesChanged.emit()
- @pyqtProperty("QVariantList", notify = materialIdChanged)
- def materialIds(self):
- return self._material_ids
- @pyqtProperty("QVariantList", notify = materialIdChanged)
- def materialNames(self):
- result = []
- for material_id in self._material_ids:
- if material_id is None:
- result.append(i18n_catalog.i18nc("@item:material", "No material loaded"))
- continue
- containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_id)
- if containers:
- result.append(containers[0].getName())
- else:
- result.append(i18n_catalog.i18nc("@item:material", "Unknown material"))
- return result
-
-
-
-
-
-
-
- @pyqtProperty("QVariantList", notify = materialIdChanged)
- def materialColors(self):
- result = []
- for material_id in self._material_ids:
- if material_id is None:
- result.append("#00000000")
- continue
- containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_id)
- if containers:
- result.append(containers[0].getMetaDataEntry("color_code"))
- else:
- result.append("#00000000")
- return result
-
-
-
- def _setMaterialId(self, index, material_id):
- if material_id and material_id != "" and material_id != self._material_ids[index]:
- Logger.log("d", "Setting material id of hotend %d to %s" % (index, material_id))
- self._material_ids[index] = material_id
- self.materialIdChanged.emit(index, material_id)
- @pyqtProperty("QVariantList", notify = hotendIdChanged)
- def hotendIds(self):
- return self._hotend_ids
-
-
-
- def _setHotendId(self, index, hotend_id):
- if hotend_id and hotend_id != self._hotend_ids[index]:
- Logger.log("d", "Setting hotend id of hotend %d to %s" % (index, hotend_id))
- self._hotend_ids[index] = hotend_id
- self.hotendIdChanged.emit(index, hotend_id)
- elif not hotend_id:
- Logger.log("d", "Removing hotend id of hotend %d.", index)
- self._hotend_ids[index] = None
- self.hotendIdChanged.emit(index, None)
-
-
- def materialHotendChangedMessage(self, callback):
- Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'")
- callback(QMessageBox.Yes)
-
- def connect(self):
- raise NotImplementedError("connect needs to be implemented")
-
- def close(self):
- raise NotImplementedError("close needs to be implemented")
- @pyqtProperty(bool, notify = connectionStateChanged)
- def connectionState(self):
- return self._connection_state
-
-
- def setConnectionState(self, connection_state):
- if self._connection_state != connection_state:
- self._connection_state = connection_state
- self.connectionStateChanged.emit(self._id)
- @pyqtProperty(str, notify = connectionTextChanged)
- def connectionText(self):
- return self._connection_text
-
- def setConnectionText(self, connection_text):
- if self._connection_text != connection_text:
- self._connection_text = connection_text
- self.connectionTextChanged.emit()
-
- def __del__(self):
- self.close()
-
-
- @pyqtProperty(float, notify = headPositionChanged)
- def headX(self):
- return self._head_x
-
-
- @pyqtProperty(float, notify = headPositionChanged)
- def headY(self):
- return self._head_y
-
-
-
- @pyqtProperty(float, notify = headPositionChanged)
- def headZ(self):
- return self._head_z
-
-
- def _updateHeadPosition(self, x, y ,z):
- position_changed = False
- if self._head_x != x:
- self._head_x = x
- position_changed = True
- if self._head_y != y:
- self._head_y = y
- position_changed = True
- if self._head_z != z:
- self._head_z = z
- position_changed = True
- if position_changed:
- self.headPositionChanged.emit()
-
-
-
-
-
-
-
-
- @pyqtSlot("long", "long", "long")
- @pyqtSlot("long", "long", "long", "long")
- def setHeadPosition(self, x, y, z, speed = 3000):
- self._setHeadPosition(x, y , z, speed)
-
-
-
-
-
- @pyqtSlot("long")
- @pyqtSlot("long", "long")
- def setHeadX(self, x, speed = 3000):
- self._setHeadX(x, speed)
-
-
-
-
-
- @pyqtSlot("long")
- @pyqtSlot("long", "long")
- def setHeadY(self, y, speed = 3000):
- self._setHeadY(y, speed)
-
-
-
-
-
-
- @pyqtSlot("long")
- @pyqtSlot("long", "long")
- def setHeadZ(self, z, speed = 3000):
- self._setHeadY(z, speed)
-
-
-
-
-
-
-
-
-
- @pyqtSlot("long", "long", "long")
- @pyqtSlot("long", "long", "long", "long")
- def moveHead(self, x = 0, y = 0, z = 0, speed = 3000):
- self._moveHead(x, y, z, speed)
-
-
-
-
-
-
- def _moveHead(self, x, y, z, speed):
- Logger.log("w", "_moveHead is not implemented by this output device")
-
-
-
-
-
-
- def _setHeadPosition(self, x, y, z, speed):
- Logger.log("w", "_setHeadPosition is not implemented by this output device")
-
-
-
-
- def _setHeadX(self, x, speed):
- Logger.log("w", "_setHeadX is not implemented by this output device")
-
-
-
-
- def _setHeadY(self, y, speed):
- Logger.log("w", "_setHeadY is not implemented by this output device")
-
-
-
-
- def _setHeadZ(self, z, speed):
- Logger.log("w", "_setHeadZ is not implemented by this output device")
-
-
-
-
- @pyqtProperty(float, notify = progressChanged)
- def progress(self):
- return self._progress
-
-
- def setProgress(self, progress):
- if self._progress != progress:
- self._progress = progress
- self.progressChanged.emit()
- class ConnectionState(IntEnum):
- closed = 0
- connecting = 1
- connected = 2
- busy = 3
- error = 4
|