diff --git a/cura/CuraContainerRegistry.py b/cura/CuraContainerRegistry.py index 2ecb22d670..af7ca2e87e 100644 --- a/cura/CuraContainerRegistry.py +++ b/cura/CuraContainerRegistry.py @@ -53,7 +53,7 @@ class CuraContainerRegistry(ContainerRegistry): def _containerExists(self, container_type, container_name): container_class = ContainerStack if container_type == "machine" else InstanceContainer - return self.findContainers(container_class, id = container_name, type = container_type) or \ + return self.findContainers(container_class, id = container_name, type = container_type, ignore_case = True) or \ self.findContainers(container_class, name = container_name, type = container_type) ## Exports an profile to a file diff --git a/cura/ExtruderManager.py b/cura/ExtruderManager.py index 5d0ad612cf..e937714d85 100644 --- a/cura/ExtruderManager.py +++ b/cura/ExtruderManager.py @@ -22,7 +22,7 @@ class ExtruderManager(QObject): def __init__(self, parent = None): super().__init__(parent) self._extruder_trains = { } #Per machine, a dictionary of extruder container stack IDs. - self._active_extruder_index = 0 + self._active_extruder_index = -1 UM.Application.getInstance().globalContainerStackChanged.connect(self._addCurrentMachineExtruders) ## Gets the unique identifier of the currently active extruder stack. @@ -66,6 +66,10 @@ class ExtruderManager(QObject): self._active_extruder_index = index self.activeExtruderChanged.emit() + @pyqtProperty(int, notify = activeExtruderChanged) + def activeExtruderIndex(self): + return self._active_extruder_index + def getActiveExtruderStack(self): global_container_stack = UM.Application.getInstance().getGlobalContainerStack() if global_container_stack: diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 7aa99e1b09..e5c2989362 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -4,6 +4,7 @@ from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal from UM.Application import Application from UM.Preferences import Preferences +from UM.Logger import Logger import UM.Settings from UM.Settings.Validator import ValidatorState @@ -51,6 +52,7 @@ class MachineManagerModel(QObject): active_machine_id = Preferences.getInstance().getValue("cura/active_machine") + self._printer_output_devices = [] Application.getInstance().getOutputDeviceManager().outputDevicesChanged.connect(self._onOutputDevicesChanged) if active_machine_id != "": @@ -72,8 +74,52 @@ class MachineManagerModel(QObject): outputDevicesChanged = pyqtSignal() def _onOutputDevicesChanged(self): + for printer_output_device in self._printer_output_devices: + printer_output_device.hotendIdChanged.disconnect(self._onHotendIdChanged) + 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) + self.outputDevicesChanged.emit() + @pyqtProperty("QVariantList", notify = outputDevicesChanged) + def printerOutputDevices(self): + return self._printer_output_devices + + def _onHotendIdChanged(self, index, hotend_id): + if not self._global_container_stack: + return + + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "variant", definition = self._global_container_stack.getBottom().getId(), name = hotend_id) + if containers: + Logger.log("d", "Setting hotend variant of hotend %d to %s" % (index, containers[0].getId())) + ExtruderManager.ExtruderManager.getInstance().setActiveExtruderIndex(index) + self.setActiveVariant(containers[0].getId()) + + def _onMaterialIdChanged(self, index, material_id): + # TODO: fix this + if not self._global_container_stack: + return + + definition_id = "fdmprinter" + if self._global_container_stack.getMetaDataEntry("has_machine_materials", False): + definition_id = self._global_container_stack.getBottom().getId() + + containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(type = "material", definition = definition_id, GUID = material_id) + if containers: + Logger.log("d", "Setting material of hotend %d to %s" % (index, containers[0].getId())) + ExtruderManager.ExtruderManager.getInstance().setActiveExtruderIndex(index) + self.setActiveMaterial(containers[0].getId()) + else: + Logger.log("w", "No material definition found for printer definition %s and GUID %s" % (definition_id, material_id)) + + def _onGlobalPropertyChanged(self, key, property_name): if property_name == "value": self.globalValueChanged.emit() @@ -165,9 +211,6 @@ class MachineManagerModel(QObject): Application.getInstance().setGlobalContainerStack(new_global_stack) - @pyqtProperty("QVariantList", notify = outputDevicesChanged) - def printerOutputDevices(self): - return [printer_output_device for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices() if isinstance(printer_output_device, PrinterOutputDevice)] ## Create a name that is not empty and unique # \param container_type \type{string} Type of the container (machine, quality, ...) diff --git a/cura/MultiMaterialDecorator.py b/cura/MultiMaterialDecorator.py index c702ecef13..5fee777309 100644 --- a/cura/MultiMaterialDecorator.py +++ b/cura/MultiMaterialDecorator.py @@ -5,4 +5,7 @@ class MultiMaterialDecorator(SceneNodeDecorator): super().__init__() def isMultiMaterial(self): - return True \ No newline at end of file + return True + + def __deepcopy__(self, memo): + return MultiMaterialDecorator() \ No newline at end of file diff --git a/cura/PrinterOutputDevice.py b/cura/PrinterOutputDevice.py index 7f6e51e1fd..212ed86ab3 100644 --- a/cura/PrinterOutputDevice.py +++ b/cura/PrinterOutputDevice.py @@ -24,6 +24,8 @@ class PrinterOutputDevice(QObject, OutputDevice): 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 @@ -57,6 +59,12 @@ class PrinterOutputDevice(QObject, OutputDevice): # 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) @@ -212,6 +220,34 @@ class PrinterOutputDevice(QObject, OutputDevice): self._hotend_temperatures[index] = temperature self.hotendTemperaturesChanged.emit() + @pyqtProperty("QVariantList", notify = materialIdChanged) + def materialIds(self): + return self._material_ids + + ## 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 != "" 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) + + ## Attempt to establish connection def connect(self): raise NotImplementedError("connect needs to be implemented") diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 9e37fa9049..40729eb48b 100644 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -127,13 +127,15 @@ class CuraEngineBackend(Backend): ## Perform a slice of the scene. def slice(self): + if not self._enabled or not self._global_container_stack: #We shouldn't be slicing. + # try again in a short time + self._change_timer.start() + return + self.printDurationMessage.emit(0, [0]) self._stored_layer_data = [] - if not self._enabled or not self._global_container_stack: #We shouldn't be slicing. - return - if self._slicing: #We were already slicing. Stop the old job. self._terminate() diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 2751173a1c..487b077d2b 100644 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -45,74 +45,79 @@ class SliceInfo(Extension): Preferences.getInstance().setValue("info/asked_send_slice_info", True) def _onWriteStarted(self, output_device): - if not Preferences.getInstance().getValue("info/send_slice_info"): - Logger.log("d", "'info/send_slice_info' is turned off.") - return # Do nothing, user does not want to send data - - global_container_stack = Application.getInstance().getGlobalContainerStack() - - # Get total material used (in mm^3) - print_information = Application.getInstance().getPrintInformation() - material_radius = 0.5 * global_container_stack.getProperty("material_diameter", "value") - - # TODO: Send material per extruder instead of mashing it on a pile - material_used = math.pi * material_radius * material_radius * sum(print_information.materialAmounts) #Volume of all materials used - - # Get model information (bounding boxes, hashes and transformation matrix) - models_info = [] - for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): - if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: - if not getattr(node, "_outside_buildarea", False): - model_info = {} - model_info["hash"] = node.getMeshData().getHash() - model_info["bounding_box"] = {} - model_info["bounding_box"]["minimum"] = {} - model_info["bounding_box"]["minimum"]["x"] = node.getBoundingBox().minimum.x - model_info["bounding_box"]["minimum"]["y"] = node.getBoundingBox().minimum.y - model_info["bounding_box"]["minimum"]["z"] = node.getBoundingBox().minimum.z - - model_info["bounding_box"]["maximum"] = {} - model_info["bounding_box"]["maximum"]["x"] = node.getBoundingBox().maximum.x - model_info["bounding_box"]["maximum"]["y"] = node.getBoundingBox().maximum.y - model_info["bounding_box"]["maximum"]["z"] = node.getBoundingBox().maximum.z - model_info["transformation"] = str(node.getWorldTransformation().getData()) - - models_info.append(model_info) - - # Bundle the collected data - submitted_data = { - "processor": platform.processor(), - "machine": platform.machine(), - "platform": platform.platform(), - "settings": global_container_stack.serialize(), # global_container with references on used containers - "version": Application.getInstance().getVersion(), - "modelhash": "None", - "printtime": print_information.currentPrintTime.getDisplayString(), - "filament": material_used, - "language": Preferences.getInstance().getValue("general/language"), - "materials_profiles ": {} - } - for container in global_container_stack.getContainers(): - container_id = container.getId() - try: - container_serialized = container.serialize() - except NotImplementedError: - Logger.log("w", "Container %s could not be serialized!", container_id) - continue - - if container_serialized: - submitted_data["settings_%s" %(container_id)] = container_serialized # This can be anything, eg. INI, JSON, etc. - else: - Logger.log("i", "No data found in %s to be serialized!", container_id) - - # Convert data to bytes - submitted_data = urllib.parse.urlencode(submitted_data) - binary_data = submitted_data.encode("utf-8") - - # Submit data try: - f = urllib.request.urlopen(self.info_url, data = binary_data, timeout = 1) - Logger.log("i", "Sent anonymous slice info to %s", self.info_url) - f.close() - except Exception as e: - Logger.logException("e", e) + if not Preferences.getInstance().getValue("info/send_slice_info"): + Logger.log("d", "'info/send_slice_info' is turned off.") + return # Do nothing, user does not want to send data + + global_container_stack = Application.getInstance().getGlobalContainerStack() + + # Get total material used (in mm^3) + print_information = Application.getInstance().getPrintInformation() + material_radius = 0.5 * global_container_stack.getProperty("material_diameter", "value") + + # TODO: Send material per extruder instead of mashing it on a pile + material_used = math.pi * material_radius * material_radius * sum(print_information.materialAmounts) #Volume of all materials used + + # Get model information (bounding boxes, hashes and transformation matrix) + models_info = [] + for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): + if type(node) is SceneNode and node.getMeshData() and node.getMeshData().getVertices() is not None: + if not getattr(node, "_outside_buildarea", False): + model_info = {} + model_info["hash"] = node.getMeshData().getHash() + model_info["bounding_box"] = {} + model_info["bounding_box"]["minimum"] = {} + model_info["bounding_box"]["minimum"]["x"] = node.getBoundingBox().minimum.x + model_info["bounding_box"]["minimum"]["y"] = node.getBoundingBox().minimum.y + model_info["bounding_box"]["minimum"]["z"] = node.getBoundingBox().minimum.z + + model_info["bounding_box"]["maximum"] = {} + model_info["bounding_box"]["maximum"]["x"] = node.getBoundingBox().maximum.x + model_info["bounding_box"]["maximum"]["y"] = node.getBoundingBox().maximum.y + model_info["bounding_box"]["maximum"]["z"] = node.getBoundingBox().maximum.z + model_info["transformation"] = str(node.getWorldTransformation().getData()) + + models_info.append(model_info) + + # Bundle the collected data + submitted_data = { + "processor": platform.processor(), + "machine": platform.machine(), + "platform": platform.platform(), + "settings": global_container_stack.serialize(), # global_container with references on used containers + "version": Application.getInstance().getVersion(), + "modelhash": "None", + "printtime": print_information.currentPrintTime.getDisplayString(), + "filament": material_used, + "language": Preferences.getInstance().getValue("general/language"), + "materials_profiles ": {} + } + for container in global_container_stack.getContainers(): + container_id = container.getId() + try: + container_serialized = container.serialize() + except NotImplementedError: + Logger.log("w", "Container %s could not be serialized!", container_id) + continue + + if container_serialized: + submitted_data["settings_%s" %(container_id)] = container_serialized # This can be anything, eg. INI, JSON, etc. + else: + Logger.log("i", "No data found in %s to be serialized!", container_id) + + # Convert data to bytes + submitted_data = urllib.parse.urlencode(submitted_data) + binary_data = submitted_data.encode("utf-8") + + # Submit data + try: + f = urllib.request.urlopen(self.info_url, data = binary_data, timeout = 1) + Logger.log("i", "Sent anonymous slice info to %s", self.info_url) + f.close() + except Exception as e: + Logger.logException("e", "An exception occurred while trying to send slice information") + except: + # We really can't afford to have a mistake here, as this would break the sending of g-code to a device + # (Either saving or directly to a printer). The functionality of the slice data is not *that* important. + pass \ No newline at end of file diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 2938604eed..da3dfa2bde 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -37,9 +37,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._connect_thread = threading.Thread(target = self._connect) self._connect_thread.daemon = True - self._end_stop_thread = threading.Thread(target = self._pollEndStop) - self._end_stop_thread.daemon = True - self._poll_endstop = -1 + self._end_stop_thread = None + self._poll_endstop = False # 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. @@ -221,13 +220,17 @@ class USBPrinterOutputDevice(PrinterOutputDevice): @pyqtSlot() def startPollEndstop(self): - if self._poll_endstop == -1: + 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: diff --git a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py index 3f739a8629..fc10c217a0 100644 --- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py +++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py @@ -152,7 +152,7 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin, Extension): "ultimaker_original_plus" : "MarlinUltimaker-UMOP-{baudrate}.hex", "ultimaker2" : "MarlinUltimaker2.hex", "ultimaker2_go" : "MarlinUltimaker2go.hex", - "ultimaker2plus" : "MarlinUltimaker2plus.hex", + "ultimaker2_plus" : "MarlinUltimaker2plus.hex", "ultimaker2_extended" : "MarlinUltimaker2extended.hex", "ultimaker2_extended_plus" : "MarlinUltimaker2extended-plus.hex", } diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py index f13257e8a9..201e415e15 100644 --- a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py +++ b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.py @@ -43,7 +43,6 @@ class UMOCheckupMachineAction(MachineAction): if self._output_device is None and self._check_started: self.startCheck() - def _getPrinterOutputDevices(self): return [printer_output_device for printer_output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices() if @@ -63,6 +62,7 @@ class UMOCheckupMachineAction(MachineAction): self._output_device = None self._check_started = False + self.checkStartedChanged.emit() # Ensure everything is reset (and right signals are emitted again) self._bed_test_completed = False @@ -137,9 +137,16 @@ class UMOCheckupMachineAction(MachineAction): self._z_min_endstop_test_completed = True self.onZMinEndstopTestCompleted.emit() + checkStartedChanged = pyqtSignal() + + @pyqtProperty(bool, notify = checkStartedChanged) + def checkStarted(self): + return self._check_started + @pyqtSlot() def startCheck(self): self._check_started = True + self.checkStartedChanged.emit() output_devices = self._getPrinterOutputDevices() if output_devices: self._output_device = output_devices[0] @@ -150,7 +157,7 @@ class UMOCheckupMachineAction(MachineAction): self._output_device.bedTemperatureChanged.connect(self._onBedTemperatureChanged) self._output_device.hotendTemperaturesChanged.connect(self._onHotendTemperatureChanged) self._output_device.endstopStateChanged.connect(self._onEndstopStateChanged) - except AttributeError: # Connection is probably not a USB connection. Something went pretty wrong if this happens. + except AttributeError as e: # Connection is probably not a USB connection. Something went pretty wrong if this happens. pass @pyqtSlot() diff --git a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml index 4b25d3130d..5d5a102e7d 100644 --- a/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml +++ b/plugins/UltimakerMachineActions/UMOCheckupMachineAction.qml @@ -32,7 +32,7 @@ Cura.MachineAction anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width wrapMode: Text.WordWrap - text: catalog.i18nc("@label","It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"); + text: catalog.i18nc("@label", "It's a good idea to do a few sanity checks on your Ultimaker. You can skip this step if you know your machine is functional"); } Item @@ -51,7 +51,6 @@ Cura.MachineAction text: catalog.i18nc("@action:button","Start Printer Check"); onClicked: { - checkupContent.visible = true manager.startCheck() } } @@ -73,7 +72,7 @@ Cura.MachineAction id: checkupContent anchors.top: startStopButtons.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height - visible: false + visible: manager.checkStarted width: parent.width height: 250 ////////////////////////////////////////////////////////// @@ -157,6 +156,7 @@ Cura.MachineAction { id: nozzleTempLabel width: checkupMachineAction.leftRow + height: nozzleTempButton.height anchors.left: parent.left anchors.top: endstopZLabel.bottom wrapMode: Text.WordWrap @@ -175,20 +175,16 @@ Cura.MachineAction { id: nozzleTempButton width: checkupMachineAction.rightRow * 0.3 - height: nozzleTemp.height + height: childrenRect.height anchors.top: nozzleTempLabel.top anchors.left: bedTempStatus.right anchors.leftMargin: UM.Theme.getSize("default_margin").width/2 Button { - height: nozzleTemp.height - 2 - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter text: catalog.i18nc("@action:button","Start Heating") onClicked: { manager.heatupHotend() - nozzleTempStatus.text = catalog.i18nc("@info:progress","Checking") } } } @@ -208,10 +204,11 @@ Cura.MachineAction { id: bedTempLabel width: checkupMachineAction.leftRow + height: bedTempButton.height anchors.left: parent.left anchors.top: nozzleTempLabel.bottom wrapMode: Text.WordWrap - text: catalog.i18nc("@label","bed temperature check:") + text: catalog.i18nc("@label","Bed temperature check:") } Label @@ -227,15 +224,12 @@ Cura.MachineAction { id: bedTempButton width: checkupMachineAction.rightRow * 0.3 - height: bedTemp.height + height: childrenRect.height anchors.top: bedTempLabel.top anchors.left: bedTempStatus.right anchors.leftMargin: UM.Theme.getSize("default_margin").width/2 Button { - height: bedTemp.height - 2 - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter text: catalog.i18nc("@action:button","Start Heating") onClicked: { diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8bdbacc4ae..50c3676540 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -455,7 +455,7 @@ }, "skin_line_width": { - "label": "Top/bottom Line Width", + "label": "Top/Bottom Line Width", "description": "Width of a single top/bottom line.", "unit": "mm", "minimum_value": "0.0001", diff --git a/resources/definitions/ultimaker2_extended.def.json b/resources/definitions/ultimaker2_extended.def.json index cead008643..fb443365f2 100644 --- a/resources/definitions/ultimaker2_extended.def.json +++ b/resources/definitions/ultimaker2_extended.def.json @@ -16,7 +16,7 @@ "overrides": { "machine_height": { - "default_value": 315 + "default_value": 305 } } } diff --git a/resources/definitions/ultimaker2_extended_plus.def.json b/resources/definitions/ultimaker2_extended_plus.def.json index 23b308461d..f4190be83d 100644 --- a/resources/definitions/ultimaker2_extended_plus.def.json +++ b/resources/definitions/ultimaker2_extended_plus.def.json @@ -15,7 +15,7 @@ "overrides": { "machine_height": { - "default_value": 313 + "default_value": 305 }, "machine_show_variants": { "default_value": true diff --git a/resources/materials/generic_abs.xml.fdm_material b/resources/materials/generic_abs.xml.fdm_material index 654b06d221..82b2f1f963 100644 --- a/resources/materials/generic_abs.xml.fdm_material +++ b/resources/materials/generic_abs.xml.fdm_material @@ -9,7 +9,7 @@ Generic PLA profile. Serves as an example file, data in this file is not correct ABS Generic - 506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9 + 60636bb4-518f-42e7-8237-fe77b194ebe0 0 #FF0000 diff --git a/resources/materials/generic_cpe.xml.fdm_material b/resources/materials/generic_cpe.xml.fdm_material index bbe6e328d2..8ac4dd8c71 100644 --- a/resources/materials/generic_cpe.xml.fdm_material +++ b/resources/materials/generic_cpe.xml.fdm_material @@ -9,7 +9,7 @@ Generic PLA profile. Serves as an example file, data in this file is not correct CPE Generic - 506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9 + 12f41353-1a33-415e-8b4f-a775a6c70cc6 0 #0000FF diff --git a/resources/qml/MonitorButton.qml b/resources/qml/MonitorButton.qml index bbb39b188e..af163a39e2 100644 --- a/resources/qml/MonitorButton.qml +++ b/resources/qml/MonitorButton.qml @@ -24,7 +24,7 @@ Rectangle return UM.Theme.getColor("status_offline") else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing" || Cura.MachineManager.printerOutputDevices[0].jobState == "pre_print") return UM.Theme.getColor("status_busy") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "ready") + else if(Cura.MachineManager.printerOutputDevices[0].jobState == "ready" || Cura.MachineManager.printerOutputDevices[0].jobState == "") return UM.Theme.getColor("status_ready") else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused") return UM.Theme.getColor("status_paused") diff --git a/resources/qml/Sidebar.qml b/resources/qml/Sidebar.qml index 78930c8d90..d9b3b56109 100644 --- a/resources/qml/Sidebar.qml +++ b/resources/qml/Sidebar.qml @@ -103,7 +103,7 @@ Rectangle return UM.Theme.getIcon("tab_monitor") else if(Cura.MachineManager.printerOutputDevices[0].jobState == "printing" || Cura.MachineManager.printerOutputDevices[0].jobState == "pre_print") return UM.Theme.getIcon("tab_monitor_busy") - else if(Cura.MachineManager.printerOutputDevices[0].jobState == "ready") + else if(Cura.MachineManager.printerOutputDevices[0].jobState == "ready" || Cura.MachineManager.printerOutputDevices[0].jobState == "") return UM.Theme.getIcon("tab_monitor_connected") else if(Cura.MachineManager.printerOutputDevices[0].jobState == "paused") return UM.Theme.getIcon("tab_monitor_paused") diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index ac6c491262..82dba70b92 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -13,7 +13,7 @@ Column id: base; property int totalHeightHeader: childrenRect.height - property int currentExtruderIndex: -1; + property int currentExtruderIndex:ExtruderManager.activeExtruderIndex; spacing: UM.Theme.getSize("default_margin").height @@ -118,7 +118,7 @@ Column { base.currentExtruderIndex = -1; forceActiveFocus() - ExtruderManager.setActiveExtruderIndex(0); + ExtruderManager.setActiveExtruderIndex(base.currentExtruderIndex); } }