From e69747577b59c6c5400aa39459a8a2ad3a6f6ba0 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 16 Dec 2016 10:14:58 +0100 Subject: [PATCH 1/6] Added extra timeout when not detecting baudrate through bootloader --- plugins/USBPrinting/USBPrinterOutputDevice.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 61e0a479f3..e344caee1d 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -313,6 +313,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): 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 From 77cc088b643ff65a11ec63aaa41149380bfda3b2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 16 Dec 2016 10:22:16 +0100 Subject: [PATCH 2/6] Correct Prime Tower Wall Thickness for if prime_tower_size == 0 If the prime tower size was too small, it would try to take the root of a negative number. Now we just clamp that computation to 0, which is the correct behaviour for when the minimum volume doesn't fit in the prime tower. Contributes to issue CURA-3148. --- 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 7725940553..e81d3e7dd6 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3755,7 +3755,7 @@ "unit": "mm", "type": "float", "default_value": 2, - "value": "max(2 * min(extruderValues('prime_tower_line_width')), 0.5 * (resolveOrValue('prime_tower_size') - math.sqrt(resolveOrValue('prime_tower_size') ** 2 - max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height'))))", + "value": "max(2 * min(extruderValues('prime_tower_line_width')), 0.5 * (resolveOrValue('prime_tower_size') - math.sqrt(resolveOrValue('prime_tower_size') ** 2 - max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height')) if (resolveOrValue('prime_tower_size') ** 2 > max(extruderValues('prime_tower_min_volume')) / resolveOrValue('layer_height')) else 0))", "resolve": "max(extruderValues('prime_tower_wall_thickness'))", "minimum_value": "0.001", "minimum_value_warning": "2 * min(extruderValues('prime_tower_line_width'))", From 2be773c9a38cb35d50362ba39202e802737d0103 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 16 Dec 2016 10:26:30 +0100 Subject: [PATCH 3/6] Added num user settings to workspace loading CURA-1263 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 5 +++++ plugins/3MFReader/WorkspaceDialog.py | 10 ++++++++++ plugins/3MFReader/WorkspaceDialog.qml | 18 +++++++++++++++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 1454dc9a47..4a5300f9f0 100644 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -54,6 +54,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): else: Logger.log("w", "Could not find reader that was able to read the scene data for 3MF workspace") return WorkspaceReader.PreReadResult.failed + machine_name = "" # Check if there are any conflicts, so we can ask the user. archive = zipfile.ZipFile(file_name, "r") @@ -95,6 +96,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): quality_name = "" quality_type = "" num_settings_overriden_by_quality_changes = 0 # How many settings are changed by the quality changes + num_user_settings = 0 for instance_container_file in instance_container_files: container_id = self._stripFileToId(instance_container_file) instance_container = InstanceContainer(container_id) @@ -117,6 +119,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if quality_name == "": quality_name = instance_container.getName() quality_type = instance_container.getName() + elif container_type == "user": + num_user_settings += len(instance_container._instances) Job.yieldThread() num_visible_settings = 0 try: @@ -142,6 +146,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setQualityName(quality_name) self._dialog.setQualityType(quality_type) self._dialog.setNumSettingsOverridenByQualityChanges(num_settings_overriden_by_quality_changes) + self._dialog.setNumUserSettings(num_user_settings) self._dialog.setActiveMode(active_mode) self._dialog.setMachineName(machine_name) self._dialog.setMaterialLabels(material_labels) diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index e3425078e7..f8bec06dd4 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -36,6 +36,7 @@ class WorkspaceDialog(QObject): self._has_machine_conflict = False self._has_material_conflict = False self._num_visible_settings = 0 + self._num_user_settings = 0 self._active_mode = "" self._quality_name = "" self._num_settings_overriden_by_quality_changes = 0 @@ -55,6 +56,15 @@ class WorkspaceDialog(QObject): machineNameChanged = pyqtSignal() materialLabelsChanged = pyqtSignal() objectsOnPlateChanged = pyqtSignal() + numUserSettingsChanged = pyqtSignal() + + def setNumUserSettings(self, num_user_settings): + self._num_user_settings = num_user_settings + self.numVisibleSettingsChanged.emit() + + @pyqtProperty(int, notify=numUserSettingsChanged) + def numUserSettings(self): + return self._num_user_settings @pyqtProperty(bool, notify=objectsOnPlateChanged) def hasObjectsOnPlate(self): diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index fa69bc08c7..f9e5a02f8e 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -168,7 +168,23 @@ UM.Dialog Row { width: parent.width - height: childrenRect.height + height: manager.numUserSettings != 0 ? childrenRect.height : 0 + Label + { + text: catalog.i18nc("@action:label", "Not in profile") + width: parent.width / 3 + } + Label + { + text: catalog.i18nc("@action:label", "%1 override(s)").arg(manager.numUserSettings) + width: parent.width / 3 + } + visible: manager.numUserSettings != 0 + } + Row + { + width: parent.width + height: manager.numSettingsOverridenByQualityChanges != 0 ? childrenRect.height : 0 Label { text: catalog.i18nc("@action:label", "Derivative from") From a7135a0f5fea764b442734a87e2dba07f333d376 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 16 Dec 2016 10:38:30 +0100 Subject: [PATCH 4/6] Added machine type to load menu CURA-1263 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 18 ++++++++++++++++++ plugins/3MFReader/WorkspaceDialog.py | 10 ++++++++++ plugins/3MFReader/WorkspaceDialog.qml | 15 +++++++++++++++ 3 files changed, 43 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 4a5300f9f0..b4de6c0736 100644 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -55,7 +55,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader): Logger.log("w", "Could not find reader that was able to read the scene data for 3MF workspace") return WorkspaceReader.PreReadResult.failed + machine_name = "" + machine_type = "" # Check if there are any conflicts, so we can ask the user. archive = zipfile.ZipFile(file_name, "r") cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")] @@ -77,6 +79,21 @@ class ThreeMFWorkspaceReader(WorkspaceReader): machine_conflict = True Job.yieldThread() + definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)] + for definition_container_file in definition_container_files: + container_id = self._stripFileToId(definition_container_file) + definitions = self._container_registry.findDefinitionContainers(id=container_id) + + if not definitions: + definition_container = DefinitionContainer(container_id) + definition_container.deserialize(archive.open(definition_container_file).read().decode("utf-8")) + if definition_container.getMetaDataEntry("type") != "extruder": + machine_type = definition_container.getName() + else: + if definitions[0].getMetaDataEntry("type") != "extruder": + machine_type = definitions[0].getName() + Job.yieldThread() + material_labels = [] material_conflict = False xml_material_profile = self._getXmlProfileClass() @@ -150,6 +167,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._dialog.setActiveMode(active_mode) self._dialog.setMachineName(machine_name) self._dialog.setMaterialLabels(material_labels) + self._dialog.setMachineType(machine_type) self._dialog.setHasObjectsOnPlate(Application.getInstance().getPlatformActivity) self._dialog.show() diff --git a/plugins/3MFReader/WorkspaceDialog.py b/plugins/3MFReader/WorkspaceDialog.py index f8bec06dd4..ec2509252b 100644 --- a/plugins/3MFReader/WorkspaceDialog.py +++ b/plugins/3MFReader/WorkspaceDialog.py @@ -42,6 +42,7 @@ class WorkspaceDialog(QObject): self._num_settings_overriden_by_quality_changes = 0 self._quality_type = "" self._machine_name = "" + self._machine_type = "" self._material_labels = [] self._objects_on_plate = False @@ -57,6 +58,15 @@ class WorkspaceDialog(QObject): materialLabelsChanged = pyqtSignal() objectsOnPlateChanged = pyqtSignal() numUserSettingsChanged = pyqtSignal() + machineTypeChanged = pyqtSignal() + + @pyqtProperty(str, notify=machineTypeChanged) + def machineType(self): + return self._machine_type + + def setMachineType(self, machine_type): + self._machine_type = machine_type + self.machineTypeChanged.emit() def setNumUserSettings(self, num_user_settings): self._num_user_settings = num_user_settings diff --git a/plugins/3MFReader/WorkspaceDialog.qml b/plugins/3MFReader/WorkspaceDialog.qml index f9e5a02f8e..3d30d17d25 100644 --- a/plugins/3MFReader/WorkspaceDialog.qml +++ b/plugins/3MFReader/WorkspaceDialog.qml @@ -82,6 +82,21 @@ UM.Dialog text: catalog.i18nc("@action:label", "Printer settings") font.bold: true } + Row + { + width: parent.width + height: childrenRect.height + Label + { + text: catalog.i18nc("@action:label", "Type") + width: parent.width / 3 + } + Label + { + text: manager.machineType + width: parent.width / 3 + } + } Row { From 4fdaf734fced17e365f50ac5d56653e577a3bb2e Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 16 Dec 2016 10:58:13 +0100 Subject: [PATCH 5/6] Make translation hint a bit more clear for translators The old message didn't really say anything useful. Contributes to issue CURA-3138. --- resources/qml/Menus/MaterialMenu.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml index 573dff89dd..ab38de97aa 100644 --- a/resources/qml/Menus/MaterialMenu.qml +++ b/resources/qml/Menus/MaterialMenu.qml @@ -23,7 +23,7 @@ Menu if(printerConnected && Cura.MachineManager.printerOutputDevices[0].materialNames.length > extruderIndex) { var materialName = Cura.MachineManager.printerOutputDevices[0].materialNames[extruderIndex]; - return catalog.i18nc("@title:menuitem %1 is the value from the printer", "Automatic: %1").arg(materialName); + return catalog.i18nc("@title:menuitem %1 is the automatically selected material", "Automatic: %1").arg(materialName); } return ""; } From 0ca157518e5f14838114e93d67cfb2a13b03f5d5 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 16 Dec 2016 11:12:33 +0100 Subject: [PATCH 6/6] Update current item when importing new material Since we select the newly imported material, we need to update the current item so that the window on the right also gets updated. Contributes to issue CURA-3138. --- resources/qml/Preferences/MaterialsPage.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Preferences/MaterialsPage.qml b/resources/qml/Preferences/MaterialsPage.qml index 70e3780707..264bc182e6 100644 --- a/resources/qml/Preferences/MaterialsPage.qml +++ b/resources/qml/Preferences/MaterialsPage.qml @@ -278,6 +278,7 @@ UM.ManagementPage { messageDialog.icon = StandardIcon.Information messageDialog.text = catalog.i18nc("@info:status", "Successfully imported material %1").arg(fileUrl) + currentItem = base.model.getItem(base.objectList.currentIndex) } else if(result.status == "duplicate") {