def _createMaterialOutputModel( self, material_data: Dict[str, Any]) -> "MaterialOutputModel": material_manager = self._application.getMaterialManager() material_group_list = None # Avoid crashing if there is no "guid" field in the metadata material_guid = material_data.get("guid") if material_guid: material_group_list = material_manager.getMaterialGroupListByGUID( material_guid) # This can happen if the connected machine has no material in one or more extruders (if GUID is empty), or the # material is unknown to Cura, so we should return an "empty" or "unknown" material model. if material_group_list is None: material_name = i18n_catalog.i18nc("@label:material", "Empty") if len(material_data.get("guid", "")) == 0 \ else i18n_catalog.i18nc("@label:material", "Unknown") return MaterialOutputModel(guid=material_data.get("guid", ""), type=material_data.get("material", ""), color=material_data.get("color", ""), brand=material_data.get("brand", ""), name=material_data.get( "name", material_name)) # Sort the material groups by "is_read_only = True" first, and then the name alphabetically. read_only_material_group_list = list( filter(lambda x: x.is_read_only, material_group_list)) non_read_only_material_group_list = list( filter(lambda x: not x.is_read_only, material_group_list)) material_group = None if read_only_material_group_list: read_only_material_group_list = sorted( read_only_material_group_list, key=lambda x: x.name) material_group = read_only_material_group_list[0] elif non_read_only_material_group_list: non_read_only_material_group_list = sorted( non_read_only_material_group_list, key=lambda x: x.name) material_group = non_read_only_material_group_list[0] if material_group: container = material_group.root_material_node.getContainer() color = container.getMetaDataEntry("color_code") brand = container.getMetaDataEntry("brand") material_type = container.getMetaDataEntry("material") name = container.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 = i18n_catalog.i18nc("@label:material", "Empty") if material_data["material"] == "empty" \ else i18n_catalog.i18nc("@label:material", "Unknown") return MaterialOutputModel(guid=material_data["guid"], type=material_type, brand=brand, color=color, name=name)
def test_uniqueConfigurations(printer_output_device): printer = PrinterOutputModel(MagicMock()) # Add a printer and fire the signal that ensures they get hooked up correctly. printer_output_device._printers = [printer] printer_output_device._onPrintersChanged() assert printer_output_device.uniqueConfigurations == [] configuration = PrinterConfigurationModel() printer.addAvailableConfiguration(configuration) assert printer_output_device.uniqueConfigurations == [configuration] # Once the type of printer is set, it's active configuration counts as being set. # In that case, that should also be added to the list of available configurations printer.updateType("blarg!") loaded_material = MaterialOutputModel(guid="", type="PLA", color="Blue", brand="Generic", name="Blue PLA") loaded_left_extruder = ExtruderConfigurationModel(0) loaded_left_extruder.setMaterial(loaded_material) loaded_right_extruder = ExtruderConfigurationModel(1) loaded_right_extruder.setMaterial(loaded_material) printer.printerConfiguration.setExtruderConfigurations( [loaded_left_extruder, loaded_right_extruder]) assert printer_output_device.uniqueConfigurations == [ configuration, printer.printerConfiguration ]
def createOutputModel(self) -> MaterialOutputModel: """Creates a material output model based on this cloud printer material. A material is chosen that matches the current GUID. If multiple such materials are available, read-only materials are preferred and the material with the earliest alphabetical name will be selected. :return: A material output model that matches the current GUID. """ container_registry = ContainerRegistry.getInstance() same_guid = container_registry.findInstanceContainersMetadata(GUID = self.guid) if same_guid: read_only = sorted(filter(lambda metadata: container_registry.isReadOnly(metadata["id"]), same_guid), key = lambda metadata: metadata["name"]) if read_only: material_metadata = read_only[0] else: material_metadata = min(same_guid, key = lambda metadata: metadata["name"]) else: material_metadata = { "color_code": self.color, "brand": self.brand, "material": self.material, "name": "Empty" if self.material == "empty" else "Unknown" } return MaterialOutputModel(guid = self.guid, type = material_metadata["material"], brand = material_metadata["brand"], color = material_metadata["color_code"], name = material_metadata["name"])
def createOutputModel(self) -> MaterialOutputModel: container_registry = ContainerRegistry.getInstance() same_guid = container_registry.findInstanceContainersMetadata( GUID=self.guid) if same_guid: read_only = sorted(filter( lambda metadata: container_registry.isReadOnly(metadata["id"]), same_guid), key=lambda metadata: metadata["name"]) if read_only: material_metadata = read_only[0] else: material_metadata = min(same_guid, key=lambda metadata: metadata["name"]) else: material_metadata = { "color_code": self.color, "brand": self.brand, "material": self.material, "name": "Empty" if self.material == "empty" else "Unknown" } return MaterialOutputModel(guid=self.guid, type=material_metadata["material"], brand=material_metadata["brand"], color=material_metadata["color_code"], name=material_metadata["name"])
def test_uniqueConfigurations_empty_is_filtered_out(printer_output_device): printer = PrinterOutputModel(MagicMock()) # Add a printer and fire the signal that ensures they get hooked up correctly. printer_output_device._printers = [printer] printer_output_device._onPrintersChanged() printer.updateType("blarg!") empty_material = MaterialOutputModel(guid = "", type = "empty", color = "empty", brand = "Generic", name = "Empty") empty_left_extruder = ExtruderConfigurationModel(0) empty_left_extruder.setMaterial(empty_material) empty_right_extruder = ExtruderConfigurationModel(1) empty_right_extruder.setMaterial(empty_material) printer.printerConfiguration.setExtruderConfigurations([empty_left_extruder, empty_right_extruder]) assert printer_output_device.uniqueConfigurations == []
def createOutputModel(self) -> MaterialOutputModel: material_manager = CuraApplication.getInstance().getMaterialManager() material_group_list = material_manager.getMaterialGroupListByGUID( self.guid) or [] # Sort the material groups by "is_read_only = True" first, and then the name alphabetically. read_only_material_group_list = list( filter(lambda x: x.is_read_only, material_group_list)) non_read_only_material_group_list = list( filter(lambda x: not x.is_read_only, material_group_list)) material_group = None if read_only_material_group_list: read_only_material_group_list = sorted( read_only_material_group_list, key=lambda x: x.name) material_group = read_only_material_group_list[0] elif non_read_only_material_group_list: non_read_only_material_group_list = sorted( non_read_only_material_group_list, key=lambda x: x.name) material_group = non_read_only_material_group_list[0] if material_group: container = material_group.root_material_node.getContainer() color = container.getMetaDataEntry("color_code") brand = container.getMetaDataEntry("brand") material_type = container.getMetaDataEntry("material") name = container.getName() else: Logger.log( "w", "Unable to find material with guid {guid}. Using data as provided by cluster" .format(guid=self.guid)) color = self.color brand = self.brand material_type = self.material name = "Empty" if self.material == "empty" else "Unknown" return MaterialOutputModel(guid=self.guid, type=material_type, brand=brand, color=color, name=name)
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: # 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].setCameraUrl(QUrl("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. printer = self._printers[0] printer.updateBedTemperature(result["bed"]["temperature"]["current"]) 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"]) for index in range(0, self._number_of_extruders): temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"] extruder = printer.extruders[index] extruder.updateTargetHotendTemperature(temperatures["target"]) extruder.updateHotendTemperature(temperatures["current"]) 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") 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, name = name) extruder.updateActiveMaterial(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))