From e35fba6f05d5d86a47db7a1f7d26138445a2155e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 15:05:08 +0100 Subject: [PATCH 001/205] Added first stubs for printer output models CL-541 --- cura/PrinterOutput/ExtruderModel.py | 76 ++++++++++++++++++ cura/PrinterOutput/MaterialModel.py | 29 +++++++ cura/PrinterOutput/PrintJobModel.py | 10 +++ cura/PrinterOutput/PrinterModel.py | 115 ++++++++++++++++++++++++++++ cura/PrinterOutput/__init__.py | 0 5 files changed, 230 insertions(+) create mode 100644 cura/PrinterOutput/ExtruderModel.py create mode 100644 cura/PrinterOutput/MaterialModel.py create mode 100644 cura/PrinterOutput/PrintJobModel.py create mode 100644 cura/PrinterOutput/PrinterModel.py create mode 100644 cura/PrinterOutput/__init__.py diff --git a/cura/PrinterOutput/ExtruderModel.py b/cura/PrinterOutput/ExtruderModel.py new file mode 100644 index 0000000000..f08b21aaac --- /dev/null +++ b/cura/PrinterOutput/ExtruderModel.py @@ -0,0 +1,76 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot +from UM.Logger import Logger + +from typing import Optional + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrinterModel import PrinterModel + from cura.PrinterOutput.MaterialModel import MaterialModel + + +class ExtruderModel(QObject): + hotendIDChanged = pyqtSignal() + targetHotendTemperatureChanged = pyqtSignal() + hotendTemperatureChanged = pyqtSignal() + activeMaterialChanged = pyqtSignal() + + def __init__(self, printer: "PrinterModel", parent=None): + super().__init__(parent) + self._printer = printer + self._target_hotend_temperature = 0 + self._hotend_temperature = 0 + self._hotend_id = "" + self._active_material = None # type: Optional[MaterialModel] + + @pyqtProperty(QObject, notify = activeMaterialChanged) + def activeMaterial(self) -> "MaterialModel": + return self._active_material + + def updateActiveMaterial(self, material: Optional["MaterialModel"]): + if self._active_material != material: + self._active_material = material + self.activeMaterialChanged.emit() + + ## Update the hotend temperature. This only changes it locally. + def updateHotendTemperature(self, temperature: int): + if self._hotend_temperature != temperature: + self._hotend_temperature = temperature + self.hotendTemperatureChanged.emit() + + def updateTargetHotendTemperature(self, temperature: int): + if self._target_hotend_temperature != temperature: + self._target_hotend_temperature = temperature + self.targetHotendTemperatureChanged.emit() + + ## Set the target hotend temperature. This ensures that it's actually sent to the remote. + @pyqtSlot(int) + def setTargetHotendTemperature(self, temperature: int): + self._setTargetHotendTemperature(temperature) + self.updateTargetHotendTemperature(temperature) + + @pyqtProperty(int, notify = targetHotendTemperatureChanged) + def targetHotendTemperature(self) -> int: + return self._target_hotend_temperature + + @pyqtProperty(int, notify=hotendTemperatureChanged) + def hotendTemperature(self) -> int: + return self._hotendTemperature + + ## Protected setter for the hotend temperature of the connected printer (if any). + # /parameter temperature Temperature hotend needs to go to (in deg celsius) + # /sa setTargetHotendTemperature + def _setTargetHotendTemperature(self, temperature): + Logger.log("w", "_setTargetHotendTemperature is not implemented by this model") + + @pyqtProperty(str, notify = hotendIDChanged) + def hotendID(self) -> str: + return self._hotend_id + + def updateHotendID(self, id: str): + if self._hotend_id != id: + self._hotend_id = id + self.hotendIDChanged.emit() diff --git a/cura/PrinterOutput/MaterialModel.py b/cura/PrinterOutput/MaterialModel.py new file mode 100644 index 0000000000..41a3680d57 --- /dev/null +++ b/cura/PrinterOutput/MaterialModel.py @@ -0,0 +1,29 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot + + +class MaterialModel(QObject): + def __init__(self, guid, type, color, brand, parent = None): + super().__init__(parent) + self._guid = guid + self._type = type + self._color = color + self._brand = brand + + @pyqtProperty(str, constant = True) + def guid(self): + return self._guid + + @pyqtProperty(str, constant=True) + def type(self): + return self._type + + @pyqtProperty(str, constant=True) + def brand(self): + return self._brand + + @pyqtProperty(str, constant=True) + def color(self): + return self._color \ No newline at end of file diff --git a/cura/PrinterOutput/PrintJobModel.py b/cura/PrinterOutput/PrintJobModel.py new file mode 100644 index 0000000000..9b7952322a --- /dev/null +++ b/cura/PrinterOutput/PrintJobModel.py @@ -0,0 +1,10 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant + + +class PrintJobModel(QObject): + + def __init__(self, parent=None): + super().__init__(parent) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterModel.py b/cura/PrinterOutput/PrinterModel.py new file mode 100644 index 0000000000..72933ed22a --- /dev/null +++ b/cura/PrinterOutput/PrinterModel.py @@ -0,0 +1,115 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot +from UM.Logger import Logger +from typing import Optional, List + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobModel import PrintJobModel + from cura.PrinterOutput.ExtruderModel import ExtruderModel + + +class PrinterModel(QObject): + bedTemperatureChanged = pyqtSignal() + targetBedTemperatureChanged = pyqtSignal() + printerStateChanged = pyqtSignal() + activePrintJobChanged = pyqtSignal() + nameChanged = pyqtSignal() + + def __init__(self, parent=None): + super().__init__(parent) + self._bed_temperature = 0 + self._target_bed_temperature = 0 + self._name = "" + + self._extruders = [] # type: List[ExtruderModel] + + self._active_print_job = None # type: Optional[PrintJobModel] + + # Features of the printer; + self._can_pause = True + self._can_abort = True + self._can_pre_heat_bed = True + self._can_control_manually = True + + @pyqtProperty(str, notify=nameChanged) + def name(self): + return self._name + + def setName(self, name): + self._setName(name) + self.updateName(name) + + def _setName(self, name): + Logger.log("w", "_setTargetBedTemperature is not implemented by this model") + + def updateName(self, name): + if self._name != name: + self._name = name + self.nameChanged.emit() + + ## Update the bed temperature. This only changes it locally. + def updateBedTemperature(self, temperature): + if self._bed_temperature != temperature: + self._bed_temperature = temperature + self.bedTemperatureChanged.emit() + + def updateTargetBedTemperature(self, temperature): + if self._target_bed_temperature != temperature: + self._target_bed_temperature = temperature + self.targetBedTemperatureChanged.emit() + + ## Set the target bed temperature. This ensures that it's actually sent to the remote. + @pyqtSlot(int) + def setTargetBedTemperature(self, temperature): + self._setTargetBedTemperature(temperature) + self.updateTargetBedTemperature(temperature) + + ## Protected setter for the bed temperature of the connected printer (if any). + # /parameter temperature Temperature bed needs to go to (in deg celsius) + # /sa setTargetBedTemperature + def _setTargetBedTemperature(self, temperature): + Logger.log("w", "_setTargetBedTemperature is not implemented by this model") + + def updateActivePrintJob(self, print_job): + if self._active_print_job != print_job: + self._active_print_job = print_job + self.activePrintJobChanged.emit() + + @pyqtProperty(QObject, notify = activePrintJobChanged) + def activePrintJob(self): + return self._active_print_job + + @pyqtProperty(str, notify=printerStateChanged) + def printerState(self): + return self._printer_state + + @pyqtProperty(int, notify = bedTemperatureChanged) + def bedTemperature(self): + return self._bed_temperature + + @pyqtProperty(int, notify=targetBedTemperatureChanged) + def targetBedTemperature(self): + return self._target_bed_temperature + + # Does the printer support pre-heating the bed at all + @pyqtProperty(bool, constant=True) + def canPreHeatBed(self): + return self._can_pre_heat_bed + + # Does the printer support pause at all + @pyqtProperty(bool, constant=True) + def canPause(self): + return self._can_pause + + # Does the printer support abort at all + @pyqtProperty(bool, constant=True) + def canAbort(self): + return self._can_abort + + # Does the printer support manual control at all + @pyqtProperty(bool, constant=True) + def canControlManually(self): + return self._can_control_manually diff --git a/cura/PrinterOutput/__init__.py b/cura/PrinterOutput/__init__.py new file mode 100644 index 0000000000..e69de29bb2 From 700f7179f1d5cbfed9b88aa56ee41d7c56c07cd8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 16:05:28 +0100 Subject: [PATCH 002/205] Rename models to prevent conflict --- .../{ExtruderModel.py => ExtruderOuputModel.py} | 14 +++++++------- .../{MaterialModel.py => MaterialOutputModel.py} | 2 +- .../{PrintJobModel.py => PrintJobOutputModel.py} | 2 +- .../{PrinterModel.py => PrinterOutputModel.py} | 10 +++++----- 4 files changed, 14 insertions(+), 14 deletions(-) rename cura/PrinterOutput/{ExtruderModel.py => ExtruderOuputModel.py} (84%) rename cura/PrinterOutput/{MaterialModel.py => MaterialOutputModel.py} (91%) rename cura/PrinterOutput/{PrintJobModel.py => PrintJobOutputModel.py} (75%) rename cura/PrinterOutput/{PrinterModel.py => PrinterOutputModel.py} (93%) diff --git a/cura/PrinterOutput/ExtruderModel.py b/cura/PrinterOutput/ExtruderOuputModel.py similarity index 84% rename from cura/PrinterOutput/ExtruderModel.py rename to cura/PrinterOutput/ExtruderOuputModel.py index f08b21aaac..d465b7250a 100644 --- a/cura/PrinterOutput/ExtruderModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -8,29 +8,29 @@ from typing import Optional MYPY = False if MYPY: - from cura.PrinterOutput.PrinterModel import PrinterModel - from cura.PrinterOutput.MaterialModel import MaterialModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel -class ExtruderModel(QObject): +class ExtruderOutputModel(QObject): hotendIDChanged = pyqtSignal() targetHotendTemperatureChanged = pyqtSignal() hotendTemperatureChanged = pyqtSignal() activeMaterialChanged = pyqtSignal() - def __init__(self, printer: "PrinterModel", parent=None): + def __init__(self, printer: "PrinterOutputModel", parent=None): super().__init__(parent) self._printer = printer self._target_hotend_temperature = 0 self._hotend_temperature = 0 self._hotend_id = "" - self._active_material = None # type: Optional[MaterialModel] + self._active_material = None # type: Optional[MaterialOutputModel] @pyqtProperty(QObject, notify = activeMaterialChanged) - def activeMaterial(self) -> "MaterialModel": + def activeMaterial(self) -> "MaterialOutputModel": return self._active_material - def updateActiveMaterial(self, material: Optional["MaterialModel"]): + def updateActiveMaterial(self, material: Optional["MaterialOutputModel"]): if self._active_material != material: self._active_material = material self.activeMaterialChanged.emit() diff --git a/cura/PrinterOutput/MaterialModel.py b/cura/PrinterOutput/MaterialOutputModel.py similarity index 91% rename from cura/PrinterOutput/MaterialModel.py rename to cura/PrinterOutput/MaterialOutputModel.py index 41a3680d57..0471b85db8 100644 --- a/cura/PrinterOutput/MaterialModel.py +++ b/cura/PrinterOutput/MaterialOutputModel.py @@ -4,7 +4,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot -class MaterialModel(QObject): +class MaterialOutputModel(QObject): def __init__(self, guid, type, color, brand, parent = None): super().__init__(parent) self._guid = guid diff --git a/cura/PrinterOutput/PrintJobModel.py b/cura/PrinterOutput/PrintJobOutputModel.py similarity index 75% rename from cura/PrinterOutput/PrintJobModel.py rename to cura/PrinterOutput/PrintJobOutputModel.py index 9b7952322a..b2eb3824e3 100644 --- a/cura/PrinterOutput/PrintJobModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -4,7 +4,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant -class PrintJobModel(QObject): +class PrintJobOutputModel(QObject): def __init__(self, parent=None): super().__init__(parent) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterModel.py b/cura/PrinterOutput/PrinterOutputModel.py similarity index 93% rename from cura/PrinterOutput/PrinterModel.py rename to cura/PrinterOutput/PrinterOutputModel.py index 72933ed22a..ec1a268631 100644 --- a/cura/PrinterOutput/PrinterModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -7,11 +7,11 @@ from typing import Optional, List MYPY = False if MYPY: - from cura.PrinterOutput.PrintJobModel import PrintJobModel - from cura.PrinterOutput.ExtruderModel import ExtruderModel + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel -class PrinterModel(QObject): +class PrinterOutputModel(QObject): bedTemperatureChanged = pyqtSignal() targetBedTemperatureChanged = pyqtSignal() printerStateChanged = pyqtSignal() @@ -24,9 +24,9 @@ class PrinterModel(QObject): self._target_bed_temperature = 0 self._name = "" - self._extruders = [] # type: List[ExtruderModel] + self._extruders = [] # type: List[ExtruderOutputModel] - self._active_print_job = None # type: Optional[PrintJobModel] + self._active_print_job = None # type: Optional[PrintJobOutputModel] # Features of the printer; self._can_pause = True From 3a8eef9768721f7d3a95ac89e8a7e67b9da813d9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 16:25:44 +0100 Subject: [PATCH 003/205] Added a printerOutputController to send commands to remote. The idea is that this class can be subclassed. CL-541 --- cura/PrinterOutput/ExtruderOuputModel.py | 8 +--- cura/PrinterOutput/PrintJobOutputModel.py | 44 ++++++++++++++++++- cura/PrinterOutput/PrinterOutputController.py | 21 +++++++++ cura/PrinterOutput/PrinterOutputModel.py | 19 +++----- 4 files changed, 71 insertions(+), 21 deletions(-) create mode 100644 cura/PrinterOutput/PrinterOutputController.py diff --git a/cura/PrinterOutput/ExtruderOuputModel.py b/cura/PrinterOutput/ExtruderOuputModel.py index d465b7250a..121e9a69d9 100644 --- a/cura/PrinterOutput/ExtruderOuputModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -49,7 +49,7 @@ class ExtruderOutputModel(QObject): ## Set the target hotend temperature. This ensures that it's actually sent to the remote. @pyqtSlot(int) def setTargetHotendTemperature(self, temperature: int): - self._setTargetHotendTemperature(temperature) + self._printer.getController().setTargetHotendTemperature(self._printer, self, temperature) self.updateTargetHotendTemperature(temperature) @pyqtProperty(int, notify = targetHotendTemperatureChanged) @@ -60,12 +60,6 @@ class ExtruderOutputModel(QObject): def hotendTemperature(self) -> int: return self._hotendTemperature - ## Protected setter for the hotend temperature of the connected printer (if any). - # /parameter temperature Temperature hotend needs to go to (in deg celsius) - # /sa setTargetHotendTemperature - def _setTargetHotendTemperature(self, temperature): - Logger.log("w", "_setTargetHotendTemperature is not implemented by this model") - @pyqtProperty(str, notify = hotendIDChanged) def hotendID(self) -> str: return self._hotend_id diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index b2eb3824e3..1e0d82f1b0 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -2,9 +2,49 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant +MYPY = False +if MYPY: + from cura.PrinterOutput.PrinterOutputController import PrinterOutputController class PrintJobOutputModel(QObject): + stateChanged = pyqtSignal() + timeTotalChanged = pyqtSignal() + timeElapsedChanged = pyqtSignal() - def __init__(self, parent=None): - super().__init__(parent) \ No newline at end of file + def __init__(self, output_controller: "PrinterOutputController", parent=None): + super().__init__(parent) + self._output_controller = output_controller + self._state = "" + self._time_total = 0 + self._time_elapsed = 0 + + @pyqtProperty(int, notify = timeTotalChanged) + def timeTotal(self): + return self._time_total + + @pyqtProperty(int, notify = timeElapsedChanged) + def timeElapsed(self): + return self._time_elapsed + + @pyqtProperty(str, notify=stateChanged) + def state(self): + return self._state + + def updateTimeTotal(self, new_time_total): + if self._time_total != new_time_total: + self._time_total = new_time_total + self.timeTotalChanged.emit() + + def updateTimeElapsed(self, new_time_elapsed): + if self._time_elapsed != new_time_elapsed: + self._time_elapsed = new_time_elapsed + self.timeElapsedChanged.emit() + + def updateState(self, new_state): + if self._state != new_state: + self._state = new_state + self.stateChanged.emit() + + def setState(self, state): + self._output_controller.setJobState(self, state) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py new file mode 100644 index 0000000000..c69b49e6e3 --- /dev/null +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -0,0 +1,21 @@ + + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.ExtruderOuputModel import ExtruderOuputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + +class PrinterOutputController: + def __init__(self): + pass + + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): + # TODO: implement + pass + + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + pass + + def setJobState(self, job: "PrintJobOutputModel", state: str): + pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index ec1a268631..d34883a56b 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -9,6 +9,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel + from cura.PrinterOutput.PrinterOutputController import PrinterOutputController class PrinterOutputModel(QObject): @@ -18,12 +19,12 @@ class PrinterOutputModel(QObject): activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() - def __init__(self, parent=None): + def __init__(self, output_controller: "PrinterOutputController", parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" - + self._controller = output_controller self._extruders = [] # type: List[ExtruderOutputModel] self._active_print_job = None # type: Optional[PrintJobOutputModel] @@ -34,6 +35,9 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + def getController(self): + return self._controller + @pyqtProperty(str, notify=nameChanged) def name(self): return self._name @@ -42,9 +46,6 @@ class PrinterOutputModel(QObject): self._setName(name) self.updateName(name) - def _setName(self, name): - Logger.log("w", "_setTargetBedTemperature is not implemented by this model") - def updateName(self, name): if self._name != name: self._name = name @@ -64,15 +65,9 @@ class PrinterOutputModel(QObject): ## Set the target bed temperature. This ensures that it's actually sent to the remote. @pyqtSlot(int) def setTargetBedTemperature(self, temperature): - self._setTargetBedTemperature(temperature) + self._controller.setTargetBedTemperature(self, temperature) self.updateTargetBedTemperature(temperature) - ## Protected setter for the bed temperature of the connected printer (if any). - # /parameter temperature Temperature bed needs to go to (in deg celsius) - # /sa setTargetBedTemperature - def _setTargetBedTemperature(self, temperature): - Logger.log("w", "_setTargetBedTemperature is not implemented by this model") - def updateActivePrintJob(self, print_job): if self._active_print_job != print_job: self._active_print_job = print_job From f0a8db3d4ea3de703ae129d29d7017b3298fcc5e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 16:48:36 +0100 Subject: [PATCH 004/205] Add way to set head position CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 12 ++++ cura/PrinterOutput/PrinterOutputModel.py | 58 ++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index c69b49e6e3..be077dd352 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -18,4 +18,16 @@ class PrinterOutputController: pass def setJobState(self, job: "PrintJobOutputModel", state: str): + pass + + def cancelPreheatBed(self, printer: "PrinterOutputModel"): + pass + + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + pass + + def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed): + pass + + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index d34883a56b..407a433bb4 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -4,6 +4,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot from UM.Logger import Logger from typing import Optional, List +from UM.Math.Vector import Vector MYPY = False if MYPY: @@ -18,15 +19,19 @@ class PrinterOutputModel(QObject): printerStateChanged = pyqtSignal() activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() + headPositionChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", parent=None): + def __init__(self, output_controller: "PrinterOutputController", extruders: Optional["ExtruderOutputModel"] = None, parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" self._controller = output_controller self._extruders = [] # type: List[ExtruderOutputModel] + if self._extruders is not None: + self._extruders = extruders + self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] # Features of the printer; @@ -35,6 +40,57 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + @pyqtProperty("QVariantList", constant = True) + def extruders(self): + return self._extruders + + @pyqtProperty(QVariant, notify = headPositionChanged) + def headPosition(self): + return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position_z} + + def updateHeadPosition(self, x, y, z): + if self._head_position.x != x or self._head_position.y != y or self._head_position.z != z: + self._head_position = Vector(x, y, z) + self.headPositionChanged.emit() + + @pyqtProperty("long", "long", "long") + @pyqtProperty("long", "long", "long", "long") + def setHeadPosition(self, x, y, z, speed = 3000): + self._controller.setHeadPosition(self, x, y, z, speed) + + @pyqtProperty("long") + @pyqtProperty("long", "long") + def setHeadX(self, x, speed = 3000): + self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed) + + @pyqtProperty("long") + @pyqtProperty("long", "long") + def setHeadY(self, y, speed = 3000): + self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed) + + @pyqtProperty("long") + @pyqtProperty("long", "long") + def setHeadY(self, z, speed = 3000): + self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed) + + @pyqtSlot("long", "long", "long") + @pyqtSlot("long", "long", "long", "long") + def moveHead(self, x = 0, y = 0, z = 0, speed = 3000): + self._controller.moveHead(self, x, y, z, speed) + + ## Pre-heats the heated bed of the printer. + # + # \param temperature The temperature to heat the bed to, in degrees + # Celsius. + # \param duration How long the bed should stay warm, in seconds. + @pyqtSlot(float, float) + def preheatBed(self, temperature, duration): + self._controller.preheatBed(self, temperature, duration) + + @pyqtSlot() + def cancelPreheatBed(self): + self._controller.cancelPreheatBed(self) + def getController(self): return self._controller From 00a5127b192325c99d5f2e5e23850cebade54e8c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 17:00:09 +0100 Subject: [PATCH 005/205] Added home head & bed CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 6 ++++++ cura/PrinterOutput/PrinterOutputModel.py | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index be077dd352..0625a8ef9f 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -30,4 +30,10 @@ class PrinterOutputController: pass def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + pass + + def homeBed(self, printer): + pass + + def homeHead(self, printer): pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 407a433bb4..ab8ca83ec6 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -40,6 +40,14 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + @pyqtSlot() + def homeHead(self): + self._controller.homeHead(self) + + @pyqtSlot() + def homeBed(self): + self._controller.homeBed(self) + @pyqtProperty("QVariantList", constant = True) def extruders(self): return self._extruders From b63880e57f34e2ebeea1de292fac845263adf91e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 17 Nov 2017 17:00:32 +0100 Subject: [PATCH 006/205] Printer Output model now must have at least one extruder CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index ab8ca83ec6..00644980b4 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -21,15 +21,13 @@ class PrinterOutputModel(QObject): nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", extruders: Optional["ExtruderOutputModel"] = None, parent=None): + def __init__(self, output_controller: "PrinterOutputController", extruders: List["ExtruderOutputModel"], parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" self._controller = output_controller - self._extruders = [] # type: List[ExtruderOutputModel] - if self._extruders is not None: - self._extruders = extruders + self._extruders = extruders self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] From 22f2279a768fa79c40e51418b1cf2fde2bd1586f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 10:59:57 +0100 Subject: [PATCH 007/205] Moved bunch of code from the old location to the new bits in archtiecture CL-541 --- .../NetworkedPrinterOutputDevice.py | 71 ++ cura/PrinterOutput/PrinterOutputController.py | 1 + cura/PrinterOutputDevice.py | 620 +----------------- .../UM3PrinterOutputDevicePlugin.py | 2 + 4 files changed, 92 insertions(+), 602 deletions(-) create mode 100644 cura/PrinterOutput/NetworkedPrinterOutputDevice.py create mode 100644 plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py new file mode 100644 index 0000000000..dc02fa839d --- /dev/null +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -0,0 +1,71 @@ +from UM.Application import Application +from cura.PrinterOutputDevice import PrinterOutputDevice + +from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply +from PyQt5.QtCore import QUrl + +from time import time +from typing import Callable + +class NetworkedPrinterOutputDevice(PrinterOutputDevice): + def __init__(self, device_id, parent = None): + super().__init__(device_id = device_id, parent = parent) + self._manager = None + self._createNetworkManager() + self._last_response_time = time() + self._last_request_time = None + self._api_prefix = "" + self._address = "" + + self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) + + self._onFinishedCallbacks = {} + + def _update(self): + if not self._manager.networkAccessible(): + pass # TODO: no internet connection. + + pass + + def _createEmptyRequest(self, target): + url = QUrl("http://" + self._address + self._api_prefix + target) + request = QNetworkRequest(url) + request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") + request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) + return request + + def _put(self, target: str, data: str, onFinished: Callable): + request = self._createEmptyRequest(target) + self._onFinishedCallbacks[request] = onFinished + self._manager.put(request, data.encode()) + + def _get(self, target: str, onFinished: Callable): + request = self._createEmptyRequest(target) + self._onFinishedCallbacks[request] = onFinished + self._manager.get(request) + + def _delete(self, target: str, onFinished: Callable): + pass + + def _post(self, target: str, data: str, onFinished: Callable, onProgress: Callable): + pass + + def _createNetworkManager(self): + if self._manager: + self._manager.finished.disconnect(self.__handleOnFinished) + #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) + #self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) + + self._manager = QNetworkAccessManager() + self._manager.finished.connect(self.__handleOnFinished) + #self._manager.authenticationRequired.connect(self._onAuthenticationRequired) + #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes + + def __handleOnFinished(self, reply: QNetworkReply): + self._last_response_time = time() + try: + self._onFinishedCallbacks[reply.request()](reply) + del self._onFinishedCallbacks[reply.request] # Remove the callback. + except Exception as e: + print("Something went wrong with callback", e) + pass \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 0625a8ef9f..9f9a26a2a5 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -6,6 +6,7 @@ if MYPY: from cura.PrinterOutput.ExtruderOuputModel import ExtruderOuputModel from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + class PrinterOutputController: def __init__(self): pass diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 837ecc97c6..3f12c2f40c 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -5,13 +5,10 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from PyQt5.QtQml import QQmlComponent, QQmlContext -from PyQt5.QtWidgets import QMessageBox from enum import IntEnum # For the connection state tracking. -from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Logger import Logger from UM.Signal import signalemitter -from UM.PluginRegistry import PluginRegistry from UM.Application import Application import os @@ -29,38 +26,12 @@ i18n_catalog = i18nCatalog("cura") # For all other uses it should be used in the same way as a "regular" OutputDevice. @signalemitter class PrinterOutputDevice(QObject, OutputDevice): + printersChanged = pyqtSignal + 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 # Default time-out for pre-heating the bed, in seconds. - self._preheat_bed_timer = QTimer() # Timer that tracks how long to preheat still. - 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 + self._printers = [] self._monitor_view_qml_path = "" self._monitor_component = None @@ -71,84 +42,24 @@ class PrinterOutputDevice(QObject, OutputDevice): self._control_item = None self._qml_context = None - self._can_pause = True - self._can_abort = True - self._can_pre_heat_bed = True - self._can_control_manually = True + + self._update_timer = QTimer() + self._update_timer.setInterval(2000) # TODO; Add preference for update interval + self._update_timer.setSingleShot(False) + self._update_timer.timeout.connect(self._update) + + def _update(self): + pass def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): raise NotImplementedError("requestWrite needs to be implemented") - ## Signals + @pyqtProperty(QObject, notify = printersChanged) + def activePrinter(self): + if len(self._printers): - # Signal to be emitted when bed temp is changed - bedTemperatureChanged = pyqtSignal() - - # Signal to be emitted when target bed temp is changed - targetBedTemperatureChanged = pyqtSignal() - - # Signal when the progress is changed (usually when this output device is printing / sending lots of data) - progressChanged = pyqtSignal() - - # Signal to be emitted when hotend temp is changed - hotendTemperaturesChanged = pyqtSignal() - - # Signal to be emitted when target hotend temp is changed - targetHotendTemperaturesChanged = pyqtSignal() - - # Signal to be emitted when head position is changed (x,y,z) - headPositionChanged = pyqtSignal() - - # Signal to be emitted when either of the material ids is changed - materialIdChanged = pyqtSignal(int, str, arguments = ["index", "id"]) - - # Signal to be emitted when either of the hotend ids is changed - hotendIdChanged = pyqtSignal(int, str, arguments = ["index", "id"]) - - # Signal that is emitted every time connection state is changed. - # it also sends it's own device_id (for convenience sake) - connectionStateChanged = pyqtSignal(str) - - connectionTextChanged = pyqtSignal() - - timeElapsedChanged = pyqtSignal() - - timeTotalChanged = pyqtSignal() - - jobStateChanged = pyqtSignal() - - jobNameChanged = pyqtSignal() - - errorTextChanged = pyqtSignal() - - acceptsCommandsChanged = pyqtSignal() - - printerStateChanged = pyqtSignal() - - printerTypeChanged = pyqtSignal() - - # Signal to be emitted when some drastic change occurs in the remaining time (not when the time just passes on normally). - preheatBedRemainingTimeChanged = pyqtSignal() - - # Does the printer support pre-heating the bed at all - @pyqtProperty(bool, constant=True) - def canPreHeatBed(self): - return self._can_pre_heat_bed - - # Does the printer support pause at all - @pyqtProperty(bool, constant=True) - def canPause(self): - return self._can_pause - - # Does the printer support abort at all - @pyqtProperty(bool, constant=True) - def canAbort(self): - return self._can_abort - - # Does the printer support manual control at all - @pyqtProperty(bool, constant=True) - def canControlManually(self): - return self._can_control_manually + return self._printers[0] + return None @pyqtProperty(QObject, constant=True) def monitorItem(self): @@ -204,513 +115,18 @@ class PrinterOutputDevice(QObject, OutputDevice): Logger.log("e", "QQmlComponent status %s", self._monitor_component.status()) Logger.log("e", "QQmlComponent error string %s", self._monitor_component.errorString()) - @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() - - ## Gives a human-readable address where the device can be found. - @pyqtProperty(str, constant = True) - def address(self): - Logger.log("w", "address is not implemented by this output device.") - - ## A human-readable name for the 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 - - ## Set the error-text that is shown in the print monitor in case of an error - 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 - - ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands - def setAcceptsCommands(self, accepts_commands): - if self._accepts_commands != accepts_commands: - self._accepts_commands = accepts_commands - self.acceptsCommandsChanged.emit() - - ## Get the bed temperature of the bed (if any) - # This function is "final" (do not re-implement) - # /sa _getBedTemperature implementation function - @pyqtProperty(float, notify = bedTemperatureChanged) - def bedTemperature(self): - return self._bed_temperature - - ## Set the (target) bed temperature - # This function is "final" (do not re-implement) - # /param temperature new target temperature of the bed (in deg C) - # /sa _setTargetBedTemperature implementation function - @pyqtSlot(int) - def setTargetBedTemperature(self, temperature): - self._setTargetBedTemperature(temperature) - if self._target_bed_temperature != temperature: - self._target_bed_temperature = temperature - self.targetBedTemperatureChanged.emit() - - ## The total duration of the time-out to pre-heat the bed, in seconds. - # - # \return The duration of the time-out to pre-heat the bed, in seconds. - @pyqtProperty(int, constant = True) - def preheatBedTimeout(self): - return self._preheat_bed_timeout - - ## The remaining duration of the pre-heating of the bed. - # - # This is formatted in M:SS format. - # \return The duration of the time-out to pre-heat the bed, formatted. - @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) #60000 milliseconds in a minute. - seconds, _ = divmod(period, 1000) #1000 milliseconds in a second. - if minutes <= 0 and seconds <= 0: - return "" - return "%d:%02d" % (minutes, seconds) - - ## Time the print has been printing. - # Note that timeTotal - timeElapsed should give time remaining. - @pyqtProperty(float, notify = timeElapsedChanged) - def timeElapsed(self): - return self._time_elapsed - - ## Total time of the print - # Note that timeTotal - timeElapsed should give time remaining. - @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() - - ## Home the head of the connected printer - # This function is "final" (do not re-implement) - # /sa _homeHead implementation function - @pyqtSlot() - def homeHead(self): - self._homeHead() - - ## Home the head of the connected printer - # This is an implementation function and should be overriden by children. - def _homeHead(self): - Logger.log("w", "_homeHead is not implemented by this output device") - - ## Home the bed of the connected printer - # This function is "final" (do not re-implement) - # /sa _homeBed implementation function - @pyqtSlot() - def homeBed(self): - self._homeBed() - - ## Home the bed of the connected printer - # This is an implementation function and should be overriden by children. - # /sa homeBed - def _homeBed(self): - Logger.log("w", "_homeBed is not implemented by this output device") - - ## Protected setter for the bed temperature of the connected printer (if any). - # /parameter temperature Temperature bed needs to go to (in deg celsius) - # /sa setTargetBedTemperature - def _setTargetBedTemperature(self, temperature): - Logger.log("w", "_setTargetBedTemperature is not implemented by this output device") - - ## Pre-heats the heated bed of the printer. - # - # \param temperature The temperature to heat the bed to, in degrees - # Celsius. - # \param duration How long the bed should stay warm, in seconds. - @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): - Logger.log("w", "preheatBed is not implemented by this output device.") - - ## Cancels pre-heating the heated bed of the printer. - # - # If the bed is not pre-heated, nothing happens. - @pyqtSlot() - def cancelPreheatBed(self): - Logger.log("w", "cancelPreheatBed is not implemented by this output device.") - - ## Protected setter for the current bed temperature. - # This simply sets the bed temperature, but ensures that a signal is emitted. - # /param temperature temperature of the bed. - def _setBedTemperature(self, temperature): - if self._bed_temperature != temperature: - self._bed_temperature = temperature - self.bedTemperatureChanged.emit() - - ## Get the target bed temperature if connected printer (if any) - @pyqtProperty(int, notify = targetBedTemperatureChanged) - def targetBedTemperature(self): - return self._target_bed_temperature - - ## Set the (target) hotend temperature - # This function is "final" (do not re-implement) - # /param index the index of the hotend that needs to change temperature - # /param temperature The temperature it needs to change to (in deg celsius). - # /sa _setTargetHotendTemperature implementation function - @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() - - ## Implementation function of setTargetHotendTemperature. - # /param index Index of the hotend to set the temperature of - # /param temperature Temperature to set the hotend to (in deg C) - # /sa setTargetHotendTemperature - 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 - - ## Protected setter for the current hotend temperature. - # This simply sets the hotend temperature, but ensures that a signal is emitted. - # /param index Index of the hotend - # /param temperature temperature of the hotend (in deg C) - 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 - - ## List of the colours of the currently loaded materials. - # - # The list is in order of extruders. If there is no material in an - # extruder, the colour is shown as transparent. - # - # The colours are returned in hex-format AARRGGBB or RRGGBB - # (e.g. #800000ff for transparent blue or #00ff00 for pure green). - @pyqtProperty("QVariantList", notify = materialIdChanged) - def materialColors(self): - result = [] - for material_id in self._material_ids: - if material_id is None: - result.append("#00000000") #No material. - continue - - containers = self._container_registry.findInstanceContainers(type = "material", GUID = material_id) - if containers: - result.append(containers[0].getMetaDataEntry("color_code")) - else: - result.append("#00000000") #Unknown material. - return result - - ## Protected setter for the current material id. - # /param index Index of the extruder - # /param material_id id of the material - 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 - - ## Protected setter for the current hotend id. - # /param index Index of the extruder - # /param hotend_id id of the hotend - 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) - - ## Let the user decide if the hotends and/or material should be synced with the printer - # NB: the UX needs to be implemented by the plugin - def materialHotendChangedMessage(self, callback): - Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") - callback(QMessageBox.Yes) - ## Attempt to establish connection def connect(self): - raise NotImplementedError("connect needs to be implemented") + self._update_timer.start() ## Attempt to close the connection def close(self): - raise NotImplementedError("close needs to be implemented") - - @pyqtProperty(bool, notify = connectionStateChanged) - def connectionState(self): - return self._connection_state - - ## Set the connection state of this output device. - # /param connection_state ConnectionState enum. - 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 - - ## Set a text that is shown on top of the print monitor tab - def setConnectionText(self, connection_text): - if self._connection_text != connection_text: - self._connection_text = connection_text - self.connectionTextChanged.emit() + self._update_timer.stop() ## Ensure that close gets called when object is destroyed def __del__(self): self.close() - ## Get the x position of the head. - # This function is "final" (do not re-implement) - @pyqtProperty(float, notify = headPositionChanged) - def headX(self): - return self._head_x - - ## Get the y position of the head. - # This function is "final" (do not re-implement) - @pyqtProperty(float, notify = headPositionChanged) - def headY(self): - return self._head_y - - ## Get the z position of the head. - # In some machines it's actually the bed that moves. For convenience sake we simply see it all as head movements. - # This function is "final" (do not re-implement) - @pyqtProperty(float, notify = headPositionChanged) - def headZ(self): - return self._head_z - - ## Update the saved position of the head - # This function should be called when a new position for the head is received. - 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() - - ## Set the position of the head. - # In some machines it's actually the bed that moves. For convenience sake we simply see it all as head movements. - # This function is "final" (do not re-implement) - # /param x new x location of the head. - # /param y new y location of the head. - # /param z new z location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadPosition implementation function - @pyqtSlot("long", "long", "long") - @pyqtSlot("long", "long", "long", "long") - def setHeadPosition(self, x, y, z, speed = 3000): - self._setHeadPosition(x, y , z, speed) - - ## Set the X position of the head. - # This function is "final" (do not re-implement) - # /param x x position head needs to move to. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadx implementation function - @pyqtSlot("long") - @pyqtSlot("long", "long") - def setHeadX(self, x, speed = 3000): - self._setHeadX(x, speed) - - ## Set the Y position of the head. - # This function is "final" (do not re-implement) - # /param y y position head needs to move to. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadY implementation function - @pyqtSlot("long") - @pyqtSlot("long", "long") - def setHeadY(self, y, speed = 3000): - self._setHeadY(y, speed) - - ## Set the Z position of the head. - # In some machines it's actually the bed that moves. For convenience sake we simply see it all as head movements. - # This function is "final" (do not re-implement) - # /param z z position head needs to move to. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadZ implementation function - @pyqtSlot("long") - @pyqtSlot("long", "long") - def setHeadZ(self, z, speed = 3000): - self._setHeadZ(z, speed) - - ## Move the head of the printer. - # Note that this is a relative move. If you want to move the head to a specific position you can use - # setHeadPosition - # This function is "final" (do not re-implement) - # /param x distance in x to move - # /param y distance in y to move - # /param z distance in z to move - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _moveHead implementation function - @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) - - ## Implementation function of moveHead. - # /param x distance in x to move - # /param y distance in y to move - # /param z distance in z to move - # /param speed Speed by which it needs to move (in mm/minute) - # /sa moveHead - def _moveHead(self, x, y, z, speed): - Logger.log("w", "_moveHead is not implemented by this output device") - - ## Implementation function of setHeadPosition. - # /param x new x location of the head. - # /param y new y location of the head. - # /param z new z location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa setHeadPosition - def _setHeadPosition(self, x, y, z, speed): - Logger.log("w", "_setHeadPosition is not implemented by this output device") - - ## Implementation function of setHeadX. - # /param x new x location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa setHeadX - def _setHeadX(self, x, speed): - Logger.log("w", "_setHeadX is not implemented by this output device") - - ## Implementation function of setHeadY. - # /param y new y location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadY - def _setHeadY(self, y, speed): - Logger.log("w", "_setHeadY is not implemented by this output device") - - ## Implementation function of setHeadZ. - # /param z new z location of the head. - # /param speed Speed by which it needs to move (in mm/minute) - # /sa _setHeadZ - def _setHeadZ(self, z, speed): - Logger.log("w", "_setHeadZ is not implemented by this output device") - - ## Get the progress of any currently active process. - # This function is "final" (do not re-implement) - # /sa _getProgress - # /returns float progress of the process. -1 indicates that there is no process. - @pyqtProperty(float, notify = progressChanged) - def progress(self): - return self._progress - - ## Set the progress of any currently active process - # /param progress Progress of the process. - def setProgress(self, progress): - if self._progress != progress: - self._progress = progress - self.progressChanged.emit() - ## The current processing state of the backend. class ConnectionState(IntEnum): diff --git a/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py new file mode 100644 index 0000000000..828fe76b64 --- /dev/null +++ b/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py @@ -0,0 +1,2 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. \ No newline at end of file From c1dbdc64eec11c8e8119bb388515a6bfd7870f9d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 11:34:24 +0100 Subject: [PATCH 008/205] Added missing () CL-541 --- cura/PrinterOutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 3f12c2f40c..9db0a26e55 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -26,7 +26,7 @@ i18n_catalog = i18nCatalog("cura") # For all other uses it should be used in the same way as a "regular" OutputDevice. @signalemitter class PrinterOutputDevice(QObject, OutputDevice): - printersChanged = pyqtSignal + printersChanged = pyqtSignal() def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) From 9202bb11fe11a873f44b264e2674723b89bcef1d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:12:15 +0100 Subject: [PATCH 009/205] Added stubs for cluster & legacy output devices CL-541 --- .../ClusterUM3OutputDevice.py | 5 + .../UM3NetworkPrinting/DiscoverUM3Action.py | 8 +- .../LegacyUM3OutputDevice.py | 5 + .../UM3OutputDevicePlugin.py | 185 ++++++++++++++++++ .../UM3PrinterOutputDevicePlugin.py | 2 - plugins/UM3NetworkPrinting/__init__.py | 4 +- 6 files changed, 202 insertions(+), 7 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py create mode 100644 plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py create mode 100644 plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py delete mode 100644 plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py new file mode 100644 index 0000000000..4609e86f20 --- /dev/null +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -0,0 +1,5 @@ +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + +class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): + def __init__(self, device_id, address, properties, parent = None): + super().__init__(device_id = device_id, parent = parent) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index af1a556892..f199f7cd24 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -37,7 +37,7 @@ class DiscoverUM3Action(MachineAction): if not self._network_plugin: Logger.log("d", "Starting printer discovery.") self._network_plugin = Application.getInstance().getOutputDeviceManager().getOutputDevicePlugin("UM3NetworkPrinting") - self._network_plugin.printerListChanged.connect(self._onPrinterDiscoveryChanged) + self._network_plugin.discoveredDevicesChanged.connect(self._onPrinterDiscoveryChanged) self.printersChanged.emit() ## Re-filters the list of printers. @@ -87,10 +87,10 @@ class DiscoverUM3Action(MachineAction): else: global_printer_type = "unknown" - printers = list(self._network_plugin.getPrinters().values()) + printers = list(self._network_plugin.getDiscoveredDevices().values()) # TODO; There are still some testing printers that don't have a correct printer type, so don't filter out unkown ones just yet. - printers = [printer for printer in printers if printer.printerType == global_printer_type or printer.printerType == "unknown"] - printers.sort(key = lambda k: k.name) + #printers = [printer for printer in printers if printer.printerType == global_printer_type or printer.printerType == "unknown"] + #printers.sort(key = lambda k: k.name) return printers else: return [] diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py new file mode 100644 index 0000000000..0e19df4c18 --- /dev/null +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -0,0 +1,5 @@ +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + +class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): + def __init__(self, device_id, address, properties, parent = None): + super().__init__(device_id = device_id, parent = parent) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py new file mode 100644 index 0000000000..37425bfef2 --- /dev/null +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -0,0 +1,185 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin +from UM.Logger import Logger +from UM.Application import Application +from UM.Signal import Signal, signalemitter + +from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo +from queue import Queue +from threading import Event, Thread + +from time import time + +from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice + +## This plugin handles the connection detection & creation of output device objects for the UM3 printer. +# Zero-Conf is used to detect printers, which are saved in a dict. +# If we discover a printer that has the same key as the active machine instance a connection is made. +@signalemitter +class UM3OutputDevicePlugin(OutputDevicePlugin): + addDeviceSignal = Signal() + removeDeviceSignal = Signal() + discoveredDevicesChanged = Signal() + + def __init__(self): + super().__init__() + self._zero_conf = None + self._zero_conf_browser = None + + # Because the model needs to be created in the same thread as the QMLEngine, we use a signal. + self.addDeviceSignal.connect(self._onAddDevice) + self.removeDeviceSignal.connect(self._onRemoveDevice) + + self._discovered_devices = {} + + # The zero-conf service changed requests are handled in a separate thread, so we can re-schedule the requests + # which fail to get detailed service info. + # Any new or re-scheduled requests will be appended to the request queue, and the handling thread will pick + # them up and process them. + self._service_changed_request_queue = Queue() + self._service_changed_request_event = Event() + self._service_changed_request_thread = Thread(target=self._handleOnServiceChangedRequests, daemon=True) + self._service_changed_request_thread.start() + + def getDiscoveredDevices(self): + return self._discovered_devices + + ## Start looking for devices on network. + def start(self): + self.startDiscovery() + + def startDiscovery(self): + self.stop() + if self._zero_conf_browser: + self._zero_conf_browser.cancel() + self._zero_conf_browser = None # Force the old ServiceBrowser to be destroyed. + + self._zero_conf = Zeroconf() + self._zero_conf_browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', + [self._appendServiceChangedRequest]) + + def stop(self): + if self._zero_conf is not None: + Logger.log("d", "zeroconf close...") + self._zero_conf.close() + + def _onRemoveDevice(self, name): + device = self._discovered_devices.pop(name, None) + if device: + if device.isConnected(): + device.disconnect() + device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + + self.discoveredDevicesChanged.emit() + '''printer = self._printers.pop(name, None) + if printer: + if printer.isConnected(): + printer.disconnect() + printer.connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) + Logger.log("d", "removePrinter, disconnecting [%s]..." % name) + self.printerListChanged.emit()''' + + def _onAddDevice(self, name, address, properties): + + # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" + # or "Legacy" UM3 device. + cluster_size = int(properties.get(b"cluster_size", -1)) + if cluster_size > 0: + device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) + else: + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + + self._discovered_devices[device.getId()] = device + self.discoveredDevicesChanged.emit() + + pass + ''' + self._cluster_printers_seen[ + printer.getKey()] = name # Cluster printers that may be temporary unreachable or is rebooted keep being stored here + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack and printer.getKey() == global_container_stack.getMetaDataEntry("um_network_key"): + if printer.getKey() not in self._old_printers: # Was the printer already connected, but a re-scan forced? + Logger.log("d", "addPrinter, connecting [%s]..." % printer.getKey()) + self._printers[printer.getKey()].connect() + printer.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) + self.printerListChanged.emit()''' + + ## Appends a service changed request so later the handling thread will pick it up and processes it. + def _appendServiceChangedRequest(self, zeroconf, service_type, name, state_change): + # append the request and set the event so the event handling thread can pick it up + item = (zeroconf, service_type, name, state_change) + self._service_changed_request_queue.put(item) + self._service_changed_request_event.set() + + def _handleOnServiceChangedRequests(self): + while True: + # Wait for the event to be set + self._service_changed_request_event.wait(timeout = 5.0) + + # Stop if the application is shutting down + if Application.getInstance().isShuttingDown(): + return + + self._service_changed_request_event.clear() + + # Handle all pending requests + reschedule_requests = [] # A list of requests that have failed so later they will get re-scheduled + while not self._service_changed_request_queue.empty(): + request = self._service_changed_request_queue.get() + zeroconf, service_type, name, state_change = request + try: + result = self._onServiceChanged(zeroconf, service_type, name, state_change) + if not result: + reschedule_requests.append(request) + except Exception: + Logger.logException("e", "Failed to get service info for [%s] [%s], the request will be rescheduled", + service_type, name) + reschedule_requests.append(request) + + # Re-schedule the failed requests if any + if reschedule_requests: + for request in reschedule_requests: + self._service_changed_request_queue.put(request) + + ## Handler for zeroConf detection. + # Return True or False indicating if the process succeeded. + # Note that this function can take over 3 seconds to complete. Be carefull calling it from the main thread. + def _onServiceChanged(self, zero_conf, service_type, name, state_change): + if state_change == ServiceStateChange.Added: + Logger.log("d", "Bonjour service added: %s" % name) + + # First try getting info from zero-conf cache + info = ServiceInfo(service_type, name, properties={}) + for record in zero_conf.cache.entries_with_name(name.lower()): + info.update_record(zero_conf, time(), record) + + for record in zero_conf.cache.entries_with_name(info.server): + info.update_record(zero_conf, time(), record) + if info.address: + break + + # Request more data if info is not complete + if not info.address: + Logger.log("d", "Trying to get address of %s", name) + info = zero_conf.get_service_info(service_type, name) + + if info: + type_of_device = info.properties.get(b"type", None) + if type_of_device: + if type_of_device == b"printer": + address = '.'.join(map(lambda n: str(n), info.address)) + self.addDeviceSignal.emit(str(name), address, info.properties) + else: + Logger.log("w", + "The type of the found device is '%s', not 'printer'! Ignoring.." % type_of_device) + else: + Logger.log("w", "Could not get information about %s" % name) + return False + + elif state_change == ServiceStateChange.Removed: + Logger.log("d", "Bonjour service removed: %s" % name) + self.removeDeviceSignal.emit(str(name)) + + return True \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py deleted file mode 100644 index 828fe76b64..0000000000 --- a/plugins/UM3NetworkPrinting/UM3PrinterOutputDevicePlugin.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/__init__.py b/plugins/UM3NetworkPrinting/__init__.py index 37f863bd00..6dd86a16d2 100644 --- a/plugins/UM3NetworkPrinting/__init__.py +++ b/plugins/UM3NetworkPrinting/__init__.py @@ -5,8 +5,10 @@ from . import DiscoverUM3Action from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") +from . import UM3OutputDevicePlugin + def getMetaData(): return {} def register(app): - return { "output_device": NetworkPrinterOutputDevicePlugin.NetworkPrinterOutputDevicePlugin(), "machine_action": DiscoverUM3Action.DiscoverUM3Action()} \ No newline at end of file + return { "output_device": UM3OutputDevicePlugin.UM3OutputDevicePlugin(), "machine_action": DiscoverUM3Action.DiscoverUM3Action()} \ No newline at end of file From 68e80a88bcbd072ed2e1be743b1135f64bf8160b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:18:08 +0100 Subject: [PATCH 010/205] Rename usage of printer to more generic device. The usage of "printer" is a bit confusing, as in the case of CuraConnect it's a device that can acces multiple printers. CL-541 --- .../UM3NetworkPrinting/DiscoverUM3Action.py | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index f199f7cd24..f7afe3e00f 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -27,24 +27,26 @@ class DiscoverUM3Action(MachineAction): Application.getInstance().engineCreatedSignal.connect(self._createAdditionalComponentsView) - self._last_zeroconf_event_time = time.time() - self._zeroconf_change_grace_period = 0.25 # Time to wait after a zeroconf service change before allowing a zeroconf reset + self._last_zero_conf_event_time = time.time() - printersChanged = pyqtSignal() + # Time to wait after a zero-conf service change before allowing a zeroconf reset + self._zero_conf_change_grace_period = 0.25 + + discoveredDevicesChanged = pyqtSignal() @pyqtSlot() def startDiscovery(self): if not self._network_plugin: - Logger.log("d", "Starting printer discovery.") + Logger.log("d", "Starting device discovery.") self._network_plugin = Application.getInstance().getOutputDeviceManager().getOutputDevicePlugin("UM3NetworkPrinting") - self._network_plugin.discoveredDevicesChanged.connect(self._onPrinterDiscoveryChanged) - self.printersChanged.emit() + self._network_plugin.discoveredDevicesChanged.connect(self._onDeviceDiscoveryChanged) + self.discoveredDevicesChanged.emit() - ## Re-filters the list of printers. + ## Re-filters the list of devices. @pyqtSlot() def reset(self): - Logger.log("d", "Reset the list of found printers.") - self.printersChanged.emit() + Logger.log("d", "Reset the list of found devices.") + self.discoveredDevicesChanged.emit() @pyqtSlot() def restartDiscovery(self): @@ -53,35 +55,36 @@ class DiscoverUM3Action(MachineAction): # It's most likely that the QML engine is still creating delegates, where the python side already deleted or # garbage collected the data. # Whatever the case, waiting a bit ensures that it doesn't crash. - if time.time() - self._last_zeroconf_event_time > self._zeroconf_change_grace_period: + if time.time() - self._last_zero_conf_event_time > self._zero_conf_change_grace_period: if not self._network_plugin: self.startDiscovery() else: self._network_plugin.startDiscovery() @pyqtSlot(str, str) - def removeManualPrinter(self, key, address): + def removeManualDevice(self, key, address): if not self._network_plugin: return - self._network_plugin.removeManualPrinter(key, address) + self._network_plugin.removeManualDevice(key, address) @pyqtSlot(str, str) - def setManualPrinter(self, key, address): + def setManualDevice(self, key, address): if key != "": # This manual printer replaces a current manual printer - self._network_plugin.removeManualPrinter(key) + self._network_plugin.removeManualDevice(key) if address != "": self._network_plugin.addManualPrinter(address) - def _onPrinterDiscoveryChanged(self, *args): - self._last_zeroconf_event_time = time.time() - self.printersChanged.emit() + def _onDeviceDiscoveryChanged(self, *args): + self._last_zero_conf_event_time = time.time() + self.discoveredDevicesChanged.emit() - @pyqtProperty("QVariantList", notify = printersChanged) + @pyqtProperty("QVariantList", notify = discoveredDevicesChanged) def foundDevices(self): if self._network_plugin: + # TODO: Check if this needs to stay. if Application.getInstance().getGlobalContainerStack(): global_printer_type = Application.getInstance().getGlobalContainerStack().getBottom().getId() else: From 1b8caa7a21ec0de6fd8f329796c37c2ae748758e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:23:09 +0100 Subject: [PATCH 011/205] NetworkedPrinterOutputDevice now requires address in constructor CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 ++++- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 7 +++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index dc02fa839d..416efe10a3 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -8,14 +8,14 @@ from time import time from typing import Callable class NetworkedPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, device_id, parent = None): + def __init__(self, device_id, address: str, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None self._createNetworkManager() self._last_response_time = time() self._last_request_time = None self._api_prefix = "" - self._address = "" + self._address = address self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 4609e86f20..4a89e35275 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -2,4 +2,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): - super().__init__(device_id = device_id, parent = parent) \ No newline at end of file + super().__init__(device_id = device_id, address = address, parent = parent) + + def _update(self): + pass diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 0e19df4c18..ee8501a070 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,5 +1,8 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): - def __init__(self, device_id, address, properties, parent = None): - super().__init__(device_id = device_id, parent = parent) \ No newline at end of file + def __init__(self, device_id, address: str, properties, parent = None): + super().__init__(device_id = device_id, address = address, parent = parent) + + def _update(self): + pass From 4197f18fc15a2b9f48c4ad9142d709db4174da45 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 13:35:08 +0100 Subject: [PATCH 012/205] First steps to ensure that the Discover UM3 action works with new architecture CL-541 --- .../NetworkedPrinterOutputDevice.py | 43 +++++++++++++++++-- .../ClusterUM3OutputDevice.py | 5 ++- .../UM3NetworkPrinting/DiscoverUM3Action.qml | 42 +++++++++--------- .../LegacyUM3OutputDevice.py | 2 +- 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 416efe10a3..67ad968ce8 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -2,13 +2,14 @@ from UM.Application import Application from cura.PrinterOutputDevice import PrinterOutputDevice from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply -from PyQt5.QtCore import QUrl +from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from time import time from typing import Callable + class NetworkedPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, device_id, address: str, parent = None): + def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None self._createNetworkManager() @@ -16,7 +17,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_request_time = None self._api_prefix = "" self._address = address - + self._properties = properties self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) self._onFinishedCallbacks = {} @@ -68,4 +69,38 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): del self._onFinishedCallbacks[reply.request] # Remove the callback. except Exception as e: print("Something went wrong with callback", e) - pass \ No newline at end of file + pass + + @pyqtSlot(str, result=str) + def getProperty(self, key): + key = key.encode("utf-8") + if key in self._properties: + return self._properties.get(key, b"").decode("utf-8") + else: + return "" + + ## Get the unique key of this machine + # \return key String containing the key of the machine. + @pyqtProperty(str, constant=True) + def key(self): + return self._id + + ## The IP address of the printer. + @pyqtProperty(str, constant=True) + def address(self): + return self._properties.get(b"address", b"").decode("utf-8") + + ## Name of the printer (as returned from the ZeroConf properties) + @pyqtProperty(str, constant=True) + def name(self): + return self._properties.get(b"name", b"").decode("utf-8") + + ## Firmware version (as returned from the ZeroConf properties) + @pyqtProperty(str, constant=True) + def firmwareVersion(self): + return self._properties.get(b"firmware_version", b"").decode("utf-8") + + ## IPadress of this printer + @pyqtProperty(str, constant=True) + def ipAddress(self): + return self._address \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 4a89e35275..f4e60b49e4 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -1,8 +1,11 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): - super().__init__(device_id = device_id, address = address, parent = parent) + super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) def _update(self): + super()._update() + pass diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index cec2bf0f0f..8131493957 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -10,7 +10,7 @@ Cura.MachineAction { id: base anchors.fill: parent; - property var selectedPrinter: null + property var selectedDevice: null property bool completeProperties: true Connections @@ -31,7 +31,7 @@ Cura.MachineAction { if(base.selectedPrinter && base.completeProperties) { - var printerKey = base.selectedPrinter.getKey() + var printerKey = base.selectedDevice.key if(manager.getStoredKey() != printerKey) { manager.setKey(printerKey); @@ -83,10 +83,10 @@ Cura.MachineAction { id: editButton text: catalog.i18nc("@action:button", "Edit") - enabled: base.selectedPrinter != null && base.selectedPrinter.getProperty("manual") == "true" + enabled: base.selectedDevice != null && base.selectedDevice.getProperty("manual") == "true" onClicked: { - manualPrinterDialog.showDialog(base.selectedPrinter.getKey(), base.selectedPrinter.ipAddress); + manualPrinterDialog.showDialog(base.selectedDevice.key, base.selectedDevice.ipAddress); } } @@ -94,8 +94,8 @@ Cura.MachineAction { id: removeButton text: catalog.i18nc("@action:button", "Remove") - enabled: base.selectedPrinter != null && base.selectedPrinter.getProperty("manual") == "true" - onClicked: manager.removeManualPrinter(base.selectedPrinter.getKey(), base.selectedPrinter.ipAddress) + enabled: base.selectedDevice != null && base.selectedDevice.getProperty("manual") == "true" + onClicked: manager.removeManualPrinter(base.selectedDevice.key, base.selectedDevice.ipAddress) } Button @@ -139,7 +139,7 @@ Cura.MachineAction { var selectedKey = manager.getStoredKey(); for(var i = 0; i < model.length; i++) { - if(model[i].getKey() == selectedKey) + if(model[i].key == selectedKey) { currentIndex = i; return @@ -151,9 +151,9 @@ Cura.MachineAction currentIndex: -1 onCurrentIndexChanged: { - base.selectedPrinter = listview.model[currentIndex]; + base.selectedDevice = listview.model[currentIndex]; // Only allow connecting if the printer has responded to API query since the last refresh - base.completeProperties = base.selectedPrinter != null && base.selectedPrinter.getProperty("incomplete") != "true"; + base.completeProperties = base.selectedDevice != null && base.selectedDevice.getProperty("incomplete") != "true"; } Component.onCompleted: manager.startDiscovery() delegate: Rectangle @@ -199,13 +199,13 @@ Cura.MachineAction Column { width: Math.floor(parent.width * 0.5) - visible: base.selectedPrinter ? true : false + visible: base.selectedDevice ? true : false spacing: UM.Theme.getSize("default_margin").height Label { width: parent.width wrapMode: Text.WordWrap - text: base.selectedPrinter ? base.selectedPrinter.name : "" + text: base.selectedDevice ? base.selectedDevice.name : "" font: UM.Theme.getFont("large") elide: Text.ElideRight } @@ -226,12 +226,12 @@ Cura.MachineAction wrapMode: Text.WordWrap text: { - if(base.selectedPrinter) + if(base.selectedDevice) { - if(base.selectedPrinter.printerType == "ultimaker3") + if(base.selectedDevice.printerType == "ultimaker3") { return catalog.i18nc("@label", "Ultimaker 3") - } else if(base.selectedPrinter.printerType == "ultimaker3_extended") + } else if(base.selectedDevice.printerType == "ultimaker3_extended") { return catalog.i18nc("@label", "Ultimaker 3 Extended") } else @@ -255,7 +255,7 @@ Cura.MachineAction { width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap - text: base.selectedPrinter ? base.selectedPrinter.firmwareVersion : "" + text: base.selectedDevice ? base.selectedDevice.firmwareVersion : "" } Label { @@ -267,7 +267,7 @@ Cura.MachineAction { width: Math.floor(parent.width * 0.5) wrapMode: Text.WordWrap - text: base.selectedPrinter ? base.selectedPrinter.ipAddress : "" + text: base.selectedDevice ? base.selectedDevice.ipAddress : "" } } @@ -277,17 +277,17 @@ Cura.MachineAction wrapMode: Text.WordWrap text:{ // The property cluster size does not exist for older UM3 devices. - if(!base.selectedPrinter || base.selectedPrinter.clusterSize == null || base.selectedPrinter.clusterSize == 1) + if(!base.selectedDevice || base.selectedDevice.clusterSize == null || base.selectedDevice.clusterSize == 1) { return ""; } - else if (base.selectedPrinter.clusterSize === 0) + else if (base.selectedDevice.clusterSize === 0) { return catalog.i18nc("@label", "This printer is not set up to host a group of Ultimaker 3 printers."); } else { - return catalog.i18nc("@label", "This printer is the host for a group of %1 Ultimaker 3 printers.".arg(base.selectedPrinter.clusterSize)); + return catalog.i18nc("@label", "This printer is the host for a group of %1 Ultimaker 3 printers.".arg(base.selectedDevice.clusterSize)); } } @@ -296,14 +296,14 @@ Cura.MachineAction { width: parent.width wrapMode: Text.WordWrap - visible: base.selectedPrinter != null && !base.completeProperties + visible: base.selectedDevice != null && !base.completeProperties text: catalog.i18nc("@label", "The printer at this address has not yet responded." ) } Button { text: catalog.i18nc("@action:button", "Connect") - enabled: (base.selectedPrinter && base.completeProperties) ? true : false + enabled: (base.selectedDevice && base.completeProperties) ? true : false onClicked: connectToPrinter() } } diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index ee8501a070..c7ccbe763a 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -2,7 +2,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): - super().__init__(device_id = device_id, address = address, parent = parent) + super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) def _update(self): pass From 59e4d1af6306d9d0751fb84d7cf7e19b64fc3131 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 15:11:38 +0100 Subject: [PATCH 013/205] re-added recheck connections CL-541 --- .../UM3OutputDevicePlugin.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 37425bfef2..0d1154e07c 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -60,6 +60,28 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._zero_conf_browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', [self._appendServiceChangedRequest]) + def reCheckConnections(self): + active_machine = Application.getInstance().getGlobalContainerStack() + if not active_machine: + return + + um_network_key = active_machine.getMetaDataEntry("um_network_key") + + for key in self._discovered_devices: + if key == um_network_key: + if not self._discovered_devices[key].isConnected(): + Logger.log("d", "Attempting to connect with [%s]" % key) + self._discovered_devices[key].connect() + self._discovered_devices[key].connectionStateChanged.connect(self._onDeviceConnectionStateChanged) + else: + if self._discovered_devices[key].isConnected(): + Logger.log("d", "Attempting to close connection with [%s]" % key) + self._printers[key].close() + self._printers[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + + def _onDeviceConnectionStateChanged(self, key): + pass # TODO + def stop(self): if self._zero_conf is not None: Logger.log("d", "zeroconf close...") From 03304003af90c2d3566eb3e5cc504ca8e22ff96f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 15:12:11 +0100 Subject: [PATCH 014/205] Added connection state property Cl-541 --- cura/PrinterOutputDevice.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 9db0a26e55..573fe63158 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -27,6 +27,7 @@ i18n_catalog = i18nCatalog("cura") @signalemitter class PrinterOutputDevice(QObject, OutputDevice): printersChanged = pyqtSignal() + connectionStateChanged = pyqtSignal() def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -48,6 +49,11 @@ class PrinterOutputDevice(QObject, OutputDevice): self._update_timer.setSingleShot(False) self._update_timer.timeout.connect(self._update) + self._connection_state = ConnectionState.closed + + def isConnected(self): + return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error + def _update(self): pass From 61753540e405d1b40e27e304c60876242f5749f3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 15:12:29 +0100 Subject: [PATCH 015/205] Callbacks are now handled by url and operation type. It would have been nicer to use the request, but it's unhashable. Cl-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 11 +++++------ plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 -- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 6 ++++++ plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 3 ++- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 67ad968ce8..e33834ffce 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -37,13 +37,13 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _put(self, target: str, data: str, onFinished: Callable): request = self._createEmptyRequest(target) - self._onFinishedCallbacks[request] = onFinished - self._manager.put(request, data.encode()) + reply = self._manager.put(request, data.encode()) + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _get(self, target: str, onFinished: Callable): request = self._createEmptyRequest(target) - self._onFinishedCallbacks[request] = onFinished - self._manager.get(request) + reply = self._manager.get(request) + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _delete(self, target: str, onFinished: Callable): pass @@ -65,8 +65,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __handleOnFinished(self, reply: QNetworkReply): self._last_response_time = time() try: - self._onFinishedCallbacks[reply.request()](reply) - del self._onFinishedCallbacks[reply.request] # Remove the callback. + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) except Exception as e: print("Something went wrong with callback", e) pass diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index f4e60b49e4..8de14fe233 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -7,5 +7,3 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def _update(self): super()._update() - - pass diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index 8131493957..d79bd543e7 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -29,6 +29,12 @@ Cura.MachineAction function connectToPrinter() { + if(base.selectedDevice) + { + var deviceKey = base.selectedDevice.key + manager.setKey(deviceKey); + completed(); + } if(base.selectedPrinter && base.completeProperties) { var printerKey = base.selectedDevice.key diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index c7ccbe763a..86211bddb4 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,8 +1,9 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice + class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) def _update(self): - pass + super()._update() \ No newline at end of file From 1167fa0a89f9e4e2771aaec6ede3c59b7c9133c8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 16:03:54 +0100 Subject: [PATCH 016/205] Added data handling for legacy printer CL-541 --- .../NetworkedPrinterOutputDevice.py | 8 +- cura/PrinterOutput/PrintJobOutputModel.py | 11 +++ cura/PrinterOutput/PrinterOutputModel.py | 13 ++- .../LegacyUM3OutputDevice.py | 79 ++++++++++++++++++- 4 files changed, 104 insertions(+), 7 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index e33834ffce..951b7138f1 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -1,4 +1,6 @@ from UM.Application import Application +from UM.Logger import Logger + from cura.PrinterOutputDevice import PrinterOutputDevice from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply @@ -30,6 +32,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) + print(url) request = QNetworkRequest(url) request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) @@ -66,9 +69,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_response_time = time() try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) - except Exception as e: - print("Something went wrong with callback", e) - pass + except Exception: + Logger.logException("w", "something went wrong with callback") @pyqtSlot(str, result=str) def getProperty(self, key): diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 1e0d82f1b0..407bffcbfe 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -11,6 +11,7 @@ class PrintJobOutputModel(QObject): stateChanged = pyqtSignal() timeTotalChanged = pyqtSignal() timeElapsedChanged = pyqtSignal() + nameChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", parent=None): super().__init__(parent) @@ -18,6 +19,16 @@ class PrintJobOutputModel(QObject): self._state = "" self._time_total = 0 self._time_elapsed = 0 + self._name = "" + + @pyqtProperty(str, notify = nameChanged) + def name(self): + return self._name + + def updateName(self, name: str): + if self._name != name: + self._name = name + self.nameChanged.emit() @pyqtProperty(int, notify = timeTotalChanged) def timeTotal(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 00644980b4..7c10944cfd 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -5,11 +5,11 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot from UM.Logger import Logger from typing import Optional, List from UM.Math.Vector import Vector +from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel - from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController @@ -21,17 +21,19 @@ class PrinterOutputModel(QObject): nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", extruders: List["ExtruderOutputModel"], parent=None): + def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" self._controller = output_controller - self._extruders = extruders + self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] + self._printer_state = "unknown" + # Features of the printer; self._can_pause = True self._can_abort = True @@ -135,6 +137,11 @@ class PrinterOutputModel(QObject): self._active_print_job = print_job self.activePrintJobChanged.emit() + def updatePrinterState(self, printer_state): + if self._printer_state != printer_state: + self._printer_state = printer_state + self.printerStateChanged.emit() + @pyqtProperty(QObject, notify = activePrintJobChanged) def activePrintJob(self): return self._active_print_job diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 86211bddb4..b4e7bdf1af 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,9 +1,86 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel +from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + +from UM.Logger import Logger + +from PyQt5.QtNetwork import QNetworkRequest + + +import json class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) + self._api_prefix = "/api/v1/" + self._number_of_extruders = 2 def _update(self): - super()._update() \ No newline at end of file + super()._update() + self._get("printer", onFinished=self._onGetPrinterDataFinished) + self._get("print_job", onFinished=self._onGetPrintJobFinished) + + def _onGetPrintJobFinished(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + + if not self._printers: + return # Ignore the data for now, we don't have info about a printer yet. + printer = self._printers[0] + + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid print job state message: Not valid JSON.") + return + if printer.activePrintJob is None: + print_job = PrintJobOutputModel(output_controller=None) + printer.updateActivePrintJob(print_job) + else: + print_job = printer.activePrintJob + print_job.updateState(result["state"]) + print_job.updateTimeElapsed(result["time_elapsed"]) + print_job.updateTimeTotal(result["time_total"]) + print_job.updateName(result["name"]) + elif status_code == 404: + # No job found, so delete the active print job (if any!) + printer.updateActivePrintJob(None) + else: + Logger.log("w", + "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) + + def _onGetPrinterDataFinished(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid printer state message: Not valid JSON.") + return + + if not self._printers: + self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders)] + + # LegacyUM3 always has a single printer. + printer = self._printers[0] + printer.updateBedTemperature(result["bed"]["temperature"]["current"]) + printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) + printer.updatePrinterState(result["status"]) + + for index in range(0, self._number_of_extruders): + temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"] + printer.extruders[index].updateTargetHotendTemperature(temperatures["target"]) + printer.extruders[index].updateHotendTemperature(temperatures["current"]) + + # TODO: Set active material + + try: + hotend_id = result["heads"][0]["extruders"][index]["hotend"]["id"] + except KeyError: + hotend_id = "" + printer.extruders[index].updateHotendID(hotend_id) + + else: + Logger.log("w", + "Got status code {status_code} while trying to get printer data".format(status_code = status_code)) From a9f52c2ad642dd468eb90b9a245d3d8596f79229 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 20 Nov 2017 17:00:02 +0100 Subject: [PATCH 017/205] Added data handling for Connect devices CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 13 ++++- cura/PrinterOutput/PrinterOutputModel.py | 11 ++++ .../ClusterUM3OutputDevice.py | 57 ++++++++++++++++++- .../LegacyUM3OutputDevice.py | 1 - 4 files changed, 79 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 407bffcbfe..ca04c546d3 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -12,6 +12,7 @@ class PrintJobOutputModel(QObject): timeTotalChanged = pyqtSignal() timeElapsedChanged = pyqtSignal() nameChanged = pyqtSignal() + keyChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", parent=None): super().__init__(parent) @@ -19,7 +20,17 @@ class PrintJobOutputModel(QObject): self._state = "" self._time_total = 0 self._time_elapsed = 0 - self._name = "" + self._name = "" # Human readable name + self._key = "" # Unique identifier + + @pyqtProperty(str, notify=keyChanged) + def key(self): + return self._key + + def updateKey(self, key: str): + if self._key != key: + self._key = key + self.keyChanged.emit() @pyqtProperty(str, notify = nameChanged) def name(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 7c10944cfd..ed20ef1755 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -20,12 +20,14 @@ class PrinterOutputModel(QObject): activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() + keyChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) self._bed_temperature = 0 self._target_bed_temperature = 0 self._name = "" + self._key = "" # Unique identifier self._controller = output_controller self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders @@ -40,6 +42,15 @@ class PrinterOutputModel(QObject): self._can_pre_heat_bed = True self._can_control_manually = True + @pyqtProperty(str, notify=keyChanged) + def key(self): + return self._key + + def updateKey(self, key: str): + if self._key != key: + self._key = key + self.keyChanged.emit() + @pyqtSlot() def homeHead(self): self._controller.homeHead(self) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8de14fe233..a1c4f48e13 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -1,9 +1,64 @@ -from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from UM.Logger import Logger +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel +from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel +from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel + +import json + +from PyQt5.QtNetwork import QNetworkRequest class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) + self._api_prefix = "/cluster-api/v1/" + + self._number_of_extruders = 2 def _update(self): super()._update() + self._get("printers/", onFinished=self._onGetPrintersDataFinished) + + def _onGetPrintersDataFinished(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid printer state message: Not valid JSON.") + return + + for printer_data in result: + uuid = printer_data["uuid"] + + printer = None + for device in self._printers: + if device.key == uuid: + printer = device + break + + if printer is None: + printer = PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders) + self._printers.append(printer) + + printer.updateName(printer_data["friendly_name"]) + printer.updateKey(uuid) + + for index in range(0, self._number_of_extruders): + extruder = printer.extruders[index] + extruder_data = printer_data["configuration"][index] + try: + hotend_id = extruder_data["print_core_id"] + except KeyError: + hotend_id = "" + extruder.updateHotendID(hotend_id) + + material_data = extruder_data["material"] + if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: + material = MaterialOutputModel(guid = material_data["guid"], type = material_data["material"], brand=material_data["brand"], color=material_data["color"]) + extruder.updateActiveMaterial(material) + + else: + Logger.log("w", + "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index b4e7bdf1af..63ebd055ad 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -6,7 +6,6 @@ from UM.Logger import Logger from PyQt5.QtNetwork import QNetworkRequest - import json From fd548975ccfd62bb308ed37e8aae83d1a07b42be Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 10:19:17 +0100 Subject: [PATCH 018/205] Closing a connection now actually stops the updates CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 4 +++- cura/PrinterOutputDevice.py | 3 +++ plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 4 ++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 951b7138f1..2c33f2e397 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -1,7 +1,7 @@ from UM.Application import Application from UM.Logger import Logger -from cura.PrinterOutputDevice import PrinterOutputDevice +from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl @@ -67,6 +67,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __handleOnFinished(self, reply: QNetworkReply): self._last_response_time = time() + # TODO: Check if the message is actually correct + self.setConnectionState(ConnectionState.connected) try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) except Exception: diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 573fe63158..f5afb0da6a 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -54,6 +54,9 @@ class PrinterOutputDevice(QObject, OutputDevice): def isConnected(self): return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error + def setConnectionState(self, new_state): + self._connection_state = new_state + def _update(self): pass diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 0d1154e07c..b4ea1663b6 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -76,8 +76,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): else: if self._discovered_devices[key].isConnected(): Logger.log("d", "Attempting to close connection with [%s]" % key) - self._printers[key].close() - self._printers[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + self._discovered_devices[key].close() + self._discovered_devices[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) def _onDeviceConnectionStateChanged(self, key): pass # TODO From 10a2dbb134ae0d42dc0cfdc115e65da065a16d2e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 10:24:14 +0100 Subject: [PATCH 019/205] Extended the typing for the calllbacks CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 2c33f2e397..75f5ca6a14 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -38,20 +38,20 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _put(self, target: str, data: str, onFinished: Callable): + def _put(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.put(request, data.encode()) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Callable): + def _get(self, target: str, onFinished: Callable[[QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.get(request) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Callable): + def _delete(self, target: str, onFinished: Callable[[QNetworkReply], None]): pass - def _post(self, target: str, data: str, onFinished: Callable, onProgress: Callable): + def _post(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None], onProgress: Callable): pass def _createNetworkManager(self): From 152f3462ce228825731e35de4c8cc03dcd3bbefb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 11:00:37 +0100 Subject: [PATCH 020/205] Also added any to callable mypy decorator For some reason it also wants to know that it also calls self. Weird. CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 75f5ca6a14..7b74282303 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -7,7 +7,7 @@ from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetwork from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from time import time -from typing import Callable +from typing import Callable, Any class NetworkedPrinterOutputDevice(PrinterOutputDevice): @@ -38,20 +38,20 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _put(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None]): + def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.put(request, data.encode()) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Callable[[QNetworkReply], None]): + def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): request = self._createEmptyRequest(target) reply = self._manager.get(request) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Callable[[QNetworkReply], None]): + def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): pass - def _post(self, target: str, data: str, onFinished: Callable[[QNetworkReply], None], onProgress: Callable): + def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable): pass def _createNetworkManager(self): From b1649f2d38d8f2bbe5c2de4f20743199f55317a6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 11:01:19 +0100 Subject: [PATCH 021/205] Added PrintJob handling to ClusterUM3 CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 16 ++++++- cura/PrinterOutput/PrinterOutputModel.py | 4 ++ cura/PrinterOutputDevice.py | 7 +++ .../ClusterUM3OutputDevice.py | 46 +++++++++++++++++-- 4 files changed, 68 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index ca04c546d3..7c38782788 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel class PrintJobOutputModel(QObject): @@ -13,15 +14,26 @@ class PrintJobOutputModel(QObject): timeElapsedChanged = pyqtSignal() nameChanged = pyqtSignal() keyChanged = pyqtSignal() + assignedPrinterChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", parent=None): + def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None): super().__init__(parent) self._output_controller = output_controller self._state = "" self._time_total = 0 self._time_elapsed = 0 self._name = "" # Human readable name - self._key = "" # Unique identifier + self._key = key # Unique identifier + self._assigned_printer = None + + @pyqtProperty(QObject, notify=assignedPrinterChanged) + def assignedPrinter(self): + return self._assigned_printer + + def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): + if self._assigned_printer != assigned_printer: + self._assigned_printer = assigned_printer + self.assignedPrinterChanged.emit() @pyqtProperty(str, notify=keyChanged) def key(self): diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index ed20ef1755..8a5a9b55be 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -145,6 +145,10 @@ class PrinterOutputModel(QObject): def updateActivePrintJob(self, print_job): if self._active_print_job != print_job: + if self._active_print_job is not None: + self._active_print_job.updateAssignedPrinter(None) + if print_job is not None: + print_job.updateAssignedPrinter(self) self._active_print_job = print_job self.activePrintJobChanged.emit() diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index f5afb0da6a..6de665b67f 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -60,6 +60,13 @@ class PrinterOutputDevice(QObject, OutputDevice): def _update(self): pass + def _getPrinterByKey(self, key): + for printer in self._printers: + if printer.key == key: + return printer + + return None + def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): raise NotImplementedError("requestWrite needs to be implemented") diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index a1c4f48e13..6e564fef29 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -7,7 +7,7 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel import json -from PyQt5.QtNetwork import QNetworkRequest +from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): @@ -16,17 +16,57 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._number_of_extruders = 2 + self._print_jobs = [] + def _update(self): super()._update() self._get("printers/", onFinished=self._onGetPrintersDataFinished) + self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished) - def _onGetPrintersDataFinished(self, reply): + def _onGetPrintJobsFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) if status_code == 200: try: result = json.loads(bytes(reply.readAll()).decode("utf-8")) except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid printer state message: Not valid JSON.") + Logger.log("w", "Received an invalid print jobs message: Not valid JSON.") + return + print_jobs_seen = [] + for print_job_data in result: + print_job = None + for job in self._print_jobs: + if job.key == print_job_data["uuid"]: + print_job = job + break + + if print_job is None: + print_job = PrintJobOutputModel(output_controller = None, + key = print_job_data["uuid"], + name = print_job_data["name"]) + print_job.updateTimeTotal(print_job_data["time_total"]) + print_job.updateTimeElapsed(print_job_data["time_elapsed"]) + print_job.updateState(print_job_data["status"]) + if print_job.state == "printing": + # Print job should be assigned to a printer. + printer = self._getPrinterByKey(print_job_data["printer_uuid"]) + if printer: + printer.updateActivePrintJob(print_job) + + print_jobs_seen.append(print_job) + for old_job in self._print_jobs: + if old_job not in print_jobs_seen: + # Print job needs to be removed. + old_job.assignedPrinter.updateActivePrintJob(None) + + self._print_jobs = print_jobs_seen + + def _onGetPrintersDataFinished(self, reply: QNetworkReply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 200: + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid printers state message: Not valid JSON.") return for printer_data in result: From a8e71cf50cf04b7fe8ea2cb91a1b3b57f54a4475 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 14:35:17 +0100 Subject: [PATCH 022/205] NetworkManager is now created on demand and re-created after a certain timeout. CL-541 --- .../NetworkedPrinterOutputDevice.py | 52 ++++++++++++++++--- .../ClusterUM3OutputDevice.py | 3 +- .../LegacyUM3OutputDevice.py | 3 +- .../UM3OutputDevicePlugin.py | 8 ++- 4 files changed, 57 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 7b74282303..3330426d0a 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -14,9 +14,13 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None - self._createNetworkManager() - self._last_response_time = time() + self._last_manager_create_time = None + self._recreate_network_manager_time = 30 + self._timeout_time = 10 # After how many seconds of no response should a timeout occur? + + self._last_response_time = None self._last_request_time = None + self._api_prefix = "" self._address = address self._properties = properties @@ -25,10 +29,28 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._onFinishedCallbacks = {} def _update(self): - if not self._manager.networkAccessible(): - pass # TODO: no internet connection. + if self._last_response_time: + time_since_last_response = time() - self._last_response_time + else: + time_since_last_response = 0 - pass + if self._last_request_time: + time_since_last_request = time() - self._last_request_time + else: + time_since_last_request = float("inf") # An irrelevantly large number of seconds + + if time_since_last_response > self._timeout_time >= time_since_last_request: + # Go (or stay) into timeout. + self.setConnectionState(ConnectionState.closed) + # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to + # sleep. + if time_since_last_response > self._recreate_network_manager_time: + if self._last_manager_create_time is None: + self._createNetworkManager() + if time() - self._last_manager_create_time > self._recreate_network_manager_time: + self._createNetworkManager() + + return True def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) @@ -39,22 +61,35 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return request def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]): + if self._manager is None: + self._createNetworkManager() request = self._createEmptyRequest(target) + self._last_request_time = time() reply = self._manager.put(request, data.encode()) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + if self._manager is None: + self._createNetworkManager() request = self._createEmptyRequest(target) + self._last_request_time = time() reply = self._manager.get(request) self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + if self._manager is None: + self._createNetworkManager() + self._last_request_time = time() pass def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable): + if self._manager is None: + self._createNetworkManager() + self._last_request_time = time() pass def _createNetworkManager(self): + Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) @@ -62,12 +97,17 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._manager = QNetworkAccessManager() self._manager.finished.connect(self.__handleOnFinished) + self._last_manager_create_time = time() #self._manager.authenticationRequired.connect(self._onAuthenticationRequired) #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply): + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None: + # No status code means it never even reached remote. + return + self._last_response_time = time() - # TODO: Check if the message is actually correct + self.setConnectionState(ConnectionState.connected) try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 6e564fef29..8f9a92384f 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -19,7 +19,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._print_jobs = [] def _update(self): - super()._update() + if not super()._update(): + return self._get("printers/", onFinished=self._onGetPrintersDataFinished) self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 63ebd055ad..21b58154a6 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -16,7 +16,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._number_of_extruders = 2 def _update(self): - super()._update() + if not super()._update(): + return self._get("printer", onFinished=self._onGetPrinterDataFinished) self._get("print_job", onFinished=self._onGetPrintJobFinished) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index b4ea1663b6..1462fb9373 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -80,7 +80,13 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._discovered_devices[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) def _onDeviceConnectionStateChanged(self, key): - pass # TODO + if key not in self._discovered_devices: + return + + if self._discovered_devices[key].isConnected(): + self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key]) + else: + self.getOutputDeviceManager().removeOutputDevice(key) def stop(self): if self._zero_conf is not None: From 3f1167a7d2953447b03301427aa380dc92068033 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 14:39:03 +0100 Subject: [PATCH 023/205] Results in printer discovery are sorted again CL-541 --- plugins/UM3NetworkPrinting/DiscoverUM3Action.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index f7afe3e00f..3c2a37e0a4 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -93,7 +93,7 @@ class DiscoverUM3Action(MachineAction): printers = list(self._network_plugin.getDiscoveredDevices().values()) # TODO; There are still some testing printers that don't have a correct printer type, so don't filter out unkown ones just yet. #printers = [printer for printer in printers if printer.printerType == global_printer_type or printer.printerType == "unknown"] - #printers.sort(key = lambda k: k.name) + printers.sort(key = lambda k: k.name) return printers else: return [] From 9cfe9769d318ead92c776626c3b6b010582094b6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 14:47:55 +0100 Subject: [PATCH 024/205] Printers now automatically try to connect again CL-541 --- .../NetworkedPrinterOutputDevice.py | 1 - .../UM3OutputDevicePlugin.py | 23 ++++--------------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 3330426d0a..d2886328de 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -54,7 +54,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) - print(url) request = QNetworkRequest(url) request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 1462fb9373..98fab42a44 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -32,6 +32,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self.addDeviceSignal.connect(self._onAddDevice) self.removeDeviceSignal.connect(self._onRemoveDevice) + Application.getInstance().globalContainerStackChanged.connect(self.reCheckConnections) + self._discovered_devices = {} # The zero-conf service changed requests are handled in a separate thread, so we can re-schedule the requests @@ -101,16 +103,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) self.discoveredDevicesChanged.emit() - '''printer = self._printers.pop(name, None) - if printer: - if printer.isConnected(): - printer.disconnect() - printer.connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) - Logger.log("d", "removePrinter, disconnecting [%s]..." % name) - self.printerListChanged.emit()''' def _onAddDevice(self, name, address, properties): - # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) @@ -122,17 +116,10 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._discovered_devices[device.getId()] = device self.discoveredDevicesChanged.emit() - pass - ''' - self._cluster_printers_seen[ - printer.getKey()] = name # Cluster printers that may be temporary unreachable or is rebooted keep being stored here global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack and printer.getKey() == global_container_stack.getMetaDataEntry("um_network_key"): - if printer.getKey() not in self._old_printers: # Was the printer already connected, but a re-scan forced? - Logger.log("d", "addPrinter, connecting [%s]..." % printer.getKey()) - self._printers[printer.getKey()].connect() - printer.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) - self.printerListChanged.emit()''' + if global_container_stack and device.getId() == global_container_stack.getMetaDataEntry("um_network_key"): + device.connect() + device.connectionStateChanged.connect(self._onDeviceConnectionStateChanged) ## Appends a service changed request so later the handling thread will pick it up and processes it. def _appendServiceChangedRequest(self, zeroconf, service_type, name, state_change): From 0f78b05802b19e259ad7a66fb8500c41b979199b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 15:12:23 +0100 Subject: [PATCH 025/205] Connection states changes are now tied into the UI again CL-541 --- cura/PrinterOutputDevice.py | 8 +++++--- cura/Settings/MachineManager.py | 8 ++++---- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 12 +++++++----- resources/qml/PrintMonitor.qml | 4 +++- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 6de665b67f..56ac318f20 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -27,7 +27,7 @@ i18n_catalog = i18nCatalog("cura") @signalemitter class PrinterOutputDevice(QObject, OutputDevice): printersChanged = pyqtSignal() - connectionStateChanged = pyqtSignal() + connectionStateChanged = pyqtSignal(str) def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -54,8 +54,10 @@ class PrinterOutputDevice(QObject, OutputDevice): def isConnected(self): return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error - def setConnectionState(self, new_state): - self._connection_state = new_state + def setConnectionState(self, connection_state): + if self._connection_state != connection_state: + self._connection_state = connection_state + self.connectionStateChanged.emit(self._id) def _update(self): pass diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0daf54c018..780a2a05ad 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -133,17 +133,17 @@ class MachineManager(QObject): outputDevicesChanged = pyqtSignal() def _onOutputDevicesChanged(self) -> None: - for printer_output_device in self._printer_output_devices: + '''for printer_output_device in self._printer_output_devices: printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) - printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged) + printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged)''' self._printer_output_devices.clear() for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): if isinstance(printer_output_device, PrinterOutputDevice): self._printer_output_devices.append(printer_output_device) - printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) - printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) + #printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) + #printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) self.outputDevicesChanged.emit() diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 98fab42a44..09bff8e7b8 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -84,7 +84,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): def _onDeviceConnectionStateChanged(self, key): if key not in self._discovered_devices: return - + print("STATE CHANGED", key) if self._discovered_devices[key].isConnected(): self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key]) else: @@ -95,8 +95,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Logger.log("d", "zeroconf close...") self._zero_conf.close() - def _onRemoveDevice(self, name): - device = self._discovered_devices.pop(name, None) + def _onRemoveDevice(self, device_id): + device = self._discovered_devices.pop(device_id, None) if device: if device.isConnected(): device.disconnect() @@ -108,10 +108,12 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) - if cluster_size > 0: + # TODO: For debug purposes; force it to be legacy printer. + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + '''if cluster_size > 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: - device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties)''' self._discovered_devices[device.getId()] = device self.discoveredDevicesChanged.emit() diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index e69f7cf4fd..901c8f9fdc 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -12,7 +12,9 @@ import Cura 1.0 as Cura Column { id: printMonitor - property var connectedPrinter: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + property var connectedDevice: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null + + property var activePrinter: connectedDevice != null ? connectedDevice.activePrinter : null Cura.ExtrudersModel { From e3d07f1806bf546eb1dcfafc7b9e691c52bcbf7d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:06:30 +0100 Subject: [PATCH 026/205] Moved ExtruderBox and OutputDeviceHeader to their own files. This makes it a whole lot easier to get an overview. CL-541 --- cura/PrinterOutput/ExtruderOuputModel.py | 2 +- resources/qml/PrintMonitor.qml | 223 +----------------- resources/qml/PrinterOutput/ExtruderBox.qml | 201 ++++++++++++++++ .../qml/PrinterOutput/OutputDeviceHeader.qml | 54 +++++ 4 files changed, 263 insertions(+), 217 deletions(-) create mode 100644 resources/qml/PrinterOutput/ExtruderBox.qml create mode 100644 resources/qml/PrinterOutput/OutputDeviceHeader.qml diff --git a/cura/PrinterOutput/ExtruderOuputModel.py b/cura/PrinterOutput/ExtruderOuputModel.py index 121e9a69d9..f8f8088389 100644 --- a/cura/PrinterOutput/ExtruderOuputModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -58,7 +58,7 @@ class ExtruderOutputModel(QObject): @pyqtProperty(int, notify=hotendTemperatureChanged) def hotendTemperature(self) -> int: - return self._hotendTemperature + return self._hotend_temperature @pyqtProperty(str, notify = hotendIDChanged) def hotendID(self) -> str: diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 901c8f9fdc..6c815827f6 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -9,6 +9,8 @@ import QtQuick.Layouts 1.1 import UM 1.2 as UM import Cura 1.0 as Cura +import "PrinterOutput" + Column { id: printMonitor @@ -22,45 +24,10 @@ Column simpleNames: true } - Rectangle + OutputDeviceHeader { - id: connectedPrinterHeader width: parent.width - height: Math.floor(childrenRect.height + UM.Theme.getSize("default_margin").height * 2) - color: UM.Theme.getColor("setting_category") - - Label - { - id: connectedPrinterNameLabel - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text") - anchors.left: parent.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - text: connectedPrinter != null ? connectedPrinter.name : catalog.i18nc("@info:status", "No printer connected") - } - Label - { - id: connectedPrinterAddressLabel - text: (connectedPrinter != null && connectedPrinter.address != null) ? connectedPrinter.address : "" - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text_inactive") - anchors.top: parent.top - anchors.right: parent.right - anchors.margins: UM.Theme.getSize("default_margin").width - } - Label - { - text: connectedPrinter != null ? connectedPrinter.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") - color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - font: UM.Theme.getFont("very_small") - wrapMode: Text.WordWrap - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.top: connectedPrinterNameLabel.bottom - } + outputDevice: connectedDevice } Rectangle @@ -78,189 +45,13 @@ Column Repeater { id: extrudersRepeater - model: machineExtruderCount.properties.value + model: activePrinter.extruders - delegate: Rectangle + ExtruderBox { - id: extruderRectangle color: UM.Theme.getColor("sidebar") width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) - height: UM.Theme.getSize("sidebar_extruder_box").height - - Label //Extruder name. - { - text: Cura.ExtruderManager.getExtruderName(index) != "" ? Cura.ExtruderManager.getExtruderName(index) : catalog.i18nc("@label", "Extruder") - color: UM.Theme.getColor("text") - font: UM.Theme.getFont("default") - anchors.left: parent.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - } - - Label //Target temperature. - { - id: extruderTargetTemperature - text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.targetHotendTemperatures[index] != null) ? Math.round(connectedPrinter.targetHotendTemperatures[index]) + "°C" : "" - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text_inactive") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.bottom: extruderTemperature.bottom - - MouseArea //For tooltip. - { - id: extruderTargetTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: extruderTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Temperature indication. - { - id: extruderTemperature - text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.hotendTemperatures[index] != null) ? Math.round(connectedPrinter.hotendTemperatures[index]) + "°C" : "" - color: UM.Theme.getColor("text") - font: UM.Theme.getFont("large") - anchors.right: extruderTargetTemperature.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: extruderTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The current temperature of this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Rectangle //Material colour indication. - { - id: materialColor - width: Math.floor(materialName.height * 0.75) - height: Math.floor(materialName.height * 0.75) - radius: width / 2 - color: (connectedPrinter != null && connectedPrinter.materialColors[index] != null && connectedPrinter.materialIds[index] != "") ? connectedPrinter.materialColors[index] : "#00000000" - border.width: UM.Theme.getSize("default_lining").width - border.color: UM.Theme.getColor("lining") - visible: connectedPrinter != null && connectedPrinter.materialColors[index] != null && connectedPrinter.materialIds[index] != "" - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: materialName.verticalCenter - - MouseArea //For tooltip. - { - id: materialColorTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, -parent.height / 2).y}, - catalog.i18nc("@tooltip", "The colour of the material in this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Material name. - { - id: materialName - text: (connectedPrinter != null && connectedPrinter.materialNames[index] != null && connectedPrinter.materialIds[index] != "") ? connectedPrinter.materialNames[index] : "" - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.left: materialColor.right - anchors.bottom: parent.bottom - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: materialNameTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, 0).y}, - catalog.i18nc("@tooltip", "The material in this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Variant name. - { - id: variantName - text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null) ? connectedPrinter.hotendIds[index] : "" - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: variantNameTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The nozzle inserted in this extruder.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } + extruderModel: activePrinter.extruders[index] } } } diff --git a/resources/qml/PrinterOutput/ExtruderBox.qml b/resources/qml/PrinterOutput/ExtruderBox.qml new file mode 100644 index 0000000000..2860789dd0 --- /dev/null +++ b/resources/qml/PrinterOutput/ExtruderBox.qml @@ -0,0 +1,201 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + + +Item +{ + property alias color: background.color + property var extruderModel + property var position: index + //width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) + implicitWidth: parent.width + implicitHeight: UM.Theme.getSize("sidebar_extruder_box").height + Rectangle + { + id: background + anchors.fill: parent + + Label //Extruder name. + { + text: Cura.ExtruderManager.getExtruderName(position) != "" ? Cura.ExtruderManager.getExtruderName(position) : catalog.i18nc("@label", "Extruder") + color: UM.Theme.getColor("text") + font: UM.Theme.getFont("default") + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + } + + Label //Target temperature. + { + id: extruderTargetTemperature + text: Math.round(extruderModel.targetHotendTemperature) + "°C" + //text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.targetHotendTemperatures[index] != null) ? Math.round(connectedPrinter.targetHotendTemperatures[index]) + "°C" : "" + font: UM.Theme.getFont("small") + color: UM.Theme.getColor("text_inactive") + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.bottom: extruderTemperature.bottom + + MouseArea //For tooltip. + { + id: extruderTargetTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: extruderTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The target temperature of the hotend. The hotend will heat up or cool down towards this temperature. If this is 0, the hotend heating is turned off.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Temperature indication. + { + id: extruderTemperature + text: Math.round(extruderModel.hotendTemperature) + "°C" + //text: (connectedPrinter != null && connectedPrinter.hotendIds[index] != null && connectedPrinter.hotendTemperatures[index] != null) ? Math.round(connectedPrinter.hotendTemperatures[index]) + "°C" : "" + color: UM.Theme.getColor("text") + font: UM.Theme.getFont("large") + anchors.right: extruderTargetTemperature.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: extruderTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The current temperature of this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + + Rectangle //Material colour indication. + { + id: materialColor + width: Math.floor(materialName.height * 0.75) + height: Math.floor(materialName.height * 0.75) + radius: width / 2 + color: extruderModel.activeMaterial ? extruderModel.activeMaterial.color: "#00000000" + border.width: UM.Theme.getSize("default_lining").width + border.color: UM.Theme.getColor("lining") + visible: extruderModel.activeMaterial != null + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: materialName.verticalCenter + + MouseArea //For tooltip. + { + id: materialColorTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, -parent.height / 2).y}, + catalog.i18nc("@tooltip", "The colour of the material in this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Material name. + { + id: materialName + text: extruderModel.activeMaterial != null ? extruderModel.activeMaterial.name : "" + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.left: materialColor.right + anchors.bottom: parent.bottom + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: materialNameTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, 0).y}, + catalog.i18nc("@tooltip", "The material in this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Variant name. + { + id: variantName + text: extruderModel.hotendID + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: variantNameTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: parent.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The nozzle inserted in this extruder.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + } +} \ No newline at end of file diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml new file mode 100644 index 0000000000..6553655da0 --- /dev/null +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -0,0 +1,54 @@ +import QtQuick 2.2 + +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + + +Item +{ + implicitWidth: parent.width + implicitHeight: Math.floor(childrenRect.height + UM.Theme.getSize("default_margin").height * 2) + property var outputDevice: null + Rectangle + { + anchors.fill: parent + color: UM.Theme.getColor("setting_category") + + Label + { + id: outputDeviceNameLabel + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + text: outputDevice != null ? outputDevice.name : catalog.i18nc("@info:status", "No printer connected") + } + Label + { + id: outputDeviceAddressLabel + text: (outputDevice != null && outputDevice.address != null) ? outputDevice.address : "" + font: UM.Theme.getFont("small") + color: UM.Theme.getColor("text_inactive") + anchors.top: parent.top + anchors.right: parent.right + anchors.margins: UM.Theme.getSize("default_margin").width + } + Label + { + text: outputDevice != null ? outputDevice.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") + color: outputDevice != null && outputDevice.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + font: UM.Theme.getFont("very_small") + wrapMode: Text.WordWrap + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.top: outputDevice.bottom + } + } +} \ No newline at end of file From d8b12be5e4410228704461b5293c7ba9898cc285 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:26:17 +0100 Subject: [PATCH 027/205] LegacyUM3 now correctly gets material set CL-541 --- .../LegacyUM3OutputDevice.py | 26 ++++++++++++++++--- resources/qml/PrinterOutput/ExtruderBox.qml | 2 +- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 21b58154a6..60409ec729 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,8 +1,10 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel +from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from UM.Logger import Logger +from UM.Settings.ContainerRegistry import ContainerRegistry from PyQt5.QtNetwork import QNetworkRequest @@ -70,10 +72,28 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): for index in range(0, self._number_of_extruders): temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"] - printer.extruders[index].updateTargetHotendTemperature(temperatures["target"]) - printer.extruders[index].updateHotendTemperature(temperatures["current"]) + extruder = printer.extruders[index] + extruder.updateTargetHotendTemperature(temperatures["target"]) + extruder.updateHotendTemperature(temperatures["current"]) - # TODO: Set active material + material_guid = result["heads"][0]["extruders"][index]["active_material"]["guid"] + + if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_guid: + # Find matching material (as we need to set brand, type & color) + containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", + GUID=material_guid) + if containers: + color = containers[0].getMetaDataEntry("color_code") + brand = containers[0].getMetaDataEntry("brand") + material_type = containers[0].getMetaDataEntry("material") + else: + # Unknown material. + color = "#00000000" + brand = "Unknown" + material_type = "Unknown" + material = MaterialOutputModel(guid=material_guid, type=material_type, + brand=brand, color=color) + extruder.updateActiveMaterial(material) try: hotend_id = result["heads"][0]["extruders"][index]["hotend"]["id"] diff --git a/resources/qml/PrinterOutput/ExtruderBox.qml b/resources/qml/PrinterOutput/ExtruderBox.qml index 2860789dd0..a7141262a9 100644 --- a/resources/qml/PrinterOutput/ExtruderBox.qml +++ b/resources/qml/PrinterOutput/ExtruderBox.qml @@ -136,7 +136,7 @@ Item Label //Material name. { id: materialName - text: extruderModel.activeMaterial != null ? extruderModel.activeMaterial.name : "" + text: extruderModel.activeMaterial != null ? extruderModel.activeMaterial.type : "" font: UM.Theme.getFont("default") color: UM.Theme.getColor("text") anchors.left: materialColor.right From 34e808d585cb1f6e74a74d012430c96850f6efe6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:36:51 +0100 Subject: [PATCH 028/205] PrinterOutputModel now has different extruders if it has more than one. It used to just fill the list with references to the first one created. CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 3 +-- resources/qml/PrintMonitor.qml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 8a5a9b55be..9c1040fe1b 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -29,8 +29,7 @@ class PrinterOutputModel(QObject): self._name = "" self._key = "" # Unique identifier self._controller = output_controller - self._extruders = [ExtruderOutputModel(printer=self)] * number_of_extruders - + self._extruders = [ExtruderOutputModel(printer=self) for i in range(number_of_extruders)] self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 6c815827f6..23ab365861 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -51,7 +51,7 @@ Column { color: UM.Theme.getColor("sidebar") width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) - extruderModel: activePrinter.extruders[index] + extruderModel: modelData } } } From 0fe91db6362e3254fa3b7adb5a8084be61e32419 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:52:37 +0100 Subject: [PATCH 029/205] Moved HeatedBedBox to own qml file CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 2 +- resources/qml/PrintMonitor.qml | 394 +----------------- resources/qml/PrinterOutput/HeatedBedBox.qml | 399 +++++++++++++++++++ 3 files changed, 409 insertions(+), 386 deletions(-) create mode 100644 resources/qml/PrinterOutput/HeatedBedBox.qml diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 9c1040fe1b..12c2b4fe58 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -24,7 +24,7 @@ class PrinterOutputModel(QObject): def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) - self._bed_temperature = 0 + self._bed_temperature = -1 # Use -1 for no heated bed. self._target_bed_temperature = 0 self._name = "" self._key = "" # Unique identifier diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 23ab365861..f95d829306 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -15,7 +15,6 @@ Column { id: printMonitor property var connectedDevice: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null - property var activePrinter: connectedDevice != null ? connectedDevice.activePrinter : null Cura.ExtrudersModel @@ -51,7 +50,7 @@ Column { color: UM.Theme.getColor("sidebar") width: index == machineExtruderCount.properties.value - 1 && index % 2 == 0 ? extrudersGrid.width : Math.floor(extrudersGrid.width / 2 - UM.Theme.getSize("sidebar_lining_thin").width / 2) - extruderModel: modelData + extruderModel: modelData } } } @@ -64,391 +63,16 @@ Column height: UM.Theme.getSize("sidebar_lining_thin").width } - Rectangle + HeatedBedBox { - color: UM.Theme.getColor("sidebar") - width: parent.width - height: machineHeatedBed.properties.value == "True" ? UM.Theme.getSize("sidebar_extruder_box").height : 0 - visible: machineHeatedBed.properties.value == "True" - - Label //Build plate label. - { - text: catalog.i18nc("@label", "Build plate") - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.left: parent.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - } - Label //Target temperature. - { - id: bedTargetTemperature - text: connectedPrinter != null ? connectedPrinter.targetBedTemperature + "°C" : "" - font: UM.Theme.getFont("small") - color: UM.Theme.getColor("text_inactive") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.bottom: bedCurrentTemperature.bottom - - MouseArea //For tooltip. - { - id: bedTargetTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: bedTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Label //Current temperature. - { - id: bedCurrentTemperature - text: connectedPrinter != null ? connectedPrinter.bedTemperature + "°C" : "" - font: UM.Theme.getFont("large") - color: UM.Theme.getColor("text") - anchors.right: bedTargetTemperature.left - anchors.top: parent.top - anchors.margins: UM.Theme.getSize("default_margin").width - - MouseArea //For tooltip. - { - id: bedTemperatureTooltipArea - hoverEnabled: true - anchors.fill: parent - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: bedCurrentTemperature.mapToItem(base, 0, -parent.height / 4).y}, - catalog.i18nc("@tooltip", "The current temperature of the heated bed.") - ); - } - else - { - base.hideTooltip(); - } - } - } - } - Rectangle //Input field for pre-heat temperature. - { - id: preheatTemperatureControl - color: !enabled ? UM.Theme.getColor("setting_control_disabled") : showError ? UM.Theme.getColor("setting_validation_error_background") : UM.Theme.getColor("setting_validation_ok") - property var showError: - { - if(bedTemperature.properties.maximum_value != "None" && bedTemperature.properties.maximum_value < Math.floor(preheatTemperatureInput.text)) - { - return true; - } else - { - return false; - } - } - enabled: - { - if (connectedPrinter == null) - { - return false; //Can't preheat if not connected. - } - if (!connectedPrinter.acceptsCommands) - { - return false; //Not allowed to do anything. - } - if (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "pre_print" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "paused" || connectedPrinter.jobState == "error" || connectedPrinter.jobState == "offline") - { - return false; //Printer is in a state where it can't react to pre-heating. - } - return true; - } - border.width: UM.Theme.getSize("default_lining").width - border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : preheatTemperatureInputMouseArea.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - anchors.bottom: parent.bottom - anchors.bottomMargin: UM.Theme.getSize("default_margin").height - width: UM.Theme.getSize("setting_control").width - height: UM.Theme.getSize("setting_control").height - visible: connectedPrinter != null ? connectedPrinter.canPreHeatBed: true - Rectangle //Highlight of input field. - { - anchors.fill: parent - anchors.margins: UM.Theme.getSize("default_lining").width - color: UM.Theme.getColor("setting_control_highlight") - opacity: preheatTemperatureControl.hovered ? 1.0 : 0 - } - Label //Maximum temperature indication. - { - text: (bedTemperature.properties.maximum_value != "None" ? bedTemperature.properties.maximum_value : "") + "°C" - color: UM.Theme.getColor("setting_unit") - font: UM.Theme.getFont("default") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.verticalCenter: parent.verticalCenter - } - MouseArea //Change cursor on hovering. - { - id: preheatTemperatureInputMouseArea - hoverEnabled: true - anchors.fill: parent - cursorShape: Qt.IBeamCursor - - onHoveredChanged: - { - if (containsMouse) - { - base.showTooltip( - base, - {x: 0, y: preheatTemperatureInputMouseArea.mapToItem(base, 0, 0).y}, - catalog.i18nc("@tooltip of temperature input", "The temperature to pre-heat the bed to.") - ); - } - else - { - base.hideTooltip(); - } - } - } - TextInput - { - id: preheatTemperatureInput - font: UM.Theme.getFont("default") - color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") - selectByMouse: true - maximumLength: 10 - enabled: parent.enabled - validator: RegExpValidator { regExp: /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } //Floating point regex. - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - renderType: Text.NativeRendering - - Component.onCompleted: - { - if (!bedTemperature.properties.value) - { - text = ""; - } - if ((bedTemperature.resolve != "None" && bedTemperature.resolve) && (bedTemperature.stackLevels[0] != 0) && (bedTemperature.stackLevels[0] != 1)) - { - // We have a resolve function. Indicates that the setting is not settable per extruder and that - // we have to choose between the resolved value (default) and the global value - // (if user has explicitly set this). - text = bedTemperature.resolve; - } - else - { - text = bedTemperature.properties.value; - } - } - } - } - - UM.RecolorImage - { - id: preheatCountdownIcon - width: UM.Theme.getSize("save_button_specs_icons").width - height: UM.Theme.getSize("save_button_specs_icons").height - sourceSize.width: width - sourceSize.height: height - color: UM.Theme.getColor("text") - visible: preheatCountdown.visible - source: UM.Theme.getIcon("print_time") - anchors.right: preheatCountdown.left - anchors.rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - anchors.verticalCenter: preheatCountdown.verticalCenter - } - - Timer - { - id: preheatUpdateTimer - interval: 100 //Update every 100ms. You want to update every 1s, but then you have one timer for the updating running out of sync with the actual date timer and you might skip seconds. - running: connectedPrinter != null && connectedPrinter.preheatBedRemainingTime != "" - repeat: true - onTriggered: update() - property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. - function update() - { - preheatCountdown.text = "" - if (connectedPrinter != null) - { - preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; - } - if (preheatCountdown.text == "") //Either time elapsed or not connected. - { - stop(); - } - } - } - Label - { - id: preheatCountdown - text: connectedPrinter != null ? connectedPrinter.preheatBedRemainingTime : "" - visible: text != "" //Has no direct effect, but just so that we can link visibility of clock icon to visibility of the countdown text. - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.right: preheatButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: preheatButton.verticalCenter - } - - Button //The pre-heat button. - { - id: preheatButton - height: UM.Theme.getSize("setting_control").height - visible: connectedPrinter != null ? connectedPrinter.canPreHeatBed: true - enabled: - { - if (!preheatTemperatureControl.enabled) - { - return false; //Not connected, not authenticated or printer is busy. - } - if (preheatUpdateTimer.running) - { - return true; //Can always cancel if the timer is running. - } - if (bedTemperature.properties.minimum_value != "None" && Math.floor(preheatTemperatureInput.text) < Math.floor(bedTemperature.properties.minimum_value)) - { - return false; //Target temperature too low. - } - if (bedTemperature.properties.maximum_value != "None" && Math.floor(preheatTemperatureInput.text) > Math.floor(bedTemperature.properties.maximum_value)) - { - return false; //Target temperature too high. - } - if (Math.floor(preheatTemperatureInput.text) == 0) - { - return false; //Setting the temperature to 0 is not allowed (since that cancels the pre-heating). - } - return true; //Preconditions are met. - } - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.margins: UM.Theme.getSize("default_margin").width - style: ButtonStyle { - background: Rectangle - { - border.width: UM.Theme.getSize("default_lining").width - implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2) - border.color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_border"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_border"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_border"); - } - else - { - return UM.Theme.getColor("action_button_border"); - } - } - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered"); - } - else - { - return UM.Theme.getColor("action_button"); - } - } - Behavior on color - { - ColorAnimation - { - duration: 50 - } - } - - Label - { - id: actualLabel - anchors.centerIn: parent - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_text"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_text"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_text"); - } - else - { - return UM.Theme.getColor("action_button_text"); - } - } - font: UM.Theme.getFont("action_button") - text: preheatUpdateTimer.running ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") - } - } - } - - onClicked: - { - if (!preheatUpdateTimer.running) - { - connectedPrinter.preheatBed(preheatTemperatureInput.text, connectedPrinter.preheatBedTimeout); - preheatUpdateTimer.start(); - preheatUpdateTimer.update(); //Update once before the first timer is triggered. - } - else - { - connectedPrinter.cancelPreheatBed(); - preheatUpdateTimer.update(); - } - } - - onHoveredChanged: - { - if (hovered) - { - base.showTooltip( - base, - {x: 0, y: preheatButton.mapToItem(base, 0, 0).y}, - catalog.i18nc("@tooltip of pre-heat", "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print.") - ); - } - else - { - base.hideTooltip(); - } - } + visible: { + if(activePrinter != null && activePrinter.bed_temperature != -1) + { + return true + } + return false } + printerModel: activePrinter } UM.SettingPropertyProvider diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml new file mode 100644 index 0000000000..6ff48df6a2 --- /dev/null +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -0,0 +1,399 @@ +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Item +{ + implicitWidth: parent.width + height: visible ? UM.Theme.getSize("sidebar_extruder_box").height : 0 + property var printerModel + Rectangle + { + color: UM.Theme.getColor("sidebar") + anchors.fill: parent + + Label //Build plate label. + { + text: catalog.i18nc("@label", "Build plate") + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.left: parent.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + } + + Label //Target temperature. + { + id: bedTargetTemperature + text: printerModel != null ? printerModel.targetBedTemperature + "°C" : "" + font: UM.Theme.getFont("small") + color: UM.Theme.getColor("text_inactive") + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.bottom: bedCurrentTemperature.bottom + + MouseArea //For tooltip. + { + id: bedTargetTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: bedTargetTemperature.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The target temperature of the heated bed. The bed will heat up or cool down towards this temperature. If this is 0, the bed heating is turned off.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Label //Current temperature. + { + id: bedCurrentTemperature + text: printerModel != null ? printerModel.bedTemperature + "°C" : "" + font: UM.Theme.getFont("large") + color: UM.Theme.getColor("text") + anchors.right: bedTargetTemperature.left + anchors.top: parent.top + anchors.margins: UM.Theme.getSize("default_margin").width + + MouseArea //For tooltip. + { + id: bedTemperatureTooltipArea + hoverEnabled: true + anchors.fill: parent + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: bedCurrentTemperature.mapToItem(base, 0, -parent.height / 4).y}, + catalog.i18nc("@tooltip", "The current temperature of the heated bed.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } + Rectangle //Input field for pre-heat temperature. + { + id: preheatTemperatureControl + color: !enabled ? UM.Theme.getColor("setting_control_disabled") : showError ? UM.Theme.getColor("setting_validation_error_background") : UM.Theme.getColor("setting_validation_ok") + property var showError: + { + if(bedTemperature.properties.maximum_value != "None" && bedTemperature.properties.maximum_value < Math.floor(preheatTemperatureInput.text)) + { + return true; + } else + { + return false; + } + } + enabled: + { + if (printerModel == null) + { + return false; //Can't preheat if not connected. + } + if (!connectedPrinter.acceptsCommands) + { + return false; //Not allowed to do anything. + } + if (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "pre_print" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "paused" || connectedPrinter.jobState == "error" || connectedPrinter.jobState == "offline") + { + return false; //Printer is in a state where it can't react to pre-heating. + } + return true; + } + border.width: UM.Theme.getSize("default_lining").width + border.color: !enabled ? UM.Theme.getColor("setting_control_disabled_border") : preheatTemperatureInputMouseArea.containsMouse ? UM.Theme.getColor("setting_control_border_highlight") : UM.Theme.getColor("setting_control_border") + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.bottom: parent.bottom + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + width: UM.Theme.getSize("setting_control").width + height: UM.Theme.getSize("setting_control").height + visible: printerModel != null ? printerModel.canPreHeatBed: true + Rectangle //Highlight of input field. + { + anchors.fill: parent + anchors.margins: UM.Theme.getSize("default_lining").width + color: UM.Theme.getColor("setting_control_highlight") + opacity: preheatTemperatureControl.hovered ? 1.0 : 0 + } + Label //Maximum temperature indication. + { + text: (bedTemperature.properties.maximum_value != "None" ? bedTemperature.properties.maximum_value : "") + "°C" + color: UM.Theme.getColor("setting_unit") + font: UM.Theme.getFont("default") + anchors.right: parent.right + anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width + anchors.verticalCenter: parent.verticalCenter + } + MouseArea //Change cursor on hovering. + { + id: preheatTemperatureInputMouseArea + hoverEnabled: true + anchors.fill: parent + cursorShape: Qt.IBeamCursor + + onHoveredChanged: + { + if (containsMouse) + { + base.showTooltip( + base, + {x: 0, y: preheatTemperatureInputMouseArea.mapToItem(base, 0, 0).y}, + catalog.i18nc("@tooltip of temperature input", "The temperature to pre-heat the bed to.") + ); + } + else + { + base.hideTooltip(); + } + } + } + TextInput + { + id: preheatTemperatureInput + font: UM.Theme.getFont("default") + color: !enabled ? UM.Theme.getColor("setting_control_disabled_text") : UM.Theme.getColor("setting_control_text") + selectByMouse: true + maximumLength: 10 + enabled: parent.enabled + validator: RegExpValidator { regExp: /^-?[0-9]{0,9}[.,]?[0-9]{0,10}$/ } //Floating point regex. + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("setting_unit_margin").width + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + renderType: Text.NativeRendering + + Component.onCompleted: + { + if (!bedTemperature.properties.value) + { + text = ""; + } + if ((bedTemperature.resolve != "None" && bedTemperature.resolve) && (bedTemperature.stackLevels[0] != 0) && (bedTemperature.stackLevels[0] != 1)) + { + // We have a resolve function. Indicates that the setting is not settable per extruder and that + // we have to choose between the resolved value (default) and the global value + // (if user has explicitly set this). + text = bedTemperature.resolve; + } + else + { + text = bedTemperature.properties.value; + } + } + } + } + + UM.RecolorImage + { + id: preheatCountdownIcon + width: UM.Theme.getSize("save_button_specs_icons").width + height: UM.Theme.getSize("save_button_specs_icons").height + sourceSize.width: width + sourceSize.height: height + color: UM.Theme.getColor("text") + visible: preheatCountdown.visible + source: UM.Theme.getIcon("print_time") + anchors.right: preheatCountdown.left + anchors.rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) + anchors.verticalCenter: preheatCountdown.verticalCenter + } + + Timer + { + id: preheatUpdateTimer + interval: 100 //Update every 100ms. You want to update every 1s, but then you have one timer for the updating running out of sync with the actual date timer and you might skip seconds. + running: printerModel != null && printerModel.preheatBedRemainingTime != "" + repeat: true + onTriggered: update() + property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. + function update() + { + preheatCountdown.text = "" + if (printerModel != null) + { + preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; + } + if (preheatCountdown.text == "") //Either time elapsed or not connected. + { + stop(); + } + } + } + Label + { + id: preheatCountdown + text: printerModel != null ? printerModel.preheatBedRemainingTime : "" + visible: text != "" //Has no direct effect, but just so that we can link visibility of clock icon to visibility of the countdown text. + font: UM.Theme.getFont("default") + color: UM.Theme.getColor("text") + anchors.right: preheatButton.left + anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.verticalCenter: preheatButton.verticalCenter + } + + Button //The pre-heat button. + { + id: preheatButton + height: UM.Theme.getSize("setting_control").height + visible: printerModel != null ? printerModel.canPreHeatBed: true + enabled: + { + if (!preheatTemperatureControl.enabled) + { + return false; //Not connected, not authenticated or printer is busy. + } + if (preheatUpdateTimer.running) + { + return true; //Can always cancel if the timer is running. + } + if (bedTemperature.properties.minimum_value != "None" && Math.floor(preheatTemperatureInput.text) < Math.floor(bedTemperature.properties.minimum_value)) + { + return false; //Target temperature too low. + } + if (bedTemperature.properties.maximum_value != "None" && Math.floor(preheatTemperatureInput.text) > Math.floor(bedTemperature.properties.maximum_value)) + { + return false; //Target temperature too high. + } + if (Math.floor(preheatTemperatureInput.text) == 0) + { + return false; //Setting the temperature to 0 is not allowed (since that cancels the pre-heating). + } + return true; //Preconditions are met. + } + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: UM.Theme.getSize("default_margin").width + style: ButtonStyle { + background: Rectangle + { + border.width: UM.Theme.getSize("default_lining").width + implicitWidth: actualLabel.contentWidth + (UM.Theme.getSize("default_margin").width * 2) + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + else + { + return UM.Theme.getColor("action_button_border"); + } + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + else + { + return UM.Theme.getColor("action_button"); + } + } + Behavior on color + { + ColorAnimation + { + duration: 50 + } + } + + Label + { + id: actualLabel + anchors.centerIn: parent + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + else + { + return UM.Theme.getColor("action_button_text"); + } + } + font: UM.Theme.getFont("action_button") + text: preheatUpdateTimer.running ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") + } + } + } + + onClicked: + { + if (!preheatUpdateTimer.running) + { + printerModel.preheatBed(preheatTemperatureInput.text, printerModel.preheatBedTimeout); + preheatUpdateTimer.start(); + preheatUpdateTimer.update(); //Update once before the first timer is triggered. + } + else + { + printerModel.cancelPreheatBed(); + preheatUpdateTimer.update(); + } + } + + onHoveredChanged: + { + if (hovered) + { + base.showTooltip( + base, + {x: 0, y: preheatButton.mapToItem(base, 0, 0).y}, + catalog.i18nc("@tooltip of pre-heat", "Heat the bed in advance before printing. You can continue adjusting your print while it is heating, and you won't have to wait for the bed to heat up when you're ready to print.") + ); + } + else + { + base.hideTooltip(); + } + } + } + } +} \ No newline at end of file From f987e6d977d8108ab6225b6d3a6df401d89a57b8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 21 Nov 2017 16:59:17 +0100 Subject: [PATCH 030/205] Functionality properties (canPause, canPreHeatBed, etc) are now in the Controller. It's actually up to the controller to say something about this, so this location makes more sense CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 5 ++++- cura/PrinterOutput/PrinterOutputModel.py | 22 ++++++++++--------- resources/qml/PrinterOutput/HeatedBedBox.qml | 4 ++++ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 9f9a26a2a5..525c8db102 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -9,7 +9,10 @@ if MYPY: class PrinterOutputController: def __init__(self): - pass + self.can_pause = True + self.can_abort = True + self.can_pre_heat_bed = True + self.can_control_manually = True def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): # TODO: implement diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 12c2b4fe58..97f5c69723 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -35,12 +35,6 @@ class PrinterOutputModel(QObject): self._printer_state = "unknown" - # Features of the printer; - self._can_pause = True - self._can_abort = True - self._can_pre_heat_bed = True - self._can_control_manually = True - @pyqtProperty(str, notify=keyChanged) def key(self): return self._key @@ -175,19 +169,27 @@ class PrinterOutputModel(QObject): # Does the printer support pre-heating the bed at all @pyqtProperty(bool, constant=True) def canPreHeatBed(self): - return self._can_pre_heat_bed + if self._controller: + return self._controller.can_pre_heat_bed + return False # Does the printer support pause at all @pyqtProperty(bool, constant=True) def canPause(self): - return self._can_pause + if self._controller: + return self.can_pause + return False # Does the printer support abort at all @pyqtProperty(bool, constant=True) def canAbort(self): - return self._can_abort + if self._controller: + return self.can_abort + return False # Does the printer support manual control at all @pyqtProperty(bool, constant=True) def canControlManually(self): - return self._can_control_manually + if self._controller: + return self.can_control_manually + return False diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index 6ff48df6a2..de34fe5943 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -229,6 +229,10 @@ Item property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. function update() { + if(printerModel != null && !printerModel.canPreHeatBed) + { + return // Nothing to do, printer cant preheat at all! + } preheatCountdown.text = "" if (printerModel != null) { From 7465a6551a7a0f8331237dc2f1bd27c1e9d7c306 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 22 Nov 2017 11:59:07 +0100 Subject: [PATCH 031/205] Setup the authentication stuff for LegacyUM3 CL-541 --- .../NetworkedPrinterOutputDevice.py | 39 ++- cura/PrinterOutputDevice.py | 2 + .../LegacyUM3OutputDevice.py | 249 +++++++++++++++++- 3 files changed, 284 insertions(+), 6 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index d2886328de..b9bd27c129 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -8,9 +8,19 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, py from time import time from typing import Callable, Any +from enum import IntEnum + + +class AuthState(IntEnum): + NotAuthenticated = 1 + AuthenticationRequested = 2 + Authenticated = 3 + AuthenticationDenied = 4 + AuthenticationReceived = 5 class NetworkedPrinterOutputDevice(PrinterOutputDevice): + authenticationStateChanged = pyqtSignal() def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None @@ -27,6 +37,16 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) self._onFinishedCallbacks = {} + self._authentication_state = AuthState.NotAuthenticated + + def setAuthenticationState(self, authentication_state): + if self._authentication_state != authentication_state: + self._authentication_state = authentication_state + self.authenticationStateChanged.emit() + + @pyqtProperty(int, notify=authenticationStateChanged) + def authenticationState(self): + return self._authentication_state def _update(self): if self._last_response_time: @@ -81,23 +101,30 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_request_time = time() pass - def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable): + def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() + request = self._createEmptyRequest(target) self._last_request_time = time() - pass + reply = self._manager.post(request, data) + if onProgress is not None: + reply.uploadProgress.connect(onProgress) + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + + def _onAuthenticationRequired(self, reply, authenticator): + Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) def _createNetworkManager(self): Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) - #self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) + self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) self._manager = QNetworkAccessManager() self._manager.finished.connect(self.__handleOnFinished) self._last_manager_create_time = time() - #self._manager.authenticationRequired.connect(self._onAuthenticationRequired) + self._manager.authenticationRequired.connect(self._onAuthenticationRequired) #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply): @@ -107,7 +134,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_response_time = time() - self.setConnectionState(ConnectionState.connected) + if self._connection_state == ConnectionState.connecting: + self.setConnectionState(ConnectionState.connected) + try: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) except Exception: diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 56ac318f20..a170037311 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -135,11 +135,13 @@ class PrinterOutputDevice(QObject, OutputDevice): ## Attempt to establish connection def connect(self): + self.setConnectionState(ConnectionState.connecting) self._update_timer.start() ## Attempt to close the connection def close(self): self._update_timer.stop() + self.setConnectionState(ConnectionState.closed) ## Ensure that close gets called when object is destroyed def __del__(self): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 60409ec729..cb9959ec69 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -1,28 +1,256 @@ -from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Application import Application +from UM.i18n import i18nCatalog +from UM.Message import Message from PyQt5.QtNetwork import QNetworkRequest +from PyQt5.QtCore import QTimer import json +import os # To get the username + +i18n_catalog = i18nCatalog("cura") +## This is the output device for the "Legacy" API of the UM3. All firmware before 4.0.1 uses this API. +# Everything after that firmware uses the ClusterUM3Output. +# The Legacy output device can only have one printer (whereas the cluster can have 0 to n). +# +# Authentication is done in a number of steps; +# 1. Request an id / key pair by sending the application & user name. (state = authRequested) +# 2. Machine sends this back and will display an approve / deny message on screen. (state = AuthReceived) +# 3. OutputDevice will poll if the button was pressed. +# 4. At this point the machine either has the state Authenticated or AuthenticationDenied. +# 5. As a final step, we verify the authentication, as this forces the QT manager to setup the authenticator. class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, address = address, properties = properties, parent = parent) self._api_prefix = "/api/v1/" self._number_of_extruders = 2 + self._authentication_id = None + self._authentication_key = None + + self._authentication_counter = 0 + self._max_authentication_counter = 5 * 60 # Number of attempts before authentication timed out (5 min) + + self._authentication_timer = QTimer() + self._authentication_timer.setInterval(1000) # TODO; Add preference for update interval + self._authentication_timer.setSingleShot(False) + + self._authentication_timer.timeout.connect(self._onAuthenticationTimer) + + # The messages are created when connect is called the first time. + # This ensures that the messages are only created for devices that actually want to connect. + self._authentication_requested_message = None + self._authentication_failed_message = None + self._not_authenticated_message = None + + def _setupMessages(self): + self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", + "Access to the printer requested. Please approve the request on the printer"), + lifetime=0, dismissable=False, progress=0, + title=i18n_catalog.i18nc("@info:title", + "Authentication status")) + + self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), + title=i18n_catalog.i18nc("@info:title", "Authentication Status")) + self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, + i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) + self._authentication_failed_message.actionTriggered.connect(self._requestAuthentication) + self._authentication_succeeded_message = Message( + i18n_catalog.i18nc("@info:status", "Access to the printer accepted"), + title=i18n_catalog.i18nc("@info:title", "Authentication Status")) + + self._not_authenticated_message = Message( + i18n_catalog.i18nc("@info:status", "No access to print with this printer. Unable to send print job."), + title=i18n_catalog.i18nc("@info:title", "Authentication Status")) + self._not_authenticated_message.addAction("Request", i18n_catalog.i18nc("@action:button", "Request Access"), + None, i18n_catalog.i18nc("@info:tooltip", + "Send access request to the printer")) + self._not_authenticated_message.actionTriggered.connect(self._requestAuthentication) + + def connect(self): + super().connect() + self._setupMessages() + global_container = Application.getInstance().getGlobalContainerStack() + if global_container: + self._authentication_id = global_container.getMetaDataEntry("network_authentication_id", None) + self._authentication_key = global_container.getMetaDataEntry("network_authentication_key", None) + + def close(self): + super().close() + if self._authentication_requested_message: + self._authentication_requested_message.hide() + if self._authentication_failed_message: + self._authentication_failed_message.hide() + if self._authentication_succeeded_message: + self._authentication_succeeded_message.hide() + + self._authentication_timer.stop() + + ## Send all material profiles to the printer. + def sendMaterialProfiles(self): + # TODO + pass + def _update(self): if not super()._update(): return + if self._authentication_state == AuthState.NotAuthenticated: + if self._authentication_id is None and self._authentication_key is None: + # This machine doesn't have any authentication, so request it. + self._requestAuthentication() + elif self._authentication_id is not None and self._authentication_key is not None: + # We have authentication info, but we haven't checked it out yet. Do so now. + self._verifyAuthentication() + elif self._authentication_state == AuthState.AuthenticationReceived: + # We have an authentication, but it's not confirmed yet. + self._checkAuthentication() + + # We don't need authentication for requesting info, so we can go right ahead with requesting this. self._get("printer", onFinished=self._onGetPrinterDataFinished) self._get("print_job", onFinished=self._onGetPrintJobFinished) + def _resetAuthenticationRequestedMessage(self): + if self._authentication_requested_message: + self._authentication_requested_message.hide() + self._authentication_timer.stop() + self._authentication_counter = 0 + + def _onAuthenticationTimer(self): + self._authentication_counter += 1 + self._authentication_requested_message.setProgress( + self._authentication_counter / self._max_authentication_counter * 100) + if self._authentication_counter > self._max_authentication_counter: + self._authentication_timer.stop() + Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._key) + self.setAuthenticationState(AuthState.AuthenticationDenied) + self._resetAuthenticationRequestedMessage() + self._authentication_failed_message.show() + + def _verifyAuthentication(self): + Logger.log("d", "Attempting to verify authentication") + # This will ensure that the "_onAuthenticationRequired" is triggered, which will setup the authenticator. + self._get("auth/verify", onFinished=self._onVerifyAuthenticationCompleted) + + def _onVerifyAuthenticationCompleted(self, reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + if status_code == 401: + # Something went wrong; We somehow tried to verify authentication without having one. + Logger.log("d", "Attempted to verify auth without having one.") + self._authentication_id = None + self._authentication_key = None + self.setAuthenticationState(AuthState.NotAuthenticated) + elif status_code == 403: + Logger.log("d", + "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s", + self._authentication_state) + self.setAuthenticationState(AuthState.AuthenticationDenied) + self._authentication_failed_message.show() + elif status_code == 200: + self.setAuthenticationState(AuthState.Authenticated) + # Now we know for sure that we are authenticated, send the material profiles to the machine. + self.sendMaterialProfiles() + + def _checkAuthentication(self): + Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) + self._get("auth/check/" + str(self._authentication_id), onFinished=self._onCheckAuthenticationFinished) + + def _onCheckAuthenticationFinished(self, reply): + if str(self._authentication_id) not in reply.url().toString(): + Logger.log("w", "Got an old id response.") + # Got response for old authentication ID. + return + try: + data = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid authentication check from printer: Not valid JSON.") + return + + if data.get("message", "") == "authorized": + Logger.log("i", "Authentication was approved") + self.setAuthenticationState(AuthState.Authenticated) + self._saveAuthentication() + + # Double check that everything went well. + self._verifyAuthentication() + + # Notify the user. + self._resetAuthenticationRequestedMessage() + self._authentication_succeeded_message.show() + elif data.get("message", "") == "unauthorized": + Logger.log("i", "Authentication was denied.") + self.setAuthenticationState(AuthState.AuthenticationDenied) + self._authentication_failed_message.show() + + def _saveAuthentication(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + if global_container_stack: + if "network_authentication_key" in global_container_stack.getMetaData(): + global_container_stack.setMetaDataEntry("network_authentication_key", self._authentication_key) + else: + global_container_stack.addMetaDataEntry("network_authentication_key", self._authentication_key) + + if "network_authentication_id" in global_container_stack.getMetaData(): + global_container_stack.setMetaDataEntry("network_authentication_id", self._authentication_id) + else: + global_container_stack.addMetaDataEntry("network_authentication_id", self._authentication_id) + + # Force save so we are sure the data is not lost. + Application.getInstance().saveStack(global_container_stack) + Logger.log("i", "Authentication succeeded for id %s and key %s", self._authentication_id, + self._getSafeAuthKey()) + else: + Logger.log("e", "Unable to save authentication for id %s and key %s", self._authentication_id, + self._getSafeAuthKey()) + + def _onRequestAuthenticationFinished(self, reply): + try: + data = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.log("w", "Received an invalid authentication request reply from printer: Not valid JSON.") + self.setAuthenticationState(AuthState.NotAuthenticated) + return + + self.setAuthenticationState(AuthState.AuthenticationReceived) + self._authentication_id = data["id"] + self._authentication_key = data["key"] + Logger.log("i", "Got a new authentication ID (%s) and KEY (%s). Waiting for authorization.", + self._authentication_id, self._getSafeAuthKey()) + + def _requestAuthentication(self): + self._authentication_requested_message.show() + self._authentication_timer.start() + + # Reset any previous authentication info. If this isn't done, the "Retry" action on the failed message might + # give issues. + self._authentication_key = None + self._authentication_id = None + + self._post("auth/request", + json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), + "user": self._getUserName()}).encode(), + onFinished=self._onRequestAuthenticationFinished) + + self.setAuthenticationState(AuthState.AuthenticationRequested) + + def _onAuthenticationRequired(self, reply, authenticator): + if self._authentication_id is not None and self._authentication_key is not None: + Logger.log("d", + "Authentication was required for printer: %s. Setting up authenticator with ID %s and key %s", + self._id, self._authentication_id, self._getSafeAuthKey()) + authenticator.setUser(self._authentication_id) + authenticator.setPassword(self._authentication_key) + else: + Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._key) + def _onGetPrintJobFinished(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -104,3 +332,22 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): else: Logger.log("w", "Got status code {status_code} while trying to get printer data".format(status_code = status_code)) + + ## Convenience function to "blur" out all but the last 5 characters of the auth key. + # This can be used to debug print the key, without it compromising the security. + def _getSafeAuthKey(self): + if self._authentication_key is not None: + result = self._authentication_key[-5:] + result = "********" + result + return result + + return self._authentication_key + + ## Convenience function to get the username from the OS. + # The code was copied from the getpass module, as we try to use as little dependencies as possible. + def _getUserName(self): + for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): + user = os.environ.get(name) + if user: + return user + return "Unknown User" # Couldn't find out username. \ No newline at end of file From 96d5c7152b2a3a742b42d2062dd97710e182da90 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 10:31:39 +0100 Subject: [PATCH 032/205] Added sending material profiles to LegacyUM3 CL-541 --- .../NetworkedPrinterOutputDevice.py | 57 ++++++++++++++++--- .../LegacyUM3OutputDevice.py | 25 ++++++++ 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index b9bd27c129..395771b833 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -7,7 +7,7 @@ from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetwork from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from time import time -from typing import Callable, Any +from typing import Callable, Any, Optional from enum import IntEnum @@ -39,6 +39,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._onFinishedCallbacks = {} self._authentication_state = AuthState.NotAuthenticated + self._cached_multiparts = {} + def setAuthenticationState(self, authentication_state): if self._authentication_state != authentication_state: self._authentication_state = authentication_state @@ -79,29 +81,35 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _put(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None]): + def _clearCachedMultiPart(self, reply): + if id(reply) in self._cached_multiparts: + del self._cached_multiparts[id(reply)] + + def _put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.put(request, data.encode()) - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + def _get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.get(request) - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Callable[[Any, QNetworkReply], None]): + def _delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() self._last_request_time = time() pass - def _post(self, target: str, data: str, onFinished: Callable[[Any, QNetworkReply], None], onProgress: Callable = None): + def _post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -109,7 +117,31 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, data) if onProgress is not None: reply.uploadProgress.connect(onProgress) - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + + def _postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + if self._manager is None: + self._createNetworkManager() + request = self._createEmptyRequest(target) + + multi_post_part = QHttpMultiPart() + post_part = QHttpPart() + post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) + post_part.setBody(body_data) + multi_post_part.append(post_part) + + self._last_request_time = time() + + reply = self._manager.post(request, multi_post_part) + + # Due to garbage collection on python doing some weird stuff, we need to keep hold of a reference + self._cached_multiparts[id(reply)] = (post_part, multi_post_part, reply) + + if onProgress is not None: + reply.uploadProgress.connect(onProgress) + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished def _onAuthenticationRequired(self, reply, authenticator): Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) @@ -128,6 +160,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply): + # Due to garbage collection, we need to cache certain bits of post operations. + # As we don't want to keep them around forever, delete them if we get a reply. + if reply.operation() == QNetworkAccessManager.PostOperation: + self._clearCachedMultiPart(reply) + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None: # No status code means it never even reached remote. return @@ -137,8 +174,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if self._connection_state == ConnectionState.connecting: self.setConnectionState(ConnectionState.connected) + callback_key = reply.url().toString() + str(reply.operation()) try: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())](reply) + if callback_key in self._onFinishedCallbacks: + self._onFinishedCallbacks[callback_key](reply) except Exception: Logger.logException("w", "something went wrong with callback") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index cb9959ec69..1cd5a19fe4 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -3,6 +3,8 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from cura.Settings.ContainerManager import ContainerManager + from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Application import Application @@ -97,6 +99,29 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): ## Send all material profiles to the printer. def sendMaterialProfiles(self): + Logger.log("i", "Sending material profiles to printer") + + # TODO: Might want to move this to a job... + for container in ContainerRegistry.getInstance().findInstanceContainers(type="material"): + try: + xml_data = container.serialize() + if xml_data == "" or xml_data is None: + continue + + names = ContainerManager.getInstance().getLinkedMaterials(container.getId()) + if names: + # There are other materials that share this GUID. + if not container.isReadOnly(): + continue # If it's not readonly, it's created by user, so skip it. + + file_name = "none.xml" + self._postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) + + except NotImplementedError: + # If the material container is not the most "generic" one it can't be serialized an will raise a + # NotImplementedError. We can simply ignore these. + pass + # TODO pass From 8b8d67b3a83bac74e366a8afaacc9ddfc0a1e41a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 13:37:59 +0100 Subject: [PATCH 033/205] LegacyUM3 now handles warnings & errors again CL-541 --- cura/PrinterOutput/MaterialOutputModel.py | 9 +- .../NetworkedPrinterOutputDevice.py | 4 + cura/PrinterOutput/PrinterOutputModel.py | 1 + cura/PrinterOutputDevice.py | 17 +- .../LegacyUM3OutputDevice.py | 146 +++++++++++++++++- 5 files changed, 166 insertions(+), 11 deletions(-) diff --git a/cura/PrinterOutput/MaterialOutputModel.py b/cura/PrinterOutput/MaterialOutputModel.py index 0471b85db8..64ebd3c94c 100644 --- a/cura/PrinterOutput/MaterialOutputModel.py +++ b/cura/PrinterOutput/MaterialOutputModel.py @@ -5,12 +5,13 @@ from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant, pyqtSlot class MaterialOutputModel(QObject): - def __init__(self, guid, type, color, brand, parent = None): + def __init__(self, guid, type, color, brand, name, parent = None): super().__init__(parent) self._guid = guid self._type = type self._color = color self._brand = brand + self._name = name @pyqtProperty(str, constant = True) def guid(self): @@ -26,4 +27,8 @@ class MaterialOutputModel(QObject): @pyqtProperty(str, constant=True) def color(self): - return self._color \ No newline at end of file + return self._color + + @pyqtProperty(str, constant=True) + def name(self): + return self._name \ No newline at end of file diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 395771b833..97960db1f3 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -21,6 +21,7 @@ class AuthState(IntEnum): class NetworkedPrinterOutputDevice(PrinterOutputDevice): authenticationStateChanged = pyqtSignal() + def __init__(self, device_id, address: str, properties, parent = None): super().__init__(device_id = device_id, parent = parent) self._manager = None @@ -41,6 +42,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._cached_multiparts = {} + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + raise NotImplementedError("requestWrite needs to be implemented") + def setAuthenticationState(self, authentication_state): if self._authentication_state != authentication_state: self._authentication_state = authentication_state diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 97f5c69723..23423609f7 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -11,6 +11,7 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel class PrinterOutputModel(QObject): diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index a170037311..9744f352fd 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -5,13 +5,19 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl from PyQt5.QtQml import QQmlComponent, QQmlContext -from enum import IntEnum # For the connection state tracking. + from UM.Logger import Logger from UM.Signal import signalemitter from UM.Application import Application import os +from enum import IntEnum # For the connection state tracking. +from typing import List, Optional + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel i18n_catalog = i18nCatalog("cura") @@ -32,7 +38,7 @@ class PrinterOutputDevice(QObject, OutputDevice): def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) - self._printers = [] + self._printers = [] # type: List[PrinterOutputModel] self._monitor_view_qml_path = "" self._monitor_component = None @@ -62,20 +68,19 @@ class PrinterOutputDevice(QObject, OutputDevice): def _update(self): pass - def _getPrinterByKey(self, key): + def _getPrinterByKey(self, key) -> Optional["PrinterOutputModel"]: for printer in self._printers: if printer.key == key: return printer return None - def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None): + def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): raise NotImplementedError("requestWrite needs to be implemented") @pyqtProperty(QObject, notify = printersChanged) - def activePrinter(self): + def activePrinter(self) -> Optional["PrinterOutputModel"]: if len(self._printers): - return self._printers[0] return None diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 1cd5a19fe4..37d02013b9 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -4,6 +4,7 @@ from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from cura.Settings.ContainerManager import ContainerManager +from cura.Settings.ExtruderManager import ExtruderManager from UM.Logger import Logger from UM.Settings.ContainerRegistry import ContainerRegistry @@ -13,6 +14,7 @@ from UM.Message import Message from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtCore import QTimer +from PyQt5.QtWidgets import QMessageBox import json import os # To get the username @@ -122,8 +124,144 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # NotImplementedError. We can simply ignore these. pass - # TODO - pass + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + if not self.activePrinter: + # No active printer. Unable to write + return + + if self.activePrinter.printerState not in ["idle", ""]: + # Printer is not able to accept commands. + return + + if self._authentication_state != AuthState.Authenticated: + # Not authenticated, so unable to send job. + return + + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().showPrintMonitor.emit(True) + self.writeStarted.emit(self) + + gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", None) + if gcode is None: + # Unable to find g-code. Nothing to send + return + + errors = self._checkForErrors() + if errors: + text = i18n_catalog.i18nc("@label", "Unable to start a new print job.") + informative_text = i18n_catalog.i18nc("@label", + "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. " + "Please resolve this issues before continuing.") + detailed_text = "" + for error in errors: + detailed_text += error + "\n" + + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"), + text, + informative_text, + detailed_text, + buttons=QMessageBox.Ok, + icon=QMessageBox.Critical, + callback = self._messageBoxCallback + ) + return # Don't continue; Errors must block sending the job to the printer. + + # There might be multiple things wrong with the configuration. Check these before starting. + warnings = self._checkForWarnings() + + if warnings: + text = i18n_catalog.i18nc("@label", "Are you sure you wish to print with the selected configuration?") + informative_text = i18n_catalog.i18nc("@label", + "There is a mismatch between the configuration or calibration of the printer and Cura. " + "For the best result, always slice for the PrintCores and materials that are inserted in your printer.") + detailed_text = "" + for warning in warnings: + detailed_text += warning + "\n" + + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"), + text, + informative_text, + detailed_text, + buttons=QMessageBox.Yes + QMessageBox.No, + icon=QMessageBox.Question, + callback=self._messageBoxCallback + ) + return + + # No warnings or errors, so we're good to go. + self._startPrint() + + def _startPrint(self): + # TODO: Implement + Logger.log("i", "Sending print job to printer.") + return + + def _messageBoxCallback(self, button): + def delayedCallback(): + if button == QMessageBox.Yes: + self._startPrint() + else: + Application.getInstance().showPrintMonitor.emit(False) + # For some unknown reason Cura on OSX will hang if we do the call back code + # immediately without first returning and leaving QML's event system. + + QTimer.singleShot(100, delayedCallback) + + def _checkForErrors(self): + errors = [] + print_information = Application.getInstance().getPrintInformation() + if not print_information.materialLengths: + Logger.log("w", "There is no material length information. Unable to check for errors.") + return errors + + for index, extruder in enumerate(self.activePrinter.extruders): + # Due to airflow issues, both slots must be loaded, regardless if they are actually used or not. + if extruder.hotendID == "": + # No Printcore loaded. + errors.append(i18n_catalog.i18nc("@info:status", "No Printcore loaded in slot {slot_number}".format(slot_number=index + 1))) + + if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: + # The extruder is by this print. + if extruder.activeMaterial is None: + # No active material + errors.append(i18n_catalog.i18nc("@info:status", "No material loaded in slot {slot_number}".format(slot_number=index + 1))) + return errors + + def _checkForWarnings(self): + warnings = [] + print_information = Application.getInstance().getPrintInformation() + + if not print_information.materialLengths: + Logger.log("w", "There is no material length information. Unable to check for warnings.") + return warnings + + extruder_manager = ExtruderManager.getInstance() + + for index, extruder in enumerate(self.activePrinter.extruders): + if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: + # The extruder is by this print. + + # TODO: material length check + + # Check if the right Printcore is active. + variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"}) + if variant: + if variant.getName() != extruder.hotendID: + warnings.append(i18n_catalog.i18nc("@label", "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}".format(cura_printcore_name = variant.getName(), remote_printcore_name = extruder.hotendID, extruder_id = index + 1))) + else: + Logger.log("w", "Unable to find variant.") + + # Check if the right material is loaded. + local_material = extruder_manager.getExtruderStack(index).findContainer({"type": "material"}) + if local_material: + if extruder.activeMaterial.guid != local_material.getMetaDataEntry("GUID"): + Logger.log("w", "Extruder %s has a different material (%s) as Cura (%s)", index + 1, extruder.activeMaterial.guid, local_material.getMetaDataEntry("GUID")) + warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(local_material.getName(), extruder.activeMaterial.name, index + 1)) + else: + Logger.log("w", "Unable to find material.") + + return warnings + def _update(self): if not super()._update(): @@ -339,13 +477,15 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): color = containers[0].getMetaDataEntry("color_code") brand = containers[0].getMetaDataEntry("brand") material_type = containers[0].getMetaDataEntry("material") + name = containers[0].getName() else: # Unknown material. color = "#00000000" brand = "Unknown" material_type = "Unknown" + name = "Unknown" material = MaterialOutputModel(guid=material_guid, type=material_type, - brand=brand, color=color) + brand=brand, color=color, name = name) extruder.updateActiveMaterial(material) try: From f03a9787817674faea1f0601acfedcbed2abcf00 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 14:19:54 +0100 Subject: [PATCH 034/205] Sending & compressing g-codes re-added to LegacyUM3 CL-541 --- .../LegacyUM3OutputDevice.py | 107 +++++++++++++++++- 1 file changed, 102 insertions(+), 5 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 37d02013b9..e9963c678b 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -13,11 +13,15 @@ from UM.i18n import i18nCatalog from UM.Message import Message from PyQt5.QtNetwork import QNetworkRequest -from PyQt5.QtCore import QTimer +from PyQt5.QtCore import QTimer, QCoreApplication from PyQt5.QtWidgets import QMessageBox +from time import time + import json import os # To get the username +import gzip + i18n_catalog = i18nCatalog("cura") @@ -56,6 +60,10 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_failed_message = None self._not_authenticated_message = None + self._sending_gcode = False + self._compressing_gcode = False + self._gcode = [] + def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer requested. Please approve the request on the printer"), @@ -96,7 +104,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_failed_message.hide() if self._authentication_succeeded_message: self._authentication_succeeded_message.hide() - + self._sending_gcode = False + self._compressing_gcode = False self._authentication_timer.stop() ## Send all material profiles to the printer. @@ -141,8 +150,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Application.getInstance().showPrintMonitor.emit(True) self.writeStarted.emit(self) - gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", None) - if gcode is None: + self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) + if not self._gcode: # Unable to find g-code. Nothing to send return @@ -192,10 +201,98 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._startPrint() def _startPrint(self): - # TODO: Implement Logger.log("i", "Sending print job to printer.") + if self._sending_gcode: + self._error_message = Message( + i18n_catalog.i18nc("@info:status", + "Sending new jobs (temporarily) blocked, still sending the previous print job.")) + self._error_message.show() + return + + self._sending_gcode = True + + self._send_gcode_start = time() + self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1, + i18n_catalog.i18nc("@info:title", "Sending Data")) + self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") + self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) + + self._progress_message.show() + compressed_gcode = self._compressGCode() + if compressed_gcode is None: + # Abort was called. + return + + file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName + self._postForm("print_job", "form-data; name=\"file\";filename=\"%s\"" % file_name, compressed_gcode, + onFinished=self._onPostPrintJobFinished) + return + def _progressMessageActionTriggered(self, message_id=None, action_id=None): + if action_id == "Abort": + Logger.log("d", "User aborted sending print to remote.") + self._progress_message.hide() + self._compressing_gcode = False + self._sending_gcode = False + Application.getInstance().showPrintMonitor.emit(False) + + def _onPostPrintJobFinished(self, reply): + self._progress_message.hide() + self._sending_gcode = False + + def __compressDataAndNotifyQt(self, data_to_append): + compressed_data = gzip.compress(data_to_append.encode("utf-8")) + self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. + + # Pretend that this is a response, as zipping might take a bit of time. + # If we don't do this, the device might trigger a timeout. + self._last_response_time = time() + return compressed_data + + def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): + if bytes_total > 0: + new_progress = bytes_sent / bytes_total * 100 + # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get + # timeout responses if this happens. + self._last_response_time = time() + if new_progress > self._progress_message.getProgress(): + self._progress_message.show() # Ensure that the message is visible. + self._progress_message.setProgress(bytes_sent / bytes_total * 100) + else: + self._progress_message.setProgress(0) + + self._progress_message.hide() + + def _compressGCode(self): + self._compressing_gcode = True + + ## Mash the data into single string + max_chars_per_line = 1024 * 1024 / 4 # 1/4 MB per line. + byte_array_file_data = b"" + batched_line = "" + + for line in self._gcode: + if not self._compressing_gcode: + self._progress_message.hide() + # Stop trying to zip / send as abort was called. + return + batched_line += line + # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. + # Compressing line by line in this case is extremely slow, so we need to batch them. + if len(batched_line) < max_chars_per_line: + continue + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + batched_line = "" + + # Don't miss the last batch (If any) + if batched_line: + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + + self._compressing_gcode = False + return byte_array_file_data + def _messageBoxCallback(self, button): def delayedCallback(): if button == QMessageBox.Yes: From d0c7352be6b9b42a1ce14c415aab9c1b3d87bae3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 16:16:57 +0100 Subject: [PATCH 035/205] Added missing authentication_succeeded_message attribute to constructor CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index e9963c678b..7c76811fd2 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -58,6 +58,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # This ensures that the messages are only created for devices that actually want to connect. self._authentication_requested_message = None self._authentication_failed_message = None + self._authentication_succeeded_message = None self._not_authenticated_message = None self._sending_gcode = False From 0b91112d72fb63e3c0f3de92392a7e3d77b1e12f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 16:43:52 +0100 Subject: [PATCH 036/205] Fixed postForm Setting the type of the request to json messed up the multi-part stuff. CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 97960db1f3..dcd6b5ca70 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -78,6 +78,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return True + def _createEmptyFormRequest(self, target): + url = QUrl("http://" + self._address + self._api_prefix + target) + request = QNetworkRequest(url) + request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) + return request + def _createEmptyRequest(self, target): url = QUrl("http://" + self._address + self._api_prefix + target) request = QNetworkRequest(url) @@ -127,9 +133,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def _postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() - request = self._createEmptyRequest(target) + request = self._createEmptyFormRequest(target) - multi_post_part = QHttpMultiPart() + multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType) post_part = QHttpPart() post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) post_part.setBody(body_data) From 1c2c4d4163e4546a7a57c983fa2f64ce0f0e8ea2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 17:07:24 +0100 Subject: [PATCH 037/205] Added property to indicate if output device accepts commands Instead of how this was previously done, it's now tied to the auth state. CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 3 +++ cura/PrinterOutputDevice.py | 13 +++++++++++++ plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 9 +++++++++ 3 files changed, 25 insertions(+) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index dcd6b5ca70..f8d2ec66e2 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -1,3 +1,6 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Application import Application from UM.Logger import Logger diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 9744f352fd..5b747d19bf 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -34,6 +34,7 @@ i18n_catalog = i18nCatalog("cura") class PrinterOutputDevice(QObject, OutputDevice): printersChanged = pyqtSignal() connectionStateChanged = pyqtSignal(str) + acceptsCommandsChanged = pyqtSignal() def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -49,6 +50,7 @@ class PrinterOutputDevice(QObject, OutputDevice): self._control_item = None self._qml_context = None + self._accepts_commands = False self._update_timer = QTimer() self._update_timer.setInterval(2000) # TODO; Add preference for update interval @@ -152,6 +154,17 @@ class PrinterOutputDevice(QObject, OutputDevice): def __del__(self): self.close() + @pyqtProperty(bool, notify=acceptsCommandsChanged) + def acceptsCommands(self): + return self._accepts_commands + + ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands + def setAcceptsCommands(self, accepts_commands): + if self._accepts_commands != accepts_commands: + self._accepts_commands = accepts_commands + + self.acceptsCommandsChanged.emit() + ## The current processing state of the backend. class ConnectionState(IntEnum): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 7c76811fd2..67db519c9e 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -65,6 +65,15 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._compressing_gcode = False self._gcode = [] + self.authenticationStateChanged.connect(self._onAuthenticationStateChanged) + + def _onAuthenticationStateChanged(self): + # We only accept commands if we are authenticated. + if self._authentication_state == AuthState.Authenticated: + self.setAcceptsCommands(True) + else: + self.setAcceptsCommands(False) + def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer requested. Please approve the request on the printer"), From 4597bb09ed2bc88eec12dfb037fe98078b35780c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 23 Nov 2017 17:08:22 +0100 Subject: [PATCH 038/205] Added (short) description & priority to legacy output device. CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 67db519c9e..b7736d675b 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -67,6 +67,13 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.authenticationStateChanged.connect(self._onAuthenticationStateChanged) + self.setPriority(3) # Make sure the output device gets selected above local file output + self.setName(self._id) + self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) + self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + + self.setIconName("print") + def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. if self._authentication_state == AuthState.Authenticated: From c523a6ddf6f8c88071eae51b2c4d30e46e01433e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 09:22:50 +0100 Subject: [PATCH 039/205] Progress is now shown for LegacyPrinter while printing CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 1 - .../LegacyUM3OutputDevice.py | 1 + .../UM3NetworkPrinting/UM3InfoComponents.qml | 8 +- .../UM3OutputDevicePlugin.py | 1 - resources/qml/MonitorButton.qml | 74 +++++++++++++++---- 5 files changed, 64 insertions(+), 21 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 23423609f7..97f5c69723 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -11,7 +11,6 @@ MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.PrinterOutputController import PrinterOutputController - from cura.PrinterOutput.ExtruderOuputModel import ExtruderOutputModel class PrinterOutputModel(QObject): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index b7736d675b..67b2032e6a 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -568,6 +568,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): if not self._printers: self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders)] + self.printersChanged.emit() # LegacyUM3 always has a single printer. printer = self._printers[0] diff --git a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml index d0c95e1524..939c6bcb39 100644 --- a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml +++ b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml @@ -13,7 +13,7 @@ Item property bool isUM3: Cura.MachineManager.activeQualityDefinitionId == "ultimaker3" property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property bool authenticationRequested: printerConnected && Cura.MachineManager.printerOutputDevices[0].authenticationState == 2 // AuthState.AuthenticationRequested + property bool authenticationRequested: printerConnected && (Cura.MachineManager.printerOutputDevices[0].authenticationState == 2 || Cura.MachineManager.printerOutputDevices[0].authenticationState == 5) // AuthState.AuthenticationRequested or AuthenticationReceived. Row { @@ -119,7 +119,9 @@ Item onClicked: manager.loadConfigurationFromPrinter() function isClusterPrinter() { - if(Cura.MachineManager.printerOutputDevices.length == 0) + return false + //TODO: Hardcoded this for the moment now. These info components might also need to move. + /*if(Cura.MachineManager.printerOutputDevices.length == 0) { return false; } @@ -129,7 +131,7 @@ Item { return false; } - return true; + return true;*/ } } } diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 09bff8e7b8..aecbc1717c 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -84,7 +84,6 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): def _onDeviceConnectionStateChanged(self, key): if key not in self._discovered_devices: return - print("STATE CHANGED", key) if self._discovered_devices[key].isConnected(): self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key]) else: diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 29b00f50e6..07a9e1913b 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -17,16 +17,39 @@ Item property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - property real progress: printerConnected ? Cura.MachineManager.printerOutputDevices[0].progress : 0 + property var activePrinter: printerConnected ? Cura.MachineManager.printerOutputDevices[0].activePrinter : null + property var activePrintJob: activePrinter ? activePrinter.activePrintJob: null + property real progress: + { + if(!printerConnected) + { + return 0 + } + if(activePrinter == null) + { + return 0 + } + if(activePrintJob == null) + { + return 0 + } + if(activePrintJob.timeTotal == 0) + { + return 0 // Prevent devision by 0 + } + return activePrintJob.timeElapsed / activePrintJob.timeTotal * 100 + } + property int backendState: UM.Backend.state property bool showProgress: { // determine if we need to show the progress bar + percentage - if(!printerConnected || !printerAcceptsCommands) { + if(activePrintJob == null) + { return false; } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + switch(base.activePrintJob.state) { case "printing": case "paused": @@ -50,7 +73,7 @@ Item if(!printerConnected || !printerAcceptsCommands) return UM.Theme.getColor("text"); - switch(Cura.MachineManager.printerOutputDevices[0].printerState) + switch(activePrinter.printerState) { case "maintenance": return UM.Theme.getColor("status_busy"); @@ -58,7 +81,7 @@ Item return UM.Theme.getColor("status_stopped"); } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + switch(base.activePrintJob.state) { case "printing": case "pre_print": @@ -85,17 +108,27 @@ Item property string statusText: { if(!printerConnected) + { return catalog.i18nc("@label:MonitorStatus", "Not connected to a printer"); + } if(!printerAcceptsCommands) + { return catalog.i18nc("@label:MonitorStatus", "Printer does not accept commands"); + } var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] - if(printerOutputDevice.printerState == "maintenance") + if(activePrinter.printerState == "maintenance") { return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); } - switch(printerOutputDevice.jobState) + + if(base.activePrintJob == null) + { + return " " + } + + switch(base.activePrintJob.state) { case "offline": return catalog.i18nc("@label:MonitorStatus", "Lost connection with the printer"); @@ -163,7 +196,11 @@ Item { return false; } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + if(base.activePrintJob == null) + { + return false + } + switch(base.activePrintJob.state) { case "pausing": case "resuming": @@ -185,7 +222,8 @@ Item anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width; } - Row { + Row + { id: buttonsRow height: abortButton.height anchors.top: progressBar.bottom @@ -194,17 +232,21 @@ Item anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width spacing: UM.Theme.getSize("default_margin").width - Row { + Row + { id: additionalComponentsRow spacing: UM.Theme.getSize("default_margin").width } - Connections { + Connections + { target: Printer onAdditionalComponentsChanged: { - if(areaId == "monitorButtons") { - for (var component in CuraApplication.additionalComponents["monitorButtons"]) { + if(areaId == "monitorButtons") + { + for (var component in CuraApplication.additionalComponents["monitorButtons"]) + { CuraApplication.additionalComponents["monitorButtons"][component].parent = additionalComponentsRow } } @@ -220,7 +262,7 @@ Item property bool userClicked: false property string lastJobState: "" - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].canPause + visible: printerConnected && activePrinter.canPause enabled: (!userClicked) && printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && (["paused", "printing"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) @@ -261,8 +303,8 @@ Item { id: abortButton - visible: printerConnected && Cura.MachineManager.printerOutputDevices[0].canAbort - enabled: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && + visible: printerConnected && activePrinter.canAbort + enabled: printerConnected && activePrinter.acceptsCommands && (["paused", "printing", "pre_print"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) height: UM.Theme.getSize("save_button_save_to_button").height From 9d7cd726915e563c169dcd9d68e88e03f35c2a13 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 09:38:10 +0100 Subject: [PATCH 040/205] JobData is now shown in monitor screen again CL-541 --- resources/qml/PrintMonitor.qml | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index f95d829306..172adc21c1 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -16,6 +16,7 @@ Column id: printMonitor property var connectedDevice: Cura.MachineManager.printerOutputDevices.length >= 1 ? Cura.MachineManager.printerOutputDevices[0] : null property var activePrinter: connectedDevice != null ? connectedDevice.activePrinter : null + property var activePrintJob: activePrinter != null ? activePrinter.activePrintJob: null Cura.ExtrudersModel { @@ -438,20 +439,33 @@ Column { sourceComponent: monitorItem property string label: catalog.i18nc("@label", "Job Name") - property string value: connectedPrinter != null ? connectedPrinter.jobName : "" + property string value: activePrintJob != null ? activePrintJob.name : "" } + Loader { sourceComponent: monitorItem property string label: catalog.i18nc("@label", "Printing Time") - property string value: connectedPrinter != null ? getPrettyTime(connectedPrinter.timeTotal) : "" + property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" } + Loader { sourceComponent: monitorItem property string label: catalog.i18nc("@label", "Estimated time left") - property string value: connectedPrinter != null ? getPrettyTime(connectedPrinter.timeTotal - connectedPrinter.timeElapsed) : "" - visible: connectedPrinter != null && (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "paused") + property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal - activePrintJob.timeElapsed) : "" + visible: + { + if(activePrintJob == null) + { + return false + } + + return (activePrintJob.state == "printing" || + activePrintJob.state == "resuming" || + activePrintJob.state == "pausing" || + activePrintJob.state == "paused") + } } Component @@ -485,6 +499,7 @@ Column } } } + Component { id: monitorSection From 57406100ef5355d6093514e931a472a89716dc5f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 10:55:24 +0100 Subject: [PATCH 041/205] Fixed status icon in monitor tab CL-541 --- resources/qml/PrintMonitor.qml | 6 +++--- resources/qml/Topbar.qml | 13 +++++++++++-- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 172adc21c1..5b6f96dfc1 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -100,15 +100,15 @@ Column visible: connectedPrinter != null ? connectedPrinter.canControlManually : false enabled: { - if (connectedPrinter == null) + if (connectedPrinter == null || activePrintJob == null) { - return false; //Can't control the printer if not connected. + return false; //Can't control the printer if not connected or if there is no print job. } if (!connectedPrinter.acceptsCommands) { return false; //Not allowed to do anything. } - if (connectedPrinter.jobState == "printing" || connectedPrinter.jobState == "resuming" || connectedPrinter.jobState == "pausing" || connectedPrinter.jobState == "error" || connectedPrinter.jobState == "offline") + if (activePrintJob.state == "printing" || activePrintJob.state == "resuming" || activePrintJob.state == "pausing" || activePrintJob.state == "error" || activePrintJob.state == "offline") { return false; //Printer is in a state where it can't react to manual control } diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 6085c6fe7e..63d0981830 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -124,13 +124,22 @@ Rectangle { return UM.Theme.getIcon("tab_status_unknown"); } - if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") { return UM.Theme.getIcon("tab_status_busy"); } - switch (Cura.MachineManager.printerOutputDevices[0].jobState) + if(Cura.MachineManager.printerOutputDevices[0].activePrinter == null) + { + return UM.Theme.getIcon("tab_status_connected") + } + + if(Cura.MachineManager.printerOutputDevices[0].activePrinter.activePrintJob == null) + { + return UM.Theme.getIcon("tab_status_connected") + } + + switch (Cura.MachineManager.printerOutputDevices[0].activePrinter.activePrintJob.state) { case "printing": case "pre_print": From 57de0286081477ff77dd00f20a131237d0df4993 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 24 Nov 2017 11:26:30 +0100 Subject: [PATCH 042/205] re-implemented abort & pause for legacy um3 CL-541 --- .../NetworkedPrinterOutputDevice.py | 10 +++---- cura/PrinterOutput/PrintJobOutputModel.py | 3 +- cura/PrinterOutput/PrinterOutputController.py | 7 +++-- cura/PrinterOutput/PrinterOutputModel.py | 6 ++-- .../ClusterUM3OutputDevice.py | 4 +-- .../LegacyUM3OutputDevice.py | 28 +++++++++++-------- .../LegacyUM3PrinterOutputController.py | 13 +++++++++ resources/qml/MonitorButton.qml | 28 ++++++++++--------- 8 files changed, 61 insertions(+), 38 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index f8d2ec66e2..58c82b6c38 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -98,7 +98,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if id(reply) in self._cached_multiparts: del self._cached_multiparts[id(reply)] - def _put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -107,7 +107,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -116,13 +116,13 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): if self._manager is None: self._createNetworkManager() self._last_request_time = time() pass - def _post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -133,7 +133,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def _postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyFormRequest(target) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 7c38782788..00641ab89a 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -1,7 +1,7 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, QVariant +from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputController import PrinterOutputController @@ -80,5 +80,6 @@ class PrintJobOutputModel(QObject): self._state = new_state self.stateChanged.emit() + @pyqtSlot(str) def setState(self, state): self._output_controller.setJobState(self, state) \ No newline at end of file diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 525c8db102..982c41f293 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -1,4 +1,5 @@ - +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. MYPY = False if MYPY: @@ -8,11 +9,13 @@ if MYPY: class PrinterOutputController: - def __init__(self): + def __init__(self, output_device): self.can_pause = True self.can_abort = True self.can_pre_heat_bed = True self.can_control_manually = True + self._output_device = output_device + def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): # TODO: implement diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 97f5c69723..d4b9d9c99a 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -177,19 +177,19 @@ class PrinterOutputModel(QObject): @pyqtProperty(bool, constant=True) def canPause(self): if self._controller: - return self.can_pause + return self._controller.can_pause return False # Does the printer support abort at all @pyqtProperty(bool, constant=True) def canAbort(self): if self._controller: - return self.can_abort + return self._controller.can_abort return False # Does the printer support manual control at all @pyqtProperty(bool, constant=True) def canControlManually(self): if self._controller: - return self.can_control_manually + return self._controller.can_control_manually return False diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8f9a92384f..91acdc28af 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -21,8 +21,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def _update(self): if not super()._update(): return - self._get("printers/", onFinished=self._onGetPrintersDataFinished) - self._get("print_jobs/", onFinished=self._onGetPrintJobsFinished) + self.get("printers/", onFinished=self._onGetPrintersDataFinished) + self.get("print_jobs/", onFinished=self._onGetPrintJobsFinished) def _onGetPrintJobsFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 67b2032e6a..de0a8d6eff 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -16,6 +16,8 @@ from PyQt5.QtNetwork import QNetworkRequest from PyQt5.QtCore import QTimer, QCoreApplication from PyQt5.QtWidgets import QMessageBox +from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController + from time import time import json @@ -74,6 +76,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") + self._output_controller = LegacyUM3PrinterOutputController(self) + def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. if self._authentication_state == AuthState.Authenticated: @@ -143,7 +147,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): continue # If it's not readonly, it's created by user, so skip it. file_name = "none.xml" - self._postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) + self.postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) except NotImplementedError: # If the material container is not the most "generic" one it can't be serialized an will raise a @@ -241,8 +245,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName - self._postForm("print_job", "form-data; name=\"file\";filename=\"%s\"" % file_name, compressed_gcode, - onFinished=self._onPostPrintJobFinished) + self.postForm("print_job", "form-data; name=\"file\";filename=\"%s\"" % file_name, compressed_gcode, + onFinished=self._onPostPrintJobFinished) return @@ -392,8 +396,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._checkAuthentication() # We don't need authentication for requesting info, so we can go right ahead with requesting this. - self._get("printer", onFinished=self._onGetPrinterDataFinished) - self._get("print_job", onFinished=self._onGetPrintJobFinished) + self.get("printer", onFinished=self._onGetPrinterDataFinished) + self.get("print_job", onFinished=self._onGetPrintJobFinished) def _resetAuthenticationRequestedMessage(self): if self._authentication_requested_message: @@ -415,7 +419,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _verifyAuthentication(self): Logger.log("d", "Attempting to verify authentication") # This will ensure that the "_onAuthenticationRequired" is triggered, which will setup the authenticator. - self._get("auth/verify", onFinished=self._onVerifyAuthenticationCompleted) + self.get("auth/verify", onFinished=self._onVerifyAuthenticationCompleted) def _onVerifyAuthenticationCompleted(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -438,7 +442,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _checkAuthentication(self): Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - self._get("auth/check/" + str(self._authentication_id), onFinished=self._onCheckAuthenticationFinished) + self.get("auth/check/" + str(self._authentication_id), onFinished=self._onCheckAuthenticationFinished) def _onCheckAuthenticationFinished(self, reply): if str(self._authentication_id) not in reply.url().toString(): @@ -511,10 +515,10 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_key = None self._authentication_id = None - self._post("auth/request", - json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), + self.post("auth/request", + json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), "user": self._getUserName()}).encode(), - onFinished=self._onRequestAuthenticationFinished) + onFinished=self._onRequestAuthenticationFinished) self.setAuthenticationState(AuthState.AuthenticationRequested) @@ -542,7 +546,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Received an invalid print job state message: Not valid JSON.") return if printer.activePrintJob is None: - print_job = PrintJobOutputModel(output_controller=None) + print_job = PrintJobOutputModel(output_controller=self._output_controller) printer.updateActivePrintJob(print_job) else: print_job = printer.activePrintJob @@ -567,7 +571,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return if not self._printers: - self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders)] + self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders)] self.printersChanged.emit() # LegacyUM3 always has a single printer. diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py new file mode 100644 index 0000000000..e303d237ce --- /dev/null +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -0,0 +1,13 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + + +class LegacyUM3PrinterOutputController(PrinterOutputController): + def __init__(self, output_device): + super().__init__(output_device) + + def setJobState(self, job: "PrintJobOutputModel", state: str): + data = "{\"target\": \"%s\"}" % state + self._output_device.put("print_job/state", data, onFinished=None) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 07a9e1913b..6166f9b62f 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -263,18 +263,17 @@ Item property string lastJobState: "" visible: printerConnected && activePrinter.canPause - enabled: (!userClicked) && printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands && - (["paused", "printing"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) + enabled: (!userClicked) && printerConnected && printerAcceptsCommands && activePrintJob != null && + (["paused", "printing"].indexOf(activePrintJob.state) >= 0) text: { var result = ""; - if (!printerConnected) + if (!printerConnected || activePrintJob == null) { return ""; } - var jobState = Cura.MachineManager.printerOutputDevices[0].jobState; - if (jobState == "paused") + if (activePrintJob.state == "paused") { return catalog.i18nc("@label:", "Resume"); } @@ -285,14 +284,17 @@ Item } onClicked: { - var current_job_state = Cura.MachineManager.printerOutputDevices[0].jobState - if(current_job_state == "paused") + if(activePrintJob == null) { - Cura.MachineManager.printerOutputDevices[0].setJobState("print"); + return // Do nothing! } - else if(current_job_state == "printing") + if(activePrintJob.state == "paused") { - Cura.MachineManager.printerOutputDevices[0].setJobState("pause"); + activePrintJob.setState("print"); + } + else if(activePrintJob.state == "printing") + { + activePrintJob.setState("pause"); } } @@ -304,8 +306,8 @@ Item id: abortButton visible: printerConnected && activePrinter.canAbort - enabled: printerConnected && activePrinter.acceptsCommands && - (["paused", "printing", "pre_print"].indexOf(Cura.MachineManager.printerOutputDevices[0].jobState) >= 0) + enabled: printerConnected && printerAcceptsCommands && activePrintJob != null && + (["paused", "printing", "pre_print"].indexOf(activePrintJob.state) >= 0) height: UM.Theme.getSize("save_button_save_to_button").height @@ -324,7 +326,7 @@ Item text: catalog.i18nc("@label", "Are you sure you want to abort the print?") standardButtons: StandardButton.Yes | StandardButton.No Component.onCompleted: visible = false - onYes: Cura.MachineManager.printerOutputDevices[0].setJobState("abort") + onYes: activePrintJob.setState("abort") } } } From 5036eccd32ffff186b8a11ac2bd4cc773845226c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 10:15:28 +0100 Subject: [PATCH 043/205] Moved multiple components to their own files CL-541 --- resources/qml/PrintMonitor.qml | 506 +----------------- resources/qml/PrinterOutput/HeatedBedBox.qml | 2 +- .../PrinterOutput/ManualPrinterControl.qml | 442 +++++++++++++++ resources/qml/PrinterOutput/MonitorItem.qml | 44 ++ .../qml/PrinterOutput/MonitorSection.qml | 33 ++ 5 files changed, 542 insertions(+), 485 deletions(-) create mode 100644 resources/qml/PrinterOutput/ManualPrinterControl.qml create mode 100644 resources/qml/PrinterOutput/MonitorItem.qml create mode 100644 resources/qml/PrinterOutput/MonitorSection.qml diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 5b6f96dfc1..830093cd2b 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -95,365 +95,38 @@ Column watchedProperties: ["value"] } - Column + ManualPrinterControl { - visible: connectedPrinter != null ? connectedPrinter.canControlManually : false - enabled: - { - if (connectedPrinter == null || activePrintJob == null) - { - return false; //Can't control the printer if not connected or if there is no print job. - } - if (!connectedPrinter.acceptsCommands) - { - return false; //Not allowed to do anything. - } - if (activePrintJob.state == "printing" || activePrintJob.state == "resuming" || activePrintJob.state == "pausing" || activePrintJob.state == "error" || activePrintJob.state == "offline") - { - return false; //Printer is in a state where it can't react to manual control - } - return true; - } - - Loader - { - sourceComponent: monitorSection - property string label: catalog.i18nc("@label", "Printer control") - } - - Row - { - width: base.width - 2 * UM.Theme.getSize("default_margin").width - height: childrenRect.height + UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - spacing: UM.Theme.getSize("default_margin").width - - Label - { - text: catalog.i18nc("@label", "Jog Position") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - - width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - } - - GridLayout - { - columns: 3 - rows: 4 - rowSpacing: UM.Theme.getSize("default_lining").width - columnSpacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "X/Y") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - width: height - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - - Layout.row: 1 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - } - - Button - { - Layout.row: 2 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_top"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) - } - } - - Button - { - Layout.row: 3 - Layout.column: 1 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_left"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) - } - } - - Button - { - Layout.row: 3 - Layout.column: 3 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_right"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) - } - } - - Button - { - Layout.row: 4 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("arrow_bottom"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) - } - } - - Button - { - Layout.row: 3 - Layout.column: 2 - Layout.preferredWidth: width - Layout.preferredHeight: height - iconSource: UM.Theme.getIcon("home"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.homeHead() - } - } - } - - - Column - { - spacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "Z") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - width: UM.Theme.getSize("section").height - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - } - - Button - { - iconSource: UM.Theme.getIcon("arrow_top"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) - } - } - - Button - { - iconSource: UM.Theme.getIcon("home"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.homeBed() - } - } - - Button - { - iconSource: UM.Theme.getIcon("arrow_bottom"); - style: monitorButtonStyle - width: height - height: UM.Theme.getSize("setting_control").height - - onClicked: - { - connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) - } - } - } - } - - Row - { - id: distancesRow - - width: base.width - 2 * UM.Theme.getSize("default_margin").width - height: childrenRect.height + UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - spacing: UM.Theme.getSize("default_margin").width - - property real currentDistance: 10 - - Label - { - text: catalog.i18nc("@label", "Jog Distance") - color: UM.Theme.getColor("setting_control_text") - font: UM.Theme.getFont("default") - - width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width - height: UM.Theme.getSize("setting_control").height - verticalAlignment: Text.AlignVCenter - } - - Row - { - Repeater - { - model: distancesModel - delegate: Button - { - height: UM.Theme.getSize("setting_control").height - width: height + UM.Theme.getSize("default_margin").width - - text: model.label - exclusiveGroup: distanceGroup - checkable: true - checked: distancesRow.currentDistance == model.value - onClicked: distancesRow.currentDistance = model.value - - style: ButtonStyle { - background: Rectangle { - border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width - border.color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_border"); - } - else if (control.checked || control.pressed) - { - return UM.Theme.getColor("action_button_active_border"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_border"); - } - return UM.Theme.getColor("action_button_border"); - } - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled"); - } - else if (control.checked || control.pressed) - { - return UM.Theme.getColor("action_button_active"); - } - else if (control.hovered) - { - return UM.Theme.getColor("action_button_hovered"); - } - return UM.Theme.getColor("action_button"); - } - Behavior on color { ColorAnimation { duration: 50; } } - Label { - anchors.left: parent.left - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 - anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_text"); - } - else if (control.checked || control.pressed) - { - return UM.Theme.getColor("action_button_active_text"); - } - else if (control.hovered) - { - return UM.Theme.getColor("action_button_hovered_text"); - } - return UM.Theme.getColor("action_button_text"); - } - font: UM.Theme.getFont("default") - text: control.text - horizontalAlignment: Text.AlignHCenter - elide: Text.ElideMiddle - } - } - label: Item { } - } - } - } - } - } - - ListModel - { - id: distancesModel - ListElement { label: "0.1"; value: 0.1 } - ListElement { label: "1"; value: 1 } - ListElement { label: "10"; value: 10 } - ListElement { label: "100"; value: 100 } - } - ExclusiveGroup { id: distanceGroup } + printerModel: activePrinter + visible: activePrinter != null ? activePrinter.canControlManually : false } - Loader + MonitorSection { - sourceComponent: monitorSection - property string label: catalog.i18nc("@label", "Active print") - } - Loader - { - sourceComponent: monitorItem - property string label: catalog.i18nc("@label", "Job Name") - property string value: activePrintJob != null ? activePrintJob.name : "" + label: catalog.i18nc("@label", "Active print") + width: base.width } - Loader + + MonitorItem { - sourceComponent: monitorItem - property string label: catalog.i18nc("@label", "Printing Time") - property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" + label: catalog.i18nc("@label", "Job Name") + value: activePrintJob != null ? activePrintJob.name : "" + width: base.width } - Loader + MonitorItem { - sourceComponent: monitorItem - property string label: catalog.i18nc("@label", "Estimated time left") - property string value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal - activePrintJob.timeElapsed) : "" + label: catalog.i18nc("@label", "Printing Time") + value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" + width:base.width + } + + MonitorItem + { + label: catalog.i18nc("@label", "Estimated time left") + value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal - activePrintJob.timeElapsed) : "" visible: { if(activePrintJob == null) @@ -466,141 +139,6 @@ Column activePrintJob.state == "pausing" || activePrintJob.state == "paused") } - } - - Component - { - id: monitorItem - - Row - { - height: UM.Theme.getSize("setting_control").height - width: Math.floor(base.width - 2 * UM.Theme.getSize("default_margin").width) - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - - Label - { - width: Math.floor(parent.width * 0.4) - anchors.verticalCenter: parent.verticalCenter - text: label - color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - font: UM.Theme.getFont("default") - elide: Text.ElideRight - } - Label - { - width: Math.floor(parent.width * 0.6) - anchors.verticalCenter: parent.verticalCenter - text: value - color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") - font: UM.Theme.getFont("default") - elide: Text.ElideRight - } - } - } - - Component - { - id: monitorSection - - Rectangle - { - color: UM.Theme.getColor("setting_category") - width: base.width - height: UM.Theme.getSize("section").height - - Label - { - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - anchors.leftMargin: UM.Theme.getSize("default_margin").width - text: label - font: UM.Theme.getFont("setting_category") - color: UM.Theme.getColor("setting_category_text") - } - } - } - - Component - { - id: monitorButtonStyle - - ButtonStyle - { - background: Rectangle - { - border.width: UM.Theme.getSize("default_lining").width - border.color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_border"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_border"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_border"); - } - return UM.Theme.getColor("action_button_border"); - } - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered"); - } - return UM.Theme.getColor("action_button"); - } - Behavior on color - { - ColorAnimation - { - duration: 50 - } - } - } - - label: Item - { - UM.RecolorImage - { - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - width: Math.floor(control.width / 2) - height: Math.floor(control.height / 2) - sourceSize.width: width - sourceSize.height: width - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("action_button_disabled_text"); - } - else if(control.pressed) - { - return UM.Theme.getColor("action_button_active_text"); - } - else if(control.hovered) - { - return UM.Theme.getColor("action_button_hovered_text"); - } - return UM.Theme.getColor("action_button_text"); - } - source: control.iconSource - } - } - } + width: base.width } } \ No newline at end of file diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index de34fe5943..5f09160708 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -234,7 +234,7 @@ Item return // Nothing to do, printer cant preheat at all! } preheatCountdown.text = "" - if (printerModel != null) + if (printerModel != null && connectedPrinter.preheatBedRemainingTime != null) { preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; } diff --git a/resources/qml/PrinterOutput/ManualPrinterControl.qml b/resources/qml/PrinterOutput/ManualPrinterControl.qml new file mode 100644 index 0000000000..35cefe053f --- /dev/null +++ b/resources/qml/PrinterOutput/ManualPrinterControl.qml @@ -0,0 +1,442 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + + +Item +{ + property var printerModel + property var activePrintJob: printerModel != null ? printerModel.activePrintJob : null + implicitWidth: parent.width + implicitHeight: childrenRect.height + + Component + { + id: monitorButtonStyle + + ButtonStyle + { + background: Rectangle + { + border.width: UM.Theme.getSize("default_lining").width + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + return UM.Theme.getColor("action_button_border"); + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + return UM.Theme.getColor("action_button"); + } + Behavior on color + { + ColorAnimation + { + duration: 50 + } + } + } + + label: Item + { + UM.RecolorImage + { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: Math.floor(control.width / 2) + height: Math.floor(control.height / 2) + sourceSize.width: width + sourceSize.height: width + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if(control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + return UM.Theme.getColor("action_button_text"); + } + source: control.iconSource + } + } + } + } + + Column + { + enabled: + { + if (printerModel == null) + { + return false; //Can't control the printer if not connected + } + + if (!connectedPrinter.acceptsCommands) + { + return false; //Not allowed to do anything. + } + + if(activePrintJob == null) + { + return true + } + + if (activePrintJob.state == "printing" || activePrintJob.state == "resuming" || activePrintJob.state == "pausing" || activePrintJob.state == "error" || activePrintJob.state == "offline") + { + return false; //Printer is in a state where it can't react to manual control + } + return true; + } + + + MonitorSection + { + label: catalog.i18nc("@label", "Printer control") + width: base.width + } + + Row + { + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + Label + { + text: catalog.i18nc("@label", "Jog Position") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + } + + GridLayout + { + columns: 3 + rows: 4 + rowSpacing: UM.Theme.getSize("default_lining").width + columnSpacing: UM.Theme.getSize("default_lining").height + + Label + { + text: catalog.i18nc("@label", "X/Y") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: height + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + + Layout.row: 1 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + } + + Button + { + Layout.row: 2 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 1 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_left"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 3 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_right"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) + } + } + + Button + { + Layout.row: 4 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) + } + } + + Button + { + Layout.row: 3 + Layout.column: 2 + Layout.preferredWidth: width + Layout.preferredHeight: height + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeHead() + } + } + } + + + Column + { + spacing: UM.Theme.getSize("default_lining").height + + Label + { + text: catalog.i18nc("@label", "Z") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + width: UM.Theme.getSize("section").height + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_top"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) + } + } + + Button + { + iconSource: UM.Theme.getIcon("home"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.homeBed() + } + } + + Button + { + iconSource: UM.Theme.getIcon("arrow_bottom"); + style: monitorButtonStyle + width: height + height: UM.Theme.getSize("setting_control").height + + onClicked: + { + connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) + } + } + } + } + + Row + { + id: distancesRow + + width: base.width - 2 * UM.Theme.getSize("default_margin").width + height: childrenRect.height + UM.Theme.getSize("default_margin").width + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + spacing: UM.Theme.getSize("default_margin").width + + property real currentDistance: 10 + + Label + { + text: catalog.i18nc("@label", "Jog Distance") + color: UM.Theme.getColor("setting_control_text") + font: UM.Theme.getFont("default") + + width: Math.floor(parent.width * 0.4) - UM.Theme.getSize("default_margin").width + height: UM.Theme.getSize("setting_control").height + verticalAlignment: Text.AlignVCenter + } + + Row + { + Repeater + { + model: distancesModel + delegate: Button + { + height: UM.Theme.getSize("setting_control").height + width: height + UM.Theme.getSize("default_margin").width + + text: model.label + exclusiveGroup: distanceGroup + checkable: true + checked: distancesRow.currentDistance == model.value + onClicked: distancesRow.currentDistance = model.value + + style: ButtonStyle { + background: Rectangle { + border.width: control.checked ? UM.Theme.getSize("default_lining").width * 2 : UM.Theme.getSize("default_lining").width + border.color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_border"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active_border"); + } + else if(control.hovered) + { + return UM.Theme.getColor("action_button_hovered_border"); + } + return UM.Theme.getColor("action_button_border"); + } + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active"); + } + else if (control.hovered) + { + return UM.Theme.getColor("action_button_hovered"); + } + return UM.Theme.getColor("action_button"); + } + Behavior on color { ColorAnimation { duration: 50; } } + Label { + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.leftMargin: UM.Theme.getSize("default_lining").width * 2 + anchors.rightMargin: UM.Theme.getSize("default_lining").width * 2 + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("action_button_disabled_text"); + } + else if (control.checked || control.pressed) + { + return UM.Theme.getColor("action_button_active_text"); + } + else if (control.hovered) + { + return UM.Theme.getColor("action_button_hovered_text"); + } + return UM.Theme.getColor("action_button_text"); + } + font: UM.Theme.getFont("default") + text: control.text + horizontalAlignment: Text.AlignHCenter + elide: Text.ElideMiddle + } + } + label: Item { } + } + } + } + } + } + + ListModel + { + id: distancesModel + ListElement { label: "0.1"; value: 0.1 } + ListElement { label: "1"; value: 1 } + ListElement { label: "10"; value: 10 } + ListElement { label: "100"; value: 100 } + } + ExclusiveGroup { id: distanceGroup } + } +} \ No newline at end of file diff --git a/resources/qml/PrinterOutput/MonitorItem.qml b/resources/qml/PrinterOutput/MonitorItem.qml new file mode 100644 index 0000000000..cad8d2f7f3 --- /dev/null +++ b/resources/qml/PrinterOutput/MonitorItem.qml @@ -0,0 +1,44 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Item +{ + property string label: "" + property string value: "" + height: childrenRect.height; + + Row + { + height: UM.Theme.getSize("setting_control").height + width: Math.floor(base.width - 2 * UM.Theme.getSize("default_margin").width) + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + + Label + { + width: Math.floor(parent.width * 0.4) + anchors.verticalCenter: parent.verticalCenter + text: label + color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + font: UM.Theme.getFont("default") + elide: Text.ElideRight + } + Label + { + width: Math.floor(parent.width * 0.6) + anchors.verticalCenter: parent.verticalCenter + text: value + color: connectedPrinter != null && connectedPrinter.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") + font: UM.Theme.getFont("default") + elide: Text.ElideRight + } + } +} \ No newline at end of file diff --git a/resources/qml/PrinterOutput/MonitorSection.qml b/resources/qml/PrinterOutput/MonitorSection.qml new file mode 100644 index 0000000000..6ed762362d --- /dev/null +++ b/resources/qml/PrinterOutput/MonitorSection.qml @@ -0,0 +1,33 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 +import QtQuick.Controls.Styles 1.1 +import QtQuick.Layouts 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Item +{ + id: base + property string label + height: childrenRect.height; + Rectangle + { + color: UM.Theme.getColor("setting_category") + width: base.width + height: UM.Theme.getSize("section").height + + Label + { + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + text: label + font: UM.Theme.getFont("setting_category") + color: UM.Theme.getColor("setting_category_text") + } + } +} \ No newline at end of file From 00eeb835ac35e0718f39aaa605adf718908e790e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 10:22:30 +0100 Subject: [PATCH 044/205] ManualPrinterControl uses correct functions again CL-541 --- cura/PrinterOutput/PrinterOutputController.py | 22 +++++++++---------- .../LegacyUM3PrinterOutputController.py | 4 ++++ .../PrinterOutput/ManualPrinterControl.qml | 18 +++++++-------- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputController.py b/cura/PrinterOutput/PrinterOutputController.py index 982c41f293..86ca10e2d3 100644 --- a/cura/PrinterOutput/PrinterOutputController.py +++ b/cura/PrinterOutput/PrinterOutputController.py @@ -1,6 +1,8 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +from UM.Logger import Logger + MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel @@ -16,31 +18,29 @@ class PrinterOutputController: self.can_control_manually = True self._output_device = output_device - def setTargetHotendTemperature(self, printer: "PrinterOutputModel", extruder: "ExtruderOuputModel", temperature: int): - # TODO: implement - pass + Logger.log("w", "Set target hotend temperature not implemented in controller") def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): - pass + Logger.log("w", "Set target bed temperature not implemented in controller") def setJobState(self, job: "PrintJobOutputModel", state: str): - pass + Logger.log("w", "Set job state not implemented in controller") def cancelPreheatBed(self, printer: "PrinterOutputModel"): - pass + Logger.log("w", "Cancel preheat bed not implemented in controller") def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): - pass + Logger.log("w", "Preheat bed not implemented in controller") def setHeadPosition(self, printer: "PrinterOutputModel", x, y, z, speed): - pass + Logger.log("w", "Set head position not implemented in controller") def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): - pass + Logger.log("w", "Move head not implemented in controller") def homeBed(self, printer): - pass + Logger.log("w", "Home bed not implemented in controller") def homeHead(self, printer): - pass \ No newline at end of file + Logger.log("w", "Home head not implemented in controller") \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index e303d237ce..ae8c989643 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -3,6 +3,10 @@ from cura.PrinterOutput.PrinterOutputController import PrinterOutputController +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + class LegacyUM3PrinterOutputController(PrinterOutputController): def __init__(self, output_device): diff --git a/resources/qml/PrinterOutput/ManualPrinterControl.qml b/resources/qml/PrinterOutput/ManualPrinterControl.qml index 35cefe053f..43fa769fb5 100644 --- a/resources/qml/PrinterOutput/ManualPrinterControl.qml +++ b/resources/qml/PrinterOutput/ManualPrinterControl.qml @@ -108,7 +108,7 @@ Item return false; //Can't control the printer if not connected } - if (!connectedPrinter.acceptsCommands) + if (!connectedDevice.acceptsCommands) { return false; //Not allowed to do anything. } @@ -188,7 +188,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, distancesRow.currentDistance, 0) + printerModel.moveHead(0, distancesRow.currentDistance, 0) } } @@ -205,7 +205,7 @@ Item onClicked: { - connectedPrinter.moveHead(-distancesRow.currentDistance, 0, 0) + printerModel.moveHead(-distancesRow.currentDistance, 0, 0) } } @@ -222,7 +222,7 @@ Item onClicked: { - connectedPrinter.moveHead(distancesRow.currentDistance, 0, 0) + printerModel.moveHead(distancesRow.currentDistance, 0, 0) } } @@ -239,7 +239,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, -distancesRow.currentDistance, 0) + printerModel.moveHead(0, -distancesRow.currentDistance, 0) } } @@ -256,7 +256,7 @@ Item onClicked: { - connectedPrinter.homeHead() + printerModel.homeHead() } } } @@ -286,7 +286,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, 0, distancesRow.currentDistance) + printerModel.moveHead(0, 0, distancesRow.currentDistance) } } @@ -299,7 +299,7 @@ Item onClicked: { - connectedPrinter.homeBed() + printerModel.homeBed() } } @@ -312,7 +312,7 @@ Item onClicked: { - connectedPrinter.moveHead(0, 0, -distancesRow.currentDistance) + printerModel.moveHead(0, 0, -distancesRow.currentDistance) } } } From f570ba046bcc77a73220a909be84181701fbdd1a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 11:02:56 +0100 Subject: [PATCH 045/205] Added rudimentary jogging controls for UM3 This needs a bit more love; The machine is a bit stupid when it comes to moving outside of build area. CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 6 +++++- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 7 +++++-- .../LegacyUM3PrinterOutputController.py | 12 ++++++++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index d4b9d9c99a..1571be453c 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -68,21 +68,25 @@ class PrinterOutputModel(QObject): @pyqtProperty("long", "long", "long") @pyqtProperty("long", "long", "long", "long") def setHeadPosition(self, x, y, z, speed = 3000): + self.updateHeadPosition(x, y, z) self._controller.setHeadPosition(self, x, y, z, speed) @pyqtProperty("long") @pyqtProperty("long", "long") def setHeadX(self, x, speed = 3000): + self.updateHeadPosition(x, self._head_position.y, self._head_position.z) self._controller.setHeadPosition(self, x, self._head_position.y, self._head_position.z, speed) @pyqtProperty("long") @pyqtProperty("long", "long") def setHeadY(self, y, speed = 3000): + self.updateHeadPosition(self._head_position.x, y, self._head_position.z) self._controller.setHeadPosition(self, self._head_position.x, y, self._head_position.z, speed) @pyqtProperty("long") @pyqtProperty("long", "long") - def setHeadY(self, z, speed = 3000): + def setHeadZ(self, z, speed = 3000): + self.updateHeadPosition(self._head_position.x, self._head_position.y, z) self._controller.setHeadPosition(self, self._head_position.x, self._head_position.y, z, speed) @pyqtSlot("long", "long", "long") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index de0a8d6eff..f830e28764 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -411,7 +411,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_counter / self._max_authentication_counter * 100) if self._authentication_counter > self._max_authentication_counter: self._authentication_timer.stop() - Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._key) + Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._id) self.setAuthenticationState(AuthState.AuthenticationDenied) self._resetAuthenticationRequestedMessage() self._authentication_failed_message.show() @@ -530,7 +530,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): authenticator.setUser(self._authentication_id) authenticator.setPassword(self._authentication_key) else: - Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._key) + Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._id) def _onGetPrintJobFinished(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -580,6 +580,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) printer.updatePrinterState(result["status"]) + head_position = result["heads"][0]["position"] + printer.updateHeadPosition(head_position["x"], head_position["y"], head_position["z"]) + for index in range(0, self._number_of_extruders): temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"] extruder = printer.extruders[index] diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index ae8c989643..54c126e5cc 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -6,6 +6,7 @@ from cura.PrinterOutput.PrinterOutputController import PrinterOutputController MYPY = False if MYPY: from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel class LegacyUM3PrinterOutputController(PrinterOutputController): @@ -15,3 +16,14 @@ class LegacyUM3PrinterOutputController(PrinterOutputController): def setJobState(self, job: "PrintJobOutputModel", state: str): data = "{\"target\": \"%s\"}" % state self._output_device.put("print_job/state", data, onFinished=None) + + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + head_pos = printer._head_position + new_x = head_pos.x + x + new_y = head_pos.y + y + new_z = head_pos.z + z + data = "{\n\"x\":%s,\n\"y\":%s,\n\"z\":%s\n}" %(new_x, new_y, new_z) + self._output_device.put("printer/heads/0/position", data, onFinished=None) + + def homeBed(self, printer): + self._output_device.put("printer/heads/0/position/z", "0", onFinished=None) From f791b53ad85f95164f33c55c73726fed42974d6e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 13:54:34 +0100 Subject: [PATCH 046/205] Enabled monitor items for ClusterOutputDevice again CL-541 --- cura/PrinterOutputDevice.py | 28 ++----------------- .../ClusterUM3OutputDevice.py | 12 ++++++-- .../UM3OutputDevicePlugin.py | 6 ++-- 3 files changed, 15 insertions(+), 31 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 5b747d19bf..cc41123f77 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -106,39 +106,15 @@ class PrinterOutputDevice(QObject, OutputDevice): def _createControlViewFromQML(self): if not self._control_view_qml_path: return - - path = QUrl.fromLocalFile(self._control_view_qml_path) - - # Because of garbage collection we need to keep this referenced by python. - self._control_component = QQmlComponent(Application.getInstance()._engine, path) - - # Check if the context was already requested before (Printer output device might have multiple items in the future) - if self._qml_context is None: - self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._qml_context.setContextProperty("OutputDevice", self) - - self._control_item = self._control_component.create(self._qml_context) if self._control_item is None: - Logger.log("e", "QQmlComponent status %s", self._control_component.status()) - Logger.log("e", "QQmlComponent error string %s", self._control_component.errorString()) + self._control_item = Application.getInstance().createQmlComponent(self._control_view_qml_path, {"OutputDevice": self}) def _createMonitorViewFromQML(self): if not self._monitor_view_qml_path: return - path = QUrl.fromLocalFile(self._monitor_view_qml_path) - # Because of garbage collection we need to keep this referenced by python. - self._monitor_component = QQmlComponent(Application.getInstance()._engine, path) - - # Check if the context was already requested before (Printer output device might have multiple items in the future) - if self._qml_context is None: - self._qml_context = QQmlContext(Application.getInstance()._engine.rootContext()) - self._qml_context.setContextProperty("OutputDevice", self) - - self._monitor_item = self._monitor_component.create(self._qml_context) if self._monitor_item is None: - Logger.log("e", "QQmlComponent status %s", self._monitor_component.status()) - Logger.log("e", "QQmlComponent error string %s", self._monitor_component.errorString()) + self._monitor_item = Application.getInstance().createQmlComponent(self._monitor_view_qml_path, {"OutputDevice": self}) ## Attempt to establish connection def connect(self): diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 91acdc28af..73ac25f2f1 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -1,3 +1,6 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + from UM.Logger import Logger from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice @@ -5,10 +8,12 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel -import json - from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply +import json +import os + + class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) @@ -18,6 +23,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._print_jobs = [] + self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") + self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") + def _update(self): if not super()._update(): return diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index aecbc1717c..13ab774577 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -108,11 +108,11 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) # TODO: For debug purposes; force it to be legacy printer. - device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) - '''if cluster_size > 0: + #device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + if cluster_size > 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: - device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties)''' + device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) self._discovered_devices[device.getId()] = device self.discoveredDevicesChanged.emit() From cdfdaec492e31c808d8ccf7628ce55448cfa0278 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 14:03:53 +0100 Subject: [PATCH 047/205] ClusterUM3 now uses local material data as first source CL-541 --- .../ClusterUM3OutputDevice.py | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 73ac25f2f1..c98d17911c 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -3,6 +3,8 @@ from UM.Logger import Logger +from UM.Settings.ContainerRegistry import ContainerRegistry + from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel @@ -105,7 +107,26 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): material_data = extruder_data["material"] if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: - material = MaterialOutputModel(guid = material_data["guid"], type = material_data["material"], brand=material_data["brand"], color=material_data["color"]) + containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", + GUID=material_data["guid"]) + if containers: + color = containers[0].getMetaDataEntry("color_code") + brand = containers[0].getMetaDataEntry("brand") + material_type = containers[0].getMetaDataEntry("material") + name = containers[0].getName() + else: + Logger.log("w", "Unable to find material with guid {guid}. Using data as provided by cluster".format(guid = material_data["guid"])) + # Unknown material. + color = material_data["color"] + brand = material_data["brand"] + material_type = material_data["material"] + name = "Unknown" + + material = MaterialOutputModel(guid = material_data["guid"], + type = material_type, + brand = brand, + color = color, + name = name) extruder.updateActiveMaterial(material) else: From 7d9af8e3451c044acc242a27d4841ae3c5f5bf12 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 14:13:30 +0100 Subject: [PATCH 048/205] Added Opencontrol panel functions CL-541 --- plugins/UM3NetworkPrinting/ClusterMonitorItem.qml | 5 +++-- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index e78c7d1cc9..ec18b19119 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -16,6 +16,7 @@ Component property var emphasisColor: UM.Theme.getColor("setting_control_border_highlight") property var lineColor: "#DCDCDC" // TODO: Should be linked to theme. property var cornerRadius: 4 * screenScaleFactor // TODO: Should be linked to theme. + UM.I18nCatalog { id: catalog @@ -93,10 +94,10 @@ Component } } - PrinterVideoStream + /*PrinterVideoStream { visible: OutputDevice.selectedPrinterName != "" anchors.fill:parent - } + }*/ } } diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c98d17911c..db7bb68976 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -11,6 +11,8 @@ from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply +from PyQt5.QtGui import QDesktopServices +from PyQt5.QtCore import pyqtSlot, QUrl import json import os @@ -28,6 +30,16 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") + @pyqtSlot() + def openPrintJobControlPanel(self): + Logger.log("d", "Opening print job control panel...") + QDesktopServices.openUrl(QUrl("http://" + self._address + "/print_jobs")) + + @pyqtSlot() + def openPrinterControlPanel(self): + Logger.log("d", "Opening printer control panel...") + QDesktopServices.openUrl(QUrl("http://" + self._address + "/printers")) + def _update(self): if not super()._update(): return From 52a137a68cc7716bec3863707bea757be3cc0852 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 14:42:45 +0100 Subject: [PATCH 049/205] Ensured that sidebar has the right properties to show again CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 2 +- cura/PrinterOutput/PrinterOutputModel.py | 12 +++++++ .../UM3NetworkPrinting/ClusterControlItem.qml | 9 +++--- .../ClusterUM3OutputDevice.py | 32 ++++++++++++++++++- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 00641ab89a..9c96c45ca8 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -22,7 +22,7 @@ class PrintJobOutputModel(QObject): self._state = "" self._time_total = 0 self._time_elapsed = 0 - self._name = "" # Human readable name + self._name = name # Human readable name self._key = key # Unique identifier self._assigned_printer = None diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 1571be453c..8a6585469b 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -21,6 +21,7 @@ class PrinterOutputModel(QObject): nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() keyChanged = pyqtSignal() + typeChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) @@ -35,6 +36,17 @@ class PrinterOutputModel(QObject): self._printer_state = "unknown" + self._type = "" + + @pyqtProperty(str, notify = typeChanged) + def type(self): + return self._type + + def updateType(self, type): + if self._type != type: + self._type = type + self.typeChanged.emit() + @pyqtProperty(str, notify=keyChanged) def key(self): return self._key diff --git a/plugins/UM3NetworkPrinting/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/ClusterControlItem.qml index 8ba7156da8..b42515de51 100644 --- a/plugins/UM3NetworkPrinting/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterControlItem.qml @@ -10,13 +10,12 @@ Component { id: base property var manager: Cura.MachineManager.printerOutputDevices[0] - anchors.fill: parent - color: UM.Theme.getColor("viewport_background") - property var lineColor: "#DCDCDC" // TODO: Should be linked to theme. property var cornerRadius: 4 * screenScaleFactor // TODO: Should be linked to theme. visible: manager != null + anchors.fill: parent + color: UM.Theme.getColor("viewport_background") UM.I18nCatalog { @@ -97,7 +96,7 @@ Component } Label { - text: manager.numJobsPrinting + text: manager.activePrintJobs.length font: UM.Theme.getFont("small") anchors.right: parent.right } @@ -114,7 +113,7 @@ Component } Label { - text: manager.numJobsQueued + text: manager.queuedPrintJobs.length font: UM.Theme.getFont("small") anchors.right: parent.right } diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index db7bb68976..8b3f065576 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -12,13 +12,15 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices -from PyQt5.QtCore import pyqtSlot, QUrl +from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty import json import os class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): + printJobsChanged = pyqtSignal() + printersChanged = pyqtSignal() def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) self._api_prefix = "/cluster-api/v1/" @@ -40,6 +42,31 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("d", "Opening printer control panel...") QDesktopServices.openUrl(QUrl("http://" + self._address + "/printers")) + @pyqtProperty("QVariantList", notify=printJobsChanged) + def printJobs(self): + return self._print_jobs + + @pyqtProperty("QVariantList", notify=printJobsChanged) + def queuedPrintJobs(self): + return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is None] + + @pyqtProperty("QVariantList", notify=printJobsChanged) + def activePrintJobs(self): + return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None] + + @pyqtProperty("QVariantList", notify=printersChanged) + def connectedPrintersTypeCount(self): + printer_count = {} + for printer in self._printers: + if printer.type in printer_count: + printer_count[printer.type] += 1 + else: + printer_count[printer.type] = 1 + result = [] + for machine_type in printer_count: + result.append({"machine_type": machine_type, "count": printer_count[machine_type]}) + return result + def _update(self): if not super()._update(): return @@ -82,6 +109,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): old_job.assignedPrinter.updateActivePrintJob(None) self._print_jobs = print_jobs_seen + self.printJobsChanged.emit() def _onGetPrintersDataFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) @@ -92,6 +120,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Received an invalid printers state message: Not valid JSON.") return + # TODO: Ensure that printers that have been removed are also removed locally. for printer_data in result: uuid = printer_data["uuid"] @@ -107,6 +136,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateName(printer_data["friendly_name"]) printer.updateKey(uuid) + printer.updateType(printer_data["machine_variant"]) for index in range(0, self._number_of_extruders): extruder = printer.extruders[index] From 5d3779da261642f7cc4d83e0bf2597bf5af58344 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 15:54:44 +0100 Subject: [PATCH 050/205] Update cluster view components CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 10 ++-- cura/PrinterOutputDevice.py | 4 ++ .../UM3NetworkPrinting/ClusterMonitorItem.qml | 9 ++-- .../ClusterUM3OutputDevice.py | 20 +++++-- .../LegacyUM3OutputDevice.py | 4 +- .../PrintCoreConfiguration.qml | 4 +- .../UM3NetworkPrinting/PrinterInfoBlock.qml | 52 ++++++++----------- resources/qml/MonitorButton.qml | 4 +- resources/qml/Topbar.qml | 2 +- 9 files changed, 59 insertions(+), 50 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 8a6585469b..cb2dc15ea0 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -16,7 +16,7 @@ if MYPY: class PrinterOutputModel(QObject): bedTemperatureChanged = pyqtSignal() targetBedTemperatureChanged = pyqtSignal() - printerStateChanged = pyqtSignal() + stateChanged = pyqtSignal() activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() headPositionChanged = pyqtSignal() @@ -161,17 +161,17 @@ class PrinterOutputModel(QObject): self._active_print_job = print_job self.activePrintJobChanged.emit() - def updatePrinterState(self, printer_state): + def updateState(self, printer_state): if self._printer_state != printer_state: self._printer_state = printer_state - self.printerStateChanged.emit() + self.stateChanged.emit() @pyqtProperty(QObject, notify = activePrintJobChanged) def activePrintJob(self): return self._active_print_job - @pyqtProperty(str, notify=printerStateChanged) - def printerState(self): + @pyqtProperty(str, notify=stateChanged) + def state(self): return self._printer_state @pyqtProperty(int, notify = bedTemperatureChanged) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index cc41123f77..3ce9782355 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -86,6 +86,10 @@ class PrinterOutputDevice(QObject, OutputDevice): return self._printers[0] return None + @pyqtProperty("QVariantList", notify = printersChanged) + def printers(self): + return self._printers + @pyqtProperty(QObject, constant=True) def monitorItem(self): # Note that we specifically only check if the monitor component is created. diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index ec18b19119..5d819d9450 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -12,7 +12,6 @@ Component width: maximumWidth height: maximumHeight color: UM.Theme.getColor("viewport_background") - property var emphasisColor: UM.Theme.getColor("setting_control_border_highlight") property var lineColor: "#DCDCDC" // TODO: Should be linked to theme. property var cornerRadius: 4 * screenScaleFactor // TODO: Should be linked to theme. @@ -34,9 +33,9 @@ Component horizontalCenter: parent.horizontalCenter } - text: OutputDevice.connectedPrinters.length == 0 ? catalog.i18nc("@label: arg 1 is group name", "%1 is not set up to host a group of connected Ultimaker 3 printers").arg(Cura.MachineManager.printerOutputDevices[0].name) : "" + text: OutputDevice.printers.length == 0 ? catalog.i18nc("@label: arg 1 is group name", "%1 is not set up to host a group of connected Ultimaker 3 printers").arg(Cura.MachineManager.printerOutputDevices[0].name) : "" - visible: OutputDevice.connectedPrinters.length == 0 + visible: OutputDevice.printers.length == 0 } Item @@ -47,7 +46,7 @@ Component width: Math.min(800 * screenScaleFactor, maximumWidth) height: children.height - visible: OutputDevice.connectedPrinters.length != 0 + visible: OutputDevice.printers.length != 0 Label { @@ -80,7 +79,7 @@ Component anchors.fill: parent spacing: -UM.Theme.getSize("default_lining").height - model: OutputDevice.connectedPrinters + model: OutputDevice.printers delegate: PrinterInfoBlock { diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8b3f065576..c43855ce61 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -20,7 +20,11 @@ import os class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printJobsChanged = pyqtSignal() - printersChanged = pyqtSignal() + + # This is a bit of a hack, as the notify can only use signals that are defined by the class that they are in. + # Inheritance doesn't seem to work. Tying them together does work, but i'm open for better suggestions. + clusterPrintersChanged = pyqtSignal() + def __init__(self, device_id, address, properties, parent = None): super().__init__(device_id = device_id, address = address, properties=properties, parent = parent) self._api_prefix = "/cluster-api/v1/" @@ -32,6 +36,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") + # See comments about this hack with the clusterPrintersChanged signal + self.printersChanged.connect(self.clusterPrintersChanged) + @pyqtSlot() def openPrintJobControlPanel(self): Logger.log("d", "Opening print job control panel...") @@ -54,7 +61,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def activePrintJobs(self): return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None] - @pyqtProperty("QVariantList", notify=printersChanged) + @pyqtProperty("QVariantList", notify=clusterPrintersChanged) def connectedPrintersTypeCount(self): printer_count = {} for printer in self._printers: @@ -119,7 +126,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): except json.decoder.JSONDecodeError: Logger.log("w", "Received an invalid printers state message: Not valid JSON.") return - + printer_list_changed = False # TODO: Ensure that printers that have been removed are also removed locally. for printer_data in result: uuid = printer_data["uuid"] @@ -133,10 +140,15 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if printer is None: printer = PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders) self._printers.append(printer) + printer_list_changed = True printer.updateName(printer_data["friendly_name"]) printer.updateKey(uuid) printer.updateType(printer_data["machine_variant"]) + if not printer_data["enabled"]: + printer.updateState("disabled") + else: + printer.updateState(printer_data["status"]) for index in range(0, self._number_of_extruders): extruder = printer.extruders[index] @@ -171,6 +183,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): name = name) extruder.updateActiveMaterial(material) + if printer_list_changed: + self.printersChanged.emit() else: Logger.log("w", "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) \ No newline at end of file diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index f830e28764..e1acd1bede 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -159,7 +159,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # No active printer. Unable to write return - if self.activePrinter.printerState not in ["idle", ""]: + if self.activePrinter.state not in ["idle", ""]: # Printer is not able to accept commands. return @@ -578,7 +578,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): printer = self._printers[0] printer.updateBedTemperature(result["bed"]["temperature"]["current"]) printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) - printer.updatePrinterState(result["status"]) + printer.updateState(result["status"]) head_position = result["heads"][0]["position"] printer.updateHeadPosition(head_position["x"], head_position["y"], head_position["z"]) diff --git a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml index 03ff4542e1..abebca2eb8 100644 --- a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml @@ -15,7 +15,7 @@ Item Label { id: materialLabel - text: printCoreConfiguration.material.material + " (" + printCoreConfiguration.material.color + ")" + text: printCoreConfiguration.activeMaterial.type + " (" + printCoreConfiguration.activeMaterial.color + ")" elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("very_small") @@ -23,7 +23,7 @@ Item Label { id: printCoreLabel - text: printCoreConfiguration.print_core_id + text: printCoreConfiguration.hotendID anchors.top: materialLabel.bottom elide: Text.ElideRight width: parent.width diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index c253ebae89..a879ff7491 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -31,7 +31,7 @@ Rectangle function printerStatusText(printer) { - switch (printer.status) + switch (printer.state) { case "pre_print": return catalog.i18nc("@label", "Preparing to print") @@ -49,22 +49,14 @@ Rectangle } id: printerDelegate - property var printer + + property var printer: null + property var printJob: printer != null ? printer.activePrintJob: null border.width: UM.Theme.getSize("default_lining").width border.color: mouse.containsMouse ? emphasisColor : lineColor z: mouse.containsMouse ? 1 : 0 // Push this item up a bit on mouse over to ensure that the highlighted bottom border is visible. - property var printJob: - { - if (printer.reserved_by != null) - { - // Look in another list. - return OutputDevice.printJobsByUUID[printer.reserved_by] - } - return OutputDevice.printJobsByPrinterUUID[printer.uuid] - } - MouseArea { id: mouse @@ -73,7 +65,7 @@ Rectangle hoverEnabled: true; // Only clickable if no printer is selected - enabled: OutputDevice.selectedPrinterName == "" && printer.status !== "unreachable" + enabled: OutputDevice.selectedPrinterName == "" && printer.state !== "unreachable" } Row @@ -166,7 +158,7 @@ Rectangle anchors.right: printProgressArea.left anchors.rightMargin: UM.Theme.getSize("default_margin").width color: emphasisColor - opacity: printer != null && printer.status === "unreachable" ? 0.3 : 1 + opacity: printer != null && printer.state === "unreachable" ? 0.3 : 1 Image { @@ -192,7 +184,7 @@ Rectangle { id: leftExtruderInfo width: Math.floor((parent.width - extruderSeperator.width) / 2) - printCoreConfiguration: printer.configuration[0] + printCoreConfiguration: printer.extruders[0] } Rectangle @@ -207,7 +199,7 @@ Rectangle { id: rightExtruderInfo width: Math.floor((parent.width - extruderSeperator.width) / 2) - printCoreConfiguration: printer.configuration[1] + printCoreConfiguration: printer.extruders[1] } } @@ -225,9 +217,9 @@ Rectangle if(printJob != null) { var extendStates = ["sent_to_printer", "wait_for_configuration", "printing", "pre_print", "post_print", "wait_cleanup", "queued"]; - return extendStates.indexOf(printJob.status) !== -1; + return extendStates.indexOf(printJob.state) !== -1; } - return !printer.enabled; + return printer.state == "disabled" } Item // Status and Percent @@ -235,7 +227,7 @@ Rectangle id: printProgressTitleBar property var showPercent: { - return printJob != null && (["printing", "post_print", "pre_print", "sent_to_printer"].indexOf(printJob.status) !== -1); + return printJob != null && (["printing", "post_print", "pre_print", "sent_to_printer"].indexOf(printJob.state) !== -1); } width: parent.width @@ -252,19 +244,19 @@ Rectangle anchors.rightMargin: UM.Theme.getSize("default_margin").width anchors.verticalCenter: parent.verticalCenter text: { - if (!printer.enabled) + if (printer.state == "disabled") { return catalog.i18nc("@label:status", "Disabled"); } - if (printer.status === "unreachable") + if (printer.state === "unreachable") { return printerStatusText(printer); } if (printJob != null) { - switch (printJob.status) + switch (printJob.state) { case "printing": case "post_print": @@ -328,26 +320,26 @@ Rectangle visible: !printProgressTitleBar.showPercent source: { - if (!printer.enabled) + if (printer.state == "disabled") { return "blocked-icon.svg"; } - if (printer.status === "unreachable") + if (printer.state === "unreachable") { return ""; } if (printJob != null) { - if(printJob.status === "queued") + if(printJob.state === "queued") { if (printJob.configuration_changes_required != null && printJob.configuration_changes_required.length !== 0) { return "action-required-icon.svg"; } } - else if (printJob.status === "wait_cleanup") + else if (printJob.state === "wait_cleanup") { return "checkmark-icon.svg"; } @@ -384,19 +376,19 @@ Rectangle { text: { - if (!printer.enabled) + if (printer.state == "disabled") { return catalog.i18nc("@label", "Not accepting print jobs"); } - if (printer.status === "unreachable") + if (printer.state === "unreachable") { return ""; } if(printJob != null) { - switch (printJob.status) + switch (printJob.state) { case "printing": case "post_print": @@ -432,7 +424,7 @@ Rectangle text: { if(printJob != null) { - if(printJob.status == "printing" || printJob.status == "post_print") + if(printJob.state == "printing" || printJob.state == "post_print") { return OutputDevice.getDateCompleted(printJob.time_total - printJob.time_elapsed) } diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 6166f9b62f..a60eb0b3f3 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -73,7 +73,7 @@ Item if(!printerConnected || !printerAcceptsCommands) return UM.Theme.getColor("text"); - switch(activePrinter.printerState) + switch(activePrinter.state) { case "maintenance": return UM.Theme.getColor("status_busy"); @@ -118,7 +118,7 @@ Item var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] - if(activePrinter.printerState == "maintenance") + if(activePrinter.state == "maintenance") { return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); } diff --git a/resources/qml/Topbar.qml b/resources/qml/Topbar.qml index 63d0981830..4b5008c43e 100644 --- a/resources/qml/Topbar.qml +++ b/resources/qml/Topbar.qml @@ -124,7 +124,7 @@ Rectangle { return UM.Theme.getIcon("tab_status_unknown"); } - if (Cura.MachineManager.printerOutputDevices[0].printerState == "maintenance") + if (Cura.MachineManager.printerOutputDevices[0].state == "maintenance") { return UM.Theme.getIcon("tab_status_busy"); } From 6f495f2d8b1cadbc0848e8e241e59cb625fa5641 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 16:00:57 +0100 Subject: [PATCH 051/205] Cluster monitor now uses material name This matches better with what Cura does. CL-541 --- plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml index abebca2eb8..f0aeebd217 100644 --- a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml @@ -15,7 +15,7 @@ Item Label { id: materialLabel - text: printCoreConfiguration.activeMaterial.type + " (" + printCoreConfiguration.activeMaterial.color + ")" + text: printCoreConfiguration.activeMaterial.name elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("very_small") From c6f2e167e20c96fece8e83b1adedf0aea3cfd748 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 16:02:55 +0100 Subject: [PATCH 052/205] Renamed some missed properties CL-541 --- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index a879ff7491..b6b4f2e8c4 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -132,7 +132,7 @@ Rectangle anchors.top: parent.top anchors.left: parent.left width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width - showCameraIcon.width) - text: printer.friendly_name + text: printer.name font: UM.Theme.getFont("default_bold") elide: Text.ElideRight } @@ -142,7 +142,7 @@ Rectangle id: printerTypeLabel anchors.top: printerNameLabel.bottom width: Math.floor(parent.width / 2 - UM.Theme.getSize("default_margin").width) - text: printer.machine_variant + text: printer.type anchors.left: parent.left elide: Text.ElideRight font: UM.Theme.getFont("very_small") From 83b13546fbb72584cc075eb42f1e4060a93e6bdf Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 17:12:36 +0100 Subject: [PATCH 053/205] Moved compressing of GCode to one class higher CL-541 --- .../NetworkedPrinterOutputDevice.py | 32 ++++++++++++ cura/PrinterOutputDevice.py | 2 +- .../ClusterUM3OutputDevice.py | 51 ++++++++++++++++++- .../LegacyUM3OutputDevice.py | 32 ------------ 4 files changed, 82 insertions(+), 35 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 58c82b6c38..e38338172a 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -45,6 +45,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._cached_multiparts = {} + self._sending_gcode = False + self._compressing_gcode = False + self._gcode = [] + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): raise NotImplementedError("requestWrite needs to be implemented") @@ -57,6 +61,34 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def authenticationState(self): return self._authentication_state + def _compressGCode(self): + self._compressing_gcode = True + + ## Mash the data into single string + max_chars_per_line = int(1024 * 1024 / 4) # 1/4 MB per line. + byte_array_file_data = b"" + batched_line = "" + + for line in self._gcode: + if not self._compressing_gcode: + self._progress_message.hide() + # Stop trying to zip / send as abort was called. + return + batched_line += line + # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. + # Compressing line by line in this case is extremely slow, so we need to batch them. + if len(batched_line) < max_chars_per_line: + continue + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + batched_line = "" + + # Don't miss the last batch (If any) + if batched_line: + byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + + self._compressing_gcode = False + return byte_array_file_data + def _update(self): if self._last_response_time: time_since_last_response = time() - self._last_response_time diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 3ce9782355..bf912ad4a5 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -138,7 +138,7 @@ class PrinterOutputDevice(QObject, OutputDevice): def acceptsCommands(self): return self._accepts_commands - ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands + ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands def setAcceptsCommands(self, accepts_commands): if self._accepts_commands != accepts_commands: self._accepts_commands = accepts_commands diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c43855ce61..7d95acc920 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -2,10 +2,12 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Logger import Logger - +from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.i18n import i18nCatalog +from UM.Message import Message -from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice +from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel @@ -17,6 +19,8 @@ from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty import json import os +i18n_catalog = i18nCatalog("cura") + class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printJobsChanged = pyqtSignal() @@ -39,6 +43,49 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # See comments about this hack with the clusterPrintersChanged signal self.printersChanged.connect(self.clusterPrintersChanged) + self._accepts_commands = True + + # Cluster does not have authentication, so default to authenticated + self._authentication_state = AuthState.Authenticated + + self._error_message = None + self._progress_message = None + + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().showPrintMonitor.emit(True) + self.writeStarted.emit(self) + + self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) + if not self._gcode: + # Unable to find g-code. Nothing to send + return + + @pyqtSlot() + def sendPrintJob(self): + Logger.log("i", "Sending print job to printer.") + if self._sending_gcode: + self._error_message = Message( + i18n_catalog.i18nc("@info:status", + "Sending new jobs (temporarily) blocked, still sending the previous print job.")) + self._error_message.show() + return + + self._sending_gcode = True + + self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1, + i18n_catalog.i18nc("@info:title", "Sending Data")) + self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") + self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) + + compressed_gcode = self._compressGCode() + if compressed_gcode is None: + # Abort was called. + return + + + + @pyqtSlot() def openPrintJobControlPanel(self): Logger.log("d", "Opening print job control panel...") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index e1acd1bede..642a67d729 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -63,10 +63,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_succeeded_message = None self._not_authenticated_message = None - self._sending_gcode = False - self._compressing_gcode = False - self._gcode = [] - self.authenticationStateChanged.connect(self._onAuthenticationStateChanged) self.setPriority(3) # Make sure the output device gets selected above local file output @@ -286,34 +282,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() - def _compressGCode(self): - self._compressing_gcode = True - - ## Mash the data into single string - max_chars_per_line = 1024 * 1024 / 4 # 1/4 MB per line. - byte_array_file_data = b"" - batched_line = "" - - for line in self._gcode: - if not self._compressing_gcode: - self._progress_message.hide() - # Stop trying to zip / send as abort was called. - return - batched_line += line - # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. - # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) - batched_line = "" - - # Don't miss the last batch (If any) - if batched_line: - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) - - self._compressing_gcode = False - return byte_array_file_data - def _messageBoxCallback(self, button): def delayedCallback(): if button == QMessageBox.Yes: From c1c59925ded42732d6d0e63a9ce9811c6d494dfc Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 27 Nov 2017 17:14:30 +0100 Subject: [PATCH 054/205] Removed duplicated code CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index e38338172a..91da01d9cb 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -113,16 +113,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return True - def _createEmptyFormRequest(self, target): + def _createEmptyRequest(self, target, content_type: Optional[str] = "application/json"): url = QUrl("http://" + self._address + self._api_prefix + target) request = QNetworkRequest(url) - request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) - return request - - def _createEmptyRequest(self, target): - url = QUrl("http://" + self._address + self._api_prefix + target) - request = QNetworkRequest(url) - request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") + if content_type is not None: + request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request @@ -168,7 +163,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() - request = self._createEmptyFormRequest(target) + request = self._createEmptyRequest(target, content_type=None) multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType) post_part = QHttpPart() From cfc6a3ad484658ffeae1be5849aa567a7519a763 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Nov 2017 12:43:49 +0100 Subject: [PATCH 055/205] Added some convenience functions to NetworkedPrinterOutputdevice This also moves the getUser from legacy to networked printer CL-541 --- .../NetworkedPrinterOutputDevice.py | 43 +++++++++++++++---- .../LegacyUM3OutputDevice.py | 12 +----- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 91da01d9cb..8d6e39bf35 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -12,7 +12,9 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, py from time import time from typing import Callable, Any, Optional from enum import IntEnum +from typing import List +import os class AuthState(IntEnum): NotAuthenticated = 1 @@ -121,6 +123,28 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request + def _createFormPart(self, content_header, data, content_type = None): + part = QHttpPart() + + if not content_header.startswith("form-data;"): + content_header = "form_data; " + content_header + part.setHeader(QNetworkRequest.ContentDispositionHeader, content_header) + + if content_type is not None: + part.setHeader(QNetworkRequest.ContentTypeHeader, content_type) + + part.setBody(data) + return part + + ## Convenience function to get the username from the OS. + # The code was copied from the getpass module, as we try to use as little dependencies as possible. + def _getUserName(self): + for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): + user = os.environ.get(name) + if user: + return user + return "Unknown User" # Couldn't find out username. + def _clearCachedMultiPart(self, reply): if id(reply) in self._cached_multiparts: del self._cached_multiparts[id(reply)] @@ -160,29 +184,32 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target, content_type=None) - multi_post_part = QHttpMultiPart(QHttpMultiPart.FormDataType) - post_part = QHttpPart() - post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) - post_part.setBody(body_data) - multi_post_part.append(post_part) + for part in parts: + multi_post_part.append(part) self._last_request_time = time() reply = self._manager.post(request, multi_post_part) - # Due to garbage collection on python doing some weird stuff, we need to keep hold of a reference - self._cached_multiparts[id(reply)] = (post_part, multi_post_part, reply) + self._cached_multiparts[id(reply)] = (multi_post_part, reply) if onProgress is not None: reply.uploadProgress.connect(onProgress) if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + post_part = QHttpPart() + post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) + post_part.setBody(body_data) + + self.postFormWithParts(target, [post_part], onFinished, onProgress) + def _onAuthenticationRequired(self, reply, authenticator): Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 642a67d729..35e7f1890d 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -143,6 +143,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): continue # If it's not readonly, it's created by user, so skip it. file_name = "none.xml" + self.postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), onFinished=None) except NotImplementedError: @@ -596,13 +597,4 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): result = "********" + result return result - return self._authentication_key - - ## Convenience function to get the username from the OS. - # The code was copied from the getpass module, as we try to use as little dependencies as possible. - def _getUserName(self): - for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): - user = os.environ.get(name) - if user: - return user - return "Unknown User" # Couldn't find out username. \ No newline at end of file + return self._authentication_key \ No newline at end of file From 9084dfd6bd3545e57618b1300d7e19b593f4db6b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Nov 2017 12:59:54 +0100 Subject: [PATCH 056/205] It's now possible to send print jobs to cluster again CL-541 --- .../NetworkedPrinterOutputDevice.py | 20 ++++++--- .../ClusterUM3OutputDevice.py | 43 +++++++++++++++++++ .../LegacyUM3OutputDevice.py | 13 +----- 3 files changed, 59 insertions(+), 17 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 8d6e39bf35..3585aee5ea 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -7,14 +7,14 @@ from UM.Logger import Logger from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl - +from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, pyqtSignal, QUrl, QCoreApplication from time import time from typing import Callable, Any, Optional from enum import IntEnum from typing import List -import os +import os # To get the username +import gzip class AuthState(IntEnum): NotAuthenticated = 1 @@ -63,6 +63,16 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): def authenticationState(self): return self._authentication_state + def _compressDataAndNotifyQt(self, data_to_append): + compressed_data = gzip.compress(data_to_append.encode("utf-8")) + self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. + QCoreApplication.processEvents() # Ensure that the GUI does not freeze. + + # Pretend that this is a response, as zipping might take a bit of time. + # If we don't do this, the device might trigger a timeout. + self._last_response_time = time() + return compressed_data + def _compressGCode(self): self._compressing_gcode = True @@ -81,12 +91,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): # Compressing line by line in this case is extremely slow, so we need to batch them. if len(batched_line) < max_chars_per_line: continue - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + byte_array_file_data += self._compressDataAndNotifyQt(batched_line) batched_line = "" # Don't miss the last batch (If any) if batched_line: - byte_array_file_data += self.__compressDataAndNotifyQt(batched_line) + byte_array_file_data += self._compressDataAndNotifyQt(batched_line) self._compressing_gcode = False return byte_array_file_data diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 7d95acc920..ec6c94adb7 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -16,6 +16,8 @@ from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty +from time import time + import json import os @@ -61,6 +63,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Unable to find g-code. Nothing to send return + # TODO; DEBUG + self.sendPrintJob() + @pyqtSlot() def sendPrintJob(self): Logger.log("i", "Sending print job to printer.") @@ -83,8 +88,46 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Abort was called. return + parts = [] + # If a specific printer was selected, it should be printed with that machine. + require_printer_name = "" # Todo; actually needs to be set + if require_printer_name: + parts.append(self._createFormPart("name=require_printer_name", bytes(require_printer_name, "utf-8"), "text/plain")) + # Add user name to the print_job + parts.append(self._createFormPart("name=owner", bytes(self._getUserName(), "utf-8"), "text/plain")) + + file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName + + parts.append(self._createFormPart("name=\"file\"; filename=\"%s\"" % file_name, compressed_gcode)) + + self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress) + + def _onPostPrintJobFinished(self, reply): + print("POST PRINTJOB DONE! YAY!", reply.readAll()) + pass + + def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): + if bytes_total > 0: + new_progress = bytes_sent / bytes_total * 100 + # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get + # timeout responses if this happens. + self._last_response_time = time() + if new_progress > self._progress_message.getProgress(): + self._progress_message.show() # Ensure that the message is visible. + self._progress_message.setProgress(bytes_sent / bytes_total * 100) + else: + self._progress_message.setProgress(0) + self._progress_message.hide() + + def _progressMessageActionTriggered(self, message_id=None, action_id=None): + if action_id == "Abort": + Logger.log("d", "User aborted sending print to remote.") + self._progress_message.hide() + self._compressing_gcode = False + self._sending_gcode = False + Application.getInstance().showPrintMonitor.emit(False) @pyqtSlot() def openPrintJobControlPanel(self): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 35e7f1890d..d89efc2acc 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -21,8 +21,7 @@ from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController from time import time import json -import os # To get the username -import gzip + i18n_catalog = i18nCatalog("cura") @@ -259,16 +258,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() self._sending_gcode = False - def __compressDataAndNotifyQt(self, data_to_append): - compressed_data = gzip.compress(data_to_append.encode("utf-8")) - self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. - QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - - # Pretend that this is a response, as zipping might take a bit of time. - # If we don't do this, the device might trigger a timeout. - self._last_response_time = time() - return compressed_data - def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): if bytes_total > 0: new_progress = bytes_sent / bytes_total * 100 From e8418960903aa68a06a19e17490a358c48debda6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 28 Nov 2017 13:04:58 +0100 Subject: [PATCH 057/205] PrintJobs are now assigned if they are not queued It used to just do it if it was printing, but jobs can also be in other states such as paused, pre_print, etc CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ec6c94adb7..c8462e34d5 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -193,7 +193,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job.updateTimeTotal(print_job_data["time_total"]) print_job.updateTimeElapsed(print_job_data["time_elapsed"]) print_job.updateState(print_job_data["status"]) - if print_job.state == "printing": + if print_job.state != "queued": # Print job should be assigned to a printer. printer = self._getPrinterByKey(print_job_data["printer_uuid"]) if printer: From 3d3b140526191126b3a7e2cf45fd1180861c6bcb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 10:53:38 +0100 Subject: [PATCH 058/205] Times are correctly displayed for Cluster again CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 7 ++++++- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c8462e34d5..ce96627296 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -6,6 +6,7 @@ from UM.Application import Application from UM.Settings.ContainerRegistry import ContainerRegistry from UM.i18n import i18nCatalog from UM.Message import Message +from UM.Qt.Duration import Duration, DurationFormat from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel @@ -164,6 +165,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): result.append({"machine_type": machine_type, "count": printer_count[machine_type]}) return result + @pyqtSlot(int, result=str) + def formatDuration(self, seconds): + return Duration(seconds).getDisplayString(DurationFormat.Format.Short) + def _update(self): if not super()._update(): return @@ -201,7 +206,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_jobs_seen.append(print_job) for old_job in self._print_jobs: - if old_job not in print_jobs_seen: + if old_job not in print_jobs_seen and old_job.assignedPrinter: # Print job needs to be removed. old_job.assignedPrinter.updateActivePrintJob(None) diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index b6b4f2e8c4..5c0963a390 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -22,11 +22,11 @@ Rectangle { return ""; } - if (printJob.time_total === 0) + if (printJob.timeTotal === 0) { return ""; } - return Math.min(100, Math.round(printJob.time_elapsed / printJob.time_total * 100)) + "%"; + return Math.min(100, Math.round(printJob.timeElapsed / printJob.timeTotal * 100)) + "%"; } function printerStatusText(printer) @@ -114,7 +114,7 @@ Rectangle anchors.left: parent.left anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width - text: printJob != null ? getPrettyTime(printJob.time_total) : "" + text: printJob != null ? getPrettyTime(printJob.timeTotal) : "" opacity: 0.65 font: UM.Theme.getFont("default") elide: Text.ElideRight From f30f0a7194366d02492d472069f6783bef3a65d0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 11:04:13 +0100 Subject: [PATCH 059/205] Mismatched configuration is now shown correctly again CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 14 +++++++++++++- .../ClusterUM3OutputDevice.py | 10 ++++++++-- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 17 ++--------------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index 9c96c45ca8..fa8bbe8673 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot +from typing import Optional MYPY = False if MYPY: from cura.PrinterOutput.PrinterOutputController import PrinterOutputController @@ -15,6 +16,7 @@ class PrintJobOutputModel(QObject): nameChanged = pyqtSignal() keyChanged = pyqtSignal() assignedPrinterChanged = pyqtSignal() + ownerChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None): super().__init__(parent) @@ -24,7 +26,17 @@ class PrintJobOutputModel(QObject): self._time_elapsed = 0 self._name = name # Human readable name self._key = key # Unique identifier - self._assigned_printer = None + self._assigned_printer = None # type: Optional[PrinterOutputModel] + self._owner = "" # Who started/owns the print job? + + @pyqtProperty(str, notify=ownerChanged) + def owner(self): + return self._owner + + def updateOwner(self, owner): + if self._owner != owner: + self._owner = owner + self.ownerChanged.emit() @pyqtProperty(QObject, notify=assignedPrinterChanged) def assignedPrinter(self): diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ce96627296..362dc344d4 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -198,11 +198,17 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job.updateTimeTotal(print_job_data["time_total"]) print_job.updateTimeElapsed(print_job_data["time_elapsed"]) print_job.updateState(print_job_data["status"]) + print_job.updateOwner(print_job_data["owner"]) + printer = None if print_job.state != "queued": # Print job should be assigned to a printer. printer = self._getPrinterByKey(print_job_data["printer_uuid"]) - if printer: - printer.updateActivePrintJob(print_job) + else: # Status is queued + # The job can "reserve" a printer if some changes are required. + printer = self._getPrinterByKey(print_job_data["assigned_to"]) + + if printer: + printer.updateActivePrintJob(print_job) print_jobs_seen.append(print_job) for old_job in self._print_jobs: diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 5c0963a390..29fe8882f9 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -269,14 +269,7 @@ Rectangle case "sent_to_printer": return catalog.i18nc("@label", "Preparing to print") case "queued": - if (printJob.configuration_changes_required != null && printJob.configuration_changes_required.length !== 0) - { return catalog.i18nc("@label:status", "Action required"); - } - else - { - return ""; - } case "pausing": case "paused": return catalog.i18nc("@label:status", "Paused"); @@ -334,10 +327,7 @@ Rectangle { if(printJob.state === "queued") { - if (printJob.configuration_changes_required != null && printJob.configuration_changes_required.length !== 0) - { - return "action-required-icon.svg"; - } + return "action-required-icon.svg"; } else if (printJob.state === "wait_cleanup") { @@ -401,10 +391,7 @@ Rectangle case "wait_for_configuration": return catalog.i18nc("@label", "Not accepting print jobs") case "queued": - if (printJob.configuration_changes_required != undefined) - { - return catalog.i18nc("@label", "Waiting for configuration change"); - } + return catalog.i18nc("@label", "Waiting for configuration change"); default: return ""; } From 70cfbf01809abb1d25132d19364ca1f2dda39a25 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 11:44:18 +0100 Subject: [PATCH 060/205] PostPrintjobFinished now hides messages & resets state CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 6 ++++-- plugins/UM3NetworkPrinting/PrinterInfoBlock.qml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 362dc344d4..7d459abf4c 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -106,8 +106,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress) def _onPostPrintJobFinished(self, reply): - print("POST PRINTJOB DONE! YAY!", reply.readAll()) - pass + self._progress_message.hide() + self._compressing_gcode = False + self._sending_gcode = False + Application.getInstance().showPrintMonitor.emit(False) def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): if bytes_total > 0: diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 29fe8882f9..3a7fd1fc74 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -382,7 +382,7 @@ Rectangle { case "printing": case "post_print": - return catalog.i18nc("@label", "Finishes at: ") + OutputDevice.getTimeCompleted(printJob.time_total - printJob.time_elapsed) + return catalog.i18nc("@label", "Finishes at: ") + OutputDevice.getTimeCompleted(printJob.timeTotal - printJob.timeElapsed) case "wait_cleanup": return catalog.i18nc("@label", "Clear build plate") case "sent_to_printer": From a49d3dbd8ec654834d86d4e7bdba6aca0c7775b3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 11:57:14 +0100 Subject: [PATCH 061/205] Added missing time/date completed CL-541 --- .../UM3NetworkPrinting/ClusterUM3OutputDevice.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 7d459abf4c..76d4c70752 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -18,7 +18,7 @@ from PyQt5.QtGui import QDesktopServices from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty from time import time - +from datetime import datetime import json import os @@ -171,6 +171,19 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def formatDuration(self, seconds): return Duration(seconds).getDisplayString(DurationFormat.Format.Short) + @pyqtSlot(int, result=str) + def getTimeCompleted(self, time_remaining): + current_time = time() + datetime_completed = datetime.fromtimestamp(current_time + time_remaining) + return "{hour:02d}:{minute:02d}".format(hour=datetime_completed.hour, minute=datetime_completed.minute) + + @pyqtSlot(int, result=str) + def getDateCompleted(self, time_remaining): + current_time = time() + datetime_completed = datetime.fromtimestamp(current_time + time_remaining) + + return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() + def _update(self): if not super()._update(): return From dea13899b321825fe22e0809cb7b8bdd260f1b09 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 13:07:01 +0100 Subject: [PATCH 062/205] Cluster can now "target" one of it's printers for display CL-541 --- .../UM3NetworkPrinting/ClusterMonitorItem.qml | 7 +++---- .../ClusterUM3OutputDevice.py | 18 ++++++++++++++++-- .../UM3NetworkPrinting/PrinterInfoBlock.qml | 4 ++-- .../UM3NetworkPrinting/PrinterVideoStream.qml | 2 +- resources/qml/MonitorButton.qml | 13 +++++++++---- 5 files changed, 31 insertions(+), 13 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index 5d819d9450..df102915ff 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -62,7 +62,6 @@ Component } } - ScrollView { id: printerScrollView @@ -93,10 +92,10 @@ Component } } - /*PrinterVideoStream + PrinterVideoStream { - visible: OutputDevice.selectedPrinterName != "" + visible: OutputDevice.activePrinter != null anchors.fill:parent - }*/ + } } } diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 76d4c70752..3cee20a54f 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -15,10 +15,12 @@ from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices -from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty +from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject from time import time from datetime import datetime +from typing import Optional + import json import os @@ -27,6 +29,7 @@ i18n_catalog = i18nCatalog("cura") class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printJobsChanged = pyqtSignal() + activePrinterChanged = pyqtSignal() # This is a bit of a hack, as the notify can only use signals that are defined by the class that they are in. # Inheritance doesn't seem to work. Tying them together does work, but i'm open for better suggestions. @@ -54,6 +57,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._error_message = None self._progress_message = None + self._active_printer = None # type: Optional[PrinterOutputModel] + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().showPrintMonitor.emit(True) @@ -105,11 +110,20 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.postFormWithParts("print_jobs/", parts, onFinished=self._onPostPrintJobFinished, onProgress=self._onUploadPrintJobProgress) + @pyqtProperty(QObject, notify=activePrinterChanged) + def activePrinter(self) -> Optional["PrinterOutputModel"]: + return self._active_printer + + @pyqtSlot(QObject) + def setActivePrinter(self, printer): + if self._active_printer != printer: + self._active_printer = printer + self.activePrinterChanged.emit() + def _onPostPrintJobFinished(self, reply): self._progress_message.hide() self._compressing_gcode = False self._sending_gcode = False - Application.getInstance().showPrintMonitor.emit(False) def _onUploadPrintJobProgress(self, bytes_sent, bytes_total): if bytes_total > 0: diff --git a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml index 3a7fd1fc74..6d7d6c8a7d 100644 --- a/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml +++ b/plugins/UM3NetworkPrinting/PrinterInfoBlock.qml @@ -61,11 +61,11 @@ Rectangle { id: mouse anchors.fill:parent - onClicked: OutputDevice.selectPrinter(printer.unique_name, printer.friendly_name) + onClicked: OutputDevice.setActivePrinter(printer) hoverEnabled: true; // Only clickable if no printer is selected - enabled: OutputDevice.selectedPrinterName == "" && printer.state !== "unreachable" + enabled: OutputDevice.activePrinter == null && printer.state !== "unreachable" } Row diff --git a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml index 6793d74ac5..d0a9e08232 100644 --- a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml @@ -17,7 +17,7 @@ Item MouseArea { anchors.fill: parent - onClicked: OutputDevice.selectAutomaticPrinter() + onClicked: OutputDevice.setActivePrinter(null) z: 0 } diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index a60eb0b3f3..778884ba00 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -70,8 +70,10 @@ Item property variant statusColor: { - if(!printerConnected || !printerAcceptsCommands) + if(!printerConnected || !printerAcceptsCommands || activePrinter == null) + { return UM.Theme.getColor("text"); + } switch(activePrinter.state) { @@ -117,7 +119,10 @@ Item } var printerOutputDevice = Cura.MachineManager.printerOutputDevices[0] - + if(activePrinter == null) + { + return ""; + } if(activePrinter.state == "maintenance") { return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); @@ -262,7 +267,7 @@ Item property bool userClicked: false property string lastJobState: "" - visible: printerConnected && activePrinter.canPause + visible: printerConnected && activePrinter != null &&activePrinter.canPause enabled: (!userClicked) && printerConnected && printerAcceptsCommands && activePrintJob != null && (["paused", "printing"].indexOf(activePrintJob.state) >= 0) @@ -305,7 +310,7 @@ Item { id: abortButton - visible: printerConnected && activePrinter.canAbort + visible: printerConnected && activePrinter != null && activePrinter.canAbort enabled: printerConnected && printerAcceptsCommands && activePrintJob != null && (["paused", "printing", "pre_print"].indexOf(activePrintJob.state) >= 0) From d8c48343625ac745b18576b9761273b8af5cb7c3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 13:20:58 +0100 Subject: [PATCH 063/205] Aborting & pausing prints is now possible again from the Cluster output device CL-541 --- .../ClusterUM3OutputDevice.py | 6 ++++-- .../ClusterUM3PrinterOutputController.py | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 3cee20a54f..da26e77643 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -13,6 +13,8 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from .ClusterUM3PrinterOutputController import ClusterUM3PrinterOutputController + from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply from PyQt5.QtGui import QDesktopServices from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject @@ -221,7 +223,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): break if print_job is None: - print_job = PrintJobOutputModel(output_controller = None, + print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), key = print_job_data["uuid"], name = print_job_data["name"]) print_job.updateTimeTotal(print_job_data["time_total"]) @@ -268,7 +270,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): break if printer is None: - printer = PrinterOutputModel(output_controller=None, number_of_extruders=self._number_of_extruders) + printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), number_of_extruders=self._number_of_extruders) self._printers.append(printer) printer_list_changed = True diff --git a/plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py new file mode 100644 index 0000000000..4615cd62dc --- /dev/null +++ b/plugins/UM3NetworkPrinting/ClusterUM3PrinterOutputController.py @@ -0,0 +1,21 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.PrinterOutput.PrinterOutputController import PrinterOutputController + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + + +class ClusterUM3PrinterOutputController(PrinterOutputController): + def __init__(self, output_device): + super().__init__(output_device) + self.can_pre_heat_bed = False + self.can_control_manually = False + + def setJobState(self, job: "PrintJobOutputModel", state: str): + data = "{\"action\": \"%s\"}" % state + self._output_device.put("print_jobs/%s/action" % job.key, data, onFinished=None) + From 339d7ca4c9e5da8e7277f2a40237fae1b811ddec Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 14:36:53 +0100 Subject: [PATCH 064/205] Cluster shows default controlItem again when a specific printer is selected CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 8 ++++++++ resources/qml/PrintMonitor.qml | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index da26e77643..f4675a2e0a 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -61,6 +61,14 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._active_printer = None # type: Optional[PrinterOutputModel] + @pyqtProperty(QObject, notify=activePrinterChanged) + def controlItem(self): + if self._active_printer is None: + return super().controlItem + else: + # Let cura use the default. + return None + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().showPrintMonitor.emit(True) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 830093cd2b..b3c36f7fd4 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -45,7 +45,7 @@ Column Repeater { id: extrudersRepeater - model: activePrinter.extruders + model: activePrinter!=null ? activePrinter.extruders : null ExtruderBox { From 1c1c195b931705e8746b28ab65f0411501fca4ce Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 15:01:28 +0100 Subject: [PATCH 065/205] When an printer gets added / removed, this is now correctly shown CL-541 --- .../ClusterUM3OutputDevice.py | 19 ++++++++++++++++++- .../PrintCoreConfiguration.qml | 2 +- resources/qml/MonitorButton.qml | 5 ++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index f4675a2e0a..b64716c958 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -268,6 +268,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): return printer_list_changed = False # TODO: Ensure that printers that have been removed are also removed locally. + + printers_seen = [] + for printer_data in result: uuid = printer_data["uuid"] @@ -282,6 +285,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._printers.append(printer) printer_list_changed = True + printers_seen.append(printer) + printer.updateName(printer_data["friendly_name"]) printer.updateKey(uuid) printer.updateType(printer_data["machine_variant"]) @@ -292,7 +297,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): for index in range(0, self._number_of_extruders): extruder = printer.extruders[index] - extruder_data = printer_data["configuration"][index] + try: + extruder_data = printer_data["configuration"][index] + except IndexError: + break + try: hotend_id = extruder_data["print_core_id"] except KeyError: @@ -322,6 +331,14 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): color = color, name = name) extruder.updateActiveMaterial(material) + removed_printers = [printer for printer in self._printers if printer not in printers_seen] + + for removed_printer in removed_printers: + self._printers.remove(removed_printer) + printer_list_changed = True + if self._active_printer == removed_printer: + self._active_printer = None + self.activePrinterChanged.emit() if printer_list_changed: self.printersChanged.emit() diff --git a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml index f0aeebd217..70fa65da5e 100644 --- a/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml +++ b/plugins/UM3NetworkPrinting/PrintCoreConfiguration.qml @@ -15,7 +15,7 @@ Item Label { id: materialLabel - text: printCoreConfiguration.activeMaterial.name + text: printCoreConfiguration.activeMaterial != null ? printCoreConfiguration.activeMaterial.name : "" elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("very_small") diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index 778884ba00..d4861c830a 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -82,7 +82,10 @@ Item case "error": return UM.Theme.getColor("status_stopped"); } - + if(base.activePrintJob == null) + { + return UM.Theme.getColor("text"); + } switch(base.activePrintJob.state) { case "printing": From 51c4062f1b4649833036f9d5cd2bbcbc0ca35947 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 30 Nov 2017 15:17:08 +0100 Subject: [PATCH 066/205] Limit the amount of emits happening for PrintJobs changed CL-541 --- .../ClusterUM3OutputDevice.py | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index b64716c958..8114a3eef5 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -223,6 +223,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Received an invalid print jobs message: Not valid JSON.") return print_jobs_seen = [] + job_list_changed = False for print_job_data in result: print_job = None for job in self._print_jobs: @@ -234,6 +235,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), key = print_job_data["uuid"], name = print_job_data["name"]) + job_list_changed = True + self._print_jobs.append(print_job) print_job.updateTimeTotal(print_job_data["time_total"]) print_job.updateTimeElapsed(print_job_data["time_elapsed"]) print_job.updateState(print_job_data["status"]) @@ -250,13 +253,18 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateActivePrintJob(print_job) print_jobs_seen.append(print_job) - for old_job in self._print_jobs: - if old_job not in print_jobs_seen and old_job.assignedPrinter: - # Print job needs to be removed. - old_job.assignedPrinter.updateActivePrintJob(None) - self._print_jobs = print_jobs_seen - self.printJobsChanged.emit() + # Check what jobs need to be removed. + removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] + for removed_job in removed_jobs: + if removed_job.assignedPrinter: + removed_job.assignedPrinter.updateActivePrintJob(None) + self._print_jobs.remove(removed_job) + job_list_changed = True + + # Do a single emit for all print job changes. + if job_list_changed: + self.printJobsChanged.emit() def _onGetPrintersDataFinished(self, reply: QNetworkReply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) From 77e3965fc7ca3771bc421dac564849c95c48df52 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 14:59:20 +0100 Subject: [PATCH 067/205] Added videostream to cluster again CL-541 --- cura/CameraImageProvider.py | 2 +- cura/PrinterOutput/NetworkCamera.py | 113 ++++++++++++++++++ cura/PrinterOutput/PrinterOutputModel.py | 12 ++ .../ClusterUM3OutputDevice.py | 2 + .../UM3NetworkPrinting/PrinterVideoStream.qml | 16 ++- 5 files changed, 139 insertions(+), 6 deletions(-) create mode 100644 cura/PrinterOutput/NetworkCamera.py diff --git a/cura/CameraImageProvider.py b/cura/CameraImageProvider.py index ff66170f3c..ddf978f625 100644 --- a/cura/CameraImageProvider.py +++ b/cura/CameraImageProvider.py @@ -12,7 +12,7 @@ class CameraImageProvider(QQuickImageProvider): def requestImage(self, id, size): for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): try: - return output_device.getCameraImage(), QSize(15, 15) + return output_device.activePrinter.camera.getImage(), QSize(15, 15) except AttributeError: pass return QImage(), QSize(15, 15) \ No newline at end of file diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py new file mode 100644 index 0000000000..5cb76d2876 --- /dev/null +++ b/cura/PrinterOutput/NetworkCamera.py @@ -0,0 +1,113 @@ +from UM.Logger import Logger + +from PyQt5.QtCore import QUrl, pyqtProperty, pyqtSignal, QObject, pyqtSlot +from PyQt5.QtGui import QImage +from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManager + + +class NetworkCamera(QObject): + newImage = pyqtSignal() + + def __init__(self, target = None, parent = None): + super().__init__(parent) + self._stream_buffer = b"" + self._stream_buffer_start_index = -1 + self._manager = None + self._image_request = None + self._image_reply = None + self._image = QImage() + self._image_id = 0 + + self._target = target + self._started = False + + @pyqtSlot(str) + def setTarget(self, target): + restart_required = False + if self._started: + self.stop() + restart_required = True + + self._target = target + + if restart_required: + self.start() + + @pyqtProperty(QUrl, notify=newImage) + def latestImage(self): + self._image_id += 1 + # There is an image provider that is called "camera". In order to ensure that the image qml object, that + # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl + # as new (instead of relying on cached version and thus forces an update. + temp = "image://camera/" + str(self._image_id) + + return QUrl(temp, QUrl.TolerantMode) + + @pyqtSlot() + def start(self): + if self._target is None: + Logger.log("w", "Unable to start camera stream without target!") + return + self._started = True + url = QUrl(self._target) + self._image_request = QNetworkRequest(url) + if self._manager is None: + self._manager = QNetworkAccessManager() + + self._image_reply = self._manager.get(self._image_request) + self._image_reply.downloadProgress.connect(self._onStreamDownloadProgress) + + @pyqtSlot() + def stop(self): + self._manager = None + + self._stream_buffer = b"" + self._stream_buffer_start_index = -1 + + if self._image_reply: + try: + # disconnect the signal + try: + self._image_reply.downloadProgress.disconnect(self._onStreamDownloadProgress) + except Exception: + pass + # abort the request if it's not finished + if not self._image_reply.isFinished(): + self._image_reply.close() + except Exception as e: # RuntimeError + pass # It can happen that the wrapped c++ object is already deleted. + + self._image_reply = None + self._image_request = None + + self._started = False + + def getImage(self): + return self._image + + def _onStreamDownloadProgress(self, bytes_received, bytes_total): + # An MJPG stream is (for our purpose) a stream of concatenated JPG images. + # JPG images start with the marker 0xFFD8, and end with 0xFFD9 + if self._image_reply is None: + return + self._stream_buffer += self._image_reply.readAll() + + if len(self._stream_buffer) > 2000000: # No single camera frame should be 2 Mb or larger + Logger.log("w", "MJPEG buffer exceeds reasonable size. Restarting stream...") + self.stop() # resets stream buffer and start index + self.start() + return + + if self._stream_buffer_start_index == -1: + self._stream_buffer_start_index = self._stream_buffer.indexOf(b'\xff\xd8') + stream_buffer_end_index = self._stream_buffer.lastIndexOf(b'\xff\xd9') + # If this happens to be more than a single frame, then so be it; the JPG decoder will + # ignore the extra data. We do it like this in order not to get a buildup of frames + + if self._stream_buffer_start_index != -1 and stream_buffer_end_index != -1: + jpg_data = self._stream_buffer[self._stream_buffer_start_index:stream_buffer_end_index + 2] + self._stream_buffer = self._stream_buffer[stream_buffer_end_index + 2:] + self._stream_buffer_start_index = -1 + self._image.loadFromData(jpg_data) + + self.newImage.emit() diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index cb2dc15ea0..aaf9b48968 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -22,6 +22,7 @@ class PrinterOutputModel(QObject): headPositionChanged = pyqtSignal() keyChanged = pyqtSignal() typeChanged = pyqtSignal() + cameraChanged = pyqtSignal() def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): super().__init__(parent) @@ -38,6 +39,17 @@ class PrinterOutputModel(QObject): self._type = "" + self._camera = None + + def setCamera(self, camera): + if self._camera is not camera: + self._camera = camera + self.cameraChanged.emit() + + @pyqtProperty(QObject, notify=cameraChanged) + def camera(self): + return self._camera + @pyqtProperty(str, notify = typeChanged) def type(self): return self._type diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 8114a3eef5..6403bdf14d 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -12,6 +12,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from cura.PrinterOutput.NetworkCamera import NetworkCamera from .ClusterUM3PrinterOutputController import ClusterUM3PrinterOutputController @@ -290,6 +291,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if printer is None: printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), number_of_extruders=self._number_of_extruders) + printer.setCamera(NetworkCamera("http://" + printer_data["ip_address"] + ":8080/?action=stream")) self._printers.append(printer) printer_list_changed = True diff --git a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml index d0a9e08232..3e6f6a8fd8 100644 --- a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml @@ -32,7 +32,7 @@ Item width: 20 * screenScaleFactor height: 20 * screenScaleFactor - onClicked: OutputDevice.selectAutomaticPrinter() + onClicked: OutputDevice.setActivePrinter(null) style: ButtonStyle { @@ -65,17 +65,23 @@ Item { if(visible) { - OutputDevice.startCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.start() + } } else { - OutputDevice.stopCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.stop() + } } } source: { - if(OutputDevice.cameraImage) + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) { - return OutputDevice.cameraImage; + return OutputDevice.activePrinter.camera.latestImage; } return ""; } From ba782b346f75a0d802a0a52920d0517b60f6e5a6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 16:41:07 +0100 Subject: [PATCH 068/205] Fixed re-requesting authentication CL-541 --- .../UM3NetworkPrinting/LegacyUM3OutputDevice.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index d89efc2acc..8de18443a7 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -2,6 +2,7 @@ from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutp from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel +from cura.PrinterOutput.NetworkCamera import NetworkCamera from cura.Settings.ContainerManager import ContainerManager from cura.Settings.ExtruderManager import ExtruderManager @@ -91,7 +92,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): title=i18n_catalog.i18nc("@info:title", "Authentication Status")) self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) - self._authentication_failed_message.actionTriggered.connect(self._requestAuthentication) + self._authentication_failed_message.actionTriggered.connect(self._messageCallback) self._authentication_succeeded_message = Message( i18n_catalog.i18nc("@info:status", "Access to the printer accepted"), title=i18n_catalog.i18nc("@info:title", "Authentication Status")) @@ -102,7 +103,17 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._not_authenticated_message.addAction("Request", i18n_catalog.i18nc("@action:button", "Request Access"), None, i18n_catalog.i18nc("@info:tooltip", "Send access request to the printer")) - self._not_authenticated_message.actionTriggered.connect(self._requestAuthentication) + self._not_authenticated_message.actionTriggered.connect(self._messageCallback) + + def _messageCallback(self, message_id=None, action_id="Retry"): + if action_id == "Request" or action_id == "Retry": + if self._authentication_failed_message: + self._authentication_failed_message.hide() + if self._not_authenticated_message: + self._not_authenticated_message.hide() + + self._requestAuthentication() + pass # Cura Connect doesn't do any authorization def connect(self): super().connect() @@ -530,6 +541,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): if not self._printers: self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders)] + self._printers[0].setCamera(NetworkCamera("http://" + self._address + ":8080/?action=stream")) self.printersChanged.emit() # LegacyUM3 always has a single printer. From b3a3c1e371c7133d9f4a3f9e21271f60d304c182 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 16:46:33 +0100 Subject: [PATCH 069/205] Camera image is now actually displayed for Legacy CL-541 --- .../LegacyUM3OutputDevice.py | 5 ++- plugins/UM3NetworkPrinting/MonitorItem.qml | 31 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 8de18443a7..5597e03d44 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -22,7 +22,7 @@ from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController from time import time import json - +import os i18n_catalog = i18nCatalog("cura") @@ -72,6 +72,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self.setIconName("print") + self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "MonitorItem.qml") + + self._output_controller = LegacyUM3PrinterOutputController(self) def _onAuthenticationStateChanged(self): diff --git a/plugins/UM3NetworkPrinting/MonitorItem.qml b/plugins/UM3NetworkPrinting/MonitorItem.qml index f69df41dd4..09e427ff6f 100644 --- a/plugins/UM3NetworkPrinting/MonitorItem.qml +++ b/plugins/UM3NetworkPrinting/MonitorItem.qml @@ -9,35 +9,32 @@ Component Image { id: cameraImage - property bool proportionalHeight: - { - if(sourceSize.height == 0 || maximumHeight == 0) - { - return true; - } - return (sourceSize.width / sourceSize.height) > (maximumWidth / maximumHeight); - } - property real _width: Math.floor(Math.min(maximumWidth, sourceSize.width)) - property real _height: Math.floor(Math.min(maximumHeight, sourceSize.height)) - width: proportionalHeight ? _width : Math.floor(sourceSize.width * _height / sourceSize.height) - height: !proportionalHeight ? _height : Math.floor(sourceSize.height * _width / sourceSize.width) + width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth) + height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width) anchors.horizontalCenter: parent.horizontalCenter - + anchors.verticalCenter: parent.verticalCenter + z: 1 onVisibleChanged: { if(visible) { - OutputDevice.startCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.start() + } } else { - OutputDevice.stopCamera() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.stop() + } } } source: { - if(OutputDevice.cameraImage) + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) { - return OutputDevice.cameraImage; + return OutputDevice.activePrinter.camera.latestImage; } return ""; } From 73bae3754416a2c22e4dd3cd6e7e51f75af62261 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 16:58:41 +0100 Subject: [PATCH 070/205] Added missing string to verification failed Message CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 5597e03d44..384e51bfce 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -91,7 +91,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): title=i18n_catalog.i18nc("@info:title", "Authentication status")) - self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), + self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", "Authentication failed"), title=i18n_catalog.i18nc("@info:title", "Authentication Status")) self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) From 4ba551a3af5b9ff0240cbccfab8a160d46164220 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 6 Dec 2017 17:02:35 +0100 Subject: [PATCH 071/205] Prevent crash when switching away from monitor tab CL-541 --- cura/PrinterOutput/NetworkCamera.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index 5cb76d2876..bffd318f41 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -59,7 +59,6 @@ class NetworkCamera(QObject): @pyqtSlot() def stop(self): - self._manager = None self._stream_buffer = b"" self._stream_buffer_start_index = -1 @@ -80,6 +79,8 @@ class NetworkCamera(QObject): self._image_reply = None self._image_request = None + self._manager = None + self._started = False def getImage(self): From a8695db1c898ae26821ef8280d382a0be10a7507 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 10:44:05 +0100 Subject: [PATCH 072/205] Fixed displaying of icons in monitor stage tab CL-541 --- plugins/MonitorStage/MonitorStage.py | 47 ++++++++++++++++------------ 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 0736f49858..21d5bb6cde 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -40,34 +40,41 @@ class MonitorStage(CuraStage): ## Find the correct status icon depending on the active output device state def _getActiveOutputDeviceStatusIcon(self): - output_device = Application.getInstance().getOutputDeviceManager().getActiveDevice() - - if not output_device: + # We assume that you are monitoring the device with the highest priority. + try: + output_device = Application.getInstance().getMachineManager().printerOutputDevices[0] + except IndexError: return "tab_status_unknown" - if hasattr(output_device, "acceptsCommands") and not output_device.acceptsCommands: + if not output_device.acceptsCommands: return "tab_status_unknown" - if not hasattr(output_device, "printerState") or not hasattr(output_device, "jobState"): - return "tab_status_unknown" - - # TODO: refactor to use enum instead of hardcoded strings? - if output_device.printerState == "maintenance": - return "tab_status_busy" - - if output_device.jobState in ["printing", "pre_print", "pausing", "resuming"]: - return "tab_status_busy" - - if output_device.jobState == "wait_cleanup": - return "tab_status_finished" - - if output_device.jobState in ["ready", ""]: + if output_device.activePrinter is None: return "tab_status_connected" - if output_device.jobState == "paused": + # TODO: refactor to use enum instead of hardcoded strings? + if output_device.activePrinter.state == "maintenance": + return "tab_status_busy" + + if output_device.state == "maintenance": + return "tab_status_busy" + + if output_device.activePrinter.activeJob is None: + return "tab_status_connected" + + if output_device.activePrinter.activeJob.state in ["printing", "pre_print", "pausing", "resuming"]: + return "tab_status_busy" + + if output_device.activePrinter.activeJob.state == "wait_cleanup": + return "tab_status_finished" + + if output_device.activePrinter.activeJob.state in ["ready", ""]: + return "tab_status_connected" + + if output_device.activePrinter.activeJob.state == "paused": return "tab_status_paused" - if output_device.jobState == "error": + if output_device.activePrinter.activeJob.state == "error": return "tab_status_stopped" return "tab_status_unknown" From 9ccd643f64cceb47e500cdf72fbe2dc2dfe46000 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 14:36:53 +0100 Subject: [PATCH 073/205] Repaired the monitor icon not being updated CL-541 --- cura/PrinterOutputDevice.py | 2 +- cura/Settings/MachineManager.py | 3 +- plugins/MonitorStage/MonitorMainView.qml | 1 - plugins/MonitorStage/MonitorStage.py | 88 +++++++++++++++---- .../LegacyUM3OutputDevice.py | 9 +- 5 files changed, 76 insertions(+), 27 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 2126e791d3..91b981f3b6 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -143,7 +143,7 @@ class PrinterOutputDevice(QObject, OutputDevice): if self._accepts_commands != accepts_commands: self._accepts_commands = accepts_commands - self.acceptsCommandsChanged.emit() + self.acceptsCommandsChanged.emit() ## The current processing state of the backend. diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c53fa15f1a..7920e89232 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -137,8 +137,7 @@ class MachineManager(QObject): printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged)''' - self._printer_output_devices.clear() - + self._printer_output_devices = [] for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): if isinstance(printer_output_device, PrinterOutputDevice): self._printer_output_devices.append(printer_output_device) diff --git a/plugins/MonitorStage/MonitorMainView.qml b/plugins/MonitorStage/MonitorMainView.qml index 038403e6d3..fad76cba30 100644 --- a/plugins/MonitorStage/MonitorMainView.qml +++ b/plugins/MonitorStage/MonitorMainView.qml @@ -16,7 +16,6 @@ Item color: UM.Theme.getColor("viewport_overlay") width: parent.width height: parent.height - visible: monitorViewComponent.sourceComponent == null ? 1 : 0 MouseArea { diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 21d5bb6cde..ad63e65943 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -14,26 +14,79 @@ class MonitorStage(CuraStage): super().__init__(parent) # Wait until QML engine is created, otherwise creating the new QML components will fail - Application.getInstance().engineCreatedSignal.connect(self._setComponents) + Application.getInstance().engineCreatedSignal.connect(self._onEngineCreated) + self._printer_output_device = None - # Update the status icon when the output device is changed - Application.getInstance().getOutputDeviceManager().activeDeviceChanged.connect(self._setIconSource) + self._active_print_job = None + self._active_printer = None - def _setComponents(self): - self._setMainOverlay() - self._setSidebar() - self._setIconSource() + def _setActivePrintJob(self, print_job): + if self._active_print_job != print_job: + if self._active_print_job: + self._active_printer.stateChanged.disconnect(self._updateIconSource) + self._active_print_job = print_job + if self._active_print_job: + self._active_print_job.stateChanged.connect(self._updateIconSource) - def _setMainOverlay(self): + # Ensure that the right icon source is returned. + self._updateIconSource() + + def _setActivePrinter(self, printer): + if self._active_printer != printer: + if self._active_printer: + self._active_printer.activePrintJobChanged.disconnect(self._onActivePrintJobChanged) + self._active_printer = printer + if self._active_printer: + self._setActivePrintJob(self._active_printer.activePrintJob) + # Jobs might change, so we need to listen to it's changes. + self._active_printer.activePrintJobChanged.connect(self._onActivePrintJobChanged) + else: + self._setActivePrintJob(None) + + # Ensure that the right icon source is returned. + self._updateIconSource() + + def _onActivePrintJobChanged(self): + self._setActivePrintJob(self._active_printer.activePrintJob) + + def _onActivePrinterChanged(self): + self._setActivePrinter(self._printer_output_device.activePrinter) + + def _onOutputDevicesChanged(self): + try: + # We assume that you are monitoring the device with the highest priority. + new_output_device = Application.getInstance().getMachineManager().printerOutputDevices[0] + if new_output_device != self._printer_output_device: + if self._printer_output_device: + self._printer_output_device.acceptsCommandsChanged.disconnect(self._updateIconSource) + self._printer_output_device.printersChanged.disconnect(self._onActivePrinterChanged) + + self._printer_output_device = new_output_device + + self._printer_output_device.acceptsCommandsChanged.connect(self._updateIconSource) + self._printer_output_device.printersChanged.connect(self._onActivePrinterChanged) + self._setActivePrinter(self._printer_output_device.activePrinter) + + except IndexError: + pass + + def _onEngineCreated(self): + # We can only connect now, as we need to be sure that everything is loaded (plugins get created quite early) + Application.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + self._updateMainOverlay() + self._updateSidebar() + self._updateIconSource() + + def _updateMainOverlay(self): main_component_path = os.path.join(PluginRegistry.getInstance().getPluginPath("MonitorStage"), "MonitorMainView.qml") self.addDisplayComponent("main", main_component_path) - def _setSidebar(self): + def _updateSidebar(self): # TODO: currently the sidebar component for prepare and monitor stages is the same, this will change with the printer output device refactor! sidebar_component_path = os.path.join(Resources.getPath(Application.getInstance().ResourceTypes.QmlFiles), "Sidebar.qml") self.addDisplayComponent("sidebar", sidebar_component_path) - def _setIconSource(self): + def _updateIconSource(self): if Application.getInstance().getTheme() is not None: icon_name = self._getActiveOutputDeviceStatusIcon() self.setIconSource(Application.getInstance().getTheme().getIcon(icon_name)) @@ -56,25 +109,22 @@ class MonitorStage(CuraStage): if output_device.activePrinter.state == "maintenance": return "tab_status_busy" - if output_device.state == "maintenance": - return "tab_status_busy" - - if output_device.activePrinter.activeJob is None: + if output_device.activePrinter.activePrintJob is None: return "tab_status_connected" - if output_device.activePrinter.activeJob.state in ["printing", "pre_print", "pausing", "resuming"]: + if output_device.activePrinter.activePrintJob.state in ["printing", "pre_print", "pausing", "resuming"]: return "tab_status_busy" - if output_device.activePrinter.activeJob.state == "wait_cleanup": + if output_device.activePrinter.activePrintJob.state == "wait_cleanup": return "tab_status_finished" - if output_device.activePrinter.activeJob.state in ["ready", ""]: + if output_device.activePrinter.activePrintJob.state in ["ready", ""]: return "tab_status_connected" - if output_device.activePrinter.activeJob.state == "paused": + if output_device.activePrinter.activePrintJob.state == "paused": return "tab_status_paused" - if output_device.activePrinter.activeJob.state == "error": + if output_device.activePrinter.activePrintJob.state == "error": return "tab_status_stopped" return "tab_status_unknown" diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 384e51bfce..268debbf7c 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -91,7 +91,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): title=i18n_catalog.i18nc("@info:title", "Authentication status")) - self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", "Authentication failed"), + self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), title=i18n_catalog.i18nc("@info:title", "Authentication Status")) self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) @@ -352,7 +352,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return warnings - def _update(self): if not super()._update(): return @@ -401,10 +400,12 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_id = None self._authentication_key = None self.setAuthenticationState(AuthState.NotAuthenticated) - elif status_code == 403: + elif status_code == 403 and self._authentication_state != AuthState.Authenticated: + # If we were already authenticated, we probably got an older message back all of the sudden. Drop that. Logger.log("d", - "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s", + "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s. ", self._authentication_state) + print(reply.readAll()) self.setAuthenticationState(AuthState.AuthenticationDenied) self._authentication_failed_message.show() elif status_code == 200: From ae629e2968fbbd251c779db82a806e8432d4dd30 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 14:59:14 +0100 Subject: [PATCH 074/205] Fixed camera for legacy UM3 printer again CL-541 --- cura/PrinterOutput/NetworkCamera.py | 1 - cura/PrinterOutputDevice.py | 1 - .../LegacyUM3OutputDevice.py | 1 - plugins/UM3NetworkPrinting/MonitorItem.qml | 48 ++++++++++++------- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index bffd318f41..b81914ca7d 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -59,7 +59,6 @@ class NetworkCamera(QObject): @pyqtSlot() def stop(self): - self._stream_buffer = b"" self._stream_buffer_start_index = -1 diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 91b981f3b6..fdf9a77145 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -97,7 +97,6 @@ class PrinterOutputDevice(QObject, OutputDevice): # create the item (and fail) every time. if not self._monitor_component: self._createMonitorViewFromQML() - return self._monitor_item @pyqtProperty(QObject, constant=True) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 268debbf7c..c7fdf9bdc6 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -74,7 +74,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "MonitorItem.qml") - self._output_controller = LegacyUM3PrinterOutputController(self) def _onAuthenticationStateChanged(self): diff --git a/plugins/UM3NetworkPrinting/MonitorItem.qml b/plugins/UM3NetworkPrinting/MonitorItem.qml index 09e427ff6f..bbbc3feee6 100644 --- a/plugins/UM3NetworkPrinting/MonitorItem.qml +++ b/plugins/UM3NetworkPrinting/MonitorItem.qml @@ -6,37 +6,49 @@ import Cura 1.0 as Cura Component { - Image + Item { - id: cameraImage - width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth) - height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width) - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - z: 1 - onVisibleChanged: + width: maximumWidth + height: maximumHeight + Image { - if(visible) + id: cameraImage + width: Math.min(sourceSize.width === 0 ? 800 * screenScaleFactor : sourceSize.width, maximumWidth) + height: Math.floor((sourceSize.height === 0 ? 600 * screenScaleFactor : sourceSize.height) * width / sourceSize.width) + anchors.horizontalCenter: parent.horizontalCenter + anchors.verticalCenter: parent.verticalCenter + z: 1 + Component.onCompleted: { if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) { OutputDevice.activePrinter.camera.start() } - } else + } + onVisibleChanged: { - if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + if(visible) { - OutputDevice.activePrinter.camera.stop() + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.start() + } + } else + { + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null) + { + OutputDevice.activePrinter.camera.stop() + } } } - } - source: - { - if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) + source: { - return OutputDevice.activePrinter.camera.latestImage; + if(OutputDevice.activePrinter != null && OutputDevice.activePrinter.camera != null && OutputDevice.activePrinter.camera.latestImage) + { + return OutputDevice.activePrinter.camera.latestImage; + } + return ""; } - return ""; } } } \ No newline at end of file From 1719a7b2fe53fe14a2eb68724692e5390dd326b0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 17:16:59 +0100 Subject: [PATCH 075/205] Fixed preheating for Legacy UM3 CL-541 --- cura/PrinterOutput/PrinterOutputModel.py | 20 ++++- plugins/MonitorStage/MonitorStage.py | 2 +- .../LegacyUM3OutputDevice.py | 12 ++- .../LegacyUM3PrinterOutputController.py | 63 ++++++++++++++++ resources/qml/PrinterOutput/HeatedBedBox.qml | 74 ++----------------- 5 files changed, 97 insertions(+), 74 deletions(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index aaf9b48968..0c30d8d788 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -16,6 +16,7 @@ if MYPY: class PrinterOutputModel(QObject): bedTemperatureChanged = pyqtSignal() targetBedTemperatureChanged = pyqtSignal() + isPreheatingChanged = pyqtSignal() stateChanged = pyqtSignal() activePrintJobChanged = pyqtSignal() nameChanged = pyqtSignal() @@ -24,7 +25,7 @@ class PrinterOutputModel(QObject): typeChanged = pyqtSignal() cameraChanged = pyqtSignal() - def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None): + def __init__(self, output_controller: "PrinterOutputController", number_of_extruders: int = 1, parent=None, firmware_version = ""): super().__init__(parent) self._bed_temperature = -1 # Use -1 for no heated bed. self._target_bed_temperature = 0 @@ -34,18 +35,31 @@ class PrinterOutputModel(QObject): self._extruders = [ExtruderOutputModel(printer=self) for i in range(number_of_extruders)] self._head_position = Vector(0, 0, 0) self._active_print_job = None # type: Optional[PrintJobOutputModel] - + self._firmware_version = firmware_version self._printer_state = "unknown" - + self._is_preheating = False self._type = "" self._camera = None + @pyqtProperty(str, constant = True) + def firmwareVersion(self): + return self._firmware_version + def setCamera(self, camera): if self._camera is not camera: self._camera = camera self.cameraChanged.emit() + def updateIsPreheating(self, pre_heating): + if self._is_preheating != pre_heating: + self._is_preheating = pre_heating + self.isPreheatingChanged.emit() + + @pyqtProperty(bool, notify=isPreheatingChanged) + def isPreheating(self): + return self._is_preheating + @pyqtProperty(QObject, notify=cameraChanged) def camera(self): return self._camera diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index ad63e65943..f223ef1844 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -23,7 +23,7 @@ class MonitorStage(CuraStage): def _setActivePrintJob(self, print_job): if self._active_print_job != print_job: if self._active_print_job: - self._active_printer.stateChanged.disconnect(self._updateIconSource) + self._active_print_job.stateChanged.disconnect(self._updateIconSource) self._active_print_job = print_job if self._active_print_job: self._active_print_job.stateChanged.connect(self._updateIconSource) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index c7fdf9bdc6..967c99995e 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -543,7 +543,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return if not self._printers: - self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders)] + # Quickest way to get the firmware version is to grab it from the zeroconf. + firmware_version = self._properties.get(b"firmware_version", b"").decode("utf-8") + self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders, firmware_version=firmware_version)] self._printers[0].setCamera(NetworkCamera("http://" + self._address + ":8080/?action=stream")) self.printersChanged.emit() @@ -553,6 +555,14 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"]) printer.updateState(result["status"]) + try: + # If we're still handling the request, we should ignore remote for a bit. + if not printer.getController().isPreheatRequestInProgress(): + printer.updateIsPreheating(result["bed"]["pre_heat"]["active"]) + except KeyError: + # Older firmwares don't support preheating, so we need to fake it. + pass + head_position = result["heads"][0]["position"] printer.updateHeadPosition(head_position["x"], head_position["y"], head_position["z"]) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index 54c126e5cc..c476673353 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -2,6 +2,8 @@ # Cura is released under the terms of the LGPLv3 or higher. from cura.PrinterOutput.PrinterOutputController import PrinterOutputController +from PyQt5.QtCore import QTimer +from UM.Version import Version MYPY = False if MYPY: @@ -12,11 +14,33 @@ if MYPY: class LegacyUM3PrinterOutputController(PrinterOutputController): def __init__(self, output_device): super().__init__(output_device) + self._preheat_bed_timer = QTimer() + self._preheat_bed_timer.setSingleShot(True) + self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) + self._preheat_printer = None + # Are we still waiting for a response about preheat? + # We need this so we can already update buttons, so it feels more snappy. + self._preheat_request_in_progress = False + + def isPreheatRequestInProgress(self): + return self._preheat_request_in_progress def setJobState(self, job: "PrintJobOutputModel", state: str): data = "{\"target\": \"%s\"}" % state self._output_device.put("print_job/state", data, onFinished=None) + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + data = str(temperature) + self._output_device.put("printer/bed/temperature/target", data, onFinished=self._onPutBedTemperatureCompleted) + + def _onPutBedTemperatureCompleted(self, reply): + if Version(self._preheat_printer.firmwareVersion) < Version("3.5.92"): + # If it was handling a preheat, it isn't anymore. + self._preheat_request_in_progress = False + + def _onPutPreheatBedCompleted(self, reply): + self._preheat_request_in_progress = False + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): head_pos = printer._head_position new_x = head_pos.x + x @@ -27,3 +51,42 @@ class LegacyUM3PrinterOutputController(PrinterOutputController): def homeBed(self, printer): self._output_device.put("printer/heads/0/position/z", "0", onFinished=None) + + def _onPreheatBedTimerFinished(self): + self.setTargetBedTemperature(self._preheat_printer, 0) + self._preheat_printer.updateIsPreheating(False) + self._preheat_request_in_progress = True + + def cancelPreheatBed(self, printer: "PrinterOutputModel"): + self.preheatBed(printer, temperature=0, duration=0) + self._preheat_bed_timer.stop() + printer.updateIsPreheating(False) + + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + try: + temperature = round(temperature) # The API doesn't allow floating point. + duration = round(duration) + except ValueError: + return # Got invalid values, can't pre-heat. + + if duration > 0: + data = """{"temperature": "%i", "timeout": "%i"}""" % (temperature, duration) + else: + data = """{"temperature": "%i"}""" % temperature + + # Real bed pre-heating support is implemented from 3.5.92 and up. + + if Version(printer.firmwareVersion) < Version("3.5.92"): + # No firmware-side duration support then, so just set target bed temp and set a timer. + self.setTargetBedTemperature(printer, temperature=temperature) + self._preheat_bed_timer.setInterval(duration * 1000) + self._preheat_bed_timer.start() + self._preheat_printer = printer + printer.updateIsPreheating(True) + return + + self._output_device.put("printer/bed/pre_heat", data, onFinished = self._onPutPreheatBedCompleted) + printer.updateIsPreheating(True) + self._preheat_request_in_progress = True + + diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index 5f09160708..65c2a161bd 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -136,15 +136,6 @@ Item color: UM.Theme.getColor("setting_control_highlight") opacity: preheatTemperatureControl.hovered ? 1.0 : 0 } - Label //Maximum temperature indication. - { - text: (bedTemperature.properties.maximum_value != "None" ? bedTemperature.properties.maximum_value : "") + "°C" - color: UM.Theme.getColor("setting_unit") - font: UM.Theme.getFont("default") - anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("setting_unit_margin").width - anchors.verticalCenter: parent.verticalCenter - } MouseArea //Change cursor on hovering. { id: preheatTemperatureInputMouseArea @@ -204,58 +195,6 @@ Item } } - UM.RecolorImage - { - id: preheatCountdownIcon - width: UM.Theme.getSize("save_button_specs_icons").width - height: UM.Theme.getSize("save_button_specs_icons").height - sourceSize.width: width - sourceSize.height: height - color: UM.Theme.getColor("text") - visible: preheatCountdown.visible - source: UM.Theme.getIcon("print_time") - anchors.right: preheatCountdown.left - anchors.rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) - anchors.verticalCenter: preheatCountdown.verticalCenter - } - - Timer - { - id: preheatUpdateTimer - interval: 100 //Update every 100ms. You want to update every 1s, but then you have one timer for the updating running out of sync with the actual date timer and you might skip seconds. - running: printerModel != null && printerModel.preheatBedRemainingTime != "" - repeat: true - onTriggered: update() - property var endTime: new Date() //Set initial endTime to be the current date, so that the endTime has initially already passed and the timer text becomes invisible if you were to update. - function update() - { - if(printerModel != null && !printerModel.canPreHeatBed) - { - return // Nothing to do, printer cant preheat at all! - } - preheatCountdown.text = "" - if (printerModel != null && connectedPrinter.preheatBedRemainingTime != null) - { - preheatCountdown.text = connectedPrinter.preheatBedRemainingTime; - } - if (preheatCountdown.text == "") //Either time elapsed or not connected. - { - stop(); - } - } - } - Label - { - id: preheatCountdown - text: printerModel != null ? printerModel.preheatBedRemainingTime : "" - visible: text != "" //Has no direct effect, but just so that we can link visibility of clock icon to visibility of the countdown text. - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - anchors.right: preheatButton.left - anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.verticalCenter: preheatButton.verticalCenter - } - Button //The pre-heat button. { id: preheatButton @@ -267,9 +206,9 @@ Item { return false; //Not connected, not authenticated or printer is busy. } - if (preheatUpdateTimer.running) + if (printerModel.isPreheating) { - return true; //Can always cancel if the timer is running. + return true; } if (bedTemperature.properties.minimum_value != "None" && Math.floor(preheatTemperatureInput.text) < Math.floor(bedTemperature.properties.minimum_value)) { @@ -363,23 +302,20 @@ Item } } font: UM.Theme.getFont("action_button") - text: preheatUpdateTimer.running ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") + text: printerModel.isPreheating ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") } } } onClicked: { - if (!preheatUpdateTimer.running) + if (!printerModel.isPreheating) { - printerModel.preheatBed(preheatTemperatureInput.text, printerModel.preheatBedTimeout); - preheatUpdateTimer.start(); - preheatUpdateTimer.update(); //Update once before the first timer is triggered. + printerModel.preheatBed(preheatTemperatureInput.text, 900); } else { printerModel.cancelPreheatBed(); - preheatUpdateTimer.update(); } } From 6ad82ee1b04b1e3c83faf6d3eba26d25fcbfdfd6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 8 Dec 2017 17:32:22 +0100 Subject: [PATCH 076/205] Added missing name & description for ClusterOutputDevice CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 6403bdf14d..ba82da64c3 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -62,6 +62,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._active_printer = None # type: Optional[PrinterOutputModel] + self.setPriority(3) # Make sure the output device gets selected above local file output + self.setName(self._id) + self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) + self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + @pyqtProperty(QObject, notify=activePrinterChanged) def controlItem(self): if self._active_printer is None: From 8bc9663294c7253f0bea512e16011b573dc47688 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 12 Dec 2017 10:28:55 +0100 Subject: [PATCH 077/205] Removed old & unused code CL-541 --- .../NetworkClusterPrinterOutputDevice.py | 716 --------- .../NetworkPrinterOutputDevice.py | 1306 ----------------- .../NetworkPrinterOutputDevicePlugin.py | 357 ----- plugins/UM3NetworkPrinting/__init__.py | 4 +- 4 files changed, 2 insertions(+), 2381 deletions(-) delete mode 100644 plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py delete mode 100755 plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py delete mode 100644 plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py deleted file mode 100644 index 853ef72f72..0000000000 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ /dev/null @@ -1,716 +0,0 @@ -import datetime -import getpass -import gzip -import json -import os -import os.path -import time - -from enum import Enum -from PyQt5.QtNetwork import QNetworkRequest, QHttpPart, QHttpMultiPart -from PyQt5.QtCore import QUrl, pyqtSlot, pyqtProperty, QCoreApplication, QTimer, pyqtSignal, QObject -from PyQt5.QtGui import QDesktopServices -from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply -from UM.Application import Application -from UM.Logger import Logger -from UM.Message import Message -from UM.OutputDevice import OutputDeviceError -from UM.i18n import i18nCatalog -from UM.Qt.Duration import Duration, DurationFormat -from UM.PluginRegistry import PluginRegistry - -from . import NetworkPrinterOutputDevice - - -i18n_catalog = i18nCatalog("cura") - - -class OutputStage(Enum): - ready = 0 - uploading = 2 - - -class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinterOutputDevice): - printJobsChanged = pyqtSignal() - printersChanged = pyqtSignal() - selectedPrinterChanged = pyqtSignal() - - def __init__(self, key, address, properties, api_prefix): - super().__init__(key, address, properties, api_prefix) - # Store the address of the master. - self._master_address = address - name_property = properties.get(b"name", b"") - if name_property: - name = name_property.decode("utf-8") - else: - name = key - - self._authentication_state = NetworkPrinterOutputDevice.AuthState.Authenticated # The printer is always authenticated - - self.setName(name) - description = i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network") - self.setShortDescription(description) - self.setDescription(description) - - self._stage = OutputStage.ready - host_override = os.environ.get("CLUSTER_OVERRIDE_HOST", "") - if host_override: - Logger.log( - "w", - "Environment variable CLUSTER_OVERRIDE_HOST is set to [%s], cluster hosts are now set to this host", - host_override) - self._host = "http://" + host_override - else: - self._host = "http://" + address - - # is the same as in NetworkPrinterOutputDevicePlugin - self._cluster_api_version = "1" - self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/" - self._api_base_uri = self._host + self._cluster_api_prefix - - self._file_name = None - self._progress_message = None - self._request = None - self._reply = None - - # The main reason to keep the 'multipart' form data on the object - # is to prevent the Python GC from claiming it too early. - self._multipart = None - - self._print_view = None - self._request_job = [] - - self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") - self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") - - self._print_jobs = [] - self._print_job_by_printer_uuid = {} - self._print_job_by_uuid = {} # Print jobs by their own uuid - self._printers = [] - self._printers_dict = {} # by unique_name - - self._connected_printers_type_count = [] - self._automatic_printer = {"unique_name": "", "friendly_name": "Automatic"} # empty unique_name IS automatic selection - self._selected_printer = self._automatic_printer - - self._cluster_status_update_timer = QTimer() - self._cluster_status_update_timer.setInterval(5000) - self._cluster_status_update_timer.setSingleShot(False) - self._cluster_status_update_timer.timeout.connect(self._requestClusterStatus) - - self._can_pause = True - self._can_abort = True - self._can_pre_heat_bed = False - self._can_control_manually = False - self._cluster_size = int(properties.get(b"cluster_size", 0)) - - self._cleanupRequest() - - #These are texts that are to be translated for future features. - temporary_translation = i18n_catalog.i18n("This printer is not set up to host a group of connected Ultimaker 3 printers.") - temporary_translation2 = i18n_catalog.i18nc("Count is number of printers.", "This printer is the host for a group of {count} connected Ultimaker 3 printers.").format(count = 3) - temporary_translation3 = i18n_catalog.i18n("{printer_name} has finished printing '{job_name}'. Please collect the print and confirm clearing the build plate.") #When finished. - temporary_translation4 = i18n_catalog.i18n("{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing.") #When configuration changed. - - ## No authentication, so requestAuthentication should do exactly nothing - @pyqtSlot() - def requestAuthentication(self, message_id = None, action_id = "Retry"): - pass # Cura Connect doesn't do any authorization - - def setAuthenticationState(self, auth_state): - self._authentication_state = NetworkPrinterOutputDevice.AuthState.Authenticated # The printer is always authenticated - - def _verifyAuthentication(self): - pass - - def _checkAuthentication(self): - Logger.log("d", "_checkAuthentication Cura Connect - nothing to be done") - - @pyqtProperty(QObject, notify=selectedPrinterChanged) - def controlItem(self): - # TODO: Probably not the nicest way to do this. This needs to be done better at some point in time. - if not self._control_item: - self._createControlViewFromQML() - name = self._selected_printer.get("friendly_name") - if name == self._automatic_printer.get("friendly_name") or name == "": - return self._control_item - # Let cura use the default. - return None - - @pyqtSlot(int, result = str) - def getTimeCompleted(self, time_remaining): - current_time = time.time() - datetime_completed = datetime.datetime.fromtimestamp(current_time + time_remaining) - return "{hour:02d}:{minute:02d}".format(hour = datetime_completed.hour, minute = datetime_completed.minute) - - @pyqtSlot(int, result = str) - def getDateCompleted(self, time_remaining): - current_time = time.time() - datetime_completed = datetime.datetime.fromtimestamp(current_time + time_remaining) - return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() - - @pyqtProperty(int, constant = True) - def clusterSize(self): - return self._cluster_size - - @pyqtProperty(str, notify=selectedPrinterChanged) - def name(self): - # Show the name of the selected printer. - # This is not the nicest way to do this, but changes to the Cura UI are required otherwise. - name = self._selected_printer.get("friendly_name") - if name != self._automatic_printer.get("friendly_name"): - return name - # Return name of cluster master. - return self._properties.get(b"name", b"").decode("utf-8") - - def connect(self): - super().connect() - self._cluster_status_update_timer.start() - - def close(self): - super().close() - self._cluster_status_update_timer.stop() - - def _setJobState(self, job_state): - if not self._selected_printer: - return - - selected_printer_uuid = self._printers_dict[self._selected_printer["unique_name"]]["uuid"] - if selected_printer_uuid not in self._print_job_by_printer_uuid: - return - - print_job_uuid = self._print_job_by_printer_uuid[selected_printer_uuid]["uuid"] - - url = QUrl(self._api_base_uri + "print_jobs/" + print_job_uuid + "/action") - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - data = '{"action": "' + job_state + '"}' - self._manager.put(put_request, data.encode()) - - def _requestClusterStatus(self): - # TODO: Handle timeout. We probably want to know if the cluster is still reachable or not. - url = QUrl(self._api_base_uri + "printers/") - printers_request = QNetworkRequest(url) - self._addUserAgentHeader(printers_request) - self._manager.get(printers_request) - # See _finishedPrintersRequest() - - if self._printers: # if printers is not empty - url = QUrl(self._api_base_uri + "print_jobs/") - print_jobs_request = QNetworkRequest(url) - self._addUserAgentHeader(print_jobs_request) - self._manager.get(print_jobs_request) - # See _finishedPrintJobsRequest() - - def _finishedPrintJobsRequest(self, reply): - try: - json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print job state message: Not valid JSON.") - return - self.setPrintJobs(json_data) - - def _finishedPrintersRequest(self, reply): - try: - json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print job state message: Not valid JSON.") - return - self.setPrinters(json_data) - - def materialHotendChangedMessage(self, callback): - # When there is just one printer, the activate configuration option is enabled - if (self._cluster_size == 1): - super().materialHotendChangedMessage(callback = callback) - - def _startCameraStream(self): - ## Request new image - url = QUrl("http://" + self._printers_dict[self._selected_printer["unique_name"]]["ip_address"] + ":8080/?action=stream") - self._image_request = QNetworkRequest(url) - self._addUserAgentHeader(self._image_request) - self._image_reply = self._manager.get(self._image_request) - self._image_reply.downloadProgress.connect(self._onStreamDownloadProgress) - - def spawnPrintView(self): - if self._print_view is None: - path = os.path.join(self._plugin_path, "PrintWindow.qml") - self._print_view = Application.getInstance().createQmlComponent(path, {"OutputDevice", self}) - if self._print_view is not None: - self._print_view.show() - - ## Store job info, show Print view for settings - def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): - self._selected_printer = self._automatic_printer # reset to default option - self._request_job = [nodes, file_name, filter_by_machine, file_handler, kwargs] - - if self._stage != OutputStage.ready: - if self._error_message: - self._error_message.hide() - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Sending new jobs (temporarily) blocked, still sending the previous print job.")) - self._error_message.show() - return - - self.writeStarted.emit(self) # Allow postprocessing before sending data to the printer - - if len(self._printers) > 1: - self.spawnPrintView() # Ask user how to print it. - elif len(self._printers) == 1: - # If there is only one printer, don't bother asking. - self.selectAutomaticPrinter() - self.sendPrintJob() - else: - # Cluster has no printers, warn the user of this. - if self._error_message: - self._error_message.hide() - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Unable to send new print job: this 3D printer is not (yet) set up to host a group of connected Ultimaker 3 printers.")) - self._error_message.show() - - ## Actually send the print job, called from the dialog - # :param: require_printer_name: name of printer, or "" - @pyqtSlot() - def sendPrintJob(self): - nodes, file_name, filter_by_machine, file_handler, kwargs = self._request_job - require_printer_name = self._selected_printer["unique_name"] - - self._send_gcode_start = time.time() - Logger.log("d", "Sending print job [%s] to host..." % file_name) - - if self._stage != OutputStage.ready: - Logger.log("d", "Unable to send print job as the state is %s", self._stage) - raise OutputDeviceError.DeviceBusyError() - self._stage = OutputStage.uploading - - self._file_name = "%s.gcode.gz" % file_name - self._showProgressMessage() - - new_request = self._buildSendPrintJobHttpRequest(require_printer_name) - if new_request is None or self._stage != OutputStage.uploading: - return - self._request = new_request - self._reply = self._manager.post(self._request, self._multipart) - self._reply.uploadProgress.connect(self._onUploadProgress) - # See _finishedPostPrintJobRequest() - - def _buildSendPrintJobHttpRequest(self, require_printer_name): - api_url = QUrl(self._api_base_uri + "print_jobs/") - request = QNetworkRequest(api_url) - # Create multipart request and add the g-code. - self._multipart = QHttpMultiPart(QHttpMultiPart.FormDataType) - - # Add gcode - part = QHttpPart() - part.setHeader(QNetworkRequest.ContentDispositionHeader, - 'form-data; name="file"; filename="%s"' % self._file_name) - - gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") - compressed_gcode = self._compressGcode(gcode) - if compressed_gcode is None: - return None # User aborted print, so stop trying. - - part.setBody(compressed_gcode) - self._multipart.append(part) - - # require_printer_name "" means automatic - if require_printer_name: - self._multipart.append(self.__createKeyValueHttpPart("require_printer_name", require_printer_name)) - user_name = self.__get_username() - if user_name is None: - user_name = "unknown" - self._multipart.append(self.__createKeyValueHttpPart("owner", user_name)) - - self._addUserAgentHeader(request) - return request - - def _compressGcode(self, gcode): - self._compressing_print = True - batched_line = "" - max_chars_per_line = int(1024 * 1024 / 4) # 1 / 4 MB - - byte_array_file_data = b"" - - def _compressDataAndNotifyQt(data_to_append): - compressed_data = gzip.compress(data_to_append.encode("utf-8")) - self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. - QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - # Pretend that this is a response, as zipping might take a bit of time. - self._last_response_time = time.time() - return compressed_data - - if gcode is None: - Logger.log("e", "Unable to find sliced gcode, returning empty.") - return byte_array_file_data - - for line in gcode: - if not self._compressing_print: - self._progress_message.hide() - return None # Stop trying to zip, abort was called. - batched_line += line - # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. - # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - byte_array_file_data += _compressDataAndNotifyQt(batched_line) - batched_line = "" - - # Also compress the leftovers. - if batched_line: - byte_array_file_data += _compressDataAndNotifyQt(batched_line) - - return byte_array_file_data - - def __createKeyValueHttpPart(self, key, value): - metadata_part = QHttpPart() - metadata_part.setHeader(QNetworkRequest.ContentTypeHeader, 'text/plain') - metadata_part.setHeader(QNetworkRequest.ContentDispositionHeader, 'form-data; name="%s"' % (key)) - metadata_part.setBody(bytearray(value, "utf8")) - return metadata_part - - def __get_username(self): - try: - return getpass.getuser() - except: - Logger.log("d", "Could not get the system user name, returning 'unknown' instead.") - return None - - def _finishedPrintJobPostRequest(self, reply): - self._stage = OutputStage.ready - if self._progress_message: - self._progress_message.hide() - self._progress_message = None - self.writeFinished.emit(self) - - if reply.error(): - self._showRequestFailedMessage(reply) - self.writeError.emit(self) - else: - self._showRequestSucceededMessage() - self.writeSuccess.emit(self) - - self._cleanupRequest() - - def _showRequestFailedMessage(self, reply): - if reply is not None: - Logger.log("w", "Unable to send print job to group {cluster_name}: {error_string} ({error})".format( - cluster_name = self.getName(), - error_string = str(reply.errorString()), - error = str(reply.error()))) - error_message_template = i18n_catalog.i18nc("@info:status", "Unable to send print job to group {cluster_name}.") - message = Message(text=error_message_template.format( - cluster_name = self.getName())) - message.show() - - def _showRequestSucceededMessage(self): - confirmation_message_template = i18n_catalog.i18nc( - "@info:status", - "Sent {file_name} to group {cluster_name}." - ) - file_name = os.path.basename(self._file_name).split(".")[0] - message_text = confirmation_message_template.format(cluster_name = self.getName(), file_name = file_name) - message = Message(text=message_text) - button_text = i18n_catalog.i18nc("@action:button", "Show print jobs") - button_tooltip = i18n_catalog.i18nc("@info:tooltip", "Opens the print jobs interface in your browser.") - message.addAction("open_browser", button_text, "globe", button_tooltip) - message.actionTriggered.connect(self._onMessageActionTriggered) - message.show() - - def setPrintJobs(self, print_jobs): - #TODO: hack, last seen messes up the check, so drop it. - for job in print_jobs: - del job["last_seen"] - # Strip any extensions - job["name"] = self._removeGcodeExtension(job["name"]) - - if self._print_jobs != print_jobs: - old_print_jobs = self._print_jobs - self._print_jobs = print_jobs - - self._notifyFinishedPrintJobs(old_print_jobs, print_jobs) - self._notifyConfigurationChangeRequired(old_print_jobs, print_jobs) - - # Yes, this is a hacky way of doing it, but it's quick and the API doesn't give the print job per printer - # for some reason. ugh. - self._print_job_by_printer_uuid = {} - self._print_job_by_uuid = {} - for print_job in print_jobs: - if "printer_uuid" in print_job and print_job["printer_uuid"] is not None: - self._print_job_by_printer_uuid[print_job["printer_uuid"]] = print_job - self._print_job_by_uuid[print_job["uuid"]] = print_job - self.printJobsChanged.emit() - - def _removeGcodeExtension(self, name): - parts = name.split(".") - if parts[-1].upper() == "GZ": - parts = parts[:-1] - if parts[-1].upper() == "GCODE": - parts = parts[:-1] - return ".".join(parts) - - def _notifyFinishedPrintJobs(self, old_print_jobs, new_print_jobs): - """Notify the user when any of their print jobs have just completed. - - Arguments: - - old_print_jobs -- the previous list of print job status information as returned by the cluster REST API. - new_print_jobs -- the current list of print job status information as returned by the cluster REST API. - """ - if old_print_jobs is None: - return - - username = self.__get_username() - if username is None: - return - - our_old_print_jobs = self.__filterOurPrintJobs(old_print_jobs) - our_old_not_finished_print_jobs = [pj for pj in our_old_print_jobs if pj["status"] != "wait_cleanup"] - - our_new_print_jobs = self.__filterOurPrintJobs(new_print_jobs) - our_new_finished_print_jobs = [pj for pj in our_new_print_jobs if pj["status"] == "wait_cleanup"] - - old_not_finished_print_job_uuids = set([pj["uuid"] for pj in our_old_not_finished_print_jobs]) - - for print_job in our_new_finished_print_jobs: - if print_job["uuid"] in old_not_finished_print_job_uuids: - - printer_name = self.__getPrinterNameFromUuid(print_job["printer_uuid"]) - if printer_name is None: - printer_name = i18n_catalog.i18nc("@label Printer name", "Unknown") - - message_text = (i18n_catalog.i18nc("@info:status", - "Printer '{printer_name}' has finished printing '{job_name}'.") - .format(printer_name=printer_name, job_name=print_job["name"])) - message = Message(text=message_text, title=i18n_catalog.i18nc("@info:status", "Print finished")) - Application.getInstance().showMessage(message) - Application.getInstance().showToastMessage( - i18n_catalog.i18nc("@info:status", "Print finished"), - message_text) - - def __filterOurPrintJobs(self, print_jobs): - username = self.__get_username() - return [print_job for print_job in print_jobs if print_job["owner"] == username] - - def _notifyConfigurationChangeRequired(self, old_print_jobs, new_print_jobs): - if old_print_jobs is None: - return - - old_change_required_print_jobs = self.__filterConfigChangePrintJobs(self.__filterOurPrintJobs(old_print_jobs)) - new_change_required_print_jobs = self.__filterConfigChangePrintJobs(self.__filterOurPrintJobs(new_print_jobs)) - old_change_required_print_job_uuids = set([pj["uuid"] for pj in old_change_required_print_jobs]) - - for print_job in new_change_required_print_jobs: - if print_job["uuid"] not in old_change_required_print_job_uuids: - - printer_name = self.__getPrinterNameFromUuid(print_job["assigned_to"]) - if printer_name is None: - # don't report on yet unknown printers - continue - - message_text = (i18n_catalog.i18n("{printer_name} is reserved to print '{job_name}'. Please change the printer's configuration to match the job, for it to start printing.") - .format(printer_name=printer_name, job_name=print_job["name"])) - message = Message(text=message_text, title=i18n_catalog.i18nc("@label:status", "Action required")) - Application.getInstance().showMessage(message) - Application.getInstance().showToastMessage( - i18n_catalog.i18nc("@label:status", "Action required"), - message_text) - - def __filterConfigChangePrintJobs(self, print_jobs): - return filter(self.__isConfigurationChangeRequiredPrintJob, print_jobs) - - def __isConfigurationChangeRequiredPrintJob(self, print_job): - if print_job["status"] == "queued": - changes_required = print_job.get("configuration_changes_required", []) - return len(changes_required) != 0 - return False - - def __getPrinterNameFromUuid(self, printer_uuid): - for printer in self._printers: - if printer["uuid"] == printer_uuid: - return printer["friendly_name"] - return None - - def setPrinters(self, printers): - if self._printers != printers: - self._connected_printers_type_count = [] - printers_count = {} - self._printers = printers - self._printers_dict = dict((p["unique_name"], p) for p in printers) # for easy lookup by unique_name - - for printer in printers: - variant = printer["machine_variant"] - if variant in printers_count: - printers_count[variant] += 1 - else: - printers_count[variant] = 1 - for type in printers_count: - self._connected_printers_type_count.append({"machine_type": type, "count": printers_count[type]}) - self.printersChanged.emit() - - @pyqtProperty("QVariantList", notify=printersChanged) - def connectedPrintersTypeCount(self): - return self._connected_printers_type_count - - @pyqtProperty("QVariantList", notify=printersChanged) - def connectedPrinters(self): - return self._printers - - @pyqtProperty(int, notify=printJobsChanged) - def numJobsPrinting(self): - num_jobs_printing = 0 - for job in self._print_jobs: - if job["status"] in ["printing", "wait_cleanup", "sent_to_printer", "pre_print", "post_print"]: - num_jobs_printing += 1 - return num_jobs_printing - - @pyqtProperty(int, notify=printJobsChanged) - def numJobsQueued(self): - num_jobs_queued = 0 - for job in self._print_jobs: - if job["status"] == "queued": - num_jobs_queued += 1 - return num_jobs_queued - - @pyqtProperty("QVariantMap", notify=printJobsChanged) - def printJobsByUUID(self): - return self._print_job_by_uuid - - @pyqtProperty("QVariantMap", notify=printJobsChanged) - def printJobsByPrinterUUID(self): - return self._print_job_by_printer_uuid - - @pyqtProperty("QVariantList", notify=printJobsChanged) - def printJobs(self): - return self._print_jobs - - @pyqtProperty("QVariantList", notify=printersChanged) - def printers(self): - return [self._automatic_printer, ] + self._printers - - @pyqtSlot(str, str) - def selectPrinter(self, unique_name, friendly_name): - self.stopCamera() - self._selected_printer = {"unique_name": unique_name, "friendly_name": friendly_name} - Logger.log("d", "Selected printer: %s %s", friendly_name, unique_name) - # TODO: Probably not the nicest way to do this. This needs to be done better at some point in time. - if unique_name == "": - self._address = self._master_address - else: - self._address = self._printers_dict[self._selected_printer["unique_name"]]["ip_address"] - - self.selectedPrinterChanged.emit() - - def _updateJobState(self, job_state): - name = self._selected_printer.get("friendly_name") - if name == "" or name == "Automatic": - # TODO: This is now a bit hacked; If no printer is selected, don't show job state. - if self._job_state != "": - self._job_state = "" - self.jobStateChanged.emit() - else: - if self._job_state != job_state: - self._job_state = job_state - self.jobStateChanged.emit() - - @pyqtSlot() - def selectAutomaticPrinter(self): - self.stopCamera() - self._selected_printer = self._automatic_printer - self.selectedPrinterChanged.emit() - - @pyqtProperty("QVariant", notify=selectedPrinterChanged) - def selectedPrinterName(self): - return self._selected_printer.get("unique_name", "") - - def getPrintJobsUrl(self): - return self._host + "/print_jobs" - - def getPrintersUrl(self): - return self._host + "/printers" - - def _showProgressMessage(self): - progress_message_template = i18n_catalog.i18nc("@info:progress", - "Sending {file_name} to group {cluster_name}") - file_name = os.path.basename(self._file_name).split(".")[0] - self._progress_message = Message(progress_message_template.format(file_name = file_name, cluster_name = self.getName()), 0, False, -1) - self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") - self._progress_message.actionTriggered.connect(self._onMessageActionTriggered) - self._progress_message.show() - - def _addUserAgentHeader(self, request): - request.setRawHeader(b"User-agent", b"CuraPrintClusterOutputDevice Plugin") - - def _cleanupRequest(self): - self._request = None - self._stage = OutputStage.ready - self._file_name = None - - def _onFinished(self, reply): - super()._onFinished(reply) - reply_url = reply.url().toString() - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if status_code == 500: - Logger.log("w", "Request to {url} returned a 500.".format(url = reply_url)) - return - if reply.error() == QNetworkReply.ContentOperationNotPermittedError: - # It was probably "/api/v1/materials" for legacy UM3 - return - if reply.error() == QNetworkReply.ContentNotFoundError: - # It was probably "/api/v1/print_job" for legacy UM3 - return - - if reply.operation() == QNetworkAccessManager.PostOperation: - if self._cluster_api_prefix + "print_jobs" in reply_url: - self._finishedPrintJobPostRequest(reply) - return - - # We need to do this check *after* we process the post operation! - # If the sending of g-code is cancelled by the user it will result in an error, but we do need to handle this. - if reply.error() != QNetworkReply.NoError: - Logger.log("e", "After requesting [%s] we got a network error [%s]. Not processing anything...", reply_url, reply.error()) - return - - elif reply.operation() == QNetworkAccessManager.GetOperation: - if self._cluster_api_prefix + "print_jobs" in reply_url: - self._finishedPrintJobsRequest(reply) - elif self._cluster_api_prefix + "printers" in reply_url: - self._finishedPrintersRequest(reply) - - @pyqtSlot() - def openPrintJobControlPanel(self): - Logger.log("d", "Opening print job control panel...") - QDesktopServices.openUrl(QUrl(self.getPrintJobsUrl())) - - @pyqtSlot() - def openPrinterControlPanel(self): - Logger.log("d", "Opening printer control panel...") - QDesktopServices.openUrl(QUrl(self.getPrintersUrl())) - - def _onMessageActionTriggered(self, message, action): - if action == "open_browser": - QDesktopServices.openUrl(QUrl(self.getPrintJobsUrl())) - - if action == "Abort": - Logger.log("d", "User aborted sending print to remote.") - self._progress_message.hide() - self._compressing_print = False - if self._reply: - self._reply.abort() - self._stage = OutputStage.ready - Application.getInstance().getController().setActiveStage("PrepareStage") - - @pyqtSlot(int, result=str) - def formatDuration(self, seconds): - return Duration(seconds).getDisplayString(DurationFormat.Format.Short) - - ## For cluster below - def _get_plugin_directory_name(self): - current_file_absolute_path = os.path.realpath(__file__) - directory_path = os.path.dirname(current_file_absolute_path) - _, directory_name = os.path.split(directory_path) - return directory_name - - @property - def _plugin_path(self): - return PluginRegistry.getInstance().getPluginPath(self._get_plugin_directory_name()) diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py deleted file mode 100755 index 3a48bab11b..0000000000 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevice.py +++ /dev/null @@ -1,1306 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from UM.i18n import i18nCatalog -from UM.Application import Application -from UM.Logger import Logger -from UM.Signal import signalemitter - -from UM.Message import Message - -import UM.Settings.ContainerRegistry -import UM.Version #To compare firmware version numbers. - -from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState -from cura.Settings.ContainerManager import ContainerManager -import cura.Settings.ExtruderManager - -from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply -from PyQt5.QtCore import QUrl, QTimer, pyqtSignal, pyqtProperty, pyqtSlot, QCoreApplication -from PyQt5.QtGui import QImage, QColor -from PyQt5.QtWidgets import QMessageBox - -import json -import os -import gzip - -from time import time - -from time import gmtime -from enum import IntEnum - -i18n_catalog = i18nCatalog("cura") - -class AuthState(IntEnum): - NotAuthenticated = 1 - AuthenticationRequested = 2 - Authenticated = 3 - AuthenticationDenied = 4 - -## Network connected (wifi / lan) printer that uses the Ultimaker API -@signalemitter -class NetworkPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, key, address, properties, api_prefix): - super().__init__(key) - self._address = address - self._key = key - self._properties = properties # Properties dict as provided by zero conf - self._api_prefix = api_prefix - - self._gcode = None - self._print_finished = True # _print_finished == False means we're halfway in a print - self._write_finished = True # _write_finished == False means we're currently sending a G-code file - - self._use_gzip = True # Should we use g-zip compression before sending the data? - - # This holds the full JSON file that was received from the last request. - # The JSON looks like: - #{ - # "led": {"saturation": 0.0, "brightness": 100.0, "hue": 0.0}, - # "beep": {}, - # "network": { - # "wifi_networks": [], - # "ethernet": {"connected": true, "enabled": true}, - # "wifi": {"ssid": "xxxx", "connected": False, "enabled": False} - # }, - # "diagnostics": {}, - # "bed": {"temperature": {"target": 60.0, "current": 44.4}}, - # "heads": [{ - # "max_speed": {"z": 40.0, "y": 300.0, "x": 300.0}, - # "position": {"z": 20.0, "y": 6.0, "x": 180.0}, - # "fan": 0.0, - # "jerk": {"z": 0.4, "y": 20.0, "x": 20.0}, - # "extruders": [ - # { - # "feeder": {"max_speed": 45.0, "jerk": 5.0, "acceleration": 3000.0}, - # "active_material": {"guid": "xxxxxxx", "length_remaining": -1.0}, - # "hotend": {"temperature": {"target": 0.0, "current": 22.8}, "id": "AA 0.4"} - # }, - # { - # "feeder": {"max_speed": 45.0, "jerk": 5.0, "acceleration": 3000.0}, - # "active_material": {"guid": "xxxx", "length_remaining": -1.0}, - # "hotend": {"temperature": {"target": 0.0, "current": 22.8}, "id": "BB 0.4"} - # } - # ], - # "acceleration": 3000.0 - # }], - # "status": "printing" - #} - - self._json_printer_state = {} - - ## Todo: Hardcoded value now; we should probably read this from the machine file. - ## It's okay to leave this for now, as this plugin is um3 only (and has 2 extruders by definition) - self._num_extruders = 2 - - # These are reinitialised here (from PrinterOutputDevice) to match the new _num_extruders - 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._target_bed_temperature = 0 - self._processing_preheat_requests = True - - self._can_control_manually = False - - self.setPriority(3) # Make sure the output device gets selected above local file output - self.setName(key) - self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) - self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) - self.setIconName("print") - - self._manager = None - - self._post_request = None - self._post_reply = None - self._post_multi_part = None - self._post_part = None - - self._material_multi_part = None - self._material_part = None - - self._progress_message = None - self._error_message = None - self._connection_message = None - - self._update_timer = QTimer() - self._update_timer.setInterval(2000) # TODO; Add preference for update interval - self._update_timer.setSingleShot(False) - self._update_timer.timeout.connect(self._update) - - self._camera_timer = QTimer() - self._camera_timer.setInterval(500) # Todo: Add preference for camera update interval - self._camera_timer.setSingleShot(False) - self._camera_timer.timeout.connect(self._updateCamera) - - self._image_request = None - self._image_reply = None - - self._use_stream = True - self._stream_buffer = b"" - self._stream_buffer_start_index = -1 - - self._camera_image_id = 0 - - self._authentication_counter = 0 - self._max_authentication_counter = 5 * 60 # Number of attempts before authentication timed out (5 min) - - self._authentication_timer = QTimer() - self._authentication_timer.setInterval(1000) # TODO; Add preference for update interval - self._authentication_timer.setSingleShot(False) - self._authentication_timer.timeout.connect(self._onAuthenticationTimer) - self._authentication_request_active = False - - self._authentication_state = AuthState.NotAuthenticated - self._authentication_id = None - self._authentication_key = None - - self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer requested. Please approve the request on the printer"), lifetime = 0, dismissable = False, progress = 0, title = i18n_catalog.i18nc("@info:title", "Connection status")) - self._authentication_failed_message = Message(i18n_catalog.i18nc("@info:status", ""), title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None, i18n_catalog.i18nc("@info:tooltip", "Re-send the access request")) - self._authentication_failed_message.actionTriggered.connect(self.requestAuthentication) - self._authentication_succeeded_message = Message(i18n_catalog.i18nc("@info:status", "Access to the printer accepted"), title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._not_authenticated_message = Message(i18n_catalog.i18nc("@info:status", "No access to print with this printer. Unable to send print job."), title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._not_authenticated_message.addAction("Request", i18n_catalog.i18nc("@action:button", "Request Access"), None, i18n_catalog.i18nc("@info:tooltip", "Send access request to the printer")) - self._not_authenticated_message.actionTriggered.connect(self.requestAuthentication) - - self._camera_image = QImage() - - self._material_post_objects = {} - self._connection_state_before_timeout = None - - self._last_response_time = time() - self._last_request_time = None - self._response_timeout_time = 10 - self._recreate_network_manager_time = 30 # If we have no connection, re-create network manager every 30 sec. - self._recreate_network_manager_count = 1 - - self._send_gcode_start = time() # Time when the sending of the g-code started. - - self._last_command = "" - - self._compressing_print = False - self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "MonitorItem.qml") - printer_type = self._properties.get(b"machine", b"").decode("utf-8") - if printer_type.startswith("9511"): - self._updatePrinterType("ultimaker3_extended") - elif printer_type.startswith("9066"): - self._updatePrinterType("ultimaker3") - else: - self._updatePrinterType("unknown") - - Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) - - def _onNetworkAccesibleChanged(self, accessible): - Logger.log("d", "Network accessible state changed to: %s", accessible) - - ## Triggered when the output device manager changes devices. - # - # This is how we can detect that our device is no longer active now. - def _onOutputDevicesChanged(self): - if self.getId() not in Application.getInstance().getOutputDeviceManager().getOutputDeviceIds(): - self.stopCamera() - - def _onAuthenticationTimer(self): - self._authentication_counter += 1 - self._authentication_requested_message.setProgress(self._authentication_counter / self._max_authentication_counter * 100) - if self._authentication_counter > self._max_authentication_counter: - self._authentication_timer.stop() - Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._key) - self.setAuthenticationState(AuthState.AuthenticationDenied) - - def _onAuthenticationRequired(self, reply, authenticator): - if self._authentication_id is not None and self._authentication_key is not None: - Logger.log("d", "Authentication was required for printer: %s. Setting up authenticator with ID %s and key %s", self._key, self._authentication_id, self._getSafeAuthKey()) - authenticator.setUser(self._authentication_id) - authenticator.setPassword(self._authentication_key) - else: - Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._key) - - def getProperties(self): - return self._properties - - @pyqtSlot(str, result = str) - def getProperty(self, key): - key = key.encode("utf-8") - if key in self._properties: - return self._properties.get(key, b"").decode("utf-8") - else: - return "" - - ## Get the unique key of this machine - # \return key String containing the key of the machine. - @pyqtSlot(result = str) - def getKey(self): - return self._key - - ## The IP address of the printer. - @pyqtProperty(str, constant = True) - def address(self): - return self._properties.get(b"address", b"").decode("utf-8") - - ## Name of the printer (as returned from the ZeroConf properties) - @pyqtProperty(str, constant = True) - def name(self): - return self._properties.get(b"name", b"").decode("utf-8") - - ## Firmware version (as returned from the ZeroConf properties) - @pyqtProperty(str, constant=True) - def firmwareVersion(self): - return self._properties.get(b"firmware_version", b"").decode("utf-8") - - ## IPadress of this printer - @pyqtProperty(str, constant=True) - def ipAddress(self): - return self._address - - ## Pre-heats the heated bed of the printer. - # - # \param temperature The temperature to heat the bed to, in degrees - # Celsius. - # \param duration How long the bed should stay warm, in seconds. - @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): - temperature = round(temperature) #The API doesn't allow floating point. - duration = round(duration) - if UM.Version.Version(self.firmwareVersion) < UM.Version.Version("3.5.92"): #Real bed pre-heating support is implemented from 3.5.92 and up. - self.setTargetBedTemperature(temperature = temperature) #No firmware-side duration support then. - return - url = QUrl("http://" + self._address + self._api_prefix + "printer/bed/pre_heat") - if duration > 0: - data = """{"temperature": "%i", "timeout": "%i"}""" % (temperature, duration) - else: - data = """{"temperature": "%i"}""" % temperature - Logger.log("i", "Pre-heating bed to %i degrees.", temperature) - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._processing_preheat_requests = False - self._manager.put(put_request, data.encode()) - self._preheat_bed_timer.start(self._preheat_bed_timeout * 1000) #Times 1000 because it needs to be provided as milliseconds. - self.preheatBedRemainingTimeChanged.emit() - - ## Cancels pre-heating the heated bed of the printer. - # - # If the bed is not pre-heated, nothing happens. - @pyqtSlot() - def cancelPreheatBed(self): - Logger.log("i", "Cancelling pre-heating of the bed.") - self.preheatBed(temperature = 0, duration = 0) - self._preheat_bed_timer.stop() - self._preheat_bed_timer.setInterval(0) - self.preheatBedRemainingTimeChanged.emit() - - ## Changes the target bed temperature on the printer. - # - # /param temperature The new target temperature of the bed. - def _setTargetBedTemperature(self, temperature): - if not self._updateTargetBedTemperature(temperature): - return - - url = QUrl("http://" + self._address + self._api_prefix + "printer/bed/temperature/target") - data = str(temperature) - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._manager.put(put_request, data.encode()) - - ## Updates the target bed temperature from the printer, and emit a signal if it was changed. - # - # /param temperature The new target temperature of the bed. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetBedTemperature(self, temperature): - if self._target_bed_temperature == temperature: - return False - self._target_bed_temperature = temperature - self.targetBedTemperatureChanged.emit() - return True - - ## Updates the target hotend temperature from the printer, and emit a signal if it was changed. - # - # /param index The index of the hotend. - # /param temperature The new target temperature of the hotend. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetHotendTemperature(self, index, temperature): - if self._target_hotend_temperatures[index] == temperature: - return False - self._target_hotend_temperatures[index] = temperature - self.targetHotendTemperaturesChanged.emit() - return True - - def _stopCamera(self): - self._stream_buffer = b"" - self._stream_buffer_start_index = -1 - - if self._camera_timer.isActive(): - self._camera_timer.stop() - - if self._image_reply: - try: - # disconnect the signal - try: - self._image_reply.downloadProgress.disconnect(self._onStreamDownloadProgress) - except Exception: - pass - # abort the request if it's not finished - if not self._image_reply.isFinished(): - self._image_reply.close() - except Exception as e: #RuntimeError - pass # It can happen that the wrapped c++ object is already deleted. - self._image_reply = None - self._image_request = None - - def _startCamera(self): - if self._use_stream: - self._startCameraStream() - else: - self._camera_timer.start() - - def _startCameraStream(self): - ## Request new image - url = QUrl("http://" + self._address + ":8080/?action=stream") - self._image_request = QNetworkRequest(url) - self._image_reply = self._manager.get(self._image_request) - self._image_reply.downloadProgress.connect(self._onStreamDownloadProgress) - - def _updateCamera(self): - if not self._manager.networkAccessible(): - return - ## Request new image - url = QUrl("http://" + self._address + ":8080/?action=snapshot") - image_request = QNetworkRequest(url) - self._manager.get(image_request) - self._last_request_time = time() - - ## Set the authentication state. - # \param auth_state \type{AuthState} Enum value representing the new auth state - def setAuthenticationState(self, auth_state): - if auth_state == self._authentication_state: - return # Nothing to do here. - - Logger.log("d", "Attempting to update auth state from %s to %s for printer %s" % (self._authentication_state, auth_state, self._key)) - - if auth_state == AuthState.AuthenticationRequested: - Logger.log("d", "Authentication state changed to authentication requested.") - self.setAcceptsCommands(False) - self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network. Please approve the access request on the printer.")) - self._authentication_requested_message.show() - self._authentication_request_active = True - self._authentication_timer.start() # Start timer so auth will fail after a while. - elif auth_state == AuthState.Authenticated: - Logger.log("d", "Authentication state changed to authenticated") - self.setAcceptsCommands(True) - self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network.")) - self._authentication_requested_message.hide() - if self._authentication_request_active: - self._authentication_succeeded_message.show() - - # Stop waiting for a response - self._authentication_timer.stop() - self._authentication_counter = 0 - - # Once we are authenticated we need to send all material profiles. - self.sendMaterialProfiles() - elif auth_state == AuthState.AuthenticationDenied: - self.setAcceptsCommands(False) - self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network. No access to control the printer.")) - self._authentication_requested_message.hide() - if self._authentication_request_active: - if self._authentication_timer.remainingTime() > 0: - Logger.log("d", "Authentication state changed to authentication denied before the request timeout.") - self._authentication_failed_message.setText(i18n_catalog.i18nc("@info:status", "Access request was denied on the printer.")) - else: - Logger.log("d", "Authentication state changed to authentication denied due to a timeout") - self._authentication_failed_message.setText(i18n_catalog.i18nc("@info:status", "Access request failed due to a timeout.")) - - self._authentication_failed_message.show() - self._authentication_request_active = False - - # Stop waiting for a response - self._authentication_timer.stop() - self._authentication_counter = 0 - - self._authentication_state = auth_state - self.authenticationStateChanged.emit() - - authenticationStateChanged = pyqtSignal() - - @pyqtProperty(int, notify = authenticationStateChanged) - def authenticationState(self): - return self._authentication_state - - @pyqtSlot() - def requestAuthentication(self, message_id = None, action_id = "Retry"): - if action_id == "Request" or action_id == "Retry": - Logger.log("d", "Requestion authentication for %s due to action %s" % (self._key, action_id)) - self._authentication_failed_message.hide() - self._not_authenticated_message.hide() - self.setAuthenticationState(AuthState.NotAuthenticated) - self._authentication_counter = 0 - self._authentication_requested_message.setProgress(0) - self._authentication_id = None - self._authentication_key = None - self._createNetworkManager() # Re-create network manager to force re-authentication. - - ## Request data from the connected device. - def _update(self): - if self._last_response_time: - time_since_last_response = time() - self._last_response_time - else: - time_since_last_response = 0 - if self._last_request_time: - time_since_last_request = time() - self._last_request_time - else: - time_since_last_request = float("inf") # An irrelevantly large number of seconds - - # Connection is in timeout, check if we need to re-start the connection. - # Sometimes the qNetwork manager incorrectly reports the network status on Mac & Windows. - # Re-creating the QNetworkManager seems to fix this issue. - if self._last_response_time and self._connection_state_before_timeout: - if time_since_last_response > self._recreate_network_manager_time * self._recreate_network_manager_count: - self._recreate_network_manager_count += 1 - counter = 0 # Counter to prevent possible indefinite while loop. - # It can happen that we had a very long timeout (multiple times the recreate time). - # In that case we should jump through the point that the next update won't be right away. - while time_since_last_response - self._recreate_network_manager_time * self._recreate_network_manager_count > self._recreate_network_manager_time and counter < 10: - counter += 1 - self._recreate_network_manager_count += 1 - Logger.log("d", "Timeout lasted over %.0f seconds (%.1fs), re-checking connection.", self._recreate_network_manager_time, time_since_last_response) - self._createNetworkManager() - return - - # Check if we have an connection in the first place. - if not self._manager.networkAccessible(): - if not self._connection_state_before_timeout: - Logger.log("d", "The network connection seems to be disabled. Going into timeout mode") - self._connection_state_before_timeout = self._connection_state - self.setConnectionState(ConnectionState.error) - self._connection_message = Message(i18n_catalog.i18nc("@info:status", - "The connection with the network was lost."), - title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._connection_message.show() - - if self._progress_message: - self._progress_message.hide() - - # Check if we were uploading something. Abort if this is the case. - # Some operating systems handle this themselves, others give weird issues. - if self._post_reply: - Logger.log("d", "Stopping post upload because the connection was lost.") - self._finalizePostReply() - return - else: - if not self._connection_state_before_timeout: - self._recreate_network_manager_count = 1 - - # Check that we aren't in a timeout state - if self._last_response_time and self._last_request_time and not self._connection_state_before_timeout: - if time_since_last_response > self._response_timeout_time and time_since_last_request <= self._response_timeout_time: - # Go into timeout state. - Logger.log("d", "We did not receive a response for %0.1f seconds, so it seems the printer is no longer accessible.", time_since_last_response) - self._connection_state_before_timeout = self._connection_state - self._connection_message = Message(i18n_catalog.i18nc("@info:status", "The connection with the printer was lost. Check your printer to see if it is connected."), - title = i18n_catalog.i18nc("@info:title", "Connection Status")) - self._connection_message.show() - - if self._progress_message: - self._progress_message.hide() - - # Check if we were uploading something. Abort if this is the case. - # Some operating systems handle this themselves, others give weird issues. - if self._post_reply: - Logger.log("d", "Stopping post upload because the connection was lost.") - self._finalizePostReply() - self.setConnectionState(ConnectionState.error) - return - - if self._authentication_state == AuthState.NotAuthenticated: - self._verifyAuthentication() # We don't know if we are authenticated; check if we have correct auth. - elif self._authentication_state == AuthState.AuthenticationRequested: - self._checkAuthentication() # We requested authentication at some point. Check if we got permission. - - ## Request 'general' printer data - url = QUrl("http://" + self._address + self._api_prefix + "printer") - printer_request = QNetworkRequest(url) - self._manager.get(printer_request) - - ## Request print_job data - url = QUrl("http://" + self._address + self._api_prefix + "print_job") - print_job_request = QNetworkRequest(url) - self._manager.get(print_job_request) - - self._last_request_time = time() - - def _finalizePostReply(self): - # Indicate uploading was finished (so another file can be send) - self._write_finished = True - - if self._post_reply is None: - return - - try: - try: - self._post_reply.uploadProgress.disconnect(self._onUploadProgress) - except TypeError: - pass # The disconnection can fail on mac in some cases. Ignore that. - - try: - self._post_reply.finished.disconnect(self._onUploadFinished) - except TypeError: - pass # The disconnection can fail on mac in some cases. Ignore that. - - self._post_reply.abort() - self._post_reply = None - except RuntimeError: - self._post_reply = None # It can happen that the wrapped c++ object is already deleted. - - def _createNetworkManager(self): - if self._manager: - self._manager.finished.disconnect(self._onFinished) - self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) - self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) - - self._manager = QNetworkAccessManager() - self._manager.finished.connect(self._onFinished) - self._manager.authenticationRequired.connect(self._onAuthenticationRequired) - self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes - - ## Convenience function that gets information from the received json data and converts it to the right internal - # values / variables - def _spliceJSONData(self): - # Check for hotend temperatures - for index in range(0, self._num_extruders): - temperatures = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["temperature"] - self._setHotendTemperature(index, temperatures["current"]) - self._updateTargetHotendTemperature(index, temperatures["target"]) - try: - material_id = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] - except KeyError: - material_id = "" - self._setMaterialId(index, material_id) - try: - hotend_id = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] - except KeyError: - hotend_id = "" - self._setHotendId(index, hotend_id) - - bed_temperatures = self._json_printer_state["bed"]["temperature"] - self._setBedTemperature(bed_temperatures["current"]) - self._updateTargetBedTemperature(bed_temperatures["target"]) - - head_x = self._json_printer_state["heads"][0]["position"]["x"] - head_y = self._json_printer_state["heads"][0]["position"]["y"] - head_z = self._json_printer_state["heads"][0]["position"]["z"] - self._updateHeadPosition(head_x, head_y, head_z) - self._updatePrinterState(self._json_printer_state["status"]) - - if self._processing_preheat_requests: - try: - is_preheating = self._json_printer_state["bed"]["pre_heat"]["active"] - except KeyError: #Old firmware doesn't support that. - pass #Don't update the pre-heat remaining time. - else: - if is_preheating: - try: - remaining_preheat_time = self._json_printer_state["bed"]["pre_heat"]["remaining"] - except KeyError: #Error in firmware. If "active" is supported, "remaining" should also be supported. - pass #Anyway, don't update. - else: - #Only update if time estimate is significantly off (>5000ms). - #Otherwise we get issues with latency causing the timer to count inconsistently. - if abs(self._preheat_bed_timer.remainingTime() - remaining_preheat_time * 1000) > 5000: - self._preheat_bed_timer.setInterval(remaining_preheat_time * 1000) - self._preheat_bed_timer.start() - self.preheatBedRemainingTimeChanged.emit() - else: #Not pre-heating. Must've cancelled. - if self._preheat_bed_timer.isActive(): - self._preheat_bed_timer.setInterval(0) - self._preheat_bed_timer.stop() - self.preheatBedRemainingTimeChanged.emit() - - def close(self): - Logger.log("d", "Closing connection of printer %s with ip %s", self._key, self._address) - self._updateJobState("") - self.setConnectionState(ConnectionState.closed) - if self._progress_message: - self._progress_message.hide() - - # Reset authentication state - self._authentication_requested_message.hide() - self.setAuthenticationState(AuthState.NotAuthenticated) - self._authentication_counter = 0 - self._authentication_timer.stop() - - self._authentication_requested_message.hide() - self._authentication_failed_message.hide() - self._authentication_succeeded_message.hide() - - # Reset stored material & hotend data. - self._material_ids = [""] * self._num_extruders - self._hotend_ids = [""] * self._num_extruders - - if self._error_message: - self._error_message.hide() - - # Reset timeout state - self._connection_state_before_timeout = None - self._last_response_time = time() - self._last_request_time = None - - # Stop update timers - self._update_timer.stop() - - self.stopCamera() - - ## Request the current scene to be sent to a network-connected printer. - # - # \param nodes A collection of scene nodes to send. This is ignored. - # \param file_name \type{string} A suggestion for a file name to write. - # This is ignored. - # \param filter_by_machine Whether to filter MIME types by machine. This - # is ignored. - # \param kwargs Keyword arguments. - def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): - - if self._printer_state not in ["idle", ""]: - self._error_message = Message( - i18n_catalog.i18nc("@info:status", "Unable to start a new print job, printer is busy. Current printer status is %s.") % self._printer_state, - title = i18n_catalog.i18nc("@info:title", "Printer Status")) - self._error_message.show() - return - elif self._authentication_state != AuthState.Authenticated: - self._not_authenticated_message.show() - Logger.log("d", "Attempting to perform an action without authentication for printer %s. Auth state is %s", self._key, self._authentication_state) - return - - Application.getInstance().getController().setActiveStage("MonitorStage") - self._print_finished = True - self.writeStarted.emit(self) - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list") - - print_information = Application.getInstance().getPrintInformation() - warnings = [] # There might be multiple things wrong. Keep a list of all the stuff we need to warn about. - - # Only check for mistakes if there is material length information. - if print_information.materialLengths: - # Check if PrintCores / materials are loaded at all. Any failure in these results in an Error. - for index in range(0, self._num_extruders): - if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: - if self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] == "": - Logger.log("e", "No cartridge loaded in slot %s, unable to start print", index + 1) - self._error_message = Message( - i18n_catalog.i18nc("@info:status", "Unable to start a new print job. No Printcore loaded in slot {0}".format(index + 1)), - title = i18n_catalog.i18nc("@info:title", "Error")) - self._error_message.show() - return - if self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] == "": - Logger.log("e", "No material loaded in slot %s, unable to start print", index + 1) - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Unable to start a new print job. No material loaded in slot {0}".format(index + 1)), - title = i18n_catalog.i18nc("@info:title", "Error")) - self._error_message.show() - return - - for index in range(0, self._num_extruders): - # Check if there is enough material. Any failure in these results in a warning. - material_length = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["length_remaining"] - if material_length != -1 and index < len(print_information.materialLengths) and print_information.materialLengths[index] > material_length: - Logger.log("w", "Printer reports that there is not enough material left for extruder %s. We need %s and the printer has %s", index + 1, print_information.materialLengths[index], material_length) - warnings.append(i18n_catalog.i18nc("@label", "Not enough material for spool {0}.").format(index+1)) - - # Check if the right cartridges are loaded. Any failure in these results in a warning. - extruder_manager = cura.Settings.ExtruderManager.ExtruderManager.getInstance() - if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0: - variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"}) - core_name = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["id"] - if variant: - if variant.getName() != core_name: - Logger.log("w", "Extruder %s has a different Cartridge (%s) as Cura (%s)", index + 1, core_name, variant.getName()) - warnings.append(i18n_catalog.i18nc("@label", "Different PrintCore (Cura: {0}, Printer: {1}) selected for extruder {2}".format(variant.getName(), core_name, index + 1))) - - material = extruder_manager.getExtruderStack(index).findContainer({"type": "material"}) - if material: - remote_material_guid = self._json_printer_state["heads"][0]["extruders"][index]["active_material"]["guid"] - if material.getMetaDataEntry("GUID") != remote_material_guid: - Logger.log("w", "Extruder %s has a different material (%s) as Cura (%s)", index + 1, - remote_material_guid, - material.getMetaDataEntry("GUID")) - - remote_materials = UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material", GUID = remote_material_guid, read_only = True) - remote_material_name = "Unknown" - if remote_materials: - remote_material_name = remote_materials[0].getName() - warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(material.getName(), remote_material_name, index + 1)) - - try: - is_offset_calibrated = self._json_printer_state["heads"][0]["extruders"][index]["hotend"]["offset"]["state"] == "valid" - except KeyError: # Older versions of the API don't expose the offset property, so we must asume that all is well. - is_offset_calibrated = True - - if not is_offset_calibrated: - warnings.append(i18n_catalog.i18nc("@label", "PrintCore {0} is not properly calibrated. XY calibration needs to be performed on the printer.").format(index + 1)) - else: - Logger.log("w", "There was no material usage found. No check to match used material with machine is done.") - - if warnings: - text = i18n_catalog.i18nc("@label", "Are you sure you wish to print with the selected configuration?") - informative_text = i18n_catalog.i18nc("@label", "There is a mismatch between the configuration or calibration of the printer and Cura. " - "For the best result, always slice for the PrintCores and materials that are inserted in your printer.") - detailed_text = "" - for warning in warnings: - detailed_text += warning + "\n" - - Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"), - text, - informative_text, - detailed_text, - buttons=QMessageBox.Yes + QMessageBox.No, - icon=QMessageBox.Question, - callback=self._configurationMismatchMessageCallback - ) - return - - self.startPrint() - - def _configurationMismatchMessageCallback(self, button): - def delayedCallback(): - if button == QMessageBox.Yes: - self.startPrint() - else: - Application.getInstance().getController().setActiveStage("PrepareStage") - # For some unknown reason Cura on OSX will hang if we do the call back code - # immediately without first returning and leaving QML's event system. - QTimer.singleShot(100, delayedCallback) - - def isConnected(self): - return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error - - ## Start requesting data from printer - def connect(self): - # Don't allow to connect to a printer with a faulty connection state. - # For instance when switching printers but the printer is disconnected from the network - if self._connection_state == ConnectionState.error: - return - - if self.isConnected(): - self.close() # Close previous connection - - self._createNetworkManager() - - self._last_response_time = time() # Ensure we reset the time when trying to connect (again) - - self.setConnectionState(ConnectionState.connecting) - self._update() # Manually trigger the first update, as we don't want to wait a few secs before it starts. - if not self._use_stream: - self._updateCamera() - Logger.log("d", "Connection with printer %s with ip %s started", self._key, self._address) - - ## Check if this machine was authenticated before. - self._authentication_id = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("network_authentication_id", None) - self._authentication_key = Application.getInstance().getGlobalContainerStack().getMetaDataEntry("network_authentication_key", None) - - if self._authentication_id is None and self._authentication_key is None: - Logger.log("d", "No authentication found in metadata.") - else: - Logger.log("d", "Loaded authentication id %s and key %s from the metadata entry for printer %s", self._authentication_id, self._getSafeAuthKey(), self._key) - - self._update_timer.start() - - ## Stop requesting data from printer - def disconnect(self): - Logger.log("d", "Connection with printer %s with ip %s stopped", self._key, self._address) - self.close() - - newImage = pyqtSignal() - - @pyqtProperty(QUrl, notify = newImage) - def cameraImage(self): - self._camera_image_id += 1 - # There is an image provider that is called "camera". In order to ensure that the image qml object, that - # requires a QUrl to function, updates correctly we add an increasing number. This causes to see the QUrl - # as new (instead of relying on cached version and thus forces an update. - temp = "image://camera/" + str(self._camera_image_id) - return QUrl(temp, QUrl.TolerantMode) - - def getCameraImage(self): - return self._camera_image - - def _setJobState(self, job_state): - self._last_command = job_state - url = QUrl("http://" + self._address + self._api_prefix + "print_job/state") - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - data = "{\"target\": \"%s\"}" % job_state - self._manager.put(put_request, data.encode()) - - ## Convenience function to get the username from the OS. - # The code was copied from the getpass module, as we try to use as little dependencies as possible. - def _getUserName(self): - for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): - user = os.environ.get(name) - if user: - return user - return "Unknown User" # Couldn't find out username. - - def _progressMessageActionTrigger(self, message_id = None, action_id = None): - if action_id == "Abort": - Logger.log("d", "User aborted sending print to remote.") - self._progress_message.hide() - self._compressing_print = False - self._write_finished = True # post_reply does not always exist, so make sure we unblock writing - if self._post_reply: - self._finalizePostReply() - Application.getInstance().getController().setActiveStage("PrepareStage") - - ## Attempt to start a new print. - # This function can fail to actually start a print due to not being authenticated or another print already - # being in progress. - def startPrint(self): - - # Check if we're already writing - if not self._write_finished: - self._error_message = Message( - i18n_catalog.i18nc("@info:status", - "Sending new jobs (temporarily) blocked, still sending the previous print job.")) - self._error_message.show() - return - - # Indicate we're starting a new write action, is set back to True at the end of this method - self._write_finished = False - - try: - self._send_gcode_start = time() - self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1, i18n_catalog.i18nc("@info:title", "Sending Data")) - self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") - self._progress_message.actionTriggered.connect(self._progressMessageActionTrigger) - self._progress_message.show() - Logger.log("d", "Started sending g-code to remote printer.") - self._compressing_print = True - ## Mash the data into single string - - max_chars_per_line = 1024 * 1024 / 4 # 1 / 4 MB - - byte_array_file_data = b"" - batched_line = "" - - def _compress_data_and_notify_qt(data_to_append): - compressed_data = gzip.compress(data_to_append.encode("utf-8")) - self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. - QCoreApplication.processEvents() # Ensure that the GUI does not freeze. - # Pretend that this is a response, as zipping might take a bit of time. - self._last_response_time = time() - return compressed_data - - for line in self._gcode: - if not self._compressing_print: - self._progress_message.hide() - return # Stop trying to zip, abort was called. - - if self._use_gzip: - batched_line += line - # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. - # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - - byte_array_file_data += _compress_data_and_notify_qt(batched_line) - batched_line = "" - else: - byte_array_file_data += line.encode("utf-8") - - # don't miss the last batch if it's there - if self._use_gzip: - if batched_line: - byte_array_file_data += _compress_data_and_notify_qt(batched_line) - - if self._use_gzip: - file_name = "%s.gcode.gz" % Application.getInstance().getPrintInformation().jobName - else: - file_name = "%s.gcode" % Application.getInstance().getPrintInformation().jobName - - self._compressing_print = False - ## Create multi_part request - self._post_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType) - - ## Create part (to be placed inside multipart) - self._post_part = QHttpPart() - self._post_part.setHeader(QNetworkRequest.ContentDispositionHeader, - "form-data; name=\"file\"; filename=\"%s\"" % file_name) - self._post_part.setBody(byte_array_file_data) - self._post_multi_part.append(self._post_part) - - url = QUrl("http://" + self._address + self._api_prefix + "print_job") - - ## Create the QT request - self._post_request = QNetworkRequest(url) - - ## Post request + data - self._post_reply = self._manager.post(self._post_request, self._post_multi_part) - self._post_reply.uploadProgress.connect(self._onUploadProgress) - self._post_reply.finished.connect(self._onUploadFinished) # used to unblock new write actions - - except IOError: - self._progress_message.hide() - self._error_message = Message(i18n_catalog.i18nc("@info:status", "Unable to send data to printer. Is another job still active?"), - title = i18n_catalog.i18nc("@info:title", "Warning")) - self._error_message.show() - except Exception as e: - self._progress_message.hide() - Logger.log("e", "An exception occurred in network connection: %s" % str(e)) - - ## Verify if we are authenticated to make requests. - def _verifyAuthentication(self): - url = QUrl("http://" + self._address + self._api_prefix + "auth/verify") - request = QNetworkRequest(url) - self._manager.get(request) - - ## Check if the authentication request was allowed by the printer. - def _checkAuthentication(self): - Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - self._manager.get(QNetworkRequest(QUrl("http://" + self._address + self._api_prefix + "auth/check/" + str(self._authentication_id)))) - - ## Request a authentication key from the printer so we can be authenticated - def _requestAuthentication(self): - url = QUrl("http://" + self._address + self._api_prefix + "auth/request") - request = QNetworkRequest(url) - request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._authentication_key = None - self._authentication_id = None - self._manager.post(request, json.dumps({"application": "Cura-" + Application.getInstance().getVersion(), "user": self._getUserName()}).encode()) - self.setAuthenticationState(AuthState.AuthenticationRequested) - - ## Send all material profiles to the printer. - def sendMaterialProfiles(self): - for container in UM.Settings.ContainerRegistry.ContainerRegistry.getInstance().findInstanceContainers(type = "material"): - try: - xml_data = container.serialize() - if xml_data == "" or xml_data is None: - continue - - names = ContainerManager.getInstance().getLinkedMaterials(container.getId()) - if names: - # There are other materials that share this GUID. - if not container.isReadOnly(): - continue # If it's not readonly, it's created by user, so skip it. - - material_multi_part = QHttpMultiPart(QHttpMultiPart.FormDataType) - - material_part = QHttpPart() - file_name = "none.xml" - material_part.setHeader(QNetworkRequest.ContentDispositionHeader, "form-data; name=\"file\";filename=\"%s\"" % file_name) - material_part.setBody(xml_data.encode()) - material_multi_part.append(material_part) - url = QUrl("http://" + self._address + self._api_prefix + "materials") - material_post_request = QNetworkRequest(url) - reply = self._manager.post(material_post_request, material_multi_part) - - # Keep reference to material_part, material_multi_part and reply so the garbage collector won't touch them. - self._material_post_objects[id(reply)] = (material_part, material_multi_part, reply) - except NotImplementedError: - # If the material container is not the most "generic" one it can't be serialized an will raise a - # NotImplementedError. We can simply ignore these. - pass - - ## Handler for all requests that have finished. - def _onFinished(self, reply): - if reply.error() == QNetworkReply.TimeoutError: - Logger.log("w", "Received a timeout on a request to the printer") - self._connection_state_before_timeout = self._connection_state - # Check if we were uploading something. Abort if this is the case. - # Some operating systems handle this themselves, others give weird issues. - if self._post_reply: - self._finalizePostReply() - Logger.log("d", "Uploading of print failed after %s", time() - self._send_gcode_start) - self._progress_message.hide() - - self.setConnectionState(ConnectionState.error) - return - - if self._connection_state_before_timeout and reply.error() == QNetworkReply.NoError: # There was a timeout, but we got a correct answer again. - Logger.log("d", "We got a response (%s) from the server after %0.1f of silence. Going back to previous state %s", reply.url().toString(), time() - self._last_response_time, self._connection_state_before_timeout) - - # Camera was active before timeout. Start it again - if self._camera_active: - self._startCamera() - - self.setConnectionState(self._connection_state_before_timeout) - self._connection_state_before_timeout = None - - if reply.error() == QNetworkReply.NoError: - self._last_response_time = time() - - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if not status_code: - if self._connection_state != ConnectionState.error: - Logger.log("d", "A reply from %s did not have status code.", reply.url().toString()) - # Received no or empty reply - return - reply_url = reply.url().toString() - - if reply.operation() == QNetworkAccessManager.GetOperation: - # "printer" is also in "printers", therefore _api_prefix is added. - if self._api_prefix + "printer" in reply_url: # Status update from printer. - if status_code == 200: - if self._connection_state == ConnectionState.connecting: - self.setConnectionState(ConnectionState.connected) - try: - self._json_printer_state = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid printer state message: Not valid JSON.") - return - self._spliceJSONData() - - # Hide connection error message if the connection was restored - if self._connection_message: - self._connection_message.hide() - self._connection_message = None - else: - Logger.log("w", "We got an unexpected status (%s) while requesting printer state", status_code) - pass # TODO: Handle errors - elif self._api_prefix + "print_job" in reply_url: # Status update from print_job: - if status_code == 200: - try: - json_data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print job state message: Not valid JSON.") - return - progress = json_data["progress"] - ## If progress is 0 add a bit so another print can't be sent. - if progress == 0: - progress += 0.001 - elif progress == 1: - self._print_finished = True - else: - self._print_finished = False - self.setProgress(progress * 100) - - state = json_data["state"] - - # There is a short period after aborting or finishing a print where the printer - # reports a "none" state (but the printer is not ready to receive a print) - # If this happens before the print has reached progress == 1, the print has - # been aborted. - if state == "none" or state == "": - if self._last_command == "abort": - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Aborting print...")) - state = "error" - else: - state = "printing" - if state == "wait_cleanup" and self._last_command == "abort": - # Keep showing the "aborted" error state until after the buildplate has been cleaned - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Print aborted. Please check the printer")) - state = "error" - - # NB/TODO: the following two states are intentionally added for future proofing the i18n strings - # but are currently non-functional - if state == "!pausing": - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Pausing print...")) - if state == "!resuming": - self.setErrorText(i18n_catalog.i18nc("@label:MonitorStatus", "Resuming print...")) - - self._updateJobState(state) - self.setTimeElapsed(json_data["time_elapsed"]) - self.setTimeTotal(json_data["time_total"]) - self.setJobName(json_data["name"]) - elif status_code == 404: - self.setProgress(0) # No print job found, so there can't be progress or other data. - self._updateJobState("") - self.setErrorText("") - self.setTimeElapsed(0) - self.setTimeTotal(0) - self.setJobName("") - else: - Logger.log("w", "We got an unexpected status (%s) while requesting print job state", status_code) - elif "snapshot" in reply_url: # Status update from image: - if status_code == 200: - self._camera_image.loadFromData(reply.readAll()) - self.newImage.emit() - elif "auth/verify" in reply_url: # Answer when requesting authentication - if status_code == 401: - if self._authentication_state != AuthState.AuthenticationRequested: - # Only request a new authentication when we have not already done so. - Logger.log("i", "Not authenticated (Current auth state is %s). Attempting to request authentication for printer %s", self._authentication_state, self._key ) - self._requestAuthentication() - elif status_code == 403: - # If we already had an auth (eg; didn't request one), we only need a single 403 to see it as denied. - if self._authentication_state != AuthState.AuthenticationRequested: - Logger.log("d", "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s", self._authentication_state) - self.setAuthenticationState(AuthState.AuthenticationDenied) - elif status_code == 200: - self.setAuthenticationState(AuthState.Authenticated) - global_container_stack = Application.getInstance().getGlobalContainerStack() - - ## Save authentication details. - if global_container_stack: - if "network_authentication_key" in global_container_stack.getMetaData(): - global_container_stack.setMetaDataEntry("network_authentication_key", self._authentication_key) - else: - global_container_stack.addMetaDataEntry("network_authentication_key", self._authentication_key) - if "network_authentication_id" in global_container_stack.getMetaData(): - global_container_stack.setMetaDataEntry("network_authentication_id", self._authentication_id) - else: - global_container_stack.addMetaDataEntry("network_authentication_id", self._authentication_id) - Logger.log("i", "Authentication succeeded for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - Application.getInstance().saveStack(global_container_stack) # Force save so we are sure the data is not lost. - else: - Logger.log("w", "Unable to save authentication for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) - - # Request 'system' printer data once, when we know we have authentication, so we know we can set the system time. - url = QUrl("http://" + self._address + self._api_prefix + "system") - system_data_request = QNetworkRequest(url) - self._manager.get(system_data_request) - - else: # Got a response that we didn't expect, so something went wrong. - Logger.log("e", "While trying to authenticate, we got an unexpected response: %s", reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)) - self.setAuthenticationState(AuthState.NotAuthenticated) - - elif "auth/check" in reply_url: # Check if we are authenticated (user can refuse this!) - try: - data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid authentication check from printer: Not valid JSON.") - return - if data.get("message", "") == "authorized": - Logger.log("i", "Authentication was approved") - self._verifyAuthentication() # Ensure that the verification is really used and correct. - elif data.get("message", "") == "unauthorized": - Logger.log("i", "Authentication was denied.") - self.setAuthenticationState(AuthState.AuthenticationDenied) - else: - pass - - elif self._api_prefix + "system" in reply_url: - # Check if the printer has time, and if this has a valid system time. - try: - data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid authentication request reply from printer: Not valid JSON.") - return - if "time" in data and "utc" in data["time"]: - try: - printer_time = gmtime(float(data["time"]["utc"])) - Logger.log("i", "Printer has system time of: %s", str(printer_time)) - except ValueError: - printer_time = None - if printer_time is not None and printer_time.tm_year < 1990: - # The system time is not valid, sync our current system time to it, so we at least have some reasonable time in the printer. - Logger.log("w", "Printer system time invalid, setting system time") - url = QUrl("http://" + self._address + self._api_prefix + "system/time/utc") - put_request = QNetworkRequest(url) - put_request.setHeader(QNetworkRequest.ContentTypeHeader, "application/json") - self._manager.put(put_request, str(time()).encode()) - - elif reply.operation() == QNetworkAccessManager.PostOperation: - if "/auth/request" in reply_url: - # We got a response to requesting authentication. - try: - data = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid authentication request reply from printer: Not valid JSON.") - return - global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack: # Remove any old data. - Logger.log("d", "Removing old network authentication data for %s as a new one was requested.", self._key) - global_container_stack.removeMetaDataEntry("network_authentication_key") - global_container_stack.removeMetaDataEntry("network_authentication_id") - Application.getInstance().saveStack(global_container_stack) # Force saving so we don't keep wrong auth data. - - self._authentication_key = data["key"] - self._authentication_id = data["id"] - Logger.log("i", "Got a new authentication ID (%s) and KEY (%s). Waiting for authorization.", self._authentication_id, self._getSafeAuthKey()) - - # Check if the authentication is accepted. - self._checkAuthentication() - elif "materials" in reply_url: - # Remove cached post request items. - del self._material_post_objects[id(reply)] - elif "print_job" in reply_url: - self._onUploadFinished() # Make sure the upload flag is reset as reply.finished is not always triggered - try: - reply.uploadProgress.disconnect(self._onUploadProgress) - except: - pass - try: - reply.finished.disconnect(self._onUploadFinished) - except: - pass - Logger.log("d", "Uploading of print succeeded after %s", time() - self._send_gcode_start) - # Only reset the _post_reply if it was the same one. - if reply == self._post_reply: - self._post_reply = None - self._progress_message.hide() - - elif reply.operation() == QNetworkAccessManager.PutOperation: - if "printer/bed/pre_heat" in reply_url: #Pre-heat command has completed. Re-enable syncing pre-heating. - self._processing_preheat_requests = True - if status_code in [200, 201, 202, 204]: - pass # Request was successful! - else: - Logger.log("d", "Something went wrong when trying to update data of API (%s). Message: %s Statuscode: %s", reply_url, reply.readAll(), status_code) - else: - Logger.log("d", "NetworkPrinterOutputDevice got an unhandled operation %s", reply.operation()) - - def _onStreamDownloadProgress(self, bytes_received, bytes_total): - # An MJPG stream is (for our purpose) a stream of concatenated JPG images. - # JPG images start with the marker 0xFFD8, and end with 0xFFD9 - if self._image_reply is None: - return - self._stream_buffer += self._image_reply.readAll() - - if len(self._stream_buffer) > 2000000: # No single camera frame should be 2 Mb or larger - Logger.log("w", "MJPEG buffer exceeds reasonable size. Restarting stream...") - self._stopCamera() # resets stream buffer and start index - self._startCamera() - return - - if self._stream_buffer_start_index == -1: - self._stream_buffer_start_index = self._stream_buffer.indexOf(b'\xff\xd8') - stream_buffer_end_index = self._stream_buffer.lastIndexOf(b'\xff\xd9') - # If this happens to be more than a single frame, then so be it; the JPG decoder will - # ignore the extra data. We do it like this in order not to get a buildup of frames - - if self._stream_buffer_start_index != -1 and stream_buffer_end_index != -1: - jpg_data = self._stream_buffer[self._stream_buffer_start_index:stream_buffer_end_index + 2] - self._stream_buffer = self._stream_buffer[stream_buffer_end_index + 2:] - self._stream_buffer_start_index = -1 - - self._camera_image.loadFromData(jpg_data) - self.newImage.emit() - - def _onUploadProgress(self, bytes_sent, bytes_total): - if bytes_total > 0: - new_progress = bytes_sent / bytes_total * 100 - # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get - # timeout responses if this happens. - self._last_response_time = time() - if new_progress > self._progress_message.getProgress(): - self._progress_message.show() # Ensure that the message is visible. - self._progress_message.setProgress(bytes_sent / bytes_total * 100) - else: - self._progress_message.setProgress(0) - self._progress_message.hide() - - ## Allow new write actions (uploads) again when uploading is finished. - def _onUploadFinished(self): - self._write_finished = True - - ## Let the user decide if the hotends and/or material should be synced with the printer - def materialHotendChangedMessage(self, callback): - Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Sync with your printer"), - i18n_catalog.i18nc("@label", - "Would you like to use your current printer configuration in Cura?"), - i18n_catalog.i18nc("@label", - "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."), - buttons=QMessageBox.Yes + QMessageBox.No, - icon=QMessageBox.Question, - callback=callback - ) - - ## Convenience function to "blur" out all but the last 5 characters of the auth key. - # This can be used to debug print the key, without it compromising the security. - def _getSafeAuthKey(self): - if self._authentication_key is not None: - result = self._authentication_key[-5:] - result = "********" + result - return result - return self._authentication_key diff --git a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py b/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py deleted file mode 100644 index 46538f1af9..0000000000 --- a/plugins/UM3NetworkPrinting/NetworkPrinterOutputDevicePlugin.py +++ /dev/null @@ -1,357 +0,0 @@ -# Copyright (c) 2017 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -import time -import json -from queue import Queue -from threading import Event, Thread - -from PyQt5.QtCore import QObject, pyqtSlot -from PyQt5.QtCore import QUrl -from PyQt5.QtGui import QDesktopServices -from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager -from UM.Application import Application -from UM.Logger import Logger -from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin -from UM.Preferences import Preferences -from UM.Signal import Signal, signalemitter -from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo # type: ignore - -from . import NetworkPrinterOutputDevice, NetworkClusterPrinterOutputDevice - - -## This plugin handles the connection detection & creation of output device objects for the UM3 printer. -# Zero-Conf is used to detect printers, which are saved in a dict. -# If we discover a printer that has the same key as the active machine instance a connection is made. -@signalemitter -class NetworkPrinterOutputDevicePlugin(QObject, OutputDevicePlugin): - def __init__(self): - super().__init__() - self._zero_conf = None - self._browser = None - self._printers = {} - self._cluster_printers_seen = {} # do not forget a cluster printer when we have seen one, to not 'downgrade' from Connect to legacy printer - - self._api_version = "1" - self._api_prefix = "/api/v" + self._api_version + "/" - self._cluster_api_version = "1" - self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/" - - self._network_manager = QNetworkAccessManager() - self._network_manager.finished.connect(self._onNetworkRequestFinished) - - # List of old printer names. This is used to ensure that a refresh of zeroconf does not needlessly forces - # authentication requests. - self._old_printers = [] - - # Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - self.addPrinterSignal.connect(self.addPrinter) - self.removePrinterSignal.connect(self.removePrinter) - Application.getInstance().globalContainerStackChanged.connect(self.reCheckConnections) - - # Get list of manual printers from preferences - self._preferences = Preferences.getInstance() - self._preferences.addPreference("um3networkprinting/manual_instances", "") # A comma-separated list of ip adresses or hostnames - self._manual_instances = self._preferences.getValue("um3networkprinting/manual_instances").split(",") - - self._network_requests_buffer = {} # store api responses until data is complete - - # The zeroconf service changed requests are handled in a separate thread, so we can re-schedule the requests - # which fail to get detailed service info. - # Any new or re-scheduled requests will be appended to the request queue, and the handling thread will pick - # them up and process them. - self._service_changed_request_queue = Queue() - self._service_changed_request_event = Event() - self._service_changed_request_thread = Thread(target = self._handleOnServiceChangedRequests, - daemon = True) - self._service_changed_request_thread.start() - - addPrinterSignal = Signal() - removePrinterSignal = Signal() - printerListChanged = Signal() - - ## Start looking for devices on network. - def start(self): - self.startDiscovery() - - def startDiscovery(self): - self.stop() - if self._browser: - self._browser.cancel() - self._browser = None - self._old_printers = [printer_name for printer_name in self._printers] - self._printers = {} - self.printerListChanged.emit() - # After network switching, one must make a new instance of Zeroconf - # On windows, the instance creation is very fast (unnoticable). Other platforms? - self._zero_conf = Zeroconf() - self._browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', [self._appendServiceChangedRequest]) - - # Look for manual instances from preference - for address in self._manual_instances: - if address: - self.addManualPrinter(address) - - def addManualPrinter(self, address): - if address not in self._manual_instances: - self._manual_instances.append(address) - self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) - - instance_name = "manual:%s" % address - properties = { - b"name": address.encode("utf-8"), - b"address": address.encode("utf-8"), - b"manual": b"true", - b"incomplete": b"true" - } - - if instance_name not in self._printers: - # Add a preliminary printer instance - self.addPrinter(instance_name, address, properties) - - self.checkManualPrinter(address) - self.checkClusterPrinter(address) - - def removeManualPrinter(self, key, address = None): - if key in self._printers: - if not address: - address = self._printers[key].ipAddress - self.removePrinter(key) - - if address in self._manual_instances: - self._manual_instances.remove(address) - self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) - - def checkManualPrinter(self, address): - # Check if a printer exists at this address - # If a printer responds, it will replace the preliminary printer created above - # origin=manual is for tracking back the origin of the call - url = QUrl("http://" + address + self._api_prefix + "system?origin=manual_name") - name_request = QNetworkRequest(url) - self._network_manager.get(name_request) - - def checkClusterPrinter(self, address): - cluster_url = QUrl("http://" + address + self._cluster_api_prefix + "printers/?origin=check_cluster") - cluster_request = QNetworkRequest(cluster_url) - self._network_manager.get(cluster_request) - - ## Handler for all requests that have finished. - def _onNetworkRequestFinished(self, reply): - reply_url = reply.url().toString() - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - - if reply.operation() == QNetworkAccessManager.GetOperation: - address = reply.url().host() - if "origin=manual_name" in reply_url: # Name returned from printer. - if status_code == 200: - - try: - system_info = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.JSONDecodeError: - Logger.log("e", "Printer returned invalid JSON.") - return - except UnicodeDecodeError: - Logger.log("e", "Printer returned incorrect UTF-8.") - return - - if address not in self._network_requests_buffer: - self._network_requests_buffer[address] = {} - self._network_requests_buffer[address]["system"] = system_info - elif "origin=check_cluster" in reply_url: - if address not in self._network_requests_buffer: - self._network_requests_buffer[address] = {} - if status_code == 200: - # We know it's a cluster printer - Logger.log("d", "Cluster printer detected: [%s]", reply.url()) - - try: - cluster_printers_list = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.JSONDecodeError: - Logger.log("e", "Printer returned invalid JSON.") - return - except UnicodeDecodeError: - Logger.log("e", "Printer returned incorrect UTF-8.") - return - - self._network_requests_buffer[address]["cluster"] = True - self._network_requests_buffer[address]["cluster_size"] = len(cluster_printers_list) - else: - Logger.log("d", "This url is not from a cluster printer: [%s]", reply.url()) - self._network_requests_buffer[address]["cluster"] = False - - # Both the system call and cluster call are finished - if (address in self._network_requests_buffer and - "system" in self._network_requests_buffer[address] and - "cluster" in self._network_requests_buffer[address]): - - instance_name = "manual:%s" % address - system_info = self._network_requests_buffer[address]["system"] - machine = "unknown" - if "variant" in system_info: - variant = system_info["variant"] - if variant == "Ultimaker 3": - machine = "9066" - elif variant == "Ultimaker 3 Extended": - machine = "9511" - - properties = { - b"name": system_info["name"].encode("utf-8"), - b"address": address.encode("utf-8"), - b"firmware_version": system_info["firmware"].encode("utf-8"), - b"manual": b"true", - b"machine": machine.encode("utf-8") - } - - if self._network_requests_buffer[address]["cluster"]: - properties[b"cluster_size"] = self._network_requests_buffer[address]["cluster_size"] - - if instance_name in self._printers: - # Only replace the printer if it is still in the list of (manual) printers - self.removePrinter(instance_name) - self.addPrinter(instance_name, address, properties) - - del self._network_requests_buffer[address] - - ## Stop looking for devices on network. - def stop(self): - if self._zero_conf is not None: - Logger.log("d", "zeroconf close...") - self._zero_conf.close() - - def getPrinters(self): - return self._printers - - def reCheckConnections(self): - active_machine = Application.getInstance().getGlobalContainerStack() - if not active_machine: - return - - for key in self._printers: - if key == active_machine.getMetaDataEntry("um_network_key"): - if not self._printers[key].isConnected(): - Logger.log("d", "Connecting [%s]..." % key) - self._printers[key].connect() - self._printers[key].connectionStateChanged.connect(self._onPrinterConnectionStateChanged) - else: - if self._printers[key].isConnected(): - Logger.log("d", "Closing connection [%s]..." % key) - self._printers[key].close() - self._printers[key].connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) - - ## Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - def addPrinter(self, name, address, properties): - cluster_size = int(properties.get(b"cluster_size", -1)) - if cluster_size >= 0: - printer = NetworkClusterPrinterOutputDevice.NetworkClusterPrinterOutputDevice( - name, address, properties, self._api_prefix) - else: - printer = NetworkPrinterOutputDevice.NetworkPrinterOutputDevice(name, address, properties, self._api_prefix) - self._printers[printer.getKey()] = printer - self._cluster_printers_seen[printer.getKey()] = name # Cluster printers that may be temporary unreachable or is rebooted keep being stored here - global_container_stack = Application.getInstance().getGlobalContainerStack() - if global_container_stack and printer.getKey() == global_container_stack.getMetaDataEntry("um_network_key"): - if printer.getKey() not in self._old_printers: # Was the printer already connected, but a re-scan forced? - Logger.log("d", "addPrinter, connecting [%s]..." % printer.getKey()) - self._printers[printer.getKey()].connect() - printer.connectionStateChanged.connect(self._onPrinterConnectionStateChanged) - self.printerListChanged.emit() - - def removePrinter(self, name): - printer = self._printers.pop(name, None) - if printer: - if printer.isConnected(): - printer.disconnect() - printer.connectionStateChanged.disconnect(self._onPrinterConnectionStateChanged) - Logger.log("d", "removePrinter, disconnecting [%s]..." % name) - self.printerListChanged.emit() - - ## Handler for when the connection state of one of the detected printers changes - def _onPrinterConnectionStateChanged(self, key): - if key not in self._printers: - return - if self._printers[key].isConnected(): - self.getOutputDeviceManager().addOutputDevice(self._printers[key]) - else: - self.getOutputDeviceManager().removeOutputDevice(key) - - ## Handler for zeroConf detection. - # Return True or False indicating if the process succeeded. - def _onServiceChanged(self, zeroconf, service_type, name, state_change): - if state_change == ServiceStateChange.Added: - Logger.log("d", "Bonjour service added: %s" % name) - - # First try getting info from zeroconf cache - info = ServiceInfo(service_type, name, properties = {}) - for record in zeroconf.cache.entries_with_name(name.lower()): - info.update_record(zeroconf, time.time(), record) - - for record in zeroconf.cache.entries_with_name(info.server): - info.update_record(zeroconf, time.time(), record) - if info.address: - break - - # Request more data if info is not complete - if not info.address: - Logger.log("d", "Trying to get address of %s", name) - info = zeroconf.get_service_info(service_type, name) - - if info: - type_of_device = info.properties.get(b"type", None) - if type_of_device: - if type_of_device == b"printer": - address = '.'.join(map(lambda n: str(n), info.address)) - self.addPrinterSignal.emit(str(name), address, info.properties) - else: - Logger.log("w", "The type of the found device is '%s', not 'printer'! Ignoring.." % type_of_device ) - else: - Logger.log("w", "Could not get information about %s" % name) - return False - - elif state_change == ServiceStateChange.Removed: - Logger.log("d", "Bonjour service removed: %s" % name) - self.removePrinterSignal.emit(str(name)) - - return True - - ## Appends a service changed request so later the handling thread will pick it up and processes it. - def _appendServiceChangedRequest(self, zeroconf, service_type, name, state_change): - # append the request and set the event so the event handling thread can pick it up - item = (zeroconf, service_type, name, state_change) - self._service_changed_request_queue.put(item) - self._service_changed_request_event.set() - - def _handleOnServiceChangedRequests(self): - while True: - # wait for the event to be set - self._service_changed_request_event.wait(timeout = 5.0) - # stop if the application is shutting down - if Application.getInstance().isShuttingDown(): - return - - self._service_changed_request_event.clear() - - # handle all pending requests - reschedule_requests = [] # a list of requests that have failed so later they will get re-scheduled - while not self._service_changed_request_queue.empty(): - request = self._service_changed_request_queue.get() - zeroconf, service_type, name, state_change = request - try: - result = self._onServiceChanged(zeroconf, service_type, name, state_change) - if not result: - reschedule_requests.append(request) - except Exception: - Logger.logException("e", "Failed to get service info for [%s] [%s], the request will be rescheduled", - service_type, name) - reschedule_requests.append(request) - - # re-schedule the failed requests if any - if reschedule_requests: - for request in reschedule_requests: - self._service_changed_request_queue.put(request) - - @pyqtSlot() - def openControlPanel(self): - Logger.log("d", "Opening print jobs web UI...") - selected_device = self.getOutputDeviceManager().getActiveDevice() - if isinstance(selected_device, NetworkClusterPrinterOutputDevice.NetworkClusterPrinterOutputDevice): - QDesktopServices.openUrl(QUrl(selected_device.getPrintJobsUrl())) diff --git a/plugins/UM3NetworkPrinting/__init__.py b/plugins/UM3NetworkPrinting/__init__.py index 6dd86a16d2..b68086cb75 100644 --- a/plugins/UM3NetworkPrinting/__init__.py +++ b/plugins/UM3NetworkPrinting/__init__.py @@ -1,6 +1,6 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from . import NetworkPrinterOutputDevicePlugin + from . import DiscoverUM3Action from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") From b61832bc03b6367b18d8182c4e10fd51275317b5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 12 Dec 2017 10:41:27 +0100 Subject: [PATCH 078/205] Added manual entry to prevent jogging for UM3 I've not had the time to properly build it yet, so disabling it for now CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py index c476673353..7a0e113d5b 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3PrinterOutputController.py @@ -18,6 +18,9 @@ class LegacyUM3PrinterOutputController(PrinterOutputController): self._preheat_bed_timer.setSingleShot(True) self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) self._preheat_printer = None + + self.can_control_manually = False + # Are we still waiting for a response about preheat? # We need this so we can already update buttons, so it feels more snappy. self._preheat_request_in_progress = False From 005ba4ac5300d86a86fd86a1464bd5d645928cb5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 14 Dec 2017 09:34:16 +0100 Subject: [PATCH 079/205] Changed hotend properties to float CL-541 --- cura/PrinterOutput/ExtruderOuputModel.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/cura/PrinterOutput/ExtruderOuputModel.py b/cura/PrinterOutput/ExtruderOuputModel.py index f8f8088389..b0be6cbbe4 100644 --- a/cura/PrinterOutput/ExtruderOuputModel.py +++ b/cura/PrinterOutput/ExtruderOuputModel.py @@ -36,28 +36,28 @@ class ExtruderOutputModel(QObject): self.activeMaterialChanged.emit() ## Update the hotend temperature. This only changes it locally. - def updateHotendTemperature(self, temperature: int): + def updateHotendTemperature(self, temperature: float): if self._hotend_temperature != temperature: self._hotend_temperature = temperature self.hotendTemperatureChanged.emit() - def updateTargetHotendTemperature(self, temperature: int): + def updateTargetHotendTemperature(self, temperature: float): if self._target_hotend_temperature != temperature: self._target_hotend_temperature = temperature self.targetHotendTemperatureChanged.emit() ## Set the target hotend temperature. This ensures that it's actually sent to the remote. - @pyqtSlot(int) - def setTargetHotendTemperature(self, temperature: int): + @pyqtSlot(float) + def setTargetHotendTemperature(self, temperature: float): self._printer.getController().setTargetHotendTemperature(self._printer, self, temperature) self.updateTargetHotendTemperature(temperature) - @pyqtProperty(int, notify = targetHotendTemperatureChanged) - def targetHotendTemperature(self) -> int: + @pyqtProperty(float, notify = targetHotendTemperatureChanged) + def targetHotendTemperature(self) -> float: return self._target_hotend_temperature - @pyqtProperty(int, notify=hotendTemperatureChanged) - def hotendTemperature(self) -> int: + @pyqtProperty(float, notify=hotendTemperatureChanged) + def hotendTemperature(self) -> float: return self._hotend_temperature @pyqtProperty(str, notify = hotendIDChanged) From 80526893c277ce66853e0dae871ea3b0261a0f96 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 14 Dec 2017 09:36:31 +0100 Subject: [PATCH 080/205] Made setAcceptsCommands protected CL-541 --- cura/PrinterOutputDevice.py | 2 +- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index fdf9a77145..f8408947ab 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -138,7 +138,7 @@ class PrinterOutputDevice(QObject, OutputDevice): return self._accepts_commands ## Set a flag to signal the UI that the printer is not (yet) ready to receive commands - def setAcceptsCommands(self, accepts_commands): + def _setAcceptsCommands(self, accepts_commands): if self._accepts_commands != accepts_commands: self._accepts_commands = accepts_commands diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 967c99995e..e8e340e333 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -79,9 +79,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. if self._authentication_state == AuthState.Authenticated: - self.setAcceptsCommands(True) + self._setAcceptsCommands(True) else: - self.setAcceptsCommands(False) + self._setAcceptsCommands(False) def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", From d3b9ac0d4550ca0dc24334d5be491b3563d963a5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 14 Dec 2017 17:37:57 +0100 Subject: [PATCH 081/205] Also start reworking the USBPrint. It's also time for some much needed code cleaning in that bit. The auto-detect is moved to it's own job, which should make it a whole lot easier to disable it all together. CL-541 --- cura/PrinterOutputDevice.py | 4 + plugins/USBPrinting/AutoDetectBaudJob.py | 44 + plugins/USBPrinting/USBPrinterOutputDevice.py | 792 ++---------------- .../USBPrinterOutputDeviceManager.py | 114 +-- 4 files changed, 146 insertions(+), 808 deletions(-) create mode 100644 plugins/USBPrinting/AutoDetectBaudJob.py diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index f8408947ab..458d0a1080 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -67,6 +67,10 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = connection_state self.connectionStateChanged.emit(self._id) + @pyqtProperty(str, notify = connectionStateChanged) + def connectionState(self): + return self._connection_state + def _update(self): pass diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py new file mode 100644 index 0000000000..8dcc705397 --- /dev/null +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -0,0 +1,44 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from UM.Job import Job +from UM.Logger import Logger + +from time import time +from serial import Serial, SerialException + +class AutoDetectBaudJob(Job): + def __init__(self, serial_port): + super().__init__() + self._serial_port = serial_port + self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] + + def run(self): + Logger.log("d", "Auto detect baud rate started.") + timeout = 3 + + for baud_rate in self._all_baud_rates: + Logger.log("d", "Checking {serial} if baud rate {baud_rate} works".format(serial= self._serial_port, baud_rate = baud_rate)) + try: + serial = Serial(str(self._serial_port), baud_rate, timeout = timeout, writeTimeout = timeout) + except SerialException as e: + Logger.logException("w", "Unable to create serial") + continue + + successful_responses = 0 + + serial.write(b"\n") # Ensure we clear out previous responses + serial.write(b"M105\n") + + timeout_time = time() + timeout + + while timeout_time > time(): + line = serial.readline() + if b"ok T:" in line: + successful_responses += 1 + if successful_responses >= 3: + self.setResult(baud_rate) + return + + serial.write(b"M105\n") + self.setResult(None) # Unable to detect the correct baudrate. \ No newline at end of file diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 1930f5402b..e406d0a479 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -1,752 +1,114 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from .avr_isp import stk500v2, ispBase, intelHex -import serial # type: ignore -import threading -import time -import queue -import re -import functools - -from UM.Application import Application from UM.Logger import Logger -from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState -from UM.Message import Message -from UM.Qt.Duration import DurationFormat - -from PyQt5.QtCore import QUrl, pyqtSlot, pyqtSignal, pyqtProperty - from UM.i18n import i18nCatalog +from UM.Application import Application + +from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState +from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + +from .AutoDetectBaudJob import AutoDetectBaudJob + +from serial import Serial, SerialException +from threading import Thread +from time import time + +import re + catalog = i18nCatalog("cura") class USBPrinterOutputDevice(PrinterOutputDevice): - def __init__(self, serial_port): + def __init__(self, serial_port, baud_rate = None): super().__init__(serial_port) self.setName(catalog.i18nc("@item:inmenu", "USB printing")) self.setShortDescription(catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print via USB")) self.setDescription(catalog.i18nc("@info:tooltip", "Print via USB")) self.setIconName("print") - self.setConnectionText(catalog.i18nc("@info:status", "Connected via USB")) self._serial = None self._serial_port = serial_port - self._error_state = None - self._connect_thread = threading.Thread(target = self._connect) - self._connect_thread.daemon = True + self._timeout = 3 - self._end_stop_thread = None - self._poll_endstop = False + self._use_auto_detect = True - # The baud checking is done by sending a number of m105 commands to the printer and waiting for a readable - # response. If the baudrate is correct, this should make sense, else we get giberish. - self._required_responses_auto_baud = 3 + self._baud_rate = baud_rate + self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] - self._listen_thread = threading.Thread(target=self._listen) - self._listen_thread.daemon = True + # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. + self._update_thread = Thread(target=self._update, daemon = True) - self._update_firmware_thread = threading.Thread(target= self._updateFirmware) - self._update_firmware_thread.daemon = True - self.firmwareUpdateComplete.connect(self._onFirmwareUpdateComplete) + self._last_temperature_request = None - self._heatup_wait_start_time = time.time() + def _autoDetectFinished(self, job): + result = job.getResult() + if result is not None: + self.setBaudRate(result) + self.connect() # Try to connect (actually create serial, etc) - self.jobStateChanged.connect(self._onJobStateChanged) - - ## Queue for commands that need to be send. Used when command is sent when a print is active. - self._command_queue = queue.Queue() - - self._is_printing = False - self._is_paused = False - - ## Set when print is started in order to check running time. - self._print_start_time = None - self._print_estimated_time = None - - ## Keep track where in the provided g-code the print is - self._gcode_position = 0 - - # List of gcode lines to be printed - self._gcode = [] - - # Check if endstops are ever pressed (used for first run) - self._x_min_endstop_pressed = False - self._y_min_endstop_pressed = False - self._z_min_endstop_pressed = False - - self._x_max_endstop_pressed = False - self._y_max_endstop_pressed = False - self._z_max_endstop_pressed = False - - # In order to keep the connection alive we request the temperature every so often from a different extruder. - # This index is the extruder we requested data from the last time. - self._temperature_requested_extruder_index = 0 - - self._current_z = 0 - - self._updating_firmware = False - - self._firmware_file_name = None - self._firmware_update_finished = False - - self._error_message = None - self._error_code = 0 - - onError = pyqtSignal() - - firmwareUpdateComplete = pyqtSignal() - firmwareUpdateChange = pyqtSignal() - - endstopStateChanged = pyqtSignal(str ,bool, arguments = ["key","state"]) - - def _setTargetBedTemperature(self, temperature): - Logger.log("d", "Setting bed temperature to %s", temperature) - self._sendCommand("M140 S%s" % temperature) - - def _setTargetHotendTemperature(self, index, temperature): - Logger.log("d", "Setting hotend %s temperature to %s", index, temperature) - self._sendCommand("M104 T%s S%s" % (index, temperature)) - - def _setHeadPosition(self, x, y , z, speed): - self._sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed)) - - def _setHeadX(self, x, speed): - self._sendCommand("G0 X%s F%s" % (x, speed)) - - def _setHeadY(self, y, speed): - self._sendCommand("G0 Y%s F%s" % (y, speed)) - - def _setHeadZ(self, z, speed): - self._sendCommand("G0 Y%s F%s" % (z, speed)) - - def _homeHead(self): - self._sendCommand("G28 X") - self._sendCommand("G28 Y") - - def _homeBed(self): - self._sendCommand("G28 Z") - - ## Updates the target bed temperature from the printer, and emit a signal if it was changed. - # - # /param temperature The new target temperature of the bed. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetBedTemperature(self, temperature): - if self._target_bed_temperature == temperature: - return False - self._target_bed_temperature = temperature - self.targetBedTemperatureChanged.emit() - return True - - ## Updates the target hotend temperature from the printer, and emit a signal if it was changed. - # - # /param index The index of the hotend. - # /param temperature The new target temperature of the hotend. - # /return boolean, True if the temperature was changed, false if the new temperature has the same value as the already stored temperature - def _updateTargetHotendTemperature(self, index, temperature): - if self._target_hotend_temperatures[index] == temperature: - return False - self._target_hotend_temperatures[index] = temperature - self.targetHotendTemperaturesChanged.emit() - return True - - ## A name for the device. - @pyqtProperty(str, constant = True) - def name(self): - return self.getName() - - ## The address of the device. - @pyqtProperty(str, constant = True) - def address(self): - return self._serial_port - - def startPrint(self): - self.writeStarted.emit(self) - gcode_list = getattr( Application.getInstance().getController().getScene(), "gcode_list") - self._updateJobState("printing") - self.printGCode(gcode_list) - - def _moveHead(self, x, y, z, speed): - self._sendCommand("G91") - self._sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed)) - self._sendCommand("G90") - - ## Start a print based on a g-code. - # \param gcode_list List with gcode (strings). - def printGCode(self, gcode_list): - Logger.log("d", "Started printing g-code") - if self._progress or self._connection_state != ConnectionState.connected: - self._error_message = Message(catalog.i18nc("@info:status", "Unable to start a new job because the printer is busy or not connected."), title = catalog.i18nc("@info:title", "Printer Unavailable")) - self._error_message.show() - Logger.log("d", "Printer is busy or not connected, aborting print") - self.writeError.emit(self) - return - - self._gcode.clear() - for layer in gcode_list: - self._gcode.extend(layer.split("\n")) - - # Reset line number. If this is not done, first line is sometimes ignored - self._gcode.insert(0, "M110") - self._gcode_position = 0 - self._is_printing = True - self._print_start_time = time.time() - - for i in range(0, 4): # Push first 4 entries before accepting other inputs - self._sendNextGcodeLine() - - self.writeFinished.emit(self) - - ## Get the serial port string of this connection. - # \return serial port - def getSerialPort(self): - return self._serial_port - - ## Try to connect the serial. This simply starts the thread, which runs _connect. - def connect(self): - if not self._updating_firmware and not self._connect_thread.isAlive(): - self._connect_thread.start() - - ## Private function (threaded) that actually uploads the firmware. - def _updateFirmware(self): - Logger.log("d", "Attempting to update firmware") - self._error_code = 0 - self.setProgress(0, 100) - self._firmware_update_finished = False - - if self._connection_state != ConnectionState.closed: - self.close() - hex_file = intelHex.readHex(self._firmware_file_name) - - if len(hex_file) == 0: - Logger.log("e", "Unable to read provided hex file. Could not update firmware") - self._updateFirmwareFailedMissingFirmware() - return - - programmer = stk500v2.Stk500v2() - programmer.progress_callback = self.setProgress - - try: - programmer.connect(self._serial_port) - except Exception: - programmer.close() - pass - - # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. - time.sleep(1) - - if not programmer.isConnected(): - Logger.log("e", "Unable to connect with serial. Could not update firmware") - self._updateFirmwareFailedCommunicationError() - return - - self._updating_firmware = True - - try: - programmer.programChip(hex_file) - self._updating_firmware = False - except serial.SerialException as e: - Logger.log("e", "SerialException while trying to update firmware: <%s>" %(repr(e))) - self._updateFirmwareFailedIOError() - return - except Exception as e: - Logger.log("e", "Exception while trying to update firmware: <%s>" %(repr(e))) - self._updateFirmwareFailedUnknown() - return - programmer.close() - - self._updateFirmwareCompletedSucessfully() - return - - ## Private function which makes sure that firmware update process has failed by missing firmware - def _updateFirmwareFailedMissingFirmware(self): - return self._updateFirmwareFailedCommon(4) - - ## Private function which makes sure that firmware update process has failed by an IO error - def _updateFirmwareFailedIOError(self): - return self._updateFirmwareFailedCommon(3) - - ## Private function which makes sure that firmware update process has failed by a communication problem - def _updateFirmwareFailedCommunicationError(self): - return self._updateFirmwareFailedCommon(2) - - ## Private function which makes sure that firmware update process has failed by an unknown error - def _updateFirmwareFailedUnknown(self): - return self._updateFirmwareFailedCommon(1) - - ## Private common function which makes sure that firmware update process has completed/ended with a set progress state - def _updateFirmwareFailedCommon(self, code): - if not code: - raise Exception("Error code not set!") - - self._error_code = code - - self._firmware_update_finished = True - self.resetFirmwareUpdate(update_has_finished = True) - self.progressChanged.emit() - self.firmwareUpdateComplete.emit() - - return - - ## Private function which makes sure that firmware update process has successfully completed - def _updateFirmwareCompletedSucessfully(self): - self.setProgress(100, 100) - self._firmware_update_finished = True - self.resetFirmwareUpdate(update_has_finished = True) - self.firmwareUpdateComplete.emit() - - return - - ## Upload new firmware to machine - # \param filename full path of firmware file to be uploaded - def updateFirmware(self, file_name): - Logger.log("i", "Updating firmware of %s using %s", self._serial_port, file_name) - self._firmware_file_name = file_name - self._update_firmware_thread.start() - - @property - def firmwareUpdateFinished(self): - return self._firmware_update_finished - - def resetFirmwareUpdate(self, update_has_finished = False): - self._firmware_update_finished = update_has_finished - self.firmwareUpdateChange.emit() - - @pyqtSlot() - def startPollEndstop(self): - if not self._poll_endstop: - self._poll_endstop = True - if self._end_stop_thread is None: - self._end_stop_thread = threading.Thread(target=self._pollEndStop) - self._end_stop_thread.daemon = True - self._end_stop_thread.start() - - @pyqtSlot() - def stopPollEndstop(self): - self._poll_endstop = False - self._end_stop_thread = None - - def _pollEndStop(self): - while self._connection_state == ConnectionState.connected and self._poll_endstop: - self.sendCommand("M119") - time.sleep(0.5) - - ## Private connect function run by thread. Can be started by calling connect. - def _connect(self): - Logger.log("d", "Attempting to connect to %s", self._serial_port) - self.setConnectionState(ConnectionState.connecting) - programmer = stk500v2.Stk500v2() - try: - programmer.connect(self._serial_port) # Connect with the serial, if this succeeds, it's an arduino based usb device. - self._serial = programmer.leaveISP() - except ispBase.IspError as e: - programmer.close() - Logger.log("i", "Could not establish connection on %s: %s. Device is not arduino based." %(self._serial_port,str(e))) - except Exception as e: - programmer.close() - Logger.log("i", "Could not establish connection on %s, unknown reasons. Device is not arduino based." % self._serial_port) - - # If the programmer connected, we know its an atmega based version. - # Not all that useful, but it does give some debugging information. - for baud_rate in self._getBaudrateList(): # Cycle all baud rates (auto detect) - Logger.log("d", "Attempting to connect to printer with serial %s on baud rate %s", self._serial_port, baud_rate) - if self._serial is None: - try: - self._serial = serial.Serial(str(self._serial_port), baud_rate, timeout = 3, writeTimeout = 10000) - time.sleep(10) - except serial.SerialException: - Logger.log("d", "Could not open port %s" % self._serial_port) - continue - else: - if not self.setBaudRate(baud_rate): - continue # Could not set the baud rate, go to the next - - time.sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 seconds seems to be the magic number - sucesfull_responses = 0 - timeout_time = time.time() + 5 - self._serial.write(b"\n") - self._sendCommand("M105") # Request temperature, as this should (if baudrate is correct) result in a command with "T:" in it - while timeout_time > time.time(): - line = self._readline() - if line is None: - Logger.log("d", "No response from serial connection received.") - # Something went wrong with reading, could be that close was called. - self.setConnectionState(ConnectionState.closed) - return - - if b"T:" in line: - Logger.log("d", "Correct response for auto-baudrate detection received.") - self._serial.timeout = 0.5 - sucesfull_responses += 1 - if sucesfull_responses >= self._required_responses_auto_baud: - self._serial.timeout = 2 # Reset serial timeout - self.setConnectionState(ConnectionState.connected) - self._listen_thread.start() # Start listening - Logger.log("i", "Established printer connection on port %s" % self._serial_port) - return - - self._sendCommand("M105") # Send M105 as long as we are listening, otherwise we end up in an undefined state - - Logger.log("e", "Baud rate detection for %s failed", self._serial_port) - self.close() # Unable to connect, wrap up. - self.setConnectionState(ConnectionState.closed) - - ## Set the baud rate of the serial. This can cause exceptions, but we simply want to ignore those. def setBaudRate(self, baud_rate): - try: - self._serial.baudrate = baud_rate - return True - except Exception as e: - return False + if baud_rate not in self._all_baud_rates: + Logger.log("w", "Not updating baudrate to {baud_rate} as it's an unknown baudrate".format(baud_rate=baud_rate)) + return - ## Close the printer connection - def close(self): - Logger.log("d", "Closing the USB printer connection.") - if self._connect_thread.isAlive(): + self._baud_rate = baud_rate + + def connect(self): + if self._baud_rate is None: + if self._use_auto_detect: + auto_detect_job = AutoDetectBaudJob(self._serial_port) + auto_detect_job.start() + auto_detect_job.finished.connect(self._autoDetectFinished) + return + if self._serial is None: try: - self._connect_thread.join() - except Exception as e: - Logger.log("d", "PrinterConnection.close: %s (expected)", e) - pass # This should work, but it does fail sometimes for some reason + self._serial = Serial(str(self._serial_port), self._baud_rate, timeout=self._timeout, writeTimeout=self._timeout) + except SerialException: + return + container_stack = Application.getInstance().getGlobalContainerStack() + num_extruders = container_stack.getProperty("machine_extruder_count", "value") - self._connect_thread = threading.Thread(target = self._connect) - self._connect_thread.daemon = True + # Ensure that a printer is created. + self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=num_extruders)] + self.setConnectionState(ConnectionState.connected) + self._update_thread.start() - self.setConnectionState(ConnectionState.closed) - if self._serial is not None: - try: - self._listen_thread.join() - except: - pass - if self._serial is not None: # Avoid a race condition when a thread can change the value of self._serial to None - self._serial.close() + def sendCommand(self, command): + if self._connection_state == ConnectionState.connected: + self._sendCommand(command) - self._listen_thread = threading.Thread(target = self._listen) - self._listen_thread.daemon = True - self._serial = None - - ## Directly send the command, withouth checking connection state (eg; printing). - # \param cmd string with g-code - def _sendCommand(self, cmd): + def _sendCommand(self, command): if self._serial is None: return - if "M109" in cmd or "M190" in cmd: - self._heatup_wait_start_time = time.time() + if type(command == str):q + command = (command + "\n").encode() + if not command.endswith(b"\n"): + command += b"\n" - try: - command = (cmd + "\n").encode() - self._serial.write(b"\n") - self._serial.write(command) - except serial.SerialTimeoutException: - Logger.log("w","Serial timeout while writing to serial port, trying again.") - try: - time.sleep(0.5) - self._serial.write((cmd + "\n").encode()) - except Exception as e: - Logger.log("e","Unexpected error while writing serial port %s " % e) - self._setErrorState("Unexpected error while writing serial port %s " % e) - self.close() - except Exception as e: - Logger.log("e","Unexpected error while writing serial port %s" % e) - self._setErrorState("Unexpected error while writing serial port %s " % e) - self.close() + self._serial.write(b"\n") + self._serial.write(command) - ## Send a command to printer. - # \param cmd string with g-code - def sendCommand(self, cmd): - if self._progress: - self._command_queue.put(cmd) - elif self._connection_state == ConnectionState.connected: - self._sendCommand(cmd) + def _update(self): + while self._connection_state == ConnectionState.connected and self._serial is not None: + line = self._serial.readline() + if self._last_temperature_request is None or time() > self._last_temperature_request + self._timeout: + # Timeout, or no request has been sent at all. + self.sendCommand("M105") + self._last_temperature_request = time() - ## Set the error state with a message. - # \param error String with the error message. - def _setErrorState(self, error): - self._updateJobState("error") - self._error_state = error - self.onError.emit() + if b"ok T:" in line or line.startswith(b"T:"): # Temperature message + extruder_temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) + # Update all temperature values + for match, extruder in zip(extruder_temperature_matches, self._printers[0].extruders): + extruder.updateHotendTemperature(float(match[1])) + extruder.updateTargetHotendTemperature(float(match[2])) - ## Request the current scene to be sent to a USB-connected printer. - # - # \param nodes A collection of scene nodes to send. This is ignored. - # \param file_name \type{string} A suggestion for a file name to write. - # \param filter_by_machine Whether to filter MIME types by machine. This - # is ignored. - # \param kwargs Keyword arguments. - def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): - container_stack = Application.getInstance().getGlobalContainerStack() - - if container_stack.getProperty("machine_gcode_flavor", "value") == "UltiGCode": - self._error_message = Message(catalog.i18nc("@info:status", "This printer does not support USB printing because it uses UltiGCode flavor."), title = catalog.i18nc("@info:title", "USB Printing")) - self._error_message.show() - return - elif not container_stack.getMetaDataEntry("supports_usb_connection"): - self._error_message = Message(catalog.i18nc("@info:status", "Unable to start a new job because the printer does not support usb printing."), title = catalog.i18nc("@info:title", "Warning")) - self._error_message.show() - return - - self.setJobName(file_name) - self._print_estimated_time = int(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)) - - Application.getInstance().getController().setActiveStage("MonitorStage") - self.startPrint() - - def _setEndstopState(self, endstop_key, value): - if endstop_key == b"x_min": - if self._x_min_endstop_pressed != value: - self.endstopStateChanged.emit("x_min", value) - self._x_min_endstop_pressed = value - elif endstop_key == b"y_min": - if self._y_min_endstop_pressed != value: - self.endstopStateChanged.emit("y_min", value) - self._y_min_endstop_pressed = value - elif endstop_key == b"z_min": - if self._z_min_endstop_pressed != value: - self.endstopStateChanged.emit("z_min", value) - self._z_min_endstop_pressed = value - - ## Listen thread function. - def _listen(self): - Logger.log("i", "Printer connection listen thread started for %s" % self._serial_port) - container_stack = Application.getInstance().getGlobalContainerStack() - temperature_request_timeout = time.time() - ok_timeout = time.time() - while self._connection_state == ConnectionState.connected: - line = self._readline() - if line is None: - break # None is only returned when something went wrong. Stop listening - - if time.time() > temperature_request_timeout: - if self._num_extruders > 1: - self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders - self.sendCommand("M105 T%d" % (self._temperature_requested_extruder_index)) - else: - self.sendCommand("M105") - temperature_request_timeout = time.time() + 5 - - if line.startswith(b"Error:"): - # Oh YEAH, consistency. - # Marlin reports a MIN/MAX temp error as "Error:x\n: Extruder switched off. MAXTEMP triggered !\n" - # But a bed temp error is reported as "Error: Temperature heated bed switched off. MAXTEMP triggered !!" - # So we can have an extra newline in the most common case. Awesome work people. - if re.match(b"Error:[0-9]\n", line): - line = line.rstrip() + self._readline() - - # Skip the communication errors, as those get corrected. - if b"Extruder switched off" in line or b"Temperature heated bed switched off" in line or b"Something is wrong, please turn off the printer." in line: - if not self.hasError(): - self._setErrorState(line[6:]) - - elif b" T:" in line or line.startswith(b"T:"): # Temperature message - temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) - temperature_set = False - try: - for match in temperature_matches: - if match[0]: - extruder_nr = int(match[0]) - if extruder_nr >= container_stack.getProperty("machine_extruder_count", "value"): - continue - if match[1]: - self._setHotendTemperature(extruder_nr, float(match[1])) - temperature_set = True - if match[2]: - self._updateTargetHotendTemperature(extruder_nr, float(match[2])) - else: - requested_temperatures = match - if not temperature_set and requested_temperatures: - if requested_temperatures[1]: - self._setHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[1])) - if requested_temperatures[2]: - self._updateTargetHotendTemperature(self._temperature_requested_extruder_index, float(requested_temperatures[2])) - except: - Logger.log("w", "Could not parse hotend temperatures from response: %s", line) - # Check if there's also a bed temperature - temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) - if container_stack.getProperty("machine_heated_bed", "value") and len(temperature_matches) > 0: - match = temperature_matches[0] - try: - if match[0]: - self._setBedTemperature(float(match[0])) - if match[1]: - self._updateTargetBedTemperature(float(match[1])) - except: - Logger.log("w", "Could not parse bed temperature from response: %s", line) - - elif b"_min" in line or b"_max" in line: - tag, value = line.split(b":", 1) - self._setEndstopState(tag,(b"H" in value or b"TRIGGERED" in value)) - - if self._is_printing: - if line == b"" and time.time() > ok_timeout: - line = b"ok" # Force a timeout (basically, send next command) - - if b"ok" in line: - ok_timeout = time.time() + 5 - if not self._command_queue.empty(): - self._sendCommand(self._command_queue.get()) - elif self._is_paused: - line = b"" # Force getting temperature as keep alive - else: - self._sendNextGcodeLine() - elif b"resend" in line.lower() or b"rs" in line: # Because a resend can be asked with "resend" and "rs" - try: - Logger.log("d", "Got a resend response") - self._gcode_position = int(line.replace(b"N:",b" ").replace(b"N",b" ").replace(b":",b" ").split()[-1]) - except: - if b"rs" in line: - self._gcode_position = int(line.split()[1]) - - # Request the temperature on comm timeout (every 2 seconds) when we are not printing.) - if line == b"": - if self._num_extruders > 1: - self._temperature_requested_extruder_index = (self._temperature_requested_extruder_index + 1) % self._num_extruders - self.sendCommand("M105 T%d" % self._temperature_requested_extruder_index) - else: - self.sendCommand("M105") - - Logger.log("i", "Printer connection listen thread stopped for %s" % self._serial_port) - - ## Send next Gcode in the gcode list - def _sendNextGcodeLine(self): - if self._gcode_position >= len(self._gcode): - return - line = self._gcode[self._gcode_position] - - if ";" in line: - line = line[:line.find(";")] - line = line.strip() - - # Don't send empty lines. But we do have to send something, so send - # m105 instead. - # Don't send the M0 or M1 to the machine, as M0 and M1 are handled as - # an LCD menu pause. - if line == "" or line == "M0" or line == "M1": - line = "M105" - try: - if ("G0" in line or "G1" in line) and "Z" in line: - z = float(re.search("Z([0-9\.]*)", line).group(1)) - if self._current_z != z: - self._current_z = z - except Exception as e: - Logger.log("e", "Unexpected error with printer connection, could not parse current Z: %s: %s" % (e, line)) - self._setErrorState("Unexpected error: %s" %e) - checksum = functools.reduce(lambda x,y: x^y, map(ord, "N%d%s" % (self._gcode_position, line))) - - self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum)) - - progress = (self._gcode_position / len(self._gcode)) - - elapsed_time = int(time.time() - self._print_start_time) - self.setTimeElapsed(elapsed_time) - estimated_time = self._print_estimated_time - if progress > .1: - estimated_time = self._print_estimated_time * (1-progress) + elapsed_time - self.setTimeTotal(estimated_time) - - self._gcode_position += 1 - self.setProgress(progress * 100) - self.progressChanged.emit() - - ## Set the state of the print. - # Sent from the print monitor - def _setJobState(self, job_state): - if job_state == "pause": - self._is_paused = True - self._updateJobState("paused") - elif job_state == "print": - self._is_paused = False - self._updateJobState("printing") - elif job_state == "abort": - self.cancelPrint() - - def _onJobStateChanged(self): - # clear the job name & times when printing is done or aborted - if self._job_state == "ready": - self.setJobName("") - self.setTimeElapsed(0) - self.setTimeTotal(0) - - ## Set the progress of the print. - # It will be normalized (based on max_progress) to range 0 - 100 - def setProgress(self, progress, max_progress = 100): - self._progress = (progress / max_progress) * 100 # Convert to scale of 0-100 - if self._progress == 100: - # Printing is done, reset progress - self._gcode_position = 0 - self.setProgress(0) - self._is_printing = False - self._is_paused = False - self._updateJobState("ready") - self.progressChanged.emit() - - ## Cancel the current print. Printer connection wil continue to listen. - def cancelPrint(self): - self._gcode_position = 0 - self.setProgress(0) - self._gcode = [] - - # Turn off temperatures, fan and steppers - self._sendCommand("M140 S0") - self._sendCommand("M104 S0") - self._sendCommand("M107") - # Home XY to prevent nozzle resting on aborted print - # Don't home bed because it may crash the printhead into the print on printers that home on the bottom - self.homeHead() - self._sendCommand("M84") - self._is_printing = False - self._is_paused = False - self._updateJobState("ready") - Application.getInstance().getController().setActiveStage("PrepareStage") - - ## Check if the process did not encounter an error yet. - def hasError(self): - return self._error_state is not None - - ## private read line used by printer connection to listen for data on serial port. - def _readline(self): - if self._serial is None: - return None - try: - ret = self._serial.readline() - except Exception as e: - Logger.log("e", "Unexpected error while reading serial port. %s" % e) - self._setErrorState("Printer has been disconnected") - self.close() - return None - return ret - - ## Create a list of baud rates at which we can communicate. - # \return list of int - def _getBaudrateList(self): - ret = [115200, 250000, 230400, 57600, 38400, 19200, 9600] - return ret - - def _onFirmwareUpdateComplete(self): - self._update_firmware_thread.join() - self._update_firmware_thread = threading.Thread(target = self._updateFirmware) - self._update_firmware_thread.daemon = True - - self.connect() - - ## Pre-heats the heated bed of the printer, if it has one. - # - # \param temperature The temperature to heat the bed to, in degrees - # Celsius. - # \param duration How long the bed should stay warm, in seconds. This is - # ignored because there is no g-code to set this. - @pyqtSlot(float, float) - def preheatBed(self, temperature, duration): - Logger.log("i", "Pre-heating the bed to %i degrees.", temperature) - self._setTargetBedTemperature(temperature) - self.preheatBedRemainingTimeChanged.emit() - - ## Cancels pre-heating the heated bed of the printer. - # - # If the bed is not pre-heated, nothing happens. - @pyqtSlot() - def cancelPreheatBed(self): - Logger.log("i", "Cancelling pre-heating of the bed.") - self._setTargetBedTemperature(0) - self.preheatBedRemainingTimeChanged.emit() + bed_temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) + match = bed_temperature_matches[0] + if match[0]: + self._printers[0].updateBedTemperature(float(match[0])) + if match[1]: + self._printers[0].updateTargetBedTemperature(float(match[1])) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 62412bb521..439ca1feaf 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -29,6 +29,9 @@ i18n_catalog = i18nCatalog("cura") ## Manager class that ensures that a usbPrinteroutput device is created for every connected USB printer. @signalemitter class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): + addUSBOutputDeviceSignal = Signal() + progressChanged = pyqtSignal() + def __init__(self, parent = None): super().__init__(parent = parent) self._serial_port_list = [] @@ -43,12 +46,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): Application.getInstance().applicationShuttingDown.connect(self.stop) self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - addUSBOutputDeviceSignal = Signal() - connectionStateChanged = pyqtSignal() - - progressChanged = pyqtSignal() - firmwareUpdateChange = pyqtSignal() - @pyqtProperty(float, notify = progressChanged) def progress(self): progress = 0 @@ -63,15 +60,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): return device._error_code return 0 - ## Return True if all printers finished firmware update - @pyqtProperty(float, notify = firmwareUpdateChange) - def firmwareUpdateCompleteStatus(self): - complete = True - for printer_name, device in self._usb_output_devices.items(): # TODO: @UnusedVariable "printer_name" - if not device.firmwareUpdateFinished: - complete = False - return complete - def start(self): self._check_updates = True self._update_thread.start() @@ -79,58 +67,28 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): def stop(self): self._check_updates = False - def _updateThread(self): - while self._check_updates: - result = self.getSerialPortList(only_list_usb = True) - self._addRemovePorts(result) - time.sleep(5) - - ## Show firmware interface. - # This will create the view if its not already created. - def spawnFirmwareInterface(self, serial_port): - if self._firmware_view is None: - path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") - self._firmware_view = Application.getInstance().createQmlComponent(path, {"manager": self}) - - self._firmware_view.show() - - @pyqtSlot(str) - def updateAllFirmware(self, file_name): - if file_name.startswith("file://"): - file_name = QUrl(file_name).toLocalFile() # File dialogs prepend the path with file://, which we don't need / want - - if not self._usb_output_devices: - Message(i18n_catalog.i18nc("@info", "Unable to update firmware because there are no printers connected."), title = i18n_catalog.i18nc("@info:title", "Warning")).show() + def _onConnectionStateChanged(self, serial_port): + if serial_port not in self._usb_output_devices: return - for printer_connection in self._usb_output_devices: - self._usb_output_devices[printer_connection].resetFirmwareUpdate() - self.spawnFirmwareInterface("") - for printer_connection in self._usb_output_devices: - try: - self._usb_output_devices[printer_connection].updateFirmware(file_name) - except FileNotFoundError: - # Should only happen in dev environments where the resources/firmware folder is absent. - self._usb_output_devices[printer_connection].setProgress(100, 100) - Logger.log("w", "No firmware found for printer %s called '%s'", printer_connection, file_name) - Message(i18n_catalog.i18nc("@info", - "Could not find firmware required for the printer at %s.") % printer_connection, title = i18n_catalog.i18nc("@info:title", "Printer Firmware")).show() - self._firmware_view.close() + changed_device = self._usb_output_devices[serial_port] + if changed_device.connectionState == ConnectionState.connected: + self.getOutputDeviceManager().addOutputDevice(changed_device) + else: + self.getOutputDeviceManager().removeOutputDevice(serial_port) + def _updateThread(self): + while self._check_updates: + container_stack = Application.getInstance().getGlobalContainerStack() + if container_stack is None: + time.sleep(5) continue - - @pyqtSlot(str, str, result = bool) - def updateFirmwareBySerial(self, serial_port, file_name): - if serial_port in self._usb_output_devices: - self.spawnFirmwareInterface(self._usb_output_devices[serial_port].getSerialPort()) - try: - self._usb_output_devices[serial_port].updateFirmware(file_name) - except FileNotFoundError: - self._firmware_view.close() - Logger.log("e", "Could not find firmware required for this machine called '%s'", file_name) - return False - return True - return False + if container_stack.getMetaDataEntry("supports_usb_connection"): + port_list = self.getSerialPortList(only_list_usb=True) + else: + port_list = [] # Just use an empty list; all USB devices will be removed. + self._addRemovePorts(port_list) + time.sleep(5) ## Return the singleton instance of the USBPrinterManager @classmethod @@ -205,47 +163,17 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): continue self._serial_port_list = list(serial_ports) - devices_to_remove = [] for port, device in self._usb_output_devices.items(): if port not in self._serial_port_list: device.close() - devices_to_remove.append(port) - - for port in devices_to_remove: - del self._usb_output_devices[port] ## Because the model needs to be created in the same thread as the QMLEngine, we use a signal. def addOutputDevice(self, serial_port): device = USBPrinterOutputDevice.USBPrinterOutputDevice(serial_port) device.connectionStateChanged.connect(self._onConnectionStateChanged) device.connect() - device.progressChanged.connect(self.progressChanged) - device.firmwareUpdateChange.connect(self.firmwareUpdateChange) self._usb_output_devices[serial_port] = device - ## If one of the states of the connected devices change, we might need to add / remove them from the global list. - def _onConnectionStateChanged(self, serial_port): - success = True - try: - if self._usb_output_devices[serial_port].connectionState == ConnectionState.connected: - self.getOutputDeviceManager().addOutputDevice(self._usb_output_devices[serial_port]) - else: - success = success and self.getOutputDeviceManager().removeOutputDevice(serial_port) - if success: - self.connectionStateChanged.emit() - except KeyError: - Logger.log("w", "Connection state of %s changed, but it was not found in the list") - - @pyqtProperty(QObject , notify = connectionStateChanged) - def connectedPrinterList(self): - self._usb_output_devices_model = ListModel() - self._usb_output_devices_model.addRoleName(Qt.UserRole + 1, "name") - self._usb_output_devices_model.addRoleName(Qt.UserRole + 2, "printer") - for connection in self._usb_output_devices: - if self._usb_output_devices[connection].connectionState == ConnectionState.connected: - self._usb_output_devices_model.appendItem({"name": connection, "printer": self._usb_output_devices[connection]}) - return self._usb_output_devices_model - ## Create a list of serial ports on the system. # \param only_list_usb If true, only usb ports are listed def getSerialPortList(self, only_list_usb = False): From d3d9a6e1bb0dfb4c83688801b900c5b7d346e0b6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 13:25:35 +0100 Subject: [PATCH 082/205] Starting a print with USB printer now works with reworked printeroutputmodel CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 126 ++++++++++++++++-- 1 file changed, 116 insertions(+), 10 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index e406d0a479..ace43e41d7 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -4,17 +4,21 @@ from UM.Logger import Logger from UM.i18n import i18nCatalog from UM.Application import Application +from UM.Qt.Duration import DurationFormat from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel +from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from .AutoDetectBaudJob import AutoDetectBaudJob from serial import Serial, SerialException from threading import Thread from time import time +from queue import Queue import re +import functools # Used for reduce catalog = i18nCatalog("cura") @@ -32,9 +36,15 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._timeout = 3 + # List of gcode lines to be printed + self._gcode = [] + self._gcode_position = 0 + self._use_auto_detect = True self._baud_rate = baud_rate + + self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. @@ -42,6 +52,48 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._last_temperature_request = None + self._is_printing = False # A print is being sent. + + ## Set when print is started in order to check running time. + self._print_start_time = None + self._print_estimated_time = None + + # Queue for commands that need to be send. Used when command is sent when a print is active. + self._command_queue = Queue() + + ## Request the current scene to be sent to a USB-connected printer. + # + # \param nodes A collection of scene nodes to send. This is ignored. + # \param file_name \type{string} A suggestion for a file name to write. + # \param filter_by_machine Whether to filter MIME types by machine. This + # is ignored. + # \param kwargs Keyword arguments. + def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): + gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") + self._printGCode(gcode_list) + + ## Start a print based on a g-code. + # \param gcode_list List with gcode (strings). + def _printGCode(self, gcode_list): + self._gcode.clear() + + for layer in gcode_list: + self._gcode.extend(layer.split("\n")) + + # Reset line number. If this is not done, first line is sometimes ignored + self._gcode.insert(0, "M110") + self._gcode_position = 0 + self._is_printing = True + self._print_start_time = time() + + self._print_estimated_time = int(Application.getInstance().getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.Seconds)) + + for i in range(0, 4): # Push first 4 entries before accepting other inputs + self._sendNextGcodeLine() + + self.writeFinished.emit(self) + + def _autoDetectFinished(self, job): result = job.getResult() if result is not None: @@ -76,18 +128,19 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._update_thread.start() def sendCommand(self, command): - if self._connection_state == ConnectionState.connected: + if self._is_printing: + self._command_queue.put(command) + elif self._connection_state == ConnectionState.connected: self._sendCommand(command) def _sendCommand(self, command): if self._serial is None: return - if type(command == str):q + if type(command == str): command = (command + "\n").encode() if not command.endswith(b"\n"): command += b"\n" - self._serial.write(b"\n") self._serial.write(command) @@ -103,12 +156,65 @@ class USBPrinterOutputDevice(PrinterOutputDevice): extruder_temperature_matches = re.findall(b"T(\d*): ?([\d\.]+) ?\/?([\d\.]+)?", line) # Update all temperature values for match, extruder in zip(extruder_temperature_matches, self._printers[0].extruders): - extruder.updateHotendTemperature(float(match[1])) - extruder.updateTargetHotendTemperature(float(match[2])) + if match[1]: + extruder.updateHotendTemperature(float(match[1])) + if match[2]: + extruder.updateTargetHotendTemperature(float(match[2])) bed_temperature_matches = re.findall(b"B: ?([\d\.]+) ?\/?([\d\.]+)?", line) - match = bed_temperature_matches[0] - if match[0]: - self._printers[0].updateBedTemperature(float(match[0])) - if match[1]: - self._printers[0].updateTargetBedTemperature(float(match[1])) + if bed_temperature_matches: + match = bed_temperature_matches[0] + if match[0]: + self._printers[0].updateBedTemperature(float(match[0])) + if match[1]: + self._printers[0].updateTargetBedTemperature(float(match[1])) + + if self._is_printing: + if b"ok" in line: + if not self._command_queue.empty(): + self._sendCommand(self._command_queue.get()) + else: + self._sendNextGcodeLine() + elif b"resend" in line.lower() or b"rs" in line: + # A resend can be requested either by Resend, resend or rs. + try: + self._gcode_position = int(line.replace(b"N:", b" ").replace(b"N", b" ").replace(b":", b" ").split()[-1]) + except: + if b"rs" in line: + # In some cases of the RS command it needs to be handled differently. + self._gcode_position = int(line.split()[1]) + + def _sendNextGcodeLine(self): + if self._gcode_position >= len(self._gcode): + return + line = self._gcode[self._gcode_position] + + if ";" in line: + line = line[:line.find(";")] + + line = line.strip() + + # Don't send empty lines. But we do have to send something, so send M105 instead. + # Don't send the M0 or M1 to the machine, as M0 and M1 are handled as an LCD menu pause. + if line == "" or line == "M0" or line == "M1": + line = "M105" + + checksum = functools.reduce(lambda x, y: x ^ y, map(ord, "N%d%s" % (self._gcode_position, line))) + + self._sendCommand("N%d%s*%d" % (self._gcode_position, line, checksum)) + + progress = (self._gcode_position / len(self._gcode)) + + elapsed_time = int(time() - self._print_start_time) + print_job = self._printers[0].activePrintJob + if print_job is None: + print_job = PrintJobOutputModel(output_controller = None) + self._printers[0].updateActivePrintJob(print_job) + + print_job.updateTimeElapsed(elapsed_time) + estimated_time = self._print_estimated_time + if progress > .1: + estimated_time = self._print_estimated_time * (1 - progress) + elapsed_time + print_job.updateTimeTotal(estimated_time) + + self._gcode_position += 1 From aef54f99dbb74d75225e53af09f57839436d5fca Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 13:43:19 +0100 Subject: [PATCH 083/205] If a print is completed, it's now also updated in UI CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index ace43e41d7..6c5d4ecb7f 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -186,6 +186,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): def _sendNextGcodeLine(self): if self._gcode_position >= len(self._gcode): + self._printers[0].updateActivePrintJob(None) + self._is_printing = False return line = self._gcode[self._gcode_position] From e2845a224cb1a0300cc3504ec71c749930d24906 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 14:01:58 +0100 Subject: [PATCH 084/205] No longer start print if it's already started CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 6c5d4ecb7f..7fbbb12be3 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -69,6 +69,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # is ignored. # \param kwargs Keyword arguments. def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): + if self._is_printing: + return # Aleady printing + + Application.getInstance().showPrintMonitor.emit(True) + gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") self._printGCode(gcode_list) @@ -93,7 +98,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.writeFinished.emit(self) - def _autoDetectFinished(self, job): result = job.getResult() if result is not None: @@ -210,7 +214,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): elapsed_time = int(time() - self._print_start_time) print_job = self._printers[0].activePrintJob if print_job is None: - print_job = PrintJobOutputModel(output_controller = None) + print_job = PrintJobOutputModel(output_controller = None, name= Application.getInstance().getPrintInformation().jobName) self._printers[0].updateActivePrintJob(print_job) print_job.updateTimeElapsed(elapsed_time) From a6deddb6aec95a778d34055934ed163548659dd5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 14:30:01 +0100 Subject: [PATCH 085/205] Added controller for USB printer CL-541 --- .../USBPrinting/USBPrinterOutputController.py | 57 +++++++++++++++++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 8 ++- 2 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 plugins/USBPrinting/USBPrinterOutputController.py diff --git a/plugins/USBPrinting/USBPrinterOutputController.py b/plugins/USBPrinting/USBPrinterOutputController.py new file mode 100644 index 0000000000..c42348ee6e --- /dev/null +++ b/plugins/USBPrinting/USBPrinterOutputController.py @@ -0,0 +1,57 @@ +# Copyright (c) 2017 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from cura.PrinterOutput.PrinterOutputController import PrinterOutputController +from PyQt5.QtCore import QTimer + +MYPY = False +if MYPY: + from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel + from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel + + +class USBPrinterOuptutController(PrinterOutputController): + def __init__(self, output_device): + super().__init__(output_device) + + self._preheat_bed_timer = QTimer() + self._preheat_bed_timer.setSingleShot(True) + self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished) + self._preheat_printer = None + + def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed): + self._output_device.sendCommand("G91") + self._output_device.sendCommand("G0 X%s Y%s Z%s F%s" % (x, y, z, speed)) + self._output_device.sendCommand("G90") + + def homeHead(self, printer): + self._output_device.sendCommand("G28 X") + self._output_device.sendCommand("G28 Y") + + def homeBed(self, printer): + self._output_device.sendCommand("G28 Z") + + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): + try: + temperature = round(temperature) # The API doesn't allow floating point. + duration = round(duration) + except ValueError: + return # Got invalid values, can't pre-heat. + + self.setTargetBedTemperature(printer, temperature=temperature) + self._preheat_bed_timer.setInterval(duration * 1000) + self._preheat_bed_timer.start() + self._preheat_printer = printer + printer.updateIsPreheating(True) + + def cancelPreheatBed(self, printer: "PrinterOutputModel"): + self.preheatBed(printer, temperature=0, duration=0) + self._preheat_bed_timer.stop() + printer.updateIsPreheating(False) + + def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: int): + self._output_device.sendCommand("M140 S%s" % temperature) + + def _onPreheatBedTimerFinished(self): + self.setTargetBedTemperature(self._preheat_printer, 0) + self._preheat_printer.updateIsPreheating(False) \ No newline at end of file diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 7fbbb12be3..d7fd2cea7c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -11,6 +11,7 @@ from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from .AutoDetectBaudJob import AutoDetectBaudJob +from .USBPrinterOutputController import USBPrinterOuptutController from serial import Serial, SerialException from threading import Thread @@ -44,7 +45,6 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._baud_rate = baud_rate - self._all_baud_rates = [115200, 250000, 230400, 57600, 38400, 19200, 9600] # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. @@ -58,6 +58,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._print_start_time = None self._print_estimated_time = None + self._accepts_commands = True + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() @@ -127,7 +129,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): num_extruders = container_stack.getProperty("machine_extruder_count", "value") # Ensure that a printer is created. - self._printers = [PrinterOutputModel(output_controller=None, number_of_extruders=num_extruders)] + self._printers = [PrinterOutputModel(output_controller=USBPrinterOuptutController(self), number_of_extruders=num_extruders)] self.setConnectionState(ConnectionState.connected) self._update_thread.start() @@ -214,7 +216,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): elapsed_time = int(time() - self._print_start_time) print_job = self._printers[0].activePrintJob if print_job is None: - print_job = PrintJobOutputModel(output_controller = None, name= Application.getInstance().getPrintInformation().jobName) + print_job = PrintJobOutputModel(output_controller = USBPrinterOuptutController(self), name= Application.getInstance().getPrintInformation().jobName) self._printers[0].updateActivePrintJob(print_job) print_job.updateTimeElapsed(elapsed_time) From 6bdce54e1dc5d0a4a47538a9091835a31e7d651a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 14:47:06 +0100 Subject: [PATCH 086/205] Enable progress bar for USB printing CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + .../USBPrinting/USBPrinterOutputDeviceManager.py | 14 -------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index d7fd2cea7c..40964bdd20 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -217,6 +217,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): print_job = self._printers[0].activePrintJob if print_job is None: print_job = PrintJobOutputModel(output_controller = USBPrinterOuptutController(self), name= Application.getInstance().getPrintInformation().jobName) + print_job.updateState("printing") self._printers[0].updateActivePrintJob(print_job) print_job.updateTimeElapsed(elapsed_time) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 439ca1feaf..0f98c11ddf 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -46,20 +46,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): Application.getInstance().applicationShuttingDown.connect(self.stop) self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. - @pyqtProperty(float, notify = progressChanged) - def progress(self): - progress = 0 - for printer_name, device in self._usb_output_devices.items(): # TODO: @UnusedVariable "printer_name" - progress += device.progress - return progress / len(self._usb_output_devices) - - @pyqtProperty(int, notify = progressChanged) - def errorCode(self): - for printer_name, device in self._usb_output_devices.items(): # TODO: @UnusedVariable "printer_name" - if device._error_code: - return device._error_code - return 0 - def start(self): self._check_updates = True self._update_thread.start() From 0ac48817b26713ea9a15ee2dea619f1485d5cace Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 15:00:10 +0100 Subject: [PATCH 087/205] Added abort, start & pause USL-541 --- .../USBPrinting/USBPrinterOutputController.py | 11 ++++++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 28 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/plugins/USBPrinting/USBPrinterOutputController.py b/plugins/USBPrinting/USBPrinterOutputController.py index c42348ee6e..ba45e7b0ca 100644 --- a/plugins/USBPrinting/USBPrinterOutputController.py +++ b/plugins/USBPrinting/USBPrinterOutputController.py @@ -31,6 +31,17 @@ class USBPrinterOuptutController(PrinterOutputController): def homeBed(self, printer): self._output_device.sendCommand("G28 Z") + def setJobState(self, job: "PrintJobOutputModel", state: str): + if state == "pause": + self._output_device.pausePrint() + job.updateState("paused") + elif state == "print": + self._output_device.resumePrint() + job.updateState("printing") + elif state == "abort": + self._output_device.cancelPrint() + pass + def preheatBed(self, printer: "PrinterOutputModel", temperature, duration): try: temperature = round(temperature) # The API doesn't allow floating point. diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 40964bdd20..f1d7b1fdf4 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -60,6 +60,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._accepts_commands = True + self._paused = False + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() @@ -83,6 +85,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # \param gcode_list List with gcode (strings). def _printGCode(self, gcode_list): self._gcode.clear() + self._paused = False for layer in gcode_list: self._gcode.extend(layer.split("\n")) @@ -179,6 +182,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if b"ok" in line: if not self._command_queue.empty(): self._sendCommand(self._command_queue.get()) + elif self._paused: + pass # Nothing to do! else: self._sendNextGcodeLine() elif b"resend" in line.lower() or b"rs" in line: @@ -190,6 +195,29 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # In some cases of the RS command it needs to be handled differently. self._gcode_position = int(line.split()[1]) + def pausePrint(self): + self._paused = True + + def resumePrint(self): + self._paused = False + + def cancelPrint(self): + self._gcode_position = 0 + self._gcode.clear() + self._printers[0].updateActivePrintJob(None) + self._is_printing = False + self._is_paused = False + + # Turn off temperatures, fan and steppers + self._sendCommand("M140 S0") + self._sendCommand("M104 S0") + self._sendCommand("M107") + + # Home XY to prevent nozzle resting on aborted print + # Don't home bed because it may crash the printhead into the print on printers that home on the bottom + self.printers[0].homeHead() + self._sendCommand("M84") + def _sendNextGcodeLine(self): if self._gcode_position >= len(self._gcode): self._printers[0].updateActivePrintJob(None) From 35d3690b8978345f753b6493b4bee26b7db75dea Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 15:19:59 +0100 Subject: [PATCH 088/205] Disable UMO checkup action --- plugins/UltimakerMachineActions/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/UltimakerMachineActions/__init__.py b/plugins/UltimakerMachineActions/__init__.py index 864c501392..495f212736 100644 --- a/plugins/UltimakerMachineActions/__init__.py +++ b/plugins/UltimakerMachineActions/__init__.py @@ -3,7 +3,6 @@ from . import BedLevelMachineAction from . import UpgradeFirmwareMachineAction -from . import UMOCheckupMachineAction from . import UMOUpgradeSelection from . import UM2UpgradeSelection @@ -18,7 +17,6 @@ def register(app): return { "machine_action": [ BedLevelMachineAction.BedLevelMachineAction(), UpgradeFirmwareMachineAction.UpgradeFirmwareMachineAction(), - UMOCheckupMachineAction.UMOCheckupMachineAction(), UMOUpgradeSelection.UMOUpgradeSelection(), UM2UpgradeSelection.UM2UpgradeSelection() ]} From bd4797404df6761c84bf1b8b7f160957f8199805 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 15:46:15 +0100 Subject: [PATCH 089/205] Changed showMonitorStage to setActiveStage CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 4 ++-- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 6 +++--- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ba82da64c3..eb9f0469fa 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -77,7 +77,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) @@ -160,7 +160,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() self._compressing_gcode = False self._sending_gcode = False - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") @pyqtSlot() def openPrintJobControlPanel(self): diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index e8e340e333..1f58da7ca9 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -177,7 +177,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): return # Notify the UI that a switch to the print monitor should happen - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) @@ -265,7 +265,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._progress_message.hide() self._compressing_gcode = False self._sending_gcode = False - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") def _onPostPrintJobFinished(self, reply): self._progress_message.hide() @@ -290,7 +290,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): if button == QMessageBox.Yes: self._startPrint() else: - Application.getInstance().showPrintMonitor.emit(False) + Application.getInstance().getController().setActiveStage("PrepareStage") # For some unknown reason Cura on OSX will hang if we do the call back code # immediately without first returning and leaving QML's event system. diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index f1d7b1fdf4..8b4961c19c 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -76,7 +76,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if self._is_printing: return # Aleady printing - Application.getInstance().showPrintMonitor.emit(True) + Application.getInstance().getController().setActiveStage("MonitorStage") gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") self._printGCode(gcode_list) From 1ae881caee70f1f47a4712a8592783f9ab7afb3a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 15 Dec 2017 16:03:58 +0100 Subject: [PATCH 090/205] USB device is first added and then trying to connect. This is to ensure that USB printers work without autodetect --- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 +- plugins/USBPrinting/USBPrinterOutputDeviceManager.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 8b4961c19c..867233561e 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -127,10 +127,10 @@ class USBPrinterOutputDevice(PrinterOutputDevice): try: self._serial = Serial(str(self._serial_port), self._baud_rate, timeout=self._timeout, writeTimeout=self._timeout) except SerialException: + Logger.log("w", "An exception occured while trying to create serial connection") return container_stack = Application.getInstance().getGlobalContainerStack() num_extruders = container_stack.getProperty("machine_extruder_count", "value") - # Ensure that a printer is created. self._printers = [PrinterOutputModel(output_controller=USBPrinterOuptutController(self), number_of_extruders=num_extruders)] self.setConnectionState(ConnectionState.connected) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 0f98c11ddf..e13d8cef39 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -157,8 +157,8 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): def addOutputDevice(self, serial_port): device = USBPrinterOutputDevice.USBPrinterOutputDevice(serial_port) device.connectionStateChanged.connect(self._onConnectionStateChanged) - device.connect() self._usb_output_devices[serial_port] = device + device.connect() ## Create a list of serial ports on the system. # \param only_list_usb If true, only usb ports are listed From a35f665201a79b8975635b1ff0d60473bf08b1a6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 10:45:38 +0100 Subject: [PATCH 091/205] Fixed crash if the firmware was in the list, but not found. CL-541 --- plugins/USBPrinting/USBPrinterOutputDeviceManager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index e13d8cef39..c97d8c0160 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -135,7 +135,11 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): Logger.log("w", "There is no firmware for machine %s.", machine_id) if hex_file: - return Resources.getPath(CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) + try: + return Resources.getPath(CuraApplication.ResourceTypes.Firmware, hex_file.format(baudrate=baudrate)) + except FileNotFoundError: + Logger.log("w", "Could not find any firmware for machine %s.", machine_id) + return "" else: Logger.log("w", "Could not find any firmware for machine %s.", machine_id) return "" From 32cbd27b708fe6311edc538a8af6f15c57294a50 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 15:59:21 +0100 Subject: [PATCH 092/205] Fixed the firmware update for USB print CL-541 --- plugins/USBPrinting/AutoDetectBaudJob.py | 31 ++++- plugins/USBPrinting/FirmwareUpdateWindow.qml | 54 +++----- plugins/USBPrinting/USBPrinterOutputDevice.py | 125 +++++++++++++++++- .../USBPrinterOutputDeviceManager.py | 2 - .../UpgradeFirmwareMachineAction.qml | 10 +- 5 files changed, 171 insertions(+), 51 deletions(-) diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py index 8dcc705397..574e241453 100644 --- a/plugins/USBPrinting/AutoDetectBaudJob.py +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -4,9 +4,12 @@ from UM.Job import Job from UM.Logger import Logger -from time import time +from .avr_isp.stk500v2 import Stk500v2 + +from time import time, sleep from serial import Serial, SerialException + class AutoDetectBaudJob(Job): def __init__(self, serial_port): super().__init__() @@ -17,14 +20,30 @@ class AutoDetectBaudJob(Job): Logger.log("d", "Auto detect baud rate started.") timeout = 3 + programmer = Stk500v2() + serial = None + try: + programmer.connect(self._serial_port) + serial = programmer.leaveISP() + except: + programmer.close() + for baud_rate in self._all_baud_rates: Logger.log("d", "Checking {serial} if baud rate {baud_rate} works".format(serial= self._serial_port, baud_rate = baud_rate)) - try: - serial = Serial(str(self._serial_port), baud_rate, timeout = timeout, writeTimeout = timeout) - except SerialException as e: - Logger.logException("w", "Unable to create serial") - continue + if serial is None: + try: + serial = Serial(str(self._serial_port), baud_rate, timeout = timeout, writeTimeout = timeout) + except SerialException as e: + Logger.logException("w", "Unable to create serial") + continue + else: + # We already have a serial connection, just change the baud rate. + try: + serial.baudrate = baud_rate + except: + continue + sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 seconds seems to be the magic number successful_responses = 0 serial.write(b"\n") # Ensure we clear out previous responses diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml index 44218b61b1..bd0c85f49d 100644 --- a/plugins/USBPrinting/FirmwareUpdateWindow.qml +++ b/plugins/USBPrinting/FirmwareUpdateWindow.qml @@ -34,44 +34,22 @@ UM.Dialog } text: { - if (manager.errorCode == 0) + switch (manager.firmwareUpdateState) { - if (manager.firmwareUpdateCompleteStatus) - { - //: Firmware update status label - return catalog.i18nc("@label","Firmware update completed.") - } - else if (manager.progress == 0) - { - //: Firmware update status label - return catalog.i18nc("@label","Starting firmware update, this may take a while.") - } - else - { - //: Firmware update status label + case 0: + return "" //Not doing anything (eg; idling) + case 1: return catalog.i18nc("@label","Updating firmware.") - } - } - else - { - switch (manager.errorCode) - { - case 1: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to an unknown error.") - case 2: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to an communication error.") - case 3: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to an input/output error.") - case 4: - //: Firmware update status label - return catalog.i18nc("@label","Firmware update failed due to missing firmware.") - default: - //: Firmware update status label - return catalog.i18nc("@label", "Unknown error code: %1").arg(manager.errorCode) - } + case 2: + return catalog.i18nc("@label","Firmware update completed.") + case 3: + return catalog.i18nc("@label","Firmware update failed due to an unknown error.") + case 4: + return catalog.i18nc("@label","Firmware update failed due to an communication error.") + case 5: + return catalog.i18nc("@label","Firmware update failed due to an input/output error.") + case 6: + return catalog.i18nc("@label","Firmware update failed due to missing firmware.") } } @@ -81,10 +59,10 @@ UM.Dialog ProgressBar { id: prog - value: manager.firmwareUpdateCompleteStatus ? 100 : manager.progress + value: manager.firmwareProgress minimumValue: 0 maximumValue: 100 - indeterminate: (manager.progress < 1) && (!manager.firmwareUpdateCompleteStatus) + indeterminate: manager.firmwareProgress < 1 && manager.firmwareProgress > 0 anchors { left: parent.left; diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 867233561e..100643b490 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -5,6 +5,7 @@ from UM.Logger import Logger from UM.i18n import i18nCatalog from UM.Application import Application from UM.Qt.Duration import DurationFormat +from UM.PluginRegistry import PluginRegistry from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel @@ -12,19 +13,27 @@ from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel from .AutoDetectBaudJob import AutoDetectBaudJob from .USBPrinterOutputController import USBPrinterOuptutController +from .avr_isp import stk500v2, intelHex + +from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty from serial import Serial, SerialException from threading import Thread -from time import time +from time import time, sleep from queue import Queue +from enum import IntEnum import re import functools # Used for reduce +import os catalog = i18nCatalog("cura") class USBPrinterOutputDevice(PrinterOutputDevice): + firmwareProgressChanged = pyqtSignal() + firmwareUpdateStateChanged = pyqtSignal() + def __init__(self, serial_port, baud_rate = None): super().__init__(serial_port) self.setName(catalog.i18nc("@item:inmenu", "USB printing")) @@ -50,6 +59,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # Instead of using a timer, we really need the update to be as a thread, as reading from serial can block. self._update_thread = Thread(target=self._update, daemon = True) + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) + self._last_temperature_request = None self._is_printing = False # A print is being sent. @@ -62,6 +73,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._paused = False + self._firmware_view = None + self._firmware_location = None + self._firmware_progress = 0 + self._firmware_update_state = FirmwareUpdateState.idle + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() @@ -81,6 +97,88 @@ class USBPrinterOutputDevice(PrinterOutputDevice): gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_list") self._printGCode(gcode_list) + + ## Show firmware interface. + # This will create the view if its not already created. + def showFirmwareInterface(self): + if self._firmware_view is None: + path = os.path.join(PluginRegistry.getInstance().getPluginPath("USBPrinting"), "FirmwareUpdateWindow.qml") + self._firmware_view = Application.getInstance().createQmlComponent(path, {"manager": self}) + + self._firmware_view.show() + + @pyqtSlot(str) + def updateFirmware(self, file): + self._firmware_location = file + self.showFirmwareInterface() + self.setFirmwareUpdateState(FirmwareUpdateState.updating) + self._update_firmware_thread.start() + + def _updateFirmware(self): + # Ensure that other connections are closed. + if self._connection_state != ConnectionState.closed: + self.close() + + hex_file = intelHex.readHex(self._firmware_location) + if len(hex_file) == 0: + Logger.log("e", "Unable to read provided hex file. Could not update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.firmware_not_found_error) + return + + programmer = stk500v2.Stk500v2() + programmer.progress_callback = self._onFirmwareProgress + + try: + programmer.connect(self._serial_port) + except: + programmer.close() + Logger.logException("e", "Failed to update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + return + + # Give programmer some time to connect. Might need more in some cases, but this worked in all tested cases. + sleep(1) + if not programmer.isConnected(): + Logger.log("e", "Unable to connect with serial. Could not update firmware") + self.setFirmwareUpdateState(FirmwareUpdateState.communication_error) + try: + programmer.programChip(hex_file) + except SerialException: + self.setFirmwareUpdateState(FirmwareUpdateState.io_error) + return + except: + self.setFirmwareUpdateState(FirmwareUpdateState.unknown_error) + return + + programmer.close() + + # Clean up for next attempt. + self._update_firmware_thread = Thread(target=self._updateFirmware, daemon=True) + self._firmware_location = "" + self._onFirmwareProgress(100) + self.setFirmwareUpdateState(FirmwareUpdateState.completed) + + # Try to re-connect with the machine again, which must be done on the Qt thread, so we use call later. + Application.getInstance().callLater(self.connect) + + @pyqtProperty(float, notify = firmwareProgressChanged) + def firmwareProgress(self): + return self._firmware_progress + + @pyqtProperty(int, notify=firmwareUpdateStateChanged) + def firmwareUpdateState(self): + return self._firmware_update_state + + def setFirmwareUpdateState(self, state): + if self._firmware_update_state != state: + self._firmware_update_state = state + self.firmwareUpdateStateChanged.emit() + + # Callback function for firmware update progress. + def _onFirmwareProgress(self, progress, max_progress = 100): + self._firmware_progress = (progress / max_progress) * 100 # Convert to scale of 0-100 + self.firmwareProgressChanged.emit() + ## Start a print based on a g-code. # \param gcode_list List with gcode (strings). def _printGCode(self, gcode_list): @@ -136,6 +234,15 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.setConnectionState(ConnectionState.connected) self._update_thread.start() + def close(self): + super().close() + if self._serial is not None: + self._serial.close() + + # Re-create the thread so it can be started again later. + self._update_thread = Thread(target=self._update, daemon=True) + self._serial = None + def sendCommand(self, command): if self._is_printing: self._command_queue.put(command) @@ -155,7 +262,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): def _update(self): while self._connection_state == ConnectionState.connected and self._serial is not None: - line = self._serial.readline() + try: + line = self._serial.readline() + except: + continue + if self._last_temperature_request is None or time() > self._last_temperature_request + self._timeout: # Timeout, or no request has been sent at all. self.sendCommand("M105") @@ -255,3 +366,13 @@ class USBPrinterOutputDevice(PrinterOutputDevice): print_job.updateTimeTotal(estimated_time) self._gcode_position += 1 + + +class FirmwareUpdateState(IntEnum): + idle = 0 + updating = 1 + completed = 2 + unknown_error = 3 + communication_error = 4 + io_error = 5 + firmware_not_found_error = 6 \ No newline at end of file diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index c97d8c0160..47e2776286 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -6,7 +6,6 @@ from . import USBPrinterOutputDevice from UM.Application import Application from UM.Resources import Resources from UM.Logger import Logger -from UM.PluginRegistry import PluginRegistry from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin from cura.PrinterOutputDevice import ConnectionState from UM.Qt.ListModel import ListModel @@ -41,7 +40,6 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): self._update_thread.setDaemon(True) self._check_updates = True - self._firmware_view = None Application.getInstance().applicationShuttingDown.connect(self.stop) self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. diff --git a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml index 72a77e992d..f36788daa5 100644 --- a/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml +++ b/plugins/UltimakerMachineActions/UpgradeFirmwareMachineAction.qml @@ -14,6 +14,9 @@ import Cura 1.0 as Cura Cura.MachineAction { anchors.fill: parent; + property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 + property var activeOutputDevice: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null + Item { id: upgradeFirmwareMachineAction @@ -60,16 +63,17 @@ Cura.MachineAction { id: autoUpgradeButton text: catalog.i18nc("@action:button", "Automatically upgrade Firmware"); - enabled: parent.firmwareName != "" + enabled: parent.firmwareName != "" && activeOutputDevice onClicked: { - Cura.USBPrinterManager.updateAllFirmware(parent.firmwareName) + activeOutputDevice.updateFirmware(parent.firmwareName) } } Button { id: manualUpgradeButton text: catalog.i18nc("@action:button", "Upload custom Firmware"); + enabled: activeOutputDevice != null onClicked: { customFirmwareDialog.open() @@ -83,7 +87,7 @@ Cura.MachineAction title: catalog.i18nc("@title:window", "Select custom firmware") nameFilters: "Firmware image files (*.hex)" selectExisting: true - onAccepted: Cura.USBPrinterManager.updateAllFirmware(fileUrl) + onAccepted: activeOutputDevice.updateFirmware(fileUrl) } } } \ No newline at end of file From b4c83814d9774436c371ce0ae0165267fb4975a4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 16:03:48 +0100 Subject: [PATCH 093/205] Clean up unused imports CL-541 --- .../USBPrinterOutputDeviceManager.py | 18 ++++++++---------- plugins/USBPrinting/__init__.py | 11 ++++++----- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 47e2776286..4de71e8b23 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -2,32 +2,29 @@ # Cura is released under the terms of the LGPLv3 or higher. from UM.Signal import Signal, signalemitter -from . import USBPrinterOutputDevice from UM.Application import Application from UM.Resources import Resources from UM.Logger import Logger from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin -from cura.PrinterOutputDevice import ConnectionState -from UM.Qt.ListModel import ListModel -from UM.Message import Message +from UM.i18n import i18nCatalog +from cura.PrinterOutputDevice import ConnectionState from cura.CuraApplication import CuraApplication +from . import USBPrinterOutputDevice +from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal + import threading import platform import time -import os.path import serial.tools.list_ports -from UM.Extension import Extension -from PyQt5.QtCore import QUrl, QObject, pyqtSlot, pyqtProperty, pyqtSignal, Qt -from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") ## Manager class that ensures that a usbPrinteroutput device is created for every connected USB printer. @signalemitter -class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): +class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin): addUSBOutputDeviceSignal = Signal() progressChanged = pyqtSignal() @@ -42,7 +39,8 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): self._check_updates = True Application.getInstance().applicationShuttingDown.connect(self.stop) - self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) #Because the model needs to be created in the same thread as the QMLEngine, we use a signal. + # Because the model needs to be created in the same thread as the QMLEngine, we use a signal. + self.addUSBOutputDeviceSignal.connect(self.addOutputDevice) def start(self): self._check_updates = True diff --git a/plugins/USBPrinting/__init__.py b/plugins/USBPrinting/__init__.py index 1cc45c3c3b..7bf5853c10 100644 --- a/plugins/USBPrinting/__init__.py +++ b/plugins/USBPrinting/__init__.py @@ -1,17 +1,18 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from . import USBPrinterOutputDeviceManager -from PyQt5.QtQml import qmlRegisterType, qmlRegisterSingletonType +from PyQt5.QtQml import qmlRegisterSingletonType from UM.i18n import i18nCatalog i18n_catalog = i18nCatalog("cura") + def getMetaData(): - return { - } + return {} + def register(app): # We are violating the QT API here (as we use a factory, which is technically not allowed). # but we don't really have another means for doing this (and it seems to you know -work-) qmlRegisterSingletonType(USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager, "Cura", 1, 0, "USBPrinterManager", USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance) - return {"extension":USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance(), "output_device": USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance()} + return {"output_device": USBPrinterOutputDeviceManager.USBPrinterOutputDeviceManager.getInstance()} From 79add4ffd8dc2534bafb204ce0c4ca4157dfc59d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 16:15:48 +0100 Subject: [PATCH 094/205] Added typing CL-541 --- plugins/USBPrinting/AutoDetectBaudJob.py | 7 +++-- plugins/USBPrinting/FirmwareUpdateWindow.qml | 3 +-- plugins/USBPrinting/USBPrinterOutputDevice.py | 26 ++++++++++--------- .../USBPrinterOutputDeviceManager.py | 2 +- 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py index 574e241453..72f4f20262 100644 --- a/plugins/USBPrinting/AutoDetectBaudJob.py +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -10,6 +10,9 @@ from time import time, sleep from serial import Serial, SerialException +# An async job that attempts to find the correct baud rate for a USB printer. +# It tries a pre-set list of baud rates. All these baud rates are validated by requesting the temperature a few times +# and checking if the results make sense. If getResult() is not None, it was able to find a correct baud rate. class AutoDetectBaudJob(Job): def __init__(self, serial_port): super().__init__() @@ -43,7 +46,7 @@ class AutoDetectBaudJob(Job): serial.baudrate = baud_rate except: continue - sleep(1.5) # Ensure that we are not talking to the bootloader. 1.5 seconds seems to be the magic number + sleep(1.5) # Ensure that we are not talking to the boot loader. 1.5 seconds seems to be the magic number successful_responses = 0 serial.write(b"\n") # Ensure we clear out previous responses @@ -60,4 +63,4 @@ class AutoDetectBaudJob(Job): return serial.write(b"M105\n") - self.setResult(None) # Unable to detect the correct baudrate. \ No newline at end of file + self.setResult(None) # Unable to detect the correct baudrate. diff --git a/plugins/USBPrinting/FirmwareUpdateWindow.qml b/plugins/USBPrinting/FirmwareUpdateWindow.qml index bd0c85f49d..e0f9de314e 100644 --- a/plugins/USBPrinting/FirmwareUpdateWindow.qml +++ b/plugins/USBPrinting/FirmwareUpdateWindow.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2017 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -68,7 +68,6 @@ UM.Dialog left: parent.left; right: parent.right; } - } SystemPalette diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 100643b490..1e28e252d1 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -22,6 +22,7 @@ from threading import Thread from time import time, sleep from queue import Queue from enum import IntEnum +from typing import Union, Optional, List import re import functools # Used for reduce @@ -34,20 +35,20 @@ class USBPrinterOutputDevice(PrinterOutputDevice): firmwareProgressChanged = pyqtSignal() firmwareUpdateStateChanged = pyqtSignal() - def __init__(self, serial_port, baud_rate = None): + def __init__(self, serial_port: str, baud_rate: Optional[int] = None): super().__init__(serial_port) self.setName(catalog.i18nc("@item:inmenu", "USB printing")) self.setShortDescription(catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print via USB")) self.setDescription(catalog.i18nc("@info:tooltip", "Print via USB")) self.setIconName("print") - self._serial = None + self._serial = None # type: Optional[Serial] self._serial_port = serial_port self._timeout = 3 # List of gcode lines to be printed - self._gcode = [] + self._gcode = [] # type: List[str] self._gcode_position = 0 self._use_auto_detect = True @@ -61,13 +62,13 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._update_firmware_thread = Thread(target=self._updateFirmware, daemon = True) - self._last_temperature_request = None + self._last_temperature_request = None # type: Optional[int] self._is_printing = False # A print is being sent. ## Set when print is started in order to check running time. - self._print_start_time = None - self._print_estimated_time = None + self._print_start_time = None # type: Optional[int] + self._print_estimated_time = None # type: Optional[int] self._accepts_commands = True @@ -90,7 +91,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): # \param kwargs Keyword arguments. def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs): if self._is_printing: - return # Aleady printing + return # Aleady printing Application.getInstance().getController().setActiveStage("MonitorStage") @@ -181,7 +182,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): ## Start a print based on a g-code. # \param gcode_list List with gcode (strings). - def _printGCode(self, gcode_list): + def _printGCode(self, gcode_list: List[str]): self._gcode.clear() self._paused = False @@ -201,13 +202,13 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self.writeFinished.emit(self) - def _autoDetectFinished(self, job): + def _autoDetectFinished(self, job: AutoDetectBaudJob): result = job.getResult() if result is not None: self.setBaudRate(result) self.connect() # Try to connect (actually create serial, etc) - def setBaudRate(self, baud_rate): + def setBaudRate(self, baud_rate: int): if baud_rate not in self._all_baud_rates: Logger.log("w", "Not updating baudrate to {baud_rate} as it's an unknown baudrate".format(baud_rate=baud_rate)) return @@ -243,13 +244,14 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._update_thread = Thread(target=self._update, daemon=True) self._serial = None - def sendCommand(self, command): + ## Send a command to printer. + def sendCommand(self, command: Union[str, bytes]): if self._is_printing: self._command_queue.put(command) elif self._connection_state == ConnectionState.connected: self._sendCommand(command) - def _sendCommand(self, command): + def _sendCommand(self, command: Union[str, bytes]): if self._serial is None: return diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 4de71e8b23..58b6106fb0 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -22,7 +22,7 @@ import serial.tools.list_ports i18n_catalog = i18nCatalog("cura") -## Manager class that ensures that a usbPrinteroutput device is created for every connected USB printer. +## Manager class that ensures that an USBPrinterOutput device is created for every connected USB printer. @signalemitter class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin): addUSBOutputDeviceSignal = Signal() From 89004b8df5dcf7da7250e4af29a938d9cae417c8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 17:19:04 +0100 Subject: [PATCH 095/205] Fixed some QML warnings CL-541 --- resources/qml/PrinterOutput/HeatedBedBox.qml | 15 ++++++++++++++- .../qml/PrinterOutput/OutputDeviceHeader.qml | 1 - 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/resources/qml/PrinterOutput/HeatedBedBox.qml b/resources/qml/PrinterOutput/HeatedBedBox.qml index 65c2a161bd..bc89da2251 100644 --- a/resources/qml/PrinterOutput/HeatedBedBox.qml +++ b/resources/qml/PrinterOutput/HeatedBedBox.qml @@ -302,7 +302,20 @@ Item } } font: UM.Theme.getFont("action_button") - text: printerModel.isPreheating ? catalog.i18nc("@button Cancel pre-heating", "Cancel") : catalog.i18nc("@button", "Pre-heat") + text: + { + if(printerModel == null) + { + return "" + } + if(printerModel.isPreheating ) + { + return catalog.i18nc("@button Cancel pre-heating", "Cancel") + } else + { + return catalog.i18nc("@button", "Pre-heat") + } + } } } } diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index 6553655da0..ca64c79f2b 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -48,7 +48,6 @@ Item anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width - anchors.top: outputDevice.bottom } } } \ No newline at end of file From 37461a7934fb71d6cacf9bdab776e4f0952805db Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 19 Dec 2017 17:24:30 +0100 Subject: [PATCH 096/205] Made sendMaterialProfiles protected CL-541 --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 1f58da7ca9..d0b8f139f1 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -138,7 +138,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._authentication_timer.stop() ## Send all material profiles to the printer. - def sendMaterialProfiles(self): + def _sendMaterialProfiles(self): Logger.log("i", "Sending material profiles to printer") # TODO: Might want to move this to a job... @@ -410,7 +410,7 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): elif status_code == 200: self.setAuthenticationState(AuthState.Authenticated) # Now we know for sure that we are authenticated, send the material profiles to the machine. - self.sendMaterialProfiles() + self._sendMaterialProfiles() def _checkAuthentication(self): Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey()) From 95b1e8f68cb10071e6190fe6be7c890fd5b1675d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 15:38:47 +0100 Subject: [PATCH 097/205] Ensured that multiple requests from the same camera are no longer possible CL-541 --- cura/PrinterOutput/NetworkCamera.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index b81914ca7d..f71a575c5f 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -45,6 +45,8 @@ class NetworkCamera(QObject): @pyqtSlot() def start(self): + # Ensure that previous requests (if any) are stopped. + self.stop() if self._target is None: Logger.log("w", "Unable to start camera stream without target!") return From 23330cd08601d38647e0cc8413cb51efa24e25ad Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 15:39:52 +0100 Subject: [PATCH 098/205] Camera feed is also stopped when NetworkCamera is destroyed CL-541 --- cura/PrinterOutput/NetworkCamera.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index f71a575c5f..ad4fb90dd2 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -87,6 +87,10 @@ class NetworkCamera(QObject): def getImage(self): return self._image + ## Ensure that close gets called when object is destroyed + def __del__(self): + self.close() + def _onStreamDownloadProgress(self, bytes_received, bytes_total): # An MJPG stream is (for our purpose) a stream of concatenated JPG images. # JPG images start with the marker 0xFFD8, and end with 0xFFD9 From d66e9493ca2a3c78bf05e00bb43066ed49c96069 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 15:54:05 +0100 Subject: [PATCH 099/205] When not looking at camera, it will now actually be disabled CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index eb9f0469fa..ad085d16ec 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -133,6 +133,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): @pyqtSlot(QObject) def setActivePrinter(self, printer): if self._active_printer != printer: + if self._active_printer and self._active_printer.camera: + self._active_printer.camera.stop() self._active_printer = printer self.activePrinterChanged.emit() From 041b1830fe5ab3d11303c2bbb264313fd5df50f2 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 16:30:40 +0100 Subject: [PATCH 100/205] Re-added manual printer adding CL-541 --- .../NetworkedPrinterOutputDevice.py | 3 + .../UM3NetworkPrinting/DiscoverUM3Action.py | 7 +- .../UM3NetworkPrinting/DiscoverUM3Action.qml | 4 +- .../UM3OutputDevicePlugin.py | 121 +++++++++++++++++- 4 files changed, 128 insertions(+), 7 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 3585aee5ea..b10700176e 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -266,6 +266,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): else: return "" + def getProperties(self): + return self._properties + ## Get the unique key of this machine # \return key String containing the key of the machine. @pyqtProperty(str, constant=True) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py index 84115f28d3..0e872fed43 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.py +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.py @@ -12,7 +12,10 @@ from cura.MachineAction import MachineAction catalog = i18nCatalog("cura") + class DiscoverUM3Action(MachineAction): + discoveredDevicesChanged = pyqtSignal() + def __init__(self): super().__init__("DiscoverUM3Action", catalog.i18nc("@action","Connect via Network")) self._qml_url = "DiscoverUM3Action.qml" @@ -30,8 +33,6 @@ class DiscoverUM3Action(MachineAction): # Time to wait after a zero-conf service change before allowing a zeroconf reset self._zero_conf_change_grace_period = 0.25 - discoveredDevicesChanged = pyqtSignal() - @pyqtSlot() def startDiscovery(self): if not self._network_plugin: @@ -73,7 +74,7 @@ class DiscoverUM3Action(MachineAction): self._network_plugin.removeManualDevice(key) if address != "": - self._network_plugin.addManualPrinter(address) + self._network_plugin.addManualDevice(address) def _onDeviceDiscoveryChanged(self, *args): self._last_zero_conf_event_time = time.time() diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index d79bd543e7..003fdbf95c 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -101,7 +101,7 @@ Cura.MachineAction id: removeButton text: catalog.i18nc("@action:button", "Remove") enabled: base.selectedDevice != null && base.selectedDevice.getProperty("manual") == "true" - onClicked: manager.removeManualPrinter(base.selectedDevice.key, base.selectedDevice.ipAddress) + onClicked: manager.removeManualDevice(base.selectedDevice.key, base.selectedDevice.ipAddress) } Button @@ -343,7 +343,7 @@ Cura.MachineAction onAccepted: { - manager.setManualPrinter(printerKey, addressText) + manager.setManualDevice(printerKey, addressText) } Column { diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 13ab774577..fa1a0bc417 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -5,14 +5,21 @@ from UM.OutputDevice.OutputDevicePlugin import OutputDevicePlugin from UM.Logger import Logger from UM.Application import Application from UM.Signal import Signal, signalemitter +from UM.Preferences import Preferences +from UM.Version import Version + +from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice + +from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager +from PyQt5.QtCore import QUrl from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo from queue import Queue from threading import Event, Thread - from time import time -from . import ClusterUM3OutputDevice, LegacyUM3OutputDevice +import json + ## This plugin handles the connection detection & creation of output device objects for the UM3 printer. # Zero-Conf is used to detect printers, which are saved in a dict. @@ -35,6 +42,23 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Application.getInstance().globalContainerStackChanged.connect(self.reCheckConnections) self._discovered_devices = {} + + self._network_manager = QNetworkAccessManager() + self._network_manager.finished.connect(self._onNetworkRequestFinished) + + self._min_cluster_version = Version("4.0.0") + + self._api_version = "1" + self._api_prefix = "/api/v" + self._api_version + "/" + self._cluster_api_version = "1" + self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/" + + # Get list of manual instances from preferences + self._preferences = Preferences.getInstance() + self._preferences.addPreference("um3networkprinting/manual_instances", + "") # A comma-separated list of ip adresses or hostnames + + self._manual_instances = self._preferences.getValue("um3networkprinting/manual_instances").split(",") # The zero-conf service changed requests are handled in a separate thread, so we can re-schedule the requests # which fail to get detailed service info. @@ -62,6 +86,11 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): self._zero_conf_browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.', [self._appendServiceChangedRequest]) + # Look for manual instances from preference + for address in self._manual_instances: + if address: + self.addManualDevice(address) + def reCheckConnections(self): active_machine = Application.getInstance().getGlobalContainerStack() if not active_machine: @@ -94,6 +123,94 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Logger.log("d", "zeroconf close...") self._zero_conf.close() + def addManualDevice(self, address): + if address not in self._manual_instances: + self._manual_instances.append(address) + self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) + + instance_name = "manual:%s" % address + properties = { + b"name": address.encode("utf-8"), + b"address": address.encode("utf-8"), + b"manual": b"true", + b"incomplete": b"true" + } + + if instance_name not in self._discovered_devices: + # Add a preliminary printer instance + self._onAddDevice(instance_name, address, properties) + + self._checkManualDevice(address) + + def _checkManualDevice(self, address): + # Check if a UM3 family device exists at this address. + # If a printer responds, it will replace the preliminary printer created above + # origin=manual is for tracking back the origin of the call + url = QUrl("http://" + address + self._api_prefix + "system") + name_request = QNetworkRequest(url) + self._network_manager.get(name_request) + + def _onNetworkRequestFinished(self, reply): + reply_url = reply.url().toString() + + if "system" in reply_url: + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: + # Something went wrong with checking the firmware version! + return + + try: + system_info = json.loads(bytes(reply.readAll()).decode("utf-8")) + except: + Logger.log("e", "Something went wrong converting the JSON.") + return + + address = reply.url().host() + has_cluster_capable_firmware = Version(system_info["firmware"]) > self._min_cluster_version + instance_name = "manual:%s" % address + properties = { + b"name": system_info["name"].encode("utf-8"), + b"address": address.encode("utf-8"), + b"firmware_version": system_info["firmware"].encode("utf-8"), + b"manual": b"true", + b"machine": system_info["variant"].encode("utf-8") + } + + if has_cluster_capable_firmware: + # Cluster needs an additional request, before it's completed. + properties[b"incomplete"] = b"true" + + # Check if the device is still in the list & re-add it with the updated + # information. + if instance_name in self._discovered_devices: + self._onRemoveDevice(instance_name) + self._onAddDevice(instance_name, address, properties) + + if has_cluster_capable_firmware: + # We need to request more info in order to figure out the size of the cluster. + cluster_url = QUrl("http://" + address + self._cluster_api_prefix + "printers/") + cluster_request = QNetworkRequest(cluster_url) + self._network_manager.get(cluster_request) + + elif "printers" in reply_url: + if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200: + # Something went wrong with checking the amount of printers the cluster has! + return + # So we confirmed that the device is in fact a cluster printer, and we should now know how big it is. + try: + cluster_printers_list = json.loads(bytes(reply.readAll()).decode("utf-8")) + except: + Logger.log("e", "Something went wrong converting the JSON.") + return + address = reply.url().host() + instance_name = "manual:%s" % address + if instance_name in self._discovered_devices: + device = self._discovered_devices[instance_name] + properties = device.getProperties().copy() + del properties[b"incomplete"] + properties[b'cluster_size'] = len(cluster_printers_list) + self._onRemoveDevice(instance_name) + self._onAddDevice(instance_name, address, properties) + def _onRemoveDevice(self, device_id): device = self._discovered_devices.pop(device_id, None) if device: From 4796e0057440f92639a2ac8e4e8d85001c0a9cc8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 20 Dec 2017 16:57:49 +0100 Subject: [PATCH 101/205] Fixed removing of manual printer CL-541 --- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index fa1a0bc417..2e1fe4db6f 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -123,6 +123,16 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): Logger.log("d", "zeroconf close...") self._zero_conf.close() + def removeManualDevice(self, key, address = None): + if key in self._discovered_devices: + if not address: + address = self._printers[key].ipAddress + self._onRemoveDevice(key) + + if address in self._manual_instances: + self._manual_instances.remove(address) + self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances)) + def addManualDevice(self, address): if address not in self._manual_instances: self._manual_instances.append(address) @@ -206,7 +216,8 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): if instance_name in self._discovered_devices: device = self._discovered_devices[instance_name] properties = device.getProperties().copy() - del properties[b"incomplete"] + if b"incomplete" in properties: + del properties[b"incomplete"] properties[b'cluster_size'] = len(cluster_printers_list) self._onRemoveDevice(instance_name) self._onAddDevice(instance_name, address, properties) From e576c1a9f7936aad29d6a324c902c206e30043a8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 21 Dec 2017 10:01:29 +0100 Subject: [PATCH 102/205] Ensure that an update of icon also happens on output device change CL-541 --- plugins/MonitorStage/MonitorStage.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index f223ef1844..41976c70a6 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -67,6 +67,8 @@ class MonitorStage(CuraStage): self._printer_output_device.printersChanged.connect(self._onActivePrinterChanged) self._setActivePrinter(self._printer_output_device.activePrinter) + # Force an update of the icon source + self._updateIconSource() except IndexError: pass From 9754aa5397b494b699b119b7e3fefe4f2f5a633a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 21 Dec 2017 13:16:44 +0100 Subject: [PATCH 103/205] Material & hotend updated callback is enabled for LegacyUM3 again CL-541 --- cura/PrinterOutputDevice.py | 15 ++- cura/Settings/MachineManager.py | 116 ++++++++++-------- .../LegacyUM3OutputDevice.py | 15 ++- .../UM3OutputDevicePlugin.py | 3 +- 4 files changed, 91 insertions(+), 58 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 458d0a1080..b4e67f6297 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -3,15 +3,14 @@ from UM.i18n import i18nCatalog from UM.OutputDevice.OutputDevice import OutputDevice -from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, QObject, QTimer, pyqtSignal, QUrl -from PyQt5.QtQml import QQmlComponent, QQmlContext +from PyQt5.QtCore import pyqtProperty, QObject, QTimer, pyqtSignal +from PyQt5.QtWidgets import QMessageBox from UM.Logger import Logger from UM.Signal import signalemitter from UM.Application import Application -import os from enum import IntEnum # For the connection state tracking. from typing import List, Optional @@ -36,6 +35,12 @@ class PrinterOutputDevice(QObject, OutputDevice): connectionStateChanged = pyqtSignal(str) acceptsCommandsChanged = pyqtSignal() + # Signal to indicate that the material of the active printer on the remote changed. + materialIdChanged = pyqtSignal() + + # # Signal to indicate that the hotend of the active printer on the remote changed. + hotendIdChanged = pyqtSignal() + def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -59,6 +64,10 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = ConnectionState.closed + def materialHotendChangedMessage(self, callback): + Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") + callback(QMessageBox.Yes) + def isConnected(self): return self._connection_state != ConnectionState.closed and self._connection_state != ConnectionState.error diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e78c0b9d97..50ab26f9df 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -117,7 +117,7 @@ class MachineManager(QObject): self._auto_hotends_changed = {} self._material_incompatible_message = Message(catalog.i18nc("@info:status", - "The selected material is incompatible with the selected machine or configuration."), + "The selected material is incompatible with the selected machine or configuration."), title = catalog.i18nc("@info:title", "Incompatible Material")) containers = ContainerRegistry.getInstance().findInstanceContainers(id = self.activeMaterialId) @@ -135,21 +135,21 @@ class MachineManager(QObject): activeStackValidationChanged = pyqtSignal() # Emitted whenever a validation inside active container is changed stacksValidationChanged = pyqtSignal() # Emitted whenever a validation is changed - blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly + blurSettings = pyqtSignal() # Emitted to force fields in the advanced sidebar to un-focus, so they update properly outputDevicesChanged = pyqtSignal() def _onOutputDevicesChanged(self) -> None: - '''for printer_output_device in self._printer_output_devices: + for printer_output_device in self._printer_output_devices: printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) - printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged)''' + printer_output_device.materialIdChanged.disconnect(self._onMaterialIdChanged) self._printer_output_devices = [] for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): if isinstance(printer_output_device, PrinterOutputDevice): self._printer_output_devices.append(printer_output_device) - #printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) - #printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) + printer_output_device.hotendIdChanged.connect(self._onHotendIdChanged) + printer_output_device.materialIdChanged.connect(self._onMaterialIdChanged) self.outputDevicesChanged.emit() @@ -169,58 +169,70 @@ class MachineManager(QObject): def totalNumberOfSettings(self) -> int: return len(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0].getAllKeys()) - def _onHotendIdChanged(self, index: Union[str, int], hotend_id: str) -> None: - if not self._global_container_stack: + def _onHotendIdChanged(self): + if not self._global_container_stack or not self._printer_output_devices: + return + + active_printer_model = self._printer_output_devices[0].activePrinter + if not active_printer_model: return - containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "variant", definition = self._global_container_stack.definition.getId(), name = hotend_id) - if containers: # New material ID is known - extruder_manager = ExtruderManager.getInstance() - machine_id = self.activeMachineId - extruders = extruder_manager.getMachineExtruders(machine_id) - matching_extruder = None - for extruder in extruders: - if str(index) == extruder.getMetaDataEntry("position"): - matching_extruder = extruder - break - if matching_extruder and matching_extruder.variant.getName() != hotend_id: - # Save the material that needs to be changed. Multiple changes will be handled by the callback. - self._auto_hotends_changed[str(index)] = containers[0]["id"] - self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) - else: - Logger.log("w", "No variant found for printer definition %s with id %s" % (self._global_container_stack.definition.getId(), hotend_id)) + change_found = False + machine_id = self.activeMachineId + extruders = sorted(ExtruderManager.getInstance().getMachineExtruders(machine_id), + key=lambda k: k.getMetaDataEntry("position")) - def _onMaterialIdChanged(self, index: Union[str, int], material_id: str): - if not self._global_container_stack: + for extruder_model, extruder in zip(active_printer_model.extruders, extruders): + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type="variant", + definition=self._global_container_stack.definition.getId(), + name=extruder_model.hotendID) + if containers: + # The hotend ID is known. + machine_id = self.activeMachineId + if extruder.variant.getName() != extruder_model.hotendID: + change_found = True + self._auto_hotends_changed[extruder.getMetaDataEntry("position")] = containers[0]["id"] + + if change_found: + # A change was found, let the output device handle this. + self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) + + def _onMaterialIdChanged(self): + if not self._global_container_stack or not self._printer_output_devices: return - definition_id = "fdmprinter" - if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): - definition_id = self.activeQualityDefinitionId - extruder_manager = ExtruderManager.getInstance() - containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "material", definition = definition_id, GUID = material_id) - if containers: # New material ID is known - extruders = list(extruder_manager.getMachineExtruders(self.activeMachineId)) - matching_extruder = None - for extruder in extruders: - if str(index) == extruder.getMetaDataEntry("position"): - matching_extruder = extruder - break + active_printer_model = self._printer_output_devices[0].activePrinter + if not active_printer_model: + return - if matching_extruder and matching_extruder.material.getMetaDataEntry("GUID") != material_id: - # Save the material that needs to be changed. Multiple changes will be handled by the callback. - if self._global_container_stack.definition.getMetaDataEntry("has_variants") and matching_extruder.variant: - variant_id = self.getQualityVariantId(self._global_container_stack.definition, matching_extruder.variant) - for container in containers: - if container.get("variant") == variant_id: - self._auto_materials_changed[str(index)] = container["id"] - break - else: - # Just use the first result we found. - self._auto_materials_changed[str(index)] = containers[0]["id"] - self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) - else: - Logger.log("w", "No material definition found for printer definition %s and GUID %s" % (definition_id, material_id)) + change_found = False + machine_id = self.activeMachineId + extruders = sorted(ExtruderManager.getInstance().getMachineExtruders(machine_id), + key=lambda k: k.getMetaDataEntry("position")) + + for extruder_model, extruder in zip(active_printer_model.extruders, extruders): + if extruder_model.activeMaterial is None: + continue + containers = ContainerRegistry.getInstance().findInstanceContainersMetadata(type="material", + definition=self._global_container_stack.definition.getId(), + GUID=extruder_model.activeMaterial.guid) + if containers: + # The material is known. + if extruder.material.getMetaDataEntry("GUID") != extruder_model.activeMaterial.guid: + change_found = True + if self._global_container_stack.definition.getMetaDataEntry("has_variants") and extruder.variant: + variant_id = self.getQualityVariantId(self._global_container_stack.definition, + extruder.variant) + for container in containers: + if container.get("variant") == variant_id: + self._auto_materials_changed[extruder.getMetaDataEntry("position")] = container["id"] + break + else: + # Just use the first result we found. + self._auto_materials_changed[extruder.getMetaDataEntry("position")] = containers[0]["id"] + if change_found: + # A change was found, let the output device handle this. + self._printer_output_devices[0].materialHotendChangedMessage(self._materialHotendChangedCallback) def _materialHotendChangedCallback(self, button): if button == QMessageBox.No: diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index d0b8f139f1..ce87eaba16 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -404,7 +404,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("d", "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s. ", self._authentication_state) - print(reply.readAll()) self.setAuthenticationState(AuthState.AuthenticationDenied) self._authentication_failed_message.show() elif status_code == 200: @@ -533,6 +532,17 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): Logger.log("w", "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) + def materialHotendChangedMessage(self, callback): + Application.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Sync with your printer"), + i18n_catalog.i18nc("@label", + "Would you like to use your current printer configuration in Cura?"), + i18n_catalog.i18nc("@label", + "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."), + buttons=QMessageBox.Yes + QMessageBox.No, + icon=QMessageBox.Question, + callback=callback + ) + def _onGetPrinterDataFinished(self, reply): status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) if status_code == 200: @@ -547,6 +557,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): firmware_version = self._properties.get(b"firmware_version", b"").decode("utf-8") self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders, firmware_version=firmware_version)] self._printers[0].setCamera(NetworkCamera("http://" + self._address + ":8080/?action=stream")) + for extruder in self._printers[0].extruders: + extruder.activeMaterialChanged.connect(self.materialIdChanged) + extruder.hotendIDChanged.connect(self.hotendIdChanged) self.printersChanged.emit() # LegacyUM3 always has a single printer. diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 2e1fe4db6f..6bd1c24464 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -235,8 +235,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster" # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) - # TODO: For debug purposes; force it to be legacy printer. - #device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) + if cluster_size > 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: From b1e9e3b8faecdf11a68754dd0126a6c53535c8c6 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 21 Dec 2017 15:14:50 +0100 Subject: [PATCH 104/205] Prevent crash if disconnect already happend CL-541 --- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 6bd1c24464..be62e68f03 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -227,7 +227,11 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): if device: if device.isConnected(): device.disconnect() - device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + try: + device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged) + except TypeError: + # Disconnect already happened. + pass self.discoveredDevicesChanged.emit() From 52d25042ebcf926e7af11a81e343c2572d3cd48a Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 11:29:13 +0100 Subject: [PATCH 105/205] Machines now re-appear after timeout CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index b10700176e..607d23aa53 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -51,6 +51,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._compressing_gcode = False self._gcode = [] + self._connection_state_before_timeout = None + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): raise NotImplementedError("requestWrite needs to be implemented") @@ -114,7 +116,11 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if time_since_last_response > self._timeout_time >= time_since_last_request: # Go (or stay) into timeout. + if self._connection_state_before_timeout is None: + self._connection_state_before_timeout = self._connection_state + self.setConnectionState(ConnectionState.closed) + # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to # sleep. if time_since_last_response > self._recreate_network_manager_time: @@ -122,6 +128,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._createNetworkManager() if time() - self._last_manager_create_time > self._recreate_network_manager_time: self._createNetworkManager() + elif self._connection_state == ConnectionState.closed: + # Go out of timeout. + self.setConnectionState(self._connection_state_before_timeout) + self._connection_state_before_timeout = None return True From 931c87716bf9963bbc23398ae909b3608f05b2e7 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 11:31:48 +0100 Subject: [PATCH 106/205] Connection state changes now trigger a re-evaluation of the icon CL-541 --- plugins/MonitorStage/MonitorStage.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index 41976c70a6..b5a38dad70 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -59,12 +59,14 @@ class MonitorStage(CuraStage): if new_output_device != self._printer_output_device: if self._printer_output_device: self._printer_output_device.acceptsCommandsChanged.disconnect(self._updateIconSource) + self._printer_output_device.connectionStateChanged.disconnect(self._updateIconSource) self._printer_output_device.printersChanged.disconnect(self._onActivePrinterChanged) self._printer_output_device = new_output_device self._printer_output_device.acceptsCommandsChanged.connect(self._updateIconSource) self._printer_output_device.printersChanged.connect(self._onActivePrinterChanged) + self._printer_output_device.connectionStateChanged.connect(self._updateIconSource) self._setActivePrinter(self._printer_output_device.activePrinter) # Force an update of the icon source From eb27695d52181ef1abaadbb6fcbb9fa0772fd77b Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 12:04:02 +0100 Subject: [PATCH 107/205] If a reserved job is moved to a printer that can do it, it' s correclty removed from the old printer CL-541 --- cura/PrinterOutput/PrintJobOutputModel.py | 4 ++++ cura/PrinterOutput/PrinterOutputModel.py | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py index fa8bbe8673..92376ad1dd 100644 --- a/cura/PrinterOutput/PrintJobOutputModel.py +++ b/cura/PrinterOutput/PrintJobOutputModel.py @@ -44,7 +44,11 @@ class PrintJobOutputModel(QObject): def updateAssignedPrinter(self, assigned_printer: "PrinterOutputModel"): if self._assigned_printer != assigned_printer: + old_printer = self._assigned_printer self._assigned_printer = assigned_printer + if old_printer is not None: + # If the previously assigned printer is set, this job is moved away from it. + old_printer.updateActivePrintJob(None) self.assignedPrinterChanged.emit() @pyqtProperty(str, notify=keyChanged) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 0c30d8d788..8234989519 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -180,11 +180,14 @@ class PrinterOutputModel(QObject): def updateActivePrintJob(self, print_job): if self._active_print_job != print_job: - if self._active_print_job is not None: - self._active_print_job.updateAssignedPrinter(None) + old_print_job = self._active_print_job + if print_job is not None: print_job.updateAssignedPrinter(self) self._active_print_job = print_job + + if old_print_job is not None: + old_print_job.updateAssignedPrinter(None) self.activePrintJobChanged.emit() def updateState(self, printer_state): From 562b2454b8bfeb8433fce2011058c04b8c137635 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 13:48:51 +0100 Subject: [PATCH 108/205] Added missing notifications for Connect prints CL-541 --- .../ClusterUM3OutputDevice.py | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index ad085d16ec..d9740c4d29 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -67,6 +67,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + self._finished_jobs = [] + @pyqtProperty(QObject, notify=activePrinterChanged) def controlItem(self): if self._active_printer is None: @@ -216,6 +218,24 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() + def _printJobStateChanged(self): + username = self._getUserName() + + if username is None: + # We only want to show notifications if username is set. + return + + finished_jobs = [job for job in self._print_jobs if job.state == "wait_cleanup"] + + newly_finished_jobs = [job for job in finished_jobs if job not in self._finished_jobs and job.owner == username] + for job in newly_finished_jobs: + job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.".format(printer_name=job.assignedPrinter.name, job_name = job.name)) + job_completed_message = Message(text=job_completed_text, title = i18n_catalog.i18nc("@info:status", "Print finished")) + job_completed_message.show() + + # Keep a list of all completed jobs so we know if something changed next time. + self._finished_jobs = finished_jobs + def _update(self): if not super()._update(): return @@ -243,6 +263,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), key = print_job_data["uuid"], name = print_job_data["name"]) + print_job.stateChanged.connect(self._printJobStateChanged) job_list_changed = True self._print_jobs.append(print_job) print_job.updateTimeTotal(print_job_data["time_total"]) @@ -267,6 +288,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): for removed_job in removed_jobs: if removed_job.assignedPrinter: removed_job.assignedPrinter.updateActivePrintJob(None) + removed_job.stateChanged.disconnect(self._printJobStateChanged) self._print_jobs.remove(removed_job) job_list_changed = True From d6b0fcc92e44cd87756f8517a635f2e39751d8f9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 22 Dec 2017 13:50:55 +0100 Subject: [PATCH 109/205] Progress message is now also shown when still compressing g-code CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 1 + plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index d9740c4d29..9cf83e965a 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -106,6 +106,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): i18n_catalog.i18nc("@info:title", "Sending Data")) self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) + self._progress_message.show() compressed_gcode = self._compressGCode() if compressed_gcode is None: diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index ce87eaba16..126dbbbde3 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -246,8 +246,8 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): i18n_catalog.i18nc("@info:title", "Sending Data")) self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "") self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered) - self._progress_message.show() + compressed_gcode = self._compressGCode() if compressed_gcode is None: # Abort was called. From 2ac3ef78c32b6a367f0d341b6bffcb14e0000732 Mon Sep 17 00:00:00 2001 From: Tyler Gibson Date: Wed, 29 Nov 2017 01:09:42 -0800 Subject: [PATCH 110/205] Adding support for Malyan M200, Monoprice Select Mini V1 & V2, renaming Malyan M180 for consistency. --- .../{m180.def.json => malyan_m180.def.json} | 1 + resources/definitions/malyan_m200.def.json | 90 ++++++++++++++++++ .../monoprice_select_mini_v1.def.json | 18 ++++ .../monoprice_select_mini_v2.def.json | 22 +++++ resources/meshes/malyan_m200_platform.stl | Bin 0 -> 29184 bytes .../malyan_m200/malyan_m200_0.04375.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.0875.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.13125.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.175.inst.cfg | 23 +++++ .../malyan_m200/malyan_m200_0.21875.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.2625.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.30625.inst.cfg | 22 +++++ .../malyan_m200/malyan_m200_0.35.inst.cfg | 23 +++++ resources/variants/malyan_m200_0.15.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.25.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.30.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.35.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.40.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.50.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.60.inst.cfg | 18 ++++ resources/variants/malyan_m200_0.80.inst.cfg | 18 ++++ resources/variants/malyan_m200_1.00.inst.cfg | 18 ++++ 22 files changed, 471 insertions(+) rename resources/definitions/{m180.def.json => malyan_m180.def.json} (98%) create mode 100644 resources/definitions/malyan_m200.def.json create mode 100644 resources/definitions/monoprice_select_mini_v1.def.json create mode 100644 resources/definitions/monoprice_select_mini_v2.def.json create mode 100644 resources/meshes/malyan_m200_platform.stl create mode 100644 resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg create mode 100644 resources/variants/malyan_m200_0.15.inst.cfg create mode 100644 resources/variants/malyan_m200_0.25.inst.cfg create mode 100644 resources/variants/malyan_m200_0.30.inst.cfg create mode 100644 resources/variants/malyan_m200_0.35.inst.cfg create mode 100644 resources/variants/malyan_m200_0.40.inst.cfg create mode 100644 resources/variants/malyan_m200_0.50.inst.cfg create mode 100644 resources/variants/malyan_m200_0.60.inst.cfg create mode 100644 resources/variants/malyan_m200_0.80.inst.cfg create mode 100644 resources/variants/malyan_m200_1.00.inst.cfg diff --git a/resources/definitions/m180.def.json b/resources/definitions/malyan_m180.def.json similarity index 98% rename from resources/definitions/m180.def.json rename to resources/definitions/malyan_m180.def.json index 71aa729b7e..5e0a6038dd 100644 --- a/resources/definitions/m180.def.json +++ b/resources/definitions/malyan_m180.def.json @@ -1,4 +1,5 @@ { + "id": "malyan_m180", "version": 2, "name": "Malyan M180", "inherits": "fdmprinter", diff --git a/resources/definitions/malyan_m200.def.json b/resources/definitions/malyan_m200.def.json new file mode 100644 index 0000000000..f19980a3b7 --- /dev/null +++ b/resources/definitions/malyan_m200.def.json @@ -0,0 +1,90 @@ +{ + "id": "malyan_m200", + "version": 2, + "name": "Malyan M200", + "inherits": "fdmprinter", + "metadata": { + "author": "Brian Corbino", + "manufacturer": "Malyan", + "category": "Other", + "file_formats": "text/x-gcode", + "platform": "malyan_m200_platform.stl", + "has_variants": true, + "has_variant_materials": false, + "has_materials": true, + "has_machine_materials": false, + "has_machine_quality": true, + "preferred_variant": "*0.4*", + "preferred_quality": "*0.175*", + "variants_name": "Nozzle size", + "supports_usb_connection": true, + "visible": true, + "first_start_actions": ["MachineSettingsAction"], + "supported_actions": ["MachineSettingsAction"] + }, + + "overrides": { + "machine_name": { "default_value": "Malyan M200" }, + "speed_print": { "default_value": 50 }, + "speed_wall_0": { "value": "round(speed_print * 0.75, 2)" }, + "speed_wall_x": { "value": "speed_print" }, + "speed_support": { "value": "speed_wall_0" }, + "speed_layer_0": { "value": "round(speed_print / 2.0, 2)" }, + "speed_travel": { "default_value": 50 }, + "speed_travel_layer_0": { "default_value": 40 }, + "speed_infill": { "value": "speed_print" }, + "speed_topbottom": {"value": "speed_print / 2"}, + + "layer_height": { "minimum_value": "0.04375", "maximum_value": "machine_nozzle_size * 0.875", "maximum_value_warning": "machine_nozzle_size * 0.48125 + 0.0875", "default_value": 0.13125 }, + "line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" }, + + "material_print_temperature": { "minimum_value": "0" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_bed_temperature": { "minimum_value": "0" }, + "material_bed_temperature_layer_0": { "value": "material_bed_temperature + 5" }, + "material_standby_temperature": { "minimum_value": "0" }, + "machine_show_variants": { "default_value": true }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode" : { + "default_value": "G21;(metric values)\nG90;(absolute positioning)\nM82;(set extruder to absolute mode)\nM107;(start with the fan off)\nG28;(Home the printer)\nG92 E0;(Reset the extruder to 0)\nG0 Z5 E5 F500;(Move up and prime the nozzle)\nG0 X-1 Z0;(Move outside the printable area)\nG1 Y60 E8 F500;(Draw a priming/wiping line to the rear)\nG1 X-1;(Move a little closer to the print area)\nG1 Y10 E16 F500;(draw more priming/wiping)\nG1 E15 F250;(Small retract)\nG92 E0;(Zero the extruder)" + }, + "machine_end_gcode" : { + "default_value": "G0 X0 Y127;(Stick out the part)\nM190 S0;(Turn off heat bed, don't wait.)\nG92 E10;(Set extruder to 10)\nG1 E7 F200;(retract 3mm)\nM104 S0;(Turn off nozzle, don't wait)\nG4 S300;(Delay 5 minutes)\nM107;(Turn off part fan)\nM84;(Turn off stepper motors.)" + }, + "machine_width": { "default_value": 120 }, + "machine_depth": { "default_value": 120 }, + "machine_height": { "default_value": 120 }, + "machine_heated_bed": { "default_value": true }, + "machine_center_is_zero": { "default_value": false }, + "material_diameter": { "value": 1.75 }, + "machine_nozzle_size": { + "default_value": 0.4, + "minimum_value": "0.15" + }, + "machine_max_feedrate_x": { "default_value": 150 }, + "machine_max_feedrate_y": { "default_value": 150 }, + "machine_max_feedrate_z": { "default_value": 1.5 }, + "machine_max_feedrate_e": { "default_value": 100 }, + "machine_max_acceleration_x": { "default_value": 800 }, + "machine_max_acceleration_y": { "default_value": 800 }, + "machine_max_acceleration_z": { "default_value": 20 }, + "machine_max_acceleration_e": { "default_value": 10000 }, + "machine_max_jerk_xy": { "default_value": 20 }, + "machine_max_jerk_z": { "default_value": 0.4 }, + "machine_max_jerk_e": { "default_value": 5}, + "adhesion_type": { "default_value": "raft" }, + "raft_margin": { "default_value": 5 }, + "raft_airgap": { "default_value": 0.2625 }, + "raft_base_thickness": { "value": "0.30625" }, + "raft_interface_thickness": { "value": "0.21875" }, + "raft_surface_layers": { "default_value": 1 }, + "skirt_line_count": { "default_value": 2}, + "brim_width" : { "default_value": 5}, + "start_layers_at_same_position": { "default_value": true}, + "retraction_combing": { "default_value": "noskin" }, + "retraction_amount" : { "default_value": 4.5}, + "retraction_speed" : { "default_value": 40}, + "coasting_enable": { "default_value": true }, + "prime_tower_enable": { "default_value": false} + } +} diff --git a/resources/definitions/monoprice_select_mini_v1.def.json b/resources/definitions/monoprice_select_mini_v1.def.json new file mode 100644 index 0000000000..0b76a26c1c --- /dev/null +++ b/resources/definitions/monoprice_select_mini_v1.def.json @@ -0,0 +1,18 @@ +{ + "id": "monoprice_select_mini_v1", + "version": 2, + "name": "Monoprice Select Mini V1", + "inherits": "malyan_m200", + "metadata": { + "author": "Brian Corbino", + "manufacturer": "Monoprice", + "category": "Other", + "file_formats": "text/x-gcode", + "quality_definition": "malyan_m200", + "visible": true + }, + + "overrides": { + "machine_name": { "default_value": "Monoprice Select Mini V1" } + } +} diff --git a/resources/definitions/monoprice_select_mini_v2.def.json b/resources/definitions/monoprice_select_mini_v2.def.json new file mode 100644 index 0000000000..33367aad88 --- /dev/null +++ b/resources/definitions/monoprice_select_mini_v2.def.json @@ -0,0 +1,22 @@ +{ + "id": "monoprice_select_mini_v2", + "version": 2, + "name": "Monoprice Select Mini V2 (E3D)", + "inherits": "malyan_m200", + "metadata": { + "author": "Brian Corbino", + "manufacturer": "Monoprice", + "category": "Other", + "file_formats": "text/x-gcode", + "quality_definition": "malyan_m200", + "visible": true + }, + + "overrides": { + "machine_name": { "default_value": "Monoprice Select Mini V2" }, + "adhesion_type": { "default_value": "brim" }, + "retraction_combing": { "default_value": "noskin" }, + "retraction_amount" : { "default_value": 2.5}, + "retraction_speed" : { "default_value": 40} + } +} diff --git a/resources/meshes/malyan_m200_platform.stl b/resources/meshes/malyan_m200_platform.stl new file mode 100644 index 0000000000000000000000000000000000000000..32b19a09114b7b3dee2ccd2da1e7fac1cb1acaec GIT binary patch literal 29184 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

Kah*fmelOmn**YEV59%c@nVQpwBBRCG? z3dzsQ`pRYmefNr^Xvv)sJi|=WQbzC$GcEM$CoDuzE3RZ7u1{X3IjF@R%LrZLnw{0u zm8`zh9oL+BXFcLNcvUCTE;}Qx8U5vbS?9XH`mC>9C&n3iLQ6T0Vz=ClM#oW0Gn_4D z1kVr=*TJhIFEuDv#qmV2)TTWbEtxJ?&MOi1+m(oeT102BN@tY&j2MIB^D{&tJZ=(V zVXcz9)7FwKK7YHI5!6!N{3Y5nLb>v{mcADehewy>%t0-$QD;J=y*M?yLb$SH4xVu} zrKOcq&#cD?=E|9t7BiCL&>7pJ7SS2OGwv93*iuH6(OG*mw4#rr8S)o#Ok*%t5cHMRZ0CYTi7Y_R1@# z{AC;*!I?uf@K;-b2;UXhn`FnH%})7zE{j%$#;Lf7-K$u`Hkp|P~_%_{KVa_^5$>wGJ;w~F5bmg ztgmiOEj?+}8GhAP zYSZSij3}OzEB&Y~wS0#><|xrNTSQMIe7`JP{HA3Z!R(gWw8+c&Xc@_I5J9bSyp67m zke27fKu0f4BRInmt!nnamrOn1{M_#o#gPzdCj9@pgOH@tw@ic;3s^;q6 zRn2WHJc$|Z>=3LV(bHbh?leN(kr6R4nYrz&R&&SX6fr%+NFm=^uKPbc}WP}TT1qQjb&x}%m``O(rQHi zcA;O-&Efmn?3KqFwIus$AVogsQ!YLQ=CjO<;L}sjiSmTc7Bj*Xl$N_sGA$VqPte`f z(z5Ja4dWOi7_DVlTFoK5=8)E^E(s2w8EO%2j$*aE4d5!{$i?T3NX`g;A?@r+iiQ;X|kM$j%-OQJKvPtO%O`KCE^ zpAl~tW~cdGGV7E%sKp9SBls;c5ww&!7%dUBlo5X3uE=?ZG<{dZJFHmS<2O2q&K!QS zEe?Jy$uC?pf?E8Za~e^`bDODSjf!9OWLIVmYQ-3gIHnQ&3X`7D!^}ai#Npouj5RTy zISdi;3|YB~K8{~mW!8s?{=02@!k99GT8wrY5my%Z7h>fhosh3Uwd zA6+f^8PGIB9RB@8)?+#jo?+GE`XQc7<;dA3%=ENZw8gF@cji#!jzg=AuTkQf@!_(j z57&>lx{r>d7SYojtp7BE{!)wR%pom5Nh=<fbC45Z$wIWszD$Z?63x_DO+X literal 0 HcmV?d00001 diff --git a/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg new file mode 100644 index 0000000000..c19d6f2050 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M1 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = 2 +quality_type = fine +setting_version = 3 + +[values] +layer_height = 0.04375 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg new file mode 100644 index 0000000000..519e963227 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M2 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = 1 +quality_type = high +setting_version = 3 + +[values] +layer_height = 0.0875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg new file mode 100644 index 0000000000..732218cd79 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M3 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = 0 +quality_type = normal +setting_version = 3 + +[values] +layer_height = 0.13125 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg new file mode 100644 index 0000000000..f27e1ff900 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = M4 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -1 +quality_type = fast +global_quality = true +setting_version = 3 + +[values] +layer_height = 0.175 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg new file mode 100644 index 0000000000..3ff3b562b2 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M5 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -2 +quality_type = faster +setting_version = 3 + +[values] +layer_height = 0.21875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg new file mode 100644 index 0000000000..881f70521f --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M6 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -3 +quality_type = draft +setting_version = 3 + +[values] +layer_height = 0.2625 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg new file mode 100644 index 0000000000..5d81cbc259 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg @@ -0,0 +1,22 @@ +[general] +version = 2 +name = M7 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -4 +quality_type = turbo +setting_version = 3 + +[values] +layer_height = 0.30625 +layer_height_0 = 0.30625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg new file mode 100644 index 0000000000..74294ea6f6 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = M8 Quality +definition = malyan_m200 + +[metadata] +type = quality +weight = -5 +quality_type = hyper +global_quality = true +setting_version = 3 + +[values] +layer_height = 0.35 +layer_height_0 = 0.35 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/variants/malyan_m200_0.15.inst.cfg b/resources/variants/malyan_m200_0.15.inst.cfg new file mode 100644 index 0000000000..808b8755ea --- /dev/null +++ b/resources/variants/malyan_m200_0.15.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.15 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.15 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.05 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.25.inst.cfg b/resources/variants/malyan_m200_0.25.inst.cfg new file mode 100644 index 0000000000..3847f5c617 --- /dev/null +++ b/resources/variants/malyan_m200_0.25.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.25 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.25 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.1 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.30.inst.cfg b/resources/variants/malyan_m200_0.30.inst.cfg new file mode 100644 index 0000000000..fee8aae40f --- /dev/null +++ b/resources/variants/malyan_m200_0.30.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.30 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.30 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.11 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.35.inst.cfg b/resources/variants/malyan_m200_0.35.inst.cfg new file mode 100644 index 0000000000..dcbb3ed4c0 --- /dev/null +++ b/resources/variants/malyan_m200_0.35.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.35 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.35 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.13 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.40.inst.cfg b/resources/variants/malyan_m200_0.40.inst.cfg new file mode 100644 index 0000000000..6e17dd13a6 --- /dev/null +++ b/resources/variants/malyan_m200_0.40.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.40 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.40 +machine_nozzle_tip_outer_diameter = 1.05 +coasting_volume = 0.15 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.25, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2.25, 1) diff --git a/resources/variants/malyan_m200_0.50.inst.cfg b/resources/variants/malyan_m200_0.50.inst.cfg new file mode 100644 index 0000000000..ce87def1e6 --- /dev/null +++ b/resources/variants/malyan_m200_0.50.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.50 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.50 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.2 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.60.inst.cfg b/resources/variants/malyan_m200_0.60.inst.cfg new file mode 100644 index 0000000000..0ee7c786e8 --- /dev/null +++ b/resources/variants/malyan_m200_0.60.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.60 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.60 +machine_nozzle_tip_outer_diameter = 1.25 +coasting_volume = 0.28 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_0.80.inst.cfg b/resources/variants/malyan_m200_0.80.inst.cfg new file mode 100644 index 0000000000..54f48afdb4 --- /dev/null +++ b/resources/variants/malyan_m200_0.80.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 0.80 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 0.80 +machine_nozzle_tip_outer_diameter = 1.35 +coasting_volume = 0.45 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print * 4 / 3, 1) +speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) +speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_1.00.inst.cfg b/resources/variants/malyan_m200_1.00.inst.cfg new file mode 100644 index 0000000000..ce0a2d0dfb --- /dev/null +++ b/resources/variants/malyan_m200_1.00.inst.cfg @@ -0,0 +1,18 @@ +[general] +name = 1.00 mm +version = 2 +definition = malyan_m200 + +[metadata] +author = Brian Corbino +type = variant +setting_version = 3 + +[values] +machine_nozzle_size = 1.00 +machine_nozzle_tip_outer_diameter = 0.8 +coasting_volume = 0.63 +coasting_min_volume = =round(coasting_volume * 4,2) +speed_wall = =round(speed_print / 1.2, 1) +speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) +speed_topbottom = =round(speed_print / 1.5, 1) From 80f50dfff579b30f54eeee2205a72e735a8acf2f Mon Sep 17 00:00:00 2001 From: tylergibson Date: Wed, 13 Dec 2017 18:33:18 -0800 Subject: [PATCH 111/205] renaming variants to fix filename conflict, updating quality setting version --- resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg | 2 +- resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg | 2 +- .../{malyan_m200_0.15.inst.cfg => malyan_m200_0.15mm.inst.cfg} | 0 .../{malyan_m200_0.25.inst.cfg => malyan_m200_0.25mm.inst.cfg} | 0 .../{malyan_m200_0.30.inst.cfg => malyan_m200_0.30mm.inst.cfg} | 0 .../{malyan_m200_0.35.inst.cfg => malyan_m200_0.35mm.inst.cfg} | 0 .../{malyan_m200_0.40.inst.cfg => malyan_m200_0.40mm.inst.cfg} | 0 .../{malyan_m200_0.50.inst.cfg => malyan_m200_0.50mm.inst.cfg} | 0 .../{malyan_m200_0.60.inst.cfg => malyan_m200_0.60mm.inst.cfg} | 0 .../{malyan_m200_0.80.inst.cfg => malyan_m200_0.80mm.inst.cfg} | 0 .../{malyan_m200_1.00.inst.cfg => malyan_m200_1.00mm.inst.cfg} | 0 17 files changed, 8 insertions(+), 8 deletions(-) rename resources/variants/{malyan_m200_0.15.inst.cfg => malyan_m200_0.15mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.25.inst.cfg => malyan_m200_0.25mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.30.inst.cfg => malyan_m200_0.30mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.35.inst.cfg => malyan_m200_0.35mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.40.inst.cfg => malyan_m200_0.40mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.50.inst.cfg => malyan_m200_0.50mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.60.inst.cfg => malyan_m200_0.60mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_0.80.inst.cfg => malyan_m200_0.80mm.inst.cfg} (100%) rename resources/variants/{malyan_m200_1.00.inst.cfg => malyan_m200_1.00mm.inst.cfg} (100%) diff --git a/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg index c19d6f2050..54be6ecbcc 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.04375.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = 2 quality_type = fine -setting_version = 3 +setting_version = 4 [values] layer_height = 0.04375 diff --git a/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg index 519e963227..568dd796f3 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.0875.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = 1 quality_type = high -setting_version = 3 +setting_version = 4 [values] layer_height = 0.0875 diff --git a/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg index 732218cd79..1dc436502b 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.13125.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = 0 quality_type = normal -setting_version = 3 +setting_version = 4 [values] layer_height = 0.13125 diff --git a/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg index f27e1ff900..314a8acd83 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.175.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -1 quality_type = fast global_quality = true -setting_version = 3 +setting_version = 4 [values] layer_height = 0.175 diff --git a/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg index 3ff3b562b2..a7fedb7e04 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.21875.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = -2 quality_type = faster -setting_version = 3 +setting_version = 4 [values] layer_height = 0.21875 diff --git a/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg index 881f70521f..441abc3070 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.2625.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = -3 quality_type = draft -setting_version = 3 +setting_version = 4 [values] layer_height = 0.2625 diff --git a/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg index 5d81cbc259..2588838174 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.30625.inst.cfg @@ -7,7 +7,7 @@ definition = malyan_m200 type = quality weight = -4 quality_type = turbo -setting_version = 3 +setting_version = 4 [values] layer_height = 0.30625 diff --git a/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg index 74294ea6f6..800b6104d9 100644 --- a/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg +++ b/resources/quality/malyan_m200/malyan_m200_0.35.inst.cfg @@ -8,7 +8,7 @@ type = quality weight = -5 quality_type = hyper global_quality = true -setting_version = 3 +setting_version = 4 [values] layer_height = 0.35 diff --git a/resources/variants/malyan_m200_0.15.inst.cfg b/resources/variants/malyan_m200_0.15mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.15.inst.cfg rename to resources/variants/malyan_m200_0.15mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.25.inst.cfg b/resources/variants/malyan_m200_0.25mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.25.inst.cfg rename to resources/variants/malyan_m200_0.25mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.30.inst.cfg b/resources/variants/malyan_m200_0.30mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.30.inst.cfg rename to resources/variants/malyan_m200_0.30mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.35.inst.cfg b/resources/variants/malyan_m200_0.35mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.35.inst.cfg rename to resources/variants/malyan_m200_0.35mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.40.inst.cfg b/resources/variants/malyan_m200_0.40mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.40.inst.cfg rename to resources/variants/malyan_m200_0.40mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.50.inst.cfg b/resources/variants/malyan_m200_0.50mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.50.inst.cfg rename to resources/variants/malyan_m200_0.50mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.60.inst.cfg b/resources/variants/malyan_m200_0.60mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.60.inst.cfg rename to resources/variants/malyan_m200_0.60mm.inst.cfg diff --git a/resources/variants/malyan_m200_0.80.inst.cfg b/resources/variants/malyan_m200_0.80mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_0.80.inst.cfg rename to resources/variants/malyan_m200_0.80mm.inst.cfg diff --git a/resources/variants/malyan_m200_1.00.inst.cfg b/resources/variants/malyan_m200_1.00mm.inst.cfg similarity index 100% rename from resources/variants/malyan_m200_1.00.inst.cfg rename to resources/variants/malyan_m200_1.00mm.inst.cfg From 93a3054af0582d0d6230f9d578161464ee64ba02 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 19 Dec 2017 10:38:36 +0100 Subject: [PATCH 112/205] Round layer heights to 2 decimals More difficult than I expected actually... Contributes to issue CURA-4655. --- resources/qml/SidebarSimple.qml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 62cf6f9d34..76d8bb32df 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -183,12 +183,22 @@ Item text: { var result = "" - if(Cura.MachineManager.activeMachine != null){ - - var result = Cura.ProfilesModel.getItem(index).layer_height_without_unit + if(Cura.MachineManager.activeMachine != null) + { + result = Cura.ProfilesModel.getItem(index).layer_height_without_unit if(result == undefined) - result = "" + { + result = ""; + } + else + { + result = Number(Math.round(result + "e+2") + "e-2"); //Round to 2 decimals. Javascript makes this difficult... + if (result == undefined || result != result) //Parse failure. + { + result = ""; + } + } } return result } From 5e3666f073504e08da1c9ffbc7072831bd0452dc Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Tue, 2 Jan 2018 17:21:51 +0100 Subject: [PATCH 113/205] Fill out the type hints in NetworkedPrinterOutputDevice.py CL-541 --- .../NetworkedPrinterOutputDevice.py | 81 +++++++++---------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 607d23aa53..84e186dacb 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -9,7 +9,7 @@ from cura.PrinterOutputDevice import PrinterOutputDevice, ConnectionState from PyQt5.QtNetwork import QHttpMultiPart, QHttpPart, QNetworkRequest, QNetworkAccessManager, QNetworkReply from PyQt5.QtCore import pyqtProperty, pyqtSignal, pyqtSlot, pyqtSignal, QUrl, QCoreApplication from time import time -from typing import Callable, Any, Optional +from typing import Callable, Any, Optional, Dict, Tuple from enum import IntEnum from typing import List @@ -27,45 +27,45 @@ class AuthState(IntEnum): class NetworkedPrinterOutputDevice(PrinterOutputDevice): authenticationStateChanged = pyqtSignal() - def __init__(self, device_id, address: str, properties, parent = None): + def __init__(self, device_id, address: str, properties, parent = None) -> None: super().__init__(device_id = device_id, parent = parent) - self._manager = None - self._last_manager_create_time = None + self._manager = None # type: QNetworkAccessManager + self._last_manager_create_time = None # type: float self._recreate_network_manager_time = 30 self._timeout_time = 10 # After how many seconds of no response should a timeout occur? - self._last_response_time = None - self._last_request_time = None + self._last_response_time = None # type: float + self._last_request_time = None # type: float self._api_prefix = "" self._address = address self._properties = properties self._user_agent = "%s/%s " % (Application.getInstance().getApplicationName(), Application.getInstance().getVersion()) - self._onFinishedCallbacks = {} + self._onFinishedCallbacks = {} # type: Dict[str, Callable[[QNetworkReply], None]] self._authentication_state = AuthState.NotAuthenticated - self._cached_multiparts = {} + self._cached_multiparts = {} # type: Dict[int, Tuple[QHttpMultiPart, QNetworkReply]] self._sending_gcode = False self._compressing_gcode = False - self._gcode = [] + self._gcode = [] # type: List[str] - self._connection_state_before_timeout = None + self._connection_state_before_timeout = None # type: Optional[ConnectionState] - def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs) -> None: raise NotImplementedError("requestWrite needs to be implemented") - def setAuthenticationState(self, authentication_state): + def setAuthenticationState(self, authentication_state) -> None: if self._authentication_state != authentication_state: self._authentication_state = authentication_state self.authenticationStateChanged.emit() @pyqtProperty(int, notify=authenticationStateChanged) - def authenticationState(self): + def authenticationState(self) -> int: return self._authentication_state - def _compressDataAndNotifyQt(self, data_to_append): + def _compressDataAndNotifyQt(self, data_to_append: str) -> bytes: compressed_data = gzip.compress(data_to_append.encode("utf-8")) self._progress_message.setProgress(-1) # Tickle the message so that it's clear that it's still being used. QCoreApplication.processEvents() # Ensure that the GUI does not freeze. @@ -75,7 +75,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_response_time = time() return compressed_data - def _compressGCode(self): + def _compressGCode(self) -> Optional[bytes]: self._compressing_gcode = True ## Mash the data into single string @@ -87,7 +87,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if not self._compressing_gcode: self._progress_message.hide() # Stop trying to zip / send as abort was called. - return + return None batched_line += line # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. # Compressing line by line in this case is extremely slow, so we need to batch them. @@ -103,7 +103,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._compressing_gcode = False return byte_array_file_data - def _update(self): + def _update(self) -> bool: if self._last_response_time: time_since_last_response = time() - self._last_response_time else: @@ -135,7 +135,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return True - def _createEmptyRequest(self, target, content_type: Optional[str] = "application/json"): + def _createEmptyRequest(self, target, content_type: Optional[str] = "application/json") -> QNetworkRequest: url = QUrl("http://" + self._address + self._api_prefix + target) request = QNetworkRequest(url) if content_type is not None: @@ -143,7 +143,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request.setHeader(QNetworkRequest.UserAgentHeader, self._user_agent) return request - def _createFormPart(self, content_header, data, content_type = None): + def _createFormPart(self, content_header, data, content_type = None) -> QHttpPart: part = QHttpPart() if not content_header.startswith("form-data;"): @@ -158,18 +158,18 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): ## Convenience function to get the username from the OS. # The code was copied from the getpass module, as we try to use as little dependencies as possible. - def _getUserName(self): + def _getUserName(self) -> str: for name in ("LOGNAME", "USER", "LNAME", "USERNAME"): user = os.environ.get(name) if user: return user return "Unknown User" # Couldn't find out username. - def _clearCachedMultiPart(self, reply): + def _clearCachedMultiPart(self, reply: QNetworkReply) -> None: if id(reply) in self._cached_multiparts: del self._cached_multiparts[id(reply)] - def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -178,7 +178,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def get(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -187,13 +187,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]): + def delete(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() self._last_request_time = time() - pass - def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def post(self, target: str, data: str, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -204,7 +203,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target, content_type=None) @@ -223,17 +222,17 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None): + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: post_part = QHttpPart() post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) post_part.setBody(body_data) self.postFormWithParts(target, [post_part], onFinished, onProgress) - def _onAuthenticationRequired(self, reply, authenticator): + def _onAuthenticationRequired(self, reply, authenticator) -> None: Logger.log("w", "Request to {url} required authentication, which was not implemented".format(url = reply.url().toString())) - def _createNetworkManager(self): + def _createNetworkManager(self) -> None: Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) @@ -246,7 +245,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._manager.authenticationRequired.connect(self._onAuthenticationRequired) #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes - def __handleOnFinished(self, reply: QNetworkReply): + def __handleOnFinished(self, reply: QNetworkReply) -> None: # Due to garbage collection, we need to cache certain bits of post operations. # As we don't want to keep them around forever, delete them if we get a reply. if reply.operation() == QNetworkAccessManager.PostOperation: @@ -269,10 +268,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): Logger.logException("w", "something went wrong with callback") @pyqtSlot(str, result=str) - def getProperty(self, key): - key = key.encode("utf-8") - if key in self._properties: - return self._properties.get(key, b"").decode("utf-8") + def getProperty(self, key: str) -> str: + bytes_key = key.encode("utf-8") + if bytes_key in self._properties: + return self._properties.get(bytes_key, b"").decode("utf-8") else: return "" @@ -282,25 +281,25 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): ## Get the unique key of this machine # \return key String containing the key of the machine. @pyqtProperty(str, constant=True) - def key(self): + def key(self) -> str: return self._id ## The IP address of the printer. @pyqtProperty(str, constant=True) - def address(self): + def address(self) -> str: return self._properties.get(b"address", b"").decode("utf-8") ## Name of the printer (as returned from the ZeroConf properties) @pyqtProperty(str, constant=True) - def name(self): + def name(self) -> str: return self._properties.get(b"name", b"").decode("utf-8") ## Firmware version (as returned from the ZeroConf properties) @pyqtProperty(str, constant=True) - def firmwareVersion(self): + def firmwareVersion(self) -> str: return self._properties.get(b"firmware_version", b"").decode("utf-8") ## IPadress of this printer @pyqtProperty(str, constant=True) - def ipAddress(self): - return self._address \ No newline at end of file + def ipAddress(self) -> str: + return self._address From ef46f514970edca956f9942cdf35a1a19ad9e4dd Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 13:44:38 +0100 Subject: [PATCH 114/205] Camera delete now triggers the correct function CL-541 --- cura/PrinterOutput/NetworkCamera.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutput/NetworkCamera.py b/cura/PrinterOutput/NetworkCamera.py index ad4fb90dd2..5b28ffd30d 100644 --- a/cura/PrinterOutput/NetworkCamera.py +++ b/cura/PrinterOutput/NetworkCamera.py @@ -89,7 +89,7 @@ class NetworkCamera(QObject): ## Ensure that close gets called when object is destroyed def __del__(self): - self.close() + self.stop() def _onStreamDownloadProgress(self, bytes_received, bytes_total): # An MJPG stream is (for our purpose) a stream of concatenated JPG images. From c1bf87bd8fac98150e720258087a3e1b90095f76 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 13:54:15 +0100 Subject: [PATCH 115/205] Removed commented out code CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 84e186dacb..845696d80c 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -236,14 +236,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): Logger.log("d", "Creating network manager") if self._manager: self._manager.finished.disconnect(self.__handleOnFinished) - #self._manager.networkAccessibleChanged.disconnect(self._onNetworkAccesibleChanged) self._manager.authenticationRequired.disconnect(self._onAuthenticationRequired) self._manager = QNetworkAccessManager() self._manager.finished.connect(self.__handleOnFinished) self._last_manager_create_time = time() self._manager.authenticationRequired.connect(self._onAuthenticationRequired) - #self._manager.networkAccessibleChanged.connect(self._onNetworkAccesibleChanged) # for debug purposes def __handleOnFinished(self, reply: QNetworkReply) -> None: # Due to garbage collection, we need to cache certain bits of post operations. From e12a2fbd6a8be70da77d09e59501cbb705e0ba85 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 14:07:34 +0100 Subject: [PATCH 116/205] Fixed typing CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 845696d80c..46523e5989 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -178,7 +178,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def get(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: + def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -187,12 +187,12 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def delete(self, target: str, onFinished: Optional[Callable[[QNetworkReply], None]]) -> None: + def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: self._createNetworkManager() self._last_request_time = time() - def post(self, target: str, data: str, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: + def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target) @@ -203,7 +203,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: + def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: self._createNetworkManager() request = self._createEmptyRequest(target, content_type=None) @@ -222,7 +222,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onFinished is not None: self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[QNetworkReply], None]], onProgress: Callable = None) -> None: + def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: post_part = QHttpPart() post_part.setHeader(QNetworkRequest.ContentDispositionHeader, header_data) post_part.setBody(body_data) From 3173eb6740c9a7612dee1a28c1e885301b1a8688 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 3 Jan 2018 16:15:12 +0100 Subject: [PATCH 117/205] Avoid mega-tons of object copying when building compressed gcode CL-541 --- .../NetworkedPrinterOutputDevice.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 46523e5989..4914473ed1 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -80,28 +80,32 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): ## Mash the data into single string max_chars_per_line = int(1024 * 1024 / 4) # 1/4 MB per line. - byte_array_file_data = b"" - batched_line = "" + file_data_bytes_list = [] + batched_lines = [] + batched_lines_count = 0 for line in self._gcode: if not self._compressing_gcode: self._progress_message.hide() # Stop trying to zip / send as abort was called. return None - batched_line += line + # if the gcode was read from a gcode file, self._gcode will be a list of all lines in that file. # Compressing line by line in this case is extremely slow, so we need to batch them. - if len(batched_line) < max_chars_per_line: - continue - byte_array_file_data += self._compressDataAndNotifyQt(batched_line) - batched_line = "" + batched_lines.append(line) + batched_lines_count += len(line) + + if batched_lines_count >= max_chars_per_line: + file_data_bytes_list.append(self._compressDataAndNotifyQt("".join(batched_lines))) + batched_lines = [] + batched_lines_count # Don't miss the last batch (If any) - if batched_line: - byte_array_file_data += self._compressDataAndNotifyQt(batched_line) + if len(batched_lines) != 0: + file_data_bytes_list.append(self._compressDataAndNotifyQt("".join(batched_lines))) self._compressing_gcode = False - return byte_array_file_data + return b"".join(file_data_bytes_list) def _update(self) -> bool: if self._last_response_time: From 487fca31dd06a63be85215abc8fa361db8b9b3e4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 16:59:05 +0100 Subject: [PATCH 118/205] Chopped up bunch of functions. As per review request. CL-541 --- .../ClusterUM3OutputDevice.py | 279 ++++++++++-------- 1 file changed, 149 insertions(+), 130 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 9cf83e965a..c87fdaa0ba 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -216,15 +216,13 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def getDateCompleted(self, time_remaining): current_time = time() datetime_completed = datetime.fromtimestamp(current_time + time_remaining) - return (datetime_completed.strftime("%a %b ") + "{day}".format(day=datetime_completed.day)).upper() def _printJobStateChanged(self): username = self._getUserName() if username is None: - # We only want to show notifications if username is set. - return + return # We only want to show notifications if username is set. finished_jobs = [job for job in self._print_jobs if job.state == "wait_cleanup"] @@ -244,144 +242,165 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.get("print_jobs/", onFinished=self._onGetPrintJobsFinished) def _onGetPrintJobsFinished(self, reply: QNetworkReply): - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if status_code == 200: - try: - result = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid print jobs message: Not valid JSON.") - return - print_jobs_seen = [] - job_list_changed = False - for print_job_data in result: - print_job = None - for job in self._print_jobs: - if job.key == print_job_data["uuid"]: - print_job = job - break + if not checkValidGetReply(reply): + return - if print_job is None: - print_job = PrintJobOutputModel(output_controller = ClusterUM3PrinterOutputController(self), - key = print_job_data["uuid"], - name = print_job_data["name"]) - print_job.stateChanged.connect(self._printJobStateChanged) - job_list_changed = True - self._print_jobs.append(print_job) - print_job.updateTimeTotal(print_job_data["time_total"]) - print_job.updateTimeElapsed(print_job_data["time_elapsed"]) - print_job.updateState(print_job_data["status"]) - print_job.updateOwner(print_job_data["owner"]) - printer = None - if print_job.state != "queued": - # Print job should be assigned to a printer. - printer = self._getPrinterByKey(print_job_data["printer_uuid"]) - else: # Status is queued - # The job can "reserve" a printer if some changes are required. - printer = self._getPrinterByKey(print_job_data["assigned_to"]) + result = loadJsonFromReply(reply) + if result is None: + return - if printer: - printer.updateActivePrintJob(print_job) + print_jobs_seen = [] + job_list_changed = False + for print_job_data in result: + print_job = findByKey(self._print_jobs, print_job_data["uuid"]) - print_jobs_seen.append(print_job) + if print_job is None: + print_job = self._createJobModel() + job_list_changed = True - # Check what jobs need to be removed. - removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] - for removed_job in removed_jobs: - if removed_job.assignedPrinter: - removed_job.assignedPrinter.updateActivePrintJob(None) - removed_job.stateChanged.disconnect(self._printJobStateChanged) - self._print_jobs.remove(removed_job) - job_list_changed = True + self._updatePrintJob(print_job, print_job_data) - # Do a single emit for all print job changes. - if job_list_changed: - self.printJobsChanged.emit() + if print_job.state != "queued": # Print job should be assigned to a printer. + printer = self._getPrinterByKey(print_job_data["printer_uuid"]) + else: # The job can "reserve" a printer if some changes are required. + printer = self._getPrinterByKey(print_job_data["assigned_to"]) + + if printer: + printer.updateActivePrintJob(print_job) + + print_jobs_seen.append(print_job) + + # Check what jobs need to be removed. + removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] + for removed_job in removed_jobs: + job_list_changed |= self._removeJob(removed_job) + + if job_list_changed: + self.printJobsChanged.emit() # Do a single emit for all print job changes. def _onGetPrintersDataFinished(self, reply: QNetworkReply): - status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) - if status_code == 200: - try: - result = json.loads(bytes(reply.readAll()).decode("utf-8")) - except json.decoder.JSONDecodeError: - Logger.log("w", "Received an invalid printers state message: Not valid JSON.") - return - printer_list_changed = False - # TODO: Ensure that printers that have been removed are also removed locally. + if not checkValidGetReply(reply): + return - printers_seen = [] + result = loadJsonFromReply(reply) + if result is None: + return - for printer_data in result: - uuid = printer_data["uuid"] + printer_list_changed = False + printers_seen = [] - printer = None - for device in self._printers: - if device.key == uuid: - printer = device - break + for printer_data in result: + printer = findByKey(self._printers, printer_data["uuid"]) - if printer is None: - printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), number_of_extruders=self._number_of_extruders) - printer.setCamera(NetworkCamera("http://" + printer_data["ip_address"] + ":8080/?action=stream")) - self._printers.append(printer) - printer_list_changed = True - - printers_seen.append(printer) - - printer.updateName(printer_data["friendly_name"]) - printer.updateKey(uuid) - printer.updateType(printer_data["machine_variant"]) - if not printer_data["enabled"]: - printer.updateState("disabled") - else: - printer.updateState(printer_data["status"]) - - for index in range(0, self._number_of_extruders): - extruder = printer.extruders[index] - try: - extruder_data = printer_data["configuration"][index] - except IndexError: - break - - try: - hotend_id = extruder_data["print_core_id"] - except KeyError: - hotend_id = "" - extruder.updateHotendID(hotend_id) - - material_data = extruder_data["material"] - if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: - containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", - GUID=material_data["guid"]) - if containers: - color = containers[0].getMetaDataEntry("color_code") - brand = containers[0].getMetaDataEntry("brand") - material_type = containers[0].getMetaDataEntry("material") - name = containers[0].getName() - else: - Logger.log("w", "Unable to find material with guid {guid}. Using data as provided by cluster".format(guid = material_data["guid"])) - # Unknown material. - color = material_data["color"] - brand = material_data["brand"] - material_type = material_data["material"] - name = "Unknown" - - material = MaterialOutputModel(guid = material_data["guid"], - type = material_type, - brand = brand, - color = color, - name = name) - extruder.updateActiveMaterial(material) - removed_printers = [printer for printer in self._printers if printer not in printers_seen] - - for removed_printer in removed_printers: - self._printers.remove(removed_printer) + if printer is None: + printer = self._createPrinterModel(printer_data) printer_list_changed = True - if self._active_printer == removed_printer: - self._active_printer = None - self.activePrinterChanged.emit() - if printer_list_changed: - self.printersChanged.emit() + printers_seen.append(printer) + + self._updatePrinter(printer, printer_data) + + removed_printers = [printer for printer in self._printers if printer not in printers_seen] + for printer in removed_printers: + self._removePrinter(printer) + + if removed_printers or printer_list_changed: + self.printersChanged.emit() + + def _createPrinterModel(self, data): + printer = PrinterOutputModel(output_controller=ClusterUM3PrinterOutputController(self), + number_of_extruders=self._number_of_extruders) + printer.setCamera(NetworkCamera("http://" + data["ip_address"] + ":8080/?action=stream")) + self._printers.append(printer) + return printer + + def _createPrintJobModel(self, data): + print_job = PrintJobOutputModel(output_controller=ClusterUM3PrinterOutputController(self), + key=data["uuid"], name= data["name"]) + print_job.stateChanged.connect(self._printJobStateChanged) + self._print_jobs.append(print_job) + return print_job + + def _updatePrintJob(self, print_job, data): + print_job.updateTimeTotal(data["time_total"]) + print_job.updateTimeElapsed(data["time_elapsed"]) + print_job.updateState(data["status"]) + print_job.updateOwner(data["owner"]) + + def _updatePrinter(self, printer, data): + printer.updateName(data["friendly_name"]) + printer.updateKey(data["uuid"]) + printer.updateType(data["machine_variant"]) + if not data["enabled"]: + printer.updateState("disabled") else: - Logger.log("w", - "Got status code {status_code} while trying to get printer data".format(status_code=status_code)) \ No newline at end of file + printer.updateState(data["status"]) + + for index in range(0, self._number_of_extruders): + extruder = printer.extruders[index] + try: + extruder_data = data["configuration"][index] + except IndexError: + break + + extruder.updateHotendID(extruder_data.get("print_core_id", "")) + + material_data = extruder_data["material"] + if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]: + containers = ContainerRegistry.getInstance().findInstanceContainers(type="material", + GUID=material_data["guid"]) + if containers: + color = containers[0].getMetaDataEntry("color_code") + brand = containers[0].getMetaDataEntry("brand") + material_type = containers[0].getMetaDataEntry("material") + name = containers[0].getName() + else: + Logger.log("w", + "Unable to find material with guid {guid}. Using data as provided by cluster".format( + guid=material_data["guid"])) + color = material_data["color"] + brand = material_data["brand"] + material_type = material_data["material"] + name = "Unknown" + + material = MaterialOutputModel(guid=material_data["guid"], type=material_type, + brand=brand, color=color, name=name) + extruder.updateActiveMaterial(material) + + def _removeJob(self, job): + if job.assignedPrinter: + job.assignedPrinter.updateActivePrintJob(None) + job.stateChanged.disconnect(self._printJobStateChanged) + self._print_jobs.remove(job) + return True + return False + + def _removePrinter(self, printer): + self._printers.remove(printer) + if self._active_printer == printer: + self._active_printer = None + self.activePrinterChanged.emit() + + +def loadJsonFromReply(reply): + try: + result = json.loads(bytes(reply.readAll()).decode("utf-8")) + except json.decoder.JSONDecodeError: + Logger.logException("w", "Unable to decode JSON from reply.") + return + return result + + +def checkValidGetReply(reply): + status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) + + if status_code != 200: + Logger.log("w", "Got status code {status_code} while trying to get data".format(status_code=status_code)) + return False + return True + + +def findByKey(list, key): + for item in list: + if item.key == key: + return item \ No newline at end of file From 42b50bf74974b07be9d50f99cd6eb09f5d5b03b5 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 3 Jan 2018 17:14:52 +0100 Subject: [PATCH 119/205] Fixed typo in function CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index c87fdaa0ba..52f39c42e9 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -255,7 +255,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = findByKey(self._print_jobs, print_job_data["uuid"]) if print_job is None: - print_job = self._createJobModel() + print_job = self._createPrintJobModel() job_list_changed = True self._updatePrintJob(print_job, print_job_data) From faa4af634afd47f04cafbdc97b23e8b57cbc9c3e Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 09:58:15 +0100 Subject: [PATCH 120/205] Show pause text even if there is nothing to pause CL-541 --- resources/qml/MonitorButton.qml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index bd14cc58fe..0e9728da3d 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -277,10 +277,9 @@ Item (["paused", "printing"].indexOf(activePrintJob.state) >= 0) text: { - var result = ""; if (!printerConnected || activePrintJob == null) { - return ""; + return catalog.i18nc("@label:", "Pause"); } if (activePrintJob.state == "paused") From 9e055f03408b88005350ebaabb4153cb928d2d35 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:04:00 +0100 Subject: [PATCH 121/205] Added missing parameter CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 52f39c42e9..7aa6ebb03e 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -255,7 +255,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job = findByKey(self._print_jobs, print_job_data["uuid"]) if print_job is None: - print_job = self._createPrintJobModel() + print_job = self._createPrintJobModel(print_job_data) job_list_changed = True self._updatePrintJob(print_job, print_job_data) From 6cf6d51feacb7030c86d0c09eee83e3026f09b2d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:06:09 +0100 Subject: [PATCH 122/205] Queued and printing amount now gets updated on state change CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 7aa6ebb03e..0e603d2816 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -232,6 +232,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): job_completed_message = Message(text=job_completed_text, title = i18n_catalog.i18nc("@info:status", "Print finished")) job_completed_message.show() + # Ensure UI gets updated + self.printJobsChanged.emit() + # Keep a list of all completed jobs so we know if something changed next time. self._finished_jobs = finished_jobs From b6ebb804ba81f1e2920cefc7f95524958ed4b355 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:13:55 +0100 Subject: [PATCH 123/205] OutputDevice header now shows name of active printer CL-541 --- resources/qml/PrinterOutput/OutputDeviceHeader.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index ca64c79f2b..d6ac863b87 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -13,11 +13,12 @@ Item implicitWidth: parent.width implicitHeight: Math.floor(childrenRect.height + UM.Theme.getSize("default_margin").height * 2) property var outputDevice: null + Rectangle { anchors.fill: parent color: UM.Theme.getColor("setting_category") - + property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null Label { id: outputDeviceNameLabel @@ -26,7 +27,7 @@ Item anchors.left: parent.left anchors.top: parent.top anchors.margins: UM.Theme.getSize("default_margin").width - text: outputDevice != null ? outputDevice.name : catalog.i18nc("@info:status", "No printer connected") + text: outputDevice != null ? activePrinter.name : "" } Label { From 4cb7bc03ad7ccff89069dd2a3634c375fcb28620 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 10:30:03 +0100 Subject: [PATCH 124/205] Sidebar tooltips are now visible again CL-541 --- resources/qml/Cura.qml | 46 +++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 0f55ad07fa..0aef23a2e1 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -383,6 +383,29 @@ UM.MainWindow anchors.top: parent.top } + Loader + { + id: main + + anchors + { + top: topbar.bottom + bottom: parent.bottom + left: parent.left + right: sidebar.left + } + + MouseArea + { + visible: UM.Controller.activeStage.mainComponent != "" + anchors.fill: parent + acceptedButtons: Qt.AllButtons + onWheel: wheel.accepted = true + } + + source: UM.Controller.activeStage.mainComponent + } + Loader { id: sidebar @@ -443,29 +466,6 @@ UM.MainWindow } } - Loader - { - id: main - - anchors - { - top: topbar.bottom - bottom: parent.bottom - left: parent.left - right: sidebar.left - } - - MouseArea - { - visible: UM.Controller.activeStage.mainComponent != "" - anchors.fill: parent - acceptedButtons: Qt.AllButtons - onWheel: wheel.accepted = true - } - - source: UM.Controller.activeStage.mainComponent - } - UM.MessageStack { anchors From 2588e11364976ee3133a0103f0496261b4462e45 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 4 Jan 2018 10:43:50 +0100 Subject: [PATCH 125/205] Improve and simplify how we hold on to form part objects CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 4914473ed1..73bd5e192b 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -45,7 +45,9 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._onFinishedCallbacks = {} # type: Dict[str, Callable[[QNetworkReply], None]] self._authentication_state = AuthState.NotAuthenticated - self._cached_multiparts = {} # type: Dict[int, Tuple[QHttpMultiPart, QNetworkReply]] + # QHttpMultiPart objects need to be kept alive and not garbage collected during the + # HTTP which uses them. We hold references to these QHttpMultiPart objects here. + self._live_multiparts = {} # type: Dict[QNetworkReply, QHttpMultiPart] self._sending_gcode = False self._compressing_gcode = False @@ -170,8 +172,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return "Unknown User" # Couldn't find out username. def _clearCachedMultiPart(self, reply: QNetworkReply) -> None: - if id(reply) in self._cached_multiparts: - del self._cached_multiparts[id(reply)] + if reply in self._live_multiparts: + del self._live_multiparts[reply] def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: @@ -219,7 +221,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, multi_post_part) - self._cached_multiparts[id(reply)] = (multi_post_part, reply) + self._live_multiparts[reply] = multi_post_part if onProgress is not None: reply.uploadProgress.connect(onProgress) From 2e8ae5c590de74fb47e0170436316bdfa966f814 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 12:54:47 +0100 Subject: [PATCH 126/205] Unsasigned jobs are now also removed from list CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 0e603d2816..244fb90b6b 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -275,6 +275,7 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Check what jobs need to be removed. removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen] + for removed_job in removed_jobs: job_list_changed |= self._removeJob(removed_job) @@ -371,12 +372,15 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): extruder.updateActiveMaterial(material) def _removeJob(self, job): + if job not in self._print_jobs: + return False + if job.assignedPrinter: job.assignedPrinter.updateActivePrintJob(None) job.stateChanged.disconnect(self._printJobStateChanged) - self._print_jobs.remove(job) - return True - return False + self._print_jobs.remove(job) + + return True def _removePrinter(self, printer): self._printers.remove(printer) From 695c7d826706ebc59c707c6bb9eed4a5a25e348f Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 4 Jan 2018 13:26:13 +0100 Subject: [PATCH 127/205] Rename the `_live_multiparts` to the even better `_kept_alive_multiparts` name CL-541 --- cura/PrinterOutput/NetworkedPrinterOutputDevice.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index 73bd5e192b..f2acc2115d 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -47,7 +47,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): # QHttpMultiPart objects need to be kept alive and not garbage collected during the # HTTP which uses them. We hold references to these QHttpMultiPart objects here. - self._live_multiparts = {} # type: Dict[QNetworkReply, QHttpMultiPart] + self._kept_alive_multiparts = {} # type: Dict[QNetworkReply, QHttpMultiPart] self._sending_gcode = False self._compressing_gcode = False @@ -172,8 +172,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): return "Unknown User" # Couldn't find out username. def _clearCachedMultiPart(self, reply: QNetworkReply) -> None: - if reply in self._live_multiparts: - del self._live_multiparts[reply] + if reply in self._kept_alive_multiparts: + del self._kept_alive_multiparts[reply] def put(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: @@ -221,7 +221,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, multi_post_part) - self._live_multiparts[reply] = multi_post_part + self._kept_alive_multiparts[reply] = multi_post_part if onProgress is not None: reply.uploadProgress.connect(onProgress) From acde48108dc83efa3adb8aba53f7b97fcbe54a86 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 13:31:54 +0100 Subject: [PATCH 128/205] Removed control item CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 244fb90b6b..51e713904b 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -69,14 +69,6 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._finished_jobs = [] - @pyqtProperty(QObject, notify=activePrinterChanged) - def controlItem(self): - if self._active_printer is None: - return super().controlItem - else: - # Let cura use the default. - return None - def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().getController().setActiveStage("MonitorStage") From b20e35714fafe71b16664ec00ad12e8b1498fcf4 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Thu, 4 Jan 2018 13:33:53 +0100 Subject: [PATCH 129/205] Factor out the code for adding a function for run after a HTTP request CL-541 --- .../NetworkedPrinterOutputDevice.py | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py index f2acc2115d..7cf855ee85 100644 --- a/cura/PrinterOutput/NetworkedPrinterOutputDevice.py +++ b/cura/PrinterOutput/NetworkedPrinterOutputDevice.py @@ -181,8 +181,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.put(request, data.encode()) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + self._registerOnFinishedCallback(reply, onFinished) def get(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: if self._manager is None: @@ -190,13 +189,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): request = self._createEmptyRequest(target) self._last_request_time = time() reply = self._manager.get(request) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished - - def delete(self, target: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: - if self._manager is None: - self._createNetworkManager() - self._last_request_time = time() + self._registerOnFinishedCallback(reply, onFinished) def post(self, target: str, data: str, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: @@ -206,8 +199,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): reply = self._manager.post(request, data) if onProgress is not None: reply.uploadProgress.connect(onProgress) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + self._registerOnFinishedCallback(reply, onFinished) def postFormWithParts(self, target:str, parts: List[QHttpPart], onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: if self._manager is None: @@ -225,8 +217,7 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): if onProgress is not None: reply.uploadProgress.connect(onProgress) - if onFinished is not None: - self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + self._registerOnFinishedCallback(reply, onFinished) def postForm(self, target: str, header_data: str, body_data: bytes, onFinished: Optional[Callable[[Any, QNetworkReply], None]], onProgress: Callable = None) -> None: post_part = QHttpPart() @@ -249,6 +240,10 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice): self._last_manager_create_time = time() self._manager.authenticationRequired.connect(self._onAuthenticationRequired) + def _registerOnFinishedCallback(self, reply: QNetworkReply, onFinished: Optional[Callable[[Any, QNetworkReply], None]]) -> None: + if onFinished is not None: + self._onFinishedCallbacks[reply.url().toString() + str(reply.operation())] = onFinished + def __handleOnFinished(self, reply: QNetworkReply) -> None: # Due to garbage collection, we need to cache certain bits of post operations. # As we don't want to keep them around forever, delete them if we get a reply. From c9b8b0333c87ba5021e4d29a3cba120ea1f0ad1d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 14:56:42 +0100 Subject: [PATCH 130/205] Sending prints to a specific printer in the cluster is now possible again CL-541 --- .../ClusterUM3OutputDevice.py | 30 ++++++++++++--- plugins/UM3NetworkPrinting/PrintWindow.qml | 38 +++++++++++-------- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 51e713904b..d13706cc4c 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -62,11 +62,15 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._active_printer = None # type: Optional[PrinterOutputModel] + self._printer_selection_dialog = None + self.setPriority(3) # Make sure the output device gets selected above local file output self.setName(self._id) self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + self._printer_uuid_to_unique_name_mapping = {} + self._finished_jobs = [] def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): @@ -79,11 +83,21 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Unable to find g-code. Nothing to send return - # TODO; DEBUG - self.sendPrintJob() + if len(self._printers) > 1: + self._spawnPrinterSelectionDialog() + else: + self.sendPrintJob() + + def _spawnPrinterSelectionDialog(self): + if self._printer_selection_dialog is None: + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "PrintWindow.qml") + self._printer_selection_dialog = Application.getInstance().createQmlComponent(path, {"OutputDevice": self}) + if self._printer_selection_dialog is not None: + self._printer_selection_dialog.show() @pyqtSlot() - def sendPrintJob(self): + @pyqtSlot(str) + def sendPrintJob(self, target_printer = ""): Logger.log("i", "Sending print job to printer.") if self._sending_gcode: self._error_message = Message( @@ -108,9 +122,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): parts = [] # If a specific printer was selected, it should be printed with that machine. - require_printer_name = "" # Todo; actually needs to be set - if require_printer_name: - parts.append(self._createFormPart("name=require_printer_name", bytes(require_printer_name, "utf-8"), "text/plain")) + if target_printer: + target_printer = self._printer_uuid_to_unique_name_mapping[target_printer] + parts.append(self._createFormPart("name=require_printer_name", bytes(target_printer, "utf-8"), "text/plain")) # Add user name to the print_job parts.append(self._createFormPart("name=owner", bytes(self._getUserName(), "utf-8"), "text/plain")) @@ -324,6 +338,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): print_job.updateOwner(data["owner"]) def _updatePrinter(self, printer, data): + # For some unknown reason the cluster wants UUID for everything, except for sending a job directly to a printer. + # Then we suddenly need the unique name. So in order to not have to mess up all the other code, we save a mapping. + self._printer_uuid_to_unique_name_mapping[data["uuid"]] = data["unique_name"] + printer.updateName(data["friendly_name"]) printer.updateKey(data["uuid"]) printer.updateType(data["machine_variant"]) diff --git a/plugins/UM3NetworkPrinting/PrintWindow.qml b/plugins/UM3NetworkPrinting/PrintWindow.qml index 7afe174da2..13d087f930 100644 --- a/plugins/UM3NetworkPrinting/PrintWindow.qml +++ b/plugins/UM3NetworkPrinting/PrintWindow.qml @@ -20,8 +20,24 @@ UM.Dialog visible: true modality: Qt.ApplicationModal + onVisibleChanged: + { + if(visible) + { + resetPrintersModel() + } + } + title: catalog.i18nc("@title:window", "Print over network") - title: catalog.i18nc("@title:window","Print over network") + property var printersModel: ListModel{} + function resetPrintersModel() { + printersModel.append({ name: "Automatic", key: ""}) + + for (var index in OutputDevice.printers) + { + printersModel.append({name: OutputDevice.printers[index].name, key: OutputDevice.printers[index].key}) + } + } Column { @@ -31,8 +47,7 @@ UM.Dialog anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.rightMargin: UM.Theme.getSize("default_margin").width - height: 50 * screenScaleFactor - + height: 50 * screenScaleFactord Label { id: manualPrinterSelectionLabel @@ -42,7 +57,7 @@ UM.Dialog topMargin: UM.Theme.getSize("default_margin").height right: parent.right } - text: "Printer selection" + text: catalog.i18nc("@label", "Printer selection") wrapMode: Text.Wrap height: 20 * screenScaleFactor } @@ -50,18 +65,12 @@ UM.Dialog ComboBox { id: printerSelectionCombobox - model: OutputDevice.printers - textRole: "friendly_name" + model: base.printersModel + textRole: "name" width: parent.width height: 40 * screenScaleFactor Behavior on height { NumberAnimation { duration: 100 } } - - onActivated: - { - var printerData = OutputDevice.printers[index]; - OutputDevice.selectPrinter(printerData.unique_name, printerData.friendly_name); - } } SystemPalette @@ -79,8 +88,6 @@ UM.Dialog enabled: true onClicked: { base.visible = false; - // reset to defaults - OutputDevice.selectAutomaticPrinter() printerSelectionCombobox.currentIndex = 0 } } @@ -93,9 +100,8 @@ UM.Dialog enabled: true onClicked: { base.visible = false; - OutputDevice.sendPrintJob(); + OutputDevice.sendPrintJob(printerSelectionCombobox.model.get(printerSelectionCombobox.currentIndex).key) // reset to defaults - OutputDevice.selectAutomaticPrinter() printerSelectionCombobox.currentIndex = 0 } } From d0ec7d10ce7570b5d1fde84dc126ba8283df6e11 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 4 Jan 2018 15:35:30 +0100 Subject: [PATCH 131/205] Printer discovery shows if a cluster is actually set up as a host CL-541 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 6 ++++++ plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index d13706cc4c..4283042bf2 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -73,6 +73,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._finished_jobs = [] + self._cluster_size = int(properties.get(b"cluster_size", 0)) + def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): # Notify the UI that a switch to the print monitor should happen Application.getInstance().getController().setActiveStage("MonitorStage") @@ -95,6 +97,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): if self._printer_selection_dialog is not None: self._printer_selection_dialog.show() + @pyqtProperty(int, constant=True) + def clusterSize(self): + return self._cluster_size + @pyqtSlot() @pyqtSlot(str) def sendPrintJob(self, target_printer = ""): diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index be62e68f03..c639c25007 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -240,7 +240,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): # or "Legacy" UM3 device. cluster_size = int(properties.get(b"cluster_size", -1)) - if cluster_size > 0: + if cluster_size >= 0: device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties) else: device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties) From 39921795cee3e79d74267cd2092ecea4c0fee97a Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 5 Jan 2018 14:46:16 +0100 Subject: [PATCH 132/205] Properly align printer not connected label from top --- resources/qml/PrinterOutput/OutputDeviceHeader.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index d6ac863b87..bc9a44e245 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -19,6 +19,7 @@ Item anchors.fill: parent color: UM.Theme.getColor("setting_category") property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null + Label { id: outputDeviceNameLabel @@ -29,6 +30,7 @@ Item anchors.margins: UM.Theme.getSize("default_margin").width text: outputDevice != null ? activePrinter.name : "" } + Label { id: outputDeviceAddressLabel @@ -39,6 +41,7 @@ Item anchors.right: parent.right anchors.margins: UM.Theme.getSize("default_margin").width } + Label { text: outputDevice != null ? outputDevice.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") @@ -49,6 +52,8 @@ Item anchors.leftMargin: UM.Theme.getSize("default_margin").width anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("default_margin").width + anchors.top: parent.top + anchors.topMargin: UM.Theme.getSize("default_margin").height } } } \ No newline at end of file From 7ad15c7dd2771bdf1815ec78126b58ae4071348d Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Jan 2018 17:25:04 +0100 Subject: [PATCH 133/205] Allow adding support-specific settings for support meshes in Per Model Settings --- .../PerObjectSettingsPanel.qml | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 5bdb6d4cb0..b4e7a46e00 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -18,6 +18,9 @@ Item { width: childrenRect.width; height: childrenRect.height; + property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed", + "travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"] + Column { id: items @@ -106,7 +109,7 @@ Item { id: currentSettings property int maximumHeight: 200 * screenScaleFactor height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight) - visible: ["support_mesh", "anti_overhang_mesh"].indexOf(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) == -1 + visible: meshTypeSelection.model.get(meshTypeSelection.currentIndex).type != "anti_overhang_mesh" ScrollView { @@ -124,7 +127,15 @@ Item { id: addedSettingsModel; containerId: Cura.MachineManager.activeDefinitionId expanded: [ "*" ] - exclude: [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] + exclude: { + var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; + + if(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + { + excluded_settings = excluded_settings.concat(base.all_categories_except_support); + } + return excluded_settings; + } visibilityHandler: Cura.PerObjectSettingVisibilityHandler { @@ -306,7 +317,18 @@ Item { } } - onClicked: settingPickDialog.visible = true; + onClicked: + { + settingPickDialog.visible = true; + if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh") + { + settingPickDialog.additional_excluded_settings = base.all_categories_except_support; + } + else + { + settingPickDialog.additional_excluded_settings = [] + } + } } } @@ -315,9 +337,10 @@ Item { id: settingPickDialog title: catalog.i18nc("@title:window", "Select Settings to Customize for this model") - width: screenScaleFactor * 360; + width: screenScaleFactor * 360 property string labelFilter: "" + property var additional_excluded_settings onVisibilityChanged: { @@ -394,7 +417,12 @@ Item { } visibilityHandler: UM.SettingPreferenceVisibilityHandler {} expanded: [ "*" ] - exclude: [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ] + exclude: + { + var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]; + excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings); + return excluded_settings; + } } delegate:Loader { From 8bd6afad1fe5a5dc0a1de8b2ee5bbcc4deb4d158 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Jan 2018 18:33:05 +0100 Subject: [PATCH 134/205] Render support meshes with a vertical stripe... ...so they are easier to tell apart from normal meshes, especially for single extrusion printers --- plugins/SolidView/SolidView.py | 16 ++++++++++++++++ resources/shaders/striped.shader | 14 +++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/plugins/SolidView/SolidView.py b/plugins/SolidView/SolidView.py index e156e655ce..50ff2864b7 100644 --- a/plugins/SolidView/SolidView.py +++ b/plugins/SolidView/SolidView.py @@ -28,6 +28,7 @@ class SolidView(View): self._enabled_shader = None self._disabled_shader = None self._non_printing_shader = None + self._support_mesh_shader = None self._extruders_model = ExtrudersModel() self._theme = None @@ -54,6 +55,11 @@ class SolidView(View): self._non_printing_shader.setUniformValue("u_diffuseColor", Color(*self._theme.getColor("model_non_printing").getRgb())) self._non_printing_shader.setUniformValue("u_opacity", 0.6) + if not self._support_mesh_shader: + self._support_mesh_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader")) + self._support_mesh_shader.setUniformValue("u_vertical_stripes", True) + self._support_mesh_shader.setUniformValue("u_width", 5.0) + global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack: support_extruder_nr = global_container_stack.getProperty("support_extruder_nr", "value") @@ -117,6 +123,16 @@ class SolidView(View): renderer.queueNode(node, shader = self._non_printing_shader, transparent = True) elif getattr(node, "_outside_buildarea", False): renderer.queueNode(node, shader = self._disabled_shader) + elif per_mesh_stack and per_mesh_stack.getProperty("support_mesh", "value"): + # Render support meshes with a vertical stripe that is darker + shade_factor = 0.6 + uniforms["diffuse_color_2"] = [ + uniforms["diffuse_color"][0] * shade_factor, + uniforms["diffuse_color"][1] * shade_factor, + uniforms["diffuse_color"][2] * shade_factor, + 1.0 + ] + renderer.queueNode(node, shader = self._support_mesh_shader, uniforms = uniforms) else: renderer.queueNode(node, shader = self._enabled_shader, uniforms = uniforms) if node.callDecoration("isGroup") and Selection.isSelected(node): diff --git a/resources/shaders/striped.shader b/resources/shaders/striped.shader index ce7d14e39e..7cf5a62c3f 100644 --- a/resources/shaders/striped.shader +++ b/resources/shaders/striped.shader @@ -32,6 +32,7 @@ fragment = uniform highp vec3 u_viewPosition; uniform mediump float u_width; + uniform mediump bool u_vertical_stripes; varying highp vec3 v_position; varying highp vec3 v_vertex; @@ -40,7 +41,9 @@ fragment = void main() { mediump vec4 finalColor = vec4(0.0); - mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2; + mediump vec4 diffuseColor = u_vertical_stripes ? + (((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) : + ((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2); /* Ambient Component */ finalColor += u_ambientColor; @@ -98,6 +101,7 @@ fragment41core = uniform highp vec3 u_viewPosition; uniform mediump float u_width; + uniform mediump bool u_vertical_stripes; in highp vec3 v_position; in highp vec3 v_vertex; @@ -108,7 +112,9 @@ fragment41core = void main() { mediump vec4 finalColor = vec4(0.0); - mediump vec4 diffuseColor = (mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2; + mediump vec4 diffuseColor = u_vertical_stripes ? + (((mod(v_vertex.x, u_width) < (u_width / 2.)) ^^ (mod(v_vertex.z, u_width) < (u_width / 2.))) ? u_diffuseColor1 : u_diffuseColor2) : + ((mod((-v_position.x + v_position.y), u_width) < (u_width / 2.)) ? u_diffuseColor1 : u_diffuseColor2); /* Ambient Component */ finalColor += u_ambientColor; @@ -138,6 +144,7 @@ u_diffuseColor2 = [0.5, 0.5, 0.5, 1.0] u_specularColor = [0.4, 0.4, 0.4, 1.0] u_shininess = 20.0 u_width = 5.0 +u_vertical_stripes = 0 [bindings] u_modelMatrix = model_matrix @@ -145,7 +152,8 @@ u_viewProjectionMatrix = view_projection_matrix u_normalMatrix = normal_matrix u_viewPosition = view_position u_lightPosition = light_0_position -u_diffuseColor = diffuse_color +u_diffuseColor1 = diffuse_color +u_diffuseColor2 = diffuse_color_2 [attributes] a_vertex = vertex From fbe128bbb75bb52f4fe9a2234c22de57687b7512 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 5 Jan 2018 21:38:54 +0100 Subject: [PATCH 135/205] Hide options for Support, Anti overhang, etc Mesh if their settings are disabled --- .../PerObjectSettingsPanel.qml | 50 ++++++++++++++++--- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index b4e7a46e00..a38112724e 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -42,6 +42,13 @@ Item { verticalAlignment: Text.AlignVCenter } + UM.SettingPropertyProvider + { + id: meshTypePropertyProvider + containerStackId: Cura.MachineManager.activeMachineId + watchedProperties: [ "enabled" ] + } + ComboBox { id: meshTypeSelection @@ -52,36 +59,55 @@ Item { model: ListModel { id: meshTypeModel - Component.onCompleted: + Component.onCompleted: meshTypeSelection.populateModel() + } + + function populateModel() + { + meshTypeModel.append({ + type: "", + text: catalog.i18nc("@label", "Normal model") + }); + meshTypePropertyProvider.key = "support_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") { - meshTypeModel.append({ - type: "", - text: catalog.i18nc("@label", "Normal model") - }); meshTypeModel.append({ type: "support_mesh", text: catalog.i18nc("@label", "Print as support") }); + } + meshTypePropertyProvider.key = "anti_overhang_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "anti_overhang_mesh", text: catalog.i18nc("@label", "Don't support overlap with other models") }); + } + meshTypePropertyProvider.key = "cutting_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "cutting_mesh", text: catalog.i18nc("@label", "Modify settings for overlap with other models") }); + } + meshTypePropertyProvider.key = "infill_mesh"; + if(meshTypePropertyProvider.properties.enabled == "True") + { meshTypeModel.append({ type: "infill_mesh", text: catalog.i18nc("@label", "Modify settings for infill of other models") }); - - meshTypeSelection.updateCurrentIndex(); } + + meshTypeSelection.updateCurrentIndex(); } function updateCurrentIndex() { var mesh_type = UM.ActiveTool.properties.getValue("MeshType"); + meshTypeSelection.currentIndex = -1; for(var index=0; index < meshTypeSelection.model.count; index++) { if(meshTypeSelection.model.get(index).type == mesh_type) @@ -94,6 +120,16 @@ Item { } } + Connections + { + target: Cura.MachineManager + onGlobalContainerChanged: + { + meshTypeSelection.model.clear(); + meshTypeSelection.populateModel(); + } + } + Connections { target: UM.Selection From 8dd5b166f439b5d0f2d5282baea468134343f576 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Sat, 6 Jan 2018 22:46:59 +0100 Subject: [PATCH 136/205] Move 'Drop Down Support Mesh" to "Support" section... ... so it can be added as a per model setting for Support Meshes --- resources/definitions/fdmprinter.def.json | 24 +++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6eef6b1e9b..08c8b75869 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4233,6 +4233,18 @@ "limit_to_extruder": "support_infill_extruder_nr", "enabled": "support_enable and support_use_towers", "settable_per_mesh": true + }, + "support_mesh_drop_down": + { + "label": "Drop Down Support Mesh", + "description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.", + "type": "bool", + "default_value": true, + "enabled": "support_mesh", + "settable_per_mesh": true, + "settable_per_extruder": false, + "settable_per_meshgroup": false, + "settable_globally": false } } }, @@ -5261,18 +5273,6 @@ "settable_per_meshgroup": false, "settable_globally": false }, - "support_mesh_drop_down": - { - "label": "Drop Down Support Mesh", - "description": "Make support everywhere below the support mesh, so that there's no overhang in the support mesh.", - "type": "bool", - "default_value": true, - "enabled": "support_mesh", - "settable_per_mesh": true, - "settable_per_extruder": false, - "settable_per_meshgroup": false, - "settable_globally": false - }, "anti_overhang_mesh": { "label": "Anti Overhang Mesh", From c885341e5a3b88e865db8d8de86fc7f3097622f3 Mon Sep 17 00:00:00 2001 From: Tyler Gibson Date: Sun, 7 Jan 2018 22:39:54 -0800 Subject: [PATCH 137/205] Removing nozzle variants, adding material definitions --- resources/definitions/malyan_m200.def.json | 17 +++++--------- .../monoprice_select_mini_v1.def.json | 2 +- .../monoprice_select_mini_v2.def.json | 9 +++++--- .../abs/malyan_m200_abs_draft.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_fast.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_high.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_normal.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_superdraft.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_thickerdraft.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_ultra.inst.cfg | 15 ++++++++++++ .../abs/malyan_m200_abs_verydraft.inst.cfg | 15 ++++++++++++ .../malyan_m200_global_Draft_Quality.inst.cfg | 23 +++++++++++++++++++ .../malyan_m200_global_Fast_Quality.inst.cfg | 23 +++++++++++++++++++ .../malyan_m200_global_High_Quality.inst.cfg | 23 +++++++++++++++++++ ...malyan_m200_global_Normal_Quality.inst.cfg | 23 +++++++++++++++++++ ...an_m200_global_SuperDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ..._m200_global_ThickerDraft_Quality.inst.cfg | 23 +++++++++++++++++++ .../malyan_m200_global_Ultra_Quality.inst.cfg | 23 +++++++++++++++++++ ...yan_m200_global_VeryDraft_Quality.inst.cfg | 23 +++++++++++++++++++ .../petg/malyan_m200_petg_draft.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_fast.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_high.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_normal.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_superdraft.inst.cfg | 11 +++++++++ .../malyan_m200_petg_thickerdraft.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_ultra.inst.cfg | 11 +++++++++ .../petg/malyan_m200_petg_verydraft.inst.cfg | 11 +++++++++ .../pla/malyan_m200_pla_draft.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_fast.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_high.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_normal.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_superdraft.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_thickerdraft.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_ultra.inst.cfg | 15 ++++++++++++ .../pla/malyan_m200_pla_verydraft.inst.cfg | 15 ++++++++++++ ...onoprice_select_mini_v2_abs_draft.inst.cfg | 15 ++++++++++++ ...monoprice_select_mini_v2_abs_fast.inst.cfg | 15 ++++++++++++ ...monoprice_select_mini_v2_abs_high.inst.cfg | 15 ++++++++++++ ...noprice_select_mini_v2_abs_normal.inst.cfg | 15 ++++++++++++ ...ice_select_mini_v2_abs_superdraft.inst.cfg | 15 ++++++++++++ ...e_select_mini_v2_abs_thickerdraft.inst.cfg | 15 ++++++++++++ ...onoprice_select_mini_v2_abs_ultra.inst.cfg | 15 ++++++++++++ ...rice_select_mini_v2_abs_verydraft.inst.cfg | 15 ++++++++++++ ...lect_mini_v2_global_Draft_Quality.inst.cfg | 23 +++++++++++++++++++ ...elect_mini_v2_global_Fast_Quality.inst.cfg | 23 +++++++++++++++++++ ...elect_mini_v2_global_High_Quality.inst.cfg | 23 +++++++++++++++++++ ...ect_mini_v2_global_Normal_Quality.inst.cfg | 23 +++++++++++++++++++ ...mini_v2_global_SuperDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ...ni_v2_global_ThickerDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ...lect_mini_v2_global_Ultra_Quality.inst.cfg | 23 +++++++++++++++++++ ..._mini_v2_global_VeryDraft_Quality.inst.cfg | 23 +++++++++++++++++++ ...oprice_select_mini_v2_nylon_draft.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_nylon_fast.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_nylon_high.inst.cfg | 11 +++++++++ ...price_select_mini_v2_nylon_normal.inst.cfg | 11 +++++++++ ...e_select_mini_v2_nylon_superdraft.inst.cfg | 11 +++++++++ ...select_mini_v2_nylon_thickerdraft.inst.cfg | 11 +++++++++ ...oprice_select_mini_v2_nylon_ultra.inst.cfg | 11 +++++++++ ...ce_select_mini_v2_nylon_verydraft.inst.cfg | 11 +++++++++ ...monoprice_select_mini_v2_pc_draft.inst.cfg | 15 ++++++++++++ .../monoprice_select_mini_v2_pc_fast.inst.cfg | 15 ++++++++++++ .../monoprice_select_mini_v2_pc_high.inst.cfg | 15 ++++++++++++ ...onoprice_select_mini_v2_pc_normal.inst.cfg | 15 ++++++++++++ ...rice_select_mini_v2_pc_superdraft.inst.cfg | 15 ++++++++++++ ...ce_select_mini_v2_pc_thickerdraft.inst.cfg | 15 ++++++++++++ ...monoprice_select_mini_v2_pc_ultra.inst.cfg | 15 ++++++++++++ ...price_select_mini_v2_pc_verydraft.inst.cfg | 15 ++++++++++++ ...noprice_select_mini_v2_petg_draft.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_petg_fast.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_petg_high.inst.cfg | 11 +++++++++ ...oprice_select_mini_v2_petg_normal.inst.cfg | 11 +++++++++ ...ce_select_mini_v2_petg_superdraft.inst.cfg | 11 +++++++++ ..._select_mini_v2_petg_thickerdraft.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_petg_ultra.inst.cfg | 11 +++++++++ ...ice_select_mini_v2_petg_verydraft.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_pla_draft.inst.cfg | 11 +++++++++ ...monoprice_select_mini_v2_pla_fast.inst.cfg | 11 +++++++++ ...monoprice_select_mini_v2_pla_high.inst.cfg | 11 +++++++++ ...noprice_select_mini_v2_pla_normal.inst.cfg | 11 +++++++++ ...ice_select_mini_v2_pla_superdraft.inst.cfg | 11 +++++++++ ...e_select_mini_v2_pla_thickerdraft.inst.cfg | 11 +++++++++ ...onoprice_select_mini_v2_pla_ultra.inst.cfg | 11 +++++++++ ...rice_select_mini_v2_pla_verydraft.inst.cfg | 11 +++++++++ .../variants/malyan_m200_0.15mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.25mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.30mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.35mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.40mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.50mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.60mm.inst.cfg | 18 --------------- .../variants/malyan_m200_0.80mm.inst.cfg | 18 --------------- .../variants/malyan_m200_1.00mm.inst.cfg | 18 --------------- 92 files changed, 1213 insertions(+), 177 deletions(-) create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg create mode 100644 resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg create mode 100644 resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg create mode 100644 resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg create mode 100644 resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.15mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.25mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.30mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.35mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.40mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.50mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.60mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_0.80mm.inst.cfg delete mode 100644 resources/variants/malyan_m200_1.00mm.inst.cfg diff --git a/resources/definitions/malyan_m200.def.json b/resources/definitions/malyan_m200.def.json index f19980a3b7..9aae3a5244 100644 --- a/resources/definitions/malyan_m200.def.json +++ b/resources/definitions/malyan_m200.def.json @@ -4,19 +4,14 @@ "name": "Malyan M200", "inherits": "fdmprinter", "metadata": { - "author": "Brian Corbino", + "author": "Brian Corbino, Tyler Gibson", "manufacturer": "Malyan", "category": "Other", "file_formats": "text/x-gcode", "platform": "malyan_m200_platform.stl", - "has_variants": true, - "has_variant_materials": false, - "has_materials": true, - "has_machine_materials": false, "has_machine_quality": true, - "preferred_variant": "*0.4*", - "preferred_quality": "*0.175*", - "variants_name": "Nozzle size", + "has_materials": true, + "preferred_quality": "*normal*", "supports_usb_connection": true, "visible": true, "first_start_actions": ["MachineSettingsAction"], @@ -39,9 +34,9 @@ "line_width": { "value": "round(machine_nozzle_size * 0.875, 2)" }, "material_print_temperature": { "minimum_value": "0" }, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_print_temperature_layer_0": { "value": "min(material_print_temperature + 5, 245)" }, "material_bed_temperature": { "minimum_value": "0" }, - "material_bed_temperature_layer_0": { "value": "material_bed_temperature + 5" }, + "material_bed_temperature_layer_0": { "value": "min(material_bed_temperature + 5, 70)" }, "material_standby_temperature": { "minimum_value": "0" }, "machine_show_variants": { "default_value": true }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, @@ -59,7 +54,7 @@ "material_diameter": { "value": 1.75 }, "machine_nozzle_size": { "default_value": 0.4, - "minimum_value": "0.15" + "minimum_value": 0.15 }, "machine_max_feedrate_x": { "default_value": 150 }, "machine_max_feedrate_y": { "default_value": 150 }, diff --git a/resources/definitions/monoprice_select_mini_v1.def.json b/resources/definitions/monoprice_select_mini_v1.def.json index 0b76a26c1c..7264f0a6fc 100644 --- a/resources/definitions/monoprice_select_mini_v1.def.json +++ b/resources/definitions/monoprice_select_mini_v1.def.json @@ -4,7 +4,7 @@ "name": "Monoprice Select Mini V1", "inherits": "malyan_m200", "metadata": { - "author": "Brian Corbino", + "author": "Brian Corbino, Tyler Gibson", "manufacturer": "Monoprice", "category": "Other", "file_formats": "text/x-gcode", diff --git a/resources/definitions/monoprice_select_mini_v2.def.json b/resources/definitions/monoprice_select_mini_v2.def.json index 33367aad88..a935cb5a73 100644 --- a/resources/definitions/monoprice_select_mini_v2.def.json +++ b/resources/definitions/monoprice_select_mini_v2.def.json @@ -4,11 +4,13 @@ "name": "Monoprice Select Mini V2 (E3D)", "inherits": "malyan_m200", "metadata": { - "author": "Brian Corbino", + "author": "Tyler Gibson", "manufacturer": "Monoprice", "category": "Other", "file_formats": "text/x-gcode", - "quality_definition": "malyan_m200", + "has_machine_quality": true, + "has_materials": true, + "preferred_quality": "*normal*", "visible": true }, @@ -17,6 +19,7 @@ "adhesion_type": { "default_value": "brim" }, "retraction_combing": { "default_value": "noskin" }, "retraction_amount" : { "default_value": 2.5}, - "retraction_speed" : { "default_value": 40} + "retraction_speed" : { "default_value": 40}, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, } } diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg new file mode 100644 index 0000000000..19cc9fd00d --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +quality_type = draft +material = generic_abs_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg new file mode 100644 index 0000000000..5677a0d58d --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +quality_type = fast +material = generic_abs_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg new file mode 100644 index 0000000000..7798b3f545 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +quality_type = high +material = generic_abs_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg new file mode 100644 index 0000000000..c87c66c813 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = normal +material = generic_abs_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg new file mode 100644 index 0000000000..e6e3cfcd6c --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = superdraft +material = generic_abs_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg new file mode 100644 index 0000000000..fb08013809 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_abs_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg new file mode 100644 index 0000000000..385d852688 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = ultra +material = generic_abs_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg b/resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg new file mode 100644 index 0000000000..7026391fb6 --- /dev/null +++ b/resources/quality/malyan_m200/abs/malyan_m200_abs_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = verydraft +material = generic_abs_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg new file mode 100644 index 0000000000..d3104caa87 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Draft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +weight = -2 +quality_type = draft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.21875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg new file mode 100644 index 0000000000..aec535bd71 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Fast_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +weight = -1 +quality_type = fast +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.175 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..ca202862a2 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_High_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +weight = 1 +quality_type = high +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.0875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..7076718903 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +weight = 0 +quality_type = normal +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.13125 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg new file mode 100644 index 0000000000..7dfbdb5886 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_SuperDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +weight = -5 +quality_type = superdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.35 +layer_height_0 = 0.35 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg new file mode 100644 index 0000000000..2fbf82b128 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_ThickerDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +weight = -3 +quality_type = thickerdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.2625 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg new file mode 100644 index 0000000000..90e589cca5 --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_Ultra_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +weight = 2 +quality_type = ultra +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.04375 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg b/resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg new file mode 100644 index 0000000000..1210ee214b --- /dev/null +++ b/resources/quality/malyan_m200/malyan_m200_global_VeryDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +weight = -4 +quality_type = verydraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.30625 +layer_height_0 = 0.30625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg new file mode 100644 index 0000000000..aef83471ba --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +quality_type = draft +material = generic_petg_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg new file mode 100644 index 0000000000..3c7fc2c239 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +quality_type = fast +material = generic_petg_175 +weight = -1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg new file mode 100644 index 0000000000..eb1654eae3 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +quality_type = high +material = generic_petg_175 +weight = 1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg new file mode 100644 index 0000000000..53e60d2d62 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = normal +material = generic_petg_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg new file mode 100644 index 0000000000..d2a96386ae --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = superdraft +material = generic_petg_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg new file mode 100644 index 0000000000..e2f37ae43b --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_petg_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg new file mode 100644 index 0000000000..0fa89f2569 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = ultra +material = generic_petg_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg b/resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg new file mode 100644 index 0000000000..84bedf5c14 --- /dev/null +++ b/resources/quality/malyan_m200/petg/malyan_m200_petg_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = verydraft +material = generic_petg_175 +weight = -4 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg new file mode 100644 index 0000000000..4f221eceb7 --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = malyan_m200 + +[metadata] +type = quality +quality_type = draft +material = generic_pla_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg new file mode 100644 index 0000000000..3097fe055a --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = malyan_m200 + +[metadata] +type = quality +quality_type = fast +material = generic_pla_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg new file mode 100644 index 0000000000..062c120ad0 --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = malyan_m200 + +[metadata] +type = quality +quality_type = high +material = generic_pla_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg new file mode 100644 index 0000000000..e01141ed9e --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = normal +material = generic_pla_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg new file mode 100644 index 0000000000..53eb4380eb --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pla_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg new file mode 100644 index 0000000000..32d2b419bc --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_pla_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg new file mode 100644 index 0000000000..3865059254 --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = malyan_m200 + +[metadata] +type = quality +quality_type = ultra +material = generic_pla_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg b/resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg new file mode 100644 index 0000000000..a624c056be --- /dev/null +++ b/resources/quality/malyan_m200/pla/malyan_m200_pla_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = malyan_m200 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pla_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 60 +material_bed_temperature_layer_0 = 60 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg new file mode 100644 index 0000000000..a63256573a --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_abs_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg new file mode 100644 index 0000000000..49f4486596 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_abs_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg new file mode 100644 index 0000000000..eab16a8e2b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_abs_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg new file mode 100644 index 0000000000..03aeb4067b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_abs_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg new file mode 100644 index 0000000000..148f53ba73 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_abs_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg new file mode 100644 index 0000000000..e2ad71a360 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_abs_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg new file mode 100644 index 0000000000..7ebdf80baf --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_abs_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg new file mode 100644 index 0000000000..9965ae8bcf --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/abs/monoprice_select_mini_v2_abs_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_abs_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg new file mode 100644 index 0000000000..b7d0faa2c7 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Draft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -2 +quality_type = draft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.21875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg new file mode 100644 index 0000000000..f7f338e4c9 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Fast_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -1 +quality_type = fast +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.175 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg new file mode 100644 index 0000000000..4a37a1afd8 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_High_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = 1 +quality_type = high +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.0875 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg new file mode 100644 index 0000000000..b8e545adcf --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Normal_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = 0 +quality_type = normal +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.13125 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg new file mode 100644 index 0000000000..0ef9db5875 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_SuperDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -5 +quality_type = superdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.35 +layer_height_0 = 0.35 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg new file mode 100644 index 0000000000..4dd3a7aafe --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_ThickerDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -3 +quality_type = thickerdraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.2625 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg new file mode 100644 index 0000000000..337f0d06bc --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_Ultra_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = 2 +quality_type = ultra +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.04375 +layer_height_0 = 0.2625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg new file mode 100644 index 0000000000..e884077069 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/monoprice_select_mini_v2_global_VeryDraft_Quality.inst.cfg @@ -0,0 +1,23 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +weight = -4 +quality_type = verydraft +global_quality = True +setting_version = 4 + +[values] +layer_height = 0.30625 +layer_height_0 = 0.30625 +wall_thickness = 1.05 +top_bottom_thickness = 0.72 +infill_sparse_density = 22 +speed_print = 50 +speed_layer_0 = =round(speed_print * 30 / 50) +speed_topbottom = 20 +cool_min_layer_time = 5 +cool_min_speed = 10 diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg new file mode 100644 index 0000000000..4a03c17a63 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_nylon_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg new file mode 100644 index 0000000000..1c04f77b8b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_nylon_175 +weight = -1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg new file mode 100644 index 0000000000..d57516598a --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_nylon_175 +weight = 1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg new file mode 100644 index 0000000000..308ea86311 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_nylon_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg new file mode 100644 index 0000000000..db4f3ca907 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_nylon_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg new file mode 100644 index 0000000000..9a1afc0e48 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_nylon_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg new file mode 100644 index 0000000000..3453671a72 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_nylon_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg new file mode 100644 index 0000000000..ee2531fc4e --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/nylon/monoprice_select_mini_v2_nylon_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_nylon_175 +weight = -4 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg new file mode 100644 index 0000000000..aa5fc7844d --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_draft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_pc_175 +weight = -2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg new file mode 100644 index 0000000000..232c4ab6f3 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_fast.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_pc_175 +weight = -1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg new file mode 100644 index 0000000000..aa9da322fb --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_high.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_pc_175 +weight = 1 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg new file mode 100644 index 0000000000..145b21221b --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_normal.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_pc_175 +weight = 0 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg new file mode 100644 index 0000000000..b6e53bda62 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_superdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pc_175 +weight = -5 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg new file mode 100644 index 0000000000..055228ab13 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_thickerdraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_pc_175 +weight = -3 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg new file mode 100644 index 0000000000..a3e99b998e --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_ultra.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_pc_175 +weight = 2 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg new file mode 100644 index 0000000000..73f5a2f2c9 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pc/monoprice_select_mini_v2_pc_verydraft.inst.cfg @@ -0,0 +1,15 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pc_175 +weight = -4 +setting_version = 4 + +[values] +material_bed_temperature = 70 +material_bed_temperature_layer_0 = 70 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg new file mode 100644 index 0000000000..8a33e03310 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_petg_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg new file mode 100644 index 0000000000..fb084fa08e --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_petg_175 +weight = -1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg new file mode 100644 index 0000000000..16891f6f43 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_petg_175 +weight = 1 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg new file mode 100644 index 0000000000..bb2f0b47a8 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_petg_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg new file mode 100644 index 0000000000..78ca1b6b7a --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_petg_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg new file mode 100644 index 0000000000..69606ff913 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_petg_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg new file mode 100644 index 0000000000..7c5ac599c8 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_petg_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg new file mode 100644 index 0000000000..ed0c2510f5 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/petg/monoprice_select_mini_v2_petg_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_petg_175 +weight = -4 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg new file mode 100644 index 0000000000..04a955cf6c --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_draft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fast +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = draft +material = generic_pla_175 +weight = -2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg new file mode 100644 index 0000000000..6efc0935e2 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_fast.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Normal +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = fast +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg new file mode 100644 index 0000000000..8fe2371e5d --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_high.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Finer +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = high +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg new file mode 100644 index 0000000000..01351154c4 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_normal.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = normal +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg new file mode 100644 index 0000000000..adfced9787 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_superdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Lowest Quality Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = superdraft +material = generic_pla_175 +weight = -5 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg new file mode 100644 index 0000000000..f4522c9778 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_thickerdraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = thickerdraft +material = generic_pla_175 +weight = -3 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg new file mode 100644 index 0000000000..2fa8eb7f81 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_ultra.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Ultra Fine +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = ultra +material = generic_pla_175 +weight = 2 +setting_version = 4 \ No newline at end of file diff --git a/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg new file mode 100644 index 0000000000..e59cf4a490 --- /dev/null +++ b/resources/quality/monoprice_select_mini_v2/pla/monoprice_select_mini_v2_pla_verydraft.inst.cfg @@ -0,0 +1,11 @@ +[general] +version = 2 +name = Low Detail Draft +definition = monoprice_select_mini_v2 + +[metadata] +type = quality +quality_type = verydraft +material = generic_pla_175 +weight = 0 +setting_version = 4 \ No newline at end of file diff --git a/resources/variants/malyan_m200_0.15mm.inst.cfg b/resources/variants/malyan_m200_0.15mm.inst.cfg deleted file mode 100644 index 808b8755ea..0000000000 --- a/resources/variants/malyan_m200_0.15mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.15 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.15 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.05 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.25mm.inst.cfg b/resources/variants/malyan_m200_0.25mm.inst.cfg deleted file mode 100644 index 3847f5c617..0000000000 --- a/resources/variants/malyan_m200_0.25mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.25 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.25 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.1 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.30mm.inst.cfg b/resources/variants/malyan_m200_0.30mm.inst.cfg deleted file mode 100644 index fee8aae40f..0000000000 --- a/resources/variants/malyan_m200_0.30mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.30 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.30 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.11 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.35mm.inst.cfg b/resources/variants/malyan_m200_0.35mm.inst.cfg deleted file mode 100644 index dcbb3ed4c0..0000000000 --- a/resources/variants/malyan_m200_0.35mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.35 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.35 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.13 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.40mm.inst.cfg b/resources/variants/malyan_m200_0.40mm.inst.cfg deleted file mode 100644 index 6e17dd13a6..0000000000 --- a/resources/variants/malyan_m200_0.40mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.40 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.40 -machine_nozzle_tip_outer_diameter = 1.05 -coasting_volume = 0.15 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.25, 1) -speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = =round(speed_print / 2.25, 1) diff --git a/resources/variants/malyan_m200_0.50mm.inst.cfg b/resources/variants/malyan_m200_0.50mm.inst.cfg deleted file mode 100644 index ce87def1e6..0000000000 --- a/resources/variants/malyan_m200_0.50mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.50 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.50 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.2 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) diff --git a/resources/variants/malyan_m200_0.60mm.inst.cfg b/resources/variants/malyan_m200_0.60mm.inst.cfg deleted file mode 100644 index 0ee7c786e8..0000000000 --- a/resources/variants/malyan_m200_0.60mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.60 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.60 -machine_nozzle_tip_outer_diameter = 1.25 -coasting_volume = 0.28 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print * 4 / 3, 1) -speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_0.80mm.inst.cfg b/resources/variants/malyan_m200_0.80mm.inst.cfg deleted file mode 100644 index 54f48afdb4..0000000000 --- a/resources/variants/malyan_m200_0.80mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 0.80 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 0.80 -machine_nozzle_tip_outer_diameter = 1.35 -coasting_volume = 0.45 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print * 4 / 3, 1) -speed_wall_0 = =1 if speed_wall < 10 else (speed_wall - 10) -speed_topbottom = =round(speed_print / 2, 1) diff --git a/resources/variants/malyan_m200_1.00mm.inst.cfg b/resources/variants/malyan_m200_1.00mm.inst.cfg deleted file mode 100644 index ce0a2d0dfb..0000000000 --- a/resources/variants/malyan_m200_1.00mm.inst.cfg +++ /dev/null @@ -1,18 +0,0 @@ -[general] -name = 1.00 mm -version = 2 -definition = malyan_m200 - -[metadata] -author = Brian Corbino -type = variant -setting_version = 3 - -[values] -machine_nozzle_size = 1.00 -machine_nozzle_tip_outer_diameter = 0.8 -coasting_volume = 0.63 -coasting_min_volume = =round(coasting_volume * 4,2) -speed_wall = =round(speed_print / 1.2, 1) -speed_wall_0 = =1 if speed_wall < 5 else (speed_wall - 5) -speed_topbottom = =round(speed_print / 1.5, 1) From 2ca06f383e9d65a2b396f395427756ecbf8fafef Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jan 2018 09:41:18 +0100 Subject: [PATCH 138/205] USB printers also get their name set CL-541 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 1e28e252d1..100438e948 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -232,6 +232,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): num_extruders = container_stack.getProperty("machine_extruder_count", "value") # Ensure that a printer is created. self._printers = [PrinterOutputModel(output_controller=USBPrinterOuptutController(self), number_of_extruders=num_extruders)] + self._printers[0].updateName(container_stack.getName()) self.setConnectionState(ConnectionState.connected) self._update_thread.start() From df1bf419d93a909fcceeb052ed2daaf668b3d728 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jan 2018 11:44:30 +0100 Subject: [PATCH 139/205] Don't show "active print" header if no printer is connected CL-541 --- resources/qml/PrintMonitor.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index 6fc4d8847d..471729192e 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -106,6 +106,7 @@ Column { label: catalog.i18nc("@label", "Active print") width: base.width + visible: activePrinter != null } @@ -114,6 +115,7 @@ Column label: catalog.i18nc("@label", "Job Name") value: activePrintJob != null ? activePrintJob.name : "" width: base.width + visible: activePrinter != null } MonitorItem @@ -121,6 +123,7 @@ Column label: catalog.i18nc("@label", "Printing Time") value: activePrintJob != null ? getPrettyTime(activePrintJob.timeTotal) : "" width:base.width + visible: activePrinter != null } MonitorItem From 99de75a3fdafd5b1d653b638364dba2d61041712 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Mon, 8 Jan 2018 13:44:20 +0100 Subject: [PATCH 140/205] Fixed connection label state CL-541 --- cura/PrinterOutputDevice.py | 6 ++++++ plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + resources/qml/PrinterOutput/OutputDeviceHeader.qml | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index b4e67f6297..2aa6fb382e 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -64,6 +64,12 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = ConnectionState.closed + self._address = "" + + @pyqtProperty(str, constant = True) + def address(self): + return self._address + def materialHotendChangedMessage(self, callback): Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") callback(QMessageBox.Yes) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 100438e948..c43d9a826b 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -44,6 +44,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._serial = None # type: Optional[Serial] self._serial_port = serial_port + self._address = serial_port self._timeout = 3 diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index bc9a44e245..d5ce32786c 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -44,7 +44,7 @@ Item Label { - text: outputDevice != null ? outputDevice.connectionText : catalog.i18nc("@info:status", "The printer is not connected.") + text: outputDevice != null ? "" : catalog.i18nc("@info:status", "The printer is not connected.") color: outputDevice != null && outputDevice.acceptsCommands ? UM.Theme.getColor("setting_control_text") : UM.Theme.getColor("setting_control_disabled_text") font: UM.Theme.getFont("very_small") wrapMode: Text.WordWrap From 59d7cc663a45a59c8e03260357a394fc137221cf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 10:36:00 +0100 Subject: [PATCH 141/205] Fix creating ExtruderStack for single-extrusion machine at runtime Move per-extruder settings from the machine's quality changes container to the extruder's quality changes container. --- cura/Settings/CuraContainerRegistry.py | 27 ++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a078240d80..394e83b977 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -515,6 +515,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_quality_changes_container = self.findInstanceContainers(name = machine.qualityChanges.getName(), extruder = extruder_id) if extruder_quality_changes_container: extruder_quality_changes_container = extruder_quality_changes_container[0] + quality_changes_id = extruder_quality_changes_container.getId() extruder_stack.setQualityChangesById(quality_changes_id) else: @@ -525,10 +526,36 @@ class CuraContainerRegistry(ContainerRegistry): if extruder_quality_changes_container: quality_changes_id = extruder_quality_changes_container.getId() extruder_stack.setQualityChangesById(quality_changes_id) + else: + # if we still cannot find a quality changes container for the extruder, create a new one + container_id = self.uniqueName(extruder_stack.getId() + "_user") + container_name = machine.qualityChanges.getName() + extruder_quality_changes_container = InstanceContainer(container_id) + extruder_quality_changes_container.setName(container_name) + extruder_quality_changes_container.addMetaDataEntry("type", "quality_changes") + extruder_quality_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) + extruder_quality_changes_container.addMetaDataEntry("extruder", extruder_stack.definition.getId()) + extruder_quality_changes_container.addMetaDataEntry("quality_type", machine.qualityChanges.getMetaDataEntry("quality_type")) + extruder_quality_changes_container.setDefinition(machine.definition.getId()) if not extruder_quality_changes_container: Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", machine.qualityChanges.getName(), extruder_stack.getId()) + else: + # move all per-extruder settings to the extruder's quality changes + for qc_setting_key in machine.qualityChanges.getAllKeys(): + settable_per_extruder = machine.getProperty(qc_setting_key, "settable_per_extruder") + if settable_per_extruder: + setting_value = machine.qualityChanges.getProperty(qc_setting_key, "value") + + setting_definition = machine.getSettingDefinition(qc_setting_key) + new_instance = SettingInstance(setting_definition, definition_changes) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + extruder_quality_changes_container.addInstance(new_instance) + extruder_quality_changes_container.setDirty(True) + + machine.qualityChanges.removeInstance(qc_setting_key, postpone_emit=True) else: extruder_stack.setQualityChangesById("empty_quality_changes") From 8e5167be762b1e383023ca788dd095eac1f90522 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:23:24 +0100 Subject: [PATCH 142/205] Use the same machine def for extruder quality changes containers --- cura/Settings/CuraContainerRegistry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 394e83b977..9a64f1421e 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -536,7 +536,7 @@ class CuraContainerRegistry(ContainerRegistry): extruder_quality_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) extruder_quality_changes_container.addMetaDataEntry("extruder", extruder_stack.definition.getId()) extruder_quality_changes_container.addMetaDataEntry("quality_type", machine.qualityChanges.getMetaDataEntry("quality_type")) - extruder_quality_changes_container.setDefinition(machine.definition.getId()) + extruder_quality_changes_container.setDefinition(machine.qualityChanges.getDefinition().getId()) if not extruder_quality_changes_container: Logger.log("w", "Could not find quality_changes named [%s] for extruder [%s]", From c91eb30de9499e9e6cf813da66d5f65d7116f54b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:24:38 +0100 Subject: [PATCH 143/205] Skip loaded instance containers When trying to apply the fix for single extrusion machines by creating a new ExtruderStack, skip the quality changes container that has already been loaded. --- cura/Settings/CuraContainerRegistry.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 9a64f1421e..873876c30d 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -589,6 +589,9 @@ class CuraContainerRegistry(ContainerRegistry): if parser["general"]["name"] == name: # load the container container_id = os.path.basename(file_path).replace(".inst.cfg", "") + if self.findInstanceContainers(id = container_id): + # this container is already in the registry, skip it + continue instance_container = InstanceContainer(container_id) with open(file_path, "r") as f: From 78b9a14007d4bd83432b7d7643d2d9a4fbd122e0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:25:53 +0100 Subject: [PATCH 144/205] Fix all possible quality changes containers for single extrusion In the current fix, the quality changes that are applicable to the machine may not have been fixed yet because they are not active at that moment. This commit makes sure that for a single extrusion machine which has just been updated to have an ExtruderStack, all the quality changes containers that are applicable to this machine will be updated as well. --- cura/Settings/CuraContainerRegistry.py | 39 ++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 873876c30d..564b83df6d 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -561,6 +561,45 @@ class CuraContainerRegistry(ContainerRegistry): self.addContainer(extruder_stack) + # Also need to fix the other qualities that are suitable for this machine. Those quality changes may still have + # per-extruder settings in the container for the machine instead of the extruder. + quality_changes_machine_definition_id = machine.qualityChanges.getDefinition().getId() + qcs = self.findInstanceContainers(type = "quality_changes", definition = quality_changes_machine_definition_id) + qc_groups = {} # map of qc names -> qc containers + for qc in qcs: + qc_name = qc.getName() + if qc_name not in qc_groups: + qc_groups[qc_name] = [] + qc_groups[qc_name].append(qc) + # try to find from the quality changes cura directory too + quality_changes_container = self._findQualityChangesContainerInCuraFolder(machine.qualityChanges.getName()) + if quality_changes_container: + qc_groups[qc_name].append(quality_changes_container) + + for qc_name, qc_list in qc_groups.items(): + qc_dict = {"global": None, "extruders": []} + for qc in qc_list: + extruder_def_id = qc.getMetaDataEntry("extruder") + if extruder_def_id is not None: + qc_dict["extruders"].append(qc) + else: + qc_dict["global"] = qc + if qc_dict["global"] is not None and len(qc_dict["extruders"]) == 1: + # move per-extruder settings + for qc_setting_key in qc_dict["global"].getAllKeys(): + settable_per_extruder = machine.getProperty(qc_setting_key, "settable_per_extruder") + if settable_per_extruder: + setting_value = qc_dict["global"].getProperty(qc_setting_key, "value") + + setting_definition = machine.getSettingDefinition(qc_setting_key) + new_instance = SettingInstance(setting_definition, definition_changes) + new_instance.setProperty("value", setting_value) + new_instance.resetState() # Ensure that the state is not seen as a user state. + qc_dict["extruders"][0].addInstance(new_instance) + qc_dict["extruders"][0].setDirty(True) + + qc_dict["global"].removeInstance(qc_setting_key, postpone_emit=True) + # Set next stack at the end extruder_stack.setNextStack(machine) From d633a4c11265394f6aaa67721f3dfd85221907b8 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 9 Jan 2018 13:38:41 +0100 Subject: [PATCH 145/205] Fix: cura does not profile form G-code CURA-4776 --- cura/Settings/CuraContainerRegistry.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a078240d80..15168af0a4 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -202,7 +202,6 @@ class CuraContainerRegistry(ContainerRegistry): for plugin_id, meta_data in self._getIOPlugins("profile_reader"): if meta_data["profile_reader"][0]["extension"] != extension: continue - profile_reader = plugin_registry.getPluginObject(plugin_id) try: profile_or_list = profile_reader.read(file_name) # Try to open the file with the profile reader. @@ -215,6 +214,20 @@ class CuraContainerRegistry(ContainerRegistry): name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) + # if the loaded profile comes from g-code then the instance cointaners should be + # defined differently + file_extension = os.path.splitext(file_name)[1][1:] + if file_extension == "gcode": + for item in profile_or_list: + item.metaData["name"] = new_name + + if item.getMetaDataEntry("extruder") is None: + temp_defintion = item.getMetaDataEntry("definition") + item.metaData["id"] = temp_defintion + "_" + new_name + elif item.getMetaDataEntry("extruder") is not None: + temp_extruder = item.getMetaDataEntry("extruder") + item.metaData["id"] = temp_extruder + "_" + new_name + # Ensure it is always a list of profiles if type(profile_or_list) is not list: profile_or_list = [profile_or_list] From 5936ebaa80636dc7d2189f47d6426685151cabb6 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 13:48:20 +0100 Subject: [PATCH 146/205] Fix another case of scene node checking by subclass, related to CURA-4780 --- cura/OneAtATimeIterator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 44f8d2766a..755680e62f 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -18,7 +18,7 @@ class OneAtATimeIterator(Iterator.Iterator): def _fillStack(self): node_list = [] for node in self._scene_node.getChildren(): - if not type(node) is SceneNode: + if not issubclass(type(node), SceneNode): continue if node.callDecoration("getConvexHull"): From 33f0e8cb6559cd17721883473f112a507ae1a136 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 13:58:04 +0100 Subject: [PATCH 147/205] Use isinstance() to check if a node is a SceneNode CURA-4780 --- cura/OneAtATimeIterator.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 755680e62f..5653c8f1fb 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -18,7 +18,7 @@ class OneAtATimeIterator(Iterator.Iterator): def _fillStack(self): node_list = [] for node in self._scene_node.getChildren(): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if node.callDecoration("getConvexHull"): From dcf02137adc8476c0adf77795873abc6991e4c90 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 9 Jan 2018 14:53:16 +0100 Subject: [PATCH 148/205] Fixed connecting for clean machine CL-541 --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index 003fdbf95c..0e58d8e991 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -29,13 +29,7 @@ Cura.MachineAction function connectToPrinter() { - if(base.selectedDevice) - { - var deviceKey = base.selectedDevice.key - manager.setKey(deviceKey); - completed(); - } - if(base.selectedPrinter && base.completeProperties) + if(base.selectedDevice && base.completeProperties) { var printerKey = base.selectedDevice.key if(manager.getStoredKey() != printerKey) From f9286d4bd59a29ec6c33d3345d5c7c18db53027d Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 15:50:32 +0100 Subject: [PATCH 149/205] Fix color swatch not being updated after color selection change - CURA-4774 --- resources/qml/Preferences/MaterialView.qml | 48 +++++++++++++++------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index 311150c6b9..c3f36f5125 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -104,14 +104,13 @@ TabView Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Color") } - Row - { - width: scrollView.columnWidth; - height: parent.rowHeight; + Row { + width: scrollView.columnWidth + height: parent.rowHeight spacing: Math.floor(UM.Theme.getSize("default_margin").width/2) - Rectangle - { + // color indicator square + Rectangle { id: colorSelector color: properties.color_code @@ -121,17 +120,36 @@ TabView anchors.verticalCenter: parent.verticalCenter - MouseArea { anchors.fill: parent; onClicked: colorDialog.open(); enabled: base.editingEnabled } + // open the color selection dialog on click + MouseArea { + anchors.fill: parent + onClicked: colorDialog.open() + enabled: base.editingEnabled + } } - ReadOnlyTextField - { + + // make sure the color stays connected after changing the color + Binding { + target: colorSelector + property: "color" + value: properties.color_code + } + + // pretty color name text field + ReadOnlyTextField { id: colorLabel; text: properties.color_name; readOnly: !base.editingEnabled onEditingFinished: base.setMetaDataEntry("color_name", properties.color_name, text) } - ColorDialog { id: colorDialog; color: properties.color_code; onAccepted: base.setMetaDataEntry("color_code", properties.color_code, color) } + // popup dialog to select a new color + // if successful it sets the properties.color_code value to the new color + ColorDialog { + id: colorDialog + color: properties.color_code + onAccepted: base.setMetaDataEntry("color_code", properties.color_code, color) + } } Item { width: parent.width; height: UM.Theme.getSize("default_margin").height } @@ -401,11 +419,11 @@ TabView } // Tiny convenience function to check if a value really changed before trying to set it. - function setMetaDataEntry(entry_name, old_value, new_value) - { - if(old_value != new_value) - { - Cura.ContainerManager.setContainerMetaDataEntry(base.containerId, entry_name, new_value); + function setMetaDataEntry(entry_name, old_value, new_value) { + if (old_value != new_value) { + Cura.ContainerManager.setContainerMetaDataEntry(base.containerId, entry_name, new_value) + // make sure the UI properties are updated as well since we don't re-fetch the entire model here + properties[entry_name] = new_value } } From 3de4940d6952a4a6c3c0934e5d7836996b7bd31f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Tue, 9 Jan 2018 16:19:29 +0100 Subject: [PATCH 150/205] Simplify creating, duplicating materials in preferences, extract logic to python, code-style fixes --- cura/Settings/ContainerManager.py | 16 +++ resources/qml/Preferences/MaterialsPage.qml | 104 ++++++++------------ 2 files changed, 58 insertions(+), 62 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 209e1ec8fd..eefc109cbc 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -816,6 +816,22 @@ class ContainerManager(QObject): ContainerRegistry.getInstance().addContainer(container_to_add) return self._getMaterialContainerIdForActiveMachine(clone_of_original) + ## Create a duplicate of a material or it's original entry + # + # \return \type{str} the id of the newly created container. + @pyqtSlot(str, result = str) + def duplicateOriginalMaterial(self, material_id): + + # check if the given material has a base file (i.e. was shipped by default) + base_file = self.getContainerMetaDataEntry(material_id, "base_file") + + if base_file == "": + # there is no base file, so duplicate by ID + return self.duplicateMaterial(material_id) + else: + # there is a base file, so duplicate the original material + return self.duplicateMaterial(base_file) + ## Create a new material by cloning Generic PLA for the current material diameter and setting the GUID to something unqiue # # \return \type{str} the id of the newly created container. diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 81c1bd711a..228f9c8ea2 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -132,93 +132,73 @@ UM.ManagementPage } buttons: [ - Button - { - text: catalog.i18nc("@action:button", "Activate"); + + // Activate button + Button { + text: catalog.i18nc("@action:button", "Activate") iconName: "list-activate"; enabled: base.currentItem != null && base.currentItem.id != Cura.MachineManager.activeMaterialId && Cura.MachineManager.hasMaterials - onClicked: - { - forceActiveFocus(); + onClicked: { + forceActiveFocus() Cura.MachineManager.setActiveMaterial(base.currentItem.id) currentItem = base.model.getItem(base.objectList.currentIndex) // Refresh the current item. } }, - Button - { + + // Create button + Button { text: catalog.i18nc("@action:button", "Create") iconName: "list-add" - onClicked: - { - forceActiveFocus(); - var material_id = Cura.ContainerManager.createMaterial() - if(material_id == "") - { - return - } - if(Cura.MachineManager.hasMaterials) - { - Cura.MachineManager.setActiveMaterial(material_id) - } - base.objectList.currentIndex = base.getIndexById(material_id); + onClicked: { + forceActiveFocus() + Cura.ContainerManager.createMaterial() } }, - Button - { + + // Duplicate button + Button { text: catalog.i18nc("@action:button", "Duplicate"); iconName: "list-add"; enabled: base.currentItem != null - onClicked: - { - forceActiveFocus(); - var base_file = Cura.ContainerManager.getContainerMetaDataEntry(base.currentItem.id, "base_file") - // We need to copy the base container instead of the specific variant. - var material_id = base_file == "" ? Cura.ContainerManager.duplicateMaterial(base.currentItem.id): Cura.ContainerManager.duplicateMaterial(base_file) - if(material_id == "") - { - return - } - if(Cura.MachineManager.hasMaterials) - { - Cura.MachineManager.setActiveMaterial(material_id) - } - // TODO: this doesn't work because the source is a bit delayed - base.objectList.currentIndex = base.getIndexById(material_id); + onClicked: { + forceActiveFocus() + Cura.ContainerManager.duplicateOriginalMaterial(base.currentItem.id) } }, - Button - { - text: catalog.i18nc("@action:button", "Remove"); - iconName: "list-remove"; + + // Remove button + Button { + text: catalog.i18nc("@action:button", "Remove") + iconName: "list-remove" enabled: base.currentItem != null && !base.currentItem.readOnly && !Cura.ContainerManager.isContainerUsed(base.currentItem.id) - onClicked: - { - forceActiveFocus(); - confirmDialog.open(); + onClicked: { + forceActiveFocus() + confirmDialog.open() } }, - Button - { - text: catalog.i18nc("@action:button", "Import"); - iconName: "document-import"; - onClicked: - { - forceActiveFocus(); - importDialog.open(); + + // Import button + Button { + text: catalog.i18nc("@action:button", "Import") + iconName: "document-import" + onClicked: { + forceActiveFocus() + importDialog.open() } - visible: true; + visible: true }, - Button - { + + // Export button + Button { text: catalog.i18nc("@action:button", "Export") iconName: "document-export" - onClicked: - { - forceActiveFocus(); - exportDialog.open(); + onClicked: { + forceActiveFocus() + exportDialog.open() } enabled: currentItem != null } + ] Item { From 93599de64239644ea8a86434d5f2bbafa2b47873 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 17:02:39 +0100 Subject: [PATCH 151/205] Update current index in material dialog CURA-4774 There is a delay so we update the current index when the model gets changed. --- resources/qml/Preferences/MaterialsPage.qml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 228f9c8ea2..6b041b895a 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -153,6 +153,15 @@ UM.ManagementPage forceActiveFocus() Cura.ContainerManager.createMaterial() } + + Connections + { + target: base.objectList.model + onItemsChanged: + { + base.objectList.currentIndex = base.getIndexById(Cura.MachineManager.activeMaterialId); + } + } }, // Duplicate button From 30870c5ef2187557c53d133e6953d944ae64f098 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 9 Jan 2018 17:34:53 +0100 Subject: [PATCH 152/205] Refactor skip reset setting CURA-4760 --- .../PerObjectSettingVisibilityHandler.py | 10 ++++++---- .../PerObjectSettingsTool/PerObjectSettingsPanel.qml | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index c7e4deaaa7..3e1df1c7b8 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -22,7 +22,9 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand self._selected_object_id = None self._node = None self._stack = None - self._skip_setting = None + + # this is a set of settings that will be skipped if the user chooses to reset. + self._skip_reset_setting_set = set() def setSelectedObjectId(self, id): if id != self._selected_object_id: @@ -39,8 +41,8 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand return self._selected_object_id @pyqtSlot(str) - def setSkipSetting(self, setting_name): - self._skip_setting = setting_name + def addSkipResetSetting(self, setting_name): + self._skip_reset_setting_set.add(setting_name) def setVisible(self, visible): if not self._node: @@ -57,7 +59,7 @@ class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHand # Remove all instances that are not in visibility list for instance in all_instances: # exceptionally skip setting - if self._skip_setting is not None and self._skip_setting == instance.definition.key: + if instance.definition.key in self._skip_reset_setting_set: continue if instance.definition.key not in visible: settings.removeInstance(instance.definition.key) diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index 2b7b6cd541..10760b9039 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -324,8 +324,8 @@ Item { // force updating the model to sync it with addedSettingsModel if(visible) { - // Set skip setting, it will prevent from restting selected mesh_type - contents.model.visibilityHandler.setSkipSetting(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) + // Set skip setting, it will prevent from resetting selected mesh_type + contents.model.visibilityHandler.addSkipResetSetting(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type) listview.model.forceUpdate() } } From 2ce73a18397b0d0440a85a10d017c5568953d1b3 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 10 Jan 2018 00:07:43 +0100 Subject: [PATCH 153/205] Fix updating icon in the top bar This makes sure events such as onAcceptsCommandsChanges get connected if an outputdevice has been added before the monitorstage is initialized. --- plugins/MonitorStage/MonitorStage.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/MonitorStage/MonitorStage.py b/plugins/MonitorStage/MonitorStage.py index b5a38dad70..1a999ca896 100644 --- a/plugins/MonitorStage/MonitorStage.py +++ b/plugins/MonitorStage/MonitorStage.py @@ -77,6 +77,7 @@ class MonitorStage(CuraStage): def _onEngineCreated(self): # We can only connect now, as we need to be sure that everything is loaded (plugins get created quite early) Application.getInstance().getMachineManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) + self._onOutputDevicesChanged() self._updateMainOverlay() self._updateSidebar() self._updateIconSource() From 3f341a34c62cd2125afa1385e40b6af25b5dad7a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Jan 2018 08:15:00 +0100 Subject: [PATCH 154/205] Fix gcode job sending issue in gcode_dict refactoring --- .../NetworkClusterPrinterOutputDevice.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py index 6665380f45..9289981d64 100644 --- a/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py +++ b/plugins/UM3NetworkPrinting/NetworkClusterPrinterOutputDevice.py @@ -80,6 +80,8 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte self._print_view = None self._request_job = [] + self._job_list = [] + self._monitor_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterMonitorItem.qml") self._control_view_qml_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ClusterControlItem.qml") @@ -281,14 +283,11 @@ class NetworkClusterPrinterOutputDevice(NetworkPrinterOutputDevice.NetworkPrinte def sendPrintJob(self): nodes, file_name, filter_by_machine, file_handler, kwargs = self._request_job output_build_plate_number = self._job_list.pop(0) - gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict")[output_build_plate_number] - if not gcode_dict: # Empty build plate + gcode_list = getattr(Application.getInstance().getController().getScene(), "gcode_dict")[output_build_plate_number] + if not gcode_list: # Empty build plate Logger.log("d", "Skipping empty job (build plate number %d).", output_build_plate_number) return self.sendPrintJob() - active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate - gcode_list = gcode_dict[active_build_plate_id] - self._send_gcode_start = time.time() Logger.log("d", "Sending print job [%s] to host, build plate [%s]..." % (file_name, output_build_plate_number)) From 91cccedf750ad2307e849af596fd778668610b54 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Jan 2018 08:54:13 +0100 Subject: [PATCH 155/205] Fix upgrading quality changes for single extrusion machines --- cura/Settings/CuraContainerRegistry.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a7119c55b7..6db33931bd 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -576,7 +576,19 @@ class CuraContainerRegistry(ContainerRegistry): # Also need to fix the other qualities that are suitable for this machine. Those quality changes may still have # per-extruder settings in the container for the machine instead of the extruder. - quality_changes_machine_definition_id = machine.qualityChanges.getDefinition().getId() + if machine.qualityChanges.getId() not in ("empty", "empty_quality_changes"): + quality_changes_machine_definition_id = machine.qualityChanges.getDefinition().getId() + else: + whole_machine_definition = machine.definition + machine_entry = machine.definition.getMetaDataEntry("machine") + if machine_entry is not None: + container_registry = ContainerRegistry.getInstance() + whole_machine_definition = container_registry.findDefinitionContainers(id = machine_entry)[0] + + quality_changes_machine_definition_id = "fdmprinter" + if whole_machine_definition.getMetaDataEntry("has_machine_quality"): + quality_changes_machine_definition_id = machine.definition.getMetaDataEntry("quality_definition", + whole_machine_definition.getId()) qcs = self.findInstanceContainers(type = "quality_changes", definition = quality_changes_machine_definition_id) qc_groups = {} # map of qc names -> qc containers for qc in qcs: From 4801ace5464e2accf1db6a4d62323d3a158e271a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 10 Jan 2018 08:58:51 +0100 Subject: [PATCH 156/205] Fix monoprice select mini v2 definition CURA-4655 --- resources/definitions/monoprice_select_mini_v2.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/monoprice_select_mini_v2.def.json b/resources/definitions/monoprice_select_mini_v2.def.json index a935cb5a73..87014c136b 100644 --- a/resources/definitions/monoprice_select_mini_v2.def.json +++ b/resources/definitions/monoprice_select_mini_v2.def.json @@ -20,6 +20,6 @@ "retraction_combing": { "default_value": "noskin" }, "retraction_amount" : { "default_value": 2.5}, "retraction_speed" : { "default_value": 40}, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5" } } } From b295d915f82667646d6c6c954013899cd029c28d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 11:08:32 +0100 Subject: [PATCH 157/205] Fix line support_infill_rate / support_line_distance for support meshes without generating any support. CURA-4777 --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 6eef6b1e9b..22b7992d64 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3633,7 +3633,7 @@ "minimum_value": "0", "maximum_value_warning": "100", "default_value": 15, - "value": "15 if support_enable else 0", + "value": "15 if support_enable else 0 if support_tree_enable else 15", "enabled": "support_enable or support_tree_enable", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, From fd86cc84e2377134a317f7f9221b1f8e86a1ff1f Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Wed, 10 Jan 2018 11:17:26 +0100 Subject: [PATCH 158/205] check if parent exists before using width and height properties from it --- plugins/MonitorStage/MonitorMainView.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/MonitorStage/MonitorMainView.qml b/plugins/MonitorStage/MonitorMainView.qml index 15b05bed0a..c48f6d0aab 100644 --- a/plugins/MonitorStage/MonitorMainView.qml +++ b/plugins/MonitorStage/MonitorMainView.qml @@ -8,8 +8,9 @@ import Cura 1.0 as Cura Item { - width: parent.width - height: parent.height + // parent could be undefined as this component is not visible at all times + width: parent ? parent.width : 0 + height: parent ? parent.height : 0 // We show a nice overlay on the 3D viewer when the current output device has no monitor view Rectangle From 95361bbeb200bbbffa4296fb53f4a635f98ae89b Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Wed, 10 Jan 2018 11:19:19 +0100 Subject: [PATCH 159/205] Refactoring: profile from Gcode CURA-4776 --- cura/Settings/CuraContainerRegistry.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a7119c55b7..b882902ed7 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -214,19 +214,7 @@ class CuraContainerRegistry(ContainerRegistry): name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) - # if the loaded profile comes from g-code then the instance cointaners should be - # defined differently - file_extension = os.path.splitext(file_name)[1][1:] - if file_extension == "gcode": - for item in profile_or_list: - item.metaData["name"] = new_name - if item.getMetaDataEntry("extruder") is None: - temp_defintion = item.getMetaDataEntry("definition") - item.metaData["id"] = temp_defintion + "_" + new_name - elif item.getMetaDataEntry("extruder") is not None: - temp_extruder = item.getMetaDataEntry("extruder") - item.metaData["id"] = temp_extruder + "_" + new_name # Ensure it is always a list of profiles if type(profile_or_list) is not list: @@ -250,6 +238,16 @@ class CuraContainerRegistry(ContainerRegistry): else: #More extruders in the imported file than in the machine. continue #Delete the additional profiles. + # if the loaded profile comes from g-code then the instance containers should be + # defined differently + if extension == "gcode": + if profile.getMetaDataEntry("extruder") is None: + temp_defintion = profile.getMetaDataEntry("definition") + profile.metaData["id"] = (temp_defintion + "_" + new_name).lower() + elif profile.getMetaDataEntry("extruder") is not None: # be sure that extruder data exist + temp_extruder = profile.getMetaDataEntry("extruder") + profile.metaData["id"] = (temp_extruder + "_" + new_name).lower() + result = self._configureProfile(profile, profile_id, new_name) if result is not None: return {"status": "error", "message": catalog.i18nc( From 80aaad83e115ef4308bc633de08fc778effec214 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:12:21 +0100 Subject: [PATCH 160/205] CURA-4525 fix manual slice slicing more than one build plate at a time --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index c612e889a4..fa5f4dde4d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -238,6 +238,8 @@ class CuraEngineBackend(QObject, Backend): self._slicing = True self.slicingStarted.emit() + self.determineAutoSlicing() # Switch timer on or off if appropriate + slice_message = self._socket.createMessage("cura.proto.Slice") self._start_slice_job = StartSliceJob.StartSliceJob(slice_message) self._start_slice_job_build_plate = build_plate_to_be_sliced @@ -584,6 +586,7 @@ class CuraEngineBackend(QObject, Backend): # Somehow this results in an Arcus Error # self.slice() # Testing call slice again, allow backend to restart by using the timer + self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode self._invokeSlice() ## Called when a g-code message is received from the engine. From 686ac2292d85dc38c826de0c230f2cb784d94e73 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:13:18 +0100 Subject: [PATCH 161/205] CURA-4525 CURA-4772 fix gcode not overlapping thoughout build plates --- plugins/CuraEngineBackend/ProcessSlicedLayersJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py index be9c3f73f0..c1fc597d80 100644 --- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py +++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py @@ -4,7 +4,6 @@ import gc from UM.Job import Job -from UM.Scene.SceneNode import SceneNode from UM.Application import Application from UM.Mesh.MeshData import MeshData from UM.Preferences import Preferences @@ -17,6 +16,7 @@ from UM.Logger import Logger from UM.Math.Vector import Vector from cura.Scene.BuildPlateDecorator import BuildPlateDecorator +from cura.Scene.CuraSceneNode import CuraSceneNode from cura.Settings.ExtruderManager import ExtruderManager from cura import LayerDataBuilder from cura import LayerDataDecorator @@ -81,7 +81,7 @@ class ProcessSlicedLayersJob(Job): Application.getInstance().getController().activeViewChanged.connect(self._onActiveViewChanged) - new_node = SceneNode() + new_node = CuraSceneNode() new_node.addDecorator(BuildPlateDecorator(self._build_plate_number)) # Force garbage collection. From dab0ebd2084649c2b4348caed7c70b6a7013848e Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:25:09 +0100 Subject: [PATCH 162/205] CURA-4525 fix saving empty gcode giving error --- plugins/GCodeWriter/GCodeWriter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index f0e5c88f37..95c48c4d9e 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -64,8 +64,8 @@ class GCodeWriter(MeshWriter): gcode_dict = getattr(scene, "gcode_dict") if not gcode_dict: return False - gcode_list = gcode_dict.get(active_build_plate) - if gcode_list: + gcode_list = gcode_dict.get(active_build_plate, None) + if gcode_list is not None: for gcode in gcode_list: stream.write(gcode) # Serialise the current container stack and put it at the end of the file. From 0fdb470ec7eb3fa1766326ceb4ef1eb8fd3b298a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 14:39:26 +0100 Subject: [PATCH 163/205] CURA-4525 only try to slice next build plate if there are actually build plates to slice --- plugins/CuraEngineBackend/CuraEngineBackend.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index fa5f4dde4d..41522b34f2 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -585,9 +585,10 @@ class CuraEngineBackend(QObject, Backend): Logger.log("d", "See if there is more to slice...") # Somehow this results in an Arcus Error # self.slice() - # Testing call slice again, allow backend to restart by using the timer - self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode - self._invokeSlice() + # Call slice again using the timer, allowing the backend to restart + if self._build_plates_to_be_sliced: + self.enableTimer() # manually enable timer to be able to invoke slice, also when in manual slice mode + self._invokeSlice() ## Called when a g-code message is received from the engine. # From 6262003069ebfd2eb56889eaaf1596301e0c8250 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 16:01:26 +0100 Subject: [PATCH 164/205] CURA-4525 reset the print information for build plates that are marked for slicing --- cura/PrintInformation.py | 3 ++- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 60d3c11a49..838628e37c 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -11,6 +11,7 @@ from UM.Preferences import Preferences from UM.Settings.ContainerRegistry import ContainerRegistry from cura.Settings.ExtruderManager import ExtruderManager +from typing import Dict import math import os.path @@ -177,7 +178,7 @@ class PrintInformation(QObject): self._material_amounts = material_amounts self._calculateInformation(build_plate_number) - def _updateTotalPrintTimePerFeature(self, build_plate_number, print_time): + def _updateTotalPrintTimePerFeature(self, build_plate_number, print_time: Dict[str, int]): total_estimated_time = 0 if build_plate_number not in self._print_time_message_values: diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 41522b34f2..61950b4677 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -444,6 +444,7 @@ class CuraEngineBackend(QObject, Backend): return build_plate_changed.add(source_build_plate_number) + self.printDurationMessage.emit(source_build_plate_number, {}, []) build_plate_changed.discard(None) build_plate_changed.discard(-1) # object not on build plate From d91a2e1ca36ba2ef0311cfd31ed7c75058c8d1be Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 10 Jan 2018 16:04:56 +0100 Subject: [PATCH 165/205] CURA-4525 move reset print information to a better place to prevent it sending info of non existent build plates --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 61950b4677..e8c830b901 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -444,7 +444,6 @@ class CuraEngineBackend(QObject, Backend): return build_plate_changed.add(source_build_plate_number) - self.printDurationMessage.emit(source_build_plate_number, {}, []) build_plate_changed.discard(None) build_plate_changed.discard(-1) # object not on build plate @@ -461,6 +460,7 @@ class CuraEngineBackend(QObject, Backend): for build_plate_number in build_plate_changed: if build_plate_number not in self._build_plates_to_be_sliced: self._build_plates_to_be_sliced.append(build_plate_number) + self.printDurationMessage.emit(source_build_plate_number, {}, []) self.processingProgress.emit(0.0) self.backendStateChange.emit(BackendState.NotStarted) # if not self._use_timer: @@ -523,7 +523,7 @@ class CuraEngineBackend(QObject, Backend): def _onStackErrorCheckFinished(self): self._is_error_check_scheduled = False - if not self._slicing and self._build_plates_to_be_sliced: #self._need_slicing: + if not self._slicing and self._build_plates_to_be_sliced: self.needsSlicing() self._onChanged() From 665c0a81f40959e39530b895b892937b97023bd4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Wed, 10 Jan 2018 16:29:36 +0100 Subject: [PATCH 166/205] Removed wrong comment --- plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 126dbbbde3..786b97d034 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -115,7 +115,6 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): self._not_authenticated_message.hide() self._requestAuthentication() - pass # Cura Connect doesn't do any authorization def connect(self): super().connect() From 78b42afbcb0eb8673544ca7b75f42855178f875d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 10 Jan 2018 16:40:58 +0100 Subject: [PATCH 167/205] CURA-4776 Add unique id to the profiles so user can import the same profile several times with different names.It also fixes the issue for importing profiles from GCode. --- cura/Settings/CuraContainerRegistry.py | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index a0e2abd0b6..9202e57285 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -214,8 +214,6 @@ class CuraContainerRegistry(ContainerRegistry): name_seed = os.path.splitext(os.path.basename(file_name))[0] new_name = self.uniqueName(name_seed) - - # Ensure it is always a list of profiles if type(profile_or_list) is not list: profile_or_list = [profile_or_list] @@ -238,16 +236,6 @@ class CuraContainerRegistry(ContainerRegistry): else: #More extruders in the imported file than in the machine. continue #Delete the additional profiles. - # if the loaded profile comes from g-code then the instance containers should be - # defined differently - if extension == "gcode": - if profile.getMetaDataEntry("extruder") is None: - temp_defintion = profile.getMetaDataEntry("definition") - profile.metaData["id"] = (temp_defintion + "_" + new_name).lower() - elif profile.getMetaDataEntry("extruder") is not None: # be sure that extruder data exist - temp_extruder = profile.getMetaDataEntry("extruder") - profile.metaData["id"] = (temp_extruder + "_" + new_name).lower() - result = self._configureProfile(profile, profile_id, new_name) if result is not None: return {"status": "error", "message": catalog.i18nc( @@ -280,6 +268,10 @@ class CuraContainerRegistry(ContainerRegistry): profile._id = new_id profile.setName(new_name) + # Set the unique Id to the profile, so it's generating a new one even if the user imports the same profile + # It also solves an issue with importing profiles from G-Codes + profile.setMetaDataEntry("id", new_id) + if "type" in profile.getMetaData(): profile.setMetaDataEntry("type", "quality_changes") else: From 702d7dd3a838fa0bfe0f7aa152d376bc1cb46054 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 11 Jan 2018 08:23:17 +0100 Subject: [PATCH 168/205] Fix model importing with multi build plate CURA-4782 --- cura/CuraApplication.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index dfb78cd3b2..30fd461868 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1479,7 +1479,14 @@ class CuraApplication(QtApplication): # Step is for skipping tests to make it a lot faster. it also makes the outcome somewhat rougher node, _ = arranger.findNodePlacement(node, offset_shape_arr, hull_shape_arr, step = 10) - node.addDecorator(BuildPlateDecorator(target_build_plate)) + # This node is deepcopied from some other node which already has a BuildPlateDecorator, but the deepcopy + # of BuildPlateDecorator produces one that's assoicated with build plate -1. So, here we need to check if + # the BuildPlateDecorator exists or not and always set the correct build plate number. + build_plate_decorator = node.getDecorator(BuildPlateDecorator) + if build_plate_decorator is None: + build_plate_decorator = BuildPlateDecorator(target_build_plate) + node.addDecorator(build_plate_decorator) + build_plate_decorator.setBuildPlateNumber(target_build_plate) op = AddSceneNodeOperation(node, scene.getRoot()) op.push() From b9a99d46922ff52214b7012ed8dea50a89d8524b Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 11 Jan 2018 09:33:07 +0100 Subject: [PATCH 169/205] CURA-4525 fix placement on load to only avoid objects on current build plate --- cura/CuraActions.py | 2 +- cura/CuraApplication.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 2474e218e8..f5aace805b 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -73,7 +73,7 @@ class CuraActions(QObject): # \param count The number of times to multiply the selection. @pyqtSlot(int) def multiplySelection(self, count: int) -> None: - job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, 8) + job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, min_offset = 8) job.start() ## Delete all selected objects. diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index dfb78cd3b2..a2ce5c322c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1421,16 +1421,20 @@ class CuraApplication(QtApplication): filename = job.getFileName() self._currently_loading_files.remove(filename) - root = self.getController().getScene().getRoot() - arranger = Arrange.create(scene_root = root) - min_offset = 8 - self.fileLoaded.emit(filename) arrange_objects_on_load = ( not Preferences.getInstance().getValue("cura/use_multi_build_plate") or not Preferences.getInstance().getValue("cura/not_arrange_objects_on_load")) target_build_plate = self.getBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 + root = self.getController().getScene().getRoot() + fixed_nodes = [] + for node_ in DepthFirstIterator(root): + if node_.callDecoration("isSliceable") and node_.callDecoration("getBuildPlateNumber") == target_build_plate: + fixed_nodes.append(node_) + arranger = Arrange.create(fixed_nodes = fixed_nodes) + min_offset = 8 + for original_node in nodes: # Create a CuraSceneNode just if the original node is not that type From 3f4a2c565cd76663089dc6422d2124847c210c28 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Thu, 11 Jan 2018 13:32:05 +0100 Subject: [PATCH 170/205] Fix: after extruders switch do not trigger slicing, provided a new signal which is triggered after adding extruder and it subscribers for property changes --- cura/Settings/ExtruderManager.py | 4 ++++ plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 351843ae14..b5f9a35914 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -49,6 +49,9 @@ class ExtruderManager(QObject): ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() + ## The signal notifies subscribers if extruders are added + extrudersAdded = pyqtSignal() + ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -406,6 +409,7 @@ class ExtruderManager(QObject): if extruders_changed: self.extrudersChanged.emit(global_stack_id) + self.extrudersAdded.emit() self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e8c830b901..e7db4a12dd 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -88,7 +88,7 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - Application.getInstance().getExtruderManager().activeExtruderChanged.connect(self._onGlobalStackChanged) + Application.getInstance().getExtruderManager().extrudersAdded.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) From 87105e6d063f198eba466dd522bf146c12bafc5d Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 11 Jan 2018 14:30:59 +0100 Subject: [PATCH 171/205] CURA-4525 fix printing dimensions --- cura/CuraApplication.py | 10 ++++++++-- cura/Scene/CuraSceneController.py | 4 ++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7cc8afae1e..3dd4c34815 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -266,6 +266,7 @@ class CuraApplication(QtApplication): self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) self.getController().contextMenuRequested.connect(self._onContextMenuRequested) + self.getCuraSceneController().activeBuildPlateChanged.connect(self.updatePlatformActivity) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") @@ -890,12 +891,17 @@ class CuraApplication(QtApplication): def getSceneBoundingBoxString(self): return self._i18n_catalog.i18nc("@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm.", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_bounding_box.width.item(), 'depth': self._scene_bounding_box.depth.item(), 'height' : self._scene_bounding_box.height.item()} + ## Update scene bounding box for current build plate def updatePlatformActivity(self, node = None): count = 0 scene_bounding_box = None is_block_slicing_node = False + active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if ( + not issubclass(type(node), CuraSceneNode) or + (not node.getMeshData() and not node.callDecoration("getLayerData")) or + (node.callDecoration("getBuildPlateNumber") != active_build_plate)): continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -915,7 +921,7 @@ class CuraApplication(QtApplication): if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null - if repr(self._scene_bounding_box) != repr(scene_bounding_box) and scene_bounding_box.isValid(): + if repr(self._scene_bounding_box) != repr(scene_bounding_box): self._scene_bounding_box = scene_bounding_box self.sceneBoundingBoxChanged.emit() diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index c3e27ca3dd..97cffcdd7d 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -10,9 +10,12 @@ from UM.Application import Application from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection +from UM.Signal import Signal class CuraSceneController(QObject): + activeBuildPlateChanged = Signal() + def __init__(self, objects_model: ObjectsModel, build_plate_model: BuildPlateModel): super().__init__() @@ -101,6 +104,7 @@ class CuraSceneController(QObject): self._build_plate_model.setActiveBuildPlate(nr) self._objects_model.setActiveBuildPlate(nr) + self.activeBuildPlateChanged.emit() @staticmethod def createCuraSceneController(): From 225a205d97ddc4de0534b112d7f92f41cd5994c1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 09:19:03 +0100 Subject: [PATCH 172/205] Fixes for material duplication and editing, small refactoring - CURA-4787 --- resources/qml/Preferences/MaterialView.qml | 52 ++++++++++----------- resources/qml/Preferences/MaterialsPage.qml | 9 ---- 2 files changed, 25 insertions(+), 36 deletions(-) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index c3f36f5125..b2307fe4f6 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -72,7 +72,7 @@ TabView width: scrollView.columnWidth; text: properties.name; readOnly: !base.editingEnabled; - onEditingFinished: base.setName(properties.name, text) + onEditingFinished: base.updateMaterialDisplayName(properties.name, text) } Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Brand") } @@ -82,11 +82,7 @@ TabView width: scrollView.columnWidth; text: properties.supplier; readOnly: !base.editingEnabled; - onEditingFinished: - { - base.setMetaDataEntry("brand", properties.supplier, text); - pane.objectList.currentIndex = pane.getIndexById(base.containerId); - } + onEditingFinished: base.updateMaterialSupplier(properties.supplier, text) } Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Material Type") } @@ -95,15 +91,10 @@ TabView width: scrollView.columnWidth; text: properties.material_type; readOnly: !base.editingEnabled; - onEditingFinished: - { - base.setMetaDataEntry("material", properties.material_type, text); - pane.objectList.currentIndex = pane.getIndexById(base.containerId) - } + onEditingFinished: base.updateMaterialType(properties.material_type, text) } Label { width: scrollView.columnWidth; height: parent.rowHeight; verticalAlignment: Qt.AlignVCenter; text: catalog.i18nc("@label", "Color") } - Row { width: scrollView.columnWidth height: parent.rowHeight @@ -128,13 +119,6 @@ TabView } } - // make sure the color stays connected after changing the color - Binding { - target: colorSelector - property: "color" - value: properties.color_code - } - // pretty color name text field ReadOnlyTextField { id: colorLabel; @@ -453,14 +437,28 @@ TabView return 0; } - function setName(old_value, new_value) - { - if(old_value != new_value) - { - Cura.ContainerManager.setContainerName(base.containerId, new_value); - // update material name label. not so pretty, but it works - materialProperties.name = new_value; - pane.objectList.currentIndex = pane.getIndexById(base.containerId) + // update the display name of the material + function updateMaterialDisplayName (old_name, new_name) { + + // don't change when new name is the same + if (old_name == new_name) { + return } + + // update the values + Cura.ContainerManager.setContainerName(base.containerId, new_name) + materialProperties.name = new_name + } + + // update the type of the material + function updateMaterialType (old_type, new_type) { + base.setMetaDataEntry("material", old_type, new_type) + materialProperties.material_type = new_type + } + + // update the supplier of the material + function updateMaterialSupplier (old_supplier, new_supplier) { + base.setMetaDataEntry("brand", old_supplier, new_supplier) + materialProperties.supplier = new_supplier } } diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 6b041b895a..228f9c8ea2 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -153,15 +153,6 @@ UM.ManagementPage forceActiveFocus() Cura.ContainerManager.createMaterial() } - - Connections - { - target: base.objectList.model - onItemsChanged: - { - base.objectList.currentIndex = base.getIndexById(Cura.MachineManager.activeMaterialId); - } - } }, // Duplicate button From 8b3bd71b36ac764dd8750a06108f6ba92fabd47f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 09:57:32 +0100 Subject: [PATCH 173/205] Get extruders list from GlobalStack itself CURA-4784 --- plugins/CuraEngineBackend/CuraEngineBackend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e7db4a12dd..e1035af679 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -722,7 +722,7 @@ class CuraEngineBackend(QObject, Backend): if self._global_container_stack: self._global_container_stack.propertyChanged.disconnect(self._onSettingChanged) self._global_container_stack.containersChanged.disconnect(self._onChanged) - extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + extruders = list(self._global_container_stack.extruders.values()) for extruder in extruders: extruder.propertyChanged.disconnect(self._onSettingChanged) @@ -733,7 +733,7 @@ class CuraEngineBackend(QObject, Backend): if self._global_container_stack: self._global_container_stack.propertyChanged.connect(self._onSettingChanged) # Note: Only starts slicing when the value changed. self._global_container_stack.containersChanged.connect(self._onChanged) - extruders = list(ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId())) + extruders = list(self._global_container_stack.extruders.values()) for extruder in extruders: extruder.propertyChanged.connect(self._onSettingChanged) extruder.containersChanged.connect(self._onChanged) From 225b03e98ee1d92467176a1fd1ef3605ce0999c7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 09:58:06 +0100 Subject: [PATCH 174/205] No need for the extra extrudersAdded signal CURA-4784 --- cura/Settings/ExtruderManager.py | 4 ---- plugins/CuraEngineBackend/CuraEngineBackend.py | 1 - 2 files changed, 5 deletions(-) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index b5f9a35914..351843ae14 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -49,9 +49,6 @@ class ExtruderManager(QObject): ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() - ## The signal notifies subscribers if extruders are added - extrudersAdded = pyqtSignal() - ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -409,7 +406,6 @@ class ExtruderManager(QObject): if extruders_changed: self.extrudersChanged.emit(global_stack_id) - self.extrudersAdded.emit() self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index e1035af679..3272fb019d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -88,7 +88,6 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - Application.getInstance().getExtruderManager().extrudersAdded.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) From 7d6e41f6c8d6987f0cbfe731b1635a958e326caa Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:36:21 +0100 Subject: [PATCH 175/205] Disable activate configuration button for now until sync functionality has been decided --- .../UM3NetworkPrinting/UM3InfoComponents.qml | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml index 939c6bcb39..18b481a6ed 100644 --- a/plugins/UM3NetworkPrinting/UM3InfoComponents.qml +++ b/plugins/UM3NetworkPrinting/UM3InfoComponents.qml @@ -115,24 +115,8 @@ Item { tooltip: catalog.i18nc("@info:tooltip", "Load the configuration of the printer into Cura") text: catalog.i18nc("@action:button", "Activate Configuration") - visible: printerConnected && !isClusterPrinter() + visible: false // printerConnected && !isClusterPrinter() onClicked: manager.loadConfigurationFromPrinter() - - function isClusterPrinter() { - return false - //TODO: Hardcoded this for the moment now. These info components might also need to move. - /*if(Cura.MachineManager.printerOutputDevices.length == 0) - { - return false; - } - var clusterSize = Cura.MachineManager.printerOutputDevices[0].clusterSize; - // This is not a cluster printer or the cluster it is just one printer - if(clusterSize == undefined || clusterSize == 1) - { - return false; - } - return true;*/ - } } } From b086e9cb5346b4a0f5668f85d5090251da4310e1 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:52:14 +0100 Subject: [PATCH 176/205] Fixes for UM3 network printing for multi build plate --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 4283042bf2..e36b9abef7 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -80,8 +80,11 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) - if not self._gcode: + gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict", []) + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_list = gcode_dict[active_build_plate_id] + + if not gcode_list: # Unable to find g-code. Nothing to send return From 06f35096ad34a2ebe095655b6756688c81687c80 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:54:48 +0100 Subject: [PATCH 177/205] Fix setting gcode list on output device --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index e36b9abef7..45c152ee2f 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -88,6 +88,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): # Unable to find g-code. Nothing to send return + self._gcode = gcode_list + if len(self._printers) > 1: self._spawnPrinterSelectionDialog() else: From 1986677276b5f88e6c72f8fe9196641b696b943c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 12 Jan 2018 10:58:16 +0100 Subject: [PATCH 178/205] re-addded connection text CL-541 --- cura/PrinterOutputDevice.py | 15 ++++++++++++++- .../UM3NetworkPrinting/ClusterUM3OutputDevice.py | 2 ++ .../UM3NetworkPrinting/LegacyUM3OutputDevice.py | 12 +++++++++--- plugins/USBPrinting/USBPrinterOutputDevice.py | 2 ++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 2aa6fb382e..0141e74ba4 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -41,6 +41,9 @@ class PrinterOutputDevice(QObject, OutputDevice): # # Signal to indicate that the hotend of the active printer on the remote changed. hotendIdChanged = pyqtSignal() + # Signal to indicate that the info text about the connection has changed. + connectionTextChanged = pyqtSignal() + def __init__(self, device_id, parent = None): super().__init__(device_id = device_id, parent = parent) @@ -65,11 +68,21 @@ class PrinterOutputDevice(QObject, OutputDevice): self._connection_state = ConnectionState.closed self._address = "" + self._connection_text = "" - @pyqtProperty(str, constant = True) + @pyqtProperty(str, notify = connectionTextChanged) def address(self): return self._address + def setConnectionText(self, connection_text): + if self._connection_text != connection_text: + self._connection_text = connection_text + self.connectionTextChanged.emit() + + @pyqtProperty(str, constant=True) + def connectionText(self): + return self._connection_text + def materialHotendChangedMessage(self, callback): Logger.log("w", "materialHotendChangedMessage needs to be implemented, returning 'Yes'") callback(QMessageBox.Yes) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 45c152ee2f..b13817d763 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -69,6 +69,8 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network")) self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network")) + self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network")) + self._printer_uuid_to_unique_name_mapping = {} self._finished_jobs = [] diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 786b97d034..6b3675064d 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -78,10 +78,16 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): def _onAuthenticationStateChanged(self): # We only accept commands if we are authenticated. + self._setAcceptsCommands(self._authentication_state == AuthState.Authenticated) + if self._authentication_state == AuthState.Authenticated: - self._setAcceptsCommands(True) - else: - self._setAcceptsCommands(False) + self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network.")) + elif self._authentication_state == AuthState.AuthenticationRequested: + self.setConnectionText(i18n_catalog.i18nc("@info:status", + "Connected over the network. Please approve the access request on the printer.")) + elif self._authentication_state == AuthState.AuthenticationDenied: + self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network. No access to control the printer.")) + def _setupMessages(self): self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status", diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 6c03450a88..d372b54c38 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -80,6 +80,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._firmware_progress = 0 self._firmware_update_state = FirmwareUpdateState.idle + self.setConnectionText(catalog.i18nc("@info:status", "Connected via USB")) + # Queue for commands that need to be send. Used when command is sent when a print is active. self._command_queue = Queue() From d1b5744f57632305c4e01fe492d5de7a9a197748 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Fri, 12 Jan 2018 10:58:36 +0100 Subject: [PATCH 179/205] Also fix gcode output for legacy UM3 networking, switch to monitor AFTER starting transferring G-code to catch potential errors before --- .../UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 +++-- .../UM3NetworkPrinting/LegacyUM3OutputDevice.py | 14 ++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 45c152ee2f..7bdf6090de 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -76,8 +76,6 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): self._cluster_size = int(properties.get(b"cluster_size", 0)) def requestWrite(self, nodes, file_name=None, filter_by_machine=False, file_handler=None, **kwargs): - # Notify the UI that a switch to the print monitor should happen - Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict", []) @@ -95,6 +93,9 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): else: self.sendPrintJob() + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().getController().setActiveStage("MonitorStage") + def _spawnPrinterSelectionDialog(self): if self._printer_selection_dialog is None: path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "PrintWindow.qml") diff --git a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py index 786b97d034..a63adadd54 100644 --- a/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/LegacyUM3OutputDevice.py @@ -175,15 +175,18 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # Not authenticated, so unable to send job. return - # Notify the UI that a switch to the print monitor should happen - Application.getInstance().getController().setActiveStage("MonitorStage") self.writeStarted.emit(self) - self._gcode = getattr(Application.getInstance().getController().getScene(), "gcode_list", []) - if not self._gcode: + gcode_dict = getattr(Application.getInstance().getController().getScene(), "gcode_dict", []) + active_build_plate_id = Application.getInstance().getBuildPlateModel().activeBuildPlate + gcode_list = gcode_dict[active_build_plate_id] + + if not gcode_list: # Unable to find g-code. Nothing to send return + self._gcode = gcode_list + errors = self._checkForErrors() if errors: text = i18n_catalog.i18nc("@label", "Unable to start a new print job.") @@ -229,6 +232,9 @@ class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice): # No warnings or errors, so we're good to go. self._startPrint() + # Notify the UI that a switch to the print monitor should happen + Application.getInstance().getController().setActiveStage("MonitorStage") + def _startPrint(self): Logger.log("i", "Sending print job to printer.") if self._sending_gcode: From c2935759e8ee5cf95f9d85790d8f93172d449300 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 12 Jan 2018 11:04:10 +0100 Subject: [PATCH 180/205] Fixed broken printjob state in machines page CL-541 --- resources/qml/Preferences/MachinesPage.qml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index a8e25155e1..889dfa8d5b 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -143,7 +143,7 @@ UM.ManagementPage property bool printerConnected: Cura.MachineManager.printerOutputDevices.length != 0 property var connectedPrinter: printerConnected ? Cura.MachineManager.printerOutputDevices[0] : null property bool printerAcceptsCommands: printerConnected && Cura.MachineManager.printerOutputDevices[0].acceptsCommands - + property var printJob: connectedPrinter != null ? connectedPrinter.activePrintJob: null Label { text: catalog.i18nc("@label", "Printer type:") @@ -178,7 +178,12 @@ UM.ManagementPage return ""; } - switch(Cura.MachineManager.printerOutputDevices[0].jobState) + if (machineInfo.printJob == null) + { + return catalog.i18nc("@label:MonitorStatus", "Waiting for a printjob"); + } + + switch(machineInfo.printJob.state) { case "printing": return catalog.i18nc("@label:MonitorStatus", "Printing..."); @@ -194,10 +199,9 @@ UM.ManagementPage return catalog.i18nc("@label:MonitorStatus", "In maintenance. Please check the printer"); case "abort": // note sure if this jobState actually occurs in the wild return catalog.i18nc("@label:MonitorStatus", "Aborting print..."); - case "ready": // ready to print or getting ready - case "": // ready to print or getting ready - return catalog.i18nc("@label:MonitorStatus", "Waiting for a printjob"); + } + return "" } visible: base.currentItem && base.currentItem.id == Cura.MachineManager.activeMachineId && machineInfo.printerAcceptsCommands wrapMode: Text.WordWrap From 51316e1dc1db3d58e3f7c2139f3b0b28b754c0b1 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 11:13:58 +0100 Subject: [PATCH 181/205] Fix Prepare/Cancel button visibility conditions for manual slicing CURA-4525 --- resources/qml/SaveButton.qml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index dc24cc4700..bf44a29cf5 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -170,8 +170,8 @@ Item { tooltip: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@info:tooltip","Slice current printjob") : catalog.i18nc("@info:tooltip","Cancel slicing process") // 1 = not started, 2 = Processing - enabled: base.backendState != "undefined" && (base.backendState == 1 || base.backendState == 2) && base.activity == true - visible: base.backendState != "undefined" && !autoSlice && (base.backendState == 1 || base.backendState == 2) && base.activity == true + enabled: base.backendState != "undefined" && ([1, 2].indexOf(base.backendState) != -1) && base.activity + visible: base.backendState != "undefined" && !autoSlice && ([1, 2, 4].indexOf(base.backendState) != -1) && base.activity property bool autoSlice height: UM.Theme.getSize("save_button_save_to_button").height @@ -179,8 +179,8 @@ Item { anchors.right: parent.right anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width - // 1 = not started, 5 = disabled - text: [1, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") + // 1 = not started, 4 = error, 5 = disabled + text: [1, 4, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") onClicked: { sliceOrStopSlicing(); From b54b075cc9b01d50c6850809ab6b400cfa4d03cf Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 12 Jan 2018 16:42:32 +0100 Subject: [PATCH 182/205] Use isinstance() instead or issubclass() CURA-4525 --- cura/CuraApplication.py | 16 ++++++++-------- cura/ObjectsModel.py | 2 +- cura/PlatformPhysics.py | 2 +- cura/Scene/BuildPlateDecorator.py | 2 +- cura/Scene/ConvexHullNode.py | 2 +- cura/Scene/CuraSceneController.py | 2 +- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- plugins/SimulationView/SimulationPass.py | 2 +- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7cc8afae1e..af6f08c175 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -895,7 +895,7 @@ class CuraApplication(QtApplication): scene_bounding_box = None is_block_slicing_node = False for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if not isinstance(node, SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -1012,7 +1012,7 @@ class CuraApplication(QtApplication): Selection.clear() for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1058,7 +1058,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene translations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1086,7 +1086,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Resetting all scene transformations") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1113,7 +1113,7 @@ class CuraApplication(QtApplication): def arrangeObjectsToAllBuildPlates(self): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1134,7 +1134,7 @@ class CuraApplication(QtApplication): nodes = [] active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1158,7 +1158,7 @@ class CuraApplication(QtApplication): # What nodes are on the build plate and are not being moved fixed_nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if not node.getMeshData() and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. @@ -1186,7 +1186,7 @@ class CuraApplication(QtApplication): Logger.log("i", "Reloading all loaded mesh data.") nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode) or not node.getMeshData(): + if not isinstance(node, SceneNode) or not node.getMeshData(): continue nodes.append(node) diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py index 5218127fc5..1516b3ee33 100644 --- a/cura/ObjectsModel.py +++ b/cura/ObjectsModel.py @@ -28,7 +28,7 @@ class ObjectsModel(ListModel): active_build_plate_number = self._build_plate_number group_nr = 1 for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if not issubclass(type(node), SceneNode): + if not isinstance(node, SceneNode): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue diff --git a/cura/PlatformPhysics.py b/cura/PlatformPhysics.py index 0ad3cf1328..69890178e4 100755 --- a/cura/PlatformPhysics.py +++ b/cura/PlatformPhysics.py @@ -61,7 +61,7 @@ class PlatformPhysics: random.shuffle(nodes) for node in nodes: - if node is root or not issubclass(type(node), SceneNode) or node.getBoundingBox() is None: + if node is root or not isinstance(node, SceneNode) or node.getBoundingBox() is None: continue bbox = node.getBoundingBox() diff --git a/cura/Scene/BuildPlateDecorator.py b/cura/Scene/BuildPlateDecorator.py index 44372976f0..c2fd3145dd 100644 --- a/cura/Scene/BuildPlateDecorator.py +++ b/cura/Scene/BuildPlateDecorator.py @@ -13,7 +13,7 @@ class BuildPlateDecorator(SceneNodeDecorator): # Make sure that groups are set correctly # setBuildPlateForSelection in CuraActions makes sure that no single childs are set. self._build_plate_number = nr - if issubclass(type(self._node), CuraSceneNode): + if isinstance(self._node, CuraSceneNode): self._node.transformChanged() # trigger refresh node without introducing a new signal if self._node and self._node.callDecoration("isGroup"): for child in self._node.getChildren(): diff --git a/cura/Scene/ConvexHullNode.py b/cura/Scene/ConvexHullNode.py index 02d8ed833c..c8106b5d15 100644 --- a/cura/Scene/ConvexHullNode.py +++ b/cura/Scene/ConvexHullNode.py @@ -65,7 +65,7 @@ class ConvexHullNode(SceneNode): ConvexHullNode.shader.setUniformValue("u_opacity", 0.6) if self.getParent(): - if self.getMeshData() and issubclass(type(self._node), SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: + if self.getMeshData() and isinstance(self._node, SceneNode) and self._node.callDecoration("getBuildPlateNumber") == Application.getInstance().getBuildPlateModel().activeBuildPlate: renderer.queueNode(self, transparent = True, shader = ConvexHullNode.shader, backface_cull = True, sort = -8) if self._convex_hull_head_mesh: renderer.queueNode(self, shader = ConvexHullNode.shader, transparent = True, mesh = self._convex_hull_head_mesh, backface_cull = True, sort = -8) diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index c3e27ca3dd..652dc78841 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -30,7 +30,7 @@ class CuraSceneController(QObject): source = args[0] else: source = None - if not issubclass(type(source), SceneNode): + if not isinstance(source, SceneNode): return max_build_plate = self._calcMaxBuildPlate() changed = False diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 3272fb019d..97463e07da 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -422,7 +422,7 @@ class CuraEngineBackend(QObject, Backend): # # \param source The scene node that was changed. def _onSceneChanged(self, source): - if not issubclass(type(source), SceneNode): + if not isinstance(source, SceneNode): return build_plate_changed = set() diff --git a/plugins/SimulationView/SimulationPass.py b/plugins/SimulationView/SimulationPass.py index c9c1443bfe..76d7127534 100644 --- a/plugins/SimulationView/SimulationPass.py +++ b/plugins/SimulationView/SimulationPass.py @@ -106,7 +106,7 @@ class SimulationPass(RenderPass): nozzle_node = node nozzle_node.setVisible(False) - elif issubclass(type(node), SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): + elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible(): layer_data = node.callDecoration("getLayerData") if not layer_data: continue From 33da81d0d285d08c422913de94fff9050c722e87 Mon Sep 17 00:00:00 2001 From: ChrisTerBeke Date: Mon, 15 Jan 2018 09:18:57 +0100 Subject: [PATCH 183/205] Check if scene has gcode_dict attribute before trying to get it --- plugins/PostProcessingPlugin/PostProcessingPlugin.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index 657e5c5387..fa519f48be 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -54,7 +54,11 @@ class PostProcessingPlugin(QObject, Extension): ## Execute all post-processing scripts on the gcode. def execute(self, output_device): scene = Application.getInstance().getController().getScene() - gcode_dict = getattr(scene, "gcode_dict") + gcode_dict = None + + if hasattr(scene, "gcode_dict"): + gcode_dict = getattr(scene, "gcode_dict") + if not gcode_dict: return From c5c357d1260e0fe2ec43084e815f19dd294871bc Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 11 Jan 2018 14:30:59 +0100 Subject: [PATCH 184/205] Fixed merge conflicts of cherry picking dimensions fix --- cura/CuraApplication.py | 11 +++++++++-- cura/Scene/CuraSceneController.py | 4 ++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index af6f08c175..02c5c04203 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -266,6 +266,7 @@ class CuraApplication(QtApplication): self.getController().getScene().sceneChanged.connect(self.updatePlatformActivity) self.getController().toolOperationStopped.connect(self._onToolOperationStopped) self.getController().contextMenuRequested.connect(self._onContextMenuRequested) + self.getCuraSceneController().activeBuildPlateChanged.connect(self.updatePlatformActivity) Resources.addType(self.ResourceTypes.QmlFiles, "qml") Resources.addType(self.ResourceTypes.Firmware, "firmware") @@ -890,12 +891,18 @@ class CuraApplication(QtApplication): def getSceneBoundingBoxString(self): return self._i18n_catalog.i18nc("@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm.", "%(width).1f x %(depth).1f x %(height).1f mm") % {'width' : self._scene_bounding_box.width.item(), 'depth': self._scene_bounding_box.depth.item(), 'height' : self._scene_bounding_box.height.item()} + ## Update scene bounding box for current build plate def updatePlatformActivity(self, node = None): count = 0 scene_bounding_box = None is_block_slicing_node = False + active_build_plate = self.getBuildPlateModel().activeBuildPlate for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if not isinstance(node, SceneNode) or (not node.getMeshData() and not node.callDecoration("getLayerData")): + if ( + not issubclass(type(node), CuraSceneNode) or + (not node.getMeshData() and not node.callDecoration("getLayerData")) or + (node.callDecoration("getBuildPlateNumber") != active_build_plate)): + continue if node.callDecoration("isBlockSlicing"): is_block_slicing_node = True @@ -915,7 +922,7 @@ class CuraApplication(QtApplication): if not scene_bounding_box: scene_bounding_box = AxisAlignedBox.Null - if repr(self._scene_bounding_box) != repr(scene_bounding_box) and scene_bounding_box.isValid(): + if repr(self._scene_bounding_box) != repr(scene_bounding_box): self._scene_bounding_box = scene_bounding_box self.sceneBoundingBoxChanged.emit() diff --git a/cura/Scene/CuraSceneController.py b/cura/Scene/CuraSceneController.py index 652dc78841..a93a8769d0 100644 --- a/cura/Scene/CuraSceneController.py +++ b/cura/Scene/CuraSceneController.py @@ -10,9 +10,12 @@ from UM.Application import Application from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.Scene.Selection import Selection +from UM.Signal import Signal class CuraSceneController(QObject): + activeBuildPlateChanged = Signal() + def __init__(self, objects_model: ObjectsModel, build_plate_model: BuildPlateModel): super().__init__() @@ -101,6 +104,7 @@ class CuraSceneController(QObject): self._build_plate_model.setActiveBuildPlate(nr) self._objects_model.setActiveBuildPlate(nr) + self.activeBuildPlateChanged.emit() @staticmethod def createCuraSceneController(): From 87dc3535bbbd2ad3d66b9579fcda6b375920eaec Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 09:59:02 +0100 Subject: [PATCH 185/205] Use isinstance() for SceneNode type check CURA-4525 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 02c5c04203..ab7c093b1d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1041,7 +1041,7 @@ class CuraApplication(QtApplication): nodes = [] for node in DepthFirstIterator(self.getController().getScene().getRoot()): - if type(node) not in {SceneNode, CuraSceneNode}: + if not isinstance(node, SceneNode): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. From 20e7fe911fdebb9fb74df4ae5490e1e423252504 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 10:49:38 +0100 Subject: [PATCH 186/205] Only save models on the active build plate in 3MFWriter CURA-4792 --- plugins/3MFWriter/ThreeMFWriter.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 79b821fe31..c4b7035cf1 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -6,8 +6,9 @@ from UM.Math.Vector import Vector from UM.Logger import Logger from UM.Math.Matrix import Matrix from UM.Application import Application -import UM.Scene.SceneNode -from cura.Scene.CuraSceneNode import CuraSceneNode +from UM.Scene.SceneNode import SceneNode + +from cura.CuraApplication import CuraApplication import Savitar @@ -62,11 +63,15 @@ class ThreeMFWriter(MeshWriter): self._store_archive = store_archive ## Convenience function that converts an Uranium SceneNode object to a SavitarSceneNode - # \returns Uranium Scenen node. + # \returns Uranium Scene node. def _convertUMNodeToSavitarNode(self, um_node, transformation = Matrix()): - if type(um_node) not in [UM.Scene.SceneNode.SceneNode, CuraSceneNode]: + if not isinstance(um_node, SceneNode): return None + active_build_plate_nr = CuraApplication.getInstance().getBuildPlateModel().activeBuildPlate + if um_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: + return + savitar_node = Savitar.SceneNode() node_matrix = um_node.getLocalTransformation() @@ -97,6 +102,9 @@ class ThreeMFWriter(MeshWriter): savitar_node.setSetting(key, str(stack.getProperty(key, "value"))) for child_node in um_node.getChildren(): + # only save the nodes on the active build plate + if child_node.callDecoration("getBuildPlateNumber") != active_build_plate_nr: + continue savitar_child_node = self._convertUMNodeToSavitarNode(child_node) if savitar_child_node is not None: savitar_node.addChild(savitar_child_node) From b60903afc2d4770b367ba79074b40bbc0c304249 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 11:02:52 +0100 Subject: [PATCH 187/205] Fix setting new ID in project loading CURA-4795 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 40d64590f5..5c62c361c3 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -609,7 +609,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): instance_container.setName(self._container_registry.uniqueName(instance_container.getName())) new_changes_container_id = self.getNewId(instance_container.getId()) - instance_container._id = new_changes_container_id + instance_container.setMetaDataEntry("id", new_changes_container_id) # TODO: we don't know the following is correct or not, need to verify # AND REFACTOR!!! From dc596d0e1e041dfa024702463bcf04b3a55278c3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 11:12:07 +0100 Subject: [PATCH 188/205] Only remove selectable nodes in deleteAll() CURA-4795 Otherwise, after loading a project file, all nodes including the machine will be removed and you don't see the machine any more. --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ab7c093b1d..756dae2704 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1045,6 +1045,8 @@ class CuraApplication(QtApplication): continue if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"): continue # Node that doesnt have a mesh and is not a group. + if not node.isSelectable(): + continue # Only remove nodes that are selectable. if node.getParent() and node.getParent().callDecoration("isGroup"): continue # Grouped nodes don't need resetting as their parent (the group) is resetted) nodes.append(node) From b4a06217dfc1a08ad86e56639b6d4b1c1b671dce Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Jan 2018 13:55:35 +0100 Subject: [PATCH 189/205] Replace travel_speed with speed_travel That travel_speed is a very old setting name. I'm guessing that people were copy-pasting that from older versions of Cura. --- resources/definitions/3dator.def.json | 4 ++-- resources/definitions/alya3dp.def.json | 4 ++-- resources/definitions/anycubic_i3_mega.def.json | 4 ++-- resources/definitions/easyarts_ares.def.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index 2ec7119656..19307bfddd 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -47,9 +47,9 @@ "default_value": 30 }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{travel_speed} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{travel_speed}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, + "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{speed_travel} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{speed_travel}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" } } } diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 2fda102249..6bf5d89a95 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -40,10 +40,10 @@ "default_value": "RepRap" }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{travel_speed} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{speed_travel} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" } } } \ No newline at end of file diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index a0bd0efb7c..a373872de8 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -46,10 +46,10 @@ "default_value":"RepRap (Marlin/Sprinter)" }, "machine_start_gcode":{ - "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5" + "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" }, "machine_end_gcode":{ - "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } } diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json index 982496de4c..689ac63625 100644 --- a/resources/definitions/easyarts_ares.def.json +++ b/resources/definitions/easyarts_ares.def.json @@ -10,7 +10,7 @@ }, "overrides": { "machine_start_gcode": { - "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\n; -- end of START GCODE --" + "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\n; -- end of START GCODE --" }, "machine_end_gcode": { "default_value": "; -- START GCODE --\nG28 ; Home all axes\nM104 S0 ;extruder heater off\n;M140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n;M84 ;steppers off\nG90 ;absolute positioning\n; -- end of START GCODE --" From e6cd6c264590d0dac42980cec6dc61f3f2346c98 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Jan 2018 13:55:35 +0100 Subject: [PATCH 190/205] Replace travel_speed with speed_travel That travel_speed is a very old setting name. I'm guessing that people were copy-pasting that from older versions of Cura. --- resources/definitions/3dator.def.json | 4 ++-- resources/definitions/alya3dp.def.json | 4 ++-- resources/definitions/anycubic_i3_mega.def.json | 4 ++-- resources/definitions/easyarts_ares.def.json | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json index 2ec7119656..19307bfddd 100644 --- a/resources/definitions/3dator.def.json +++ b/resources/definitions/3dator.def.json @@ -47,9 +47,9 @@ "default_value": 30 }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{travel_speed} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{travel_speed}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, + "default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{speed_travel} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{speed_travel}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" }, "machine_end_gcode": { - "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" + "default_value": "M104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 ;move X/Y to min endstops, so the head is out of the way\nM84 ;steppers off\nG90 ;absolute positioning" } } } diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json index 2fda102249..6bf5d89a95 100644 --- a/resources/definitions/alya3dp.def.json +++ b/resources/definitions/alya3dp.def.json @@ -40,10 +40,10 @@ "default_value": "RepRap" }, "machine_start_gcode": { - "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{travel_speed} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." + "default_value": ";Sliced at: {day} {date} {time}\n;Basic settings: Layer height: {layer_height} Walls: {wall_thickness} Fill: {fill_density}\n;Print time: {print_time}\n;Filament used: {filament_amount}m {filament_weight}g\n;Filament cost: {filament_cost}\n;M190 S{print_bed_temperature} ;Uncomment to add your own bed temperature line\n;M109 S{print_temperature} ;Uncomment to add your own temperature line\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to max endstops\nG1 Z115.0 F{speed_travel} ;move th e platform up 20mm\nG28 Z0 ;move Z to max endstop\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM301 H1 P26.38 I2.57 D67.78\n;Put printing message on LCD screen\nM117 Printing..." }, "machine_end_gcode": { - "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" + "default_value": ";End GCode\nM104 S0 ;extruder heater off\nM140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\nG1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\nG28 Z0\nM84 ;steppers off\nG90 ;absolute positioning\n;{profile_string}" } } } \ No newline at end of file diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index a0bd0efb7c..a373872de8 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -46,10 +46,10 @@ "default_value":"RepRap (Marlin/Sprinter)" }, "machine_start_gcode":{ - "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{travel_speed} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\nG5" + "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" }, "machine_end_gcode":{ - "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{travel_speed} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } } diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json index 982496de4c..689ac63625 100644 --- a/resources/definitions/easyarts_ares.def.json +++ b/resources/definitions/easyarts_ares.def.json @@ -10,7 +10,7 @@ }, "overrides": { "machine_start_gcode": { - "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{travel_speed}\nM117 Printing...\n; -- end of START GCODE --" + "default_value": "; -- START GCODE --\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 \nG29 Z0.12 ;Auto-bedleveling with Z offset \nG92 E0 ;zero the extruded length \nG1 F2000 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\n; -- end of START GCODE --" }, "machine_end_gcode": { "default_value": "; -- START GCODE --\nG28 ; Home all axes\nM104 S0 ;extruder heater off\n;M140 S0 ;heated bed heater off (if you have it)\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n;M84 ;steppers off\nG90 ;absolute positioning\n; -- end of START GCODE --" From 4abbd4b9887fc3e3d98ebf06481d2b21a9e9be0e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 13:19:28 +0100 Subject: [PATCH 191/205] Show custom qualities based on not supported CURA-4796 --- cura/QualityManager.py | 3 +++ cura/Settings/ProfilesModel.py | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 76a0c86a5f..d984bd17a1 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -136,6 +136,9 @@ class QualityManager: if basic_materials: result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) + empty_quality = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] + result.append(empty_quality) + return result ## Find all quality changes for a machine. diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 3b43e2740a..cf58a49905 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -36,6 +36,8 @@ class ProfilesModel(InstanceContainersModel): Application.getInstance().getMachineManager().activeStackChanged.connect(self._update) Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update) + self._empty_quality = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + # Factory function, used by QML @staticmethod def createProfilesModel(engine, js_engine): @@ -72,11 +74,18 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) + # append empty quality if it's not there + if not any(q.getId() == self._empty_quality.getId() for q in result): + result.append(self._empty_quality) + # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) # Fetch all qualities available for this machine and the materials selected in extruders all_qualities = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition, materials) + # append empty quality if it's not there + if not any(q.getId() == self._empty_quality.getId() for q in all_qualities): + all_qualities.append(self._empty_quality) # If in the all qualities there is some of them that are not available due to incompatibility with materials # we also add it so that they will appear in the slide quality bar. However in recomputeItems will be marked as @@ -85,13 +94,7 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) - # if still profiles are found, add a single empty_quality ("Not supported") instance to the drop down list - if len(result) == 0: - # If not qualities are found we dynamically create a not supported container for this machine + material combination - not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] - result.append(not_supported_container) - - return {item.getId():item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. + return {item.getId(): item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): @@ -114,7 +117,6 @@ class ProfilesModel(InstanceContainersModel): # active machine and material, and later yield the right ones. tmp_all_quality_items = OrderedDict() for item in super()._recomputeItems(): - profiles = container_registry.findContainersMetadata(id = item["id"]) if not profiles or "quality_type" not in profiles[0]: quality_type = "" From 1d104f367d1e23e8f99ee56066a951e279fbf797 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 13:20:10 +0100 Subject: [PATCH 192/205] Do not show not supported in profile manager CURA-4796 --- cura/Settings/QualityAndUserProfilesModel.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index bc81df976b..d6a9b3f719 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -42,5 +42,7 @@ class QualityAndUserProfilesModel(ProfilesModel): qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} result = filtered_quality_changes - result.update({q.getId():q for q in quality_list}) + for q in quality_list: + if q.getId() != "empty_quality": + result[q.getId()] = q return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. \ No newline at end of file From a3c26356485ac350b7da1622188d46ae8a267c82 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:22:28 +0100 Subject: [PATCH 193/205] Fix profile manager to support not supported custom profiles CURA-4796 Profile manager should be able to show custom profiles that are based on the not supported profile correctly. --- cura/CuraApplication.py | 1 + cura/Settings/QualityAndUserProfilesModel.py | 2 +- cura/Settings/QualitySettingsModel.py | 123 ++++++++++--------- resources/qml/Preferences/ProfilesPage.qml | 4 +- 4 files changed, 70 insertions(+), 60 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 756dae2704..53b65e3d1b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -805,6 +805,7 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") + qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index d6a9b3f719..8396e62417 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -45,4 +45,4 @@ class QualityAndUserProfilesModel(ProfilesModel): for q in quality_list: if q.getId() != "empty_quality": result[q.getId()] = q - return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. \ No newline at end of file + return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 243fd146dc..0e17237ff7 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -1,8 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import collections - from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt from UM.Logger import Logger @@ -42,6 +40,8 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): self.addRoleName(self.UserValueRole, "user_value") self.addRoleName(self.CategoryRole, "category") + self._empty_quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + def setExtruderId(self, extruder_id): if extruder_id != self._extruder_id: self._extruder_id = extruder_id @@ -107,77 +107,87 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): else: quality_changes_container = containers[0] - criteria = { - "type": "quality", - "quality_type": quality_changes_container.getMetaDataEntry("quality_type"), - "definition": quality_changes_container.getDefinition().getId() - } + if quality_changes_container.getMetaDataEntry("quality_type") == "not_supported": + quality_container = self._empty_quality + else: + criteria = { + "type": "quality", + "quality_type": quality_changes_container.getMetaDataEntry("quality_type"), + "definition": quality_changes_container.getDefinition().getId() + } - quality_container = self._container_registry.findInstanceContainers(**criteria) - if not quality_container: - Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) - return - quality_container = quality_container[0] + quality_container = self._container_registry.findInstanceContainers(**criteria) + if not quality_container: + Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) + return + + quality_container = quality_container[0] quality_type = quality_container.getMetaDataEntry("quality_type") - definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) - definition = quality_container.getDefinition() - # Check if the definition container has a translation file. - definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix - catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix)) - if catalog.hasTranslationLoaded(): - self._i18n_catalog = catalog + if quality_type == "not_supported": + containers = [] + else: + definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) + definition = quality_container.getDefinition() - for file_name in quality_container.getDefinition().getInheritedFiles(): - catalog = i18nCatalog(os.path.basename(file_name)) + # Check if the definition container has a translation file. + definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix + catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix)) if catalog.hasTranslationLoaded(): self._i18n_catalog = catalog - criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id} + for file_name in quality_container.getDefinition().getInheritedFiles(): + catalog = i18nCatalog(os.path.basename(file_name)) + if catalog.hasTranslationLoaded(): + self._i18n_catalog = catalog - if self._material_id and self._material_id != "empty_material": - criteria["material"] = self._material_id + criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id} - criteria["extruder"] = self._extruder_id + if self._material_id and self._material_id != "empty_material": + criteria["material"] = self._material_id - containers = self._container_registry.findInstanceContainers(**criteria) - if not containers: - # Try again, this time without extruder - new_criteria = criteria.copy() - new_criteria.pop("extruder") - containers = self._container_registry.findInstanceContainers(**new_criteria) + criteria["extruder"] = self._extruder_id - if not containers and "material" in criteria: - # Try again, this time without material - criteria.pop("material", None) containers = self._container_registry.findInstanceContainers(**criteria) + if not containers: + # Try again, this time without extruder + new_criteria = criteria.copy() + new_criteria.pop("extruder") + containers = self._container_registry.findInstanceContainers(**new_criteria) - if not containers: - # Try again, this time without material or extruder - criteria.pop("extruder") # "material" has already been popped - containers = self._container_registry.findInstanceContainers(**criteria) + if not containers and "material" in criteria: + # Try again, this time without material + criteria.pop("material", None) + containers = self._container_registry.findInstanceContainers(**criteria) - if not containers: - Logger.log("w", "Could not find any quality containers matching the search criteria %s" % str(criteria)) - return + if not containers: + # Try again, this time without material or extruder + criteria.pop("extruder") # "material" has already been popped + containers = self._container_registry.findInstanceContainers(**criteria) + + if not containers: + Logger.log("w", "Could not find any quality containers matching the search criteria %s" % str(criteria)) + return if quality_changes_container: - criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()} - if self._extruder_definition_id != "": - extruder_definitions = self._container_registry.findDefinitionContainers(id = self._extruder_definition_id) - if extruder_definitions: - criteria["extruder"] = Application.getInstance().getMachineManager().getQualityDefinitionId(extruder_definitions[0]) - criteria["name"] = quality_changes_container.getName() + if quality_type == "not_supported": + criteria = {"type": "quality_changes", "quality_type": quality_type, "name": quality_changes_container.getName()} else: - criteria["extruder"] = None + criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()} + if self._extruder_definition_id != "": + extruder_definitions = self._container_registry.findDefinitionContainers(id = self._extruder_definition_id) + if extruder_definitions: + criteria["extruder"] = Application.getInstance().getMachineManager().getQualityDefinitionId(extruder_definitions[0]) + criteria["name"] = quality_changes_container.getName() + else: + criteria["extruder"] = None changes = self._container_registry.findInstanceContainers(**criteria) if changes: containers.extend(changes) global_container_stack = Application.getInstance().getGlobalContainerStack() - is_multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 current_category = "" for definition in definition_container.findDefinitions(): @@ -213,15 +223,14 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): if profile_value is None and user_value is None: continue - if is_multi_extrusion: - settable_per_extruder = global_container_stack.getProperty(definition.key, "settable_per_extruder") - # If a setting is not settable per extruder (global) and we're looking at an extruder tab, don't show this value. - if self._extruder_id != "" and not settable_per_extruder: - continue + settable_per_extruder = global_container_stack.getProperty(definition.key, "settable_per_extruder") + # If a setting is not settable per extruder (global) and we're looking at an extruder tab, don't show this value. + if self._extruder_id != "" and not settable_per_extruder: + continue - # If a setting is settable per extruder (not global) and we're looking at global tab, don't show this value. - if self._extruder_id == "" and settable_per_extruder: - continue + # If a setting is settable per extruder (not global) and we're looking at global tab, don't show this value. + if self._extruder_id == "" and settable_per_extruder: + continue label = definition.label if self._i18n_catalog: diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index e3ba9b23a4..5e040cdba2 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -213,8 +213,8 @@ UM.ManagementPage ProfileTab { title: catalog.i18nc("@title:tab", "Global Settings"); - quality: base.currentItem != null ? base.currentItem.id : ""; - material: Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId] + quality: Cura.MachineManager.activeMachine.qualityChanges.id + material: Cura.MachineManager.activeMachine.material.id } Repeater From 03bd4d8d22f8fb92d028c45838a6f8be4c8174a4 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:28:16 +0100 Subject: [PATCH 194/205] Fix profile menu text for custom profiles based on not supported CURA-4796 --- resources/qml/Settings/SettingView.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6929614830..8cecd81099 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -63,11 +63,9 @@ Item menu: ProfileMenu { } function generateActiveQualityText () { - var result = catalog.i18nc("@", "No Profile Available") // default text + result = Cura.MachineManager.activeQualityName if (Cura.MachineManager.isActiveQualitySupported ) { - result = Cura.MachineManager.activeQualityName - if (Cura.MachineManager.activeQualityLayerHeight > 0) { result += " " result += " - " From 5280501660e3ad6ded329f6263aa0df2f2e5bcf3 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 15 Jan 2018 14:40:01 +0100 Subject: [PATCH 195/205] Fix for CURA-4789 `deleteAll()` within `CuraApplication.py` used to only delete all scene nodes but now also resets the print information, as deleting all scene nodes _should_ do that by default. Timer now resets to 0, and project name is reset. --- cura/CuraApplication.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 53b65e3d1b..428a26f956 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -647,10 +647,10 @@ class CuraApplication(QtApplication): if parsed_args["help"]: parser.print_help() sys.exit(0) - + def run(self): self.preRun() - + self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) self._setUpSingleInstanceServer() @@ -1060,6 +1060,9 @@ class CuraApplication(QtApplication): op.push() Selection.clear() + Logger.log("i", "Reseting print information") + self._print_information = PrintInformation.PrintInformation() + self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate ## Reset all translation on nodes with mesh data. From 784707bb85347e79fb7030e84bfabc29b0371724 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:40:37 +0100 Subject: [PATCH 196/205] Stay on the same build plate after everything is removed CURA-4795 --- cura/CuraApplication.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 428a26f956..099c71c708 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1063,7 +1063,8 @@ class CuraApplication(QtApplication): Logger.log("i", "Reseting print information") self._print_information = PrintInformation.PrintInformation() - self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate + # stay on the same build plate + #self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate ## Reset all translation on nodes with mesh data. @pyqtSlot() From 9a5b2158143b816067cc947f8357419b5be05d15 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 15:16:41 +0100 Subject: [PATCH 197/205] Do not show not supported when there are supported profiles CURA-4796 --- cura/Settings/ProfilesModel.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index cf58a49905..15b123d12f 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -74,18 +74,11 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) - # append empty quality if it's not there - if not any(q.getId() == self._empty_quality.getId() for q in result): - result.append(self._empty_quality) - # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) # Fetch all qualities available for this machine and the materials selected in extruders all_qualities = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition, materials) - # append empty quality if it's not there - if not any(q.getId() == self._empty_quality.getId() for q in all_qualities): - all_qualities.append(self._empty_quality) # If in the all qualities there is some of them that are not available due to incompatibility with materials # we also add it so that they will appear in the slide quality bar. However in recomputeItems will be marked as @@ -94,6 +87,9 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) + if len(result) > 1: + result.remove(self._empty_quality) + return {item.getId(): item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. ## Re-computes the items in this model, and adds the layer height role. From 616615067c20f03f7491d1bbf0a49cdcd0577613 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 15:17:14 +0100 Subject: [PATCH 198/205] Fix quality name in selected profile box CURA-4796 --- resources/qml/Settings/SettingView.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 8cecd81099..57e613a00f 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -63,9 +63,9 @@ Item menu: ProfileMenu { } function generateActiveQualityText () { - result = Cura.MachineManager.activeQualityName + var result = Cura.MachineManager.activeQualityName; - if (Cura.MachineManager.isActiveQualitySupported ) { + if (Cura.MachineManager.isActiveQualitySupported) { if (Cura.MachineManager.activeQualityLayerHeight > 0) { result += " " result += " - " From f823a98708dd3eed2485ff412d3fe2dd03a31f35 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 15 Jan 2018 15:39:25 +0100 Subject: [PATCH 199/205] Fix: Cura update setting after delay CURA-4785 --- .../{AutoSave => BigFlameGraph}/plugin.json | 0 resources/qml/Settings/SettingTextField.qml | 21 +++++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) rename plugins/{AutoSave => BigFlameGraph}/plugin.json (100%) diff --git a/plugins/AutoSave/plugin.json b/plugins/BigFlameGraph/plugin.json similarity index 100% rename from plugins/AutoSave/plugin.json rename to plugins/BigFlameGraph/plugin.json diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 176a4e23e6..cf5d1cd7f0 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -102,6 +102,17 @@ SettingItem TextInput { + Timer + { + id: inputTimer + interval: 1000 + running: false + repeat: false + onTriggered: { + propertyProvider.setPropertyValue("value", input.text) + } + } + id: input anchors @@ -131,15 +142,7 @@ SettingItem } if (textHasChanged) { - propertyProvider.setPropertyValue("value", text) - } - } - - onEditingFinished: - { - if (textHasChanged) - { - propertyProvider.setPropertyValue("value", text) + inputTimer.restart() } } From 38ae75637a7445cd66eaedbec8562531698feb37 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 15 Jan 2018 16:15:36 +0100 Subject: [PATCH 200/205] Revert "Fix: Cura update setting after delay" This reverts commit f823a98708dd3eed2485ff412d3fe2dd03a31f35. --- .../{BigFlameGraph => AutoSave}/plugin.json | 0 resources/qml/Settings/SettingTextField.qml | 21 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) rename plugins/{BigFlameGraph => AutoSave}/plugin.json (100%) diff --git a/plugins/BigFlameGraph/plugin.json b/plugins/AutoSave/plugin.json similarity index 100% rename from plugins/BigFlameGraph/plugin.json rename to plugins/AutoSave/plugin.json diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index cf5d1cd7f0..176a4e23e6 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -102,17 +102,6 @@ SettingItem TextInput { - Timer - { - id: inputTimer - interval: 1000 - running: false - repeat: false - onTriggered: { - propertyProvider.setPropertyValue("value", input.text) - } - } - id: input anchors @@ -142,7 +131,15 @@ SettingItem } if (textHasChanged) { - inputTimer.restart() + propertyProvider.setPropertyValue("value", text) + } + } + + onEditingFinished: + { + if (textHasChanged) + { + propertyProvider.setPropertyValue("value", text) } } From 064a8e6f6c4b2b8a209b0be2566d67a5fc8b22c3 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 15 Jan 2018 16:41:33 +0100 Subject: [PATCH 201/205] Elide labels next to checkboxes To the available width, if there is a width. This won't work for right-to-left languages though... Contributes to issue CURA-4692. --- resources/themes/cura-light/styles.qml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 7532f0dfaf..20f858c238 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -864,9 +864,10 @@ QtObject { } } label: Label { - text: control.text; - color: Theme.getColor("checkbox_text"); - font: Theme.getFont("default"); + text: control.text + color: Theme.getColor("checkbox_text") + font: Theme.getFont("default") + elide: Text.ElideRight } } } From 9a3c9921ca32feab5bf68ebea0a8f464f091b9b9 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 15 Jan 2018 17:21:43 +0100 Subject: [PATCH 202/205] Fix: remove unnecesary cura slice request CURA-4785 --- resources/qml/Settings/SettingTextField.qml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/resources/qml/Settings/SettingTextField.qml b/resources/qml/Settings/SettingTextField.qml index 181cb9cb77..9056bbe45a 100644 --- a/resources/qml/Settings/SettingTextField.qml +++ b/resources/qml/Settings/SettingTextField.qml @@ -135,14 +135,6 @@ SettingItem } } - onEditingFinished: - { - if (textHasChanged) - { - propertyProvider.setPropertyValue("value", text) - } - } - onActiveFocusChanged: { if(activeFocus) From 8aa51658e28c96f8fd6d41049af3a9fedb2c6089 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 09:25:32 +0100 Subject: [PATCH 203/205] Decimate Tevo Black Widow model The original file size was too big. This is much better. --- resources/meshes/tevo_blackwidow.stl | Bin 4330684 -> 866184 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/meshes/tevo_blackwidow.stl b/resources/meshes/tevo_blackwidow.stl index ef45dd1621cd2a0c949e16410456820f4138c252..36b52381d58cbd0a86e841306e8e6f1925e47dc1 100644 GIT binary patch literal 866184 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

*X>F`cDkP7=4U;Rm`aGb#L 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

@?c(s$xAGsKwIquAkh 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 =|lPY5!w!lStLYwohV0% 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%0A|V2$?MmF1Xv9mk zltvmhJmRHeHGWsY=qHcdc^X9dSWUH*=2saXM@iJVgz*xtg|Dm}ZQmFon;dN;9iO!o zX(^q?to?iKOTiyOX&*d&N=@ZGW6XwqW!-9wm0dhh{Em9=Utg6-3R=h^X{7yqXe^wO z34AkU^uuD|>G#MUV&Uo6Nl27t^uxctO8;T&IgwxX8ORAnbbRMNx+8%RB;PqC+Ls^= z+WQarf>q*|Dzq~6EZK^J@K!XO)MQT=CpD>-()8!Oz0y_K{AyuuD*fhR-{sS<96fxa z7cHgvEyUlseCM>@0Qt3kBK@{$WhwpU>E%iZexrp%dl~Ilk|ea$cIPjIQ>~)AO~*B8 zspC68C7ex#l8BSDv==VY$gTGVQWD!)5)oBlImVX;mRuMuTz(C;k8!AA0^dN znqv`f8FYM}f8iODeILSG)3+Iq&-L9Zt^G>;m5j3~P;0d{&{iTQR7+{C|K)pyp){a= za33f0Mbeei?q%rrkD`{+NV_M)ugKgt3Z)tn_zBR0pAh>DB)D%>rj_pMXmq;spWBc( zn61^v7+LE|TtAdhEw0rE&9(YI+SV`b^epg|mHSkojp9mnZ?BY4Ev4y~lz*>Pf}Rsv zwb+J!uPtifxgjU`9cgb9!${a#IK;x~Cz_XRW3m zWr=I`y%m)xXSQn{N?ehK4KIlrt>xDjv_AZHgBFKhYrOSQLba4uuO|Nf!5t3}@zA_; zR|Joj==YDJ7V=ISX}@!co|hOUhi||byZMab0mkR0Mq26DaHG@MyL%b(HN3>H-tfF& z5A~4*a^-}cm#SJy^IN+6aB`AaiIHE6C#G|l&^l|YU5F=&mePzTdpt3k*C&3IdXws9 zMqlDes>N?s*>Yp69UbSV2{aqR3WcxFq z%~0PrZcDgp_K21+>+t7e%`1Y3-1WP$_Rh^K4!`65yH8Cb?99EOsD+Y2+RJY7yPCE# zY|qhtXsZ;BAlr*txGq{B_6*+o$gHrE)@LmlT4LhZt7<8&^*^jPc)-^#ef;sF1$CAF ztgJQb+O6!<9np>OgDU1BFuSI=~??e3dnxYoo0coVYo@=a+yZXUz<8FT# zw{cHEkI5*ZT1s7_wk3!XRwn5@Dw3YntLAl`;f0P zQLYftK~4}!V|2%(YC3~XwRnbtUDv z^{1!@Tp^DV&UN%&+I5bwYAMZCtzM&|(OtUV62^nvX~>>*y5Ew&4<%HKyS3P8GTm

yhkuAT>f-yqe4 z5zK`=8m^uX-Qz{u*B3E@xsau#bv;LoVgz%!9tUwn*SZ1 z`GYq*8BAfs(gVj)JulzlmQ)5Km#66AU@prO zkoCEYcO#}S;`X6q*Hh0K!CaOnptTI9FoH*C7Kix1F=7OBxlsn9y?K6`2|BVI*pP1L z_VJt@^*Jex5pyxx&eylrgDH%#OxM4SU@kjf-x|RbMp&ln-$pQ(ov&8}Wf+f`!U)Ta z-C71Cn9I)Bw?;695tbYKw-L-`=j&S|n8FCljjagUmk}|7x$H!KYZ**ogyqIo1ZC5W z7{Oe2zP_~#rZB>CWB)dSx$Jy>7J;^%DU7g8*NS*x@pkcAIO-rHn9EM&XJr79p-4{1 zU#{Ib?vZ(>7x(9BZ@>uV;<>1d$mDMFbAHj)5AL^ljl?~pW!PYeoT_=NZSnSEl4tzxc?S(x?LWRq5k>(Q zqwN{L%NLW1cEOwH42oAjjDmL!xpiD&ZRgtNZnustT(t${$qn|&?|AmSu^;yjt{kc|^0*j{XSvl%ZW268 zZWN3)e`svsyq#5#gGY@mbUj^V3`u`4MdWi0Y<9mxkBME|L>t|(HvH&^s^GO1V+un* zMfRLQ%|8tvQ`oqChgheXi^ddsH*X(5d*1Vc*n7&_@JK;07o+QM8dF%*AK4ZLiHxS# z`$XHd)%zg%U519A?RWM0=5mANaT_Qij|=v(-_=%!?baq*B6>9bSQQxs@3K-|x99Lu z8Qt1MCkW!cwN(*wG1~M1T2AD?)hBpmgT3Oovi=nsT7Qo3+3t7vgAw^$jE1e;Ut_TI zSB-@>yTa~+nrAn;XRIwx*-3wQ{L+dB%*E(Cb{$_hWzYYGV6I&TG_D816h_QFaeQG? z-#i(NV6F~3G_D816h{2vS~*95LY@ppFxLtHlI&uw5Ynp!Oku?Ir^gp|zbsD%BbaMo zUBh}1Oku>j72^vh%*d0$2%AcU}X`~@eU(sYEvVbX!*!txOg_j>R z#EaWH8H`}AgFhQzSob$WJn;GXX{ngPh?hD{DD+um2(vEQM5Zue#y1lRtG_eEjaN)a z^@tG6-aopju(VxSPLwc(5r_S&sW5M^|Ak<#%?36Vx}Tnh zU%J>n3CNqpQ+rX9ROW z_UZ+Ouu?$=Qy2jocG+pyoG4)mBVg&Jeg7ANx!~C;mm6ZuHO{(BVFV&(gS!mDdN6{y z5Yz9zY>2D>)Fo}Nn8FA|{)_E9muQYCVFYubrrp-L6anipg%PO1i!L^VL}ENzf(%A5 z7g~(QD-6-)8m9+S7=gBH^6Q3>mLYAg7{Od<$GR*s#0}k_PveRyj6mz!Yr8Hbwu0tN zVFX(3hxhqk2u^$m!X? z7(zx%sdX8_To|eSaIYb_R7_z6#*8n1V2G97_up4hI_k4`F&D;e91XCD+ zQElVqyXC|#Qy78K^2)A;*zx1f(i+7G=ECUwnSBkh=~t7}QZa=Qm?wNZ)DSypD@Qj5ijKECh*fECq-Dhsb!W2eePBr)*L$C)K!CaVMoiNQ1ul{>f+QKn~ z5t#Kobe|!b|9Np5S4?39X2sinXb3A6T2V$Y7v`de%`=3|Qd560g%OzVZuzVsOa@vw zrZ56?>R%U>B2X%xZO>mNrzMkFJkQ%b@0VYHJpgik5d?EFdd8pEH$P_tbNzB!BhAlQ z4@NN8qRPgc`8hOa1aoz6*O)UuFGVodnp?)w{CxYX?oNHq6h<`8YoPf#>%j=-y8WC6 znxB9FRZ}bj{$K=iopShCnxC@_rZD2Ctr}>4zCHwVty(Z{J@a#x!CV7>s;Bw+U%&b+ zwG~qs@y3a7=I4xHu5OiMX?{N7zOsE) z7g-}C>CCmsPm*mRou9AX@A(wL6h^H1xt`|d1MZuZMhPRB>#&!`tY?1C6h_?ss+_#f zou4y;x#rzAhUVw&L8dU`jMU%l+%uGe2hpbFKN~nDxxhnZk&R_pYb; z`C(VxnMMgCnCqFn$I$%T^g!Fr6h^$$Sv=TkeqM@Tt|7aRq4_z>UE4caj zVOMoYJ;(^=f}dK?&mn^;jDR=Y{QS??+?ndZ2!CV+ixcNEzgDH%__`%K3>qfgw>5O15jB4`d=Zs)3jH2B9{D~`_ z45lywqcfXRJ1r3Hj9@N|AKm=iVH)F+rBN7xF{7KGU$!x%v5@Ub#5cgAvSyd2Q?Y zIpT^bjKKWU&CeI#IW*S16v14W!3gHUevQ_MxYiPd5!h?e zyD?7&zl*uB?<60=6h>grOph6PG8n;J*gunxU|uK1u~HeO2!k@j~5pyxx*7||=yc51^AFX_-C48+-?||3zd&zoh z)eBgauWddooKWa~l|Fmk;a|6p4u7yEe0`(d0dp~$*WqPv?U=RU5xcaB)@;-}dilHw zg|&h1-?X)Nlw{pi6ADw>>hFRWyEa_hsZI2AyWSCVG1^wuRge3>Zyyc(zn1Xubyaci zY`ZD=4mZ9t&hyUtp?x%LVM}=FcU1v%@oEdk5^e_s*(x&4v3JlkM@h_9x<8R@6)_j1 z%~q<%#9cc^7ks!l{Ih7z?_#g9H$AUk_m0u>PZx*3|FtS&E=IF#&#RFrxmn`sGKoZs z66}qz_rm8ESIMr)r#nUW?Hz@`ZqPemE=HSd-DR=KJ!R3AkIV@#+n{%3?}AM%!lA9z z0=3n&*=13$`{#t)w(T7;7o$y{+Um-c%Zo#1R|XB@b8ZkALsbChBm-+OUtbKFq~vt2Zj+KkX(L-`=|_m@Ard3&+~B6+G|t zA14(@38L?hRRMD`n)66|-tZa4`D@lz1!aQZ){?mx?Rg_66z5Np65$_nF&fVrT(D$5$}_+`Kv`c-fQ(kW$bfTS+rozobWCw6?0i#!F#QK zsEpc!YQiJ_*fTi(zg6)rRvQ~|#zh`Wc;2mltO@rzv}f?=@2djl;?V$SU-Y~V_s$82 z-dh%-E#a?y+y7^Ld=>y@U-XOYXp}Posz=RispEH+MVpGPn2XW;70~l~+&w3}Lu5QA z{h%S>TSLHWCPRI`lOR64qb&NTw4%(#Xp^BnUnXsC$F3ctxzelg*VhhRo9ub-T`wln!mAn-s4Zs2}eCx791t*6^}(Z_a~2oB}?<%Ibq|& zWx;7uKbVWroYhk@=~P7FuqQf2Bc)U<-RuKBxU`;kvmk~))hXIQG-obGn+-Lt-oI&W z*uHC<;6|zIJRjtovOE{{y#L5KfY$}FiRi&xjOJ{ylEtIEDtdJ3r0NYt58fd(Baq!@ z5q3A#HuHWa&wG3Ks%Zc3Csi+%NMtTXFDf(@e%u=SeX#3(_^PVt&G(Car^#r^D2N~1 zEriH0v_{FvUsXjX-BIlOe=?F`E=Kq2ultrX62I87AsldJ_uy->71uS+lge`j&)a3! zhVUdoTq_9XVl>xHIcXuKYFtw6+gChjrGlrdRM6J+P!FyW#P_1dF7P?ogwdvl+KS>T zvM7Ou7A3Hc#g%GKaTPHaqb;t~x@WJbik^J8IDeM3a44^>0&_{Ygr0ZK*HzJncNOQ) zk#PxgF&g?k8=23aoL(6C4!ig27%UY8b1|B;5PRNq(PNJ2 z@tL%uRx0?`N(HZ(9_sVqqQ?b4EwA2Me9l~qHa*nm56CFL;j{M9Q!>in-fI!HgWTK6 z{W$lwgp0myAH6F6U@k^;`zWo?h-qP;<>kTuNt?*^fLk?g?L6;-%ch01SC$9wN&R3h zMsvN9Hc{I4irqU#-%9_%F={1&pRKg&!RJ3(9L|!q{ke^MN6f`&j%m;PyR=s)e>AE3 zctMyI@h+=(kYSeAxH__XRaBJrYM6|WnTyd@H?>rU&1nfY`n-K~u8d^3yk=dz*ZiS~ zy9F`+oA!~6EFqC7WN#kzsnqFUUB|eUsgr;NhC5Cqw$QrIO>m0|5h2j`0Mgwozz;ysC_>}E3ws3 z>=Bi`oYL>Uu(dvW-b2$WqnBS?UVL6!2IgWk?>zOqm8&KdH`)dX%0QiR$4zMiLJgDTYb8z_8+h=xXf)6~WYS=6C|M^o@z+8-G{baNxarKVG)gf(rXLf8^l)&d^ zY3&WZx}iA#Jc+9ZC3cz1e1KlY;!1m*tysg_q$2OP)4tYfE5h^AD9gF z$DJZ$g~&KsS|8?Ow8>C^tdsZuez&UV4)M9wC{WnXRtHtahs!1vPZv2ihz#apH2Yt& zZ1%5+u0FOr+@yW)z@i#5R`qHs96Ddy4~u-2@y;<7QMa+>;q9_s!d#5z9pe5;cu*-_sqj(QT5z8{{DjCJ6IUa^~Up#96l|);G^>Bbg`Aq6rqR3 z63T9~N!8<@L#Kszw3J7iiwBvD(H3v&kB#=O37WA4Q=gvEmV#g|M%zA8jon)D$5#W&!;9MYj?B8HEsps^>&KD-715sX$1hcp`2g=? zwE07295-xQc$L^{wDeJ?Io@TOgUf8CGLEU67H%W9l2wCQW+zvYQhd;tL?-e zra7!=n!^WXEA_{(Vygy0Y#<2cVzk*x{jrIxA;0--i@%*j34h_`9)NoW&--X?`{?0f zi~pmv)Xc?bzRg9>xR;H;xRKSqao6^GZ&+|&U@bNcU49w|6xV-rD7}I zk-~RW@opH;TXeUKGJaTIy$a)Yx*?0veEXE=-G6dLbnA$6zey0hBZavb?Rmc+SP}I+ zx!iwAO2u4^=G&(vGsUp-@bx1rqNy?~;%H#|aP)XybWVA==@Avt!xC4_#b~yh+#BA% zXSC6&HU2j;F5z7-ToNv!3B|t8iRQd3jPHr#9ci8?>sC?uz+&GWrBuwtXubi?^Ny8l5erT( z&VOAH;Ii{|jOLr{Ja40QRne=B#rfMxshEq=*;4fxQXal5k@%?e25fhWL|D{fSN$>g zjPmf_!z-czGWKCEMzfzhZwINh-uKIk_b2t-q5(D7ZhPnG@x1e9S4PXXUQwI}TM-w> z5?Tg#s;y4Nc*H+<(z-3A&T%*AME z?#>DSZegeBh`pk45BY9@8HAnB#t3Q3&pXC4Fq_zErantcE%T2T4vNAnL=Wa-G{#zP z&-RHy6n2(*&J%*b4BN6pVCH?)Jmi)c+>F`wV`KDLRwiUd|G3D(7cAytG-mX6dc^Z8 zzm`?CijL7HB7-TIL3H`AzL($Rc^?Skzk76yI*8`X#c0e$T<(N28CgzwY)-gJN|n)& ze83iw+dTeJ7XAA4oN$Dc3h`r}Vl?~4^DZy8gcrz2<2;eU(lJ9?RY3Nf!OdJ+xfw{l zg!fn{D@7uMxfqR^m&>;BH(8-SP%_=1^|iSz%!=Mq`ZP zawmKycDhOIb(!daH9gBZ!hXhz-mU%3=by;;kBuKJiw225n2XWue_0*u)iFBt%f;dQ zQa||XJ;y75?U&WT9v!1CWW{!=Aef8M9LMPjWP}w+tU6l06)rngAcJj9kL^ZI3-4ZD z9?cRN%*ANdNxnND(lfd)s0oLN4D@$)!k+tZ^mY&LYyJ6(gL+1z2i1ftLHv3;tde~BLWzHGUW@YQE0ldPLt$ zD!yD%75ySIn2XW)8t!r-$*Qw2tIn~{ahtitC}+~a4dfZ0`{r}zVl?N-@x0AeFRvbY zPh~Vpe2)9JFMm|ai=9qZ65Oh7I>~o~ua{T%l#%$8q6c#^n)4z_4!UcLeb>qOXGf8N z+q2CkSh=xWQFvZ3#ccKLZN70{bsO==H6nw{%Uq0>_1!g- zs%MBldP!TtT#RP@Jnt>38{=e@e5%A1)`~566UQr7iYLBodek0T6Sg_HXLO+G!CZ{y zIQG0lmM<^Pl=075B7>s=E6wH`jvl$2yA91ZxR2iXjAq~jf&!nRRZ`KuGs@tn-O{;$RFFJqspLP zHkxdlH6b0B#^Xfa#)-_uXqN4Hd&rliq5DVSX`%<)gtHFS{iTV<)ZG?z3eMR#3Ofjb zxfsnhjOPY{%?&R8xG9|vutnL@@vJD2Sy6~t5pyvbSt@95a7fQ!)rmFXzGACm+D%N? z6FB$I-QPHBb!!uxEx9I#13_Gj=DI1ja}BBpM$5WStsqX=dSbfP!xm*r$E#|A ztg3}rRbwtja|R-5;eyEDLgs3>34-eZw>aDq$v)&hk^kuPo#K%tb1|Chjpxby!?*bd z+k|T>*I?O){O7g)buwdlNLnA}Vl>;(^Sazs8LZiEMfF#Lcxb1Ig@Xp{8jou^%MEAM zk^OM8S9G$hS?(+d=3+GLHtHFDlhnbJD}s))X88v}Fa?&j(|PwbdoaM;#j<2i=rpcPjp@Lv8Mzh^yM*mP*uu*Z2 z|BRFh?b7#`sC3RJgI39%yOY^=AhT^By)$z$8tvmAZ<`+P%DYdHmAk`XUDAW|M)lfl zVtkTS*F~=u&XZ(y@Fqbr7o)S9e=C~rx6$O{J%Rw&18a4?6;`lSE@*D+WioCT#K*f% zE*1sBT#SYcTQ!uM##fXF&yJqv4;9VXQ*0mhY`lII*!mT7F`DfrtDG`su}_tG<+ zg3}L({KI7I!(8lVwDU9fHyK!es~uRJk2Ny(EnAc=E$2j}G{=oE&i||QYRtuGj)iz# zG_ZA1_AR%Z+@gBk$FfuX=xtUM`%0;pi_shlGSZj6cEQ0l{t1XHY5}-zbBiJ0Ii;^X z_qZCrS)wGvMQE<`vd?l}i+`hhqwgsQw68Bs!JWQ?n>ou3=i!ml17VAQ-kSEoNU<4n zF&g8b>HpC;$%^p2IsQ4a@3l%0=qENFgnMcSH}k12J|!0Kd-WTWeXq>LXpE3|zCqt4 zYp?Q^Y@Dn}p>5|?CqDDRt5mXEL=gX;zBYVUe9l~q=CdHOS}Sv$We4>P9+pVNEXD4& z=Mz_qZ~GJ3Q=CJHJuCY%WQ5#N_9s3s)@3e6qi?@(N0afw?rnlP>7gqn z+PMYbyiwd@c;5Sh7&>*WzlGR}xfqSUec&H0uJ)2XaG>mz{XyynYsfxei+J80yEga_ z3Zj=Fn2XWu8@Uy6ua3bFYZm)QN~yS&;dYQ)rFc(KV0(&~i_zRZ%8Kx$wf>hf^1D+? z#Ts(GV~fQ5seRi|&0LJ;`Y7`cX+aNvu2X6w z$-cfoqJ*QGPXlr-@VuUvm;3j~zP^hkN|=k$m~9{2+3Lr^tCm;)dS_*@MCu1qusURC z2Kh}gF8OhJwI?ILM??m5F&gVk-&dK8i`q=C9x3A=eC=Zjp9bVNNxLiiIM0(leUNC* zT#UwwSMPo%@wq`ScdJaz`Jap1i0*XMO=C6-0-vMipb+)w3h0|+opy`t{V}{Fa#+4-O+wm8AI-# z8g}|o5qVsURv8l;hJ?e89Tm$k&6x}DwKpl^pov4m@&sWNa537RwN%}XDfV3=`{53k zJuG%A8sAT`p7edP=kno6ywCE0hl_n}pCxmZqTN1AImhDLITkx@4;gtkVrZ%49E)$~ zSeT2^cBWpxpUXadKRN#qS=Inh_^u4T9V0&f;V0)mBIaT=%ZvANRwsKo1G5SC-0=DH z9%nbkdpUJ4&TQEk-9h#{e4?18*T5bP<7 zM7)*^|0NO2u4^Hb1EhId|vVxjSna;18>*u&C8$^|_q8^X=Rnb1~Z567>hQB>}(7 zS_W`gTcR>~c+R_+feQ)G5=#7v$W8QT55Y2?9TbGPB^Qc&H~8(_8{5c9xxZ9 zO`gWp+5>t9Zy#P0J|LR2^bs@b3!8S(Tn1cP&%1Wtp21r^YQo>isV(MWv}K)AJ>J|+ z)&OMB_J5=fT7EE4tn9GQnn98gC^_FECq}wf1<8Kuh`AVT`l*ZuhI9`WY|#*|lNQe6 z2ez`3KwB%V#%@(z_u#Vsjth5d*E?V?Mq7-jt!|gtJwamk$j#(raT2e17jrS%^B(x9 zJa}AARh=(88ksADrd(LEI_P3IutY$*MqBKv9#e*P51!b( zAv{oePSYG#w6en=W-E=|f*>|oH!kchK4&gQn||t#<~}`x?nl&w%OrN~T_~?b2})vd zrFwj}U(eveJ!`^u#e>YnXp^UU$oY>TIV%%!G+4Bw>>NGuS(zX?D-$snqpg0Z9&)C^ zPtG(1)*GO_Y*Dtf=k49G!M{rSk2^#U=3=zTTWu}(pCg9|WLT>P zE{+(_YnfdZ{3z$oKaf!db1|CppUHQ%gDZk_m>wEea*jSo&e2EA#c0z*{ZUq472s^&8xp%{ z4RG@TDDX4RBICXACbBvzqS&n}xazw})&G^VeayvZv_3eCtfkuZgT?;wa{hcnX|F6l z7~W<5E4bF2I4(Yat_V4!=-U}Z=3=z<&9{C`UQK#Up}qY=lK{XtK!dtUpwE&ly0+9T&cWO?Uc6DvDx zwW8y=G+&N<8GX3Lzfkh;OqZUMxfpHwsdev?esGeUqd!i@SLP|`VUY-J&6}#ZoJ$Ro zbEyGyG1_8Rtt)3n1368OGoyid3Ka7*-fNy!gq&Cp?|U4FY)1LlKp!IzepYYqqL&T#b~n| z(4Hr!mjgMy+!v>p%|3XS*$rG~E0vK%J8~yP%*AN4mCE=+dgotdtk_wi1idqEMZ>$$ zJ8v-^&%@%mI__6f8P~LJ@OK~9J&@C9@qEy@7>yCYZgUkK=P3#-Zq+{OSZ>(yI**)&N(^8#VQR7z$A`k>~G1}y* zKdv9U)^8^{mu5)oW9=)XbAHh&Z^~V*l8;PF_0*`feo+u-NL#{OjJ7sdYwg+6wohN) zKDs~<)>7kL%*AN=68B(>|LMy1(U(#x=3=z9?J7fZAq7d^sK~OZ!X{RBXp0+Uk;hFn zm%LFyk~b=1E=HSvYTZ$z*ZLDB7g8IsE>o=RcrU-n^F9?@Ju8Uzf?zI2n|>-o@{t8e zKC*~MUL3DHQj=AKr#l5nKC+0p7|n4U=eY}#Ja-XCHQR@4L7e9Z3_^`;}nuA%G-Gs3KI)dr z;4EoNur|4JuzCtBn|4zuRwLa#qnoc;UcL0@%HSDkshNw>STB8dsQG;Nsl~n*Nndz} z_yenF3yxI^R@m&uQ~d7kOMUf*V&6BHR|N-2+g{3LXsq1baJ}b1(k4D%KB;B+U%x2PgYobSz(FS6LFUz-i3MQ7v1nYES^W>o(7c>$a>SHcOn{QN)>F1UE z8_4|N0T}_9=J1qh4nLc%)aSd0RCu8axWy~w>Zak*OO~WWJdgnd&->wuwf@0nZG!W}9~ezoc}-jBVHQyt$w)uINT0bF&HBlHIPv+(OBegs ziFM6`@P~O2@oGNT*d?C_%*AN)xz_WuR+D7=#kLRw`K3N`<&GJv6Rb-e2rrxm(9zD~T)SVzlX@ zZ6ejdcub9Y2kGW#l$~{w>`9{a{o~jAtEFXNE-t&pg6c6}T88hXEjdU=`eu_jGLm)$ zCE*gvSF(p%{87@D>@WQwmzU9IH`QZ+#O}QNTm0K)w8YXa5}^l|R?Zu&Y99=cm4lmP zuEt!9=DH%gCZFmQ%<2{S-6cx6=5V}nO_PzOwC(@eJ@OBgNMtTXa~x;dt9Ty(+9+7j z{0u#;z0$b)Yh~o`H?LDLNMtaVwOv44ET})^OI##h;(UCGLv|rsJ-?=NQ@Zw!JAmDK z`_udPj2@Gjx#lzc0SOgboxHrZ+``T82k*H<53U(E;b ztyvfTH-D(lUzd#8i=>a5DSZ@kG1~m0adp+|Nkz)Ne5|t%!7y@^B^L_e6DeI_OeOEQzS}mmO98>j5eQZT**3IXzOs;Z){&J zkogU(kWM4X1mE* zOUYpNJ6UIVO6nkXL1PsV(vcC$zN;V$6xJ414_RjjlXZqTZr6vwqUH_o@kH2X=rR*hWEQSlJOvhSs=}UEZPW@(!@eo4FWm zR?vFBOfuu0By0M^rDZTbgJNaJd(G!6qg;Ico~-FVEiD6cG1~M~8Obde0dB#thy#V| zgw;WnA$?S6eH3#sn(K<3qnDe9-jO!(Qi)w_;ouLeMewH8M~$m{q)psU=7S5wgUrQf zYZEoDhTqc?df&DWUXvaNS!aHi6yQYwS(Q4l{afC||1MwG8HBwAoGLYLsNsyl`I}o#S~e z-U~epfs&XEEtTv%i)80nh@EH5W%7VF85)V($sKN}@03EqDeD4o!g1NGX-mD9on02A8`9n2-PY^GPKhBgkk+~Rc{!r`w zAWP0eWk2;((!z0!nzneaSws!atLF8@qh!x^JU{;>x&4sQ<`1>*v(mQzC@Z$(rS-9v8X9seS=+9*T6cd-`0QuxgDoWz znTydJW1e@@!g0|>k1VRj9i_;Wjy=0LC&;&J*zaoHzb+UTP4Qlg5qVsU))R-Fmo!AL zPj8z+fWmiW@S7wn@cRwX75i=+Bl5Tytuhis5qcN`6w3>bvfJ;fM^dU7k;lbom62$k zL4aZz=J8&BQ)=B9k;lbom2r%mV!iLJuA%t@dpSYjJmmZ)&$~zvm%XltJT6A7jE*&< zqCcEHB$iFy-)nIe6%@?8?amK-ZjCSsq%+!{ zwN&3cwWv5k>Ih_DG>JPnN@dvZia7Y0Ma8od1j{fkMr*0=mHj2icZPp_5*j73TUGhw zw2Uk#$C(NPWGZB?Qnb4p@Gn2Mt^PW()x%>N3+LR8)7E+`#i?`fTpL?Kp9e{M#R$kS zE=Id&v~WAzQ=I>(oIO8H@&Ux9+OJzIW60%=g>~n4i+j^enz-pnmGE-rh&A%H&&VIDj+;WC8!V-6vVf)<(4_N*=SA7$^ywc-o; z7w=Ah5755aEsWRgS*HF(Qw_Ka@H-K3!hC_}50z`fp?ij!DY`XW2zvgB?zN{i_!M1GA`Y22l}wkn%WQ6^(Y@Z}WYX&|jfl!EP$_ ziFo$BV)LTv!3iRdi_scadA$MZx%mKfJNCcyC0frJktTwdJlzRKX|@8q`1 zq;8`gSgpl-t)8olU)C-!ZYuSBmh4+%E=F7Z&>B^|+qLahqd-B~_mKVy@8y=y^Uk=f zIR8J=@*E&{5HMFM8oiIo*yZ0{eal92(ngJi$FA1CmZQ==BN7?mC~}J@q1`h)*x|)R z)rTb>yk7d(Th7$F#u{uLKo;U2GjuHBc?;ye?W-k+;*ruj zGZ&+|UGcoxpSG?3ky=rVcVR`Y+bAu5*Lu!~JT6A7KdyeSYq&$wt6hDd_imr+f0JbE!A@(t*ATl( zabFdDV9#pZoo7$=FHI0e0T-j~Sv}b4l)3&MH*40R#yR5(+w7!mNsk>H3LhM*<97Fq zI>-n|k)7m(cF(Zx;p2ydHOG#M{bAOHhU_)>44*T?Q6xiC;z6L@Gkjh>afsj5vJNG! z8tVBuQyL0o!?e%f+MGq?b1@qATyi1#mJ7+O3%g@iDeiNEMeSMrQG3l0|FZ#_J;^Ag zUb8o;KkBb65Bp1A*%xKjVto?{gP}t>L^^?qsB#Zf8H5I{h8H+L( zqpiQvQVp!G3CH&D8P6t0d@!!?;Lp3qJ&U~;?cnDt#})Q|#roQ#53C8Vm0Ws{Nj`7p zVzkNDKI)oTQ~fUMG}Dx`uH<(~;tDd{@9;Sz^0^ode?0xyA^s=FsC7Tsr?D{dP_2Vp zi|kqJ;JcHD_Ia}B4j<_;QW4!BrN3CTK> zss4va9elN8W1(%8)(?(wd)E5V`1h&)J4ydx6ug(w_N=A4M(z_{Dn6In9V5FP7~>Ki zi`ad_I>(W`gJF_)Fk&u7^BBeRx=CMKO!``zO~6y!qT26T2PI!$IzrClVzl}^um3>( z;5uRb2kJ_G{{f2QVl?W<$$e|W`ws3I)XC`8>H%bM^jW)$-(^>^UlVR5?e4EKLS`;T zb492wll&}>Y5qto)Np>3|j5K``nok*5MYuHn#BiBVA?gG^}~) zf#V9_eTnDc^o-ts5zNJC_l#2YEo%r@NOtc1MDsRhjw_6ORr^8n0c6Y^A$dP$SwHxL z+`;qMW!-}t|63I?7o*Kj+Fm_<((B>q9%`#KpN=hbyIExz0?}vBiWqy`>*0Mp6=4)` zG1{IrcK5D%-5;N-i~zU-vKAQ`f>jAudMSv)1!} z?a~l-9@9P8XpP)(l#C4!qg+C>mB#J~J4?R)5#58SvSQ0zj5b@T9(O-EC+sSjhrg9* zpYik9LiJD`<1D;*Y~iPqcaP^Hr(8F-FndoM`y4cHPI%X2Wx+ft6>~8EP}Zh z?Vcf{-xbrsD#@UHKSq{RKP;Bu1Gc*7y>aEVFpwdV}of#f@Z82N~fgbB? zWEZ=9TKL*m<-rc}P0DH%S_7+5(AMgpw(Vo24!-|od2ofa?aamKtgU#}z-i7iI@#Zz z&JAHJMmS2=qV7$lQDV`6h_i@6-FDAtee&W8T#RjsjMHmGdGTNS1^Y`TT$ToY*nK+5Wb9Rui!KcWAFXNIM>kC~MbdB4tibv`T*W9AN z%hx_ZOs(t~+$CcM=3?}kU+N3{{$58Mp11VO)#3aFNq@d-Tw!UbWoNIsXV{7njxw-$ zA)(zfZ1qBqcEP&y2F12|f4_#pOT{knI_1KP8wx!>>JoqRvS;n1UK7Nc1Ys2PMU1v* z?W5R(<|$CjoA?Uko>8M1;V5;f&w+MtLc3d59fhkU*Zr6Bjm4~p_Lav}W@&BVE;%p? zeYt039~o0K7o%ERd$kMBI9F|T`_Qq48!ticH7p&y;Jr4I!S9~O2uHzAVuyCm z(ENcDR{MW^A(?+9K7ieMRBX@ck55ip?O(G{5k`T1%s1e&XZ45N3lJvv0z|kA7dJSd z7v?@3x8DxF$NKZ%`%zekIt3@gR@Boon)`Oyfh{$vI;l~g$oc#?_RxA@+G3pOo-s~j zgrn3pGuk~P+JBU`B!q6RQp;+I7-%Q?oIH=6IJbkEzZ*VVXbKF13BZq`J38y;j|N;)w&ns#noq|JUo!V+G%FEugdain$D2VT*p4Vc`K{@4Cwf8TUBj<{Z>Pu6MY(`QxEh2jxDNFu9KKU>K=3=yaM*p$J_S*z)lX`y62C@b)UHcF20qj}Zt7T=|1aEDv zeXUW@E-~7kwY|EiqFwaFIa&wJgQ(B!HG9^2enQW7(H-Y0!YFYhCjKvNB|LBP$*cYP z=d~5JNCbjMHTJAga{7_0{pdwS7zNg4v^{I=E?luVe6vT#;4&FgTPuT-SiGX1+n7Q7 zs7qzcFl6tJ!Tr*!F&CrRBA$24TYZ98HrOlf&(Anka$R4Cn{x&=5BzydVaG~5OP-PR zchp)&+iNSv6pme~GJYC9rZD$mowwEBB==WO*5BpUh27gk zC;mll29gyP=3?~BMPmvRx6+Z5=l!Fub5Q?L|5%SU_et*0CHgLF)u4xaMyVL#DAKkQ z+C4+_woywM{nS2q;oGXf><(KE-=n^;>xEj99!J#|?mX1SaMPb^2^-|bv`wWgVJ=3S zZ!}6KpVvA1@RR;=|M7D9xWc?1x-Q0}7x#>onh}mt*UV`5jJAXkMnS|G8uiXSLvuzr z%D_|x(C$sB=fiJW8!nW)E%%n$op}neYxY6Bnm09e50rbhj_A=QsQRWVVlGCT4Yk(p z_H(aj?Yn(qTiyHF*uoXx>iE-2f)>?1!&Z!Nl)7d{yJy(yE%Eu$zqAi(q*N^3JczP$ zX+7`0uqC`n?mp`ywU)UUZ9Z2$9^GiKVDTG$;@Ew7=D5PezP5=oUXlCZhpSHZtZm|b zKlchozN-kMpzZsAe7y_2R%7};zL?4(e32-pPFsmeC#RdA9OpSkbX(c1~ViVS1h?8Jy8dDfx0t=j7w% zhVUn(QnZ(iAG_f8y4Nwgw;^WW?RC6ikud{ruY3O8s`M-`Z?AjuIxFLDa`2-wZdsiV zgi1!R`v*URlw7uY zdV2pLTi1B!JGPzg z2b=dKyonmsFM3F)N{2_1J9kF-YuK`CcLqAlHDzvD3zks zc16)!yA4V1$9^AwuU+~4)MAgfZEgAWZqtf;98LQ%zRBy&UR{p0$8jAEkw?Y8d%cb0 z${uZ!6XfLXGb(VX(C5{i2*;b$)#Ylu85MH|m? z2WXPr0h&BmnwH))Oxaa=eY)TD;u)VZ&o<|3bzjh4LLIM^D9P8lMPO3^lsoe+}@!y1G<_h^YS>U`!pD%6u7ipZx@G^PD5tp8WE zGmV;l)QsZAeHi18YjQr*TZVehl_K(~6wSE3U;82PzuTMao_xf`#l>%SPWP#Y?{#tU zh&wx{`_x`<-g$JJA@L`j43S4gukZC10cfwhzkK37q+Er1&XpqasT57wy%p>8XR`IV zNAzsty|XVaUbelh4ZPmQp@=*xMcX(QU{7@Cjy7_ac1i=Yy*(D2et5mv_TTP0Bz|-+ zL*!8@+T^P9rq;==i&hlwfgkiW0OiW%l~it(%qG6LzI8GjIU2Y4U;kLC6zwu?ZK!4N z*`-{$HQ@Y&ddig|@~IR}xl(C&J)li=$)`;W^=v~C`BaLgO`P-gfMm=!y;7U#y&|VV z^nx8vv5%FAd@4m#uJYR8TsfL^u+eb-Jc4!W&N8XIg~np(WQH_Px*<$8`o5&2Xj znnFFt@qeR7BvblqmCDtiJ!ce8`P6Kp+Ne;^HWZOhRU;OTa&^Vps-*XYa|<=tZ-4LH zsl`j*v2px$yQ#(YQ@f=5`0IZ_rY-^ z;zixIO8uZ({q>tLZ{y5=c)jtw3Wx_XL>?9S?DfX;TgHrt_u0?da4Skn#>|?$YmK(n z>&@;C89O50s=Fcbs1$8B@n21&;#1CCm&%p4e)3y0ibot^M8oheG zS%#Bp8_ZILs+k3t)N?_q5OL}eS5i1zrEp#@HvvRA4HI$E!{k#_`Qb&VnNs5n}$ zw~-(JK!@a!C*~I}!}opDADD`p9c*Rd?CzL2ElcN0ZHXeh-Vlca zad?KvqvFWD-sWo0ruIqqeo5g)th}^!U2SP^ksl6-w+AMLZxQJ$m7-k|tyeBrDv9)J zE*bO&E{W#VRIZfDWsK-hrfnYvNjw;m_|(c)3&WEiYlHsdxnxv4f1=qEMJ(BFTJfb< z%twWKwty=Cqwq{3a{4ssZsG+qt}%lJ^qD-;R$jy=C;9JE&04ExgQ>9 zEq?P--l{CQ$1%A&d3{wfbK2a(*K7MHN~LJ$x$#4Nt@nzS!Tl@W8|rBp6p>G*XhwYl zo*Wg&<87|owo~GmBb*t!=mEUmyuk^u?d^VRh&(Dqo9w;}#Icz-a87X?+V@b;aU2Jp zk3Vl+X~?i+4$Y@Ru9u8Ad{ZUQ1ER8xN`!g?_Y?Fi?io1RP*1s1L_U?G8JCQMg?n)E z{K6R6lIR!HiW|{#7u6=lZVJ);)sT8g8Llj;4MEm4bX0^tO z#r2$e=Xy>axMg5H{0AbL?_e1wU{zE>CA&jz8H|G(k@?8!Ydt!nuMPF&pd#|A6ir_{ z;>e!K4!D#4N}RJ?z5UeUL908bvFKHgPAN{9Zg;>&E2k8DoMZJ-^q;{!liF@W3rq0D zh*Bwf;yY7{_kNq9qm}s5sqT;XMhbs}ZkSqJU+SFhEkzTj78f1EGR9G^=QtFRPX*~K zqbZ61!MWNoIA6;)f(|09hP*e_vkgV$Qz@El>~P~b$>*aM6xfE2P;H6Vn=RQHh<7qX z9u@iQ^~UpCHcw9QRaM%?X}D+f?ngSMdl?Vnx0{z*nq>&})DK1EQ`Izudg{loFX)~e zx?e55bL`fVGU|P2Pn4VZ72v||$)9@F7G@#>P%1@Nj^hJ-$uVq%dFS3srx*JUxAlkW zcBtn#6p>GbvuatyX|d?bea6OJVp~VKO=RDB+sSvxG)7zE^=3sCkw>Lykl{CT~L}){OK3Q^F9AEqd4nf=E9oL<4?;cpp@@8{nx;@sxl*lljY@4_rm2ixLOt71gzIx96)a~NO)IKe>-x+#^u3{; zZ73q2O3`d%19Y$o-zieh)xx>tQ@6d|^nC5NlauyW8zPU2vgGw9SEE)}B~M}{JQf~D zr9u6YN)Ph&t*J^*L#Fii;MJ5$(dw_FXbo)QmYGd-X=m%aIf>aRsS{pr`f(M$HF#{e zNn#$AqHP?v!G9co#L&V9Nc+mAQ;P$7n|`QHtQEk1j{_Ouid3v@i}Mub>jN z>Pn@BbK6Hh=<-UP2=%n>c{Z_oPBI@Qtk4n+T4}Jr=Z??DO zD|)uB_QUIK9Q}aUHACc4DcZ)NmLc!}zujeap6?Cy zJPiGKsL#;CKuUWSQ}Ic~d$ah;+L(p->P^H~yJG)JsT8g4LC=x96FG-^9D^V-g+|2xG%R{PktyOpK5$lsAufc;fCqSurIr&HgUnU>BWgVnU6a8^6AB0 zMw{%0dfHt@PH$__X2{cUk`3C;Ch) zzBkayQB-wz-{g&bR#)E*o2XQZetY56;*=-sO;OYnbM@YvHdnl9dgrmszdN$YZvm&? zdA;c%a!tmbYch{Y(WZm<4DX#Be=cqe0SEWIX-aYBrYv8u@Ok(PQ;MrTH{L|iRyDno z#SK-3U%-lbv`wxlTKSLsyF;hMp3l-P16$X=d%cYV`7C44XPHN(Xd6e(yuQg*AFQfg zf^i&GKc#s8`8E#i`*x2^DSm&pk7MN>eX&2bs=5PCg(;PybxcuoAM&H@Hf>BQS1Ju| z&)N4-Pq|V=K2=TG8<@SSJF$22_@t`BV~`S+2K7rSJyG;CAa2GT>o+0lQ>qHI_$%yL zB4gb_&n!u^p1S5RE?L}vYVnB=I;MO2p`PPVL_U?G8JFxhcY4y{Y12WUQF2OW)a%Xq zv;ks=43S5rXyf_G2jD#4*0Zbk#d!wjEyq!H{*>ZzYdfa8GVrfciW^pQOzhPj{rV>( zH(p&mkLy~YQndHV+E{>$T$kK!`F9oJRP4Lg+c;VPaqqi^$fM$Wz24fGfpJ{3&Ft!y z+_}qo#dmqHs9in|v%6jTVB|Z`u08@hS1Lt&8`dl3p!1gdBF;^|H`LSaDk7gs(X_kB z9~2`GL>iZPB+ND{?0I=5%r+E}Po?M|v+azpT<_@5-L_lIkZ0Q~sT56LdoXOtzdu}6 z{XR}dyJevK_>7WkKI&Shs_%5G?boaEpnxGCUBA-gp zl=cD0?X$;SX0Nn$wa#8|Qt~2l`y6_OA@Zo$cdxf`Tm}DeHvGrq7`b}`j>F$eDxHNW zI&4JmJ4Z{hfw3jrtxrQa8V0Imw^y&EM5Jrg0)I z(dM-s(l{~HbFLJTPi6MX(6l8PBK3p8!r^}9}nUT~dx&Y6=CtCy(T<0|ZVsAn6BP^%xP6ixjYg^@p3*Enz?;;Vgs?{bCHG}8C= zUGTdqc{yR=H>YW;aLiYMIHG2IvC7hHTVHQ4LT zmc;MW#xI@LGDYN3(SCTn*^-?gS2d5hTuo2k%O^f^#-dMS&A|37rdC8gm7=-EQH^qG zr(C&q(Mp7R+7d6BsLfWhKBk+AhVzzeQ z69b>U-r7(^9u@oU^)`;lkn*0jjf?Nb|CH)`H`3N(T`M|4EqFh2{n!&4^M!29q`oO>^7t@}RuaMxPX^T)77QP%1^cPqYZ&Uigj1ZjFmC zfz<1}Jdz<*r7c+q?|k{+8y64z66dM2XsLNmwC#v@zQlg#3rD_b7t?dj5AT2B{CK_1 zl_K(}I6q!*bCpH<=~|7^_AhJf7GOr?|L?86)40UzZLYG_M2g6x;(NW`+USM|;2dOR zzY$Re*GrF|X>p>@52?6X+V0mLCqCP=fAV^(*^N))djq9Xw9lc%i6b#r*F9x1gL@pV zIT^|BagoJ|p`JRZhkl2F_nq_O^)^=>1d&Je!;xpJ)O2>a2Dp17 z`D`BGn5T^Ap`LoK2>Op7QYo5xJ{UVilj^EU-Ld<@)z<7Y_fF$>?>l?tJU0&39p5|Y za31c@#P8=yrD(41Ui#49gxejlFSFZ~flTQPll}-pLvDRi!>ac(2lV&&EXU@^KhHeui-j!8pE# z)_UJbrDz`q>&ua4>Z5#i-L{**vV8{5y4l3cpQi}7$b6EIrfpXaI&VGR_4kH)_DT`q zy|!wk#8jf$#x~e>-ge8?jWeKwK0<1aOC|a2vtT^$2Y%fD;i|?@!E>cjwCZDd1zDi4 z4H{)TH%CUMgQ1?|$kv=Gf~(OVQYo4`IH@=GLwBCt_$4^#mVvzWo{($aTjTk$z4|9l z;RcBq`@2e|XtyQCbF~a^GdNe?caKH6f@C@0mQ+$Hnz5)#iF1&8?h-?L9_rbKBJ!ye zO+DAy4Sl!WAjGqJ(?BNqe@dRw0S0XPG#)_}%5SYPMhE^H$!6 zOA*|;`ymzPr(Dmu%6`X55$c8c%LZ>^XWzZv#*zJwlOpn{*mtkDab&yBsrB(0?kN(N*#u8#6jqcSttJSvs_Klxk-M9z{rBZa|Y9fn8je}XN zPW@o~xd8h~w5T41SHz+zB9BVZEaN;Jb_cil#D1G_1fOuX?)P_C8(wd15V2{cA@Zmc zZEc*id2+J%t@dj;e_vkx(%z{*=Pq8G4#x9PPaRZ5K9&7eWN40~^+ny2sr%QKHee@} zzwjP%_Fkz!=P#~1ykWOu@)zFQM_L&REp;BxD6}qO}NPnXK~IN zx}Zec&fliXA zpHW8Be`Ke3exS8HW%Ep1i(W#R{7^)AqPh*L3O#=nzYm^%k?jaO2RTCZ;h~=6P((hJ zqB&QmV)y)-nyS*d&?t?g_{-ngC5+o~_W*wFtDU!Zx^9o6cM zT{1LnyK>NZOAFxKWZy$Q+fYP4m7=NVzre}NhfgydRDD(+c)juCI3RA%5P4LbAFu!M zxuOpGEKs{#3s}ydt4b4scuk1UtRDd^7tFM|`DJ3rh@%RBlOGjcgp;U_Y^_8v9 z)vE<>V82??lW`oOo^quK*PKc!Mbjp#rFM%<*{zV*vNvEGipZx@G-da2{MvW@Jd-Pr z062@vXRkM&e~Dki&$z%4c~puve%yw$&Ru)fmbyYeeBPr^3#HKYy8P z=PUvsm7<+DrnQHGgQeq#mRe_LAl*->7O8ec(SF6A$=0~zU?Ox-snpA;UqQxRoC=Hf z8(JDfM7FoYacEDphlpf;)-#z7x!MuqP%1^cT-i8YTUV8orp_&$jo-ZZtxUg-d#16E z&kr?~-^$E>k9TC#?jDTqac)AU=J#+rI?yd#m z-VBjP#h!S*^{R;PKTdmOehDWz(l6XLG}t)&y`-`)Fnk;rJ<=h0|C#xv4?edq+N!`6$fv@3kY69BX!^nI%dnVsSD)}} zutU$VHbOnyP((hJeeY~&wy_#trF?+=xHo`<{Ej7RYjdUZ!>>|if4xV>^DXdw?Ye$R z>2mHTre9~;EGk;(t^7S_!g1)k98ErZz41Kzo-;+{QT>pE&*2N6dEoim&~xWA-{n1_ zgzKB4Xn*j0w`6|lnRWKXA^A)yMLW+;KeDd}Ql9hN^r8!Ff0y4Fe6p{_S6**^P!V}l z9EaDN>}KDRrEPeeK+Op$3&53(*UoM(oss%!+6wR~s+y2?mm0IgOpdWO- zqhy47`oTOsucT5m{orzZ3ovZb+!Ah(Ouq&2SgoQbGQKGK)n`>nJZ)}i62_ra8tG|l z7e(2Z-l>%E{PzWS8K>-faEpDs-h8bh@~FsXuQ#4&UoV%a=dNp%YSk#OH$Bh3UQQ8t zREjqJ$i4XyoP$pt|IcO?7Je@g7Vjy>0GIH@{7!C-(h<}YfW~uuQO9b z9u@oU^)`;nahpy{+>yh%^2n02s66m`7c~puvehh&>Up{4SsqK3ET9$hj zoOiWqI_pt16aM^8+WJmti@Qa) z2<#zt{k7>Jzc?Lur|CziXB&#hr?T84hNf*-gujb&hBA-gpoU7A57@VAr zOq`L8%~;=L_{q}JS2)G$(H*In1<27FGgkJ>dqO?;9#XeMJ^7&{&!EJlcbkm|UT^%^ul8eKFP~_yyxzv~yLLm8#k*TRvOFq9TN_I^v`)50me{Yj z9z^c(C4)_N{k^1Orm0p{F1w46YjVY7D@vaMp;U_YIka`{g=pi#M^=>X2R|H<&S=&i zXVlxUahwmtp=hHc5dPlgT=O=JAJr=cC%b3)`utt&ySC@`)`lYTs1$8;mE}S*4sPPv zO4AS336J_rKeAj%DI$-GI^p%EAG<%(KG`=;O1mM-(0EX#PdOV!6O;DIEm(7|$GIP+ zsz7IJb(^b4uu5HYNK(2N`z5*tP%TpJf(Ll2eRA+YN$CUVpi(KiV$I;$77|(px6T}) zTW#t@sHY#yv+b2sil!gT@tG!?nLo1ll}IWzO#^qbw&eGz8q zzG0``Qyc7Mo81o(VQg4#2!BHDRJ4~(YqJ}U(l(fZ|G($$nXYkoyGC1#gM1EUN{J%E z6L@_=hcYEG%Wj;?6|)#W1;51iGSl(3r`nE=mrbs+49Y3OpKyeV_Ogw`MNkLA>! z^t%(9c)Q9k7Fs>_mewsTy$BEeDkPEju{f2YnXCMbafUA6+LMlhIlDi)XZJK#=Pf$> zp26~n^qwCplY`kkKPf_~6dlUxzK`8e)eM2X9^AIsvWvA5%4{RM=O;ykCzU7C=lR$AtIW<;Ml#`vK#>Sg1{m@%E>nhy-&PdM+2_OkIKyP+bX4l?`qmVezdjkaCF z`QA{bo+~0enULNX;pp%tTA%FJw{+w#?bHL_IP_u<(+@A3eq=Yxr3imQJy5ilO+PM! zf4UWUgzmz(mb`JO?LF;NKJ(U=hNs%6c7^AuOVh24TiJ2fRs!$&08b|fm7;kU%&u$f zP0)`6wn~2IwrpO8x1^Rn5iOAk&;`@`R!3q98--YZ&d zeNz-Yj2-8nU>sLNqm)X~J`SQQIq00CG&ncOgHWbT%;Pz!6dlTx_7!WEmi9qz=k@Rg zYL~Pp+QTS10TFl!vHNR?8I(%VYR97JvCo#4E`crSh4Z40pl&-Nl^Ed@^L{KXHNckq z2U4O`iuN`v7M*|`+q3-khGDDB8;=SK2FYoqOKiLyk6-$w5VgCz#!=??i_(ZK8Tk zmmjX&-HXzegfeZ3BEpkOixb|&*^L@kl-43PS%qJCl~eB3I6ppen=A2y>0Lq|WhmPH zpz%Drry;dI?u9As%+tT$zs+8Gy|t0u(~u(as1(g|6rGQ8oQ0LqZ?LZAjR9+m7DuTk zQx69n#Hy>!=GMuP&?u!+H18yM@xK2*KS&GUUWT$8%ADOiKiFKtT^3l69eTT^G99@` z0OT`oLY)1j#adoAAC=vNnIilNt&gI;Y(DB<+>5*pzczFL&v{SnjPYiX-42omyruTK zYPaou9-m*@XF-SL|E1q^2CJ`Vx0S~8ow2t&6k`HcL2I$oj63e$!f&1_|I20Sd3IN0icl&=hcYGcoKx48?#^!8^wBDx zId48!rh|&`C!|uemswxFM=_N|-XM4X_j{yqdqu>N)mt0cJ&GwJkBYkO^`_?<^{K9T z1V}9kWsY1C;Yp>YhBt8>I=eoL)Eu8__9T?)&lM4#RIY@=n`o~NJ!M^C)6=8Uk$bP` z0eGAB)1R0=hH`U6cw%?ZTZCL0E#qr)QRvQyVqUY&d*wk%W0GAl@nKxTg&yDA^q2~)ftxBH5-m6l%&J*prX|^Q0 z1w8GQkDS`c+pOn3Mq6Tch+COFSAg8ukEpd)U_pV*uC>B zvueCm_u*-76RQR!rH7tvpX|VxTBsDQYf;=MJZxRz(&tPP)t2za$}z9oUZ|JNG8}f? zy22w%4B<~Gaf z$!vR`y`m2Kyio^3nNp&N@TAf@yXCXkMwVEyB8O?f4yC5!xx-dTkQH^yEJa|vdPtD zx6CR1VYAJyKcW06+RG+ad2>Y_^jV+|hB7&*i11`Yd9H}|xibH8MPX=ZJkCMR!Mb++ z_}bzh-*1=tDDMgT?!C2foO0OE(o0A6Oxj{EL#Y(Kat&_2*~<4aR7zYLIEyYZl-*F~ z>?$HW!OgvyR1zJ^9QjYL8dJC*=bg#HF!GU2C;Vh)vDLBGlTdDs2u~_!G`xvx&Oc16 zD!q*yKX2gIrT(jGi))^;xzhPLW7nB1;LOBDRizhedMDj+N>8a2t@DOoGinwT znE90Ba4Sk%;#{LO2xaPrBEpkOuOHq-{djT2f)Y;mCu}2l=W*p3rB3+l+OOe?2u~`# zes~jmHTf3{3cLT&#^K(X?^P}GvgzQ($a4F84!*q9;O{j0XP z{f!n=cbrjM+-HILL9aL2U3tQSLYEAYM@32Wdh?vuRC7&r&aytA=gmEGcoSv!Qsk3;HRHK^HMZ^=+}sjH z(UZd#losKOC-Ot76zyfRSHn8gmJY{P3eR#MPS&q(4JgO@CY*2Iy|(lK&TT({^`KHI z+GAg$^JTZWHE;??emx?HS-3|x#sN|KaRvW4x7?F`5p*e>(`8{Eq0q^ z@$N3wwZ&IHqi<)-@ECah7I!W#L@r_+N~LHWAHEr!QB_)kukZhZ=vCjf z!yYq>R}Zu{hHgKzc>Y7)#+MgVmCl6!xCd(krBbxEjWgTdtZLli&wZ2M!mBBjqSar)XFR#2`q#)cLCY{Go>?pmpno0N z^x(9a#S?m&uMK6+t|G#d5lxB?W!kHM!q@JExw-?ht1{|6q4argO?J12uRZgG-pSRN zU8PdA%5)T6zQyduqw!_@aX1mb%Y`$Gul?EPO6OG~%cnxgzqZG^*k3-kdCH{4Mf@u?_8&_nq_OWwRxZ0x>#6 z_!Cko+RHY(qgu>vOpu#%8P>J>#79nk=$o+G`u6I^w#dzSBRHs3iuSoOTcT3pbHXPs zF^qjenchGV;R(K1%A}I$P-g5i3mH{@g3PD0q33G{&n!NDo9WuThMC0{olFO}uANz& zHOFNZc-@lR{A$qN8y7Z?ri(l1Sj1tPU zSBeNvDx>1?Ch~mBi(LzkXL5D%@R`MJFSa$#Rgl+?lWdLSWs9#A;ZNxM6zyg6oF6^8 zq!D_aj^mBdGmAscxAowqvu74}Kg-sGp-kJZi11`WlcGbJ9Q^m1RgHW9rEl{8zz?;3 zI-@$%Q8exIRgFDiuO0(GluFTRE5Y;HF@^E?0*(Ceh>YH#)uA(sZ;iDW&dcV{N8+o= zkF(W;KcVI*+RLUx*@jyjK2aOxWkdW4hz~P_KcTKE+RLVconP)+x?#@r zv<*k_U8+%Dwl*GorEBSo4B=1sE=7CU+Q?f+QH$IXQ3per98^SjGQPYrCEC|fwwIyO z?o!QlhD$!>HIyk=iU?1Tk+Qrqfm0pjGJAE~zq^)h%0?a#<3tiGrLq#CGOFlM{;@Ww zIgX|*g);SAdljCHERU9GZ^I;Uw=2gKl1vhPXM*#in(AfK^U*WM6i&^g-JkHiiuSVU zd7j5WSP$^w2$eXDDsb7rqxqd3AIXUr_FImvX;%QkXF_!COCqP=X= ze%Sw3HC}*B=6m6!tV*?d8Px*p6d?9F4z}ca*b=2uw8j!RIq+!Xz)KKe@ZaeRXX5@! z^Amf27W~KK>(qbroYgpR5_)tuepgc}MYDYEUhY4Nd$ekN2l)+YOH!&K<}-HwU}o`} zVK!G@wz;b9*sAfZ4B<~WCyMs6%@sT+ZF}0r&R==lHnOR{PhA$zjgWE{!<7+ArRY#* z4EOr3t*ZZ<^=j)s&Mc1XVR0gRa>{-dCx$ZH*mhIP>d%3=bH$|#!xQ8g5VZSwTjL!4 zcFXGTvNrTdK7wsbu5Vn-7?J{G99S-s)y z+SF2~V=lyvD`<#o8lA)Td8~zV=V;(qF3eO*o%8sc~@~sBZ>JsT8fzATl99 zO5V>nNW@c_v_E)tkan*(*;Pay6?MYvO+WtdQOm~7*<6LVWSq=yH)`rbnB_ce5ug#)YqC=Up+haq^#H;r04zH#vZ*z;M7(`_7~^V#)WEs?eH_{_$|C42`k z66a)^Q#sl#gW2}$GH*aX=(e5Gp3Z10iIs93JWlubTOF!YigwSC#iHUr^ob%unbLmN zCoQYL&ZOkS8%;7O4a#RPo0PoqdCO{8>assS1#(4cP_&m#N>poI2f4%I8qE0#W%7KI zScdRqM3bU@Mr?Lf&-F<@f^A$orE%c9nKvN9J%DR1eTI$Pybo?(M0WASc%C$;adN2@auMdQD{y84gET-O%XTB#KM(15yh*UV z)s=r&3-yfp6p>G*XpZCji>eCuW9KeLulAi*m;SEC*2g?qSN<)v>&&|JcQxbSaZ{@b zn}K)>QJGRHddcH;>93hK4)DCudG3~)ygdm1%J)mWT;_SB^W2}1w~F?%@x1LftE&6r z_LE6Cz2p6*^!bcZ?|jxxcK`Ins_Ng}**Ezatf*2c+Q(#C`wNWxb&ULf_!YoM&UY!5 zqNAwxf~vy7*h78?dzMP2XrC)<1FO4|?^y;8R;~>~J$bGOT^j@{MU&^)v#j<#OP5iO z!{>*5_Oi_t_AIM?&(fc$gpx)m?Z}85_EnFh7X> z-Rf+AH}=`(jJjo@WcchFKmKpS)zuxbFZyTvZlF|(R+&!sEK9y;=^DlPIbzScbpMiC z{*r({)AMD_Oj_<@#|I9Uqc5MW36^ar@Hd4?8Gzb%D=0;vR_?!-xogW^HtT0 z{@OP=7@ke36usd1y7DhHX?)e_@zssn!(L(kg7#cj-d=BWh4`w`MO%D@ox6hX z-06(EZd1a&Y;9n7u;9Cc{-n7U`I}5Xup3qIJ+dH)kiG-!(tT?3Ae1S)iU?0CB|N-| zlBfuOLQXlFqYY*HK}CcomEJPEiM9lLuLa+G^^tQ<+`@6RUbeZy-fO}4Uj0e)8TB{W zTy>vbRhW$5qXt5*R2qidTvz^0P^Bk|@Y`L%f4fsEMYp>g=nr(Q-{OPo z(mi(aS#`qejUW5J-?j7}^2##O&!bYb>Bn~)S5-x<4~?uO8ZCfwI%r4 z|HIc#N~LJ`k9<=U;p|7r&wiXRsxCe6!PXDDqAopa!oGXidWEweB|rP&Pe`R`FWbn6 z4p~q-?GJY9#Swg0--qhTXIQ*!ZM4JboyW5iLjI(APy9{R26oR2{(F>b6n#{yQ|rp- z`a(I|Z!aUllS*q4-o&~3Y37@Fva`P6!qJJek zC*p5hR98Mn^yyahG=zX4=psn!u7z)OQ{s?_R7{#_}#hWzdO6Xqi(AQ@Uq!>&xF2;un*L<`?|?52aG{oS)a1zqE;> zU;lhvDS6($eA)fYy7c=P&hC=$>e6rUD92tl9h`mQy3+J#4dG8nrD!jk4)(-2{*G~6 zir+s@UszxM?tjC%_2utJkD5_0-;5sk=={RA4|Paxhej!tqUZdrzMNSg%?A*BJ^-aU zYF&MrbAUYXvi0hizFWmtoniR^{0XTP?PcTOBPXsaOnP=yDp%(%t1Ex!b^6zc;j?co zLzzBG5#h;%CPjxb{UAS)%L;p zh12j2?^yhv>Qa(YWipoXJd-Qq;OIx@7mh@B)r%2@D{mF;a%DP*v(6+GwE)cRz) z(p>WK)zTQYl(>KK*{M zW6}eh^YyURlS)kuZ=y!w+t-4B&-c~w-oLW-hphbDzmWBX(^&YpX(I49mK#&E6$HdhA?ObQ2L982H_l}gb* z4vQ049+ng?#P_vbAtmbRXWmv{&f}z!0Wum7NDBUatx_p^^hNdMTux*{fB0xO^RKK3W|gc2bdP z>fggf{7^)AGQLUCp-g{{3^eikyI3ZjFTgd+30KqfZFPN?D-QWA%VpYKMT94a zWCR_`ltg4zNvhiqNoCig46d-fC*)cvH%EjgBg)YW(cw*$-8G9=6plt-oTsq5^V#LR z@7Jy&%@4;me0Gf=OBb&wj75I921ue(Df-@H8q)l5CRfM;7613c!3lLRj2wBkPpwb$ zhS5ibGUrMW;YsC;hBtBK^{bZ_?&;MgX^kkutqghYeWzr&B{C^NPNzba(>p zrZo3X!E^5%b!UA!bKJ$7>&tm~s$Qxu=ca?*#q55A{D!>wM5z?L%Zv4rdq+p^BcyHj zS)gqXW!iQ{geS;!nn@qgq0Dj2>%CPxXSA&*LIhAFl2|E~l?atlMTau^fsAsAXO!D< zZCyDh;D&AL(|mM{Uc79vk0SgDsTA#Hi+%FO!O?mT`QA|GTqze?(`<5AR$>91lFC*pk#oyGY`5LJcUS>V=s{OWevL?%==TAtbXfK;aJ-BDvxKoyu z%Vm^LR4Tn}2;}jKJ&%_^Q3)rNzsaQi=)PMe*Z4Xri$6I(ue?%M&e7;)tjY_3x)s-~YWa7Cdy;tmsN`{wh z9LP19c&g9!IGZ?RMAvhk9r46+M}IYEp$Vbx;xENu{?8 zZ=xSWez-!GA1?9MIalu0s72mG(_60(?*&*h zy}o$F`*s>P)Uypm0 z#T(xmkd7mGXYI*^X1!8G=x?Rh4{zegPa!W}w>Df7scVz3YA7Dq#4k~hnItQl4ju-? z-WkH5kV?^BHfcwu!sOVu2BbW9uSP4g`I7o_ZbL7d^+7hoWXCrR;ZNAQqP=Xr>NjU& z;Wyn|BwJu5teTV8L+jOVXKyU5-KRw|3sIj^DSG78hT_O$^6%>S8f@o zok3p5OPRB)2&GbVC{uP-+8sf;3Nkjb+=j`OBJ!yeO}VP-)*}An?2V;4*r!%~_R+FE zpAnngu|PCkv$3=pzj-N@qE-K+XuH=3#J|FP(GMz>zn47ldgDjKvH|gKEe(-J#h!S* z^-87PrJ7#YC7-es%3K>LB0Q;FL4-F^Yn6k}DbBm{CX|~a!jlmdUM9SW{5TP_yW8~} zO9K%5-1J3#aotyzP4lLoHn9c&?V(ZFqB@hkEiu5z6yGr4mCa zNq%xb^2{ry=f0ZYocR2(Jull_-2w|YE3U~eq-Sl_^4yB`{D26EV{>`-F44tv)ktCjfHMq zTO=3^dwWEuH|ivpV1J2rH_Yz%rf(NDq<2noOrf4W3U~075&2Y#CO>d{MDnlw z?1ldpcxnk^y_^&0K<4{CCm7*Do?%1J7_Kbx1?`j-qkbHI(lz`tFuQu`e50{pB z22!aM{oV-;a$gZ{&Wio6EgvDr;Z~I62=yF?BJ!ye&2iw4s`y}JWXByXl116=D(z0MFW(=vWDo_oF7_Ff+kPD*Fk9d7C&=NwyKzN50FiNDW?XbL+Sb@~d}( z|4=GLt3G0F@O1n572G*-0QB5@MXB~)Q9pbf=A-t;IPOPY*^}^Pm{KX)$6@-R7A{zy zab+Hm&!L`rt_bH;C6%J7=R=y>$I}l@N?*d)s+D>4frj#3uWFSryFfg5SW>zGbEQ;@ zE@213Z;g#2+%gvXEn_|>uI*#XO~a(yjheKD{Y69)xo&^f;$&KzxdAB5En7z9Q`LwhQm*j(e8P;=Y{N&+II*-E+K?stw`j4*yE*PPF^QC@HM3imt5t7{CAN5%Jgy|uyf^Z&#-dh)|( zm$KBk+pOX>wH#Y4{C zE6p=;_PAL^-j{5>y6gPz@ti$tOTWW9N~sk6;@DZmhLwhnqF>y2PW7>vm7=MG*T7yK zfxF^wL+qoTzUhUA^1bmI8AMSlAnwIo@q1!+l}gdKUfCdb#pAy1IJ<8<_IW3#)T+6D z7zdyDyegi8yBZF}xh17iwDZRN$7^V#G<9z2>@WK#j^O+_f_(NijOYE=RKvZ)N)(Y#rD*D)dQL}Bs$I7ki-daG5=G=wDVnzZ za-5iKi90~(Kjt)GeSVkSUpwZy`r^gQZGG2H43S60NY?9Z&G|3HSEpq0 zm9E_NyFL$5GI9u@iQ^~UovPUs!?udga02Sm~|9WmUQd#CY^zSj}fM&0qf;|}Llm6~7~ zluFSzT{)}x(uek@DC&y*rPZ^>r2J?)WLELJ%lQPq_8mE^cx2QeZ7nom zS^bj9mD>--RH2@-tB8E6nzHpVp07ddvn9R)rR;jtM^0Uaas2&RwpST5;AJrkvQ*_1s^~K-cVf^rV(~mD9C1+e{IK;$ z9zQCn6wNsCng2~rZu_0_Lt9r_@_HLb6A<@ih&(Fx(Ccj+&wM*M?mye)O7%daWv@4z z_%bB1!_9`sqoNjhy=l~|Ur$aB#7!}jE7w{+S=+0jIH?_VrBdgS@npl~WZ`3m$fHuU zweih`-Q%xzsx1vhe5H}s-Pp~3@F0^Vjnty(Gpr`A#oYj7flw+%fBP^_F`wZv+}b00 z#*Z8{v~&%;fvy^KethKFTpigne*A!;r6bXXQYqSPj71rq{KM~*`D*JXb_Mm7?iC_PD!m z9Bo+D_%~>jTK)U?npK=~iTMxp5>fQ8d41#YyR2?J0s5g-ieCPDL-DQOyZ`8bj4H#v z?3()8m3^@We9Gc0mv+i-sOLBokxwgb7e{yN zn8t8kZ?=8JGZ!acoNI_YDr&ITn{D5K%zGDHx1^CxYn^Y~kRjwD@1pLGKlHTi@#lYoihQYCB*Yzryco zN~LHYhxx${bEn5|G?@cE7ec@hF_{^?GYV5qVVXyVu(|RBMB@*OWDt@*3*N zb49qGS5hfDjp6$CkJoHDyYUtHbG0(Zc9~VYcca-WwMsY%*sp*5WT)AU2LPc|ir(R! zhT{8C$1L7$GjvMQ?hIQ^c(lY3-hs0Xe;IG_mDigNDk6_c(Kc7=4P2vW+g&HfwNOu+ zsEB+jMboxldBgN%n@`MtRIGk7`$#+J^=1=^*tF6RYAu~AwNYYSqi7ub$H0$QHU1Sc z?DE4A>WZ#XN`8J<-}s(rb>m^sUZqm>z#C^3A3xJH7X!OJpWU>L%s!F_ zUT^$32cC1%G8>0lOQ%w_@#BR)IMKiH>c$NihwB=jXiv0NXf1AW`4G4ED3zjJ zA1y9f0RM5x-R3`(%HK=9^Lo?47C_wlt|9WM*h8)64a=SBl7|QZ(&V zmjn98-L{!seJW;`BmDmCPU)T%XZpCcv^e8af3;zC$Fv^zl7WML+RUzg0Ny~U6wNuj z|NKrV8h33WW;o~>lM-5nCqCf2EYiF6WNRYXrhTIcr$a)c9_ zXtj5EhhrMoL`(g~GPl%cW3Kkya&~o3uGNG}(ews~9miP^o~LmMIk-!Su_3;k%lPaP zWA&V?jOQsLpGwheBa_4wL3y3HQ>V0z(4NJ+Rxh&KtXE1kE|p5}ZDp_gy_8+=A!Rqz zi|kg6qmoL|l--etkXxN+a>Ypag!@cC=owmp|C}qYXBjtCKoYNAYKS~4_a8*3<>)7n zj+c;;9Wh+eYaffeoX_r&m%MAbNm;2f^XIP3X)KytaFE5+8qxO} z?6xaJ`sN1_igw_2juC@~IR}d!-i6XP2CEYe$}kdh%Qm`BaML+TfqCa6g;hIPh?I zHMe9b2eY*ZZM$1O(;Wl2XOmno^uBL$2IUDEwN(pC*+iS1CGht zHc8w9@$R$8iHw_K(zt{khffsk{=;~#Ud`iB7OH6YCkId$2pAlY8nSFfX7iP^(AUo z%Im>u+7g{n<)+sg2eb8HipZm4-@V?(k!e&qa@Qzoj@nwUH@kbDX>E$gqf)f#U=~@X zy;5n=zI(lmV}V7lDI$-GefN4B$0hIv!yYkjpqyev{@gB|(!C6?H=ZjZkBaa0dTZlm zM3zH8Tvc5U9b`1Q>T`>CwC}Dfrh^^t>>IcFcvbZ$h{%*m(TrYKZu0o*-4lDqXHTvw z{EBjgo!{qMcTVFH?u$)%!XgXqer<7=#Vg1m1jOMdRu$fdTq%{Jxwkx^cjqiF$$ouJ z*ErnSoG`s}8eeHoyx#bc{lc3f@~AjJUT<@?BlZ9~JZ-BYeWJ7A_0~okAa=+Qc~pF_ z*IOIeiazZXSMI0?U69`$EKS=cs zkxym&qMUWx7ySp;Y6rDjU0nl7R2kK%Sfk}A`Wh?xYmmMEX-K;tVIEn_< z^p3A;s4DD+ZxoeE(awL9_UzY;5^XzwA6Rq@<;Q;WSYI+(;_n|;rtB&rJh9(A939@o zn4uS}&rhP&)hEH9tLAv$>8agbnLnQg3)f@Cs_Myzl$A=+K0cePdoWkWW3FxkLZA4^ z`Cfff6n%oZ`nJBRa1r)Ll}gb*SJpIR-<<6+R5K!va74Rd@4oLUY&~THr%eH z_CwZGhBzxj}{bUGh0dpY7?BHX%vVf%<<^J%;7PaJdv`%(F(LiEmiEf{ zp@@7cMUx+j@HRLON3(~ap8QZmK9!<5j$Ltb;LyEm3)p*2&mq_S#`^9anbz5TyNzQE zPA44StG4h<*mkAjIaEjUL}UA@U9vs0TQ*OQ$0J`c=Ze3RztpmG>LFd0sDq)NwnP#6 zRCdP8y*6(8!x^uM*=Z{N;@)?7=QQ^5_fnQZJ?Bah`BZj>g}pUB|0PELPvk`Y6018O zIVH|VPTu%ju^dI~FuNaPt`=ams#J>hxyoeM&XJ{Z#q%ZG>|jw5&y;<43VUMbOIUCE zk)0z;5qVU6uh&}}$0LTj@Z_O|Dae<>lNC!QT1>4`u|~^L^fSb8XXAE<4unsr!dd5d+T6k< zL`yua{9r#y9Dci5j(xvvD97WPcmihjG8yo>0E@9n%l*3H$DxHT|ghvMSy%b#7scFYL^=>w%&xM}7hL@i}7ZiRhKf z58vfppKW+#U~LQrKdwehJsNu%N~LI*F`HeDmV!61llE?-LOpd*5pHGJdZ1D??Uib6 z&?q}iLrtZ;hI;CtB3#casT58Bu>-!e_LyldBqN z?U8%b7QO{PRDM*#Rq}D($4+b&cw$Sb6s_`BX?@%-an<1SLz@`t$&WmHRY|32##jG@ z?6!jJ?t{qE=Y%74Nu-T(*)@B0^7^WHCN%16eCMT9igwwxx!NA5+iD-T6Lji@-FA_i zUT^kl(5A`B*>@QtkBaa0dTS#)NuFA`;MMG_wn4XbNn@%|Pq|VAPo@8mO3}2`itu;Q zpF5h8AL_{uMdVW{n)>kpzQ-9h!fYbHE4cV}^MlIgP|r3Lkxymk$ms2C&A9=-wkkXK z>e9|xR4d{2rXOo@YO?*+=AHAX6m9%C4<|GKdAV^=SJgbfIqP9tlY4y{Uq_0_qoRNH zdh@l}Db|$d`h;g)fBJ>B;q}%=c2YJ)?&ZIkfAxBk-Rx_? z6p=^8`SE(2t3ChTA%5i_^9yqkE%9rYr-oFe@t|uFdElC6w*3hp<~}yRa3v5*rD*%Q zrYeiCm`i_OWFMxl)e-Wmgd+~1WZ)i6nYSqF2gI%!B9Dsm&M(s+Pt2C6EUA@1 zK1*bcxaQ!ba4*K8REnc6wrd;YO@+RO0--j1$~mS{StWnY@BEj#4Sw z+qQ9JU!SG+DtOK;L(jH0rch5msEG6nw;xa`n!fhHntfB<7&2>m91xWr`P5Ib7JY>r zBw~vv+sEtrC56jzrbzqibH&l>_@ZdWQ|;s3k-h#1?1d|pqJ4IMTx;pKT_34MuC=C7 zd0JaZrD#TdxBqrTlI(BxN=NS6MK2TTIlGF;r?M`BaLgy~@7SOXW(vm)a<=x7k%h9u<4&^=7ZO#_ayRN9F9M zl97#;_R43M<#KMS)WZ3kR9ZF5Wf3ggFtl+n+IVVZtA#$hKi&o{Tpc8FWtCxj~Sg2Hr z4sCFDvwTY_2btfa`z5xQ!5mBdpR<_3>&>=j`Ib^d9u=*D*PCU?GI^#5=FHo(?>?!n zF^lArSFmik^sJtU z=8L6;t>HhEO3}<;^ub)066C*5ma@p@WRKkpkw?Y(@p_x9xT-}w z`O1xjCj5@W?0X9y+$W7inGJ8qntjsvf!X)Im~G`KdJ^eUvi9XYmrBF{v%;QHTm7*zE(MN;hUT0cXF6{~P)a-HeK52CC^%f_#2BK4j z$fM%?c)iV4?Jh&&lRH`l8hzq^iSPA#YvY66hQzn;VTe2`zSrxm4UNd$UeQl@bVk_? z^^{#jqMw$8;WpFu_u8_(QM;WWOdvPnKnB?+L=xB z`FBk}ZbB~B->)$VpT8^g@j9!=Z+Ad!J$GZF4R!~WO3}>MS#vlwm=-R}m=#k$I^uVy zIp=ptSMF*#Lp{f#hV=HjKZ2v_2tD34B97UrxwvM+gttbq_ z$dyXbI=(0xiwtJR;6{)05%szJP#RS4m{nQOB-Y8$! z`g^JK8rzjK6&8@GFwGm~BUGL6wrw2u{C9A&VuHyobLK66)7DYU19;i?x}A5Bl`t1tKNjnr+Y)LluFTVca0yawXUh;fom`=YN+Qp6p>G* zXxiO5O9#YlTUoARZ=Iad9(uj?ss}QEAHJm_@~9MTJm0W?oA?;WRS(RS%M$0xrG)Qw zxiZ;38yU>{eYUi4G!ROqXqPMNRloK_l7Hg{3EC1}RlAH)mb~8NYBaJse$vShc~s=H z*Z;U&(aN~Q@Vzcq)<&LORZ=PX$7~{7cWX!4_4X`g$g_!+REp->;8x^Zp5DDh{5E#g zm^FD#SNhipO=_LhYGV)JnvI1m5I6h`va3{zW|rm`u65g<-Kdk=cHX-1pHWq*J~ONM z!X7N!eLPmCy;6iyDLRxnSFa^23cviWbv*P7yLYM6*%q+J;(7MSHy= zvP|hIB9Dqa@p|jk&CvnL!t6!_W_Ew>9rJe@Cx$Yuk0QboyOqSz;Z2;~2gY?yrXx!% z=Zd$Fys}@{bZy{Nv>&0&NJbIiiQVAh=9q+6He|*cjXX?vlaSBfY>l==G+9 z*?mPRB9Dr8(Cf`6YOlO?+IH_DZF?wlt`rfT*iB{}2hrh8oGaWlk?_t5&XumPn3Mk6 zmNpKrw{grscKlDX+Y0ii*mtkDam;ypKs@Ff%UsW_@)vw*vg>w`?+x|rl_K(~EN`uQ z?ec8}F~{K=MH%(?(w2lWIhfsVkRrm9N{bWTL|dZ0QiS)gvOTt;h&$UjEc(o~ z8w>qlMW4sY%Y7CqzYkKgE(O3~hi`C8Rlmqe~{T!Z=EP^JzlB0Q;)rD(V9HjeB*mQ+7fs#UkW-t;58 zk0nLqQIVToZ~AfFKUNf`Y-$~E56^iN_DGhGHD9aVQoSh7Ct@7+i1tqbLa7wZd%kXb z(|v7ryJITtIzpcX_QcCJ^6Uo56yZ-urD!kPII`PrDiC~^OAM*JY;9yW>ZAyN(!3|y zcBR(3c2?RCyP?8t3~foCo;UZ%;Z5|lCHRlCGylPx%$jaAd!^pe%jVS{1Y%l-@F%ne ziuSU3&g^EnbmY9Z>!6*wrTZ5;qh7YT%5JYq5&nd8rD!i3Kl;K%>A-)Q0HGYHf z?TOve-5TCTT0OQ~>J4~BxBt*In2DFhUB^ z5_ztO@WgIjbaZ$Vd49)FlR}qg+s9Q{pX)5@{O}gFc^`S4_!WN1Xj^I@-+|vhluFS$ zZ;&gyXEdRY;_YtNpZi0P9K17ayCT99yIa)J;Y}R*_Pe)DT4J5UHhA0K3ymhbDt%ry z+5G_b_PvH(NFw|RWmM5#Hrag|cYwZ%Y|xV+S1O4*KW1aclbESyz#BR2xBoZCo#JSqGkQD9%&$q*Flyi{s>OG;}d2d-C zMW^C7gL#YF#{+Qdf>J5kd2U*p-Gmu)c6sCFdnH@rxb)HMhceqxM0jHNWjZ>%iE&AG zgQU$B?wsuLzVTeS=4In~c1vZ7@F(Og@0oP8myPF}vC^J^HF^QRrRtnG2RT~jxy{wv zYnK)->D?wSVg;#Giq<)dqU^55v{$@&al2P7rsn;OYyM(7?`5-a*B zoz*gg*|l3-ZT)HY1o~Pu-;#P_NesdnMJ?T6+UK8BC_H{?pG6zx9h$90gi=v<>tgfd5-r-P(& zy(2o5=|6sV{JO%{&y9+y=i0jWkR0@~^-2-`gj9<5vPsFsILq*B+|O|<;&$G|zUzN2 zPUKy$XYWa0JFaQ;MfJs#{$lmm>w|?W;$DjrF}q5oXx{wZYJ{Qj>nnb}dKi1W-4R*p zyEK~AC==h;;-1m}0Wlv4rBbxEje7xbFY=?=ovc1`&WT%tbQUBgilPVmZ52Ooy4~Wc zREqYp&6Rosm-gn;7bKCgtBCNVGI|MbqU<#n*T2n(mS5jOt9| z7hXvFOdw9hTq%{Jdkw5F?tP8(85&nd}NYP$4AGPBAxrLW; z#(fXW?&O284|ALK-L;7GqgDd<#No8>+n-j&7hpZ8REqXFwAsCP_`1^JS-ktoAF(!w zY#iz>y=>#S<(PG)FP^su*`Kh#iuSUNqZe*Nz!}Aq=fAkGuDE9FebRl=^On^WPyWdE zMMIghtBCMqT$7?hnLg@8+&h5G@@X5pUs_i@2m8BhU8zEuZ73o<8P}xfP-YvrYof$c zzmzMNlIC6}cpUmDMT93K%hE@5coQx4uYbO-lw`B(o}N;@`@F%2Fw3n?{YDL{zHka@q?bHuNgeTY?%&a!iq0HHx(YdzpJnjJ5 z3F}&I{n$-)#XkSCb-!CXqVXI3?zM&Uad*ZW`29nv6kX{*-sn(U7(S(Y{5;lCj-bzQ z1n0-wU_D~dcD04k_-dppesNbSMSB}IyPx1Yvg7d8$mj62H!i9xUO&ow?WbGS7pIoY zTW(%mS3Gl|)#J24r`o~^KwJ)lQYre7rFF%Ru%frK25RBll2IB|`a+qrtBCNVrfd_5 z4sW9DzJJ1kQWs=0r<5FYMP2c}g2}E*pO;NaE<9yH>Ejy>;ZOKpMSIy~SFNZ^31c6( zsN_K?)1NCMJgM~h;Z5Y=J@_i@6nq`_26l>6+MUmoCHJ)^SG)gzjGYO*Rpa`{7aGVE z(lr!H(j`eMq_cOdTyYI?4M`aiDxrw0I;ZwIr!sd%rAtU6Wh$bivp1&@e?z7WWk{Kl zE-A%D|Myw%e%|-H_gd|4pAVn)InVFApLbgCde^hw;f4vRUCq<^A7=I^Riw2o*qq;O ze02K0Mf!R3bY|Uhgv60k5L|ifgw!;Xs%56msUpp`V0P>Icfaf^vm1icN7p8m;jDA) z^L$n3%J7C0?YKm*ZJ+qCA->5IYLUK=v|igj@ubRrsWZ*~3F4!3hsto#83#pQ`08Cy z8Rks=%kTPYX;&n?rAIAke=Y6mrU%An5BzONl#e?etqk|S!rt5L4g9s-=OnzPXDw-e zEvdTirhcha=Hvy*N6SoQxLw#Pidpu1$@IZ3T1Bx%z0UWEhWH{+s730Qv|igf?|Iyr zsgsXCEd3Aj#rafum=Dk1ls5>h_u!}f_48@?}l`oVVT`X;tS6>0ThOZR|xT4rxH z`&meR47{>3d}d63+Ylz3B9(ZJ8sJO)PH}qgjyt3r1jdi-B)gCk$R&?+w@<} zvz8XEXGuF#Yvy15vqh@MKia0pn|4JNX>AMEM^}^c*UbH~hq*uWx1{}O3MK7YR<>Qe z-RaEK0j8{EP7zh4)t}Azc0*gFt~s}D`k$s3)l|uEQAOIU5;FPt#pL5B(^FGLTJvFj z$olrl`TEcvPI^myTFQ9WUrXC1;VlDP&ndM3CArV%-!ne@dA?87o?7}^zBTH#?b}JH zMShpGUT?W?FHVV1mEvK?xpvI3;3yMM9$=p( z`gc15Ad#e!wxoZz?JB8fD85tuT`TuF32!m)YWaReXn!sDIiEP%Gsw6^pFYyY{I&Ex zB)nyy>wSdwza*tQ>;0CgOU9Q+_c?n@ZGDnky|yi}`I45YyYhruL`7P!ZCSA;YTXu( z^t6TA`XJ#gg-?C|OY%HV>P02DTGCQhg*hjYtRgL?yKKt%?7Cm=m_gf*w&{1w zy8%_C2VGJbc5SZD^Ha>J@6GSnn3V|RStpl=&A;9^deZm!y*&JB!@f2qH>o_l_)hzG zvmf$7b#m`a+?f5uj2WmR-F8lSxas&N5pDXCZ4OV*G_xAz`EgPA^6=M__BG=KGk`Rf z|89HH79V#?|7EkC@6+nuig5JK_H4;JKBx!}dAmt8_SL`JR?_PIPU-%2Y^st}()#r8 zwk3}G*T!uBR&{b`n`hKw)NQYmD#ACOuyuaZn)2|+Q0sh#X(8vfsFVB7v@5Devn>Qc zZo9+NFPoG}S!oWXOeVcKA{^GwmYZJNvYPxyoAjtpETI;bkEryQY+0EZ5V;^fA8zvE z;bDi`eWG#nz(dNzNtf*tjj#3E=G@G($nBRW)FM3@X}z{R+`-E_<^J=#o#UmgLA>{S zvLd`}KgmZ=*J5makVsaMmi~$@kv_Cl%J2H?V!~UPk{(5=I&%ER>}7wgliS98MQ(jc zdH9#x?R}@YmGaRNv1N7n*p1mA&AmR##4@NNy=2Ysu>aTgmxAD%J2z%08y_c|ScVc( zib_bot3GV$!bgrO(&|I#Xyr@#&HO#s%!9rH`wnjg)Mp>hxQ znU^v9`r7yN&pytCt^3*cbG^2ARBI4wk(7|uYkSvz)U;mNa_hH9WoxjY44_t2F z&;7OZ?IgU#d>@QbXlZ{ft^Kz@>el>_&&Tc?GGX6G?0Ze5nkm;kYyIEF2Z>~r>|$<8 zB%YRkP3~;Fu+W(T&`KRC4t=XVuwK5YPT4~3-lG|UZZRzfw|GVw48vj(c zW*u5du}XRarESm9>W!A!n*6&nN5T_#t_=V02J1urZhZ{;ux0jyJdvc5-_^fcAI!Pt zP<~5GLE5Xomii#!Ej?WM2f?r4i_0eF>%8ZGGvRNS+L#PSta@$xtMP`IkSEk4 z=_Re#HXmm;s#o@9!Tn)2*8!H+YwKfy*_--U^EUs!c{+>bkfU0e zK5<|{s-FBc6RvD$|8C~iK2_6ssd>{r%Di)`5AjY~eb`h@{p0qsb!Hd-d1jo*-_lYL z6{9U?mB^;s%T6`KRVGzbk*4p$p22#z-_`Ukir)0{cT~Lhp^CJ>miuGK>hH_$HSwz} z%-CmYv&yjd3_GUgsF8a0X-U;CuPv_WmiM7gH7R$N zs9xLp7;erskdwwFRceuPC#~1EKGw}&Tr(t3X#XlX)Lu<`AHB9Y@A~56noIJ8T0})! zujTKBIoI6EXhKUt?s@-rd4437RiTQsj7#|B^uKF+26W+?8}{4Ys=<^N@( zR4sjQujsyO^v_JF*HR*P+-Lvp^+AwHQzdy)LUR7_lUpOGYS=Ne1%eh562Dx#Fv$lA zs@i`)atj14B-URsGQ4L+v5(E0N2X~ZA+gsuA!S8^s&Chh2yd#tcU09=r;QR1V6ZLcUs7T%m+7txTE(RT6EhcbXFK4j$D}Q$-62iQL`WUy0YYo#;|U3kivS zF27BQSN2=ze9%HdW=-xnLy0#w?imr%u1HWNUwEg@Rif1%-UlrtWG-*xwMzWwzh6Z4 zAwEb@C0~~peW%2@2e)-~P78@XX7xbb1NHs*3*GUQ1APK5uzF(_L zk_cKz$hsnpKLo*ohpSwDkf2KD!+t#@$pd|NXUxp*JrAa9j5kmbxwjR zS(h$R5u2*hFTKvyIV~h)je90&k|+MJiT6PZ30X}Z?5PA>2??rXPmW_QNg`+=A^Ttb zQmw@A{WiE(LV~Jjhn?4zV5(>#A-jtmxlxJJFZDi1P$j$d4C~M|Usm_;?aPW560+;* z(N`(KRFR-c_Ws;wS`tAE3E7Lc`rEA$RLL&8FYmcuJ|9dKEhJ=D;IWr(ji5?)@BQ=U zB!U(aa$3P#tCTQx?(SL=RLMT;e+%>k$?f*B^&$5lEhOaB1%Kvb%`Qi~`-22kvVXgt z`y2#2HuiN+3kf-?Nl&H?g5@uq<9v{yO3%TvcP;CK77}{mRB3`LJy9!8&_Y7|`E&bB zeLQPZmPwPK%Ad6*J)HlSNz+2Y?~Y$g&_bf{+>GD*`5ul0Rem>q@lo7L>{$tg=W!IC zn?WD^Evj^{>UinWQa}`(UBj{>p}TR*@9N&zaUZmh&|SJq6IAKW!*PNZ64DdNZv3SQ zs-)+$`y@+!ENkTNC|XDq?gKgXV&7Afpo;sg`LdOfJ}o2)cU&}2PS^X8ph|a|iszgb z61oqIB~0(*p64W}@;lHJ-ygJ)kSDe76chyJspdxdB&hOx*%bSrg@lYz{GMl>b~xHS zok>uo>(b+8MGFaCv2F>DmS`cNEAK6_;9);PCP9_1w2G&S781HD-V)!;@IFXTr7L0z zeaJJ4781G|Q1emcS|SOmWOS}8HO)MkqLIE@NXV$)ugD$p+nufk`CC-!>{gqq7gv7h zQbh|1U43SWp6mQu5ecevrfgwZ$z4ke37y*#CukudZ+f~q+pJLxPjmSoL6y!HiTj|1 zguE5Y8k*7sRXXp)5|`Z4#k~*GLPBGGmUtkykE=miNND8F68E;SZ}id$wNlChzDaFLGYLUlU;pKMS9k7#xi{Go=KCSs!KY9 zSVo(DY-^XClb~wS9~E1OWza(6ob57*Wi+1oqRR&fs`}nBvM`q6%8CS4t(%N2h-HL{ zKB($-O9f&XT2_*CT1aGOjzBD9_@4gVnFLjR_pLxIgFa{>@x`$t3S${=giL~}MN29W z%UH6ynQMt8sA@aA9I=eq(|k`&3yCTHD-g?I4@ZJ3owZ=^56!vsSG15=Rj*%DnH5{>w$y2Lbeb7Qe=QCIz=IQKwkf3T(m*I$I%%0|b z&_Y6Ia#$ZNFTc+DAVJkBvxXyp6Kg6$g`Ff64Fb^ z35ho6rmS3jkf2I>rQ}!!EhMD3^RW!mu3TA>ph|jIIomB>AGDB&dhKXe`QrC;5>&}k zLeBq*`=Et{Jbm;;l)};_L6to1EaO9W*OH)0-T-_o!}y3=qWGYNguGek&OP!a&if!imAw1- z-QLXCSJ&EUAtCQOvIj`Km5`uH-oj)D5lal;)4$!3pi15oeJtaqx)WVl(LzGrCUu2t zVV#qpO5Tu@V;QuNkat{JQCXOCX;&nulJ{s?cUhXCO5W~uCa_t_+M@7{UeimJ#2Iwm zzIm$kuJ3A)77~TA3}0GyUWWb_Rg8pqz2uxesM6Jdg*lhDOM)tysiJE;3w_W+LT14D z6}g_VvtIPKsFE2s$pkGV3TIQ%2MMZV9+0jX_IfERT1aqSmM5gFNKhp+pk&@_Vd;tw zT1ZH3>byno!w@-*6v-SojYi3})RWBjk?TT&D$*L6iW9Vu&^VJNFc&9B3ki)NS;9mI z^@&qJP^FP6OB_;uhmMeQw2;uqR6HNFkkB|&oS=n-^n5ZG#}aRBoDe1#LlBS#AfjXA}Akf2KAOmTu1 z5*l+VO;DwArZ_#nq$`a;_qPquaA)#@mc&cb2p)n^*%oylK;W-jiX`CtUgBB7R zbFzf_8t(E@K;)xbqS821+y^cEU5z=FCaBUlQ=FiMgvOjo6I5xODNfKrLSs&)392;C z6enmQp)n^*m^yd$L83rq-n?ZlPTYsatRjnfSC=_Ha;;IS(gal+XDTG*9;AhY#+)pH z`91{%RT^h1^dV1YT1aTj$@y?kH4;>5oGI>u77`jkDos$Ok*PRA3ki)NxqL)DoaCGY zRT`O!`=Et{#+fW}X%iP6j7nD`TVf%hF{ii>{uWglXDTGLl}KbuEF?7MR7gn9`CA35 ze4HsxXv|711w=kdRhrPql&Cb$6ekKS_+5=TSpu^Sb0nzJI8)pQEhIGNRGOel<4kda z77`kBDos$OaVAUD-^|i8ggEc26}DRB4N*@>Z<-*#-ggL4qocOcnZ&RzeF2 zjZ761(n@F{p>d`{LVVCdLgPV}=q zN>!SmO5;p%f))}Qb1F?xrE#V>K?@0uIh7`;(l}F`poN4+sY(-6NzLjCaN9n#m554K z0LpKPKfM-0)(;l?kd{alX(4Pe1({Vy_P74WX`N`2i5>&~ZmQ2t>LT2pA`oY3{NUCTd5#9f0{a|T=DqSU5 znxIP8{8<8X?g~;xm9D|Fgo#EqP26cG9KgK-}ubY-BZbe&(EpoN64`72FOrR)4G zfjM_MT1e=cKTBZFT>(Lrtag+2gYi_+LPA#wmL{mub$)Sz781JVuQWlGuKBYB=G^6q zeaM_UQRzCrxDQ(RySnDj5@sHmdrKujm97l51m@gD^&zwI#6m*X{KZqn-=a#_`NauZ zNa&is(gany&M!{TLPA#wmL{mub$)Sz781HjurxuHuJel%w2+YAPUhT|CaBVNesO{p z61wKEG(nZF^NSO-kkB=Mr3tEZonM@wg@imsWzJn`f+}6-XNjSg_@0^;61wIu?t=tX zx@s>@&_Y622^JDE-X%emuKBY>w{JST*eeODbe&(^2Q4IY&0irQV`>sq={mnSK?@08 z^JfV&=Pv5uB-^#bEhKc6U}=IXU4v%{Gq2CRvCu+7 zR|&>_kf2Ie36>_P(lvjU!1}?0GsCE2)G!Fn>T#pH2WcS@#T@c`i1~LSxua&?o(cc; zkA0(kon>bTWcc?dlL%T! z98fVbJZO#*Z{52-YVDG95>%}jW9C`@pAt+JEhM@hJ~Hh0;noPMrgRz^Ua&TapoPTx zl_SC@Hy0C<4-!-@`f)_~iP;fIcC+)jkh_)^68-KS5x&t{iB^+rSrrphO_^clQ=47o z<34C1vHt84;T;!jjiBnbOGkvCU!%l(tFE4BbCb!@LSoGxBf^E_mDu6=_3r*4L6z>< z9nS|XBy|7w(gan0@95(CpoN6)Dj)Yjf-1iYb+HdxNUZN$5#DjS?36DA?++4Gbsbs} zw!BaY-?B0}T1d1#vLf7ef)cmi?CXOBRps3(!p;vVK_9e`Xk=De-0`UrOGX~$S_uiN zx-_W>d#_f4K4>BF#;4`scdhozmsR`Qhq!h{f~rO9%frs?m7ot=NZdBRJbdALCD?XJ zP}TO`^6cF~7U44+C>LQb>J@!|E`JjbFmqF#>^edET`jD>=5>)lNxjcMikP`Gk z3yHJ(m=iH_N;LY52aAt;C{7hPYNj zf-33xModwHsiK91^r%Z7+ZsWY?ZJ}>T1d!~;gF3=n0&Z8Cqb1wiAEf8U_#rag@ioe z=BAan{bpZQB&d=n>iFxFU|G>ZLY~xr9j!#GN!|wus$^vFkLQ%24_Zjbh@<_hTO+8F z5zh5LClR!ekdf0Jb?tf5K27peBSDpn?dG*kB4{BYBfyPmB`$u}k7P(tB_qydX196U z@4mXUaP+Dc5;BrKYOn$*%4o3R&qj~k4Am|;V4%hRFP&R%$!=kXqLO9_*O)GG77}vCVRHP61XXfcqK{v_y7WKKSwDq7 zsFE|Xef-Mw)UG~gAt5Js`}mc4;<(Z!L6w{#pB%rUg@l}WpB%p;LDk|vD-+^ZQo6K| z=(EX0YZK#FB&gcuz$(PASc9~XSZDT#PmW)aplb06Ra=N((L&<)vZ{jk)qh-lkf7>~ z%c>B+Vm@dg(d&Y${F#dK#NjA|1XaI{HoGC3(+lH011%)hmRGqm9DSOk21!uW=Ao+S zw8Xd%T1brjcU5$TUulA>Zdp?wE`DW3uWl4h3yA~fR3U!FvLZp%As?F3b@3~o_e_o! z5@X(|Li~z8NKiG;?5FSJSM)&(iK$;!Z6SU|f~w`)R3m;xAGDCT=ogcZ#P}5ns>=7M zM*NCCXdyAPe)SgOS0t#qsd+WxSM)&(i2;qP5x+8T!mgE&pz6mq)reo2e%HOF(n8`+ zld9zS6$z@Q9$k(274tz0iAJrfw-CP~LDi(R*%jEuujbG8`Jjcwx9zGCzj|+#FDnvM zEe_2Y3NC)de9%H-+oMcA6604SsA_XU^%kO0w2b}1Ud1_A3kfL&AHSNidV=%8-=a!NJvn|w3kj)BAHTZl+dW;|B|(+69v{DI`jBrW zw2+Wi>El<2e|)67qexICcR_OeiWU-bclr3$9$&uWe2}0@?&jq96)hyBm+VpJT(kuD+73-W964KlG_*K{Uu6901P$j)enkrj8Pz1muSifOqp0Ng6)hxWbmrq%UElLCuD$lGLc{EELtmAvoz_!aX(3ki8EPL5xZ zpi17`ef)|(Xd$6z&f2$$gL+Sn`Vx&A=xFxsePlBvwt#gkuLP@mT9~-3&TfNZfW^COqI;C1zYZ#Km4|A>rpUNvcv8{o;Bb z5>$;iD-$*tp+0>7lgZIS;SsF=g5^mk(MGgVxJB&b^c*vN3>d&NGaUC}~f(V&sx*q@UKT1fa=R+6eicJA+T zPJ*iCM~w`BY%KGZgxLGU+Z;g)iN4#63^$c2Q8{L|BWNMv=Ve(RJ9V@roXL@(YSNn{ z!eRZ?ht`Lb6)hzEysW$rmnsre&6+$SJZYl(D0|xNDVw8(#1~hY{Y76@Vt%VmZUjIJ z2|trdQsw_;awMqg)pbPp=WptR1T7@|Os--dB&a&8>4@<9BV_(nF+mH7^}m|gZ3B`B zT1fc0U&TI1P}S=b^Ns#t_3_B1U0h#63kg5>OMFbLGt9Ls5>(B}nmH3+st=YfEhPNh zFY(d)n8~j9AwgA>=@nszW-?=|IOnvG@N>U}*!GWKUE3u=)uVS+glAuzZeK>tlTfTPK+u398m#QxWz(Smt;Y zmo62FabB~tIlBpX{@T zw2+Xy`Pg+y1T7@|95zW+pAEmd(j`Ha^h#Y1m#A8CS&~^U{FeZ@cBUtiLU0ZwGqhT(j`Haj91bF)rT38xpqYh2^mGz zPE>-aqJ@Nv&TPz5QuX)a?Wj-2yCkTR(ctSf#Xf|fg@lYtZOpPb=On0-F>31-#Xh74 zX(1sa=h{GKY>AH>%ci>;q=kfx;cb*th@*P!>q?gdRWhC*&_sQ_+4~tc0-%M2yk*pF zuLSFZ783GKW#gifs=ZHp#-)k`Rr2n0!-?wShy~}noYO)=-mhkzqeRyY+qhno783Ff zcTY6iu($?kAt7&;t^27D=A0H1euiMN4-!<__uV8Pw2<(T+hQNIknnNXVuBVD5)ZHu z;Zg)uJ`P(<&_cq`LM%m4<>Ro$1T7@|EW}a-RXz?|Owd9?;!HLoT#BH|$6<>JT1ZHQ z%|?Vv5mfoeEeYx2Xd&U}Es~J_iUd_Ya$8K$LPFw~b`E4If+`>DEhcCo;b%IQBB-)= zn#}7fCK!$KbBfIVPHt|L5C>fNjq9(dBK_INj9;-YAwgBg{}#os5`9qRXCz6g8eV<9 zi>lE=qHB{%#IKrMF+TDkt%L+st2$RAe#Lx{plW@uO2n_WL{QbeyfPtvB`uLYsPglq ziffP-67SzrxrO)@399~q4-!=Qxmd+MXdyA6c@^SU?Pj}kmvSVi zI`fz+#IG8+obT=r5>)xwTg9oOg~a&NsPrzWnEm(Nl@kIdljdO782vDO{!e{s^euZx^_i^DnH*#d`zqJn@bffB>Igr zb0%E;>V*L>CK6Qn`Ci5OpoK)o`>M7Ozal}EpYJ6;F5T?kglQqM_K~VB#IHzDb<2}g zp^snPH_x4%l_NowpCMM9b6Q9QX0}Lj{E7rseuh}Fj{*yRx7*yREyS-#Q03>875kv2 zfS4z(JtwQR2<>#$2Rq|A$g@p7($?+=^RQY*p#Xe{uVS7}K`iDj&bnd`L?q zL6y9>CC9HwP$h4Z$?+=^R55}S1XrH%i+gg?LV{5$&4oS5Y{8Ee;RT278)h%CbFSt$ zwAZ~(9uYpYVV~&lo{*keeoIxPC*7I}XY66=LV^|&e_oIYuW6!0MYjL5mdoU5A+fk! zCfw;zCC(o4NK}JTAGDBYUOy9FmR3U3B?K)b*56YReq{E)k`f65<0EQU#ROHEc_vzW zo)Y8sujkqoEhMJ&9U1<9gA$r5DP3Af^g5{`eB%ivUTZuiN>wpI)$hBH41c>%iO0Xa z+@*>Z5M z5Sz>nO}0MX+VG9b2MMZvZ!;pSJyeNDuRYVHiWU-czN-lD@2kYx;d{9^dRjJ2EhOgMKRj%`&3^fu|Ldm^nvcKrG>=$VUu4os9|!@j(j-@%Pbtnkv(-TuUTDmH7T?p%R)Z&4*e@NEsg3v{_ME2|)`9 zDd{gdD>3*k-%3bOC2ir3>y%)sXdxjjW}An%Mo=X!^piJ~7;|G`YgY>iY5A}1*gT)} zOK!1m!cv3$Evn?+yuY~;%m*zb9uDaxix|+c}kpoNfJQ|33>V~yhDke zZ3>?_`dd`V)2_wiN;ICizw4=KAt6uEOI9nfXlf%@x+JKQr}mXUDZv_~g@lYBT6bxY zFJ1HGbUsK>C1Z&X+bPj-=(|z7lDn1`5;DSRGDwN9GlioiwUCgJ(@W!&C>|{-L6wZu zHa)5Yb508h88g22nG!Q^t#Lytbth zO}_M_a1vC>=={ZwO6>5%SXYCzkdXI;FZ(Mo;kze%&hcAR$y-Lv`AUr2e~cq&At7%v z-G?i|`k;k`yi=V&eQN|&@+R+^l-G0khi`kXDGo`(LzGrYa4%FOo$H> zRLQ$&w|T{c+#j@%koVn&FC`JQkdSxk%?pzVT1brldsRX{BvrJKXwbAO{IFrmgtkiy zi9ypx{0{_GchnylUfOwUKB)R_P30B{T1ZTMp)$Pl;$k0CgS3$7F<|8XKu~qo+atpc znPMMOy7WQSUN={6fuM!NoU={jZc>sDT1f1&uZa|Gm7r>Bv&yjdjA9>BR&77}vLZ=Ik@dcKtllYG!ZLVCNc6I4lmoE%A|g@p9MTPLXMdqb6r z;`*nc+=H}`ko!ZUxIyse=FQIw_ou0I5>&PRYD@855>zePtrGEFpRU4GQT1DyS+VZo zyVJ^T?6o)_R88q$nGoMCCaCIWc0%y+-F-$s;>JF-kf<7OzGk@iF7rWxs%x^93GrRI zqexKI$b47x@!dxI)N^kWw2usx8EKNl-OuT@~WH|Ng

(ko7(vw2M$zj@I@qRR_ai0|Hh_$w|S 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�H;7tL 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%0AmoLwkE=(!HcT{+serv03wizUkuVc2hx_Rh5|pG zl${BTL4;aB36DlshXQ-X$?gXtkcwX)g1wCDp+G_h*^|K-M5wih@EH5!+Q6r2vL}NG zq|#T-q^|C(TNnsGa;vwugfWQFT|D8@te`M(=o#6KLIhGxxgj^Qmqqr}^$P=4GjH{F zyf6k4x;rR5Mt)WpSUyJf$o{{VlVTAot_%h2|0TBJy$nPkm0EQ~d3@P6u?^3)`sx$c z38G^WEy@)HCN`2iOGF@*T8l(^^soDj$3tJ7VjhT&MRYv*QDDr0{89*{;(mO3+zq~d zH8N1ZeYXwkaQbE`^FV&Fh;fHL3_SSsPo)q@#p5w?qw?^_poicwSS^jMCh3-Go!sEX zSIT!R;v7kaaT5~)oGU~i70VU2LzcSw`-`Q4m&YaqxCL4Ibm%7OB03haYVP8|jp;Q@ zA&^QfgoH<-y(F;a&YE7XSSAjfAUu#?EaHo+76rb2|2U$%P)Pqya^ z4@AczhWs)&kh7?LDFjmK3BT~@;LZ*F>k5MBsNcR89>^~ivE+ug0&ic})#HH(q*BWP z;j!|Yw*sHm6$H<k_%o*WhU;*N=4 zzd{63sRfMi*t~5#>u_GKScl8r@yM_Nftr0Ldpr<^~iabiIG!1d0YQV66{iwoh= zWYxU^+Q0JZidPe}rw9+^7mF~^~i zF>*omz#H9`cc9dNjroG zqGJ(vFMGeu|C+BZg+MB`JQE)7w(K@NGFE%zoc91K?-3rzFBVa6-Lq{{^9sC@BLb<^ zB1w2${6%(~yXO~px#GQy0|$i%qGJ&q-?*gB!IZTgLM@s&Ekws6uKM!2HfNd%g7;+3 z9~K^nz?8iGE8bi3c<@e@5ioL|{tBjGKDNnodS|sI3Z@ z1JSXFw=eC#rdmR21n-w=nGj7c7Rp|ql*6}lVIGJ;-gGj$>av2OjI~k@K=8hwwoMG$ zRIz&%{5M@%P*2&J2O{*0p2O)CzPBe9RC!x^2_kr(Qu`R9jj26qe!*_P@2VXMr-cYi z$(S#%`>^1pw$j@X!TYT`RuD}mSQ&>33d}06L`e&H>9VH z3w_#tqQ^sRZkPumFePJlRem9K@_(ZHAcD{9RQEx&F?uk};)MAHuAOce|=6ov+L(h!UklOxl{XKn%?qE#5K6D>)+g{8V*cMAK<_ z-RYs0iCsMep9!-)CG$W8rbK=}?wcAq*RV8#&w*8kM>L)M(AoCpHSIkfYK_S}5P`g@ z98G42@~5@;+8hzydA7e6K{WZ*8a_XCUC*1my3+e~%mWdak}+40SsbdLd6SnbMDV%1 zuBi}BcCT~tL#t9`t;V(ny6!^+rbPE9IxY#V56D^#5o}+eYePiSsSMdn%+HoJC)-Tu z`V|qF5?R)`OGEu%Oz_4aBG^ts*SLr#tC!=eLiOL2wKLm(=sFw`m=e7U@ZX1_Kp;a(i?4zplyFG`e{&w=;!1=3VMa z%keke=N#TG*}9Z?AQhsqOf;*}YfuB}J`VfK5Np*WuN)$yq#Pm><(up*hZQ^Zu1&D7 zC*KK3g=n!`l$4C=N|v&h9;;}7OE+@GQdUZc>56Pu9&MHvIsM7D_I1h?QXv}o8FNo^ zXJ-xF4$GyIi>0ja5IsTKK=cxAkJ@RSoyQ3=h&&-66{5wCRNI5Bmfe$dhqn@W@sJz2 zHN3i#aaY4@XBp@6?cEG>{hMK)71Bo)BnHuPhgVXfn-)FtoK9p=AsWXD z`#|L17@PlwJP(M~X@_O(I`M5--SbWv4Oef7kV?FWmTbZ2n)g_P2&57(qS%6*s~-JlwMGO| zi5Jn5Ex79aGcgFH5-*}9Tku%Hq8J2Hi5F39LC)1X&n$_lE2P49BHQ!jneJC*jLWTZ zwkoY_?yBaEqF*j2o05LjywMf?=Jpu7D$`y4-v!Sr9o;)Q65n0#JIw7T+KL)pN$aEKfdcoO}+_w#;g;XCW)7{0I)%-CyY-Og~=VIet zby2+nL?G3a8?uAXUsBBgr4mQ|X)gObGQSH82*0|Mkm&Ncvs*COHV53i}`eShEhna3iT25V-b#V+2 zq`IpewM~9ie+)kMNv4~(u6k0g7Pnm)lPjb;c`w~J z8KvdeK)I?*x%!~ePTxo>lDifzI$#gqZ zGWP7W^J$1cDz3M-Z>vmPSCHwBId;M7Tee;sL?9Kn&GX|_CjM_(rhBrSu@|{p)*u3@ zxc$csP?>lWA+EU8*spZDJ%$HTaUW~&pvuH=KF)OAKQCBA-dGmH1F5(lH)^XgamCt9 z_v?cftcE*3i$NfjH&z)wMN@y*1CoHJWj5nJa!R}0P#rdv@(VVQt_D2 zJ73M03@53#kED`cTw!M#))i8*TxornB%G%Kq`R5!_#ZA<3Bg4%JdlcI*Dc#r!ae(5 zru$){v3LD7E`|qEv3wj}pi=a+HJR=ozg@6~ractH1F2XB&zh@}x*d)4(2)zC|8^_~ zQn8$W>}8o($eQZ?Ot1w#}m^5pOHTa)l9uJHW z-#FJm5$AfR%&p9vU&~V}5zYOFd;!$zB8ZJDZr`LxXJg~|u zhxnGLQmP!Wx%zF!Q+Bxyg3uV|j%fXsTuuG1q4UU;5nisuCtzidhxh@k?A4Wqmqx^+ z;=F6Pl*51Z&Ep~70;OMJf7Ni|frxlioUVoo5C6p}kB4}nl=cv>u!&wd^ji@At5zOD zW0*Ul^;>d9@3FXx=sh~_iM%Gi^&2S%ugSH|HM}$;9u?comqx^+;?iokl$_oearKQ6@jE8t zPJEL|+i1A(DC*tCz3T>fl_VY&r>o(@&OCvOfxg%P? zC0FzchO4iuh@Z1+UR@zt!v#SvZMgb^OFSyfq2y{SNw!Fwb( z_7>Tt;lcwE@u)am4Hq6f_T)Fle-WD3XA`_Pq$jM9Z?Qs?Z#pY#G`cYV zMo?pXKX(#?2(eG)bqVV}zx=e(D>?JPw2(?H#A^76{x2+v@W2>Eh`pC0-p{NO;ejzF z5ltp)t~UNOcD0rR5&W%GVlS)+tSdwyl~{;ruF{_UFv0_45FvKY@pvEtsl-A|dF**$ zQKaM;g9x$rO7d&B+f_v$YsoRDB%;!eL?7|xO*zr_@H`+&T8vgIvG-CQAIzTIT6thh zNkrLM%A-xIYLU7^1b-`)*wZTl+XE3uB^F|ut6|%>MM{n_h>&{$@pvEtsl-A|d2Bd! zI8t(qL4@3IP##4yntQd&vIG%GB^F}JW9NYvBjvytM94jjtNa$65UAtz66S#jq!J4; z|KAaQW zxl0k3y)rm5M_~*i`mD(bE~VW;nGLWU7=sA8^Hs7vc>X{HQuSL&9@-Wvk3SOcij)Im z5HV#*PH=IKA~aXb17i?z^xd3bnPKq|7=wuC-_8j>^=L^1w;;wK;?_5Ef)}+{#7!eZ z5m|yUh>$yY@#+c@NcHfmIl&#xl?Rp_V-T@!Bw5zgiif}$L}U%k2~Mq`h-2HPMq~-b zAVTgd#w!ORkm?h%@m%(|&Ya1a|3>CPj6sB)awq~zjxmUM=T73WTM=D*T^T6{#vnrO zcE&3QB9Ll8+nnIXTa^dq3S$uQLyMf?$j{>;Fa{B4lgY-@QG`3|#z;9Z1`%=(HeNXp zfmA!H(Jj-}$^*-RF^Cv{X-@Eym5S)_*)5UYjxmVflb_y={4Y{h7=sA82OTe0h(M|;KgY`zOP`n+?-sVCJO7((s4Fc8BVu9z zasMZ@FB)l&!ONO^waX=si2;P%GLKgdL?Bg*m1Nf$=~tL5j6uXbWO*9xyZ79l7-@5i zL4@3v*IcdXQWVie5rI^NQ?p@2wU~A^A{j6S5id{7hH;MNz!*fto|q*3_C=(ZU<@MI zl4JPYS`Ora2&C#Wm~s`7aEQPdM9l7)4RRL|7=wsjUC6>XBHKIu`e~#b7=ws4-fLI! z%7F-^+Im;^|1;xY3?dHRnhop_>}fmM{hp4xMI1H5n{9#vtO8YqLSWB8@Df`(O+r<|k!?4)>m2EwY-x z7(}qui)zc{F>7>G>q7)m4Wbj1sAl6>G(sE>iIdAY;BFuKTxJq+cNdsdxpj=MzP&|K)f@CL#i09HM&h!1*okIMt8cm>euc|}a= zS}jsnm@A}WeSXa(Mf`syM=I8@+fLBBnx4KP!UJOv!7G46?<$Y{&wq-P0})8YD}c4D z74dAhDRFrq73=fKn-ziOKpsfN`gOlNEypisH$-xUF^J$5K!sh(5TV z@ru6A>D%KXkc##B3V$h&N(DE?%@tCyew{E+%hBigcOpD61`)ghNJ!AVz60a>MS3D4 zkcw9T>6H{w_tB!b2&7_tesMKLV0$1Bq+*Ty{30#K`yHSBNXG}pAc9u__BG0*;>5*~ z83z$a#rpi;brpfRLIhH=uH89bb2a?SOCz<5F^Cv`Av^eKedY1Xst$1xNX2W0ZOMwr zed=7K4L+C3rRSMb?sG{A5y5MQXs&wCecdZZ zNd!{ynju=d)E<#uf;^ClR{+r#)b=RJ1F2YtkM{QTv)#RN@a&8+h~PCtv?o&Ejr0;k zAQi6wqP<;nRgwo%u|^)1C2P7o8R3C3h~PCtbPS$8ofPRMh(Ib{Geji=$&yH$BLb;H z5ldj)PvqJ~1X8g^9+mAQ2aSp33S$t#Ylf&yymsin5ltTvNX2W0sHA@M@hOpVAOfj) z1rVJLusslgRIHIl=kum5zloFsV-Ue>hUgsi?)=qWuDGrcfmFO^h|Zie*G9^L2&Cc_ zKy-G-av%b!SX)+2&6p%3{joosSWQ&dLkl_iq{NLy=2rqug2wpRJ>-0 z>ONQwN@Kdm<$+YZW{B$47k7)cAo4&eZ_NAeG)8 z5*~CO<@GDBD~v&e-mVb@oq0v(D2yqI2vpQ_wewGp_sYRM5W(L{#rJf2rYQp30})82 zH+v*kieMfXg9yEEB#0^dw?)cEmgmo z`O>^dU11C&_?A$QPRax83K2-9_ll$id#`;m!UJOv!MBpsiXh5?+XE3urT3VG2iY@3 zN{%sz;2T_JHfuS^W+Kuah(Id6^Cdi-=7F$NLh=~~Zmq9qyQzXvJxj#P5jQddR0 zDn`$1F$NLhv0HhJN=}JLYD6HF-XD~592wCoQgVzz1m7#XW~%bQav%b!^d_S4Ncwz7 zga^hTLOip_#;fzOGT~w$5s!*($245*$j*Mz z-7VkwlxGR3R)uIg##FI(WQfohrb4uS3y&wi*_e?=wtZXo?w%LCa-iKb zzc_aK4`~k#7eto{eXJ@zA|4gzM8hRle_nZydsl<19uIy6Do_tAeDX#kLSpCw_ zkvcpxGk6{oA=!Xxp%RnAW|a#@yOE%NQF~#{;=z{b;!GKtwz$PFKT)2g%*A z%3YNDcq>7}g~u*Jr229<9u=pn;lhLFs0^K>P$J{Jq~XGY=BNyvqvBC z4zh9QHpkw8V?x7)$A)I*-0+ivh)2cgYPj&YoZhHf`cH1gOu9|Zw&%Sr7T*avQ?m~c zo#*-6n4cP^xXVAu&3K8tEg%)5*~&Zn<7(c$5PFgAM2dU)qHy{!@=|~?I_q<~m=bvl zJ(}X4{5PE5i*DW{6{2Hp&(GA@Yn^YtHT>)<-n1)#(M7iCdld)iSL9fA@6J#%t8wQ~uU2KRHQ=u;8C$4!kqXgx5>Ic2o!;j({bNdaJ@t~=1v!yBm3WGb zXV7$y{<8hf)M|O*Bh(&9h3KIx>AW^_pR?+TgVwLD1{dB>wTt^=xT}WuE+dk`VadSb zTyL!62``=x(>w0&R;SvzbZ0q@L8L-7ONQueS#$V+lXFeWaF9ygg3ihHZYY)(&+CmD zaqfV#?NrO~cxrQ`LNwL_Sy@oO-E>!7=OES9nfW=9d$gE$JWDs`$IP8h$N6=gdx-~9 zAsWj>zFr=9s&L_%gVreOB|P7$-J5t@sN&t|M>{!VihBa+>8kZG_CEAKKwh9)?Xrd+NU(+w0;v#03eoFE<-kqv;=~o!fmV~9D%9q9R~yd_ z@Yc7ND@${QREWkC0lFbOah)^!_z)+D+GF=*lDqzmZnPXgy8~L2zrN0Su>4Txn%{f6 zNQLOv$*XJhHu-|4i>$V9&2(<0l4E}H#02lV(`m+yi>$nvGoAY>S4f3uEFWpbBoDj& zHzmWS8HdNYTBUOjS05QX3ZnMy&sN&+V9yOv+rC_ zS7e{eQFyL~{&I{N)G)(p=xlY?9PjC344&PgzZ_#OzAnQWJa4PhhUyBb5RLrkrg!UI zPSq>RSTk9+lRZqNx06kY%38FoC*N(Yb~)D^O|YKi-VRiV<`EqA;?bTM6{7L9m;4U?dBCc8SIdlzRC2V~`v1MEtSUNSZA?zdC`)4ysSu5pTr>u| z)V12&x6`Uk2(%ZKcCO-i)ew(Iq|bRiImQmDYt8Px)4GjHj#P-|z7Vz9CYhK%zEY8s zM*RxC4zV26vwx9^>Yt&C$h4Q<>TWB{I%SD8Y?+`}&Zxzvl#}E7cWJAsXi^dhzz; zLFbDWgA2#dh(gT*brG~YG^QVE;D1*x<6J|z;&OxeO zq(U@m9Mlu*3@+SEy}dE@_L6>_bbO%A4C!z~2NdoP&7d}e~PEhXfPq>>{QqGQ)lJ!@uIS?_JNQYlv`Wn{*YwINC+W9na& zVV#(`)yk%xh*XH?IVyUOCBNw+XYHJsUQa|F2ge=iM8KgLP#;UoBYNBE5*mMBEt+W!q1r_%L^F@5zokp(uCp4vHN?4@ zc%Ww+w3$F3IkaLKxz4IuZ>aMUwFgomnl;X-l|^yuMV2#Trd5#;ECI9}tovv=SV}~5 zMJ2bip z5^hjkC$;BJ>qhEVysp(d7_zRFc@Xa#(Kzp4*ZJ+ioz?&v=SYQUSqbaRIih~Z8qj}& zGlWJh);sFBsQXec352ZWk4|uoQ8|zb(b!JLG@Lur=~;J?mEq3@x@Uns1A7e3A1}{z z_BA7fKjUai@m!*4oY4L1gQ{> z`Xfo|s%69bc8|7sKT&jpM6!n=Kf>h2zVKLLFzbffBi|ezi$E$w>o=o~Ia7IsRoH&A zb%x4;J&xNzJ)>a{HRg}YS6B`2oopo%0;v$q?G(M$NIQ29?c8PX&K>HtsH>w6Z%ogc zd!1p;w`QbMT_F{sQ4c2nqA$<1GOk}_-A}TeXJ>6S9Cx^{MZKLy?9VqXvT9RrM=C_) zcr@mvVH2GCtwPoVlq=jrVo9yu*I2ekZ#5PUn&AAK6tapaS4f3u+?g`w^uV1?zdP$% z-H8Y8O`>+sGpeo`sAoK}(|P;7y4EI=yGVs-+{^T49E)Zgi)S3%Df<8Y!~Hj8f;FH{ z$f`x-1E~;=JB7x~tx?7*-)5I{3G>M3wZ3>|M@ml5j|cXdE}j z{E!xM)(@Cq9VQ;E`)H3tZ4$Li+F_|5a!C4EEPap)(X1_L&o}11gAX~*znh#}2!WnF z(E=NHKgo;vr(3NT52QQyQhT7EGqj*Xk7>rtdUdNcuuX<@f_e#3AsVgejHz_`pff&Y zaC&u;iKv&L-WIFL+?~J9>bqcwl}@$G(o*$yZ&vd)a+au3Eqvq9b=HGd47DndY)2|Y z^E?>U^hej&?94pzkkg$?j(cG|Qgyb(y)%02*KBr@{(Q)(OOgSp5RJPO#%#EBYsUV1 zd!4_C2lgLaHR5WL+WgR#j5!teI(4W8kqXh+-;CM1zh(Fb+KYRh`W5c6qLnx9$r_XY zSW5Wv;|H8usjiR;(WsXiGx7PB;qJ8$IxUXGB9JOp->uhlm-TA-GEN_^E2?+Z!spX| znQGzaC69KUX^*UOQGzpodI?e?8qZtEO61Tc>)WOeI}@m`u#cj?gL)A8fvmCF(l$pb zL}Q;erYJ8ZWAX0?tQJ%bUUTZrTUm3;nTM=WWp9yo4PI`UQGE7*)r!i2REXwPYV@A) z?_GCVKfF`d;nO9o6C6c2x;(jSk=%7y?jjYUu@1d?(9wAiwN#WJC|8WxU1^0=xASDn zp>iM6CNKr*6<7p&!$LGxUk8o`S(NC15~?6g=k!>8`G^< zJv*UDe4fd>5;Z){Lf(I1>n(k)LcU`W@u*m{&~VW*{`sYyeTQ$!A#WvA_jt(L43e&X z3!=kM?d)MsizSD~a83}d-=h26-}PH-5c#KKZAsoMk#fkpBEmz%1<{2N1AIh0D$a?9 zORiq%*~Q-4Ts)Y`TM1GQew*RM*VRQk^S=c#yI&XkWJ5t96{7W9a&`6khE`&p`0JB* zaHJgaUX7GP!v*o++J@FsJ|Z3!=S0ILSM$r&Jjy`-0f8U<|gVh6@iw#G~SLHC%X1ZC=ivNq*?K&E;(usVjMdMarS!!UGZU zs5o5>7amvM^Md{Qgg&0-nY_m!Z7%OLRP)+g!-YqMJ72Je6$m086{oA=!lU4h7wm&h zAB)SuF=J0u^~MLMyJme=kB5c}5BKgD>_4&u5s!+~)o|f4|FiCPdJnOn(;mk$@*aou zT@4o=#o_MuGtUVk9u=a6$Hz7AvG1rRHeNb9IR<;ah6@iw#G^vA@Hp|=D7*fljh>&o zTi?$LrcJ5l)m7)ES;0eLX%GD_jnEk8j%fXsTy?&&uidEAw_clT$vG`~S48Sc!v%2{ zA#U;!@u(0jxw`)Cr|j+R#gnHZIELR9shTD{G+cNb%6rQGrpGGhv0aa(#-mbnH9`xI zL%SMU)u)W`R*)lHh)2cgYPj&&QYpi^& zkyvYyuP)DUwtlqLIzT!#QXv|5cWAGVb|pdq@ijSRNtWm5in-$`(r?MtBZTN#wOq`o zH*ZzS~^Zw7(IN4sP?0J{AN@AEn~@(Qv7&F&F1$1js_@ z0_*Ld*UGv^Y>H41rq#rKc^Pxh?X&J8tq-XX&1;{iua|qzBsh72UDg>YIo1j8*5NK* z#1_Y5TO6c9G}a;Q4qm$7>T-5UxHTbgZxXGv(0YsBAN+HlRd{+zxH_$bkqXhc<7v#x zw@$WtR$Ji=qmtu!4c<6J@9$*Y)?up19jOq_tD>kEk5ku&tX@w~u$oY=aQ6(?8}t3lmf<6`j=G-u6^j@>U$JLiFZG>Zb*vk5noye~6{4}7jCu32{nmumc^QjnHb845?j>qD zfYwRI%=vqtwS{aAj?(%ZsSu6l!^TXiRW{>ifA3XgyC<(`_Q^adGpFvP$~dRp+KiIB zwLG2?t=}@v$>z>cn>*Y$#GPi`fu=pnfs>sb*RQbdI!cln_M;Jv`;5j6s9DBZkg?19 znq)iga;WUX^K97(5&1}`$Yf`bpSsH$NxcNA5RK>D#x%cdYew&D_gV=gOHj&Sx+s;5 z*?D?PM#FM@tqMHO*N7z$zZryRg3uV| zj%fXsT-D#VCA_`vUgt}yU6K0oJ_cGbqQ#~$4X)c7o_y6_XB_n_q(U@WH+t5%mRjSY zv_!iVl&<7SCu^&9ERbQnNc{?_5RLXMwA%XTA*;x2wzg8P&^i)NNn=k&M^@hJ7_vhi zPLdk!5b*?@Pcx!7i>uYy>+DR~8ZJk5g;a><{TbcSBi|wwM?1%QH*$Y1m+BS+C)cITIC6Wu>5 zq`KccmlOQ?dr3>)CYSn=x6rk&jvv_WWHm{2Z~ZUDMJhy3>Yo!Fa71&}poME)`cabG zluACMe|98B_ZB!OeV)$_KK!>LKCACq53WseXO~HJkqXhV`wUfoOt!bZmgl@nh;>l! zy3S-C=W5X%_g2cI&acV#d)@P#%!`SK_ll>iybz7;M5i*%J3HkAP2H!ccCk0eo8D4C z*n8-#=-SRsuw_%X?PaMhQX#s0|HF zJF_FMly74$pVz{!{Qa?v4(C%`q(ZbxIBD~0kAw>+{+8m-ppq{ne=Aj533r*1r5y71 zwzm1Ili|YPp%nLH>Lo~35?#5qmZSEG?bg7$iSFD>Qr$=B^j`ZFwi>o3oxbkeZjHJ= z(H%pzi&Til9adv{cgwT>+n4N)r+&3^0=-RLPPpqnC6{*4o7s`^Z_E_~^Q>17CA+WF zs6{G7$L?8fKl7)v+e~sgUi5$+wT{-;nRsRxE3b}|uVUx1QFJEUvgK$i^T|f;XJu1e zO3+@OtUh zI8xtma_GflZNU|Di=44%E4mi7IZ`1SN3by`_a4jGHl>BzgxY+*L$(;rq;`2te&C>_ zJN|1LQ7yI2D|~h=Bl+zX?gVN;C@4+c4dd`VBO_X4&6QF z7F>B>cBFj9JUzVF8d4|0?Ls_ar~s||qSD(pUGF;WRwcQ&Q#nvBP01#CK1FhZa*STi zy47`VS()T+As$GD=yi|ffV`T0TXTE(lw|9EDhKWx;z+G>In~u4RsGqZR>$Ucuy?XG zjCu)DAsR=pF~jO6+V>vcZtbKI#j^d=gH^nJDwgei`$@Vy8~jSIrSVKeHeNIvq<^>F zdY2GLg=n4)zM_}Rq^=ehZW+uJhx^hjCQ$S-7XD{5F?rBk7%}_}_`DjJ^5qd55Mye~MLNv~HWOFwp&v|W6 zvU`*e&)%C8kqkKN*Ls2M*8JQWlS7D+`;*e&QJ7uZzbY^REQp5gRHmwkw$lZw&Z368>G00i3g4~UJ0E)?2p0S zQ3+0GHx(vj%)Tzg{fT8eQo%^Yu}N#3;_5^D3RK*V3E16=+1E>|?EX(he!d*=2OoCNd8$Y1-LpKyz&_ zA&?5uC@YP*G{4B|cC4bipJxM*88~O)Tw=^^%Zsc9Bt<(?Igkp`C}T+9eJa`dn_93L zwIJpfr5Z{*8nw?QTaQsMxs6&7sSu6jqZ=aw8`$^7gy=&XL8n-6qr%QCi}-L+NTv_?>*G0wEeu?IIPT zaXiv(z+)-)9X~kfC#jd{>W;Yw%FwFVn~^)LTSMPB-=XE`c09#?d`~$2T|yugqID-# z$}#@aW8v#*R+~r&9GwqW&56u|IGX8o`7_7D_VgBRcalCxh3JLl$@gbu=Ip$rwq5Jx zd}|-|T^u>AvA#81+8IY0={|F7+dDqZw+2&PAr+!otG(lHZS%!-6WoSlik)$!Gpwh( zRw`eA`Z_0ggd`4^wlTfg@bH!LO|qm`g8S*q#m*hX1E~=G?4+E?tWCR|Z%=Vn_^;QY zCaiLh*UK6%Yv;cRvD`<*qvBj?xU>ha%fB;~T$?nq=$dovy6Anyk{a3Bx(RmAr;4ov zs$JF%wl0vFlV_Q?0#duIeN0c*5p`>w1iQhoVrwq7AW|WkXQCeKB_(5gJ<%$uCwkhl zuNy`!*T>TA{P!i3!tar!KFE?9dIM_S*n5mw^L=hOf$k$$qEU-fh(?W^=2~j+?$s0A zT{NF#OQCLvEo)4*amCIbgqTisg;a<}osn!m=(Y5v^*UQa34u}u^&ON-v|>qbYR{|R z*`gcLE>a;H^&n&XJsIz$8l|X8PVP$@9vVSU(#^tS6h>++Rc;1KLf5mbY|dm zHC%XnMTnL@A|4f|tKq_fdWog03G5lzccWHl+)IMwRi%x8S0Cqdox?dN8ZNn-^4Z3W zEM8hRlG|nv@=kcgGCmJrf zD!A{IHG%xraPCmERBe*e)o|evCd4=&5s!+~)o|f4=YdsLci+zha@W-sr>o(@V?H6e z`G|N_oUVoo4}UM*D@V-Q+1JiET@4o={$99;z_wK?PFKT)$F$E!xsPAI(c2gO;rd+f zWR%l7*f`hQ7iB8_79O{380CKYf*>@8sSvH-!h@_VT(z=zzfNw%vSLsJ;^A9d=(q47 zD+^bxEHsAGLbQGhk1gcYXmabaUO6;ZoYs^ZawDgt`Yk-ZCd5P^p)s5mqV-#N{6#$^ zq4O#46nRR8TyKWtv_3Y(!`E0fToC^f;;(xJ5swPdk}Eo+cj=7Y<1zi}Tu<}j7%Z)R zmqus|b4Rp(ORfgKIl}$>n4E2EOL1CQ(;6;_0fe~txFF(DAzE_f_Y&{inbT4W5w20S z9MN#$;rB!j5s!+~)o|fK7DBFC2yw|TzEZ3=IEQ*Ztl`3gEQDOO5Q;~o}JX3 zJRaH`I0kD$!=)Tedv&p|Y9@$yREQQHzFy+-U~QsiTd6D7MKYU6IrLk2_^(k0V>m5D>$mVAn^ae=Saog5Y2lhfzl8@PG=|ecw0;YZ2RC(h58oknmfq}~ zFY^b_;R7egnU01F;yyzB;UnTvd9~o9C0D+_>(v$OgZE!1ZO%F_pAU1o`Yi}w-}Mk0 z!&HdYZ^_jOk~}?00xOR^A>D?TMTgQt7ww@U6UK za>Z#OTEB&dZyoI+bY|hSaHQ(D@bImpJ%q+^T8P$f;qmZeUEKVD*oAA`a#{=j%<(MA znM%Kf$Ag6Uz(;5dQz2Tvg$G%fx@uvHxf)=~wzKJbIIN${#wdaz^fbBvoTL zEkvU(LA&QkRb5?k;;D?DM{v3tE<8x?y1M3!N5%X!T*^V#xUO2`YOXjf?D_gFJjfc? zRcl<0;j|E~-@=1t99J!uhaJfY{`I?zL9A&FFO7&t#W~S%$yK$1_1y7$<)#JhOkn+J zxFG0mhO2io;!$x1w#}pmFZ#Z4TT?)sqcQSHpz|jdMqDbHt+~ISHp$Ju*T)wfqne@2L9&H}_xbUHvtatNG>kz6-sU3Ps8yNv<^Nr9&R1HRhB1hUz2`NY>gvVg z7o1P#nF5SK1m1}yKVDSwk5652Ds5hrhB1i1du+7koSA9Ab-i)ziD%Ye3?gE0xRw1h z)4p%}1t&akRvN}20`KjUwc)%>yJH>W-t*1WH5h{kw2h=Qudg!gg2fk{Nw+_ghB1hU zwVM2!dV9_V>4_MFh}e7EqnBseUzL&GjxmUce)9`1v~%a^&K=4nJYCRm8MU-?=jhH| zJSrZk8ZM)@@tP#N<1Mc9vVYFG`W`uv=5+$!S7R!)tTHB{Fv+gj&~*mVSrJn4*^Q#T z^#|#w!eev86#KPTax>b|o<3UX;Hec__0TC(JR<$ulqA#o?4jy{e~Vcb!PFTOSM;uAm)yPD`l}t$P_#j+^sq+b2fkJBI9*(9Q}= zi?v`(0i9q~bn>0csT@d!Xx;-*9o{=*;oWoZjK!1f{<%t2KI$ou>|fJO3z55?W*MJK zC8{EPx$7aM$8k)obdL2W*OONog9w&< zQO|h3+_hNlVhkc;Z>;-r*LvWk8`fY9B3Ob)JxBU-*CM&Q24fHr>!Y#4(oDNT1!EV^ zJmbwD>dz7pJQKA(T+Oem|CVLiOUoL2LHAi}Fa{B^HmR?y$h6BO7<xmeH2-XbLmnPjm7rE>8c8ozp z^xJzmD=Eu+5rN;%9K0DgHmkMFdju zchr72iW%c#3?i=jFefta(!Ght21jZaV@e{_>WTc3{ZT2>uMolCN>z*WUA4c9=85YH z5lF?~YRgR;*{w$+xxyGk-2YAvSa}cLza#R_55|;4L@fcY9Qj#X1f!LTtvb{iB3ce^ z59EPVXa{0UUgo`#y22PluoXen$|A~z-bw+B6r@7C17lX+b(Pn5Iae4HgCKj@|E^F= z4&)Jo0IFDfhT5I$MR|a2EmLW_Y$?0@TovEWGKL2rkSf-;77-YO2(&ge=CzlDkr9P4 zB@uTX(_A@+ANZL0a8E=8e=8MRR`uAW2+S2CkP2toH;yXA|#e#Py92>wm>rKt3<9WPZKL+4 z-5qH`jNxxhmsc5!XO-l^?STlS;_v7!h{21T$f(5_M2sinV=%E2v&F^FIbV;zq=0!4}<0;$j@*_b0qsgYb^ z3?leuM^s+z`EaS%6FFCiKq|ZoLN{4Y&y0*gj6nq3=||;mv?OC7BYhWR5W%;EbiRs~f^&rkq>8;)L^Efkt}q4>Y!@DX zK1T#n#afbg|28QyJ}?FmY*nuMLu@$^fmCRRPF5&0%13x$ObjB%iZ#lGS`aMa(bg4j z-O!2qtw*Cg;6@E1&>q&9G_D%z7;gQ~s2&9VL>-%A$@y0pl3S$rvYqPE8;J%9pq>9}mqZLaeR~Ul` zwEm8AU>=A-D%@eCo8Gg&iHr}7K}76*gD96VF?)ST#oy8O;O_iuyj3dK6~-VU)<#%) zltdsEe@EA~?eE&`wFj3RV-SJX#>#>J$0Cr5zoYB(DZibJv^mBg0&jB}bGFKNk&+_< zsbX(h+}A)}0q2rq3?gE8gg+bjv$sCy9Tr3&72eYzFM{LKyj*d~F$NL1w@f#x>Zf`8 zKIe!BB9JO}57{JT1-Nc`rwC&Zf&0mH($F-;zBo5Gd?(#xMFid}LEgr6YLsI4FFPsR zhVC>V6{2zf+L%2lP3_ZkD>t8R17dry&6QdLV(&5L)r_Y0zy_V2Bg6x#5Y0ATY_}+T z;f;1A+aq7jv&z%0U$kPw-j1V-%5gN=o=dk`f4z|6jSs!sgXoiR7s!}Z--gpi9Z7K~ zkkvhEeXKKP9+k6A)E{XD`CK^tB)v`6i1zf63emAv#WlK}a)z%L3v4`>#gk(VmopZ! zbaK=JJ02C+kA_QKz16Kz`lz$iZxAd*WBLRe*MX0XA6}BsSu4flxW5| zS6j_z%#=6=@F?XB|aP}eVze5%68Y_yd%5-9aRESplD=9~Bx-s%>zhdVHLf{<5 zb}M?j2Ioh56RCcJUHPSAX9u-8QX!i8MepNunAyi6KNH?5GTwa@ zVe>eQN5y&9a484fHwf!}1GFi?Q+5p(9*BrX#p!Ce@ObUc=JxGR&~4d^Q|)@!P73av zCa>_-x@b~xmQ_8-FXU}*I4L;eP6;O&(y6&!I5OGlN^j~R6{5@jof|woPSD1DR6oTY z>*QuEE|+SXrjsHs{q?Lc$$PDrc@#FE1n>5JdVPxh?nk*9pHQxl3ektlP6~GWtD2WX zW15m=7=A-%Ys*Ec_Em|Kf}j5)`Nf=I4#`>|wWYqw8BO z?Bf@XWmF&p)_Y88p$_TXfbI_#|9dRsEaeKR5RL6b-dfI7v^UWW%{BD$;;?zS!N>X~ zdF5#Mc5d)}ljP-OZb5Ev=#3I?%s;p|k%xq!5OD%|0h@MKm{1fI0 zn!HWZE$p)gw_86@U15IrFUt*n{khcWjxD*tQKzJx=v1abqJ96b+pSr|1E~;=<)e2@ zsCLKwcPzZfuidV@t9p6o+O7RcRe5KU+T*_M{;H$Afu?siJV}C(OQlbJ@Txs`;zT`lq;k{^e1a`f@2@jF_<(g+4_+BRvPto9M6wG zPj3`W5GsD5`-Lsa;}Fd@sibK7Wg^GuyHnq4bz zz5a8Pgv;Bq&B)54^W1RZFT{gq7NtTo&nv0*b^fSNw|>_z%C~BfOvFBlqX zNQG$b(}9YTk}y5mBKapom`z6`^%kS+oW(ar8JC6^2Roj@pBy+cummBht;*BURA&(VB zW0~kRs3R%%m;V)}KSMlF$HAT$+jloo-<>!&oZgY@3aJnsqZ65Xf81_0PEK?iGY@Df zmOlEjIkv1ZzPxf-ULh5tSzfK%r|nVYmt=cXuRP}~;=wacna$E3*akdD&3a$kqX*4V z$-VQO>NKK|3eng$}@UW!$zv#yO5=df|v>o1{bAoexNgA{CBp)=Mhw&@p&^e?|BGbwySV zt<~7pS#Q7NDKgtSt7jTx-Z@jz-TZEm^)cOXM=C_)`7r5;jZ)k%-^~s8B?Q`j;4MSF zKPan-p4X?i+g{BLlg{8G6{69?gLXfNNA>x+89Qi2&j|G+j20=(gFOlgk7IRG+|w`R zW;7=2Hl#u{+L{;>AWu_c_9ojWsIK%z1*e6(=eS!>qjo@^wV7tlPLwO8LUim+i|1D4 zTd&NlZGS|285o1R=a>?Clv|u{wOd@<9!flr3ekA8hju?^w{UY?9naWKdop-u6ibV> zKt9j%TDW}=9LtzPD`BKUG}_G2N_a%EwSaV!J7_Nh?|;sXn~gwdP))>RF4ZO$nmWs>7HJ^0l;dO1{&Ca)nke zcy|TwY|xv<`L*3fqw<}`)Ju>G(P*hcFZZ6x4fnV%#eRZD6tCPP{=4B+m-hhF2Rcd7 z#7W`rNiL2cD^@(CjX}e?DtVzL-#*{h?QC5j>rcKDqrPdX&>XH7RD8dd{r5|I{FT+3pOd_1fQ5S9}veZ!)6I1mFMA+lO=>MTn(0B-#V01(6ET zXg@*klGSsqpFd2pZ|1$e+vPSO=NC_xaHP?_-Da+JjO>K(rZI?Ah>pEQx8jcGuGKHu z+C+U9>jXy;jxJ*+v~BMGxh>gp$?peJAsXwDX0@iB9rCwiv%e+YL(*GqXq~{;(R}kw z+T-sVJ3A{{Hnk^Fzd|ZRquqfqLr7n^`S5n}c&en^q>-dDIh;3em`$c5!H@_6oAVW^Zq3Pl+Nr{?bUv|sWF`}YCcQ}i={HA1g#{;#?FBfdYU)==g=n1H$?|M)o>TO5vK^xK;Cmi?TbA1#M=FkBdJB70 zo>P-n6g#Q6BNd|2dW+r-|F)r{uX*Tv$9vwqW3GKnzy1AoKxho-3eoy4(x>}>qns;g z$F>%g1LZ5`1aoN2T_;C5<;nZ-*K{idsSu6w*n68JtZ#GZjLiAPoancd)fJO6KA_t# z+)MbRO7#-7LPD!2I`cY|n{g#+GAu=r3eoHfDXPiz+jT5_XhsXWJ@LSjqjej$tT7M& zb1b}oc5Hv3F^E)%MxBT(;^iF2v%1%`xZZK*)Nj9E$vKXP&={_FMC-S-$6WGXdgmRk za}V`))b4P8MQxCL_LINmo9esHRMz2O7DhDAyT()*(8ztO)@W-u@!ZuU5Fx1ZI zZP_7>-1W;wS$9*LBNd|2Mx5SioLKA}ptZqL;=y++*=q!s5G5x{R622gzSyZth(h1z znc5r2puv_m;FCWBfB=ujDFUxwNRs=(p6Be46%w}6_OF}I%^WqsYdk$oSP9H|hEdk)k~4ko*Ep38Hlk!;7_fa^@`J>-G^r)2lG z*YljIR98raXk35N3GZ{^!uzS@Ur@=huFx7ccE-8CRk&~v?OPU7Igkp`v9;@aTkv|K z>gU`?aSf>7(szAt3m!saxW^${zojSoH}5@!&fA<8_Hg|c9{$aH51}!f7NYfAc#!87 zS3S4rh~l&`C;BZs_B1Q!E_+gZy=V-lg=qa29)Hd+a(a?R_C2*AmK<+EphP9x!FP+C zAIZ{U0m%}iLNuPjPd|r|ff7SGaG8E3eqK+K)$5 z+<7Z$hn^%HQXv}m8R_K{@++d=VRXjfI>DZy-%?kI&={^0MC-TIRR*0>FRznmpQIMV z9SGFbamRvgRQ<5sdXKz}|3IS_sSu4iyfIyy_jT2~nARxg7u!I;r5xm4%vJAV8pHWT zw0=uD$mf}>Uea_;#%ZCRpy8zv@u(0jx!U%9J9n7xp-DAXj=^*_TzF*dY3H{0Jv7Cm zLbUK8e`K!uBh!*|4C+++T^gY=%pKACExGbNw|LS=^>a=O^RD5g5%H)HExGbNYw*+kmdV4XC>~oEFLt4HpD^z+9)V34)(Y zr9!miicWZ4wSc(4Tvo(ZWq1{`HuG&J+FzFyv1g%^(ZVG67P7LSa~vC~5S{YJM6j}` zOKK+fX()Xa{YC0+2SA-qF=p+ ze6B~VkPiKIEPRUWqh=D1*XLwMY>I}B&5qa!;r^t?4y(GMs6|s{UFgGh= zC-Z1H3#?u`(HZBRbk_MC^IR( zT&r>@$?i)fM=C_~+3o8!w07zA)uq!{i%(y%$Kklc9!e`n-U}zhF5-byh{o|~%=*5K z+;7Qt@J=enOWP(!YzMI~UHs=numrq~5WOpmwpI`VsSu5QjBYRYO?LK?MJ~NDVq>q~ zOx_UH76(TG?O*jvcCIBmuTIqFNQLMh?#~A6o%^p&aF2{CwmQ)H`MSHaB6e0dwtwrF z6|u!4|338-++oibTklcrA{C->%p3E}`$blr;}z{!spM#9g;rW@!=kodbW%+=EN>pJ zXw!bXXZ51CT!==yEMu}i$hTU)TiaeoB}W@5>>1c&jA{06zV+RL+V(y|AQhs~W{UR0 z%TCIeOIGm*Y1F=7neOEK;~cFR(Yn!?-}dEZj3X~JL#SUN6{4@dA_pYHz-vZZt4X#m zqc+F!j8F~r^%c@k`=Lg)0u2T-uQJI&fmr$A|4f6h-kQ2i)^6PUD#jU zp;YU!G0T%(oUVookA63lb9eNX^A5d1_{>dz3g>KN>DP5D|}x)75a{aof}p?hgyam-l1KCwjK>oL1xf zi4j|O4KIy|M}=s~)mid;Uf%bVZta`s*$8tCYI^!z8lf@F9ntzNxw?#QC)AwQ$MadE z8Vjd|dDn13R3}9Hse*_{g=ooDT9;MM%4y;iJsjn#|&CHF>+TzzoUr0w+KRGxP*w- zZz*}5!@1$M^zz9&lq;6Vm42!0ac3>_mm3~gk52SyFC3{5&AR9- zze-Bv0kKwR=Mu6Q*+qM=JUZK!krMKngDpO}epve$ez)>?xpik}BI(s*X)gn*5Y27g zy{6XH`Xd$Hap5B8G$B}<=-MyQD+lXsY&FL`SoN&0;t?@eeg;S!=G(r+pG zJVGpeUl1C@{Rh$dE&XcnH3{z5BZ{3cm7L{ksD;!bwgKyjSM=5P7)5&G*8_{4p``L7 z6{4|i$dco_M0djX+ntYTuMb;_HFCDO|q#3i8ZlsKv+QL0TBMPYy%{u()KXeS<)HBZ-Me^z#)h_FUDzDUX znaiQpty1!qPvu#42vL#BfmDcATW3a-y$_xAof%o|{6#$YR)V%U-&W9Z$9EcZY?5S1 zPO!()8R2bQa-c#q-)V^Ul71t@g&)u!?*M8KlsGtwaCFh#rTui8L3_MQC|5{@Xx346 z1e5nYI_La=`fpF_B|Ou!tvuHW_SeJXvpm~+Df!r8#ZLVO3GNvx2T~y#`>`?BQ_0SE zcQ*e&!p=KBit79OBZS@|R1pv&y-Qt57P%M^5osbKHb6iGLqo=rv*~=snCpc+ODI&_y5sf#91jdT_riH)zm7-Cb>}lar+Sfg zT6j=}G{%Wq$PGLhZg+VP&!u9i=6*k~9_Q!cTVNP_X$Qnn8p9exp+XhX+(PD+>$)U{ zoXyHuR;84O*3f&xeQSXk3xwT7qTGM(TR3VLVqMi4jg@om!)E!8v%R5oz&EXLb z`7ZHDh@O<2`-tE^vXotXi}3BDks`XqHL_BWXEVhdRY;?6n$<5B z71o~C8}OP`?lsC+7;6KpB@Clb`KYj5G$X!^-da>4&3#U34H!mOTEUu0EsZxRtz>0C zr-`iW=h(_#0G(Eoi0DFl0Ui^9Dx_sEfKDseH{p?85d17mQA}yW`1WL0*q8LxQ517j zAuanRw2yMP3pq2FpU)^w1lE1Bnx9p&;$O#O8jWMjS$RI=G|i==3Tdn>4P#VJa%fDo zCZ3w~eqj59M-Ze9$KwpX7Fo%Y$)Sg9Ht{s$QUWTZvAsh3IcaZSH5yq$jnJ z$X*go6D%26VrU$W#`Ei>miLUJc%TYt*>9rLYALOfEkOIDN{|oP6U9DcM-8iF*Nx7P zlQi1ZW8KOOzSA33NXz~x?c;y9uZFIj)7bNv2rNHXt6^+{BudVRaT&_Pk0x7Hs2S ziegIBJ&KE0hQ-mIpKHuWI7$*i^aCNmlN!U|Gaa>*IZuq(KyY_*Eor<3; zziS^~pL@+ysK35<2}>M?P=43Me7a*~`{$alQ(-FTPz@YEAfsfb2s5p4q!Hh3`CSte z;|65B=q2n_91{6mhw2vH%kf<;J%28#$j`!2Jo#M{M?ZbfGuL}_mYoV|9ja5`jB!@| zySh0W?zivXyNl9P!H!DmI|G4jDx~Fa?SsZFoib+0-y%8J0NV-jw~j}teV;f#4c9lz ziG`nqwEV4oT<93#oH=K}Gx3lU3s~hJDkSVw91{86N?oUf+3XOb*N_03_#un zItT4kNNXST4m#x>{J{Q`CW&K#&?}E zzKiE#V9AibHL;_{XU=h->k(nGuy>^8ZyhSCshv_&%WKPqPs@T_Z;SzG3-KUA4u4#__^}C_7R%BJM<-QO9tnDu`J2&+6T3L zLZ$6vr{d?z@7f2It57LdSQ_xT^1Jpy-e^AGhnI4Hm>}x zebh)C5SHO3>{R?*`Ca><8D6K%31f-F`a^!#KE@8L>Rj@-o<+7(@pI*O?W2Fq&zx%p z{BC}0xfYePH@LRrb07G*^0y{h)cMS*dTBx|tU_A;)}ivY0G{!|Ur|2M18GfoTNx%{ zr{a*v?>bc8lIY>G%Oy_E_u%qsjf;DK*FKQ2Q}J`%6M7Cd9(tk(R%8sAwL?N%J_*e9y6U=Kpo3c^oIrRG~0 zg|v=`w-p}7`N28ZFPA>&j@!6=Mjt;{{(hDai|HL`d6Ev5w_KTJS1kN2ES2)RCcNd! zBrm0igi}T)q*cTgZh7+=g#29jUHgck{(sU;J(gjoLR$Nv^$bo~&mb{J6+c&= zqzPKj;FR?YVqq21^0y9^nGbYwEC1`e6)ifmZF}19ekE8{t|GTu>G?>l=ksJ&_0QMB zUKO2L@fA&fTgtrW$AnxS_vm6<(SrUm>uO?b0VLLE&uoDfB=T0)MC@}&uq(76v5V%m zIZpbHDjgFYbF?6FB1jYM?(u3WB+!CH?HoQcHCXMvD+H$%lW0MLzs^kL+!2CL(q-a8 zlD2RjxX0+fKWY#Se`Cy-d@-Rps*o-`Pt*SSv10g?El8khz)DT{=g0LcWm+JCs;XNx z;mZ$>`Qy!Pw<3Y6zBC5(Y<}#Dz3Ue$RCUbKgnxdl{JVx<%u)5^lqP)n!KpjMwaSk` z)&HFz7!OooZqf;{7eYKM>7=RecwIQHh?SG3c*TyiIM(M*uucS{n)-Bz=OhtMTIG!@ zqcQ%!WPVsoIS4alUW;lx;q1CwFvlw}dR8B+WwcNh54KuV6u!up&<3<-vi?$o1I9BCz^GPY98QH3;*4&J#VXKamr zlpH#$dJ|6#?|M<5?cr0>xc$kiP`Fm(_Abx-=o+r*x#ZA#FVUeHv}zJnGAhrs%>3}* zbdSmLtD#qEOrK^m%yT(;K9eo@TyDMcjH&i@s(+eZ;*Orl=3G9)bijfS4#M4$?3 z%p1dKO{c@0q&crNin*+lVILS04548p5z&oS_ZK4qRY>!grL-RnBR8$$$XT48M(azQ zbNA`hZR~^B5y^RtJN8e4Ga6^zXyOTelAiVnr4_1>_FvsLjn?73LhEsck`Jsic#Kre z2jo38auOrWR4=RS8AkJJ(NwNbg*4VNG#^E$s+4baExixbKCKT;vd(zL+5l?_!x%v4 zc(tB*HGLe#164@#Dl0k7j#gQe?~+lsWj)UwDpy;*tL8YZWW5LHv#bf>->HsPT{7;` zUKTo4#fd7UWrdh7B{a94;hozy_h!g>kFsWhRkF%L`=~}|+(l8o52rjwm8`g6m8`PR zKI$(?Py6O#6VGU>6Y+iKuK};7V-^3+>*2HyT634?U2|uy3l|mA`2N$`33q7cz>4!3 zo2eF+d0BoIk6Fo^D(!Y1s(0yx@fxeoXOu6b&qEd!(lX<&L-pZTAsL%!?MFEIz;x$v ze5nUz^^PXie-e`M5xs-alpm-<8uN+nu4&XI>=xxYo$q7r$C0x!@!jT89A15)8}%uL3Tu7L5By5dxgRUiTOFnqjiKZNRe`iG z2RG0Px}`MxI-l}fRswNIWIY^*T~^TPwA%6G%8Z5d9`2*mMHSMrT1dy-pc?c!TDR1h zN}{Y=;%8y$!%|7}&c2mSPE;W+E1k5DwXNzo*HrJ4v54MUJolJ;De^_;K7+I$45KpL zZ}89ST`~qx&44PT`BZRe8PHz+!ciIPXk`tbtuAXh&0O=Yb>)!Y8%*aK5V4tv4n*Ml zjI^x&)baRjP%Y;=YGtgZc%XL~pJ5e-miDpqtK~dJEt!K94^$zIr+WIW1T@bo=GA{3 z4<2deRe|gS-$%aFBFLGazO^eURH(xDPF5%BQj$>5lW~t$p1nsg$9f4%29_8)ZGnhe zv@YWam3CAijrEve45RZ)uhAOFt5n*tjADvnO8c$ycA^StEYq|Ln^tW7PV28iDCQVL z8S&t>!W5y?lk|z!9zM|;RY=Q;sK zd5$Wiu^yw-FPeG6f+=;Klvc8ag}w9GG_Q5#c*qzB|4pU6o+s?a*7BZ)M4$?3S$(17 zv2*;rj3$&;FHl-xTMge-e1qvG%n|o8{vx6d?N>t;(%816wSzC$^F+4ml5vG%j(q@Z zd1H&5)>G4YGQZX6l0hehn0rR8+5mbG*k>?|NLqW9=YDc}6C$vUgI|4Y4H(8!TBHB% z&&lZ1dj>tsB%{>oe@BP}l;vyk=?k3?c)O~S8vjq zxL8VER3R;^dbE!sv~%D;+B3>4w(waTTfVJ=Rh%Mx--Pz@BdyBpb#+`=C0ZMWDx}f3 zVXU~>#4~3}daD7na#>p5{4CBj8QJEX9sg4qua9Myns}ajl-{Z{`9KxY(r(xBpf8Tc z`^7OsC9@0i-myQ-SvnVING;F9yW`CDaHzt3mN!`Yp!IMbSr3P$8p{&C1@sP5n?%;! zp$cg%V{~V6(|VrG;axI5rILu=rC#B9U}y~^f!05st=T0b-djp|1cFsaOI@Pl;XOgX zJR@Gh%eAGvwOrTAd#-EIzvw+5OKa|KQ@x8Sq$N(erXEdwwPin~r_G>H;oFHhh;K8U zO+|gRl*e=eKb2inA?=^%IrN?{pc@O4=yYQ&qxcr#+hrIb^qyZDF(a%!r7o(F#xiXf z-fR^R%0MCxuGxm0=6F&g4D! zA3dl2=T7hba}TPJmYYPhkG^zn!onw4)1OkPc+8tewm7_gYpA_*MLHgJ=QnoFe|k0j z4XPPXg|yrrqJ3m_Xy`0K_d)RP0lA}wEp}t?+Q$b(q>Leg$`z`RmfL)^j|p_D{5%>b zD^0ZzuM4;8CGY$PKi6;0!Wc|@wl{4|4lPSQaGnEcjvwDXq?+2=o##Opj`^rh}D|3x7-zCD&mAQX@uK(%;Z~Mwg?JIK~ zGM}BmDsEp1&Fw2b2|>q$&a!ZN&$94fDq>l}R5y$R&FeY$zR@LYJJk%RLK@4MVN|6Y zbkSZG-UliDB@Pvq3@kC!H=r{OHb#VG)by4T9ehnPWh+(?b%P#(#8^jv#fGw0~7x9wGS>eaekbV zmez|(3969x+qq!mru-OQt4l^+Z|ZW(lEaI!#Z)kiqjalPCHmt0LoFFpNso?c>9^^$ zx1h?81FviijpWEr?ERH$8om`e=W)$CM!#F|r zQ?-3?HFP<>AE-ha>lJf^-sv5oH)~O8mtcxwO4Gg~>O1c&7?n|$VvZ`T4eT@B4k zC+Tz`f=7P&MlQC<+8FlXzapi1L}$3Kgo5<}rP~olEO{ zPp7KPp;J}%6M-tE{nrSW{3;|Ym2TqWFDH-Ci4V*JS?|OC3}fyGAz@9($2CeTR3VLd zL-$%z3u6hLs^TC5O9R$}Sb7X2ZpHbqFRvGJ4yRIrDx|S~G>kh-(_1a0da)nHoJR!t z1S3u>9x0Snda^c3$75Rm^j62|6pz;_RHzE1`D_uL=R<3D32R3u8|@<>SQ;>Wu=LP+ z!Dd~;9<`|F3?d(>LK@S}FwW4t#E)0#{1S>ehf2KT3PTL7VeI)VJuQdMFX3-gph{>S zvz8Pwj24wkIbXh;#rG(h`-=F+I*uW>4SC%O-(IKFY9f7~%AL;&J4B@fRk(`^+l+=W znoencht88JN@;~}C*}dZ&9o!;RC4IdI!&BIsoq5u(wH}NKPT<_oj>|sSSY=N*hi!}p-+a+QZ}gPMAdzEezq1?wn$61{_T8`Mv9ugoTHw|mz>a!8QIx{LbG zR|@eAE(`)*XdlfM)Y+?71FYEL6;KRAI0N7=Ds@| zv*4bdlqK#DN_nF*GielcI_>Stp^}Iyq;ZUc_D9h;Ty6SB9i*=TkEF>ribvSw8^z;r zzAsMauV`mKjq%Q=)I}B2vad+T<9f%2p5XUGGQOs?!XB^8rE#udKbrF6wT7N!V?#2g zQTqy2NXvYi_Hp4ta(WNiH=4ljx%cEaelEVj{%`H}f|Jwd(HnI%@I43Ge?QK!fip5D z(^>bE$On%CONryrVLp|KL&9Uod=8T?i4*9gke4ooIO#4r^K21OA4zr$($@nQ@!ialaCQDx`UgT>1>uF4=HCV<+`g`Cb{!Tl`w$ zSJW^L(oA^$8-<*&k`GiNjb*_w9?{50FxAwjD6M#&L%#I*wZyNeVf@>yOGYtjB|oK- zh$^IcUWCuN(`nU~=4)I3?`mi}y2pgaCZ!jLy?E^18^(Kd3&z1cS3^T7KTw4^XMtYI+RSaQNonm@d9)hLJwMv1irptLaDRtwj~m zIM!J4Z0VWN(8Eq#=6olK0bRj{pAIXohKk7!)+FaG(%816F_~JWJWe`;w*{4UtY5Kq##)=s?5|wP zGyQf}*uO-e3Tdp5X>?G}c{yp$%RDRgCRm!`OMb ziSxu$^TxtwdZ{wL>))@9C8FAtv{rvmTH#0v_Hl9Sgl=9emg=rOazx7;PovB=6LOEU z+!fAeqslv|$1Gcxbi03X98)u)vAo!eKEXL%UeXqTg1;oLf%2`<7U=2 z_n;q2nV~{LZmnk@NYifeZ@0Poe)L)kj)#nL^0Sb@C(${OyVKlF<6mpR@jznwss!_V zC-#9f-91n#jeTql^uf=S`%96gIr=@+sZyr#n0t?^w@_#F{ilOUAIlCR7op& zuDrn#C!y(vyr0tC`@S!gDmf@O8*}>b9exrIA2GNU*|C(ogY4;;FHbnUw5xGeIOz21onZnVO(pQ>i(+4Dw9AJ-)7JEov{yp z;+wzLySEKF{tO}G`0N8|`f{dka*zK)6R1i_OEB+RV;}y+|FYJ(yNnHTbLt`?a~|vi zX*%^ZVV!&XLQSCR)-QB|?g$+Zf8y}WrjZ$QR1H5u?+4x0$3Fat=nodT zdn^xshQK)wqz$7?jRkJk>Tok2sEYYJ!MqcPefSegs?Tph|9ZWFP*-lDp&Fncb=Pvd6R5Kn(;2IyK4db7+!`+_@n`-(%m7IvrKKzM^1wM55 zxHS720#}P5Z5XfL?(W{~B~T?N@UstpVoLAV+_SbVG~rKj(h2@H#UdsFK@N z*oQwcXwM(1u6!GxA#jx*($pd=axV4ClMN<;D!H+aefSeIZ*NRZc5E@@fdsCsL7Gkx ztUoI?U&AeC4x&nKxM3gu#Jbk~Qrpi>HGLp~YkZJ44AnC(b?MAhGajgt8+F)+Ke1p= z?$q+lw>?AP%1or`rr5nTQs=kYW`@eo;yrzhzc_NE4*R24_>A0JCq30Z@VPwpCMyj6 ziArlf+L}9Wni(pzAi;n04L;gO`?jyP$jqk+v><`28x4bev=ARipi1t?(LP>_DA_Wk ziH-+aknmp-|Ng!jEyEi;OQ1?_HPb$>&KTNq-8`LxXhFh%mG{nFi7j(eo^vY$2~^3g zP1?ta&I?3T`w*g%%`mMJwHF zx%za=5sx-JL!e4-SJ6H)f4|>y1Jxzm_CX60a!whSO1eFJPa(&|Lb@(N0#$Oei}s;5 zlz067p|0W3f`ptQq@TXf^Nt5rjGC{ z&l0GT+lRD|@k7ELUwZTx2Q5h8iaqLo{G=QkHa$zAN^U;VKAwN{zT8|Cz*U;G!gTp)$15Fl+Xo3$$*n8e$H>-`9GTy^%u<3DByiQNVe~qf z=y-MhvjnQ-798y(Vn~YP^|eFH_X90R;Ocl_V8=wUVIYUhQ=-+C-BgGx={+DV7 zBv2(c)My_c=U(FYokDpdK4t0FqB+!C{ z%pz+a#a~(Fh_Cl7fhxIuNc(v0k97{$lpxawT9A+#Z0+OzuWKCf(LrV@K>}5B^O5!u zb$q>J;9%VoMhgZQCYCes6CZ2~^2V+Sr&=;qTKq#X@ayrQN-BlNUSx&98W|7RkB*d=i~DiN0>h3#wqrJv_H}G z&L&6Lg_X|`sN!;bJGQKMf7BOEQytZFuQCa_vy^?HKYybC~sN#Bs*CFe)did&k z$HlQh4jx0!uIY-6YJqeWmt+{``r&^o>ei8U74`Dw*NeK0550;~2Oz+#%nn z>%VCq=+B?nQF)f*#X9esKKQF91gd1^fcEhw`PftXeFv8k{?_K))IN~*CsM{ub5vhH z#Pop#s$_;=`?&H;qNDduL(F(^o1sT>UI9U4Z{W|Lh|QSj=s3e=`al9zvT{KCNZ6O? zNT1^}^Vm}=Zr2UCgkKcFHzcTw70#&l2QTy<=sZE00 z)Y0R#5A^3xTptwfsF|_w83I+Z;zIkVyRox_#;?q@;@-r9>DmYS^C!H0oM#AB$%+f@ z19U14Bn4#icQLp9N2m13T#x5!AnD)^sGe3|(m8|5@K4$MP??~&m$_y3v)t01c zA4vNXV?y#cUMR8d83I+ZB1!u=w6l;SHSanz9^B{bw_E!_fBwX&)dyR?mwTfb4x{B1!wm^=o3ww-=|Hq2jTOf6i$iNc$6SOv~N!T$61k zAuF2rSxEa6&1g*Kg$A17QJg22v=1ckN#^(!k1d%#c%(>f$U@qm=(*;j79ZwGGh?pD zmb4Ef@JWUdJ2Usz_J;N$YgITNNc$7t=Kp+anV@G09xszPAx$?H(pX>P<~rswPtHD& zK;JYoy0LKT`Os}T9&jfkkNZj9_|ZnNvtR1t**XVhmYsbdfxhV$zHcX`27jwd2@*U` zDP;_4+L1eMaq0;nmWl40ztu^~04wJz;Q@OZ1dD@fA}R_KM)RAZwVb6J1E zK9ImC8Aed~-KkZI>UR(c9ygYE9%;j?9O>d*Ko3Sh!4?BGRpG0@VouBGnkv+tWITAd7Ds5k+4P*O@v)wP3(k*136Xx}l>;nmW63wMv zpY3i_MYqC{;CWzakt0oaPQJasy?<-C84p>F$v%+4CmF`#s|(!^XX@Sr66Soiw=aS; z?cf=+*!^7pMy3zhU&lU>z$Y0-#OM|74m}!~X@vyO%S)dMX*xk**-CeVR=TeyyYtuw z68I!K7pL_q_nVEMH{TB=czuEN4Uwi9_dnLTFH8wCL&a+*r2mQpK8e;RzW0;+o3C}B z6A4}?A$?q==~j}z*SnX^JZ_Ew$UZ@i2NL)s!zg-kqubG3_nnd8^&Zl9Mw;#`GPbzK z?^|j1ws8#<68I#;=sj$Ud+Ad>YJdc;heDe6xbGY1obdH7^Bl;{YiX`|YA&^O@jaD6 zD{GFqbE*BuduGbt{JTFP7FHoGfAjB#@y@(4&fTT-3FAWWv#M^Qv%Ah|AM&^Mk+X1& zv+}l=%#%FD5*QMBlJ+s_RFt#BnOtT(3R65f_Sf;ikjUTKN1M}8&e6l4^NTq@3u*aV z`?&vJgtNzA{ry74&pMMzHACUtW?ISL+6NQwdkL}dvm{QelE1Z&8|xj;KWpeynjaL7 zR_zuTW_~Pv;!?k-8Kw{UTl@HCnZtSKWle~MpM|vit$nOITHl%Pi9S18Ec~qSiqUFK zwDuvt`-r?=!cK*>4%MX4s!mtla3`O>Cj?tY)s0pm{k0GIUHeD?!cK*>_VLa7FPwGu zZZPxXhKFwVYnt0ktMI>++xq>5)YfR8apgFEKw?vn}ES2~?dRf7Rv+Azq%+*@NgE>H2Las-XFS zp$a5WRfXcQe@=KnJebIgnV=5su4h_mADW=;2s@LI+>5;(;op?;f0> zcCBv|;Dgf&El5lzBCJ}|0D?mm-)M^JcUgy|dhQf8eY1XUFZz48_jki+5 z;QzZkXhEW5NV1xBwU$k&(1OIY%E@YfrX7J6Bw}c{^rpFX1X_@&Su$Cu(_YeQwS}m+dX<&uXhEXNr%5WSoDi70Xh9;ObCSwm z(2hV060XoBb>wjko3|D%NK~qoq}tyVqG8`;D;{V;Vt8DQYWL?tT;E;Osu|FN#G79=)aOHhaY7UFfoSHqzNiE(EV)E~L!t5)sZU6v2DATjWd1od$ZAu#4> zL1N;*1odVII|408oXVt;kYRQNT9Am`mZ0X%u_MreL~rUx|M;^Vffgj@txHhDuhFmq`wfYhy85TyJ$foZXEZPq`f{hEZ+Erl#zP>%`l~>8w(xw`aO+ zvRad)`+!XvaBoR@zvtD4=?&uFIx5Tt@Ki}ckD6q zJdi-u`k%RvBZSY3%g+a@awt?)V;nZ^5)2ip22zh@PMG-kd%drZgBBz{rgdajf`!0P zp#_OYFD9#*S3_+=g%%`QzmTl?$WANO(W z2(%#4^D*~v0twD@v>?&xHurJt2(%zk_6(237WNsbZ z#|bQnnE%1Fu5W}@5}PM9vHCdZ1D|{1Sdw}tQ$lsS!yL08^@L)M79=Lq`4bsG2!Z7a zEl9NAmZVBgup`idM8#Fy$FU>OfX@wRfx=rLhju03Rv>U$topCpaqF> zbkfxF0)ZuwM1om;zf<(vCiK=tF5SY4XK_XY)M0NH1K!Q^jEl8}n$9ReQNc6tK zeH=RiElAWom7ub72Y%Jq2U?IQ_dEA->3Ot@i^h zNYtbmvw3rb!2Cc95=A%A8A(6e5okf89i2Zg{E8ic79@^S|6@lfyA~N*kl4LEK@APH zBhZ3GFcBTBS(!t{a$Dn~H+m+kH-a9w;W?p?>nE#k!}QE(LAo>U>jC<2UrKSFqYCLB zb(7V#U?I|Hb~4A?nLrB?cd1=6`|5KxElac@(Tv91f6KHZ(1JwGO37;TTss0SNbD~| zJ1xGlBhZ3GT{>a@-M0b>erwT!M5mx+)u(14!D)pSB*O0}so#R^2(%zkj&6`lKda|F z4WnbDeP%z3eV_%2M+Im^IJYhfh7nfC*G@zNRavK#)VrDD!&gpR9<(44e>h2bey}6Z zf<)`gBvp1oAi=4N79@h#C#i9R0tt>eT97FD9jyxOW=Eg}i4Iee)YVWSioEX|DMAYp zN5&+nklI4*`q|e`L<X9OjHLym$HkY zLIPFYiP&*ae5^?S!TNrn1&IO26V(^Cp+XB1?P$dNbS?>1lcBzLA`+-dp&Q4hT4`11 zXf12J1T9Dur*rO>J|{jf=18FG!n#CN?U@|pa)lNoTy+0nX{(e>s2ygd6ab+_JHNh^*yT99ysCaOVQ?R=mG ziBWYE)t=9VIC?~ng|iQ|AQ4_MQFVCH3lde&C#WO21HV!111(4tKTapb)CeRv=4e5p?jdT) zbg(1Pfq)-W5?YYR zqP20mN=f?)O9@(#*iI|bhK1S@XhFh%vcKjEw%Kjw;`ala3ZSTgbf`{!0v>;LCcD!1)%Z@+`5+B~8m~XQq(1L_$ zRMe*ukMM~8=KH}l16q(6`c|Ae+ee5O?u;^hFo6~%9=#r?l0Fdv(+Vv}ENBy_qCd1F z(1Jv-&^VRZ(~dw360KUqsqWna2~J(KAQAp@oN{&!Bsk`1L1Ik(I2HG%9f1}k&ee)j zbzc*rY^|aWPA{$*(1JwVOK~bRObAR}v>?&@#W>|@W=Eg}i5MzZ6B^5Ruux|-;W~qldZ1-s*t{M zV50io_N#`^LOO~39eP=OlpO3^?}I9Q?(8KKRj&*39h~vYOV(EnElA)O)t4JwN{~R6 ze_9E{B@tT|bstSq&8z5MBeoytgr-58th7QE(gzw$QZ?7y^Y*sI2Zsuuh4d+EmmGRo z+9gl-Hnw7pDtzwD4ii<{hdEv!2UZW;s{Ob;E=u>1xjNk&)8EHJ%bWR(`9vrDwQOhB zi5#l-)S5W7TdT%oaa-hhlW^1DcfG&+V!;HekPau}*Yz)W%at&ky10g6BCSZMkfPV8 z;YtP3>lqVNAw6$Dm&9rTJ~&kPETkRe@8HX_0%Ev#{FNG;Y0#ejp<4Ia@nl}L<Rd>RMpQtL8a`kV3UJLpz6$X6I8LMFL{Z&jZRvn9W6-od>XHQ&9?J_ z1gZ)@iC5YGiI0=7R<^#*Xh9ufr_;_{dd}~wA_lx<=K~2;ZM+(yfNNVsuNUD9u654bxw^t@QWE0n*BlT<4gh3hBJG z7vNfOAi+M+g2eaLc?PSrxAu8)Ni8dN(SpP|T1~Y-QwRwa`#=j4N1o>yEIR@%NJIwn z{tqF7#$T|?6F?YBffgk0{>L*|LSW3% zg2b*Xy#FKEo4Svke_G=VXhC9Sz9cm z3lhWn^KK410xd|K=*lad>yNMM<2_G7v>;ZkQiDgNxgYjh$F*%yE)K;#O^Xl z>Wk|_pbxYlaqBr+O?6p_lg0nB+U;mTqWX2-&0$w|kw8^0BFXlAhcF}?a_9hJjS2`hqs_AR! zgcU0XG3IDNqW)ao%^{&e0xd{XjprFGyOM|&Bqk2yl}>>K*9>SuV)#eA(kYPOv_cCK z4?6G+mK}i>B;KvHt*&T0#`br1&Q0`c{hg;lDZsov>>s(An)b~Bsk`1 zL899up1}$v*aupW$a|AlIt3E!11(4#I?FRyf!`?hffgh(jwYy2Y6KGO11(4#|BYv` z>9f1}kHg4hF9Cid+khrm)S2_t%GtM`Ig%%`SG#|CI zlwJD@El3QZ{U5_Z?Fh6Wv6b$adCMBVl9I^zffgi=xDwRDx1|4p1X_^5u@j%3eIS9V zu-_)CS2oD#N0ZDs)(8u#(1-t+Ox3}@u_b&K(p?tw$b?;+8VOWkU)?ZfR@8elxU{1M z2^`&_y%|N1g>n2FmL1@%n=eH@s;K9-{>z)9_FUGZb(`t$LwTj%t(55-xkDAwO$tv@ z6TMIJPhBKXRi)_^HNfl7pFj%|t14IAX<*qk z>qM|1(S294O850x;>ua21T9Exe3y6LOWFN*aF{i|ixwn;s8`fwnuKa<-+!&X0TQUX zP5bDdY!hN!>>;ynz%fSxRdLiSdi%T(zSQz3P?bTwqB2FxdRzKa&!ku}M<1wKO1+{Q z&4g&v+hZGZRJEpFQTGpos6Vxztq)Yqre4w4u|k}x+RfGnsy1@3Xt@wUS;4lci>mLb zS9D{a5LX*LXG@@JAoYswTo>a0H$PY{OH3dAka^4&~(qH#ExwIpJs=WuO-CkFSQ$PD=Gmt>lIO<1z`Gyc@?j5vBA`+etPeS~nmQ^87IBv93s`cXZ`2yyZ00;`lDfvQo|j~X&fh^oEPto%R%RZr+l&}vJC z_~w^7wmwjGg--bFvqgwhPoh;4(FdwJQa`E!od~8^Ky-YyY%|XH!2Cc}Tk1!(%o5_< z7eCmB3RS0SC#m&+332f4H_iMA^nt1-)Q=i{R*0V#ePNp)sOm-isH6)*VA;i(qpJP2 zMAf0Z)QPG4+gR~H3lc+!ID1iitUSKXOkIu#5~y+=O;i!Kp+W*xyACI+R@OVXZ01W= z%+Z3x%1qkRV5ODBoI`~Ks<8E87~c+GYn2kTAd!puQKPIJ%>VBVE3J?~)q*+HZa*w( z_4~5?W}XMOeNZ)Xe4^U6Q;4oTCz>TOkU-TFIur8W%|bl<^)EA29CHj6s&3E;kBgQF z(Q5n=+nA$j6!oM2oGOH*ZeXZTwce4aHjEacs&l#Zo@1y`wXRm83b$&X;eXb&Og{m;>N9D0<(YBlF+Y+d{{gC#C7ZD$Wf4gTJDpak$k)ZNfU!1Vq z$+oGBs&Ukhy0=%pQI)rLu`MO28pi#oWkTdWH`RJSFm+KioBC0MV}w|9KREQ1FZL$p&s*QL5wbAI{2 z+Q~|7(DT{T=sf)+)nq-jk8ycWh4d4muYG*!n;HpJE%+%(J?bMw9A+PF*BWwRbYNsf9T3uCGmv1gbjG?wV>#g}CqWwW*OnRV&(E z(`Sni2Y*R4-*e7EBv7^Joh0@AE+ICy(QWEL0#!3#O;V05A(B4#wW-kusv6Snnhk#m zakHatQwRD$ReU+x6@ONU)eCi-IxuxnwT4a*NWLHhmR$@LsutYfHnr4=`yXwx-gC4d zv7Lys7sbayXBR7Vkw8`UpNT5cHdIKUs$4d=sU=iFac8Yip#_OYJLoJVE3KLz)ooEu zDr!3bZQ8ZAh4qun(TRt`qp_O+>zK-H~pX*b7VNvlyCuUjokBv5r}0=KD! zxHNR76>}s|)rof3+}`s8AI| zyK6R%7Gk*awW%>wsLEBB_R(9l&$ujKn;HpJ9eF-ct!XDd&ed_5q2fG80#zx6xlJv^ zh}1QKT&FV2$OMQnYb>d-lEQ_DB1?r**}HTpo+ zu0Od=EkwwaAnQAb1gfqaXC_wb(&h=a|{)# z{Lih;b3DT~9;os^-5A@{=mS;$=Q{s#U$^17-bDgca;~$EM}ykFvnG*174D(&)w=8h zPp2$Lr(WK^UdR0E52byOU9FQB%-b0xd|ar_uAy)9eVeAmM)^>E;^wt#%@o1}r7}kMr1T zU2i+F=@u6G@NM6=LuOUpoOmhNnm0(b z-g6{Sb?aLmdle$MRQ48~C$#Pr-UC!sPe@XOrwI|!)z?l$0#&QOrqg{ocx;uUCL?lr4s1uL93UNN%*G@zNRkvI5*sBn)Wb6JQzvoDxDyb%qy$X@} z!a}RwMFLf4OYzvN5a*6nv`t-96{HhMlP(BBr}fz8AgXdMC#pBg%gK26ALw=>#{(@$ zRJ_6`l8TS>$Mo1M*NI4=sy^+h9%Y3J-&!P4HT+orHiEBzn+^q}{Bv zLLW$=3eWK~4Ekubdx9plV*PM73~<5RS>du~#HeRlR+pIyO}ZNnI`_ zNTBLtI+1k!Xdyzo`g#*cpz1?9ku=<@eLA-G?Sn)DRgLLH($($6M;RDwsCO{~#cBv93pP9)9eZ4J=zw_6{^P3iKKPT$=A6UjJ;y0P*s6OQjfZY z$R6$+dqo0OCFw-cnp1`NGDDBO@``vQP=)7?8b;&fBi6dtyT@Zyu2)_)zw}*}#i@dK z+nRqTB#c+vztw*m2CWvc2vi|mylbp#-@c8v%^>d}=O9{;SpRdZD%Usc|3jcEhkT41 z>-hf=s2W%!R^4qG=!0_*ElBi!DOQCS4=i6Fh(W3AjG>(ZdmUiT9D{;J4V$ogjm<$zWEMvX-5kZMQ_EZ zQTOFMvPan$Egxt>qUwbhRpyisxGo$mNaW2Oqt1?zl328n?yGUAu(V?t3$7Wf4)w7s zSLg$u+xwpw6?9ZWbu`}_=9&qr7kI7Xc(1OIwKVnq3%|aCW zOz-C4c%TJ|l)W*k+(IFGT>jAX@sJ3#Ad$8!MopO|L{P41t2cobB-(F_QA1;dz;cBa zB+hP*QO6?f2(%zkX%!Lug;-kQgc&M+2hoB=#icQ-*%im#{(@$REUXDVU2}&ZFOPG2U?Ig zGa^Qfdr1h4Ia-j&`$depR>_V)3lax<$Edo&fdt0`El6~KKSnhwYDb_2i573isNQ)3 z39hfuf<(ycG3rIbjz9|%^MOJ$vA=qZT5{9Q z2U?Jr_5$VkH6ebf@^q`tMVjXX3lddJ#;84)gjid?v{g#bg2c!9V^s77A+VI71&I!i zqt)VbLinHF>a!pbb17P7{Ur4+`oL$Qs^FbyHSZtsfdpER_>g?GvL(=hM8N~mYLE3b z7}YAj`JQvRLIPFGPe!ZhmXF(?7PV3rEl3RgJz7n*(hB2&79=|Dj#mAw{CMY;z2*tA z94fRRQEseD)wSY*K9E4w+>B`Ty;Vx8zNtqC`K?6@5|uVYtKwEkL?38D;?|02^|@_n zM+*`)7euQh>y1JmXh9-jMzlJYV^>Phf<*kJXm#kR9f1}k#zjY~+|SfLoK|Q-qRWVA zb+CxkK9LiyS~UY&kT^FuTDeOJfiXu55{o{GR*|+fHCm83&@);+2(j~l79`?3Mys?& zLS(IfXw^PwL84o`Xtl0|5FH{%SusZo5|vs-E7$8nJXjHAy@O~$BB5Ed+SO5rA3pM} z9YhNfk+q}Mj~@xq<#-Xx2U?Jbc_~^|wOSdNA80{hP5Ee5(`w07J6hhV8PI}6$I{Vi zb+m-)+ns%_)I|#thYCSuB3IsM6}~_Sj0akfxbeWH5;oZpXhCAl zJ(oJ1W=Eg}iHg@0xd}NzT#4~PYUtp3%Yj3`hEIifciwfY?4kvUbJ;GnsG{_7Fm=&_M7iHxDy^y=ffgj1?QyB4uiFu5K_Y3p zOYI(PN1z3XnyD`J-*h_yEl3pK;8OY1?Fh6W(SD6f9XKz9D_ZXo;#w3fNSs*dQk9F@ z^}Nu6#O~!TwZDZB=Vu-^^PGL41&LrHmiHC{bMVOJ6xFP$zTsr)r4+S4wx!uN%%Ev z-d@@C!RIre1&MYPsz;T?2gV!;RGqz$qB1s#kDM||W(~)wixwm<5m7$a&Ib~xa-C06 z-)$EkODe53bC7E|v>;KPh@l0<$Iz}l%$Re(770|P{ga~F?-L*DNtE@TqXmf|B8ohf z*$hl8Bv3W;?-aHA5Al)u&q}NIK?@RbXHt~$KRX{tpsM8Q6t(rV_;`A?j`jUO3lhsu zrl@zWijSNIxy-cU97FUfH(a8`U^S|Q=5`ZGn%yDdHn zkJIIfYia{5NZdV=qTc&6&;LC_Y_t6aG(z^iAbPo z@!=FTEw}V>_LSOaj=gfI(1Jwk&ME4`e!JVCkU-Vew^P*ZymqZuv>;J3SBg4d5p(Y! zwbm4&1&Midw``^rs>l6ZuvhSEHdxzXi zQLl$RH2ug)_|;$0$8h4lAC)c;;T$ycg4KafDxwHqmFMHlf=_{lp~ zU4j-Q1`ttesGScaP*sMAll{cUH*p`hIcyIo9%w=0+BM3LNFjVNae2^!#K%NT3$qOs zJPTDruBNDdlf}oYku$Bg7A;6jq%Y3=B7r`*>>`1x1w^ELCq6J9XhFh7->7CAg~)Dw z*a{U|khnl~d(6q(0qereuK_#@Rb_}!yTr$x@o!smsc1oB4As;l*4X(#0#zTMO;JmZ ziVul7rxjX|=u0(qyGue$PSs~Fb3D+3L`SN3SGWR0#XgWgRR|Fka>R#(ihZC3iSLi4 zsDk+(c~kenx-({eun)8#(USB>6ULW=UC~noeXhCAf!4$Qi zmiYK^)lMr^NT6!u?i7`72=O$}A=3xP0|`{Qwx_5QfBx$YRh|%ENkjrwSGJ_6>YIf4 zs8=7eTm||-Rpy!$^~*FNK41I2ZOlZhcr|2c#(n$|W`mvayaR8<(Cq8!zP2<`G!b6vLl2~@3&NKs!F6{6_eRn`{= zeW2>f;1sp~(JgO&luXTMn^veg_eqK>aYKl&-&|rFDpW0hhgunDh3MKyul@{-IjRa4 zNKuQdvOD~PpR7=!1&OwAq^OUNi;wd!FE#UnO9>LF%50UQ2K*sJaN2Y$KafCGlZGj3 z%kM&beEbdDP@$?F#p9db^*$ZLSaNNOH7AS~Bo_6Yta4|GkMai-ta60}s&F@tukPWP zqXh~3JwKcuXh9ZkqjVmd{_gTYj^V|Sc!5Wj**Oi6X|G~?)X@#ne)h4T9 z^@Q-1UjNiZRSznO?==Z*EpdL}{hYhb^ZH$Dg3lj6_w#{xI*b!(!!k`;Ht2eVF(1Jt- z+I?2Ks2zb8B+k&O5gpIljpCpMiH>yp>Ems71X_^zm{$CDnr26!1quJ#HVc+3W%doY zUyG#y^FNYq+w4%ZwRaA3&8#`r`+)?is_*6XyFz^7@vYxQ0#(P|yna`R<-fJE-Y6tc zwR9z~-xZ=>SKmG_Bv7?r4&4SdMu_5-eCv0SKvnjHBsFN75bZ~QZq+_WpsFX|wz*V@ z*H`)0?;?S!w!L}%t`Ns50YNCO)FF_a3rY~Swb9*@~!1WAEcnlzgGGndkh)K>}4NC6ZL+Ss`vV`Oa$lAc3l_k9hsA5Lh!HfvTk!6V>tZvMTJo z#QtV}aH!CN#9kuKTofOdc6YWyg#@Zj(1~)RY(s?vss{d+s2o-;`lzv9zssRQ3le$h zw#{x9M|un1&I&ow#`vi4&wS`GEwgiqdVH z>qiSQtBr4;7ZRu{Ot)>mX4O7HJAM1SkU-U`U|zo~K6?JA&rS#o6{_au;q|*h;QC$k zfvOJoc>S&rt^V=t^Fjhu`RTUJyx!J;VFcezvQ1r79XrYEcjY_SDBHJw7k!}WKo+mx z72@3AzV*9Epz7{!UcW2Ea5y^w2~>5XJCWM-65_`%eCv0SKvmAx1XZ}H5U%HZ`@E1q z)g?L!;lIK{Y$)Qfz6MC3sxIBOS^J!Pol6Yyot=OLs&>3l+sB+M0?0s(uF?LU0GgMrQB7v%{bo%F~Y6)0|`_uXiK*b^_SFbcIF>j0#)BT zks%|xnQ_Y47@!4PbZ9|2s@J4ZJ@Ngln z^zn`2pbu1K){RqP5kjo)Kf!#XxTZz|RRe3rsm0@j*wwtY^+q9qs@5TKYEGOG;eX$? z&2v<>uM(%qBnpu}d7l|7eh1M9s*)fxsns-m$!+J*{Mc(0Jp1D6uCAmM-e zkdL8zm%uxQsvq6R7STsSg#=oVxJ}>MmwU+#M@XOri6?90)DOMwe4qu1G2g|i6`u&v zui-tbT%iStUNz!WLNUAXL?lo(nS7L}V^^-$eIBL$ouW&1W^l z)(5J3<&RSFy@lA;=&)78VLVXP}4{x{Oxp6Y+uXAQGs$^y*l( z`EO~LAb}PnS}ho@y4ezFL1O#-(W>VYS&M@{(1OJ9T%%Ppi^%Lh#7ryx;-CeIUM)wf z;#OLnSenPm4cNRZHCz8 z2l_x&{-+VD+XGn}HFmk4gJd6Q@gt5#s)^P+81d;4tL!3?A5^qzO7*hZ472*ZXQox4 z4^+)t9;r54wa=-yez4LCeV}USv`95+y2Sj2{GZu|3RS^lBh{Yogs3^Ifh~cm#RDQ$ z|8+uq();NaUAA0)X@#mL??kF@+lBc3UL{)}s5;grQjIw*#GjLjS?w!~IjWX7id2XG z5n}6wN>+V^1gbW^7^zy^6XM~adS-s`_Z$gS6)qL2zAq$SoH~w%wxL4R_B@g5zbZmh zyfno&=BPS%KSEV(E(E@{7%Eity%(V>SZfErSzgx)61AXv2hy1&K$;BUG+TA=)MAkvsN*79^(s8KIt=85k-qiAbPo z)X@mlV~hAmZ+q8z2hrk3{1Kt{tq~t1OE}EchP)#eiBX{1njN8ruNEI6*)itaT@Ddw zL1IT%g!=S5A#UHUV!eZCLE;e+`+t>CVd^4*s(FValw+p&nE%;Qv$XSg30jZ{As<)H zh>tlVv&@y5OP=@>sOmsIVk5=JR5(>0cS!F#AEVy7tVd`o<%&^j-jEp+j0dWae)4aO zYWJ&*?+U@C1T9Du=N;=m2yr7M+j^tWg2dgtG|n(ih$mBh`{>bv#5~%0zpjT65-Ki< zXh9+u?e33mWJjO{i3)Urz|aDA1X_?dL#Gt1I3pve5-LtBv>?%uPD1FhC6M5FpaqGK z>9mE_$#w)$i1KaAnx!O=K-KbnqVW+PbqF09RUI6rgs+ApM)bO8$ zsByT6nYvs`kU-TUM~s^On-Ha6D`BQpVCtgELHnHx9~EL)rG>Vsi>j0oG3v-kAyzNE zX{K(V4^(Y^6s<1&Erh%uf$>1q(u>h*X|U8+crO52kl0H^tA7H0aHx<#Rn_03)l92S z%xcxxDkW$^;zU-o%C_RsaIWtRQzTH8m-g_kwbDvr&Y?mARgK5E)ctl6^Iju^tx%x_ zi4SQHZ`Kis`Mo zGrqZP^nt4Oy!UmH#N*c3BU^NOxjaaqD*N?l^|JNWrsbV(8!A*4rG2SIt(qZ3rQ7;I zRbkp?y68g*)y(>rY<-~WOmMWyZ`E*V^?j>YF&?Ozn~D-X+9nIGYLyR2|52scqj2foD@8fvUT^ zUFz4dLX_&@JDUm#RCU|#QVZS{V&72T+%^)Z%Gv5t0~!i(A&+lv8wpfhTJKU_@(a

3vuv{p4;X+5eZanr+tudNkaU%E|>K^ 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�Z(WJCA6duzx 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

X!~& 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

Y1f$><7eedn5h_zym|*cxoh?tWQZSl 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 P{Nj|& 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%0A>0hOM)N{Hiq*Cs-aM9vLi}?f^JFe;Ob)sG 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 b%6p*e49UK=9{Q?%WT%|XND^KDrcUR7;Z8EB From 39aec54a56b566e4f08fa5ccd0fc476d8d1ceb79 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 16 Jan 2018 09:27:56 +0100 Subject: [PATCH 204/205] Fix reference to Tevo Black Widow model Also fix some whitespace mistakes according to code style. Lots of tabs in there, whitespace at the end of a line, brackets on the same line, etc. --- .../definitions/anycubic_i3_mega.def.json | 92 +++++++++++-------- .../definitions/tevo_blackwidow.def.json | 47 ++++++---- 2 files changed, 83 insertions(+), 56 deletions(-) diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json index a373872de8..cba868900c 100644 --- a/resources/definitions/anycubic_i3_mega.def.json +++ b/resources/definitions/anycubic_i3_mega.def.json @@ -1,55 +1,69 @@ { - "version":2, - "name":"Anycubic i3 Mega", - "inherits":"fdmprinter", - "metadata":{ - "visible":true, - "author":"TheTobby", - "manufacturer":"Anycubic", - "file_formats":"text/x-gcode", - "icon":"icon_ultimaker2", - "platform":"anycubic_i3_mega_platform.stl", - "has_materials": false, - "has_machine_quality": true, - "preferred_quality": "*normal*" + "version": 2, + "name": "Anycubic i3 Mega", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "TheTobby", + "manufacturer": "Anycubic", + "file_formats": "text/x-gcode", + "icon": "icon_ultimaker2", + "platform": "anycubic_i3_mega_platform.stl", + "has_materials": false, + "has_machine_quality": true, + "preferred_quality": "*normal*" }, - - "overrides":{ - "machine_name":{ - "default_value":"Anycubic i3 Mega" + + "overrides": + { + "machine_name": + { + "default_value": "Anycubic i3 Mega" }, - "machine_heated_bed":{ - "default_value":true + "machine_heated_bed": + { + "default_value": true }, - "machine_width":{ - "default_value":210 + "machine_width": + { + "default_value": 210 }, - "machine_height":{ - "default_value":205 + "machine_height": + { + "default_value": 205 }, - "machine_depth":{ - "default_value":210 + "machine_depth": + { + "default_value": 210 }, - "machine_center_is_zero":{ - "default_value":false + "machine_center_is_zero": + { + "default_value": false }, - "machine_nozzle_size":{ - "default_value":0.4 + "machine_nozzle_size": + { + "default_value": 0.4 }, - "material_diameter":{ - "default_value":1.75 + "material_diameter": + { + "default_value": 1.75 }, - "gantry_height":{ - "default_value":0 + "gantry_height": + { + "default_value": 0 }, - "machine_gcode_flavor":{ - "default_value":"RepRap (Marlin/Sprinter)" + "machine_gcode_flavor": + { + "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode":{ - "default_value":"G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" + "machine_start_gcode": + { + "default_value": "G21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 X0 Y0 ;move X/Y to min endstops\nG28 Z0 ;move Z to min endstops\nG1 Z15.0 F{speed_travel} ;move the platform down 15mm\nG92 E0 ;zero the extruded length\nG1 F200 E3 ;extrude 3mm of feed stock\nG92 E0 ;zero the extruded length again\nG1 F{speed_travel}\nM117 Printing...\nG5" }, - "machine_end_gcode":{ - "default_value":"M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" + "machine_end_gcode": + { + "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors\nM107\nG91 ;relative positioning\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle\nto release some of the pressure\nG1 Z+0.5 E-5 ;X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\nG28 X0 ;Y0 ;move X/Y to min endstops\nso the head is out of the way\nG1 Y180 F2000\nM84 ;steppers off\nG90\nM300 P300 S4000" } } } diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json index 9d7166f4a2..04cadfb160 100644 --- a/resources/definitions/tevo_blackwidow.def.json +++ b/resources/definitions/tevo_blackwidow.def.json @@ -8,46 +8,59 @@ "manufacturer": "Tevo", "file_formats": "text/x-gcode", "icon": "icon_ultimaker2", - "has_materials": false, + "has_materials": false, "has_machine_quality": true, - "platform": "prusai3_platform.stl", - "preferred_quality": "*normal*" + "platform": "tevo_blackwidow.stl", + "preferred_quality": "*normal*" }, - "overrides": { - "machine_name": { + "overrides": + { + "machine_name": + { "default_value": "Tevo Black Widow" }, - "machine_heated_bed": { + "machine_heated_bed": + { "default_value": true }, - "machine_width": { + "machine_width": + { "default_value": 350 }, - "machine_height": { + "machine_height": + { "default_value": 250 }, - "machine_depth": { + "machine_depth": + { "default_value": 250 }, - "machine_center_is_zero": { + "machine_center_is_zero": + { "default_value": false }, - "machine_nozzle_size": { + "machine_nozzle_size": + { "default_value": 0.4 }, - "material_diameter": { - "default_value": 1.75 + "material_diameter": + { + "default_value": 1.75 }, - "gantry_height": { + "gantry_height": + { "default_value": 0 }, - "machine_gcode_flavor": { + "machine_gcode_flavor": + { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { + "machine_start_gcode": + { "default_value": "M280 P0 S160 ; release BLTouch alarm (OK to send for Non BLTouch)\nM420 Z2 ; set fade leveling at 2mm for BLTouch (OK to send for Non BLTouch)\nG28 ; home all\nG29 ; probe bed\nG92 E0 ;zero the extruded length\nG1 X0.0 Y50.0 Z10.0 F3600\n; perform wipe and prime\nG1 Z0.0 F1000\nG1 Z0.2 Y70.0 E9.0 F1000.0 ; prime\nG1 Y100.0 E12.5 F1000.0 ; prime\nG92 E0 ; zero extruder again\nM117 Printing..." }, - "machine_end_gcode": { + "machine_end_gcode": + { "default_value": "G92 E0 ; zero the extruded length again\nG1 E-1.5 F500 ; retract the filament to release some of the pressure\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nG28 X0 ; home X axis\nG1 Y245 ; move Y axis to end position\nM84 ; disable motors\nM107 ; turn off fan" } } From 6225c12a9e06a1c218bae5d6d1240c18a6a16b46 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 16 Jan 2018 09:44:18 +0100 Subject: [PATCH 205/205] Fixed crash on complete message In some cases a job won't have an assigned printer when it's done. CL-716 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 6c0cc554e7..b5cbc33d51 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -248,7 +248,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): newly_finished_jobs = [job for job in finished_jobs if job not in self._finished_jobs and job.owner == username] for job in newly_finished_jobs: - job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.".format(printer_name=job.assignedPrinter.name, job_name = job.name)) + if job.assignedPrinter: + job_completed_text = i18n_catalog.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.".format(printer_name=job.assignedPrinter.name, job_name = job.name)) + else: + job_completed_text = i18n_catalog.i18nc("@info:status", "The print job '{job_name}' was finished.".format(job_name = job.name)) job_completed_message = Message(text=job_completed_text, title = i18n_catalog.i18nc("@info:status", "Print finished")) job_completed_message.show()

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 qJRynJUBL0Al=Gumj))$}1% zGygc`(hOvLlAD~pace7?2cg{;zt>9I+`<(x@Vcs*VFxQB9~W|B;hL*w&TN!>XlDnJ zfqLKghst=b>(uN6N2z{g;VOd>`M8j-g{zG7FI-o6Vl(x!TF`rJ_R@c;PJRAYw`5T?OhynE1L=%5T5}ck zL}_!BaK9sUPUO}!T5}ckc0pJS(qgpHDkG}haxzfUc9!wq5&5`~6ARZ|MH+y}z)ElF zLL0EN6ALeo$j61eTez0PYfGi3E!l|>V$f=)YZ+Z0VKI=-Xrnb(HBY)WS5&Hf*H&kw z#oCL}D#O=q&U(AWAT354tuik6b4m8$s{cbLx>96p-Rt#)+A4$35G`C~%-HaG;V*wtL_RL0YvC#*y++x&55^s4 zIHYT|BGPM=abe6G+Gx#H?cFCAPVVfj;`!g|^OH8``mu0Dy!iFWg_XS~4n#gK%}&e*w+X^@EF-K2%93`XSRVzkQeW3auAL6**KVBt|+jab{>#$Y}!q-)_S ziLZ!fcO(9YE%L_RL0YvC$m&o3tz zo)`5i#Js<=qR2qHwZEw-GAvwW{Kq5Ci4gg?kgkQR4CG&b#kp>$Ov^re;Yof>+)*~N z^)xwW0)0lCY1!gGn@G5Et6ya1V)WqCr)8VI1kLFVU-INvoZ}cqbZI#)d%@og@m|^O zv86(eVMOib)3UCOAztoW@+#!uMGD6-;+00zviCfu@>QJU7)JCy%-7WX`xluEj$uTD?NhVgy=5}$cljtT2P2s4`md*ECw>dP6fL-* z&q=Wij$y|M-(>`I?O8W9`_^KU!6oMyMtqi=nw>M*5Z6xc64x%rFrv%i zso7`F&zCDkFxP2wr)K;2H5uOzeKnTBF^st9F<-kA^T}WYb2YkmYPM->lhOK-$E7D? z3~~%3*55WYJMgu9G8n;JZ;qatJ@qh?amw>2hz#_0j$uU0{$97+n@IP}&z zajrOq5$g-4W^cdLa`i*wR&j4<1an<`$kgnPCryUs3bo5IjJWFeDcSC0O~!viFxT0; zrep_~n2cU0O>d>B;vB~?;+0RPWY2sepA1GY*OYZrvO8`w8DrjSeHvt-b~%O-U%xaZ zdsr?lBaL9L0WW*q?naZrCFdAM{CxkE?Ag~DV!zU3r3E2_V;Iq7%9QNfkJGtAdoY5z zppl(C%w$}7cvTr6kijvGcwxYl?DlW-$zTL?t?t3)IJ`v_k%3%s3?pWqF(tcbZ$24} zV6MyBaqTwy=-jxsa||O+Iebd?p#7Ss#vn@02iH1`r~K_EDW5o7n8pR0a>b7|@jlpJ%&xu=*V;J#s*<>pD&Yu$*j9{)W-4WLiJ0&Cz!`h7k|~_NxdaG~VT3zx@_!k%j9{)Q zohE0K)%ns34vza(5JTynb^K(SuV&rfE3REeFxR&&{P|_9Wh`BCb=(sDNi5C;sclYhJcoaSS6?d^+jB ztWk_$u1VicB7K*0#W9Q+^u;97!WqFajA-`3B+~Rt-up6cbBQ<7bZ;(0*EW)(f>|)?ZaPEjzf6?o5@|aHMWO|7{;}F&cE! zs1-9Ia8+_Oy>jEyplIcdSRGRyE8%j9@O%r(JC_ zX3Uxuk8_S;gzi{P#%J%H74K3R!CasV>zRy$zONA16~{0__n#)iS_9=^1apCYeRZR# zJsE^)3H!Cauff5Bv2xM54I zQ*#U>bT?@-xXl^CT%a3YYchUq_SaYg;21{eZqj6Qef8A19E@Nt(A!#=jPZ}vi)C;O zBXl=uGPoR!U@p*C|I#q3-J#zPj@yG{7@@mKlX1btC&s;<5zGbJm6?qFPHyz7=Bzl! zF^tf?VcjTKyH7r@bv^`hf!PZlfiYx2<8I)*8wJD+$|5q?ZGjO z(7j<=2F5ufm<#l%Gfc+DL+Z$$Q)UK=VTA4t(=ss5IW6V_efNPAlfmU+1ak=;_p5V0 zOk{8jBXk#*mVw%3M8M^DVafQIw|-^Z=HQBBWUr>_>JBL_1GUQt<^r9J^G)kl#Csf$ zVTA5?^2uNXbAe9gs~*oC70cilM(AE7pA1GY7wBZ(J@n2;<9@|4j8LuLWV}1_$hcoI zg1JB^>qp&vRbm+&!-z|#Px7a=CWHGGBbWkOF^t%B^dx_qkxvFAmK*2gfjCu14X??#?)p0MzLpWp1v=T+Zrl4=tSxa2BR-rp(chAr3?AoGjP-Sq;$J@zy|Jf8J51 zrxdkBZ_`r|rJZ~6$JKGknTyeQgD~qLy#2wQaFvsCu?$8q7v3O@>u87r_O=rls4GS= z7hV*sxy=yVOBlgidMaY&sC>wZI9D9Q2)sc!d%4Nz@Xoh!zhVS)={d^bQOPfPaDm7` zIXH$9c!Ti3FDB!ayN1T=2P2pZFAB!BsGLWqW(0HTIf~`#$3_$5a&QbI@S@<&EAz=< z1as**iphB7fsXN9!ZD1%i-LNOnvB^4o{QUq5zM9MD2GKQpV{#iDF4s)F^s?)goF3Pmp16_HP87j*1{RVTzFB?sJS8jn+)dClNZa? zZPmxdy@X>JffohW^i0b@T`_{W^yI~4-0{cOxCJ?e5qMEB>vogz!Rg74g%Ql9CoeUl zy82@KfSeN#iN!H%%x{FmaBV4ZWbAs+c}02 zc!RL@2$K=iuACuhTFj+qH727?(?#)_49746FAA<~l1~OBm`l%UOor>SH0~uF!w9@V z*xEWR18vR-=F+p88d2@Of5GfnhvOJV;0?mLS(7pQ%JFgSGJ?7AqF~B7hOpX2t{A~w zdb(q|I^e;(C09Uj3?uNO;HmS{GSKFXU@kq~F&Sg0{3D*PIEE2;QBb}dkiiJ%($gK2 zG473taSL(`Bk-aisa>lp$Y2C>>FJKi7&-L0xEvhA2)sc^ddZw;--=t15zK`b1^N3f zBbZCigDh9W=dFs*062ybcu|ml3^Ibb^gPI9RA}{|xOO>)5qN`;%q4B+)R%P-{fZIH zg%<_MeD(UG%JEvu2J8$xmSY%!7X|s}T}CjMo*FlKb~%O-c!Q8=8Pm3Pk`{yvMlcs%6eOAqmz)vIrKeQ!OdUh~ZbHt&G=>p)gOF%s z1=)^qdoY5z@S-5m6Jrs+9E@NtJ=d~a-FEObu?&u31l}Md`tFnW-Wk_bfFQ0x{&hm4 zh3`K=&*3nl7{Oe4QIKf*CGTApw;&^!OV7@%93!gEixC{d2)sc^b}YB=*%6n65zK`* z2+2OGaKy5_2<9n+azeaIWdw8Kb%O0hox9-If>_H~ zHFlie@fOIs-Ln5Uf4}92zl5@l7pA?sz z5zN(O)VS=%W9mmb!`g$Nh{ri2m}|$daoN#h4Y7W6m%Iq(8a`lLcG(6)oH=?9 zbCq2(F59wAgD6)#J{ZAV|4-L<$4gaR-w$9Rg1sw}1Qn5Lfrtt-#v6@2#De-D7Br&q ziHc}Y5gx@D;eid&SYnAS>NiGXth|~0o{GkxLL?dyOY99xVnqVKv(CC}?wWUR=AYT0 zv-djt^s~=C<^Fx|>B$?Hs;s(i_m}$2=^RIVolH+ATp=Ad-|%)J!lil*nx1UJ**?|s@%c?x z*Yn{VN9=do)TIB_MLHbeQop`ts@2B}Q|8utlye->ed5&Q!aqyLeXsVa_YX(7)THrK ztzGq6c3#whoIA%6AM7_ZxnQAmsB}9b8l(=KYW-v3F@5T(DjCNSdv7<@dTo#AF0bd@ zIgaSD<<#VxWgSyRt1pYor6#OuvGHp9FGtsPIL8so-fKzTey2!>BV6h)FSXdX`}AXb z)O9$=5n~=|NrrsTQ3p!b5iWJ;11&ax{P4uxcT+!ijw9Z==zrzI5iT`yZi~&Fs&kaC za~$#cSuJ%NrBr(Pq9f|5a*iWzJF?|})Sx3=>d+%v%=Y>3wA1UQ>l{b?bBC7y(RLl- zQuBs}vf63Sg1Oc?j(B~WmZZ-(A^tS2wVo>HIO2@YrdY3CeZiUa{^1ChI&{sJu%jp) zULVeJ#0IZUN#6Rm5FfOiQBRd~9P#zsDFx#d>f8}7HS~cgNp<&O1!d(NM~t{)O4#ia zV%ZJ9s?Tc9am4+5Oeq+tkt#>H)TFbggxx;r@Un7_Bi>$|Cl));Zl$9 zG$pJuige7q>(XS=BcJXKZ$Eahj+lct4lZm*_{l%puS2RZUUifb8oOEN{FLZY>CP$Z z*2~H{t`B=tJ8mk(Jx8sm_Ydbd0y|BAerfGARR?V}<{_3a@7Ids2<$YCxj_i859c@n z`$p%SRD^JjBd`m!>!2cpa~y#^on_ywmFA;mS>Jljo#P1X(A>8`2;~Fy;T%U`hvw5O zg}7tDHubV{jw7(&vUsczpB=tMOciuE#}U{)X&olSyAN(s*WnyTU@zo|O@vTB(9fOY z2<&W({$$M#EfEOkI0E|=3!f=MIL8s#r+Dt3B7}1sfnA4-t}H@0#}U{=*kp37CQ9bX3>&T#~9N9Y`Y@{XK4#}SRY`rrBY-1^w= zrR(K}{g%s{RUguUvT}|iuzRxUF+~XHI0CyT_Z%j~dygGh@8`~O1olEsJ6H%$m2(_{ zosE$P79pJD2<%g2I(BJ(w{9~y#}U|d$nxQ-a*iXg>yVYzyzQT^*N1Z)ft7yGU00^9 zeY;JvT{1_w6m}i58oYYbyXyIHjw7&#ko7^&hjSc(J%oHeM@w{$Bd{Y-JeD}e5%BL9 zk5|rd1pNEOW1@2$0dIXa?!LA27JDN1OF}-J;|TbJKAEWc@Un7*OTk;8%?6Hejw9f$ z&t@D)IL8t2y=SwU5U3C5I0C-+{LG1d?i@$Jlb+4aBkq`2w`82-2>9o&d#b3c9N|*% z&}TNog&TcZZ@bQM1bpwsc8PNw0Z)2n``mo|7rU{%T58U51U%`oqDrL`_Fqv?m2(^c zPkLs6x9l%T_nWZ*%MxYS1~3fQR*o@Bg>MJO~|*a4GoSWyxk~0>U|t zX!OwcU$|l2_Hm9QqBnYmQnmL6XVq;VN4OMx`Y(Pg#Iy~Mu9vPOT%j^OFmB7}1s!LzCztyk!9jwAd;Yxr70>83dP0O1@* zw5&TLcvw`r<-d-Ia};v!2$%Xrj~T&VBE*p0c8V5RM;$KpK%W`GU(%_d23?0sF}!bz zIPjWvqot3V-p+Bv;k(QT9v127Ib^%~DC!888n*k4;9(Ksvw8c~ElWqZ)QQ7q1P@E+ zG*uhjH?=;BI>M!%D$fXOA0fP5`8vwiPS|^S?uMe3mvbC}os^ws6d|1B2<(eodR7s_ zIgY?CN0)I$2%L~&U;#}U|1C|=h(#}U|1$giEz+MVMF z`1-T;hw2;%=QskM`(g{(IgWrIzSvH5jw9fQFSdQ0O80&UHA)5%fkEA)Mm~dZUXF&T#~N z%Ni5^bLNtIyK;^r=yevt^Whvvz-Rr=>075G_28q|ug`y;*DIiE9W?30l*BsX8t5rJ0X z97o*P>w=_xSw{p?@!q6l{l43z`Ix!kPW94tjw2S{Hz^r-z7S{5+oL`^JI4`w zO`nw1o)f}z?i@$VJ$h0ydWW8AsvO}QN0fdrDY09qLnzprTDUy5Z8ThP<@r^qmPd` z*sUoaqLHELqYI+-igx7)m%?t%{Lw<(dqb%{8#uzHuv_!}u|k}_>>Q{Ce0t0op)$GAI@-lhmOJTQ0^Gdjjd}h{m z9pO^gt;uGbX&+53OqEMvwj;;^uEVsEDyuIqT^w~_ymF2s zuv?SOYCEoXQN64h5GIA)nrv1(>e<8U`EZ0wVYeom)ixh{cD-~R;ZoSG$!4{d?%7>3 zN4OMrYqDAGi?cVVw-QIV6!u>7vl>d*5iW(@laF^)>7Mt|-|J=N97kZcCYuL;JNM9f zsvO}`*t5vyK_9Oi;ZoS4S@iV}3oHQVI08E~Cq7n$aE>FeL-XOqMF{6O0y{K!93;fW z?_6G=Ii2GO>{GniO^E+&|I7M5j&mG=-J0z6?>EQ%zFxYHa4EiDqgR@D{XE;Xbc9Rs zH5$FG{_^{~6zXs(zAYofTSv~Qw|3XzQrLSbeuv%>E`@!HkDlBst@9h7`>LKQ=Qskp zHQ9UmOV-M#+ic9}ARb6kmuMpuk7?AAQ=wGh+pxxL=5 z9N|*ft?Ak+NmF%Azw!0f?g*E{Zq2h@>WF#6>MhX`E`{BiOvk8iHZMfD6n1N}e2hQs z-XCbZavd%eZ<5r@YNsC86(Sm>!aj~XQ>D`Gul+WTR~<_idpeTBZcXNmntSJ+vCcap zTnf82+4^IhMJwy)EIl7Ch25IWLiU#E2$#ZcO=c(l{^cF&;Sad5r0yAGGaZcS#FY`xo+g$S3zZcS#F{OO9#3)`+sVYeo;OJ4bR=fZa7 zQrNA@?2`SizojteE`{BiY<6z`G@ENZ=Prfanrx0bx^HWt4wu4iO*Zb%UtWxGDeTr{ z;7_Up$?bAZcTRMaQ;gN#?tNB&s_?;HQ7DL zOpYy*LkcEGw77ZcTRI`J$T# z7Pc#w!fs7=r}~g?PZpMLgH+hZ$!>Z-dd5eE{R4YClEQ9HcANaY|7=(|pSu)xYqA^b zFaBp%-7fJObSdoCWVhmv>-|z;&Rq(-HQCMk2NrcM%(+Vy@8fi=50^q}b<-xBp-|_v zmT2R+9aMaV1qhdNH0b{In@D>M`Ek8;o#P1FcCxROF66@zE(JQfA9d`h8`Z5>=Qx5E zXP4Akk`Cm<5iSKfyR|j@<1Y1lIL8sRgNt-H!lgiGcgeoFVo|-7IL8sR&Wm(7!lgiG zH{4p*J-^dv}g-DZGACd@jQ|j=)NU?nCKiw(AQt2!x1ipw@k8gGHn}Q8(Sh~ z9OpQKdoM*g9N|)U{iOKxj&mG=w@k7VLf_n*S+CA<1o!lcQsoGj!doWUxusLL`Ek8; zo#P1lPKtCm!lm$*Np_lQ!Y3QmXHMrhg5H)Q9gc7*yk(M|@%nU)d+Igl97oVUBOSFz zx31fXj&LcwWs;pddu*3y>wVBUj-W@U=$^16TncZQWar^Vyq2x*oZ|@kfQocD!lm$* z$*_I5PHl#>raoJrah&4_dX0*7IKrjymdP!>q~p8a%U-#0jw9%2QhnUBuzTHRaD+?Y zEt3P+l#WH8XK(2_#}V{QNr#WSj&LcwOmf)ATcu_7z?)mu%gQ;9pf5{0uHE^adXI91 zOVO7l#Do31)^qL%m%>{nFTSEw^*tn8Z9B&i^nOW)=iCu4g||#Te7>$@)c@7<;T%WM zUsj~U5iW(dOs-ud9i3`}W3R>h;T%WM!&aoj5iW(7NwRzlJ?66d$lx4Dz$cf@oPRm) zxq6*D!lmewE3!)*;Zk_ZB&)%d?|-LW=gx5iym*;KHt*d|_3_FPE`^s#vbOu%KQ4&l z6=pT(ID&pZ<>UWV)~=V8BU}o8zyD$Hns%4M%OqK^t$jSNo+{@!f}TR9>h*!=)>GvO zmx8CTcs1b&m%_^=*?6__bJ>fe&T#~Mi`lAZ=x4vH=fe>$Mc-o48pjbXg*QO5k^0Gg zo7P*2a~wf$q}H6f?{w~N?CUKxN4ONdkwSb>{%yToIl`srjTB++6pDS9J?@bStKF6HONOQnTvo$IM`jwAd`da3lQl?T?I`oFCz&^3Sgw4~|b zVacw0OlzO`?X=|bSB51Emp0XDgqKRQ0-}~8T*}d+fi9K)_{ufazMUsT9mni5Em`r< z>b=3~Ix4*Tuw?b#h*#m%@%w=2pCXE+98DeVf1X%7^QQ4-cbOjosJ_y9K_{l(bTa+pK-MUj0`S;=Pa_m4UhP90kqqDTtyDx5n0 zU+JLAkUQ9}n%{3pMm=1LI_`V9CAsXCQq&=uh`$9ypA;buv^!cfQ+093!xu{j#QIPT zg0tU{>B)l5oufX{M9d6`PA?N74zxR3G*flh+9NC1Pv{=YYLDkylJbLH>iMX=(xsjc z&_o;+5OY%m@*ycli)N~RcJ}!484pd2I$phfYN!L&`O}vLE9_O)xx({^A}ORq;Y?M& ze+-XlXKshbw2P*WeE*;n`vlRVspHypN7lNX%Ch=+?dhScDp3bUiSjFzs6#Y$%-(cl z?W1Fe5C?HNS~PV`J!5g(*gGc2vU+EWX`$`1tPbcrEt&8I%Sz$Yaq^hOZSzt@krd)p zICYHr!&a5e!zdT~VC+$A#I(-|_UA*#uMzXa9!0uTTI05@DyMcnC?bla5U;|iBOMbX z0wdfNi(kF+FLp2V?4bRHoNv^!cfQ`I=Ohtm{k|M2nSM^%Os z(Kxnq^Z`dwNQux))y8kWTs>{4u@&T_?-|pQzkk8`{EsuHCF9m(xhb4F98n~Ncoj|^ z>F5*73ggm}x5}|TFygG-fMbbh>PSbph!6*HIa)Mz?EB4t>hK?P9z0;swEDQ~pC_0@*LK=!l|QEK)jP8ilh*)!l@%2MWYUkmRlT69T;nG9!?z! zr;c=_j))>D#H(=X=xB>xux!uRw=vcZ|6tG9#xRN^oH{z%q8+6Wuh7)7^rb14@$nHj#7hBja*7ZKQjQkQRQ-I1akWntxh={W8CK@B$(*T0 z6LIeM$JJJRoY|t1qWwvQ@?+_slv^!cfQ#G+Pq4x9l zt|`ayDz(+Yq4h$$U34BH4z$aLhm>fhDp-~kS(ch{z7Y)@mDGcye{i z5$DDpb<)(S$>51wL>(JFHZ@r?4|H>T77iWXnRRlt_7ftCrJCBaaOg-*IJ#EbW$oCm z<`15cJbS`+G2ZWOI3qdi1<+0H84Vqd$T(rVGIT~m$DAjQuWU5xvnuL*($Mpg*FV}e z#@l`3d3Ajm4aBIYj;~xgf{2XM-0tX%MyfvlYC!qGA9HNS42kg^X~)coaUQj%aMs|r z0kMCID3WqCTgg$cuBdkHdu%MLmaC`L*MpcX$K1_6sBr3VM3EHYRXBCrwEkMd-&{sJ zF}}0>3%0A36IznL{haM83rEf!Q7qNeo`s`yhaT{J_25CL#C-H@nU?(F${k{T+_(3% zWaKlTo7=N+=x{`_R8xBv4jos$^l0^u+mDMnV1K+@<9OwEw8B|dr@j4Xb=0;*6iK0c z6wb2x?l%)^``tD-wyV3Zosm2>zE@297Qdd6Ecp-UruK|RKFVKBsQvCfA~H@>yQ4E2 z`3SAOqW+P!#L%v4=cWCl*=QgRIO*uh8w1#*T*}cIja0q!_~hEgS3T8+{&D&I8Ocs> zeJ|$Y%RkRZe*TN^$9!Zo5W@nZbs-TMr>Wi18I4q3|IR+OGfwPPfsRdT(~}$5+dAr4 z`hNHx$2p*z+A|tD4t{f=+QgHI$T&^yj?QT4nArc6T5aU>u|AGEV@9&hc=Yq;_8EuI zsQ3AdhK^356}BEoM8;`qcXUQW$H*-jgx9U3Ga5RAy<3yLJO9~fbsHDfvTR?`%tx?yYqEF6L3$l6n)zt|#rW#xVWo=x z;TApYPnDIzslyRPQixaK)RA9Db+&aB*PmQ1as62;<=0V^;@XL5(bSRmU(sJe4-|bQ zTtUiT;)o(C#H(=X_~P3Yv3$) zXdt@0vPb1VD~QNA&FzlPXrwCWs0AIdbXQ(FJ=yi{tztfWCd=rKh>R0#Dnn;9Qk7q; zv43#2#s0yyn)+aVt=1@o(iIwXsdVg>lWK3w?;Yy{qyEqS)-&eAYb~RZkF(}Ys$G3E z5g8}s!_XNG9Zxp*sy*@AKCwO?KX!Vu@E53qruN(VO|Q?jSvYi@b4st;q&J8tmU1+7 z1nad;_OAC%w{f#@=;*ugT5bQzS;)-|eLF)#$DxaQS1(Q1YFICEeb&_O<3|<_9bv6j z)#|QT%F)m<xPGjVq*RUsYsZ`FhFG8I7C=o4O*Ky8oT$rZ#m``{9evO>OFCqmgq*xRj$a z8al$-pd8i)u@9~~X=>eP>9&Z%)44Y6^sN~@wipwOq)+AD~@bT5r8I62AcEo4pZx$S1L+Kv$uM6ty!O_3CAn7rZ z_HGuAvO0FuXXS}c5K%1E)SiVyNBfcYm%mLdF5-#BmpG>D?MfRE4v2)0P+!MN+XgQ#5NZ%;%LbpGQQtx@&4*v~GBbE5Ur# zY&238=JQIJ&m+R69G%g~dAeU45!$tccI>#G-HG`S%~YlPwGkl>a_DH$%=yYeYgbmD zcyvT~P5Ig>3rDKf+G*{|mnouHs;NB-N6y1eLpkhCL>($!q}Odjg)>#Z`^U@W8+Rq5 zNXpU7c{-m*9hjYIGc?E9nKlDwYS|BU3m_seZ%fM28I62|S*;RgwF>&j%I{A~)))bs zfvd(}uGlixc@~bcas<|vc_~LjM>_g+u*jNi^l2Q4!it_FTtxV|l-YC5(H|fSuvAL- z&tpE&8nl-N&#mSw(Jb9`|2!hZQM(daF|h{IRcag)u}bZ_AMFyiEHWBpm9B(4STbDw z3Z2D-vRbraV5Rpfd$0yWeaJ3x3lR0eaOfBiEWTC2@szc5jR}fiD)~;fz+ymih&%&);b;x;hga0B!Lr3a$t{~^|F3X1u-}JCC z^dV>A(BX(;so+VkqoE^zP9|Lsru+418Cu=3l{D@<<1`INHA$iMX;+^uF?gdY!5bBG zo{geSX6ZLt{iV`>U)!hB5-eEc+}8k(&S>QPs2k^&*H|$jB2FANC0V&GeXl+*W#JtW z#ZtlhVY6KreeQW`xYo7qmG!-XEF3x(x zEpLrPSvYh!0(N^|%F(Fvu#Z#GK8`FI=a8^ns#I^z&PL(P9XJ@(aOMv2iYDUKfOs-R zhyy9iyF!a*s@%%xHEC9`OL#70)k(90UBYu23MZo7ESVxHq(tFN)$?EMRk>qN?jkq8 zKQq_~)G_+&naP9OQio_FhA-c%(h^D-{X-n)BSR}DrYfDCW9edc#`yxKgf={+6i!5H z0Yn65dYn#hDMvF^9etMA;ROdCDD4BohSSb(7=1eUEIUd$nmWRGRSW0(VyduTbN_bC zN6TH|woAIVt#IZej90aAu8)WUDa0!@b+}i}Pvbp(*{pD;i1ndx>KJk1`0_6wiE~~lPlZ(W^uFtxNBLCWyRfTp3x9Z#5T80t{l6wX$@ctnw=ukLQ6;5mo4`;k$D|vOv)MWG%Y`gIu%VRvlpm6GN zM3EHYRXBBoQx>&w9?n`K$19G59Ix0CNyqbWwQwFTB8sFCufnM#^|!~I!+ZYVww%u~ zaxP6cQ!Bh)R`9n+M3EHYRXBB|7C=mup9+Bmfc}Vh6;2(gl|e*-6yg<{I(|EO@$fzF zm>dy53j4sFpJsh{9VnbS98n~Ncoj|^`8kU9!C8iNpwgv|{2bLNg?NRgj&y8~`Ovu@ za4^g0bem`*(y=`v#DR84i*Cqy4gKTQCEHSk7R^*OuAOIw6Tki9nCLT^XzFNOJ9F+sT=%`4 zp+!?igWHI{Uo&pS#XUZJTYJs}k9oGVDyx!0O#BGOYx5g`t8 z=xEW*d44`;K71VHe6D=t=W}u-g_H=*ROQbUF&{o#iY6j|rie2#&k+$Vn)yg)gV+b> zemEC=U+5+>>E-w zVkw>}A{y-~-Ia+5`0npN zk$xZS-Spa?e(Ee7I?|n=h$xn7YR|%pD= zUL5Rt<4ij^e%@T+)bVCG9sPFdDJqh3G<9^euhg#m{J(0DIy%}{I#ntu#49v)G_D}o zC&1B8KH?QkMB^$IC%f~#$ooy)H>haW^79kUP4_v2U-aa2>*okF8Z{X94Jz6h%{a~N zj?QSblF(~w!M7CaT&Jm!cHBzPT|&_;tFf#0sy(wa5#k_+juy?F`^pPzGTqI9d8U8TRZw~BE&&ljuuTFsf8R< z1v?5JdT`KFd(302RCt;Xdew+1ka9G2q&LGFW*l(f9bUNsZ7tD6q_@u^LL6w%Xd?3KT1ssZ*R@28W~x%} zc|*<-7d&jZy9O!I)ZqwmAfn;f6y8 zMu3%r=zFCV#+9CE<|DP?B0?Ob*U_SxkMqJUp^rc29Yx%5Ib;~`;GhRzc@ppDh$bR< zYiq$<8(WDu(C%o_Ox51uPU;DZyT=i3%+Tp!{$Sd#*)81jo5?(hrj8#5M01J|2XQ%C zGNiToe57dV$dB!8OB`|7jztrZ zAKNL#@tkPUOjW4!TCfvis_0#2K0NITCnD5&E!c?-IR{5lNQux)RijUaceTNRWuZIn zSR3dLcd6uvA}L2x$Ct_CwiR}d{<%*%*TS-#@CD~u)H%YLkADtX+_vNIc{;jC3h^qO zI__9=WM#)+(lbHd3&#)aVB$Rh#49?F5C>9@7R^-U?JL$AEhmmEqNyWqUr~xS715%p zBX3`^&S@dBRnop9-Eoe>sjx;Vq(o?@DjgH!NR1H=V>`6_s3w}JO2@>A5C?HNS~PX! z{cx-g%ze0biFid5k@v$Y^ zqNyWIRYZt`xEw8-Iu@=uq_XuILn;^(vBKKwDvs?wXDFOHmITCxDWXUU@hY4;z71CX z4sU07U$uYATdkZ2MN`MBfasYb#6et`!-W=29eKMw9owTt&X(^Zcs#v>-EfZW1yYEY zRzG8k=lUAn9KbFBq8LJpC#+V_ao?y)O?=zS&}0u#49v)bUcTw zd|))t`2y``us+gr8L^cVNg-Z^Q%9)5ifT~1;oxBITk?DEpNl3Uw33Qii8#>iXwghn z-k+EsIW>w>N8X>v9woaJQlhCNZSAp@pdaWh1GI46KNn3MX^)BsaS)fIMN>!qyeL~7 zYEAcRQ6IQVN<{v=C^?csN`z*rI{J`xzQo%re8{T*`c2kY=S5P8SK-u=e+!BA?4z1! z<|F?W5^E55yH@^#XwlS>zk|iHLTkr6RftzPr;hv`tVSusD>QYuB|{sBb_uN-+9C?4 z4o4J8Azp=3$NGmZ9{x;f`#1-_9@#qzr;fD^Q6z{1#aMaeyi}^@* z++*n$Ng-Z^Q-`0RbL&nc1L9RUb@(a0A}PeHaOw!H1oL1V;V`RVi~Q->pp zq#R8h;dPiwcpWC@T=oYz*d@{XfTD>w{=K~_8yrZ4IMD8B(M(m|pU4phmfoI+(=HKB zMBblBDf$qJ7R^+p^I)_^ecgwdOnwc~M5OazM2G|Jjuy>S<iwS3TLVuQ6vQ&3TMv4DB9tzF!mfDYqh$g z4o4J8Azp=3M>_h%e6Vjb9~h(X<{jcyICVIpNDA>PoI29+D(b-KBb!01ZN#f^>PW|{ zh$xamyb7m|w6#YBT07ob0>>>2(L|&@Dk8*zc1Me5s?rylDp(t66a@!68#?hTnuyta z1u7!Mfp$lWW~$Qlc|>5ft@l3Z*<_CrokxfR?T!}BRJjG9Sq*Xdn{Wyz!mW%VDMvF^ zX-kaxK#O}eoO=WZ?GqOfs~^~Q%8P}o>rfGxkM9@-=nA9?p_tqOjYAqHNIPl zxG=xM?*}Q&oC7Z)UG#opqm-kWs?_&dL;vv8Z8|9n9SUcv8t*&vG_Fe_UZJTYeH%CG zfag~}EA%e)dC}C7zKt6Z;vg8kBtaHPR1CD!DL=%yob&d#epk4D7q(n1S`S%k! zbE2MQ>5Hb0)RS69>57B6v^Ip4XzBT!@f}Fyuu;mJ+`F3{_U<-| zb#TpYvxARxvsgExsiSf4E|VHFG((G~j&vm)#}e2Eskb#^D#jc6h^ z_%ysJTiq%m#DR84i)N}C{ctlweQ+$9b3^DWGy6t;qKP6A+I?dwE8wK&lJ)NeDi zXr?MZmhg7R`J#zW3T1 z>=M4+hH-HC2OLX~4}?=k<9n}pDa0!@b@)% zS~OGD_^vbF>}M(RJ|9b(H(yAXN{#P2<7NLwDWpVbrmE3T&76bN_l(y1xT~BqRgGtz z^HPqcj&K&Irq^3H+IV)@6J*={cyQGBk{$hzp~^gWIy) zL{mpP`b2~{h)ZKIq(oCkhprm1Qi zce#IxxcG`(w(FobzDuQ4M>_8E^>5@*`>H^TX3iVOEBcMWp?8ShVfQDON{%R!ax``1 z?JLfM90zHg(Y_)b-ZkKNOk$lENg-Z^Q%B=@2F~H&pw`xTh;=TSh_sc&`CJ^7kLGqr ziDnI^CxomevQPYRMr-gVbCh5U)mY+)A}Q!lI8&A0agRFS5z_Y`+{-1Ji1dzoM2Lg* zI$AXI;XCebbE3UsZb!VL^9XSu9VnbS8qY>ylxdVg+J$C5g1u{RV9yS3MRD!4PXA#0 zq-!eC)Zqwm5EtwOp+!@Nzb>W|bcoBn@}jB35#k^&M~kM8#xpE4gT2GMmRmeNGt4El z+eH)6c!njDI{c9gEt;uH??=V@@VUq>Z_z}g_oE_09Oi@b6{HjsQ`LA*hISjId?pi3 z9qIl@923PsT(ajNC7L?CbfNw7E*zbK-l-o)XVKJ=&d$*y6G!a<9WE&urJTH z>+N;^vka$>#`AD&?chiX@d`~HX<0R-O1a(haOML!2TdJ~dqw0RF69YQqN!s*`0B!e z`|@pd%?9B3890Sg$5s5YL#*>6DMwRB`m$=w2YXb0w$#i?9l`ry->8Cx%-lL!G<7uk zcR6Q(5YPR%_Wc$%~bh|a_BjG9!{SOR>c|_L{o<et+7EK+EXS`tP zXMTp2gE+Qhqz0Wwhy(3zy@+P28s8kqY(up~#4Br%I?^|OW1SaCAzp=3N8Y!@{^5Qx zt%|54?_1*7E-Az-Gd4zZTracMxQ-T`>fl=zF;(IqF6tv%G<7tdL(axm_t1(aqVXIueY()DF&I*!nX0^> zVdGd<^fPQ6>w|s<(jCvk!Ozerg?NRg4nF}QuNpY+BT+c>;fNwBM^i`Rw*k@bSfYHn zgY_Yrh{kUN;;j!#u|E!me}CFwqwjlr;%5KctnTQAv2Eh(g=aokOtS+<>VPO&yJI#Ai~D7R{W0vcZtbS6>f~Gv}Ar&q_9UZ1-5_Gv>@ncD!Zx z@TKYL?Ft87DmkJ^3h^qOI!=7<QFd!T(|7y z>Q_4xQ6z_0rM{(9J(IOOA@QODk+XC;qs%6y0>V#8g>R=#?X2yvj@ z(W05E#xq5nGY}U}L)^a|=MT*Wtd9mnfs~_}DxYyU7qMM2UbZELQ->ppq@s>E!!f2( zsqtP>Yj{J3zE@Z>k1VFY6_yObsUx+0qRmhw1sw`!K5h@^)P57bW`Jh*#m%;juynX3F*9L}{oWy4t%`)cw5 zl}h=uIE_+>S7_=;-!F+Z=zbAjHHv1=)AvgvLL9{9XwlTsvCcnxbe&jMsI}d1SSOYh z>Kx(4b>2}5@d`~H`LUhzxxdOJnuz?^p0~o>?kbhWhn=`{ZeJ(*cjePXT)z7znmQWq zb8^29rRZqUEZy{_kl3#LOJDw`Xcmrpsg5X?YKpIs=%vzlSHHtMkZf0csg5m1H1pxF zc!-1a@|7&2MKd3%wG=HfSS(uidoL1A9gYwOaXDHvb)=SloCkfrgLRKRHpDABj}Qk^ zjuy>Sr8_3EK755mzcI^7;na~@OA%2dg?JTC9r?3SEK#0rq7IDh@H0|J{%lmE6yg<{ zIvU^1oE7%cXv5(a_65smo#7TX!l@&@w;lU=krd)pICbRv2iN`V6SPr86Or#9lwzMC zS~OGTFKl2Bd-M~`2j?ZGUEz5|krYy*aHi_#;hWy4r?;IjB9Hi(w!8qv5@T_=bL1tJS}?*4&uY9ek2B{;z=fyhbx{YYj)ZwQ^FyD<^j}{A0 zh_KETo<|f(AtefDs{CX>Un5{2gp_GR_0$)ZO-4c}KA-QMTOGs4-Q{bI{NIO)-$tQrs_4(H1t)Zk#rSE_9McW?(;^lyF zDMx?)yVm4a`!J^PM#kj}%7-1jdF{%zhtxEZp?ogCWLDDuuPo8VG4bQs3(5p2itrNc=g-ehKE0A{chLp2lT(`5`o_OAJGpNG z!^8Vml?`f-J+ZVrqSKI?OF8e(sp&yX*1fr zEr~{W9-$VeRw=aFSgCaPIbCa0L&^q(9)%o^IhJ$Z(%S5#&mh(sO5r=5RD)}u-nI6? zN6V|jLg~7cqxTv!J2|vPmi})iUR#}g-nNz3L!H0XcXo2omF#O+_Yc2w5$nuKe!K`VVT8MW(TwU@KkrjHFVy+C^=2oVOksLGC7!}k zX~Ii0ss{!{r;rbqa`enMTaz=+P(DVlU8+3%+3M=w0s@{Cm7vS$vc3ic( zx(`$>Ij$A^5#lY)MZRK2x1dlB+6zLR>?^M9LBU3YAs z+OnX-r5ufX{JJ-LbE)+8fVpjJZ8W%cYe4uYgR!=Cf5z*hQusPokGXA+Z8*5rE2PS$ z9F6gK)&A0P)v`ggp_lfn{wW~-c<=1wPX~V|j^{7zFemv@8|Vw$Hybo3Su~Y&skF_T zgKAff?N@y))VWJJddA(Mx`2i0y5IvxoAJ&jjB*8b?TRvUd@`DMTA z;4ofYh5E1&+0i}*bKcPWG54-Z)A<9ZF)yvp83@;0(gD#yN^=I#Sw9bBNwo5z$2ro0 zkwG-(t~i!7AfR1RidQjl^jY!E>gp?NmMR~IvBbwdj0U%F#*q^v#^SMP?dVar{daZs z?NX`IJCv?VIoij{@Pfc4{cEc~X)6Cc)Zo0HbCNMPAl?hxQEQ8Pb`A9OcGT>jUt)Nv zH0am;Yxk`&s{D^IUb&Q`-@A2o()SCE?UP;^RNMTre&q$B20bpcl70854z#NsHwBG+ zJRcC_#`G)i5=I}FanXe713-{3jPIX`9H-u&R~WYG<*^OJX*lN>Qeb>1x?uH9tr z@P7v#F6HQx{yaN5astt@bjzW1Ybaf}Yu!R}%c)fQ_oGY8CzLm+9UBlXZZr(pZ6JF5J0=p)mD4wph36B_MGGeg*^oYlW}%Lh%>cLTyl zOZ2F#zT#Nxqid;jLu>!q5$lYq_6s9}OF0^S@VT2b?)JNGL3xW&n^z{KmgT}{*cwni zYJIRp@3=$l>a0r^lzSbsdF8Z_bC-f$Dm2Pay`WV3Q@1bMeiT~bn*o8jNNv|!hPRkf z>6D>gwyhBm{R6_K9F6%ZYwe#;yte#suw*a~zWT(hy6pqMv235WzMf^4%>L(ITRtx! zU;((4qleu&%dDmMHyB)*5?bO$q3xbGe`dYyesA|#^|m{D&so+IH{NJ)<*@g!7=C`J zL6>rL)59~ZwSUxoaAmg*=eBLO4iTlThsLoMh^A9OU)T;E=kCk!Qfbv@gDXE+ens1_ zOH7rdpigM%IKMy9rP8ij%pLyM(5rR~slu3{mC3V5XEwvkF>V1|K49+fKL*6gP*yJG zXpAdbA(cueeYLtec#TqR&7i}rRLnS9HM&(>D*a;h>gt@%rP`>_5?#vCn4{#s4&O_? zYC-kt(VN#!3kZys@+a+b{OtNV3L|Q^D%$U|1=VR`<@HRMKU~VuxAmMIy;PXtN~P!a z+@SW%b4#nIr7ITMyKbvvjgwig@9e%o?Tla{?-JJME`{}u&~C$*O350ds`rK&=e$t5 zKEAre>XvL+(RUtIJu@I+C%TlQebf%`2%pupcJv#|%O|9(3E2j|+VWLcsWkhHuC+^+ zFE2kAbhwmT7H&(FO8wR!Rb3cHxbdOR-AZ-4&8^ySPX9Zjs&`%7zqV;WxRj&ao(rSs z*shhItzKTeJRp3X;g+{sj9PR6pQYm;ps`7q#i^Ci)e~Guy zQt6)`EU%sy%BvPq0eZ{q&rB ztE~YsH7#99Il6II|Huyq*H#Q(Fuxgf{?P1X(%&+h>Xxpw872&!lZK-Pmwhz2cIgWX z=Fbl!94s$MIU07?j$g^Xy8XmHwccUHeOt(fTN9%f23SQ2SKO+ZT&K}oO2mGQ7#>#8(;-YP8UB}#8 z?HT&HOF0^T(KWXK0%Lpdew2gvqXzE>EC8ID00$O;*5t4mbbcbdMiLOg!%~BX#ibk# zn?dzdDjoR9(&|3JvivHv5+4D4Uh)y6RO zK)@2dxfjdI*W|F4r|-l1FO{|%vrBEaPrhioDwM8EIoj9i!QLIyr#Ah?8Rgx>$bcF= z=OnKCd`0Igy;7+ucs^cvW=46tkSdpQH0pfXLahh;gt>gJOBPgj390g$^7++kHhd#@ z)aJFma~4#`gjBhdqkY~jl}7&Z-tyT`Z&N!rv=aBRdaZeFmP&t|cyD>oliNhw$E6(Y zKG{;~o8VR3KD3g4A?MyZ-PhxNKKK~|B3Q4{i{ny`b{|l%eI{;O>on=wYBlKap5uMO zds_JZ$64Ff4!HE%>iYrVQjYe%621ui^o;VIq32Ett=;>9uTp&V627z%>ibVW4}Cr8 za4AQ7zX@Looix7MZRgSK-u=zvsnoe(;_bzXc+iJ3sk*UXv5V@}~&9L$`b z9?!El3TIjEw8_Bo#_8>WA}OR@;mpT~{U+50y*?nGH7FW!Ak{efI6@pqIa)Mz9Q);7 zwYAdkbGo&y)dZwOGan}eMCTMC4x}6{nmXQIJ-F5-tkY0dZs|E%;dw-n6jGvarmFEC zJ->s5_JbEz^!*pnY**!@|ebGcbQaY$I{0<_-fp$lWW~zogKDpAm@Tqv?F#DQE_%h7d=O#b@#rMOw z(rh$(lp|cq(HV`?34Y^H-+w@Q`L-SFK;f)&M-)jpnmIrA@aM~&2AmSd693}N_eM{y zzs8@1BUK0eYHH8Ik@Fv(G`>7K+~Pt1@DTuhv8#{dSfX&2t|N-1kamSL zA43m#zIyN=rYifA08ek|8$4M!^5F=a{m4r>8u{4l-vg?%e#|jZGY+)-j)}sV4@VS9 zIhy(CA6{wx&7#GzU1=mkT(Z0&rEntN34P<<{fQ`&ax_!bcsHEm2igx_M$t~+e2H6MOUk~^)f~Ujt#2^J?=Imh;1N+Q#WQ#MGFbc;b}f7h zJ3XrwUTjUjU4oa!@NEvHL^Si^r`yDV6yG4@m?)b0XngAh-)Z2C%vY>AQ;VjK#sZ-PM#y7WT;b^;uF6v#qG({9kIT~&E z`0yS__p7?cbCzf&w?9T709JSK2OuS)*-9KC4x}6{n)wK`b4ByHe3Rg8RGF2`Jd=J( z(M0@mpGlQ5z4*3>IMD8B(M(nQk@uIsz3TK>RzAvPZLHZwAC#3Nilz9ic(u?{smm*S zRQ|JKVARoCJ3ra=?yX|^;A{3buD5j@+cO%ad+SSkR9aUNk#U;a9i7ogmES(oNR2Yl z%!#(7aJDN)6iGRnr5jGr)pUYRD@AbJYoKtJt|N-198DcpJkxFXqV%m7cs~w5o%6ZR z;R>gY*I(#1d|`?xl0v)+r;hx0GiaCicaZq?2-zj!oIbwRT*Hi0B!zetP8~O`zt-?K z!xy@MSUI63S@Q^`Sh6{F&|4x=OqjF+a~JB zXdou`Kc!L|NkqnJZg+G>BULL0tzB7p;?Xf5*@`8+FIxY;UUPdE4#ZkJtzG#tMHEXp z8mSuAYg}#f4v}o2xYW2l&7gpb?BfcBU z3YOlDFMw{2-;5(2Q$@=%B3#PR8I7DDzVw>vpE~nPX7HFFcK~fFte0V5Atj>Ot{fo_ zq#P}p`RLL2*xEX;u83vj-T`@7ASIeQ93c**94(qUZoTKJ;a7#+qYu8Zb4z_5^nRCx zBj=7NmTIzIi_-nUPtUEaI`ib1k4tBro1FCtZ1tx0{&$|6JT<;otdETDh{!n2?T*f9 zq$>T=UxykDc4GZIfsJ4NtA9-}B3vq~e|}j|EhhGln)(OMH1nI2&FwFIJ}q6{HyMpo zl?JR`d+8+hD3@|{MkD7Rgn72xQTNAwp7q*rpL6lK$;t)n=Na7*k#U;a9i7og)e9Sr ztX*{?zmKCiEi~BR-2dx=%bW>3k%| zT^~6!8mXG|#POAlMiG&5n%fUph-O)Z6@5)BdT~%Djuy?b`fr%gTAF*sI?pV! zfT({Xx$%p~rP9G~?o*j~G7&E2=!`}_8sGhx7QY$_?QV_uODU|jEVBGg5#c4g|n>szVvAM$?b_Kl5#Y4G`_=vZ`^Su#8;C!4~phInEzf; zezx@au~b^LVqmRzu&a@e%*qI(^QF^M`?|ToMrlM8OF0@XG2ENL7mnJX!`Ec)Jr&J- z`0GjHpiCSsnq}oLv3Z%`g&urq98#jG!x7>@%F&{!qwmIRwf!r#Mcsm2@U869X0t5O z5`!(;ChN6Ws;NB-M_C20K}B8zt+1fo_kk78cIAj7DMvFO@8ADa+ePVo?%I7Vn}s7E zVLoq@1yC&2WGi9hV?bDStqQ9z)OohT3N7RNlj`$5|qDaco)UmYd!0KiD(nqG!1qc3C zohns0bvU9(%F)!}-gCW92@c;4V(BWJ_2GyjDMwRBqb~z5f3XJrolL&`rS}sXeHqzn znvz1iLQ_Y&gB9xo){<_~U`Gk(!Xc$_BGO&5h$xami7K3>`^VpJRk>;Pff0ezvA9Kp zxcnrj!t;nCDMvF^N4)uH`H5}EMIEqYaQg%t*gLwxp>XQB>%~XQ8}=rmNXpUFk$>lo zH`XVHw+$<=@V>if)_MM&J4)f+zFr*?O&$6BwR{7@-+kcyTD<|`h$1P(tMF9E+j~`h zb_l;dggtE4Gj_97|DuVwARvxQ5#pc}9W9!r+xQ;Y^zd#_<_pJ+gLpOLu&h#xEUs(C zffQ^lp+z%QjW#vj%wzvhYe&3zxdq|W(P&e%N4XT@6`DHy%O`k;`q{_QH#s`v?lbE^ z;nb17{vBJQ*Oa6XufnM#oug`+2XTWV&VymbA$?&xW*pI!4>Mx}b);J`Pnv*!wDOLRn$l%uI59Yv!KjFxzV3>>r!yiJCBRygZC9jPOtNXpUF zk)8vH2<-RkUZO@$NQq`X93c**94(qUW`_4NE;^U*Wxxu@T?uf;gmaxb<0qPkFJ78b zdFSG8u@8y^?T!}BRQahFjR1%XCtZ{$h364PQjTV-W>>5 z(RqY8(C%o_Ox4#R=YRfHx40fu&Jh=Kt5b}ksiQTN?&x#)T>x)Yz3Cpk=sZFkXov4jXwghndLkv(IZmG7_6g#`u9fb%E1Zb*)JsGZNjaLS zx^2smmAj7W9uYWsf_4Rtr$lrfAr7=VS~OD?zE)5UU+sxH`05DfLA;2sx2Y7)b`{>^%sDqvQ@hx7_tdIP=&XmH)d3hJ2MKe|5jjdXE zS1tAr4L4 z;pj?j7b0BB(HRXNSvc`q4rhd;4(xj4mML`L?3jE23THkXQ6%MP<|Ex1jXJP1DjnDj z)tXb`)ZvICDa5Prx{h+#uZ=piN(IN$u5jwuA)Fl8Ha$5|B;{!8Xgn{x6-vb(ynmkBfL&o4zE*2M3I!EspItj4k)kp zWBPqmgW&l5s&MKEexI^DMMYAMrjEvQuXrz-Ip>RFTxaq!+RxZw>xRg~FMSgWi0!D(^>;6yjAlb)@@hv2^9%L0oQ4il&ZqUo9fUL0pa& zO&#C;W+w!|RqB)l2 zzZpg;es6?m(bSQi3X7?dg$xew+VRf0!kLfsv#io@@I*wB6yjAlb>!dd=Xm9QvBrIa{G0t8uOx+d zg{F>1Umw3RhV=3kYu2V{=ED)ASVDN8uG(z2)q$uZhkh#6b=nEt)w`UzLyT3a^{OnnYZ9Z5*~Jq(oCk`f`0l zhyy7{i>8kBE!Nmd@LJ$yuh4(xQlhCNeTy|B#6et+7EK-L3Dbz+OX6G)VrK*2pM;dc z^N1oTq(tFNRsL;U#_N{1XzIwnjmy%7ErL>jlxXS*{iE`)wT8re@C$N$+YqmJ>YEJ; zr;gA+D(|F-A}PeHaOy~31&%uOCN(${gYQITrEuyyb7ldM-)jRUWHSKpRB=bpzpBytS_2693c+ka@+A7vLe2Bk% zi**hQ2jQ%9M-)jRUWHRf%Ns9OFWV`5PhW46!}30A51z9{yFxg1Jn+fO)n5$A-qY_W zg?NRgj{Ns)`C=>Hc*XaGQ9h!H$bY{!{}QlX1!n1{ul%!Jg|v^jg=OV^0;xhc^O1f@ zAR>ySkP?M6ReOa~XV1M%uK}#^rcXJC!-LRiOWrXNO&uErKf{P>=4X(UqeW9k`VCO# zBlS~)gRfQS4Sjhane+4;pb=3dFJ4gy=s?s;f zBcezO@hY4;e%0Y@?bzekUa^YbeLCB*Xx2x^v$c|fKR{^F)X{iW4d2J1b`td4!0?B}$?*n?@qsh{UQZFzgI+imtP#BMeZjGN~QewiW;R5uh7(y zA4@o@aWvq!YdDtJH<2nQe9qmBA}PeHaO!aHhuRP77M>8@ZxGEocZ4{I%h95#Bb)@R z>Leg$1H91(4(1HK8>MjSa72-mqp2g^gN!F2bk-3Z>>}!|Nzr+PIMD8B(M(l(Gc3-W z-bOJ>;CqmWS2WwMBgBD}qeU}SjdzhbiXtwzibYdLI_}035aJ*%ADu;0NB)}@Tz~jJ zuvRS8k^iOzS3;6Pyh2k){##p|KYZjAO&$4fZE^i_Bi@-U!juk^e4oIx;NBSCxszu8daU;V#(@$5z6(;$ypV8;4dHts2ox zRo=Ihw~!PQQ#F-m2WzlJaS~7#0M7X6yJVuNBRxA95#pd9I9fFON8Y!@ahK~%j#2b2 zY20;0krYy*aHcB%ZCTDAXc;U2!9FOOInRGvmQrYa_#!lPYuLq7GR_hzq+JTVBNxRWx;^ z`yUY@4&rjOXzJ*A%Ty~NSTD==Z z?(owar4X;s)Zwj!Era=Bi(v{C&YU}PoH~vTuTmt}bmw`|^j#Fx6ka*O3(AlZ z%^GxsIFQnNDUcFP9jOPhhH)33#+_EMEuk0TyNy67oH`s)B!zetP8}WJze3vu$7f{G zM09-r3KjsgnXXPA4IpIvi0Xg?JTC9btB^bUKb_g!KhU z#Ko@;)2b0o9S^rntjz97gg9sojuy>Ul72ZW*17vwy%&k5j`ZtX5g`uZaC?nhxi0&!_JKyGomRr?gBQrMd)Yd51v%F#?!y7Lp;mA)nj4%UE66Mk__G!g0U zQbdS@^g3EJ^O2s$jR>SyzCLfS3TF+bCw?1RyK>tR%~W+fTZ`El93MaA<)n^|XKOXe zNXpUFabfsk=yzVq-m=g)Yc)DUN;GviLL5k8jVrWh>d5bTaedA`FWS4@G12-wzvtB` z74^lvFve8$ZCQ?q8mUoh`U)RwF#l~?j+~N$4xyQk{5~hOa|e?tBTRltR2h zQ^&Ay6Y!INvp#TgS@SDSuBvnu&iZgfkrd)pICZ4w+p8FNaZ*;_EXJwQ+n(UtR0^jK zM-)jRUWHRfdOA9`cKC`ndmrxxarJxHtL%dcXMLn6upicC5&> zHVp5ccX$IrdytZHGb$`Rr~%F&{ksDa4B!L^yRcAS_jqa(&d1Ka0cq z@SRH0MC8xnEP;>p#!L9EUwBW;4{jdo zSu_!;w>BcgL2GcdXtt6~w>`Gf?JL?oJzl;z*>EaPW_JDL;^f08`^R}ubRHoN<~v7= z<~%s%@ovLkNMBr>`{C5&*)B;;`=> zIK~pJ;s##L{aSw^R5a^6ed#tL#6c-KS~N>H%s6eghC7|m;WG}P;xmLX3xc#Yc=ED(1QjVsMbf-GD63z683p>@TujP7K;Y6gn;So_JuynJT}DJ z%F)i(RN*Taw{2BBwevx-l@v)KUWHRf`s!&!ActC?qkMFZOySIjBZ{ODufnOrPtf_U zg|7h>&bI4_A}PeHaOz0?iDmQ;c|X8`mtsNZ%u@)Oh}54L5iaFu(M(mxmqK(-8#D5_ zQ9NrPnq}4TH4;f-J{MXvQ#J7QZf#Gd{oK8P?#EX+bvU9(3h^qOI)YcN;T|OF85~%d z@^Y&NslyRPQjTuW5&NL5S8xz7`Xl01c!Q3HUh7hhrjGQ5@z{2K*8(RiaHb4sg;R$k zilh*)!l@&@eHK#%+dyYOw3%+bDw;YRA&ztit(d4Id^e-2?`HVv7SsXu3K6fuslyRPQixaK z)R8~ew<+81BQujd52s(0r}r3MD&^1h<#&#?i_CuhML5SfG~HdAuxe&<$(FsN&9L`& zvy!%Nw~sc1!f7)c`@*B;!_pgWMN)`Y;ndM1ytc6JKI!`mS6>`Yg@N<u(#&Myu-*-6N4$;sI3^&DP7&fj%F&{k zs#Hg8?LhqSrh&1nAa&H_fpvWdXR1;i5m6*1eLz!3m(>HR|4rY&x^Y-|v!s3d$oa#G zt;u`Ou|5<|9T%?}Q0pl3k6&Lit3F<#?V_(BUWHRfsE^_5A4O7#SK-ugbhjau*{cRu zVDHWwIx~5DC!Rbz^oW_ssb4W43a5^~YY(Z+@64NFMN%;zDVjRc(v3C)O83s)xIXt4 zwrC>K8jJ{Wpxx1;nW_WU7+8KH9or|3pB2Y*#O39qa3VJS&cO1V6j3DQXr}6mpLef( zw!z5Q+7Er8C7CvI@7Q)n&TUCP-f{0(9}1_AzXrs*;dO45Zjlt?RXBBwxM!=%vETAd zz|YT`nUvbuuDmTNoH|zhVXMkDDWXVALo~ zt)}dMluIh)noAkv66KaIqMj!`7`HLTB}~R8P0e6p5|Y$g@5^s`FEKR6uQ1HdU}7#A zmr^~)Brz^w0LXY}{oTJ{6P^-kyd%7G&e2s%i+j=z|Afb$0aXk6-gmphP#gG<*wzk zz8sLtIXD>Ye*Tn~6?5)7uCx98|E_UFk(8ocM|GbO({!{;Ur=uEaN0?<< zre#SEv@4plr|N7g*%j~kTzg5U$)TTv^H|r(p`RmO(vH|-++sTyW) zc}-q(aF}b)>@nGF5g$ML^_`sBrKDZQ_V&Kvwf4>-T01$2OVOlV$KThiuU^yTf>0l? z?`5x?4)V5p$#-^tFj*Tg+;#l!v-Q=h_H#s$RLE0;b{)yuAn0IgKwPwUAVu1BBx{3! zAO}*4Cha>Lo}K)a$zd#Y^Qg%w^#>FQ{yb~M8sVdE|={eUQv zLP{9!sY+}gPnFp_tPdSOV96ldbtJY=Kom(KUWU7l_f{;azI2G+0A&q=^Vpk>VQq+b z8SXl4Jy^9hXV6h3rD)f2lUV@2NnYE81weZ@*a^v4!f@B|QtLxX&nAc>Da6Zg*P(Vh zXHIbNm7RTsv?J7RCkNUUP1;kH*oh(Mm{Yk{)3h_(5s94`5Jgf*3Bx^Ay?T+I8G!yB{Z-pDnaq&IaIcKLGJE+;zmZ!%|63c^643 z+I95UaB{hiSxnHu*%=&I1FQb(^Ev632y&oZ(WE_9Ho}!T!m$Psm#(l$yAB&g%N#|? zL0pO^?K&nV2) zkY3##BJKIWZq&2KCVoZs`~t5WT|9lEzz!E z`|SU|?`7oH97(t%HjWrsdM)w9RwRX#Fx*p>>@x%%uyLpZy^H&a40j#LK0`nhNg-Z_ zyAHFjO0=(XBbnH340j!7UzKQI(dq+-QX$?1?K+Y^7^A3Yg@dCOE9sU9a-c)eq&-zu zA63>zn1yYB4{>SvFx(MVA63>zk(8o6Rf)YDN*Ci2>L75Wo*C{s5_>lw*h;{ml%ie7 zKh3gy!cL5YvXWIb>`$x>fre$kwYr@(FzfY}FC9@Ng?Jh6I*wkxzErk5Qb9+ue*q46 zXoC*f*NCE}AFnSBP7p;>igq2zo@MCg7y+<14UUdDq#cp$Sq20-NQt6JBRqfIxD-v=baO=u5)Nh`y5(ZiC^+} z$w<2nMUaD+_Y_SU;dTPsJa}yJneVC*fw;b@)K<S~L$>qx#E1Oz!q zucAqNKK8X$@Y}!i)1RMSURxP6ZtsxxD~8rq<}CI1wn@7VMUaE^Dw?$CBe4_1SfVov zY(sqiLc9!j9f_S75Jgf*JHtI6Yi)IR-hMt_VGV%qQQ%+=$h}vFyN;jO3i4JvC4|;q zB&BHA(fgWL=Kdu4(y(-SP34nUcMt8g({2+gZ@jg8$Opq+ha!rkP(BRzvU+IsfcTdK zd>3cr+Y>9>F6$EFy*Zv(IplzSgFe!(LlNX4E=7}e9sf0tT&t4Z+Mz?Pul(^=ymx2s zu-M`^xOng$MX; zz((I0_JkhaweRWdu&QFmP;$^t&u>JO!Uo+ZoXbRsy5SNYyq+N&Yx5xZqLJs6(g_c?$QBJ|(RaQ{ZHh$1O`muI+tqkq^=&n@24?~*+`4zF|V7248X*Vk6g zukIDvF=@}odxm)bA^)~b4$4H)q`jD+FlpDJ2yzgYqDi|B`+i>K zH+mf{bsS{4BgWVc%SZOz3pp>6LOnCw>wHqFYx&f#+_L1zfb@3y;`++*+xb|+aMv-> z5N9NaA}K|C&WD@to!#-Z*^O=O~?*816b0Q6z=jGTd|i4|@fCQSx<(qbN9!jGma* zIm2CtB8sFG?K*z6!=U)Ri~Xw%EXY5WeIA^*VPfT+6wK#+sD6iwQ7 z*gkd4Z}hbKki&o5`9yrLN4yMo9kx#$^BaAUl%lJULR`1pWo8*cX$SXAQ_fxhtBq*T-2KuPiry?q9H?-ec49QEQU4r%Dmz z1nq)mOrEO53J*01D;zd8INHKVw?vQw?TRMtsY+H}q0X`Lf=!LMu-bx64Jp#DLlNXa zO3|cU$8)xmI`eLy)%Yb2abcF>*)h_t!*+3Eo;)K5<*sPbULR(WmCYgxHxxK?Li^Y6 zUzgf*q&-z;^_9))3kY(cUD2dHRaS$s)p@YUxJm^FEx%`9x93Q=M3BR>!b%uYjLB2= z?&|d=TH(5K-}U`*!G;Hd;jTjwMN){D;jZJD_or4*y}Csa<}!q*&}mmo#jb+mqG zYIR|PAO}+I1x?y@+-#QX4#~+(&T8Q3nuFo4LlH$%igq1|^%~kPS9jp3g+#g~f*fd9 zG-*#&k9U@oIwkLBXesLYjNxfMO3ZnY6jH))PgUDdBTF|VJM>qq9v|uh932N4?m84v zB&BHAffJKFjr(kAayY+>xYW`k?K*BT#LNM{Dk2AcP0^&i4_>+d1@X@2KLK+sEda!& zD>~AyZOSoneW2HmXQU(XPXG)yj4nHU`NIQR;Lb5e+xv?E@& zlN^UHcLX_*QZ#8#RkHgL#w)Jw&>ArNaP%SVtt8oD2?%l!m!e6#4z!Xh2lyz;ks2Ir z8KfP7mdLMtdblI<-_Ki0A?-waKK{0-UH=!8_25VUlkHjR z8j#_xW8NF>`oGX@1qlwNkXxcX=Vn=!X<1^IgZub73rQ`f$gI~gtyh&&G-*#&@)aPo zc37#{lK}@i|Jaj3N=Q2*`O**&NQkWw^hPt`R&hR4?}_T4Dn9ssBPhT6&w6a2mb zX-AxX=8V$@9Xb9g)8`kxAiO2u{;MinQlL{bk@p{L~+p!`O~f<+t4B_cTa5Lj7fsgLoB9 z+EZn_=P~!&kG*qZy2q~8J?WMRa!@{sChetbyHPQBqYfHf8}_dd7j`_ce+4PhuETb` zV(xg611Uw5b{%KfdDM53cl)@D0}fMycp2_GX4;pydC8aRA}K|?4*mMtVcGb~2VWi? z>f^}A##gF+`-K`L?e(Dua-dz&q&-!MB@@~%TRS-WEU&G6`i%Dv(vC>1B_B&fO3|b} zRrzyd6YLzBkL_bePN*zj>0|qErh0gis@yrUmQsk9XxH%<`);>ia=t`oNLu%Zm*K8s zshwwdoiF{#dVo@>1ERe?aC(P#$>tw6-fU4nfAgCo?E6P@E{C+I3MYhUy^;g%iYD!; zy2M7GGe2Gu#$A*m>lq`?{wj z)}DO%2?%naUD2dHRVX9>)xQIg%^6l#2>VY92NR=W~ z3N+?j&-pI@tV?w$M-jLO$s1!)^z-Gf6(UqBe{*uy@te;?zBgLwDn}7I#$+Xhd?-St zK=W>=rE12{(o`u&5&7{d(^3;FLZv{{o{OU6P8!h1Q8lr06oFZdGis&*`A~#PaUS&g zIQEba9;XiFDB{gmYVE6>&)Rt%icl%g7*|}!e(^WGsY5x6IAK<8rR#_y9g0vX&<~tK z9b5iitF)|?qljDXsHA{~lQDbSxxqK?KNY!=!TN>@3Gczr@`<+620B{|PZE00hq z&_kc1j;Y%op4NwQ6w&kIS~~$n9d$q4DQ$_0P$|$ae?uJ??lv>%K>tvVBK|$Fw({Q1 z)WLi-N2nBN+>i4*Cjw=q97PN{5?}j$tjy$rP>v#|_NlcuREQXG^ZdsgR}(8o5tz?U z9m;$(eRbARKzwUCSAOVw*W!)5X)E9EGnZTDL9n%*3N zoGV8W2kmDT&bT6kaul(sQ?2`a|Cj(97T-&c4Fn0x7=nlPo6*ib2^qNM-kXzxoNked?-St=B%1n z`ROd`U_Ov4+<5;5ZKp6Pg{97SN?XYRLs3wo3yRO*ho z6Dzx(OC6dI@?ACmKUW;5i0f3t`qIeIO<@kP`b)d#7V6t+KY@tZ2S9RX=_)GBH&l8)#FUn!E64O zwh~3CRPe<16m<;$LA!JwRE{FxiLE&2icqO#izY}uH0R1u#IaS&M_N{&ANbH?K%uOZ zqX_I8v}`5K5h}Ip{s~g&OcmOdauo60Zzo8*df@I#nkwZeBJ51G=uyz22$kAr>;&l_ znkwZe;`?C}qz`sI_n43>=unO#qLU|VV)RjjN{v2!f{Z2Imd;LFNsc4&PA^T6@oMpL z_oZWEjw6VH`%aLNdi`se4n?Tc^llSm+|{yDjv^-8ndEG2pZ8YZG*!w`#HjCUHZcz> zLZwEunILnNrb;=AIPaSpnFl|8|BarCzo0y%Iqlkx>)QHWX z`B07`j(W)usahF3xswP&BBH#levn*$Sv@RX56robP&aV+`>FfvF^`#EwDB{c~ zYQ%=qd?-f|-_J0Q6{(&0n*}RFJ}{OjM-lK$ky-jn-r6T!(JMlw_I$9Wz1 zry8-4ADlBW&ADZ=#NFk2a(^SA6wQ9FeOe!iP${f39_vEH>3?~-kEg6AR)k7n z&9Jya1oMF!RD?>w>c>}WU(tUt_q0@pauk78#>|VTW59?V3lS=XHNzp-6LI3QzG==? zhf2ZfpZ*3@HKJ|zw3R4F5m;q(x{W&4U2#{cBZm+vtQm$pLy3e zKOoRb6roaBGwia02u+nDR0>uv$7%E;>6T1iM1bSOflux7~Gm8MD& zDiy5$v_~EFmhX!~hjJ8wRYul7cHH~ow5$}NQdl!&eUPa_KUYLf%B=ou^ic%X9ONhh ztBhsSY3V9LrLbnm#;Z-~P$^jb*+{+BPtHhnC`S=kWn|;-`M=sREvpM+R?>RQrp&UhEm66R+HmemPR0?Z`Y#!89sScHb4WC&V(=Tb2mX&f8 zfmKE}JHI;c-E?iB2$jMrqm6% z6Dvm%SY>3^((Ub@OmnUXmBK0`v*FC@3p$VwMW__k44Iv%`A~#P!6MJT8=N}j`BaB; z6oFMnX1(6m_J^T#(Q6fB2)^ijLZr@X6aR7{n1>9N@113bwU)q z`si7OI#g=Y>kmzpN+CR3tL?T|pU^*0ABs?^udl3;Z$-Nv+dkBJbA(EP&b}2b-2b(- z4=P6yr=L}`iEmztP$|&aH?I@^*)P?h97WuAWQ}~gJLA41vbHO6sTAn!+uiSOS)E$p z%2C8SoohDn4N?&*1v>i%dG7`9r#h6Q2%M!T{+6l;mE!3Ox0cr4_F~%Fm7@rrjcRF& zDng}rlEV?5dmNP3hjJ9bb6G8QC_<$`XWzDu8oneQMU|t7({3G~o)(ItN#|W3Mh5gj zMW__$>>GWL3zns2r5r`jr))kS=pTwuDbVou?1+2X4oXv{97WKdtt0Myee-lIQG`nI z6rv-popxY4mMBLN^!@9I3zxr>rb-bi#S@K=*k@L!6rmhNym|Ea^dwInLJXZ2%fn@ygZlXI_w@xZ1=WH!16{FP6Fvk zNz#5osE_%E`?iDoHY5k9jTBAVPa&Dti2n35p||CD0vqu%+;u3TNDA>X+;!M3p%QNi zsW$?>yTWkSVK>kbz@+=NGdS-^SBd#;Va|wbRXje38Pt`@+4T{f6&L{Fr5#mxQ(yqf!G{!v9 zNDkssG-=n7_j{i0i*P>x@p8w)b>#h?`<{hLAzq?g$2sOL>+O&IjVgMLKuzJ+H}AWX z_8K&QOJ(!W6zZHD=uk9iPgUZjAa{EJap6WC+Zburk$6G~2yze??;b#kwChMtV24z( z*CL0U+aX2TbFK(-Af;&1iH^?)l!sKhhIXa44{a?-k#-%2n~#a#B)o3 zjP1Ok0EBvLA?-Tsb`8A41Oz#(4|?%nOkN-QZbp%vfOyp!h@xan3_8exl%h#{s$RF# z(c4|zzKnbnS>BLBFUU@2+6Y&+5iTIefs~?2yAC@MU*?H;^ck@nKH zQ}<<_x+e!xiYDzk@_r!whC+xd*~@|ycfuTz_XFuWUMi(%Pt{9X^eXSNd9TpVb#n4VS1L0pO^o#rEEKJ@e_ z&s-v2hP#g6ZqX|ql;pff3h^@BbtE27LMx$%4aB7$_ei@AMUaDjplH(GKg_Q|+5C|O z9rOtXj^1P>-4a0#v@4plrz(Hn+0V)cMB@7ux#f9!N96B2yN6gv@uWSZNPAf&GiM2X zkX}`gUOmlE+Vhdj&H+IV;#D+hPgVZSm+Wg8zXCyu->DptfAht^RH+owPPFI4Jn59_ zdxzeWkY4pQ$Z*%8h$1OPd(QLsg#Atf;?fc&?K<-JgtOZYywdy%odp?p?YCvE$`r${e18dp; zE_EFYcO8l-l0v);cO4I1d1ks_!h8S7;nY4&cHYDN%MLlR$xd?c9jy8nyQKS9Dy3+8 z1oE<4w@S~2XYs1k3B8)^L<)7F=KP0q;TcB}mmO{~z2>iWQ5yd>b}l^QD57omCOcVE zgiwwm4%)A&Qai2)p&Ugl>eOUsiipUc3(q);$oq%Oa)NW=8A7FY*wNl?>_#1mP>v!# z+p5XVUlk#gqlnSpHdcQ7miujJel9%YD1x5xyv{XM8kb7VS=Cq>Jc~LMp&UglT-I3G z?e|3pg7`L-U~=MfgjxMC8wfH`>WX=O}{S zv|FZ1<5DSqla)I1=fWH91g3Ko;qSf@kv|vSXs0||BIy0QWvVnTl{)B(Mmv-0KBcpg zLa$YhBH9dYv~#aSUPnuz?l@J2gn?Hon$9TTs?N50l`;Tb}u zKreiXIt+27r>rJcjv|&VYDjfQk)D|ILOF`~eprL_ z!Th=KjH3wp+0WMpa-NGT@!1cl(Wf`0BSsYE&xH#|5YtNy>8KP%`E%jI5k$`8f0REL zo*`6fdbfsjbj?Z%`B07`ChumgG{_v4VQOOKDB`?t z>SZ3h>;pd+j(jLb5qx2wWeqAqr7l}hzlqsdIf{6ANxj$%nh)hD;;5JE#V*O83(q); z$iMEGKNp@MRLb8IrtOnI7ha#*QHt<4i;2*DC`S?B&!`tW@!NYV>6cOEC;~4v@x99^ z%AX6*;!>$SAFMC1UNK%NM-l#FI`fe~7ha#*&WiB2*J*`+^^l(n$9ZbyC}Q#-ET&|g zkd+i#qH+}R>|OP;nji-GP>v!%^Q}F~;~ytdGL9nnvYfZ}eTSVMzJ^1Ga+)Lf?m-ld zdU^kJj#7la`N0=MTJ|VKs1#oxYl%>fBKR(uBRcPKQrfPR(;PuRpi%VvxDV5OC;~L4 z`0i56R4GEG_Zw(K-HO_g#K!M8aa@#(9h)34!*P$|%Of3jt&l%oi|3-ZY`{wit| z_4vW<;j{?qTsh4VeBUIB&gwBewPX~*_ePKszN6}?y0FiHv~-oz9KpA9qv)vNgVUTV zg72mvUi!IfnR7*`6lnT)%J&cDD1z@XxeoK_5OR*PQciOO-#CpTJ(r;f`tC!#c-sjt zp}Gz|m!Sxi;%iWj&~q8eQ3T)fa)h4CP=reH)h8HK-g#QVT#iipcwK&q}K%R)k7{&gQ7Ot-GZ; zSB@gomu98`rK<>)0?oIK^9bcA0)9F1;<1;NSpezmteoZuS_4sJRz^CjDMI~y=KY0d z>4G1YOuI^f#=E~Q+m&(@0bjFtRoM|{k)`=iPIE+N!qk0cA<0t~V>TPFI zNB$mUhEOT&sxSJ0h*Oh$kVutkS1IhOZ|LCfL`Km~%NC@)RuL+NUG*RJBVzkAN2NVV z5h{f}^4|?3f@OsoRD?=l&l)ctd%MctgUmRJz^?k;H&I9a9%P14DeS739w%bjf38V; zlxkNg?2(t>B0}?_2$jN~^)dG_A2-igm+DZCBCxA|)n**2_dD*QLWD|TSN-uWM0`Kt zjmz>;GUF%$yXrG9qK^DM$PA%U*dssWdLr`o zATxwYVPAau8%$OH9%RN*1oqoI-9{bxdys+722+9SE;beZLcbOSt&v} ziomY=$1!z`>#g@78||c%$E8x(Bfs@!A~vN%rLfD*cb}WzgUmRJz^?ik%c$doll&ee za;|Zy6!yq>SwV!RN)alBU2eYO97R_p_aLD|If}rp`ob@$BYzJvi%X@j-#%&$5t^!; z4v`9bn)y2bsNv ztqAOqXJy5lqn~SBDurF{td->NL1r99U{^h>b898(c%^Zv6!yrocBQFOgi3{7?zBh6 zOEdp)%25P%)wBMQzX#cn_9&IY9(mRWnJTnI)sd63UG8l3Q3PKHMolRK`|a6SlD`L; z#idf%Z_mc7P3cf6>~d!#b^ab?#!&=z)w6Loe-Ba+B85HjY;4z5sdkmZE_XH$=I=pf z97SMPJ)5I!R!iHJ#-&o&BhThRO_d^43VYU>mGR&M+3kMiC<43c+3ftkm3Py*RuL+N zUG>anIAg{&0f9cK2$jNqduEqtJ`|x+*t5iPBYsN@2e}vyczE zOz%Nv`_w9hUG>ZgU$EHkK{nT+QrK0`)&}`|keLpZ(p~i^O5XoS&PHV`EUrcTY?O!l znWE(VkANtW!brq$pFffpJ##0WaM}nj!%P|F=azWV$#o>Jh6Y5Dl%oCI(kY)0i1)4d zIZJv7MO?TMK~JZoUB|ay4v1ISTZ(8cc)UG; zl<2AHC|dpS{p_`6J;$!-`4`kyUbw_#ilV1q|2&+(vTrOogi7g2`6&9^e!t>9ud;F! zq4!&|-eK*ktQ=*4+XF)VXSuNX zysQY7%D<_XVJznxviBJkp|A5r(R&Xc9QLoELph3=GTZ#H3~HV#l$9b>3NIz_jpQs% z(4ibf;7x*OF7;QHqiDo|kEW?ojw1G~nOOPj@0zCyIuxN&coCugLF(9d-jK&VZ8c@( zDB|IP6DxyWq>hgN+$C)#icl%Mw%PR~>R8x%yR?-kM-g}(`20Qm{ACo??YM8+N|d9B z+gnepys?3)%F4Hg0m#zgZQ4uPIcgZjY`zWfZ zQjQ|e?Gp8t9CR3RUVP$|3= z%X7UpJI^{ht#jol0&fZRx}>=dq)HJg73h`B$K}}ogi7%oa=u+5 z=gLt;{v5KEZrZMtqlotouh~SMD?+94eq2`P%f9|H)u9|k%(Qz&S=-%f&{pZlpa_-X zDervFQC7-P1Z^KjjBR&CXjdpJymoU?db!FYvK zDMF?2HefbhX^&ElBJjFnHj19R?Y?PiSB@g~I&Yke?f13bE{yFcT}7xA?rdaZ`<>Ue zPjx6q5vRO+{U+upMW_^RjAU~Za~}G+a1?0oD^ZRjcnblceA|Llog>;ps)XcIuxNCMYJD1rqb%{PPCTVosgzVIn5CZFK(VH zddrK9i2^%4v>x=TnYX*PQpKG*yZKO{qoEm`dA`L}<@+ZaWg-}Gggb47rrRQKuER-PS6 z#2$-INXHUIs1)cnC-__FQ8e~11JaQ}If}Ts;o8cTpS!n>e9jf2QlNkKJauFkTXPCW z5w~A;ZRO{e6zNceN`b!gG=IY{(}4O=jv_An#kG~gKJXo#DC*lK^$MIrs1)eCUoX<3 z97TM6@wImDl{&I?)s%0UQ*Z|VgEr4+sP(Yj5PmBy=5po_~& zIf~dYy>1hAt_YO^oz?l9r%zAYu5uLd(6l;fyX`No32hf6gCbN4bk=tFSoCb#c9o-u zU4K(2eb9PTIx;AyIfA__t3RYl5uhn`&J}esG7SCdfHddIX^to!eG~zjQgvt6$(U#( zT&hDk%@G{!qG;`N9nz6O5uhnGr)Qmv?O*SUN-bVtFMXzS?Y;vKN?VB{R0?!9*Df0Pbsx`7O<6gL z*eSMGdr}J^%X=Q7QlK*{g9wzaauk96R4GRh z*zrzZijMa0ntE0(D?+8P-VZFIr9W@}!>JBMs1)|ENB)5b)<$z3Duq4k|ITHq?tW_9 zH0R1u1op2#x|}-NK0Z55l_FFMJJ5@6qYkDDHK-g#V8^@P@zinO3tNX)(j1{u*uTDa zA0jrTL#421-E%Zkb=1<`(|jmL5&8FockljWT2_isDeOS^8$uo14mdT{p&Ui%`^8c8 z$<7C+IuxN&*uQ?`EsoThb492W_N=!!i>W$t-(6E3%25RNuRnQ}I*uPTFU^M{R0_M% z(@vv~6|G)McR!TV0`W3+T)2K=TIY%gbRvcQ>nv5zkC>O{LlG*4J?mV~(|jmL5!k;j zE?q^a6!xsMI=323btp#>*uOsGGv-`tP!TGH9q6p>uI%>bREKgDfgSIYw_yLU)}EG? zB2)_d*DZS##u7!S6!xsMe!gVE)@hw9M-kY+&ieWM592gdicl%+KxgBXmX&f8fgSH` zyeiM%Hk1|ep$L`2{&mYy6r+zKR0@06+1PF)b(#<5D1!crTFz05P$}#{XLD4?&PSv= zl%oiGPjVe=R`d%wM?MsxQrN%V`o~4{xgt~wd)C=}ZnJZmD&;7G9({`mCMbKN9>p0@0E+JK@b492W_OG`)i2FX;t`wnC*n!UM#9JO%o0hI}6hR+b zo+`8Y($$?JREplZ9C7w{_ZI3NDaMts8?TIeubvvbi}A&D#HH_)lXe{^Z#F7E z{C!7|gY+tzwCCf$TlOliYULgm_1hi4u_0cDyADMZNg?eF_k5hR`5~pJj~^TALrW3w zzo7mRFT-8O&RZW+nw%htq>y%odp=$|@PfGW+wM)5_wEpv-j5^gIX+;vp<8BxA*`Rvfo^<4n< zj!xPUHT#Vy|8}t>$boi6llD|4zCS~qvn8Sw*;64!+Dlgv{{5 zfp$fc_EcToziWK#*8_qM_+pIa`HSN4*m~Kzqe7iC+z~yF=^AhN!VyJMND0F|RlVMw zTDoJiQ9%b@QA%I?HvhYLV;k`@+;x0wUjF}-AawSkRERf0yNUW*P)0aDYOiRdn;M9WOnIDYmKOL^fkV|&Qu{@hP#dnUY}h$V}C~!Ng?eF_k28e z|G0SO-LC{M&G5{7+U)+JeAEjmY1d(%pyR_Yb_6+yOVOlVhm9pw8%shy;DMX@fM@Q} z{k+Z@?mEV-SW^Ay5JwbAAzp^Nj>LOws1H58qvIgMU56ryq)-P8_xebD_J@4%Bst=O zr+mIXL)vvDKKlcL9Hdv#q&*+zjXkC}c5v_x4&uTIb-uep+I8$~C*tYxogC^QnlZVK z#Akm<6?~8L?QXRV8SXj~pZx(*B!zexp6cj-nY9$OU40>s@6sV&hNn9Ek4O+jQizw~ zuET86Ds54BtB6eR?J5DS5gP@iN?X z{B2RY{x2qoA}O>bhI_kOWR~jzZ!HOP6um7VF13(IyN+iL86I!6K7v${gY+tzwCBTo zm%_04^I0HwWL5j5N zILHul5(GJrQZ#ATk-WzeS|Voy#HA@A?K+b8SOS6^#HDD`t|PJGV)Q{+Wbd~-CT+W% z4bVcf_tg>`E+EK(c14r+RGn=r;T7*q4W)~fF#9%Ezokz7gFe!Z*uqxZ<5xR^9Hdv# zq&*+U{Jed6ShDic6Tdo#Gu(AtdP)0o>ur6lRwRY7mf=3`USey(`NMqW#Z@ZeQlBiO zUB{k==ri0AjAc~|AFT-7j`G}9{BVJ!uz{rVr4G}NHU5ELIkLe@6NDA>X+;!x~ zt2*=DR1Wd#t_o?_ksq(>%oCHpAjh{SAVu1BB(GqEoWnys)*RsI=uFxX$x9mnK@Q?o zG-*%OZDxg^xc`V4eGt|*-;mYyGQ%Aao26gb&k;pZND0F|RmmDB=+GB$bMeZ1BTC<+SOh^L8|mtimm|}?m84vB!w}G;XYnHKWav)$FrTw+u92# z{iZim?t8UoD4$OMZm86}(97uBd0jtjsOoPtJjw%?R!Dcp}Vp=o-^EaD56LT z@iN?X?ET+0{r`S(kMa`B`T0jTR&Kn;b9j88#>!)3y?hp)(pWj^Dwfrn?br6d))12n zp;C%IvU6kQ(+MoAD~EP0UwrL?(&1Jgr?qXUOj?P!>`e>v`|$i9dx!e?a%4kgz&NMv zOwo{z}7lxnpOP4mBMrrRe&VcK`eg>UeR@#_EFBQTYQy^q$^Sx%fiQ$ABSCm2pS8j>U0P z<$(qdkD`BW7R8GU(Q30^u}UfWh0~iVzu&{rQ8a5s&v<0-1#{Y&jv+IfDrbJ)CzQ`G z`b@4|*Zs(l+fheOPQsD%jw^e{HE%4KGv4Y$r4;?g$D1nA9zfR`;yRJ9}$0_}5&GH*F z$Gj0-g?!vFZ?C=$mHVIaJe_y6dB3>b=_uNAho0pVR@~bEM$@5EivH=W`bzhQJ*Fsn zU}%r{#+7UO_qLqxa_Hnr)Ymz~9&JkFJ)!61RJZlo^Lxaj4Y5nxUa?9k`tLKEDxH7D zRIUANef7NkE+}KX(w!8w6BzC-@h5B6S8wg&h$1PBgADgE@sOcC%3FQ8rvD9=kH7x2 zKFx=g&kp4VN!7&{_9&lHS=)comc3$?QnZ$vc^KchXL)1CDRW=4mWa|la9x|w8X#4B z+}5FP5Yr#`0gYC&$M!wT7cReb?v z-aEB?O2;--9vH|P+|t@@<>GFo@2p*^l%loVqA0c<;kn6nk}Ywv83(WmuhQThCDHArR~}}in~rd| z+UrI;nFWjfL63_l6J61f_OiO#%IO6wFCfT4KTtGj?;rNoR?Jr_>7@X1sW$=Au0s*z zpxhNr+UsMW%~8)>v!MEd^ z>syslH0F{{cRD(XzMQ?ddU2^k`2y3iU`$ixh#h^NIMaM4zWu%TiLSRcRk|PP;ZgMV zkePg z?_kq~8HXdX&N%rwYKK)lZ+Gps#HqRhy1&~^80n(yQ1idN!{Z&mjARg z*J|*#JttTCKILOc-9t8qC*#NK2TV@Km?+x2v3vaJ)`Lrbw^XT=qL=@vsj}H_9DS1g z#4vwg7m(j^u!o2}In)8ey*`rt#DFN0LZ4u`_m66)DgBSP+4D{tMHimiSUL9BKJKdB zRzIY%^6x9yN>1H(O8?G=cnAow?i8)|oO#$V>v;ETXH<_j1gxdcR(rW?3)hw(MNgQ0 z)pzWS>M(1&DwRWlxeXpI%@3s1sRlgN5+;!OZ+PVB*TO@_F zGu-nre8<7n|NBk%@(-=dj$PfDT3+?w~N3)s;509;H%>MjvEPGY|YX zbT5Bi8C*TXQiXZD>u7IR+EcX$N73y6>0WNN%i!u)mUER-H0JhW=dz#QbzPVEk#W;X zQ!O7yZaF!%=s&o#DNXx%JDQ!CCMkL(h+zj<0|x{W0&rRbU|P3g)aijs2xp(Wz$ zJ-*kWru4fb!@bUva{vKRB&BGtb35--<#`|VUqa6$h?n86LlH$%Xs-*%bbcCajCvn>0=vQ#NWtF3MJ)rV87A4LA$S-&FTElYfZM%o$f`AFWi3}sa$ zh4Nvzm(`QQd&JLuwq|YzOBJ+Vd%UlHVCmogCtpV)g+KkJ(@}KnkRI{S&)3Yo+H$T^ zipJWY{?}YbHE+8cr#T0$a>O2<547F;o+jcP>wl;0G`L!CtzD(ic8NyY-ThsrYV{>O z%IAK&X6^&u^$d0*^8pKx`GB36rE0pZ&0qcD+PS^V3RfxEiA2Lr%yPcP@HXXlHm)kI zwH~F`-TpQ9647Aq+iDF)QSGnWln-9Js#LbpRVhU;?9@|OJI_$&c?RwRqNa52 zW4PD3oo6WXJVTL`qP@<0zcRae&H?^aUt5EIGiSK#*!c47>W~CcB!zex?mCWMzP?np zch)g~oc>r%x`(WNo8hiw>Bs9!gA+uN6yjyL>zMiG?CO$ams5Kuy#pa$hPw_$6iK0P zGu-?6Qv1UDda|FW9)alV2k|o8b^PU*Bdhx*`-w$Th?n86WB#ngr3GfaeqybC!&MEb zy*uKs4XM5RX51jw>zjsH-@ik7ko7^8QuNfHHHd|LjIAEexN2JIO>4WlTch)m?(Ucs zeodEh@9U)rD&b6qUi8nw2wz8HiLTdqX%u255v8zwlKtP38F{}^~`Xu^TqET zS{^*CTXkFOwYu)pnM`N6D4J=A4}RXQ+Q$$orD$CzM$yUVb&L_Py{zmTOWDp2 z=6V!3ltTFs?PWFc`MT0?&CRY|@?&MUaDXS2Ss_ zkNo@R{wfLL(l6koT}S@?^X$bCzEA=w(yn9qTkYolD>*IF!jG4oH35R*u0s)e@`O^T z1BQEjH1C6)Q*}nxnc8+d-a52Aa%i{e9cJ&Ul+MUH2S?F6_1&udmK_>jVq+q#?c2}B z8nAX=mXF-6gTtBb3v`*(<6 zF&)@7c=m1BBDM3dYcT40UvpxgVa$C_N72wH7FQ1&&>g zpZo0men**2jh1-UWVBs7<0I`DZTICrc$9rD*N*QB)rdu6C^N9-m<&16D;Bp5&#db%1r$ zoTFJEk8J#DbqhmWX$X~4wAPJz3bB2R`k`Ip^@dos&R#?~%5`YG9~{(FIdMPgc=h?Z z>Ndl>#!D?9Dy3-E7exo0)2+1cJBP-TO$W+^?Fu{eY**OR&ss@+O}Elx)~;?sS&5XQ zQEpjF{PD_Fr4GMt6OT0=*f;F(l(z=V$ZSiPwb|aH=;NKQir+%euCkq?d7tzwU*2m$zg9L6qFqr+(P&p5jxq7f zWrvnO8Pcuv7wb{zwU7R1tI&4QYmYzC+bjC{D|@o-wzjV&eeD~_Hv*yWj-I}?3 zT-+nR#t=Hn41Kh*viERLyN*icJG%ecxvMVf5qB|!N-6s5|7)zA|4T0sTMzc_5I^+7 z;?m}pkFQ^CN>>ePS*XPkMOXLh5I_0k;u89xN-6q|E1J^POB5ZmOV4=Tr?<{ME?K4W zYnZM9_3K#_ZPC7Gd~Js*bHB51MJlD=(sXSYML%vexb$lq8PIDn`fx1KUZlM%iq3C6 zxb&UvLiVwIsFb2HUS*@tt8Jq4eP3^^&cqI+?c=k~wHImcilVlyqVj>?Z>%0*sZuFL zW8Iduk`F#zRl46+ct;pQt!@2Qpw@X5Og`!#;s8LhLtD^vsnrN{>I+Io{Lyhe|0L-{?1A#n%4iwOz_LUNx<{ zlj+dCVp#gzb=2L+D7w?u1|N)>R&8r@lu9XD_m-n*e(kic|*t-GLO`2kCn zN-0{`R8jON`+okTt7e3q36#nFoqa69&h6Jvg7)wAOON(&vn=OzE+1%!EvX* zibfg!&+j}YJ4e*)I}X!}FEo38?J2=`oZ%NTA8qWc!6&r~s%Ke!s1$ayiPro@(e6tR zjqkaoTXidISGpsFZw1`B(H$h)3xD^}xSy@=4zrxAl%nxHfqOvV%TLL^{KWY3qjM^1 zjW!%=HnYfnR$W}$s?;I=)bgQHiq<(eivFR^3p=W%rA@CJ|BQm}MT>L8^+wtAt z^bJ=#>UVvY^4?>n zm40Az6h_e_4t4tqqv*sJK-bR0DADduPTRZ*^}9>5Kj50z51eiyMh>Y8q)f0(V<$q=xRcRt@o8O-5F zUhHEOZ0fhq;du4k<=slF?YzM`)~-}a(U|9Nxs2o0Q?@_$)YFTrrt(%v`>ff?*Cd`U2mh0N-0{$G25YE^z@t|W>=#Ihm3Bl9DKQd6VhI!y(@}d zUHJ5z^@jM^@}W|S27Tt`{G#~UuVz%w|5xWSS|aRPp1Hek&!+UuU5|^JCKw+bieQHd=yfp;}TLb=5imeJXIX8ZnO2~4t753VMC~tqIDcIJJD_~ zpJ?Z{vA?T3rn(o(aPQ}>-`Oz(6<@x{roB0Z~xiGRn=Rpth8>`3RCOM*3Ki^ zlv}S}RUKsrl~S~}g(&*`b~~AHZpZj90g*sdPk)c zjqhr-KBA~ohXr$R!tHTOm5#_-n>vC=(VV|NJ?DFCCD?UVspjZ2FJ~*c$G%km_Uaj> zw=5r+>6iW&{n_q5$`}P};OlW5ua?@^@T={#;eTyDS1Cp7*cC;;Fw1rPuo=}qnhwn& z_FHLRX^Gg&Cks2rSO0WI^*O6Sl~OeJWND+=*uMDC_{7QGN>A7*s^=E;M4O&;vt7;) z4~>6lr>Rzc-!oV;Jolz(J?CJZqR-m?-`nc0m!(Sg6Li*BYrsy0ZN9euUABV!tJQ}} zDO&d*!g$q>Jc52c`hA>{Kl%n$|Am-aw>!gh82C8D|(euH0CIt1h)6++pnE_w|%+9&YjwW*froe zWb89!r;2y6ory;c@s1%>O3`XR+B#~(!Bw6;*DqCSw=vwu_GiC2xH>R7tzIOB@tom4 zw*PumoA|ExS5>k5fgK3W+qw^fT?)?aQS{Q~ZQ>n1TUG602$fQ_?$1O~?;%~|T3bu? zwffL=3wrWMPb7tt9I>6I3MV;KO3`}G!S2qF=vLj{ESY01Ra)+PLPSrFn0J`bw!SgM ztyUi@rD&}u^Pf0vL8+6?I2Rd0*D|__*VVnP4Vo5|zO`>st!xxkDMjnr$5J(}OZonB z)2jQ}8Aw=`oTD&0bB@v#YZUD`x{I9)pH@8zvw=t{8n$RQtL@sSLwx_Ui>v2YePB0= zYfG(X>|b&H8AYeqUi-d==x(V}DMf4jN6|;WoKaoyLg#p{^>dwtbq`TzZ5yc#v9FCl z11ujZrD)w-jG}EOcaK-E{Au-Y)1j+Tv?ZQr(ABG*h_=0}fm;r)PO?^_Qi?`<%T7St zHF{dL$-dd5*Q$N4mY!OGQFNUlo;Jik453nrR(n2*Uc9DF`~%yo9&M$o=kaw%P7$I42j6s_m?qv$E?gAcq>SN*FYG>2;MXo;A8^^30YVK3EH&#=-}DMhOt zWHtC)UCCA~F;*IO&yY=x2_NCzqL#ULZbM*@^Dp?^ zhZ_eXt|K2CUy1uhK?iBqp$Kvim!e6#j^qqWC@Y*iIcMCKULSUzW#S;WeHreE9}IWIORWznJ)0nkq>vJZd#da`$npirJujR{SaqQ5(Dur3*J1BLmZv6&A}Pen zaMv;3Pk)Be#VOA=n{5@!3TH$Yw)PzlhP#fh<8Z<>Ac~|AFT-6&OFu=P53OgvIqBtQ z-zHl4DRK^_5HHcLqorSiDC7gT*XJ+vwoBR(E&Up}l>0JpG-=Pd-7GHiW-(g{;$p9b z6lvG7#ZH6D126Ks$mBpu(WG5R>F>Lj?@v4-pr)d_??N9$JwLtocLO2Ca7T1B#DWA- zB!!eP+*8$Q@%ZvK$F&P%$^65{+dBq6mgs0e+7UQWeAhfjkOS?CChe)RJEJAu8O^oo zaFf+*li`lAJEJAu8TH$;d8v?+1nsG6>DQojTIcOQZ5{eK>KwEqTKY9`DfeaIQlvdq z=0TuL4+6MZ{K=%2^GAL*IJaG|a+9rTG5U~$xD-t~(J{Pz`2ab$gnCALF{<71?1oV1 ztU*V-GOT_1!URzyrD)Ije^#z9)$X629Ynm~pcj2U+I475w(>H>tOQXcrD)fY+@lXU zcfT<{mgqRhaL-3_k3JxZq!2H|T}Ltx246^idwH`^w`i5!+xt97+7Zb-7!c$@yP`>Z zs&4PswY)L$e}x)+<1?=h?RN}!M4tg&%Wtf9|5rs)ND0F|RW0vrdpK?2auAoINxP1g_vn3W=SU4Hzp>7- zz2!Z6=THhMA=*>b@*chGAR?qh#+9Ob^oe#EKZtf6b~CKZn_;xbz|o#c+7Wj9tjybI z@-+^Q?MpYrj!dB!!eP+*8%ummb;@IOwTk z)_oiLhqfO3O4iJmUUMl$yAC`3S$=oT!J!5*zGCeJj@BA!N7xC|a+jSB2?%mfCW>5UG(yl`hOVIJ@os%q2 zy96DiU5Bm*$w6F-Cha<4^}RQ*U2f(?Tx#i&b{()RpFP$Q z@5fFdAJr!&nccoq$OmcHp>{hth)dC=T}QHx3T^l6EA5W^yd8p$K~w50@87&b(7|v= zBL)fW)tK)a$zd#ZFy`I_w@xnfF+9w+8DP z>}x=Z;f}C-EM?wfDUw1;81AW3n;NO=ed*4jtdNq^X73zykamRH)Z{?BqDgzIbnVR6 zj<|H>B<(tM?Mx2hQZ#ATaf{tGxN<=IFzycRZ+G0S4}$Y-X>#a;h?le@Oh?R-njAzcZRiJ^7yuP1<$j?^-sRzfbRjA3fY?cP+gS z9@OaJt|NcfvZWN_CE9hUojB^Rlgv)^I@ekw?Fh9K$$@r7llD~o(|mF~v4;MT&6`a! zf54;QrR%)h;H4Sij=0b~LEmB?Dq&w0Ng*W+_f*+F9K2@7Kfp1A{} zNDA>X+;t@W6LYBo2c9r6mmprI%5^0E69b}1O3|(ZDdJ8MTO#5@>!XcA+I66{&m7Qx zE^LNsaDk@r>Hn9j9#_iIe&^By~SxFhnuid#w{B}99wbT0$e-Sj?gQ>#@> z+7Y^!K@PMlnzW}X@z@(?PMx>mrI&UoX-6bpfdhgZXje38PnE8=)mBqWk911}Inb_X z(w-`9S8R!hOLI%wb!fXH2XQHywCk`jvCJ{?^t0;2IEc8^j%K(cY)mY3Oe~U8w5KZB zNe!b9tyFL{UWU7lWVbdTilh|nI&4)G^D7xgAH?N10NwT_?K&2iH})Iu@$YKnATC9d zb{+ZstA@(-H+BzwaNxcT=67;;pEGPELb&V5`+;mJg?Nc}9r^jA!M@$>5p=-DZL`@P zAzoOo2zMR%`J<&2;w9R3wDiC0V+rPrpFibeiF;LYI*O9{BgWWXB!zex?mF^*=o?d8 z%VHnnS3Rww@^J(CrewR}?Ep5xB`pt2Rp$Ql$u$^1H7-cSX_oj_;;Al%ojvl%^FG zMF&?8z~P*cY)|Ex=OC`S?SnvK=HmsR`auN5Lx%KdCp$E@QwpNah2dtR|} z6rtmBzN{3XQlL4nwFMaw>@ z2$k|1;MCD`QToPVtQlW%a}h#0ia2P$rb_L&B7|}jv8Yp1<>)hs z7_x9>TIb49#HQy#MX1ycJKFjEZq%VUSB@e++sbYnw=O~`M-ijHZLIwEEzSlH{`k*f zyu#?C97WIqXxVlZp;B{JHC6`Cq7Kc6aul&}Sz~3l-xnd2qlh`?Q(^7ZM2vX5XWGw| zqlo-oMlMwnmrC6+*H%mCQimdxqllUZ8!Lb8PsEtrUP(tdF1 zeW_!^Gqck8EB#jz@!sjjq^VMlBJ!)$EL}CRB2?=9;~Fd1FQpDeC`S<|9okrV;uRuBAMjwB zD&;7GtL>IGs0fw%XxGL{tLLbLslxoB97UYes3psnMQ~5QWzH3$Qp*-KNIo>@%2C9z)dnf6&kua)F`!UZ%27oA z+XQu>?J7d0mfhbVb*>2IDB`)_Hb}dA;OOK_I9=YwM>U1RBC!R^JtxpyID?ZV&y1e@^1EJD;?YCz125Om2wop9r}E0M@v+M zN{wjKAaj(aN;!%+@0)s=2QT~Jk+cStqlo-h0M(%gmAY(2{U&B-m5vM;^FP7yQAFfNsD@CZ(uJh}~S~~l|c73TsIf^**iF&c& zG#|=Q#P>7I3vp^EetT~v9e0(Zi2Rr8C2#GMuILq^QhPpFUtqnWT`5Nq)j!pXg?!lD zi6Q4eC`S?R-D93GQY-wchvtV=eQyZmC}Q#-Oh>vl(6UmFBA&ggzF_@x4!1 zz8-+JJaJIb8b_rRtt%P32l?n0Vf}%8Xk3cMDx>X8u0L*hZO62gC_<&M%2@OP5vSfW zF^mkzhayx8tBegDxL!Rp5jw9g-3%snmDp&UhEl`-=o>KHI$$3lckVa;&J^+cSwtZ&*9RfkH!>gOK0 z`OIwFJ#8h*Q3O^Qoo=I!iC5f}>c}BP3TuWT4-vt#f|a2Nl?qn>N|u!(l%oi&GCq!} zV_ffx)3Q>8N@2}#>&rxJN{33p>Yw=yQ#Jm_yu)bz4D1PRfs?g6>M^4JD{%rJ71lAnnC<3dDY%Ez)b5|%`)Q2Ke3TuXJ zyxNowm4elujnrHHv$7%E;y@o7D;tDup#eHV{w2Or30HRUJ*tBh=R{@=>GeOymXtO%9D zDkHNQo}Y0|Aws3FX2|Rk&4=nxDcJCtE&Au>Z_Z?@l%oi&GBRuF_I6LEtwa$jg;hpo z!v#a2HFuUE965FDg_$%O&qbdX<(WU5$>!6q2s!xhlpvB8K~!B0K9`J@+t26iFdohP#gZyU6e=?`K4tpMb$RQrD4x z7a6b1drk3_4WvlB4mrezah)dC=T}R%RMP_r-4nn-N?OaFRmxWt*DusB7b{+Zq=h=M6IT2{m zj>z9X_gNTHI>V9nROR1y&h}ooO93hFiZ~+wzO#LowN;!-Atgk6s`MUY(Z~t3j&@O` z_aMoEl%h#{s{U@TpI+0&U%}8FNbTDUcf{}Ph1IK)cQcBlkamW9KI}$S%$t)u6@<97 zWsr6qc55rqgJihtNXjZ8ilh)P!(B&m7a+#`p}T`@iHMisX+GwT zNW2>tNg-Z_yN;G`zWDtpoh?bbj+Sq}_*~0VvydX~I+8QnA?MirNWcBs9uVhRhP#gB z%yvNV>oho&3h^dr*P-5%&~tbLV`JGo(nnj!EAiTy35BHY5j9iYDzk@^{0t+h;6Y#LI8c zt|Nap+-p#!5HHcLBe|m(YEW0$n32&}fM&SsNbV>GM3EHYWw`6ezv=C#)xptzhZ%?W z@uDdIrnmQ6Xs48-T}N^&C1;TV(foul&LMj~lAA99p;ENxAVu1BoNZo*SG+g1L_3jp zwe^%YY1gsE#w+9Ts~tfO;?j|mwChOPRVZDw5{`+XWh8fl8SXlgb`=msQizw~t|RaF zBU|gMg+$sBdA}cSkwLqz?n!&9@^1tBtwzL!6$I{DLW<|_9Fcz;u%(ouJymwcJvLuq zA?G?G^TaRWWw`6GJMOXh3JZuLDa6Zg*Rj3TVDHsaLo4CB263U*a3>B@q+Q3!)=CaH zuhwiOlu|Tl*YTX)u9`I+8k%k#k)s@|!2(Ww`4|>O3Hdq!2H| zU5DNc=WGBDcRvs>X-DYYaB?7}Xwsf4^|w^Ciiec0yrW3{Es+B$MU!?N>W4-58Mv!aw&CVxboyj?aGmh)XzX94(3h@%{I+ACL=btK*v0)iaGrD)QwBR}p=3_fJQdF;)J zsh=Xe$x5#=c80Uro2>L^L@7nPj%3^oId6V%0^dB4c7}UCl5sa6Fd{dXLc9!j9r?Mo z&ek06sqnF`b*Wz@(yk*v*Je_ebjr}AT}S>7@5IW@SAH9O@7&#QV&$+p_q_u@kO+4j z`8&KVr4TRCu49V5Yx#$L-3Q$z-%SjD=fHV=uiDhl9m8G6P3zWIzu3nSMN*1(9gXHo z_T0ql5Z-I2?>4-|4!=l)i zDwFEhH$#(l9eH0Cb*YcOXG?WK6hCM zkRt6m%<7Bj?Ts8rDVntFIC0d-Qcbdx3h$IZTHyTyJ}h7QL((UbaMy9in31I)B#0s@ z#LIBkk+(~{*CH;|LGMf5{~2l5k+(}SDIE<+yN#Pu zJ?)6=%~vusY1d(E=lHC|cQpGpI6W_}4Su8%FT-7jt({}~jxLf?wChOreZp*@r+0W} z2Jtf7b>w|!`nevJLcBz~j=b&Ttpo`4)YE2ryCUs6^0rSVrLB*&>&V}uuM7UEse?Y& zI5N17{5^UfKM)uCHoRLyinQx6znn4sa-wwU8&}73hPw{)%Nf%zXOR@*Ww`6e&*xsx z;QV`FZR)2;Yc`7V^La}tMZ1o?FQn{@huVg);c)iD^O5(3^#637d7Mwx8^@0^mTU=$ zvKvB@7?Eb~x1WnpB2@ORNr(^$S!SbRC|Qz_B!r4KlDRjNq{W)F*utPliL%G-#+K`<(5bd!F;0b1si8Ng`TwU!mE?r2TWP!f_)ay|ybOG9qw>R<7Ab^cnOBksuPOdSQ_bKK;b zZ3NGgF0%xda05gfbJ#F9T9Tv z+ep^2JC6_vX(27woR45^BGWsQobH9avs|-{U~Gc>bGjGxoOGf&X~{L)2+m)zH$f77 zFNrt7HiGk4=Itd~NVAP#+?hvxB$2lz-51A<`kUVUi@9>1WtbMyY(w{n+0rLsPlod_ z@;m24_leokCx&U!edTwyL9K)T=wu`Iut_5CKDrLR)kL3Gg`pPG;!UuP;8{rK&52s# z8!&M+a2AsB4Uh=>ADAk<7itB2>fl*OW-bGXpzjeCJCkeHN0pE}RIIAR!}}ys1J0wWMzk5@Z7#~_4Koy{Bw#> zg2dd$8G64n&ygy%_~niM`gW8cLGKm$vWrr|vyjZaP^(p=4803mY)I)+YexwZgYMLK z`hjPSj6M-4L83_A485B?j6ewzb!uejJ?>!yN|4x9Aw%z@7vkKD75sJKC_zFZ4P1kL ze&b#7RD(#MR;kh%dUwCrFnLdPQG&#ug);P+17QS8kQj9-U7u^fzM)cofA^c850oGw z(X3!gr20Stwbq|Z*QYIr4a^5hkl4CEU7rCFMxX?V^;^^RITJzz&q6X1BxtNfk+{71 zz&OcLZH2lMyQ-l&E+Qg;XYbFaZy~Pd221t;QaXXjQJ%O{3%)L;HuIE25HZksuND2gjc8o%}xuNS3!pacn-Bg@-%kwC3#WA#^Q{O1Exg%TvL^h<+hP@je5 z@9jeg5;6~;H&sZW)~F6?(3fDU0+MJHfbP58O1nmX6_5ZChzO`9yYVa}b1&3dep}i# z`dySDF|B+W^zFg3kcDPk;2ni!g%TvXpHGGN;IRsQ{dR>CB;-3- z!BkO8L;|%2{hkVM=Zf}0|EWa@5+CeIg)sx>10_f_-IfaD5`7kuKgvJ}67p?8&PVVp zBy%s+Dz`BeMoV`F&O$O0Bs#52g)toF10_gYS)B^w#BP}tymu6pE=rJ~FNVlmrm;Zp zK_pPC(u&lO(JR?N2@=lRsn-}GqXdaVZ>C;j6pj)kroEwU_`X4{Paa-JxuH`}QG&$g z1*zbFNZu(Q=&_Jzv1>B>12kGTU)2?Y$_llRMo%X8EF^O;q{+)DvR3?$;8{q9KrQkz zcI65YJPXMXs6}4J<&r$VuT=0XBtxJUc^Pe!gb1F6WC+wEpJ7%%A+W5l6j6)D@Di2N zWg0jO$w-hOFJs|LVk3AKk|9uwybNoN5W%yM41rqYGeq_Yf%(Anq85$eWrc@QdAg1n55`^Cngz*$I!KrQka%Kk0{rV6d27LEGltJ+Ha{z8u5+EIc8c^TVIiH&=Y zb@SiONT3$^A0z%10#k(qYSE~lzVFSgJ$M$9k;D>l=fpNh=g@GK-FL4v#t)9(h)LIMJ`$Y(HpJEjV)qZW<& z&3iC-7Lt)5L0*P=M+MJ9G6ZUo&tTqzm@2f6S~P|?ql|~&;j@saC87ig@-ocZId~S5 zxfg1Ymtn>X!LyJIfm-Bcm~jc_15<@sG=?{0(coD~MuG(SA7-=^JPXMXs6}3e8N&t7 zLNWwuky_ADfmD%1-1KVog57J4sARold;K*bWM75v6J z)(7STwdmT!ii98=C_y6l&Ejhjs72S|F)x%LAzxDFR)RK=KrOm9vAf_|NJfH$eD^u8 z4ZIg>(Y1*|2G2q=5+vl?^&9wO!yWBqKpWzKb5rhxZJ^y-& zwd8ApOyF5aC_y6lHFG=*2?^AqYgvD%6rP2I5+vw5+_ED=DLe}a3DlA=cXK}QEF_d5 zLErS2)$!&Dq&i0ewd5<{Yy;0iLJ1P`E$m=@kPReIi>_&Pe2}0TLfJZG`;4??bqd=Eo|nOU)JRL#myniR z2W)t|0c8z~Xwj-Lp=E`bQo(bIc^gjUl?3eC!z;QDr6EkatjMnkUYccp^s+s)b! zSvf*la?SbB`-&XdSA?-NiS`j8zq1X!ugH;oMPXWWU-_MF1ov(8nj*TFlv`{mC>7kd zZB`q}>L#M)nr+m1qL_PY$w$1EfEZ<`*+H6bB|?7ZeC+5~%R8`R=xcczziJ(Kp=sLP%W`JHW)I=06da|aXDUSqY8W*fo%=e+ZU?uDz{J7|o4@|Wx~TU|nbN-sV|a?SZj?OQAI{WqCT>+2f1d)rL0mweg8OMAb4lkKjZ z?)IMAU-kLB5B|x&>pAd#wIcJr$aIG2e4rN6^>$9SpSp!<{pCe{LP7g{yjKRF99aiI zX_wzQ9}5o6b^1n$FfB^E{LcA!qTfxC)6Z?P_Urn2I{8uXcJf47DApB}HT&(Qyzv@&uwjhSk9 z|4a6z{{H$Vr-CN>#5ZzL3+W}5rrOJvF|E|Hlm_mkSlFwBejiV@ zA00v089A*Ir`aPP;@_3}s&51Lrc?hW|E*JnT1c;2J=Jd6nrWrp>{mF_;Oa?hjIP1s z^{3c7p5Po}d(E6S#a>!g+HSrfg(F-3K55O=sX{HJu^lT_dQ^2cd+h60Q*EP3!D)8G zJLp~$b8_eF?>~IU_w8O<=c6D0u2kAH)!qIxU$>sg-^fKRq*G^3wTr$jsmfgYi*-gn zhyUoDUw%e^Whh$iPrav4{NBSQ`jb1wuN$SxtpCLt9w`|ar}KeYNYCvt#eTR9mxxjo zk0rXZ8*WNkTBwoRzwtEt;b~m%eb-L4$9~HtI-<$6=rz5gs{NJdKD=*J($iNHUDQH) z(HgzB{tc;*EBgM!jwePs>Qrs*l4TEW%k8J{s4RQz{hSZFe&l{>SGCuFnKbJ6#K<6> zbJRk5a^Ecb;sZ=8^^d+cjk4%}tw)F2+t;1)`tw>p4$)DoR=RF7bLe-zrhEj57%imv zI#Ux)g_+4MOC?6;$K+${16lUd4{=I@soGd>>iRFdsed$+F+?C^@fl{G?TO zXyHh6-L9~v&d#4=e}0Z_V9n|%+1ZoUZ%-DEJfh1AwUEwgImOOOBARmEXxM72=GPS? z6*ZBxe2Ts8eYRd<=M?`*t#w3yscD9kZoA>Dt#+Cisq=waNWb#Z6u-v^jCUhTZp*Nr zy;$D=W8%sOZ+Wxllq!@U zG4nIMf-WVjtdKx0iTvfw2TG8TI9^@?B}hmdFE4=-BqS=wL|nl?WnEtcB}i0CO}DGn z2+KJVs3p<9ys1J75)zeT;^PYQy!9niA1FaWqH;`Fedd46EjTrT5+puorq>RhEEnw= zq`i|3Bv4DDa>0BMff6JnDi4ZYubSM3*8cL88ZkU%YovE|JNN|2C7^ z4$B7;s3mbVwsCOFhyL3DB}hp8E0_<;IZBX__*Y&6B}hm#i-`tPPWb&UN|5NgHr0N; zeOS(sKrM-X=Be8Ab|C_zG^S$PSRAR*DL zyu{2EFMGZWNyrQ9^jBjZUq}76yaZ|?O}?7CrAf@YmYyh-AVFUE=$2swN{}G`eDW|M z&RyX#1KB_c5}7Nf+E-r}LPh{YpahBE-k$2s?gVpAJse7qATONeeVFKca-`q;paco> z&o|z9cSu>G1c~onoNDjAM~IK6_wYtbln<03v3=ZB`-$E{)Jy5)rwS!V%o{q@zB@w* zEGv{Cac|$LcJ0Ms1WJ(juESKj5;TKU|Dq6E9!&Pj3MEL; z+)}MlO{4WO^0p+utWbi)+@kvH^0x|sWrY$X_Mg+=oNO9KpahA@hqLV7ZNdnYAR#jo z!M01S1PRpoM1QMs&ZA*AP=dtRPqXY(eS~=7r@ekzp#+J4-paCj4iEy%3MEK1nU-bm z9vnuX1PPkm=`A3H4VfK_d73lxws^lpsN~IHt9itDfzTsZoLi&F+{d>g7To`aTXykf0ez^VCXN zQ9e+D1bbxnhV-IHpcc(|nZBf0+6q4(C_#c|!ovG2lpsMf!lq9gmcO_+_Mv>B1PS&< zWAhP9pcc(7o1S`KpEvx{MF|o#r*GZ{f1UQfcNakk5;WIu-Z(=ac-^;w5+s^+pK^`2 z8cL9mh)Lf53MEKL^dv8V5+tnVQ?4-rKnW71B2!?L(V$8pZ%>2%l5zwkNbrnBYz*l&p_L88jtQ?4<-LJ1Omn@sV?b4oq7GM_&RM+p)hISeN|4~MN!}LCdA_8OF&h={iRV5;X5??Tbi#)F0=k3JKKWuStpxEM1f!!QX}qBT#|_e;YEEptg$=B>3Bq zbtE5tvQi@`L4v;x8AhN43H~;u5Nn%#UlFLcH=)FTc*w25M21#{IcEa3&VHO}KR&Q(G*w3@753gy)OImdsP)SFOuK$=l_=49@Kt}V4++%T?9iEq zLSTL1eKA#+muK3;|B_T8ff6KEzMg4se!5yTRY;%&iE=Mw+Plt#5hy{T^UzGY$kWwB zY@h^*%ubp1uYZIQC_!R5T1N|4~Vh}aN<##bmog5x4#1WJ(L zC`TB95+pdvA;i@U{+_sK{DUP(aFj!c#4Bt3ktIry;FyIF`h5tJao z5eRwL3P3FpB}i}tB9@?*h!P|?0ue@_1PO{Km{G>@Wv}{mjuIp|o)BgOB}i~QL3&Zi zIpqT-NN_wMj6ewz98U-%P=W+U8o~&aAVG18Zy&D}^H!sLpah9Scc$7iJBJY{L1L}m zX)&)^7=aQbQo2pBFINvEP=Z9~U&h-%UcNOXA1FbhO84>hBU{1Ren&L}~m$>gzim(RoAwJ1U2a@Dcdcsrv6 zi7fXy7y)2wM+p+WAA1hQB}kwIiS5OogRu`1C_$pRJ0@g&MWu@pB#Mn117o|1 z5_6sz4gLq#2TG9W-G4OrAFr)x&2MH=&lpsOTOxkb2#Na+086^TGNKnL-b}KM}(N~lp zK~Y&+PtQch_yPWy8YM``n(bgdsLoM>gslF~OP~Y^ieT6IS5jqKR;m}<76}p*CEro0 za5NtnaYqRfvW7lys!)Q2tj5nvpacn77ak<222p|pUDKNFAVH-YONf@NNoS&W!hQa1 z6h6=R1XIMc$z#%XzrDQKAN3)DS`;xo&{>G7drJDP1PRolh$*cR=TyD=c%e`ms6`P| zTHnsZpt)s23DlC6@=UaDdB$H^gQ-F-S*^~*mwTs&5~wAs*qJDGTO>49s6`P|Q&z)^ zP71YwS`;xg^^sI`-zVJSQzMuU)S`%~^x8^&-lBFWfm*pbmTG$H_YNk7rV6!WMLg%c z;_YifZJ?H{lxJde=@%P^l`iE2 z3DlDPQB3qMIKj_35~wBnrkE)9;4OX)B7s^IF{K?mOmzC;m_J*K1Zq*lly(d;QF6{) zzjTp6EsB^*pRZKa5wC|5s6`P|^EUW-;&q|3pDl1`yzV*9bb z{hXr&35uA~o-ZaYeVOXj2leeppcX|;Xt+^N^XSb=y$i21<~i zC@Gz}%*1_mE8hl6kf5j>o$Jg*h2L-UYY-(!P{edma+xU6HpxW8kw7hqn3n4z#FMQH z_^CnywJ2hGcBBx)HYJ&yLwZq*BBteE72=WI%5PU_1GOk(+U-*zK5X!l|9l{US`;yz zzE6mn1KtR=fm#$XeI@^m(Xx6cYj~&))S~!j{o922taZI4dJgZu%sXGCrcjIGcy#(V z*I=u(eSWG?f&@iO@988q>i+P9M^G<{1Zq*lG-JFF|9t$S*Zag0s6`ReUGE4nZpJA; z=V$}9C}Mi~2O&oMa43{OEsB_Kij!y`_E%^FwJ2hG`3@oW-SCXpu440nS{Ms67O1~M z8>mH5QaZn#>%%a-KT0G>P?VI;h|f!)1PO|g(#iEqxYPRi5k-_BK`~D{9Y3!PlpsMd zPdb60iGClJ^~cmGL4snQbjp8T8z@17VxIIRfxHAtkf7KUonaazs0LAj1jQzwY+pHs zpc+I85)|`XxLb%_h2QjBB1(`5Mn<;}E9AE;OcmOr_-BuAD@9Yas!ygr_CW%*DE?Wv zl@O0FiT9pb$_EmtMe)zen<_?aj7(_a=K~4UqWI^gRzeJn>k>+!7R5hLZK)8o;XJz} zlt3+tf5ts3#Q9dOLUWE<6#pETdrQ>D$Aw zA;iy*?Drz08yrRi&Do&G2oY1PO|NHe7jgG#|BV_V>#Q3DgSimVNcJIi3w_ z?dTie_?qIMbUHpiA1Plx?!P&aKrM=Y(&_k2EPbg~D1llO|D^NVnK-umOFtiI1GOmr zNoUu{%J2_@@~&)ax-Tw5(8z;-6;BaN{DL1BkVOS`_~@V+Q+!S3_GO zYEk^tj2Yruwh1jO)S~#O88fWC|JKm@KrM=YhL0Jr&QXivpJvQZbXIuVMXhV^!9p9T zg*&*E>T{s7_ngO;E^1Ny)9e6kFgPQ$m7o^IKh56PPF+@o);VfX{L}3EUH|liP#dU4 z@lUgR`IoZGLJ8EO_@~*oed+mx(43(Er87R5i! z*$Ew2mJDr)s73KlIk7^iQLi2iwSig`|1@V=4DEg-G#{u%@lP`X=(;g{mJ_uo{%OV~ z`3_p4&md}1{L_qmdi5v}nh(^X_@^0P)h)d$v<6X&;-6*=*YVzj(9%UMihr7M;=Xln zhNcR&DE?{2qKPA)4kb{F;-6-`drzBEq4j}U6#q11>gP}I@_L`xrxvv+{%OYTue?yA ziHt?DXFx5Ae;WT|_e0x4%L=t9{%QP=4fn4J9g(3H#y^!B+_ICO4_s$QXNySeKe*=Z z%L^;Kb6C#kktJ#&%|1ieY7rz*i+wmDzIv^&@1-JvTI?q#M@Pu*YV7rLPU8|JP>X$0 zA*Ro~(XS6AP>cNC^zlNNw{2>`25QkcBW9JwfCujMZJ-1R_QJ(R$~W)%HHZXiv8OM@ z#JR?UL;|&Vo7vA;T6%wdLGZwGxONy3m#$O}-R)Pd-(M(v^Pldp;LISnuWD>K6 zrPBMeJsVVmC_#c|CU1UKY&@FM%juIruV~zVpY<&LUX1|pnfm-CTcK=d{Cm!G8*B}z8 zMQ53qwQ56e-tZCUMejZX2@>SvZv8@RTt57HVisRg9n)Qi?w!G=rAWD!RKiWJ|J%1|i_w7ia7W>ii)D~FK+b=65P>cO&Auu0Epcb7> zVpe7@zG;w`4=O8^Ai7oP)^3}~-tw+JMPy)5cS2u6YHu*mGN|*W) zw1HaetION@zO}{tXAlY0VqaZ|{f$2gB~Xifbs?I%jr{sR8>mITx*7Y7NnIP757feS zy-GFAf4d(AKnW7;-Ak(eXl>4*LjtwfyBDJE5BWoFpcZ@gGP1;0f;Lc#y?Y^!7x>Y$ zLHoRrKrLJYtxtlU@uIhv?3^a>R25p0RQnvqnuDv51}sYU#?+TJ5vwI9x6toPzu;3` zOfINhA%R-7%4$)y>!PiF?DS%OS)nABs5d9phS!V2y@(bqTKn~3Td^_W@rV3&g_2mJ z;^0^tln*56TC`|ITCGuHBeiVOr<{L2>qR87#Ij~$qub=pe$Me;bS+x6f^OTJVq;{> zj($E+5=-POFE&h#@R~ch7tx|ctM^8JBQ~<9mhtjIrHhhSqU))aAiGNh~qGX{-%O72b=kMT=I@-u;HyD7UwzUsfoIC0@NH)&@O;NYJ%t z(YoHhKNA}lQdW3nMFdJ>i33*}MO(?;9p?C{LV~VEt8bI3dM#(!nAT1?M*_8IeR7xG zlB##J6Z|I%wes4i6ScAH?TFX!(ym{;7t(VZPla^=*mjXXtyYbu!dioQ&u#H@js$8A zx>MWm*E2jn+42a=ITEN+=_l)<;I4rT!=bB}kMitxtjSSH0xx^on1)NTAlAh4h(D z{>mCm6%wdLtMOCIN~$6)@APs`^??#3MqSE+^*)b&WmcXcfm-WNX2F^w`}?JSK9E2y zT9f=jO-WVjo=f~xp#+Jo`?FxB)0O>8d>crh7Oi65&`@lQ`>nKRgPwDgAhBK(X8qNc zN8>#kR8~l!*1YU2SmTBDfdp#NO6i*|N!6Oae)d}lN{~ohkp(Ny#0I4b3Dlys)stF? zjb$4-ACz;HAdxyJOUF57jhEQSLx2{o#=g>8Y~*`#WMigMBPhZ9uFA~P(bq5=NT3$4 z-xeFI9(&QB3r7hOb%thXFST?`zf1W*0<~zxx5-C#%MX2D4JAkv?v|y!ZL#sevU+~I zLISmDjku|gL2h|JA1FbhXNxR72Ou`2KB&%-KrLETZratrNM--|KnW6U?#R+J6Jn#= z%7%VEkU%Y3hi;yzd*;04=L02394(inXIR9B!xQ|{T{a~$~j7qXcL#E z=Y7I#Ac0!BdPThH6XR-i{g_flHc*1Z%o9`eY?Rm-aG&Lu6%wdLtK-ev;9{@Ne!D^m z68m@Q?;iO17|Z(sS|Zv&0<~xbz8NR>ZQI(9d7%V}Z>CQPd7`K#B7s`80$)b8N{#GT z+_!-eB&v^ntkIWXi8?R`g^|YUJlprxmuj~)++mS#m+81EFJ1i@dAVK>AjL#_qJ+&x7g7yW7_o~0H zQl*365>bN0a%;*p-h)V>7VRVuzg?*nr>A@VIi(6ENYK6jGtVITpq7XdBxqlNnf)l< zzHJkx^bTo|Ac5=9_4in=ztNk;A>SZCz?yd2Ngy*iCQXzol;C}Fb-YqNO6B*~4(``B z*n?ot1pN=b7LP@&P+6fC(saFRa;zUksX_@7?0sd~QnUatmejtmL* zaafDImtDDHqwZ|>)hJaci6t)oP&;H?f&_a-tVQ0-<&rl=iRX%%^JGvGOYC|l%mxzd z6|oliJ8hH1Mx%-8-g8d%fs$AvW4zc{(&k6MB_hFo6l;;cGpnE2m^#etn?Ok{aZe|) zA+3Z;7YX*GSc^QQg)fPX7HchkOpTIQqW*1RHjrS?i?zr@vet-=TG!R_bB>Z&;+6bi zHjrS?i?zt7itG~`KmXXyw}FyaV){Ob0!Ud=4I;t58f%eH^-R8U(RTIJ%FMMy5rL9e zqT8pjHmE+3U|)^3$fsIUU2Hs7j!zIE8z_k-%D)ep!)! zCX!g&g z?C)Y@)34`!8z_k-*6k1*hdVU)dIm}r671cv7I|S?Pl=5somTl}g_2kz?i;Zo{T10j zg1x(FKD2i?;$N}RWaYDdyCVNgB(X&IFT-pg!QLHfkrx(sPHf!&+f{#c0!m_utzU%M zK!UwH)*>%VQmfP}A6)gQ2lNh}dwA4ssT7R`tD z)l9pp_K(>=NZyu6VhPi(u+EWSUyW^$Pi3BuZqJ?beP@)!5_z8w>aUPsUyW^$hh(1f zn%&;_ZJ;EUFwc3~{cZg>Clc&=u?_N&On1RHw!vo@%X8lTH}ia;B$fz&pCiG0c-aP@dMq|tep}lwE0n|%W?XVp z_H%v>BEh?U*#@7JEH-LQGrP}F5=(@SuaMwlrGJ?9yC{hzj6W!S3FRCK-XYC4_)KZBaZim@e+-9`SR&l7MS}NKvkg9lTKw~; z?E;=hPkjkWVu^7790}fq%{KVlYO(Rsy;HoIJDN2>Ni1RJ8KkTzRY>r@ZJuY~ldi=E z5-5o!F5e+@8P_6sr#EZieqN|Dwl}7xRG|b3ibuD3Mr>TD$Y0usB~Xj! zAH>FcKbP_Iff6Jry1a9!*pOD@+3;pR_+F^R^ABQU(Yt0}5lWDt=yInau{Nl`LISmT z{y}VHkAK8}pQ8i`iZ18P2iZUZwRrwPYWF*jdk_iK;`s-$ar08M3JE1hP&`^jA4<)hSH~}1Bv6Z@ z%d%omsquGI^~(wg)Z!TnNmZdV*P!hZ%)f&|5*WhJOmlh?oMl@-}Q0<|c*EbCKEswn43pcc<@ zNUBEc>+RPEN|2!FvaGWW+CT!eXqKYyO0jXGh1o@i5+o=dE$fB#F4OsmeyWf_Es96W zDrTkPclGj17YWp&=(4P>R_eRE7KGYBEuKe_eAFp$#BU`iL4xAZvPN8~ZQniQkKvF& zEs96W%5|j%T1`A3hiVWB)S~FJtfyCM!{B*-&XGVZo~x039NrM``5&GQZx)9oNKic5 z>>lVEU(#RqiuXb-id4(q1Eo^>H;DXj?%(8yYUIARVX|HO#=>^L!4q@H2A$E@Z*WEq z<%!M&q-&*SJk}uc;eBV5AIRUxMJ=Sqte;LIF3 zVSu2?EDvR>ObJ3GrB+_r$14;uT>`Ky%n zl#jFQ_dD|MO1)8TW_DXmEY<{SAx)ziI*XNa{##0|$fw_BS|1c_2(O zxw6NE?$s)Bnw`<&I?rDJ#?$P@h51^k_ev+aUzMGi-A30rY9TFqPdHWcy4~c~p0UZA zr1SCg(W&+ao7g(7?5A^vHc$&`TC-2*I8YhtFG&kaU8$3k>qcHH-_3e6u91scNdK{Uvin!=Kd}O13POf~FYFFr1(6e!VeX4!_bOGzMY`&nDQXGbA4g z?drQPw@9#_i)$1?Eu=9|O7(m8oD)|$J~E_Wqe%THQ|()J7x3~id0?u&{7KHoq|8+N z;dy+m)B~yKoOde3M=I*FLM^0ww@bCvBEFL@-Q`D|NB$}rS+2`!$qV{>B?UQ$c;6xm zQ|;8R#l|x$k2qESC>nV|rwX-@Mte$~y1j!_ukr1Xp1O2LbV{>FZ(|#eB&FH2^cnF~ z=ly!7+4oMA`q7i5AzF3+)VF6p8b1~Jf(v;I4e@mL3_Ne5e#?V>Lmq!yKA6`w2pcc||_0Gv66C@x1 zEv)RWShd_btMjq=$OQX~Rcsy8Uam~4-FdR)quJuhuBC}PbUsiEY0Q&Sjo)AHR9{#* zQe5W)t>ZI+snw&`Wy>9FS>;HoZo8<3G(IabT1xfaQ=Rn=;vUEI+r92c%Sq4T>&jIo z=9u5o%US+9)329CV%>AsH$jQHZ(2_Lawf)ICj^Zuw;m|F79~hH zYnaH$Cj^ZbD0L`7LVX#vaf#lw{Ko`JkT|}BiB{)g36vl)Z$A^?{DZ{6msYGr2@>`7 z9(OAB^Jj#hoKxyhf<%$7>3%&$vk}etudP`^wT4>e8p~=~r{~ugNm>rlYn$?&f;G6j z`Hzi}K&_s2nJ_g-^-*b0*|kWZ*5XP`1Z%M0fQkVdsMYs|s13gcsjSw{`zJu4)~I+U zf;E_L!_okOTAR*=)!-w;SFFK&pcdAXQjMG*?u~n|I#e^S+^A0@crebU`WRna-*;e~ z_jH+Ss*iCW_HY*{<)#)t*w{$Ya**cwS01g@;SYMaOYDDE?Cj7<+lIo^?(i3+IeT1o$*ILdz@E;_k7mF?R)g9Q>0IsfDP1Y*(A-bu{)p5HCSUs z54Xhi%6p{psvBs ze!lAT-m<{Y&W?@zO*&lDS*b*fGmS8mtUI|B8ATGJlVZ&7^;E$3s9PSvD~SDp3y zzYW+xt+>u*M2fJ>10Kt~&1?m>sZz zTB(og6BqB+HoSiK5#6rl$0>K~$d^9BoTJuzgY@Z?Rq{pK)kE+0aPKdw-0nRKHAVup znvKw?H zwU`go@}8AC@>Vf_nb?;MNMMiEc6-X6o(KA2mN?bG_ zr}R@h<>#wbpZ7-uY@inPD~*5CJ)BoorI+?_Z!W7MV+*bh)H!NV-}S#8(!<%h274U1 zY7IPCHeds_sDB*usq~_YblaV#+wP^}mjZn|YEd6Nf1&i$mo#xEUPWH({d|BxE$Zic zOyc*7Qe$+^tL?dJ(G!LBfm-HwdOkkt_P6!emwmivFr|b(Py5W}X5`&%{v+M)wc>KK zFK1=u$nSI=B*L_irfa26cmK#zuMY8Sl>8>$9x;e*^jnf{=iJ3Mp>%I|Dr`MD91gYPpDrbYLa-`U2T{C7nD*wxg_N8Ixn_VCBAc=gfX z$qYOBzyG}Ykl)z`5@A|&U-_MFjG8kfQsd!|ynHk(kZI3fsq*9_m?|VhLe`O%YfjaM ztu>uDXO8vqQTL5ByTrCjUOrwKon{|CcFD_!{LVzbZ)!T*qC}V$rComKdGWF2X_=2Y$ISIu3T+rqO!KKb+WI3MJbOP$N_d5JJB zN{Rf=sp|B7(@2{FcjU<+IiKxjS7j)gHC!s#pK=JKH#-TgZdA zF%hOk_m$t-#{L;&-D(GG=E(=mS#{jW&%9jcB}78jCAXv{*PN<1H;#ATTe&%#dg?L{ zOt9-!iu1|}Y5ARrH#9NuT_(b`$cFsRsXBUTgnN1h_dY4lPw@LFDN(wwTr=V5{;=*M zCPYG7NXs>+>g&A|+~JXeUOr~Fp5Xa4bT3T1{LVy{CQ7YgB1{WuPF10L1Kgk5eecx= z&F@fuMG~4Lx#J1$yX1Ga@pJtF?qHjVFfF9n2Gs-qrMhuNGVMmy$v>NzL)Q~m^L5># z`fCNA-$rlF!uvD4h>2d~M~GsFI@iU z#5SY`Dd#9b;+s9`UJQYWR!?lXi>Xu>C9y_H@}cKnU6dd(h={gf1WJ%lU+Hse>kIK_yXz$4?xF;VMH|!Yy`_ct zI4#?MN1+6XM>eF}bI-}!Afw$Y{`&(ZNL0~ZmfO8Yh+@wV^=weiQG!JLT76cro*m3v z=O{s<*xYox)#ljxAR9=aR^boQ?R%GqjlXuZ_49!eB zzSzK=qXdbb2%Y6h@!~iB}TR?He2+>OB30pAVEEv9UzD{cM-8d?0~ZPnXqS zid`c%h8H{J*9S_Fs8%@L{`>>>EqmV$YRTt9i-`*D+ zSh^@dg0BC4Pl!p+eeb_9rAOI z5+qK!dS2A8kGmFa^!gHdYEgnj{l#h5XuC+D*7ntD(5|p_QG&#uZ|QTk{kGfw{?dLA zhY}=8>eIhX&v2si5kKchpjOw}Y4Ajy9)8>}U6deE?Zq^B&M_Y-K_VD2IdS?%FI7~! zC_#c&a^&r)sfR-XwF(Z^sq%X`OchFyXqu7+{jLy{DwH4*-z5$D_RWv;X$#)F79>c} zx|6(bXR?9!Lajj$rd{KWgAydto2S8hQ1U^kLJ1NN-jf#ct|bB`NYILuyraHY0=0f= zkamp`07{UcIE5KyEO8t8qa~Ce(KSIwu>6sXvdn^kC3ITs0LAj#93Ms5IPD+2@=6LPM7n`{a!S7q))4xXpD8f zvGLbG{5}y0)FKa{%03~c-Tt-T?;?R(3^2qV>5*y{_|KjHZ z3DhDF;IlPClo&HJ)COwNcs}79Auu0k1GQ*;{p2jkN2^2meH$o2f;@mCd&I`EWlx3@ zs8z)C4TPBV{S-gvXaluqJYVFz5SR}nP>aUb@o!2#e(bf#PZdg#AP*ouUgrANWe)UP zA`+-Y9zaqFpXlbF((EFES~Q-2r>qc|4c>s}$Vx#Db z@Az*VBv6aS^B1ZLfvG|QwP>u}VY#I0(#pbq>7oRQvRBjW4b{cQmXG-h_SB0afm-A< z>_`xz(vZtu&SMGGqC0J@A;jLJclqrKZJ-v7$W7@E9C}&ybGj%&f_w&(s-+8G_H&K| zYLU-iO84^@-tpTN5~xKUfT=;L56U?bs6}IV)7m3t`g-}Gz8xhln<03K|X_d2Al6G@0TtTs6{@5=^5g_pAt%- zmRU1J5tBoo_~(TOQiWPHA~$_|{8OpE4U`~3K7;8K>$SS%&jBETTI4gBo?7?qYq{Q2 zT_jM8JOJ}HkXAxbwo~f*cX)3&tMdd-Ai zA4s5>uQO=yfuF&QXE{?JG2^ccezBbdf+U*@?(DJ}dEqZv!Prtk*j=^R7aoXAlY0qHD7X zse8?M@BKlkLJ1O|&zaz_nWD8(`MrJHG)IO6YSFc&rOj-xM#H zeMGM%BZhpADxY2QR{!0s_jXnMoL892@4UwAz;y+)k4A|wEm}J!zwUpDq}-|O+W zxAII@72?`4(vtOMY{S{m$L%nH36YQ%(sIo9lv zqc%R?oIEK?glW-z<#)F6!i*tq_aVIESJv;*y>Qi>{LX}$J;eQAUnat|kmghkoY>zg z)qb>>4_r6By?eU9;#YoW;)TrqR@EpGrbQ`{-#Jx9%e8k0-g2X7BcY<+8ya1KE9*B& zORm`l5+Wfjq~)4z==HmDAil>OZP%8xn>)Bjj$_gghfL4LRzlbhF%?Q$?9m# zA=b0}&NlSwXiHW{hiTD$<#)EB*YCQrepjs1y=XVFtSXn^^AcfNNOP+6s(VLP-P2BA zT4_)BqMg37vR{5@La(}aWYv9`7Sf!mw=3P~es*Jfug+;lx2*EU718oL+jv+LXQD)y z7Ts5VXB)chI?{G=jX9=WerFrEPU-JB?YOmvY0-V3b1KJq);_@LAG&Yw{tObcnYq5Iuz>36Z$ z$6X2XJKJzR-kdG{ZkQI`SAJ(3{}w2id_4Nb!5$gkOY%G0C=zFgFfF>T{LVJ?E(lk4 zK}ahh2|g3@JKOj|6aV$&T@YbfNVAPHH51*g_e@LvGJm58tudFA8{|z*=K;ujp01Vp zMH8z&pPHPm_qd}L(zN<}$|rH&-V>$fo=kL$FU?LGp>3c<-uiT3yp!HjdpyxSbtyZk zpWbq0_I77+(PZm`Gbt{v@v5*O-QT^6tHtzbB=2l@npQ}*{`)({MJ=RrUQLIc ztn*sU%5GQUkX8Itic9mxvQ~xnJ1cKj8?J3pYHa+h>}ppJS`&0WPz!0^`>dk7=+@`& z>})vywN>Wd6qomdD{rqQM;dq)3a%Vds^SCFtr^#?w$^9@qxz|^vlMrO>hm(XOt*TJ zU2P@koTC=f7`xZ!cpVt#d@&-&*>o<&#h3?1Ose$N-=mN23{~p6|Kgo|ckFQ<(>cdI z=NJXRsDo1f-c-Q(H+he<_pcNewUEZW=t|9rd)oQ^ZY*M2FruxnMP zU!UF1dfiHJ?>wdiqbEw;I=HH{ckpgU={iR(q%nnh_dwlQ+0T|d$)0n12F-5r!zB(_GtO*FPSEWNwUEY0yi)o9J?ONbG%I_BCXzl)_xDs{6d7aC zO1*vEA*XBGS=qI8OGGWCOMIZ?wb33!sqJTSt=iR}TK|TsdG;ZTHoPVu2n$i9JP?9 zYg%W?Cu~%&y~mni6|kPtHgL5Fwmv+6K&dVF?Xf;N8E+NVPZVk)jjd9teK)Um*0rAQ zY|yP_SEhagM0Z!+{+WF!B>CPB!1GSLuJw6?FdjDK!wbixZbf>Y-2kzCz zxB>3^R;qmY)z$-Dr#qu`4Wbs(7!gn^b4HHS^2cG$x4I>c(((Qtb$CZNt{lL12TJ9> zo#T|v8RoRo`9LkC>rK&bHGenx^F^0hx38Gzbk;S9>BWc%?sr#eV!Nf*?=$8(zn@HT zQ449zpHlPl9dc?;os~RJ*9Sf4vMQZgxPL~5epbxto%V5uobmls?aYs87Kov+WQL|4#pEFR-(cwUZDtBNFBeLmRk{6O`QMQxPNHNe;%o|mIk&0@*c zAB(p;-|IR@Eu_(&o|CzIkCT%dZynM3z!mXSYtq-^+IppKzH5(D@p!!TI6Z@)g)}|E z<`j=@Pw%$=eXgoiUq9!##tWY!JfB0Ke>HHowW3W`tE)~GY9WnJmr^$tpOw7v+(GAV z-AeGZ9*hYe-@#?bCu|(8IV*XyuEk`X57a^$qrG|`{mH}Dg(D4<+vuJeS8QGTR2ALt zTDsp&rhXT-kj9l^!FlEO*pGT93$d$u2r~*vZj3M=hiS^`v@F&v80#8)j|N1ob7d+rjHgmh)*X z)I!aQ#y0QgIEkMPvmD(spcc~9`X==DjXqGxa53L#uyq}1h= z^PCR1Ep_hEPc3R8eQ2oe8T@lUtd;Yu^LH+FYUn-@doqk7(>T}=?@yR#y?obF=cI0l zsD(84e0ub{d6;!*NRIR1MIMn!WE~^!c$SG$>+V?RJU(KgvqYCJ_Q?2N!X8|y#U9OdUT*pdyYW-$y14kA(7RjZZNdDfX#k%)dax~tN-bZ{g99iHR zKRv#>ZI5%}bi6ZDrwX;GWeANU4y86#8M^+P3%O1mUFWgqILY&YYi5*cFl^9z=XkDD zOWVNbBbGMjcm&Vc!sY zC8gRPO|qVxy4|XFN#1I#g*3gR%s!S5t(H3Lr_Xcd>Qvzv2cJ6}6X}u6jZ2*|bLKhU zYJU*5kjCdxsVe_l>P&lSp4D2{IT5nshzL1jiENnNPPNJ}bvn$LXZ@*dpcc|(!<@G? zVqT8*MD8%Bpw0)LY=dhi@QfU#Dox0-&gFaBX{X;&sD(6*IL#`H$>odr_Zq_`@*3TenAx)ztlk>RKhpm?N6SGh1RG}|}YYp%;8l@T@ zIc&YRuwnK~x~xzOY4nhk`s=BxPNS6F)*U)k_zNYnenoXT}xj~V{geYbN}rwYe|xGD@! zN%ZC!ESYCOEu?Y$sMJfj1+p*gHRlel+eJH}({m~*z3=MBtIa0gcE5j3zXu7_qW)26 zxh7isgW6+xqxp2}1sd-{i=#S_lhLq+Ds`s#YOCf$)2-6lOGPcDsh-TP#v{CJ_-7k1I~#0+mn-Y4Wbs(I1bid0e@?rHMzd_L3BQFo(i8koY&It zs7dpzh_3TVx^G7f6n(#uvv;bS^YpXARe> zLM^0mW=fyXr010ewykRQ(K#poTz19c=pIM?zDIA7M~_-a<6NeG8$2`7+L5@<8mDdG zOcBlq;;fNUd%I1vDmPhYP1JRcT1ewep>FNv3Ru@^KPNxs1I`h}m6>=ZsP=0w##>vO z?{V7bo*K1~#^=WC864d+SkyDn*hg9%jwW%Gsn^_E9KrQ5BZ&61t&y3X;OGh9K3C#EUYYvFb)_fV4apMHO! z7SgzyPN_PlbDc@mo=R${bB^N@9Jd8WGS1Q*D{ap(tFa!1Q*SBbcJHkg9k)}DYDVEX z&*WHz{vKvMsZ)hoNYi`JjPyIGZ=9TRot@kC`vd2~=t-5gCC;5G)m#(f3Uqcl=zO3S z(l|?@)PiE$liS>Iz)93C5!+9|Yt-uwXw=6i$~{qVd-Bek4mcm_RG}8q*xr_nC8G}CpCT1ex#RH;Ja8fO1<_OKJtIY$Dug5%wJ z)%RF;+)==JNVh~PcNs_H8b~}PPoGsB*<;;)Jl?rWKZB@+G{#$$`u6nK)}D=zIyY;N z1=}c&cW@k})PPdoSQU;v>iM;(g*3KleP;i&iOKI@J#4kpWko)x?7U^4lVcw2rSjaO z{(}9ahRNs79=7h%WrbQulb0&77oGDFyRD8{Rh{a(wPTs!Q-n{K*Y8@o-*u?pMJ=SU z40WAfzuK97ua27N=L1Kn*neQZqEvQ`)z0e=PPcy5JsfHwjiXwf^Zeg9`73m`+UZo$ z^C8a~#-Qklg57{uzjki9@Tm2$em+nOY4pOCDm%DZB=Z2Dd6rU3pQhO_-lnlZV!1SX zvUhrpK6NVkJC8DY^{W<%Kf*+q7ScS*c>K>6k<(rIB(@GG^-1!7<@apN)hky!m!zE! zI-(rCX5xcmEg}^jV?rdPg|u9As&ZO>Z{4I%o1)b_>-9SJw?E~4EbF09Ctb!i5F0qf@#>wnxuAE4e$>?y;QnQR$#wlemTE7WL>Xdd&>W$kzw> zY(uF*k{mCbX8&G~ZOHFzp}`jOTpF?`#8!FfF>T{LVH?wjUjNS+7c=c2(|^R6DLD z*ZCu>Q|%_lXzycsj{MFxinJXa8SyC-VOn%w`JHWi`oQQ&uG8Nl8zf0Pna_JZ=)P+= z(is`)9znme4Y%Fs$eGDZglW-z<#)Ex@#{X3GY{~3IB9VtY4BaDJ$NFwUHP4D6x`M) zvam4|VOmJDjhqtgBRy;JsxWyvNrEk3erFp?N>H#{O zWDk=1k9QBS2PxNV0|}APy^xk`wz1;!h{%y?Gri|SQbiJcCggXvap3%j$UjS&2-8BE zZCuD2l(hMuTXWW z%1Uxh>21DSpWG4kw&j}hk^J7~*(BIU+H-szMgp&TMD*PQb^Pv%;O z6P`*Msz)*y)yJ4lFpi@~`q_Go)%nMtFcGGOG?&%4@w1ZmoIYqx)c!|cTxMHWT-Pz!1Dip;pZ?oI2gV`&pDS|@|EXXumTY@5zUgLPK_ zkrS=2wGGrl8hv#g=S**yef0cc%hk^ZuGqlUX5`lzKWfg%#O#)usG$keLYh5R@zs{; zJbZfhI_G^o8-?YLdq#sXuf828T9=xv^I}D)g*4WaewF1vWTm>ZlHb%h$JIvEN@V2# zu1?a?CH-uyXf`XE`V!Pa8so#dwO=fd{8x1DRr+?XztV3Rnn|T6Rc2E8Ip24>K=PTG z*;>*QzF0bXlPm(iq3n zJsgi-lW9aIZ+dDC^iE8>mq)L1&8-9pkx+|6TCTYzmeIR8YH6>9Z1kLyX4h5pzDxJV zaCBc8!!c112$7H$(sIqI`bTZgKBQ;WzSO0QD=={tBd*xgtEozC&z^hZ0jH`SWuO+) zxVllP{(4N(uyL~0Ot&lSEpgon_O5yj%iG(nF2|CrxAYT*T1ex17X4kSVx6sdr@ppm zr4z^Hd2E2O)L>+^UC9H^>|Wcmo9ld(&~q=c4iO{ZxNcFYr>Y%r3O3%JJxD);sD(7m z&&Z6PZi$s9I1T&P*58(C z-8+gja#0KEq(_=#*|)6tzy;af|)$Msi32kF@Fz90Es7w74dl=K_` zX;=K^%;%7OR8!#aIL~0mv?X1#9dG76Y!!E znOh(m@uSl0&KHFEqPlB6@>zLzfv!Q+LOM9lP$@SdlJV>;=QW)VEO+rU$;O-tdUxGj zVq@>#gvf>$XE{&n8bmFmv7TssNeAbFyKi?J=~Q8Bh_}-1X}h?ru=VJ%Pu&hqiOB8l z@vDh0Y9YP7X1d+;R%urYXE%t{K5`T)XdM4WorrAyFaT{xXU79_%Bwy=O*cUX2 zOdWP2xsU!5CTbxqJsj70t1j8=H|kvqy>-r;T}-pf+{M<}2jqNE{PW6he67?Ee`l|M z^jM<%_I0{G^gF!AahAl=H#C-fR6e=W8eFxsyHMLWtE2bQuCUgyHucv7PVBVqu2kCH zq1!HMAuThhoR85%XIU!`C%7YZ&f8B+v!@ke>oQMCT1950`Om*n2`RIzReKZM9{L$X zEu@2Umh;d4>m129O}DFuBgT(Pi+(|ndb>1lBtt%&({sFz36Cs3!CLTCZFfk%MlM?K zl$qxDJ~iLevu%D~vaS3CD@FHLb#=~B3u#QPo;_cA#5sMcsJm9@yi`WIoxPD;H9o2J zoOEvnn#=0O>?6*&BSqcEv<=ik8lPbO?aTuwl6TB(;MUcB;=PVui=k&WsTU=mTxM0P zY|&3tL#gw^yH6zFKEHumS*HrMkf!$|&BJo4S`0X69lb5y-K)#$!B%N@)m5AinLQ<~ z_8rsw{OSETPoA@`B*eS%Iv=Qow9JdLjnB)t&d=-1yZ7rS3j3w{Q*?hGo$Q(e{nC*R**mR>wn2UShFs;9BK7S92J(IBZE#F~Esg3)snL~6M{1qj zX{G3A5Veq|x50M>dA?Ms``%n`y}PWkyHyj|BjYoH&x+nXpouw}*r*BALK=H;J<2#y zG}7$DBTl@|2fn>z&f2Rr?Hg8^D?N43(?ugA-ag{|p>3cR()hO1-yiHf%bA&*;Qpy= zu+&4kcaHW9_|{)HO0QefkqvGoS;J;I;|?Xb?X(TlLK;T{N^O2J!I^qrefJanR>MAg zL2W%p5^dqw=j-n@j7V^fJW$`gtXn&3AziJUUcD84(v*s9pPF1!??Ag*mlZy1|>N_qrba+ z#jfu@qx(cmFZOEK+vypvlmx5ngY{iU+dwU(F@HLK{&?-kmRl!S|LC%!@yFB8a4FI_ zvE^>A4;rIfzfPX>l)<$lbx)4B2I-um7Sc4bTs%+eWB0rUk^Q+RvTH}j3=@{{XhP=R z=$W8i$=WERjJ~fnh-5r*BD=iKIcm{}LueXhPz-^es9Qf??!574Ww$fcAoP~_++pvk zBfN{2J4N29?AFlj3bl~N=TWHx#}XsOE_|N!pzhnnyCdtn)%%pNYM(jP2y?1s4H%Z&Tr}JzXeI7tGx`Jr$MrKYk&x1jtq|rq&x``;IQvK@f zHN&7Ql^Ud*LNqQRFXou@JT={=i&3daN+S$OH%gh`cRl;8bG{E}{^0qXy}o6v~l@L*|R&6}kM zTHnSgvAS3d8e>E;6{A@rH|F}=_Ith0tn0rF1osr{hTOBp^d7U{J1(uRzY)^TRE%bw z5xyUIUwuiNeCICAS3JwGzQePUF~{a~bYDIr-@y%OpQ#wldJy&o*1{5;hVv|{GpE{T z^n@Q4NJ6Bd5?RvUtz5m+wwe3WaW*~!?>}^95FYxwmEB&go4HS%Xc4KXBwzjA@~Hg% z4`;KP>Rk-kWywh1wH;rP^gqR`nxTajHrXA zv3pixM9KMScwdwB(vwo{d+r%$S$x!TE9#0YCDGq)sW8qR9p|a2q$K*gEmhgTea@u! z?TenQS*kWE`RebMM+}JKI3g95@qTbwZ?~l6>`d z%VXQw^>e?Z_&&OK=3di1wdJw;jQY9X#1W~eBwzjA@_?1o$Eki`7aiNKI5-)Vye6Do z9N0yLO1~`+MrevqFgMkYPLVT? zDGpXh$t&N0M_gmo-!0-G5C<-|h*VUJwx#Oy?^wV1v1bAv7o1ugXkL=SwbgHnxB;u? zlXERXQ-nLC_1l(eG+uZ7tJnmIr($eD#^o zyd*_hRJ=tbU;VZS_+|L&m!T;_#c2Jur5cRWt4=2zWhL>jQ++*~P|ecv_!x*sy4DX6 zs((s~Qc1r0yXCQeQ^Y;~pH9Kq1nVEFmk3&aw>%h;ic0d;-z|?5+KzPh-?br-UEV>c zHYxe)@0Q1LK-9Y1B2rOFzWTf6vEbty+%-9NM5WSLCEqXtW6;$xs3}6lX#KXO+Fo*p z`^k-Xu^E4?S#a6)cZ;}X)*bG~z7~;+O3JRk+j?Nsx;koEW8r-Dcgq7agR3(`Dk{lW zf44m1K3+ker?T8gzP$4`h7p<~RE*YdTdKJ36Yvm?<;B}YkGA?w_ElEL72QX^Eh4V_ z1PD!$@-kY#Z9Q%u2~XJ{dIbpCRiFEa&5Nn@+wv&Cv5i}6hec?LY7h*VUJwmjl`Nx(z2i5A^#Jwz8NILEe?ep?=Ky(BbYEMZDk8SJf;OBL65gSHZV@QOyZ&qc?T z^I^$XzbzuJ?*<4>5h_OOw=LD5cwN2*K8n)kqCuY6!t!7${kA+9p(&CVqxIYJh21LFRB`VESlCS=5dAtckb$pkaic0d;-z|@G&K~K1bG`M( z)lx}bEcyCvdB7XjS8rTRk-QkK-ZT>G)3}a zw0>J2xS`szgr#{=bql? zNJS<2>hG3Ee)>^<&TTgO9!s3sbR}Q?-SWt2b(G(5j76lPl6>`d%j4!|^<&@1cfxG( z;{CGzZh0^w6;;54PO#zof%QpmbMT78vZTLT9_{vZ@-w#E`yZ*Ogopla>#^>Q0{3`h ze3{!*+j=G)X7};e6}WR=tMTe@`8hjj5t&J^a0k`5JUE59E(gOG9CdS|N-Z^EQ!U*xj(KtNtb$+wJJ#|BkmvLxG7N;-i0}=!`{oz8w>LBXxaIGx<`hQojeJoaKrYBdfa`W##?;TQC&HO5#f8=6VX=L4Xo^P3L}!=lVE{_ z<<3*f9nVXAx}d+?QTrP1ek{hCE@Lnim5fyV-HzIV)y>^Vn(ti&uNOIeSvA0(NXtG! z?yCtEdsZ1!x4gOAqOI?Z#z_NHF*?|P#BaVKV%F)I?)#0V=B|dloxODU)QY`&iWjL=E8B=oWcn9fyMbptiV0^U5(Rp_V_YRVT6q4|BJ_ZGUlea1@2p?8u#6wmSl4Z zBV@)XzD;j>A6s7FPT5xD{J!bjGEQNH%t{*h&zJ+4cV9ZzxaZ9;&gK+G$jq0Fj2EAG zotsWt63mI3!ieyV_4vH&VBTHLDU6UAJQ+E1-Mj*~|0%}3XV$?iPGLkiMq_;5bujO) z<`hQAO4M}+qU;`=h}oz9TLtdG${OeS^xIZ*3M0ZksY6~XaL+oyxS!*>2OebQD3uP(?N3QWc5X`fC=csI)Y ztbauz1XIbk`W;}cZM7xwdIYC1q7}}$lU|d`p$4U51XIa((gWf^$4QBIGdP72%Rj`q zdcwy`dB|H3j9@DHp7p)XyWjUXxZ0wMd`@9R{<{+rejrH>!h;b^CEx0wjOfPCy}C+p zQgcpWL~Te((!V6hr6`18D)~uexd*^HYm4iPq(m!x8HB1mCFN8Ykq65%R56t4k*&{O^)wlGbGeQ^~jbawC4p z{W}w-;uJ>w`tk(w^6q@X7m0U%IOT9e(i5=Bf8S1t5VTT>SBH8-B;uJ=R7eUg?BFP2s36n<(Q?cIx?tGkoLLj?RDo$a9cqjaOoO*IF4@NLm*q>qf zzFLX4;uJ;%p0fX#xSu8SU<6ZzeQO!PDU4umQ)3!l{$1jAM@~5$acQ-d%G+_}O5r1t z$O!pXD)Fqkag!prRE%IM_Qf*h+2i&n#yO`jLOixQe5^c%eB&jgoe@kG_VIe>G7j_GO74jRcWPeCKLI|Q_Z(~H2UtE?LgPbDYny>i1rj{#4Fjd%7cEFt`!Glv6Azrh|@p0+I z*@;oh2&Q5`TSU#CpM2?$Qy3v0#yTF8BT(9k5lqEC$-&H!=s`|lgxu^%&R3XyvMi^f zkasjw@m&!3I$ymtF$Ot>5#pzxoOhEo!RwB6Cx)rQp8Z~z;zX%9g%RTApL+dZ1XJ<7 z0L096FHOiUr!Ycp3F&&3tcCOkBbX|DuW05y-vw_-3xZP^5%`6tT+bQ7RAEo@dVT*) z@Zc0ih*$ZMdWnp4Mlcooq2vDG_y&pb!6}Rgd$A^4t0?3V&s2PG2Ir1FcO`gm3M1Gb z)|lPnk}pUyB18p0TlF@EP3FHV5_7vyB~tLM`e*nai`GNhiV;l3cR>){_=GPKJUE3B z;X4h`!V}WY2&M|#`o4PAB*r4m z+KN*c!QRG64pJ&cFqM2K_vgd+{1WuJAUK5)e4ERdK_`8YuzoOtslqocdcBx@1)NhD z5w-~bl)fdfOvw0P1XJ-n4P&Y%W+nQAQy9UvWn)I2krmi|{s9k0Fjd%w3`#$>h4bZhENja>#?I8!m2?bpV<8R_U=+#%mf z2ZH-Ue6G|JkYxdT93XCMm+y@Of~goSK3*Ex4E|TRS$y!;66bZC8>p|EoE5ON^XM|B z-qv(?^+P4j!T9ZEwY@Mp?0NRZ=dqlp@NSsgA7mX)G)wg`W{nfkFDA!w8vl~%AA{Cq zDn^IBiod>RpEu029@u;?%O}VByFFw1@2Gv=?RYs<`aKnuw1WO_&sd)Ao#EDhI^7$I zda&$ri*idFQ{6Aaee&jX?^B!`FcqWuh7xZ5?rrFHDX((Q$1QC2jS}v>8idv>^YAYX z-Sh=jP9gf7sTi&PSGFD_aAV}&QTx5G(C55HiQkIE1Qe>!`e;tTt(4;@?DsxLshEn< z!Y_Fr=iq&}c$?$zjPjir_7>3JZGYevgojubL4Ty8l2YmKwjQ`|5JMcV0Kq;5e9ErB zTON!^MJ4&_@0Q2V0U55-JKgD43vcSRoS66Jj5>MpKHq9HG4BPZPM*AwH@xk{yjhpp z-|?PT&kXmE`_i424Z65Y#pqWK6zBbl^AG!OUyrjg-IvYO+yQun@A-2kCSLlheayt* zwO*kblrfRs?aRSja_{~rxnuFtA5$@UV*QE1d%~8-unRi6JA33iGx2WUk`pH8y|>kt zmrKGWM08`^eEIskd}k4A&Qy%<|8sHhzO&_#JEpxG{cW6+QM-%Vqu#{4mhI{WZN*fK zhP2<--mPg|=)8cMGZmxX`Mx;sf5+5~x7FZhJG;AUs&kL2*Tv;_=h|{B;H?zg2HbzJ zI`>c1oT(Vi{bbCD-3{IEmR32t(7H`tF3uY|s$Ni!idn_M3+7T=r>r>d?sM($&>1iW zk6TpboQHZa6{9;%EDqjSw{7(_Zmc(XuCrSYJmd}8^Y_#bcnr95Lf)+<^@G~VYqTG1 zwZ9va{YQ1~L?F%p52j*t=gt%I>b`8zhyvBFsr%ne!JTTC%RBD%;^38ZDan{mi}S|q zv;AbuC#{>hd%ml54jk3RWhzE<{UGgf*Ye-$*!+0w%A41cue5I3L$!iBNq-EiwBN>z zMjh@kyJLqSB}^rKqiE?5d7<03mA@_Bop4);(*-qu_>bbeM@QT8vShHtAiD9Eba&vL zCC+M;im4cV!iM6!sfc=Oc{J~z;oi|Z-MbS!n7fRLA9HNkxwN?9hI{lm|CjE42_8(v zXc;&1nz`li@tWrDvJSp;I(Trq_pK<-8}z6x$&=fP^WI*n{jqdqbNA8qzSH37E-q6s zn)?YS)kXWA*G{YJw#4}8d~0!Di!ZH=eueMSTk8cSsr^uKo_R%Ocldq#o!V)2-8)bZ zregHw%Zu}_eBPpQpL1KKv+Rtf?p=`GicZCOn>$+>9dto)UeSk^s{GR8ynE}b?Edt1 zrL!r$sXGQdn2OQ2G%wCO@T>Cpyj5MdQ{jGRC)$e3%cF=#7vf*Ftn2=7;(n(g5KP5r zuAea{k1TPvZ%=m{VTNn67H4!X+VZZ&&C=EpJBmKoJt6OyLaoOcgG-$MexL4sjs9RN zMh{toXf#*r82n~ry7LO+Cwz$h;PLzqPQbfOvQ+Xy_x+zLkIQdQcP{CZ;ci4*F%_eE z{3BNF&zbI%|HjIx0c3gIQ%uREhrKQff=yR4)9z{I5j9D=|&CPke)OiAP2~#neWg3wX%9^{4&i1{B zP%25ev9AfZi?sjWdo?|z?1KLD3=_;Nup!&=;mP=5Dn`rr*mJDS$(VaEOSj(L(0>@M zD^mTzm_t3JtwdfQdj8*lhe&?zzxLahzZO?HQ>q*Kg+MSBqeZ62o@8?}X4A=q&Yz>& z`@cdGMHkg@+YND}urHWhmF~~R z_z-E&?DB6=4=%fm4}Db|x5;lPadsmzMF!f6sTj?5!mCz0Gu=P`j^zwQ%~{7`Nes(w zFGzdyndLc6(7H^;Xx530$@sp~NkbHFiZ>6vbeKc~c`9!$k(UUv~GWMQc@VosX>4@%YP;Do$^|7UB+{XDF3 zaqxP&mEBKEOPvQ^P4g$9KbVTq-2a%V+ctI2{kqZ{3LZQvyCk?mB#n)MHzw;?_lbsV1k!cWj@b`xP+BsFu zO2nC9Dn|49FmxZ>h_8bkeFb>1w+P=d)cb>WH!-YTroaB-DY4hEA7m;_u-6YuLWa1M~u7u{d{K$cJy+mLE|d1w@7fuBoP;f_wGzMI_Q!#&j{a^$jkq4AVk$eCO<;gQ*zJZD`EGj``l1uyjrV z53wQXtv2>f5btQY`DWW{bWXnadu~VfOGrCYF`E4jjJY$tsej>)O7B^WTK063HACMt z;k!V_yxgg&|DU%iy;+bereZXYM`QX&OTGHg%1TiWu{7$9O!i0-o2B-XF-_-`dV^j~ zbMFQZreZYvni#VfKHu3BkwebjB?r8ivV|Oho?IYVV!sbt;i2jFUI+U7o>ZQ(7Ieh zjx)e5VoVo|^IHa_doN;~GZmxRD-`!87N+_4JzwfvhB3%%5&J;O`jLzqb; zB^nu1F`8F6jB~HbxqN#=_i`Zk-Zrn{d@>H7qIp$LzkLneRj4^rF`CzQoWEUH;_ZYD z%L5O&=OMRcrO$b!@(4EOjoVASRj@NW2OdntX!hQMz&xV#bT~9rr*{U z&InDBQZZV;?JRn8lR|IMsP=9L)Pv_&E(wB&faa@v(SA$ua3R+LT7g+<`Sl2H0wl&wPeq6g4Wf%q}_St)Nk7#@pGI2 zp()btjMi`4AF~m^^wLXwZve(QYj?c9vNj0o2jVTCcZTmxN9!^bqj}xMt(4o^`_G25jz>H)7n=Uh;30P^&xK7!YREGu zUJF>Jp#_Vl`LL+sUneT)13~o&KoR0q6(8?yE=1j$CX~U!k#45DzkH;2z-$Hgdh3{%}PS_ia zZ0~PtTNvynn2OQtjc-i+OgN~y&aYBi)@1bCwpIL0I6!EMv=yWE+sf`mqtd+@I0<+Q z^A{O77?m72S*-keSRp@$v~ydrH*R>vd8bRPylQ)<+Z#Q| zRE!R{ZamsTAc?A2c%%63Qj<44-aEjpqkFD{9GTOPC89Od^PZ4sIxc`;hQEssCuR(Zpqk!?f| za?N?>W!5NM4NAZ_6VdKhYEKHnmwuUc4vQZ_6Vd zqcK2eisZ#;{kA+@#Irp4`g%dcMYZBcUOa#3?-sEfhzBOs4G^iQ7;Q_16JB3EAbzc1 zl<-wK~CwoQr6!|7;0)SRgp&2_?QU&nlBS9VAD9U$2MLQdJWpXDT8WdU~Tv-6!V5I_15 z>cLcuW`7N19>;q{nXu{O%@=p}{Gx=P%rUcz5`HoV;LDrzdRg;RrFRov!gvj*;Y`Ko zS064S&zkmU`_8R+72y;30m!-RX@hNBu{RBS+2Hi`9N#%U+T0z9nllxngmK(jOH<)@L_SqhlTyD z*h{N3`F`R29Irai{wGDY?ZM=XauYnTpZxG{$RCiJ4(^ z%R*-rY?iNs2ajj=(qiu|?C$U;(yznXyG6%X?;TwM7|r7!z8`~PMF}5BojE06{oV3lL@FxD zSAVxWRt(<8C=^3y6-(v$FtXb%cBl+s@mIotJ zQAxh~yX7&n&bj{X&m#d3o^iN+^mogH5viyoU;W+k*n(KzZN9g$yboMg82HLdUXKqf zO!&I%??)n1Q8C(<%EL{L{E;?F^NP0$10P{YVNFlJE#jMZZt#~BScIkscSh^CE!AMe zh`)TOjViAii{!;+*WWE-I1v9Wu!vMtjJBo9x@Lv9e1_c#^T^?T*58jrq@t3N=M|T$76`L`1ooYll+;B3j@DbNjdS7 z!o*z({kDh?ff(7{A~Z#6$Y}kxH9ugc##Y0lY6H$|WkzoK=D~owXqmT-uw|DS{Jv|n z9;f^?CH5@*ye<*zAW<<|bkWA2+MKXI%f!ozu(_X%wvy2~{uoi};r?ih~AHTh* zJia(D--|&LmpAp8iqX>N6&Gk*rQz+UU-2$kIqW{7O|1O5c!>7VFk-)r zc?v$STNhV(#jvn26{AI;6OTRHx`+M~%gL|K^x^9q*hO2fu{D&{N83l%C~d>U8s%e+ z@|jB3B}L2kr&nmrAHbQx$MCHcUmUI>%M!PUF<;d#^g06Z5bD8HjAj`#<|W)I8nxKI zP@z&HHRPE{zirK524cw~i_jF2A4co9m8-v@^(`E~-`j^Cl==1Un{9t^ABdjVs`5~L ze2AWS6cBx2*=8z6bKk%(qfJx)wXK!je^7JoDbdKqBU<{Ldlowuc)eVKU5i-HnTpY( zw~IHnt@+qRrQSrmoK*;`8jsG*O+|t4sPN#?Y)ow+KA)fFABCDT6{BV4yzn=b-Fxt= z)kE;@TZnT59yy|`zc|iH29Gpj>ik+AdlBzo9gTBmred_{@Y{aUF-X47zIrZ84b^j1 z>Y?7Pw&o|^QsVfS;eLngG8LoM*ICekrtfMG%B=+LbGfac<4*20=-4y{QsSzVFcqWa zPD4^kUM@x?MBKHMS9N*D;Zek+%b4*)W966Oh1Ct{bEaZ+c!qoCzWv@`E$jMcpwDHc z7hid46PDM>6N>`hdRy~}6ZdoOIi zxlTCq!hMDY(dPcYayCIyE&G1)9+!N16d1D>h>fseJ%~~<6{AH%7SDAni34|6dKaZN z^`Aw}Ifcv4IRzf^Ufd(zXDUW>or0aPgPpLCov<%AQFP>p#Y5L6v4rT_Wz38l(w#1s zWcWUMkf|6g_gHiU<1JI{Qnhu}A75&yH!Y;CWM8ZD7WAN_J;+pyR-gTZBswaIoEMKG z9$m&j+8vd4reZYnMr>T{Ab-M&vlV@=w>hL9JR9&VVa&xX3Z24R+xzKgE2d(!-v6-m z=z;s^n{gN53P_21_6ra7>=!D%3t*)r4c;j0{+JS*2H9mQM(bSw%Y*Js_<9RM^5Pcd zmNsVRx0OyuNaFXEe~1M^bvUszBsH>M_DsoL2_3ElT9>I9&H9Ql9dNhr3|Q742M@i~ zBxTo|dQx`1`DE)+hKRkb+WF2>^aoQhTJQGRwiDP!(RDqRi*bDYR>JhH!ZYINe$pe-0Lf;tn_}vTFX?7=6-@--&wvh z5Od-^m`n67iL?nz21^X$0i5qUEz6qweNl6!Vzk~jv2FDZZl4uH(@00D^tO}m&>J;E zrMGTue|$S9%^kF~)GLA{G8Losew5|0=-2Ap7jc8220U1Pcvj=t&X~9NRp(aC?Cj&- zozGN^W_d#oLQ3{xMHm{F5^Z-b36~JsD{j%{wD&!EN0F)YMvc^#`zc}T^I_}rS;yfP z<(4*P&w^5CIqv*apg)+3(X12UuFPj`y(!N;7}y!uda71=DV6?i`(yeSZM|#bh*VUf zN9*rar@jsEl68x}OQx1z$&2^o`nyF;KRDK}Ki$4$mWqnewp6P(M*Qc@xgmRrq_Bln z?Io7SFF;%uN2H=+wB-RSj-z%TK3z}?q)_SaMG;p_GHOdf44lIU-Cih`8XmKmE^0xTOJKh8Q_m<(JW{yJ++X$_%uVmEe}R$ zisZ#;{kA;b#k)?io2^}x?dp1VBl+s@mIv&ju3A!4QAxh~yXDdEyI%g_(eam>;%AVD z*MlV#(Z7G_<$r&RMQ}ZoiqW=I4IjV7TYlO7L0hq23VY`pmze^&hEtW;Etwxxp2(uK`3I1T4}|Ew+Px8=bI zO_979t>2ahERe2RAZ0DmxCX2z=(pv;2u+c^7_HxyN0dBPm=${oV2?0iyo7wg*#DG1~H&-eQ1z-$`~1ie{m)H#lGY-SWT~ zbam9GqLO^|cgq9TLHBOAe&C&;y0fI{{bR{jzmG&{icm3Hzip{7qFfzO9KV3euD@FZ zMy;!(HWihWM1QxXg0gvoX+z0x* ze(Y<= zulW1$>LnH(IZ>2+^>@pos$KmU-uev?si-7h{oV3_2H>jBz$=TMB1^vdyXC=%R8*3$ z{%(2Tl+4j{H9k4!wNHPyJQ$IRO7hj;Esv9LTH$QOi<{C`tQF}wu;i=1TON!^MJ4&_ z@0Lf)i#9m5F{*?Ir*PTzcguqjsi-7h{oV3_?vty!51;+AEa~r-2XvoY)qPS?Nxu5K z<+13r`nlg8CMA->`Kpvy9><+tKX+3ck&24ZmdB_`w>T%nH2{`s)^YWB%L6)tqdG$> zD#=%Ww>)sd>*|>>OB~N1`n%=9h*VUPul{a%e2xAdoo8RKlUY<_Z^ UUdK{kDjs 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