From 23d6f7ba0b7f101a9d27df1cb57956ad6b90a88e Mon Sep 17 00:00:00 2001 From: Orel Date: Tue, 5 Jun 2018 17:36:44 +0200 Subject: [PATCH 01/95] Enhance Dagoma printers profiles and add printer-specific quality profiles. --- .../definitions/dagoma_discoeasy200.def.json | 25 ++++-- resources/definitions/dagoma_neva.def.json | 26 ++++-- .../definitions/dagoma_neva_magis.def.json | 81 +++++++++++++++++++ .../dagoma_discoeasy200_pla_fast.inst.cfg | 17 ++++ .../dagoma_discoeasy200_pla_fine.inst.cfg | 14 ++++ .../dagoma_discoeasy200_pla_standard.inst.cfg | 17 ++++ .../dagoma_neva_magis_pla_fast.inst.cfg | 17 ++++ .../dagoma_neva_magis_pla_fine.inst.cfg | 14 ++++ .../dagoma_neva_magis_pla_standard.inst.cfg | 17 ++++ .../dagoma/dagoma_neva_pla_fast.inst.cfg | 17 ++++ .../dagoma/dagoma_neva_pla_fine.inst.cfg | 14 ++++ .../dagoma/dagoma_neva_pla_standard.inst.cfg | 17 ++++ 12 files changed, 263 insertions(+), 13 deletions(-) create mode 100644 resources/definitions/dagoma_neva_magis.def.json create mode 100644 resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 4f0fddc41d..9df8829ec5 100644 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -1,4 +1,5 @@ { + "id": "dagoma_discoeasy200", "name": "Dagoma DiscoEasy200", "version": 2, "inherits": "fdmprinter", @@ -28,17 +29,17 @@ }, "machine_head_with_fans_polygon": { "default_value": [ - [17, 70], - [17, -40], - [-17, -40], - [17, 70] + [-17, -70], + [-17, 40], + [17, 40], + [17, -70] ] }, "gantry_height": { "default_value": 10 }, "machine_start_gcode": { - "default_value": ";Gcode by Cura\nG90\nM106 S250\nG28 X Y\nG1 X50\nM109 S180\nG28\nM104 S{material_print_temperature_layer_0}\nG29\nM107\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_print_temperature_layer_0}\nM82\nG92 E0\nG1 F200 E10\nG92 E0\nG1 Z3\nG1 F6000\n" + "default_value": ";Gcode by Cura\nG90\nM106 S255\nG28 X Y\nG1 X50\nM109 R90\nG28\nM104 S{material_print_temperature_layer_0}\nG29\nM107\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_print_temperature_layer_0}\nM82\nG92 E0\nG1 F200 E10\nG92 E0\nG1 Z3\nG1 F6000\n" }, "machine_end_gcode": { "default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 F3000\nG90\nG28 X Y\nM107\nM84\n" @@ -46,17 +47,29 @@ "material_diameter": { "default_value": 1.75 }, + "default_material_print_temperature": { + "default_value": 205 + }, "speed_print": { "default_value": 60 }, "speed_travel": { - "value": "100" + "default_value": 100 }, "retraction_amount": { "default_value": 3.5 }, "retraction_speed": { "default_value": 50 + }, + "adhesion_type": { + "default_value": "skirt" + }, + "skirt_line_count": { + "default_value": 2 + }, + "layer_height_0": { + "default_value": 0.26 } } } diff --git a/resources/definitions/dagoma_neva.def.json b/resources/definitions/dagoma_neva.def.json index 21a557ac22..d133ec820c 100644 --- a/resources/definitions/dagoma_neva.def.json +++ b/resources/definitions/dagoma_neva.def.json @@ -1,5 +1,5 @@ { - "id": "Dagoma_neva", + "id": "dagoma_neva", "name": "Dagoma NEVA", "version": 2, "inherits": "fdmprinter", @@ -29,10 +29,10 @@ }, "machine_head_with_fans_polygon": { "default_value": [ - [17, 40], - [17, -70], - [-17, -70], - [17, 40] + [-36, -42], + [-36, 42], + [36, 42], + [36, -42] ] }, "gantry_height": { @@ -42,10 +42,10 @@ "default_value": "elliptic" }, "machine_gcode_flavor": { - "default_value": "RepRap (RepRap)" + "default_value": "RepRap" }, "machine_start_gcode": { - "default_value": ";Gcode by Cura\nG90\nG28\nM109 S100\nG29\nM104 S{material_print_temperature_layer_0}\nG0 X0 Y-85\nG0 Z0.26\nM109 S{material_print_temperature_layer_0}\nM82\nG92 E0\nG1 F200 E6\nG92 E0\nG1 F200 E-3.5\nG0 Z0.15\nG0 X10\nG0 Z3\nG1 F6000\n" + "default_value": ";Gcode by Cura\nG90\nG28\nM107\nM109 R100\nG29\nM109 S{material_print_temperature_layer_0} U-55 X55 V-85 Y-85 W0.26 Z0.26\nM82\nG92 E0\nG1 F200 E6\nG92 E0\nG1 F200 E-3.5\nG0 Z0.15\nG0 X10\nG0 Z3\nG1 F6000\n" }, "machine_end_gcode": { "default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 E-2 F9000\nG90\nG28\n" @@ -53,6 +53,9 @@ "material_diameter": { "default_value": 1.75 }, + "default_material_print_temperature": { + "default_value": 205 + }, "speed_print": { "default_value": 40 }, @@ -64,6 +67,15 @@ }, "retraction_speed": { "default_value": 60 + }, + "adhesion_type": { + "default_value": "skirt" + }, + "skirt_line_count": { + "default_value": 2 + }, + "layer_height_0": { + "default_value": 0.26 } } } diff --git a/resources/definitions/dagoma_neva_magis.def.json b/resources/definitions/dagoma_neva_magis.def.json new file mode 100644 index 0000000000..9f599cf85d --- /dev/null +++ b/resources/definitions/dagoma_neva_magis.def.json @@ -0,0 +1,81 @@ +{ + "id": "dagoma_neva_magis", + "name": "Dagoma NEVA", + "version": 2, + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Dagoma", + "manufacturer": "Dagoma", + "file_formats": "text/x-gcode", + "platform": "neva.stl", + "platform_offset": [ 0, 0, 0] + }, + "overrides": { + "machine_width": { + "default_value": 195.55 + }, + "machine_height": { + "default_value": 205 + }, + "machine_depth": { + "default_value": 195.55 + }, + "machine_center_is_zero": { + "default_value": true + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "machine_head_with_fans_polygon": { + "default_value": [ + [-36, -42], + [-36, 42], + [36, 42], + [36, -42] + ] + }, + "gantry_height": { + "default_value": 0 + }, + "machine_shape": { + "default_value": "elliptic" + }, + "machine_gcode_flavor": { + "default_value": "RepRap" + }, + "machine_start_gcode": { + "default_value": ";Gcode by Cura\nG90\nG28\nM107\nM109 R100\nG29\nM109 S{material_print_temperature_layer_0} U-55 X55 V-85 Y-85 W0.26 Z0.26\nM82\nG92 E0\nG1 F200 E6\nG92 E0\nG1 F200 E-3.5\nG0 Z0.15\nG0 X10\nG0 Z3\nG1 F6000\n" + }, + "machine_end_gcode": { + "default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 E-2 F9000\nG90\nG28\n" + }, + "material_diameter": { + "default_value": 1.75 + }, + "default_material_print_temperature": { + "default_value": 205 + }, + "speed_print": { + "default_value": 40 + }, + "speed_travel": { + "default_value": 120 + }, + "retraction_amount": { + "default_value": 3.8 + }, + "retraction_speed": { + "default_value": 60 + }, + "adhesion_type": { + "default_value": "skirt" + }, + "skirt_line_count": { + "default_value": 2 + }, + "layer_height_0": { + "default_value": 0.26 + } + } +} diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg new file mode 100644 index 0000000000..6cd88f819c --- /dev/null +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg @@ -0,0 +1,17 @@ +[general] +version = 3 +name = Fast +definition = dagoma_discoeasy200 + +[metadata] +setting_version = 4 +type = quality +quality_type = draft +weight = -2 +material = generic_pla + +[values] +layer_height = 0.2 + +material_print_temperature = =default_material_print_temperature + 10 +material_bed_temperature_layer_0 = =default_material_print_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg new file mode 100644 index 0000000000..0f59401dd5 --- /dev/null +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 3 +name = Fine +definition = dagoma_discoeasy200 + +[metadata] +setting_version = 4 +type = quality +quality_type = high +weight = 0 +material = generic_pla + +[values] +layer_height = 0.1 diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg new file mode 100644 index 0000000000..9c1cc19f9e --- /dev/null +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg @@ -0,0 +1,17 @@ +[general] +version = 3 +name = Standard +definition = dagoma_discoeasy200 + +[metadata] +setting_version = 4 +type = quality +quality_type = normal +weight = -1 +material = generic_pla + +[values] +layer_height = 0.15 + +material_print_temperature = =default_material_print_temperature + 5 +material_bed_temperature_layer_0 = =default_material_print_temperature + 5 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg new file mode 100644 index 0000000000..f0f5810e82 --- /dev/null +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg @@ -0,0 +1,17 @@ +[general] +version = 3 +name = Fast +definition = dagoma_neva + +[metadata] +setting_version = 4 +type = quality +quality_type = draft +weight = -2 +material = generic_pla + +[values] +layer_height = 0.2 + +material_print_temperature = =default_material_print_temperature + 10 +material_bed_temperature_layer_0 = =default_material_print_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg new file mode 100644 index 0000000000..3dc4ce5627 --- /dev/null +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 3 +name = Fine +definition = dagoma_neva + +[metadata] +setting_version = 4 +type = quality +quality_type = high +weight = 0 +material = generic_pla + +[values] +layer_height = 0.1 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg new file mode 100644 index 0000000000..ce2157c90b --- /dev/null +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg @@ -0,0 +1,17 @@ +[general] +version = 3 +name = Standard +definition = dagoma_neva + +[metadata] +setting_version = 4 +type = quality +quality_type = normal +weight = -1 +material = generic_pla + +[values] +layer_height = 0.15 + +material_print_temperature = =default_material_print_temperature + 5 +material_bed_temperature_layer_0 = =default_material_print_temperature + 5 diff --git a/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg new file mode 100644 index 0000000000..f0f5810e82 --- /dev/null +++ b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg @@ -0,0 +1,17 @@ +[general] +version = 3 +name = Fast +definition = dagoma_neva + +[metadata] +setting_version = 4 +type = quality +quality_type = draft +weight = -2 +material = generic_pla + +[values] +layer_height = 0.2 + +material_print_temperature = =default_material_print_temperature + 10 +material_bed_temperature_layer_0 = =default_material_print_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg new file mode 100644 index 0000000000..3dc4ce5627 --- /dev/null +++ b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 3 +name = Fine +definition = dagoma_neva + +[metadata] +setting_version = 4 +type = quality +quality_type = high +weight = 0 +material = generic_pla + +[values] +layer_height = 0.1 diff --git a/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg new file mode 100644 index 0000000000..ce2157c90b --- /dev/null +++ b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg @@ -0,0 +1,17 @@ +[general] +version = 3 +name = Standard +definition = dagoma_neva + +[metadata] +setting_version = 4 +type = quality +quality_type = normal +weight = -1 +material = generic_pla + +[values] +layer_height = 0.15 + +material_print_temperature = =default_material_print_temperature + 5 +material_bed_temperature_layer_0 = =default_material_print_temperature + 5 From 7e9054616358f237d8c0615ff739dd7e43e48b31 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 29 Jun 2018 10:34:15 +0200 Subject: [PATCH 02/95] Fix firmware upload on Windows... by correctly creating a local path from a url-encoded path Fixes #3731 and #3987 --- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 00eb2f0b25..926cd9001d 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -15,7 +15,7 @@ from cura.PrinterOutput.GenericOutputController import GenericOutputController from .AutoDetectBaudJob import AutoDetectBaudJob from .avr_isp import stk500v2, intelHex -from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty +from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, QUrl from serial import Serial, SerialException, SerialTimeoutException from threading import Thread, Event @@ -128,7 +128,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): @pyqtSlot(str) def updateFirmware(self, file): # the file path is qurl encoded. - self._firmware_location = file.replace("file://", "") + self._firmware_location = QUrl(file).toLocalFile() self.showFirmwareInterface() self.setFirmwareUpdateState(FirmwareUpdateState.updating) self._update_firmware_thread.start() From 46ce90c803cea95a68c76d151f76d5934d2aec35 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 16 Jul 2018 16:54:50 +0200 Subject: [PATCH 03/95] Fix-up Dagoma definitions - Removed nozzle size in magis def because it's in the extruder def on other machines - Removed material diam from disco extruder def because its in the disco machine - Remove material diam from neva extruder def because its in the neva machine Contributes to CURA-5499 --- .../definitions/dagoma_neva_magis.def.json | 3 --- .../dagoma_discoeasy200_extruder_0.def.json | 9 ++++++--- .../extruders/dagoma_neva_extruder_0.def.json | 9 ++++++--- .../dagoma_neva_magis_extruder_0.def.json | 19 +++++++++++++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 resources/extruders/dagoma_neva_magis_extruder_0.def.json diff --git a/resources/definitions/dagoma_neva_magis.def.json b/resources/definitions/dagoma_neva_magis.def.json index fe5cff471e..91f99146ba 100644 --- a/resources/definitions/dagoma_neva_magis.def.json +++ b/resources/definitions/dagoma_neva_magis.def.json @@ -24,9 +24,6 @@ "machine_center_is_zero": { "default_value": true }, - "machine_nozzle_size": { - "default_value": 0.4 - }, "machine_head_with_fans_polygon": { "default_value": [ [-36, -42], diff --git a/resources/extruders/dagoma_discoeasy200_extruder_0.def.json b/resources/extruders/dagoma_discoeasy200_extruder_0.def.json index eb2b8ef1f7..342741c559 100644 --- a/resources/extruders/dagoma_discoeasy200_extruder_0.def.json +++ b/resources/extruders/dagoma_discoeasy200_extruder_0.def.json @@ -9,8 +9,11 @@ }, "overrides": { - "extruder_nr": { "default_value": 0 }, - "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 1.75 } + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { + "default_value": 0.4 + } } } diff --git a/resources/extruders/dagoma_neva_extruder_0.def.json b/resources/extruders/dagoma_neva_extruder_0.def.json index dcb8311be4..eeb8a42a3a 100644 --- a/resources/extruders/dagoma_neva_extruder_0.def.json +++ b/resources/extruders/dagoma_neva_extruder_0.def.json @@ -9,8 +9,11 @@ }, "overrides": { - "extruder_nr": { "default_value": 0 }, - "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 1.75 } + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { + "default_value": 0.4 + } } } diff --git a/resources/extruders/dagoma_neva_magis_extruder_0.def.json b/resources/extruders/dagoma_neva_magis_extruder_0.def.json new file mode 100644 index 0000000000..4a20b64fe8 --- /dev/null +++ b/resources/extruders/dagoma_neva_magis_extruder_0.def.json @@ -0,0 +1,19 @@ +{ + "id": "dagoma_neva_magis_extruder_0", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "dagoma_neva_magis", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { + "default_value": 0.4 + } + } +} From 65ada30c9c45687f6fe860af7ecc74889978a3a1 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 16 Jul 2018 13:26:51 +0200 Subject: [PATCH 04/95] Fix flashing "default" firmware The url is not QUrl encoded if the "default" firmware is flashed --- plugins/USBPrinting/USBPrinterOutputDevice.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 926cd9001d..6a97a3c163 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -127,8 +127,11 @@ class USBPrinterOutputDevice(PrinterOutputDevice): @pyqtSlot(str) def updateFirmware(self, file): - # the file path is qurl encoded. - self._firmware_location = QUrl(file).toLocalFile() + # the file path could be qurl encoded. + if file[:7] == "file://": + self._firmware_location = QUrl(file).toLocalFile() + else: + self._firmware_location = file self.showFirmwareInterface() self.setFirmwareUpdateState(FirmwareUpdateState.updating) self._update_firmware_thread.start() From ed1e47dcc99e79d05f80fdd7d7e8d899b2347ea9 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 17 Jul 2018 10:56:33 +0200 Subject: [PATCH 05/95] Moved material diameters to extruders defs Contributes to CURA-5499 --- resources/definitions/dagoma_discoeasy200.def.json | 3 --- resources/definitions/dagoma_neva.def.json | 4 ---- resources/definitions/dagoma_neva_magis.def.json | 4 ---- resources/extruders/dagoma_discoeasy200_extruder_0.def.json | 4 +++- resources/extruders/dagoma_neva_extruder_0.def.json | 4 +++- resources/extruders/dagoma_neva_magis_extruder_0.def.json | 4 +++- 6 files changed, 9 insertions(+), 14 deletions(-) diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 60f371ec88..5e45947393 100644 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -44,9 +44,6 @@ "machine_end_gcode": { "default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 F3000\nG90\nG28 X Y\nM107\nM84\n" }, - "material_diameter": { - "default_value": 1.75 - }, "default_material_print_temperature": { "default_value": 205 }, diff --git a/resources/definitions/dagoma_neva.def.json b/resources/definitions/dagoma_neva.def.json index b7a15995c3..be429e32af 100644 --- a/resources/definitions/dagoma_neva.def.json +++ b/resources/definitions/dagoma_neva.def.json @@ -1,5 +1,4 @@ { - "id": "dagoma_neva", "name": "Dagoma NEVA", "version": 2, "inherits": "fdmprinter", @@ -51,9 +50,6 @@ "machine_end_gcode": { "default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 E-2 F9000\nG90\nG28\n" }, - "material_diameter": { - "default_value": 1.75 - }, "default_material_print_temperature": { "default_value": 205 }, diff --git a/resources/definitions/dagoma_neva_magis.def.json b/resources/definitions/dagoma_neva_magis.def.json index 91f99146ba..6a856044b2 100644 --- a/resources/definitions/dagoma_neva_magis.def.json +++ b/resources/definitions/dagoma_neva_magis.def.json @@ -1,5 +1,4 @@ { - "id": "dagoma_neva_magis", "name": "Dagoma NEVA Magis", "version": 2, "inherits": "fdmprinter", @@ -47,9 +46,6 @@ "machine_end_gcode": { "default_value": "\nM104 S0\nM106 S255\nM140 S0\nG91\nG1 E-1 F300\nG1 Z+3 E-2 F9000\nG90\nG28\n" }, - "material_diameter": { - "default_value": 1.75 - }, "default_material_print_temperature": { "default_value": 205 }, diff --git a/resources/extruders/dagoma_discoeasy200_extruder_0.def.json b/resources/extruders/dagoma_discoeasy200_extruder_0.def.json index 342741c559..c885ac971e 100644 --- a/resources/extruders/dagoma_discoeasy200_extruder_0.def.json +++ b/resources/extruders/dagoma_discoeasy200_extruder_0.def.json @@ -1,5 +1,4 @@ { - "id": "dagoma_discoeasy200_extruder_0", "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", @@ -14,6 +13,9 @@ }, "machine_nozzle_size": { "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 } } } diff --git a/resources/extruders/dagoma_neva_extruder_0.def.json b/resources/extruders/dagoma_neva_extruder_0.def.json index eeb8a42a3a..95035f63f2 100644 --- a/resources/extruders/dagoma_neva_extruder_0.def.json +++ b/resources/extruders/dagoma_neva_extruder_0.def.json @@ -1,5 +1,4 @@ { - "id": "dagoma_neva_extruder_0", "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", @@ -14,6 +13,9 @@ }, "machine_nozzle_size": { "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 } } } diff --git a/resources/extruders/dagoma_neva_magis_extruder_0.def.json b/resources/extruders/dagoma_neva_magis_extruder_0.def.json index 4a20b64fe8..0d5fd3c9b4 100644 --- a/resources/extruders/dagoma_neva_magis_extruder_0.def.json +++ b/resources/extruders/dagoma_neva_magis_extruder_0.def.json @@ -1,5 +1,4 @@ { - "id": "dagoma_neva_magis_extruder_0", "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", @@ -14,6 +13,9 @@ }, "machine_nozzle_size": { "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 } } } From 139ac5c5460da2e118b9258f472edc09160304b5 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 17 Jul 2018 13:18:22 +0200 Subject: [PATCH 06/95] Quality profile fixes Contributes to CURA-5499 --- .../quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg | 2 +- .../quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg | 4 ++-- .../quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg | 4 ++-- resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg | 2 +- resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg | 4 ++-- .../quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg | 4 ++-- resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg | 2 +- resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg | 4 ++-- resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg | 4 ++-- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg index 6cd88f819c..b1b742935d 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = dagoma_discoeasy200 [metadata] -setting_version = 4 +setting_version = 5 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg index 0f59401dd5..e6ac921430 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg @@ -4,9 +4,9 @@ name = Fine definition = dagoma_discoeasy200 [metadata] -setting_version = 4 +setting_version = 5 type = quality -quality_type = high +quality_type = normal weight = 0 material = generic_pla diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg index 9c1cc19f9e..7261c2c416 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg @@ -4,9 +4,9 @@ name = Standard definition = dagoma_discoeasy200 [metadata] -setting_version = 4 +setting_version = 5 type = quality -quality_type = normal +quality_type = fast weight = -1 material = generic_pla diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg index f0f5810e82..8f75d6733d 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = dagoma_neva [metadata] -setting_version = 4 +setting_version = 5 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg index 3dc4ce5627..018e7f1e63 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg @@ -4,9 +4,9 @@ name = Fine definition = dagoma_neva [metadata] -setting_version = 4 +setting_version = 5 type = quality -quality_type = high +quality_type = normal weight = 0 material = generic_pla diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg index ce2157c90b..9456eb25f8 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg @@ -4,9 +4,9 @@ name = Standard definition = dagoma_neva [metadata] -setting_version = 4 +setting_version = 5 type = quality -quality_type = normal +quality_type = fast weight = -1 material = generic_pla diff --git a/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg index f0f5810e82..8f75d6733d 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg @@ -4,7 +4,7 @@ name = Fast definition = dagoma_neva [metadata] -setting_version = 4 +setting_version = 5 type = quality quality_type = draft weight = -2 diff --git a/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg index 3dc4ce5627..018e7f1e63 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg @@ -4,9 +4,9 @@ name = Fine definition = dagoma_neva [metadata] -setting_version = 4 +setting_version = 5 type = quality -quality_type = high +quality_type = normal weight = 0 material = generic_pla diff --git a/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg index ce2157c90b..9456eb25f8 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg @@ -4,9 +4,9 @@ name = Standard definition = dagoma_neva [metadata] -setting_version = 4 +setting_version = 5 type = quality -quality_type = normal +quality_type = fast weight = -1 material = generic_pla From f1efaa78b7719efaf425316e3896d013a2ce6b28 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 17 Jul 2018 13:22:15 +0200 Subject: [PATCH 07/95] General version to v4, fixed bed temp Contributes to CURA-5499 --- .../quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg | 2 +- .../quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg | 2 +- .../quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg | 4 ++-- resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg | 4 ++-- resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg | 2 +- .../quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg | 4 ++-- resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg | 4 ++-- resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg | 2 +- resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg | 4 ++-- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg index b1b742935d..5ba805a4fa 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Fast definition = dagoma_discoeasy200 diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg index e6ac921430..695fd7bc7e 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Fine definition = dagoma_discoeasy200 diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg index 7261c2c416..b6b086403d 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Standard definition = dagoma_discoeasy200 @@ -14,4 +14,4 @@ material = generic_pla layer_height = 0.15 material_print_temperature = =default_material_print_temperature + 5 -material_bed_temperature_layer_0 = =default_material_print_temperature + 5 +material_bed_temperature_layer_0 = =default_material_bed_temperature + 5 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg index 8f75d6733d..51fb17a5cc 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Fast definition = dagoma_neva @@ -14,4 +14,4 @@ material = generic_pla layer_height = 0.2 material_print_temperature = =default_material_print_temperature + 10 -material_bed_temperature_layer_0 = =default_material_print_temperature + 10 +material_bed_temperature_layer_0 = =default_material_bed_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg index 018e7f1e63..1ff947d766 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Fine definition = dagoma_neva diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg index 9456eb25f8..dfcc1c967b 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Standard definition = dagoma_neva @@ -14,4 +14,4 @@ material = generic_pla layer_height = 0.15 material_print_temperature = =default_material_print_temperature + 5 -material_bed_temperature_layer_0 = =default_material_print_temperature + 5 +material_bed_temperature_layer_0 = =default_material_bed_temperature + 5 diff --git a/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg index 8f75d6733d..51fb17a5cc 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Fast definition = dagoma_neva @@ -14,4 +14,4 @@ material = generic_pla layer_height = 0.2 material_print_temperature = =default_material_print_temperature + 10 -material_bed_temperature_layer_0 = =default_material_print_temperature + 10 +material_bed_temperature_layer_0 = =default_material_bed_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg index 018e7f1e63..1ff947d766 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Fine definition = dagoma_neva diff --git a/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg index 9456eb25f8..dfcc1c967b 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg @@ -1,5 +1,5 @@ [general] -version = 3 +version = 4 name = Standard definition = dagoma_neva @@ -14,4 +14,4 @@ material = generic_pla layer_height = 0.15 material_print_temperature = =default_material_print_temperature + 5 -material_bed_temperature_layer_0 = =default_material_print_temperature + 5 +material_bed_temperature_layer_0 = =default_material_bed_temperature + 5 From 350f9caa2a69259b82527f68bf3d539f8234a554 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 17 Jul 2018 14:15:16 +0200 Subject: [PATCH 08/95] Use material bed temperature as reference for the bed temperature of the first layer. Contributes to CURA-5499. --- resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg index 5ba805a4fa..a75d01c9f0 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg @@ -14,4 +14,4 @@ material = generic_pla layer_height = 0.2 material_print_temperature = =default_material_print_temperature + 10 -material_bed_temperature_layer_0 = =default_material_print_temperature + 10 +material_bed_temperature_layer_0 = =default_material_bed_temperature + 10 From eab10401eeaefdaecf0e5cf3499be2f476410c34 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 17 Jul 2018 18:02:11 +0200 Subject: [PATCH 09/95] Add global profiles and define that the printers have materials and quality profiles, in the definition files. Contributes to CURA-5499 --- cura/Settings/MachineManager.py | 2 ++ resources/definitions/dagoma_discoeasy200.def.json | 2 ++ resources/definitions/dagoma_neva.def.json | 2 ++ resources/definitions/dagoma_neva_magis.def.json | 8 +++++++- .../dagoma/dagoma_discoeasy200_pla_fast.inst.cfg | 2 -- .../dagoma/dagoma_discoeasy200_pla_fine.inst.cfg | 1 - .../dagoma_discoeasy200_pla_standard.inst.cfg | 2 -- .../quality/dagoma/dagoma_global_fast.inst.cfg | 14 ++++++++++++++ .../quality/dagoma/dagoma_global_fine.inst.cfg | 14 ++++++++++++++ .../quality/dagoma/dagoma_global_standard.inst.cfg | 14 ++++++++++++++ .../dagoma/dagoma_neva_magis_pla_fast.inst.cfg | 2 -- .../dagoma/dagoma_neva_magis_pla_fine.inst.cfg | 1 - .../dagoma/dagoma_neva_magis_pla_standard.inst.cfg | 2 -- .../quality/dagoma/dagoma_neva_pla_fast.inst.cfg | 2 -- .../quality/dagoma/dagoma_neva_pla_fine.inst.cfg | 1 - .../dagoma/dagoma_neva_pla_standard.inst.cfg | 2 -- 16 files changed, 55 insertions(+), 16 deletions(-) create mode 100644 resources/quality/dagoma/dagoma_global_fast.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_global_fine.inst.cfg create mode 100644 resources/quality/dagoma/dagoma_global_standard.inst.cfg diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 26f5a490dd..1f1e940100 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -335,6 +335,7 @@ class MachineManager(QObject): global_stack.getName(), new_quality_changes_group.name) else: new_quality_group = quality_groups.get(quality_type) + print(quality_groups) if new_quality_group is not None: self._setQualityGroup(new_quality_group, empty_quality_changes = True) same_quality_found = True @@ -1107,6 +1108,7 @@ class MachineManager(QObject): # Set quality and quality_changes for each ExtruderStack for position, node in quality_group.nodes_for_extruders.items(): self._global_container_stack.extruders[str(position)].quality = node.getContainer() + print("#######", node.getContainer().getName()) if empty_quality_changes: self._global_container_stack.extruders[str(position)].qualityChanges = self._empty_quality_changes_container diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json index 5e45947393..89d94ff6b7 100644 --- a/resources/definitions/dagoma_discoeasy200.def.json +++ b/resources/definitions/dagoma_discoeasy200.def.json @@ -9,6 +9,8 @@ "file_formats": "text/x-gcode", "platform": "discoeasy200.stl", "platform_offset": [ 105, -59, 280], + "has_machine_quality": true, + "has_materials": true, "machine_extruder_trains": { "0": "dagoma_discoeasy200_extruder_0" diff --git a/resources/definitions/dagoma_neva.def.json b/resources/definitions/dagoma_neva.def.json index be429e32af..cdd5725765 100644 --- a/resources/definitions/dagoma_neva.def.json +++ b/resources/definitions/dagoma_neva.def.json @@ -9,6 +9,8 @@ "file_formats": "text/x-gcode", "platform": "neva.stl", "platform_offset": [ 0, 0, 0], + "has_machine_quality": true, + "has_materials": true, "machine_extruder_trains": { "0": "dagoma_neva_extruder_0" diff --git a/resources/definitions/dagoma_neva_magis.def.json b/resources/definitions/dagoma_neva_magis.def.json index 6a856044b2..07bf5987f5 100644 --- a/resources/definitions/dagoma_neva_magis.def.json +++ b/resources/definitions/dagoma_neva_magis.def.json @@ -8,7 +8,13 @@ "manufacturer": "Dagoma", "file_formats": "text/x-gcode", "platform": "neva.stl", - "platform_offset": [ 0, 0, 0] + "platform_offset": [ 0, 0, 0], + "has_machine_quality": true, + "has_materials": true, + "machine_extruder_trains": + { + "0": "dagoma_neva_extruder_0" + } }, "overrides": { "machine_width": { diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg index a75d01c9f0..a302f5b513 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fast.inst.cfg @@ -11,7 +11,5 @@ weight = -2 material = generic_pla [values] -layer_height = 0.2 - material_print_temperature = =default_material_print_temperature + 10 material_bed_temperature_layer_0 = =default_material_bed_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg index 695fd7bc7e..b26eb1d910 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_fine.inst.cfg @@ -11,4 +11,3 @@ weight = 0 material = generic_pla [values] -layer_height = 0.1 diff --git a/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg index b6b086403d..9ec56f696a 100644 --- a/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_discoeasy200_pla_standard.inst.cfg @@ -11,7 +11,5 @@ weight = -1 material = generic_pla [values] -layer_height = 0.15 - material_print_temperature = =default_material_print_temperature + 5 material_bed_temperature_layer_0 = =default_material_bed_temperature + 5 diff --git a/resources/quality/dagoma/dagoma_global_fast.inst.cfg b/resources/quality/dagoma/dagoma_global_fast.inst.cfg new file mode 100644 index 0000000000..28569387f2 --- /dev/null +++ b/resources/quality/dagoma/dagoma_global_fast.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Fast +definition = dagoma_discoeasy200 + +[metadata] +setting_version = 5 +type = quality +quality_type = draft +weight = -2 +global_quality = True + +[values] +layer_height = 0.2 diff --git a/resources/quality/dagoma/dagoma_global_fine.inst.cfg b/resources/quality/dagoma/dagoma_global_fine.inst.cfg new file mode 100644 index 0000000000..1f7d577c1b --- /dev/null +++ b/resources/quality/dagoma/dagoma_global_fine.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Fine +definition = dagoma_discoeasy200 + +[metadata] +setting_version = 5 +type = quality +quality_type = normal +weight = 0 +global_quality = True + +[values] +layer_height = 0.1 diff --git a/resources/quality/dagoma/dagoma_global_standard.inst.cfg b/resources/quality/dagoma/dagoma_global_standard.inst.cfg new file mode 100644 index 0000000000..167062c1d7 --- /dev/null +++ b/resources/quality/dagoma/dagoma_global_standard.inst.cfg @@ -0,0 +1,14 @@ +[general] +version = 4 +name = Standard +definition = dagoma_discoeasy200 + +[metadata] +setting_version = 5 +type = quality +quality_type = fast +weight = -1 +global_quality = True + +[values] +layer_height = 0.15 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg index 51fb17a5cc..efdf2f7d32 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg @@ -11,7 +11,5 @@ weight = -2 material = generic_pla [values] -layer_height = 0.2 - material_print_temperature = =default_material_print_temperature + 10 material_bed_temperature_layer_0 = =default_material_bed_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg index 1ff947d766..50915db112 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg @@ -11,4 +11,3 @@ weight = 0 material = generic_pla [values] -layer_height = 0.1 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg index dfcc1c967b..ed67800eac 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg @@ -11,7 +11,5 @@ weight = -1 material = generic_pla [values] -layer_height = 0.15 - material_print_temperature = =default_material_print_temperature + 5 material_bed_temperature_layer_0 = =default_material_bed_temperature + 5 diff --git a/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg index 51fb17a5cc..efdf2f7d32 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_fast.inst.cfg @@ -11,7 +11,5 @@ weight = -2 material = generic_pla [values] -layer_height = 0.2 - material_print_temperature = =default_material_print_temperature + 10 material_bed_temperature_layer_0 = =default_material_bed_temperature + 10 diff --git a/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg index 1ff947d766..50915db112 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_fine.inst.cfg @@ -11,4 +11,3 @@ weight = 0 material = generic_pla [values] -layer_height = 0.1 diff --git a/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg index dfcc1c967b..ed67800eac 100644 --- a/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_pla_standard.inst.cfg @@ -11,7 +11,5 @@ weight = -1 material = generic_pla [values] -layer_height = 0.15 - material_print_temperature = =default_material_print_temperature + 5 material_bed_temperature_layer_0 = =default_material_bed_temperature + 5 From 327eaf9564b7369e35041c234b0e966bb5b45da0 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 17 Jul 2018 18:09:59 +0200 Subject: [PATCH 10/95] Remove debug printing Contributes to CURA-5499 --- cura/Settings/MachineManager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1f1e940100..26f5a490dd 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -335,7 +335,6 @@ class MachineManager(QObject): global_stack.getName(), new_quality_changes_group.name) else: new_quality_group = quality_groups.get(quality_type) - print(quality_groups) if new_quality_group is not None: self._setQualityGroup(new_quality_group, empty_quality_changes = True) same_quality_found = True @@ -1108,7 +1107,6 @@ class MachineManager(QObject): # Set quality and quality_changes for each ExtruderStack for position, node in quality_group.nodes_for_extruders.items(): self._global_container_stack.extruders[str(position)].quality = node.getContainer() - print("#######", node.getContainer().getName()) if empty_quality_changes: self._global_container_stack.extruders[str(position)].qualityChanges = self._empty_quality_changes_container From e96c59223434705c99df915f68594783d0fb43d9 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Tue, 17 Jul 2018 18:12:22 +0200 Subject: [PATCH 11/95] Add correct name to the Dagoma Neva Magis extruder. Contributes to CURA-5499 --- resources/definitions/dagoma_neva_magis.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/dagoma_neva_magis.def.json b/resources/definitions/dagoma_neva_magis.def.json index 07bf5987f5..0b7b50cb5f 100644 --- a/resources/definitions/dagoma_neva_magis.def.json +++ b/resources/definitions/dagoma_neva_magis.def.json @@ -13,7 +13,7 @@ "has_materials": true, "machine_extruder_trains": { - "0": "dagoma_neva_extruder_0" + "0": "dagoma_neva_magis_extruder_0" } }, "overrides": { From 795dc9b9e1df32df053cfa45bc3e775251f170d3 Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:08:15 +0800 Subject: [PATCH 12/95] Create winbo_superhelper105.def.json --- .../definitions/winbo_superhelper105.def.json | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 resources/definitions/winbo_superhelper105.def.json diff --git a/resources/definitions/winbo_superhelper105.def.json b/resources/definitions/winbo_superhelper105.def.json new file mode 100644 index 0000000000..f51d5d9070 --- /dev/null +++ b/resources/definitions/winbo_superhelper105.def.json @@ -0,0 +1,127 @@ +{ + "version": 2, + "name": "Winbo Super Helper 105", + "inherits": "fdmprinter", + "metadata": { + "author": "Winbo", + "manufacturer": "Winbo Smart Tech Co., Ltd.", + "category": "Other", + "visible": true, + "file_formats": "text/x-gcode", + "supports_usb_connection": true, + "machine_extruder_trains": + { + "0": "winbo_superhelper105_extruder" + } + }, + + "overrides": { + "machine_name": { "default_value": "Winbo Super Helper 105" }, + "machine_width": { "default_value": 108 }, + "machine_depth": { "default_value": 108 }, + "machine_height": { "default_value": 158 }, + "machine_heated_bed": { "default_value": false }, + "material_bed_temp_wait": { "default_value": false }, + "machine_filament_park_distance": { "value": "machine_heat_zone_length" }, + "machine_nozzle_heat_up_speed": { "default_value": 1.4 }, + "machine_nozzle_cool_down_speed": { "default_value": 0.8 }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [ -110, 50 ],[ -110, -30 ],[ 110, -30 ],[ 110, 50 ] + ] + }, + "machine_gcode_flavor": { "default_value": "Marlin" }, + "machine_max_feedrate_x": { "default_value": 250 }, + "machine_max_feedrate_y": { "default_value": 200 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_acceleration": { "default_value": 2000 }, + "gantry_height": { "default_value": 200 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, + "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, + "material_diameter": { "default_value": 1.75 }, + "prime_blob_enable": { "enabled": true }, + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "2000" }, + "acceleration_travel": { "value": "1500" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" }, + "brim_width": { "value": "3" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_fan_speed": { "value": "100" }, + "cool_fan_speed_max": { "value": "100" }, + "cool_min_speed": { "value": "5" }, + "fill_outline_gaps": { "value": "True" }, + "infill_overlap": { "value": "0" }, + "min_infill_area": { "value": "1" }, + "min_skin_width_for_expansion": { "value": "2" }, + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + "wall_thickness": { "value": "0.8"}, + "line_width": { "value": "extruderValue(-1,'machine_nozzle_size')" }, + "raft_base_thickness": { "value": "0.3" }, + "raft_interface_line_spacing": { "value": "0.5" }, + "raft_interface_line_width": { "value": "0.5" }, + "raft_interface_thickness": { "value": "0.2" }, + "raft_jerk": { "value": "jerk_layer_0" }, + "raft_margin": { "value": "10" }, + "raft_surface_layers": { "value": "1" }, + "retraction_amount": { "value": "4" }, + "retraction_count_max": { "value": "10" }, + "retraction_extrusion_window": { "value": "1" }, + "retraction_hop": { "value": "0.5" }, + "retraction_hop_enabled": { "value": "True" }, + "retraction_hop_only_when_collides": { "value": "True" }, + "retraction_min_travel": { "value": "5" }, + "retraction_prime_speed": { "value": "25" }, + "skin_overlap": { "value": "10" }, + "speed_layer_0": { "value": "20" }, + "speed_print": { "value": "52" }, + "speed_support": { "value": "speed_print*line_width/support_line_width" }, + "speed_support_interface": { "value": "speed_print*line_width/support_interface_line_width" }, + "speed_topbottom": { "value": "speed_print*line_width/skin_line_width" }, + "speed_travel": { "value": "80" }, + "speed_infill": { "value": "speed_print*line_width/infill_line_width" }, + "speed_wall": { "value": "speed_print*wall_line_width_0/line_width" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 0.6)" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_equalize_flow_enabled": { "value": "False" }, + "support_angle": { "value": "50" }, + "support_xy_distance": { "value": "1" }, + "support_z_distance": { "value": "max((0.2 if(0.2%layer_height==0) else layer_height*int((0.2+layer_height)/layer_height)),layer_height)" }, + "support_bottom_distance": { "value": "max(support_z_distance,layer_height*int(0.45/layer_height))" }, + "top_bottom_thickness": { "value": "max(1.2,layer_height*6)" }, + "travel_avoid_distance": { "value": "3" }, + "gradual_support_infill_step_height": { "value": "0.2" }, + "gradual_support_infill_steps": { "value": "1" }, + "infill_sparse_density": { "value": "20" }, + "gradual_infill_step_height": { "value": "1" }, + "initial_layer_line_width_factor": { "value": "120" }, + "jerk_travel": { "value": "25" }, + "support_bottom_enable": { "value": "True" }, + "support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" }, + "support_bottom_pattern": { "value": "'zigzag'" }, + "support_connect_zigzags": { "value": "False" }, + "support_infill_rate": { "value": "8" }, + "support_interface_density": { "value": "80" }, + "support_interface_enable": { "value": "True" }, + "support_interface_height": { "value": "0.5" }, + "support_roof_pattern": { "value": "'concentric'" }, + "z_seam_type": { "value": "'shortest'" }, + "speed_equalize_flow_max": { "value": "65" } + } +} From a5bc2769aadbcf219ac03c33ec701dd211c76c3c Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:15:07 +0800 Subject: [PATCH 13/95] Create winbo_superhelper155.def.json --- .../definitions/winbo_superhelper155.def.json | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 resources/definitions/winbo_superhelper155.def.json diff --git a/resources/definitions/winbo_superhelper155.def.json b/resources/definitions/winbo_superhelper155.def.json new file mode 100644 index 0000000000..65bb4e7b73 --- /dev/null +++ b/resources/definitions/winbo_superhelper155.def.json @@ -0,0 +1,30 @@ +{ + "version": 2, + "name": "Winbo Super Helper 155", + "inherits": "winbo_superhelper105", + "metadata": { + "author": "Winbo", + "manufacturer": "Winbo Smart Tech Co., Ltd.", + "category": "Other", + "visible": true, + "file_formats": "text/x-gcode", + "supports_usb_connection": true, + "machine_extruder_trains": + { + "0": "winbo_superhelper155_extruder" + } + }, + "overrides": { + "machine_name": { "default_value": "Winbo Super Helper 155" }, + "machine_width": { "default_value": 158 }, + "machine_depth": { "default_value": 158 }, + "machine_height": { "default_value": 208 }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [ -160, 50 ],[ -160, -30 ],[ 160, -30 ],[ 160, 50 ] + ] + } + } +} From 494fcb98b833a8505b037bd5b37bbb3ed45de9d1 Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:17:40 +0800 Subject: [PATCH 14/95] Create winbo_mini2.def.json --- resources/definitions/winbo_mini2.def.json | 138 +++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 resources/definitions/winbo_mini2.def.json diff --git a/resources/definitions/winbo_mini2.def.json b/resources/definitions/winbo_mini2.def.json new file mode 100644 index 0000000000..d166b7847e --- /dev/null +++ b/resources/definitions/winbo_mini2.def.json @@ -0,0 +1,138 @@ +{ + "version": 2, + "name": "Winbo FDM-Mini2", + "inherits": "fdmprinter", + "metadata": { + "author": "Winbo", + "manufacturer": "Winbo Smart Tech Co., Ltd.", + "category": "Other", + "visible": true, + "file_formats": "text/x-gcode", + "supports_usb_connection": true, + "machine_extruder_trains": + { + "0": "winbo_mini2_extruder" + } + }, + + "overrides": { + "machine_name": { "default_value": "Winbo FDM-Mini2" }, + "machine_width": { "default_value": 205 }, + "machine_depth": { "default_value": 155 }, + "machine_height": { "default_value": 205 }, + "machine_heated_bed": { "default_value": false }, + "material_bed_temp_wait": { "default_value": false }, + "machine_filament_park_distance": { "value": "machine_heat_zone_length" }, + "machine_nozzle_heat_up_speed": { "default_value": 1.4 }, + "machine_nozzle_cool_down_speed": { "default_value": 0.8 }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [ -52, 30 ],[ -52, -40 ],[ 13, -40 ],[ 13, 30 ] + ] + }, + "machine_gcode_flavor": { "default_value": "Marlin" }, + "machine_max_feedrate_x": { "default_value": 250 }, + "machine_max_feedrate_y": { "default_value": 200 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_acceleration": { "default_value": 3000 }, + "gantry_height": { "default_value": 75 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F1000 Z3\nG1 F4000 X0\nG1 F4000 Y0\nG1 F1000 Z0.2\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, + "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, + "material_diameter": { "default_value": 1.75 }, + "prime_blob_enable": { "enabled": true }, + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "2000" }, + "acceleration_travel": { "value": "2500" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" }, + "brim_width": { "value": "3" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_fan_speed": { "value": "100" }, + "cool_fan_speed_max": { "value": "100" }, + "cool_min_speed": { "value": "5" }, + "fill_outline_gaps": { "value": "True" }, + "infill_overlap": { "value": "0" }, + "min_infill_area": { "value": "1" }, + "min_skin_width_for_expansion": { "value": "2" }, + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + "wall_thickness": { "value": "1.2"}, + "line_width": { "value": "extruderValue(-1,'machine_nozzle_size')" }, + "wall_0_inset": { "value": "0.05" }, + "wall_line_width_x": { "value": "line_width" }, + "wall_line_width_0": { "value": "line_width-0.05" }, + "support_line_width": { "value": "max(min(line_width,0.4),line_width/2)" }, + "support_interface_line_width": { "value": "support_line_width" }, + "machine_min_cool_heat_time_window": { "value": "15" }, + "default_material_print_temperature": { "value": "200" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature - 5" }, + "material_bed_temperature": { "maximum_value": "115" }, + "material_bed_temperature_layer_0": { "maximum_value": "115" }, + "raft_airgap": { "value": "0" }, + "raft_base_thickness": { "value": "0.3" }, + "raft_interface_line_spacing": { "value": "0.5" }, + "raft_interface_line_width": { "value": "0.5" }, + "raft_interface_thickness": { "value": "0.2" }, + "raft_jerk": { "value": "jerk_layer_0" }, + "raft_margin": { "value": "10" }, + "raft_surface_layers": { "value": "1" }, + "retraction_amount": { "value": "4" }, + "retraction_count_max": { "value": "10" }, + "retraction_extrusion_window": { "value": "1" }, + "retraction_hop": { "value": "0.5" }, + "retraction_hop_enabled": { "value": "True" }, + "retraction_hop_only_when_collides": { "value": "True" }, + "retraction_min_travel": { "value": "5" }, + "retraction_prime_speed": { "value": "25" }, + "skin_overlap": { "value": "10" }, + "speed_layer_0": { "value": "20" }, + "speed_print": { "value": "50" }, + "speed_support": { "value": "speed_print*line_width/support_line_width" }, + "speed_support_interface": { "value": "speed_print*line_width/support_interface_line_width" }, + "speed_topbottom": { "value": "speed_print*line_width/skin_line_width" }, + "speed_travel": { "value": "90" }, + "speed_infill": { "value": "speed_print*line_width/infill_line_width" }, + "speed_wall": { "value": "speed_print*wall_line_width_0/line_width" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 0.6)" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_equalize_flow_enabled": { "value": "False" }, + "support_angle": { "value": "50" }, + "support_xy_distance": { "value": "1" }, + "support_z_distance": { "value": "max((0.2 if(0.2%layer_height==0) else layer_height*int((0.2+layer_height)/layer_height)),layer_height)" }, + "support_bottom_distance": { "value": "max(support_z_distance,layer_height*int(0.45/layer_height))" }, + "top_bottom_thickness": { "value": "max(1.2,layer_height*6)" }, + "travel_avoid_distance": { "value": "3" }, + "gradual_support_infill_step_height": { "value": "0.2" }, + "gradual_support_infill_steps": { "value": "1" }, + "infill_sparse_density": { "value": "20" }, + "gradual_infill_step_height": { "value": "1" }, + "initial_layer_line_width_factor": { "value": "120" }, + "jerk_travel": { "value": "25" }, + "support_bottom_enable": { "value": "True" }, + "support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" }, + "support_bottom_pattern": { "value": "'zigzag'" }, + "support_connect_zigzags": { "value": "False" }, + "support_infill_rate": { "value": "8" }, + "support_interface_density": { "value": "80" }, + "support_interface_enable": { "value": "True" }, + "support_interface_height": { "value": "0.5" }, + "support_roof_pattern": { "value": "'concentric'" }, + "z_seam_type": { "value": "'shortest'" }, + "speed_equalize_flow_max": { "value": "65" } + } +} From dd9d4d1e2b5ef0336e0b3adcbe49da1c4d9cc185 Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:19:36 +0800 Subject: [PATCH 15/95] Create winbo_dragonl4.def.json --- resources/definitions/winbo_dragonl4.def.json | 139 ++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 resources/definitions/winbo_dragonl4.def.json diff --git a/resources/definitions/winbo_dragonl4.def.json b/resources/definitions/winbo_dragonl4.def.json new file mode 100644 index 0000000000..cb5566c46b --- /dev/null +++ b/resources/definitions/winbo_dragonl4.def.json @@ -0,0 +1,139 @@ +{ + "version": 2, + "name": "Winbo FDM-Dragon(L)4", + "inherits": "fdmprinter", + "metadata": { + "author": "Winbo", + "manufacturer": "Winbo Smart Tech Co., Ltd.", + "category": "Other", + "visible": true, + "file_formats": "text/x-gcode", + "supports_usb_connection": false, + "machine_extruder_trains": + { + "0": "winbo_dragonl4_extruder" + } + }, + + "overrides": { + "machine_name": { "default_value": "Winbo FDM-Dragon(L)4" }, + "machine_width": { "default_value": 615 }, + "machine_depth": { "default_value": 463 }, + "machine_height": { "default_value": 615 }, + "machine_heated_bed": { "default_value": true }, + "material_bed_temp_wait": { "default_value": false }, + "machine_filament_park_distance": { "value": "machine_heat_zone_length" }, + "machine_nozzle_heat_up_speed": { "default_value": 1.4 }, + "machine_nozzle_cool_down_speed": { "default_value": 0.8 }, + "machine_nozzle_size": { "default_value": 0.8 }, + "machine_head_with_fans_polygon": + { + "default_value": + [ + [ -50, 90 ],[ -50, -60 ],[ 50, -60 ],[ 50, 90 ] + ] + }, + "machine_gcode_flavor": { "default_value": "Marlin" }, + "machine_max_feedrate_x": { "default_value": 300 }, + "machine_max_feedrate_y": { "default_value": 300 }, + "machine_max_feedrate_z": { "default_value": 40 }, + "machine_acceleration": { "default_value": 2000 }, + "gantry_height": { "default_value": 80 }, + "machine_extruder_count": { "default_value": 1 }, + "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nM9998\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F800 X585 E12\nG92 E0" }, + "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, + "material_diameter": { "default_value": 3.0 }, + "prime_blob_enable": { "enabled": true }, + "acceleration_enabled": { "value": "True" }, + "acceleration_layer_0": { "value": "acceleration_topbottom" }, + "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_print": { "value": "1800" }, + "acceleration_travel": { "value": "2000" }, + "acceleration_support": { "value": "math.ceil(acceleration_print * 2000 / 4000)" }, + "acceleration_support_interface": { "value": "acceleration_topbottom" }, + "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 500 / 4000)" }, + "acceleration_wall": { "value": "math.ceil(acceleration_print * 1000 / 4000)" }, + "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 500 / 1000)" }, + "brim_width": { "value": "4" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_fan_speed": { "value": "100" }, + "cool_fan_speed_max": { "value": "100" }, + "cool_min_speed": { "value": "5" }, + "fill_outline_gaps": { "value": "True" }, + "infill_overlap": { "value": "0" }, + "min_infill_area": { "value": "1" }, + "min_skin_width_for_expansion": { "value": "2" }, + "jerk_enabled": { "value": "True" }, + "jerk_layer_0": { "value": "jerk_topbottom" }, + "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_print": { "value": "25" }, + "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" }, + "jerk_support_interface": { "value": "jerk_topbottom" }, + "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" }, + "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" }, + "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" }, + "wall_thickness": { "value": "2.4"}, + "line_width": { "value": "extruderValue(-1,'machine_nozzle_size')" }, + "wall_0_inset": { "value": "0.05" }, + "wall_line_width_x": { "value": "line_width" }, + "wall_line_width_0": { "value": "line_width-0.05" }, + "support_line_width": { "value": "max(min(line_width,0.4),line_width/2)" }, + "support_interface_line_width": { "value": "support_line_width" }, + "machine_min_cool_heat_time_window": { "value": "15" }, + "default_material_print_temperature": { "value": "200" }, + "material_print_temperature_layer_0": { "value": "material_print_temperature - 5" }, + "material_bed_temperature": { "maximum_value": "100" }, + "material_bed_temperature_layer_0": { "maximum_value": "100" }, + "raft_airgap": { "value": "0" }, + "raft_base_thickness": { "value": "0.3" }, + "raft_interface_line_spacing": { "value": "0.5" }, + "raft_interface_line_width": { "value": "0.5" }, + "raft_interface_thickness": { "value": "0.2" }, + "raft_jerk": { "value": "jerk_layer_0" }, + "raft_margin": { "value": "5" }, + "raft_surface_layers": { "value": "2" }, + "retraction_amount": { "value": "4" }, + "retraction_count_max": { "value": "10" }, + "retraction_extrusion_window": { "value": "1" }, + "retraction_hop": { "value": "0.5" }, + "retraction_hop_enabled": { "value": "True" }, + "retraction_hop_only_when_collides": { "value": "True" }, + "retraction_min_travel": { "value": "5" }, + "retraction_prime_speed": { "value": "25" }, + "skin_overlap": { "value": "10" }, + "speed_layer_0": { "value": "25" }, + "speed_print": { "value": "70" }, + "speed_support": { "value": "speed_print*line_width/support_line_width" }, + "speed_support_interface": { "value": "speed_print*line_width/support_interface_line_width" }, + "speed_topbottom": { "value": "speed_print*line_width/skin_line_width" }, + "speed_travel": { "value": "100" }, + "speed_infill": { "value": "speed_print*line_width/infill_line_width" }, + "speed_wall": { "value": "speed_print*wall_line_width_0/line_width" }, + "speed_wall_0": { "value": "math.ceil(speed_wall * 0.6)" }, + "speed_wall_x": { "value": "speed_wall" }, + "speed_equalize_flow_enabled": { "value": "False" }, + "support_angle": { "value": "50" }, + "support_xy_distance": { "value": "1" }, + "support_z_distance": { "value": "max((0.2 if(0.2%layer_height==0) else layer_height*int((0.2+layer_height)/layer_height)),layer_height)" }, + "support_bottom_distance": { "value": "max(support_z_distance,layer_height*int(0.45/layer_height))" }, + "top_bottom_thickness": { "value": "max(1.2,layer_height*6)" }, + "travel_avoid_distance": { "value": "3" }, + "gradual_support_infill_step_height": { "value": "0.2" }, + "gradual_support_infill_steps": { "value": "1" }, + "infill_sparse_density": { "value": "20" }, + "gradual_infill_step_height": { "value": "1" }, + "initial_layer_line_width_factor": { "value": "120" }, + "jerk_travel": { "value": "25" }, + "support_bottom_enable": { "value": "True" }, + "support_bottom_height": { "value": "max((0.15 if(0.15%layer_height==0) else layer_height*int((0.15+layer_height)/layer_height)),layer_height)" }, + "support_bottom_pattern": { "value": "'zigzag'" }, + "support_connect_zigzags": { "value": "False" }, + "support_infill_rate": { "value": "8" }, + "support_interface_density": { "value": "80" }, + "support_interface_enable": { "value": "True" }, + "support_interface_height": { "value": "0.5" }, + "support_roof_pattern": { "value": "'concentric'" }, + "z_seam_type": { "value": "'shortest'" }, + "speed_equalize_flow_max": { "value": "65" } + } +} From 405eccfa9ceafd481f1497125649a173b3715f80 Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:20:40 +0800 Subject: [PATCH 16/95] Create winbo_superhelper105_extruder.def.json --- .../winbo_superhelper105_extruder.def.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/extruders/winbo_superhelper105_extruder.def.json diff --git a/resources/extruders/winbo_superhelper105_extruder.def.json b/resources/extruders/winbo_superhelper105_extruder.def.json new file mode 100644 index 0000000000..1224a5a29a --- /dev/null +++ b/resources/extruders/winbo_superhelper105_extruder.def.json @@ -0,0 +1,19 @@ +{ + "id": "winbo_superhelper105_extruder", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "winbo_superhelper105", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "2" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} From 937a4c68e3537477d62b0d40f5d2ea9c4c5b8d78 Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:21:58 +0800 Subject: [PATCH 17/95] Create winbo_superhelper155_extruder.def.json --- .../winbo_superhelper155_extruder.def.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/extruders/winbo_superhelper155_extruder.def.json diff --git a/resources/extruders/winbo_superhelper155_extruder.def.json b/resources/extruders/winbo_superhelper155_extruder.def.json new file mode 100644 index 0000000000..9935084872 --- /dev/null +++ b/resources/extruders/winbo_superhelper155_extruder.def.json @@ -0,0 +1,19 @@ +{ + "id": "winbo_superhelper155_extruder", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "winbo_superhelper155", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "2" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} From 147b66845e89dd95550e33f49b0e6bd1d7566821 Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:22:58 +0800 Subject: [PATCH 18/95] Create winbo_mini2_extruder.def.json --- .../extruders/winbo_mini2_extruder.def.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/extruders/winbo_mini2_extruder.def.json diff --git a/resources/extruders/winbo_mini2_extruder.def.json b/resources/extruders/winbo_mini2_extruder.def.json new file mode 100644 index 0000000000..5348e6ad43 --- /dev/null +++ b/resources/extruders/winbo_mini2_extruder.def.json @@ -0,0 +1,19 @@ +{ + "id": "winbo_mini2_extruder", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "winbo_mini2", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "2" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} From 17493d92a0fd79dea2719ecb906be8a7d5bbc09f Mon Sep 17 00:00:00 2001 From: milkok Date: Tue, 24 Jul 2018 17:24:01 +0800 Subject: [PATCH 19/95] Create winbo_dragonl4_extruder.def.json --- .../winbo_dragonl4_extruder.def.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 resources/extruders/winbo_dragonl4_extruder.def.json diff --git a/resources/extruders/winbo_dragonl4_extruder.def.json b/resources/extruders/winbo_dragonl4_extruder.def.json new file mode 100644 index 0000000000..a4f65bbf0e --- /dev/null +++ b/resources/extruders/winbo_dragonl4_extruder.def.json @@ -0,0 +1,19 @@ +{ + "id": "winbo_dragonl4_extruder", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "winbo_dragonl4", + "position": "0" + }, + + "overrides": { + "extruder_nr": { + "default_value": 0, + "maximum_value": "2" + }, + "machine_nozzle_offset_x": { "default_value": 0.0 }, + "machine_nozzle_offset_y": { "default_value": 0.0 } + } +} From 30a7132a688748cad47639263d81f22940810904 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 25 Jul 2018 17:10:23 +0200 Subject: [PATCH 20/95] Add latest version upgrade plugin to the bundled plugins. --- resources/bundled_packages.json | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/resources/bundled_packages.json b/resources/bundled_packages.json index 6d9b9d1a95..f281d0d01a 100644 --- a/resources/bundled_packages.json +++ b/resources/bundled_packages.json @@ -662,6 +662,23 @@ } } }, + "VersionUpgrade34to40": { + "package_info": { + "package_id": "VersionUpgrade34to40", + "package_type": "plugin", + "display_name": "Version Upgrade 3.4 to 4.0", + "description": "Upgrades configurations from Cura 3.4 to Cura 4.0.", + "package_version": "1.0.0", + "sdk_version": 4, + "website": "https://ultimaker.com", + "author": { + "author_id": "Ultimaker", + "display_name": "Ultimaker B.V.", + "email": "plugins@ultimaker.com", + "website": "https://ultimaker.com" + } + } + }, "X3DReader": { "package_info": { "package_id": "X3DReader", From 9584b8c579c20b1c0ea92a7e015a7237934dd4d3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 26 Jul 2018 13:52:51 +0200 Subject: [PATCH 21/95] Bind Top Surface Skin Layers value to Top Surface Skin Extruder CURA-5563 Otherwise, if you set the layers to 2 for extruder 1 and use extruder 2 for Top Surface Skin, it will use the Top Surface Skin Layers value from extruder 2, which is most likely 0, and no top surface skin layers will be printed. --- 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 ed40b32851..e29e08228b 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1074,7 +1074,7 @@ "maximum_value_warning": "top_layers - 1", "type": "int", "value": "0", - "limit_to_extruder": "roofing_extruder_nr", + "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true, "enabled": "top_layers > 0" }, From e50907894394ea0793b9cddef89238f560825102 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 26 Jul 2018 20:12:42 +0200 Subject: [PATCH 22/95] Fix bug with libSavitar not loading due to SIP The same crash as libArcus actually. --- cura_app.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura_app.py b/cura_app.py index c3c766fdb1..164e32e738 100755 --- a/cura_app.py +++ b/cura_app.py @@ -131,6 +131,7 @@ faulthandler.enable(all_threads = True) # first seems to prevent Sip from going into a state where it # tries to create PyQt objects on a non-main thread. import Arcus #@UnusedImport +import Savitar #@UnusedImport from cura.CuraApplication import CuraApplication app = CuraApplication() From 403394d5f6264453c26880a4083cebae9296d145 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 27 Jul 2018 11:34:12 +0200 Subject: [PATCH 23/95] Added settings Multiply infill and Connect Infill to Visibility list( Advanced and Expert) CURA-5400 --- resources/setting_visibility/advanced.cfg | 1 + resources/setting_visibility/expert.cfg | 3 +++ 2 files changed, 4 insertions(+) diff --git a/resources/setting_visibility/advanced.cfg b/resources/setting_visibility/advanced.cfg index 43edb13495..9cee353f0c 100644 --- a/resources/setting_visibility/advanced.cfg +++ b/resources/setting_visibility/advanced.cfg @@ -37,6 +37,7 @@ infill_extruder_nr infill_sparse_density infill_line_distance infill_pattern +infill_multiplier infill_overlap infill_sparse_thickness gradual_infill_steps diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 0f15247eb7..0ca2cbab70 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -37,6 +37,7 @@ bottom_thickness bottom_layers top_bottom_pattern top_bottom_pattern_0 +connect_skin_polygons skin_angles wall_0_inset optimize_wall_printing_order @@ -73,6 +74,8 @@ infill_sparse_density infill_line_distance infill_pattern zig_zaggify_infill +connect_infill_polygons +infill_multiplier infill_angles infill_offset_x infill_offset_y From 8e1c116b5dd6526a849c2a393a7ad1a12f136749 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 27 Jul 2018 13:58:17 +0200 Subject: [PATCH 24/95] Revert "Show Preparing text after clicking Prepare button" This reverts commit 812816de112bf8b5b7c04a96244e153e53ca4a28. --- resources/qml/SaveButton.qml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index b06acdb8d5..0e0eec7277 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -168,8 +168,6 @@ Item { Button { id: prepareButton - property bool showPrepare : false; - 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" && ([1, 2].indexOf(base.backendState) != -1) && base.activity @@ -182,19 +180,9 @@ Item { anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width // 1 = not started, 4 = error, 5 = disabled - text: { - - if (base.backendState == 1 && showPrepare) - { - showPrepare = false - return catalog.i18nc("@label:Printjob", "Preparing") - } - - return [1, 4, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") - } + text: [1, 4, 5].indexOf(base.backendState) != -1 ? catalog.i18nc("@label:Printjob", "Prepare") : catalog.i18nc("@label:Printjob", "Cancel") onClicked: { - showPrepare = true sliceOrStopSlicing(); } From 5854ae544f7757103e18af25631a525aef898ec4 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 27 Jul 2018 15:32:51 +0200 Subject: [PATCH 25/95] Indicate when "Prepare" button has already been clicked Contributes to CURA-5551 --- resources/qml/SaveButton.qml | 51 ++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 0e0eec7277..86339b6795 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -48,14 +48,15 @@ Item { } function sliceOrStopSlicing() { - try { - if ([1, 5].indexOf(base.backendState) != -1) { - CuraApplication.backend.forceSlice(); - } else { - CuraApplication.backend.stopSlicing(); - } - } catch (e) { - console.log('Could not start or stop slicing', e) + if ( [ 1, 5 ].indexOf( base.backendState ) != -1 ) + { + prepareButton.preparingToSlice = true; + CuraApplication.backend.forceSlice(); + } + else + { + prepareButton.preparingToSlice = false; + CuraApplication.backend.stopSlicing(); } } @@ -167,10 +168,10 @@ Item { // Prepare button, only shows if auto_slice is off Button { id: prepareButton - + property bool preparingToSlice: false 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" && ([1, 2].indexOf(base.backendState) != -1) && base.activity + enabled: !preparingToSlice && 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 @@ -180,7 +181,23 @@ Item { anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width // 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") + text: { + if ( preparingToSlice ) + { + return catalog.i18nc("@label:Printjob", "Preparing"); + } + else + { + if ( [ 1, 4, 5 ].indexOf( base.backendState ) != -1 ) + { + return catalog.i18nc("@label:Printjob", "Prepare"); + } + else + { + return catalog.i18nc("@label:Printjob", "Cancel") + } + } + } onClicked: { sliceOrStopSlicing(); @@ -237,6 +254,18 @@ Item { } label: Item { } } + + Connections { + target: UM.Backend + onStateChanged: + { + if ( [ 2, 3 ].indexOf( UM.Backend.state) != -1 ) + { + prepareButton.preparingToSlice = false; + } + + } + } } Button { From 6694b7ac8186bc2ad429eaade6dd7e8bd8c14588 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 27 Jul 2018 15:56:29 +0200 Subject: [PATCH 26/95] CURA-5541 Change is_enabled field to is_active field to be consistent with the fields in the PackageManager. --- plugins/Toolbox/src/PackagesModel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/Toolbox/src/PackagesModel.py b/plugins/Toolbox/src/PackagesModel.py index 23aa639bde..8b9199b127 100644 --- a/plugins/Toolbox/src/PackagesModel.py +++ b/plugins/Toolbox/src/PackagesModel.py @@ -28,7 +28,7 @@ class PackagesModel(ListModel): self.addRoleName(Qt.UserRole + 11, "download_url") self.addRoleName(Qt.UserRole + 12, "last_updated") self.addRoleName(Qt.UserRole + 13, "is_bundled") - self.addRoleName(Qt.UserRole + 14, "is_enabled") + self.addRoleName(Qt.UserRole + 14, "is_active") self.addRoleName(Qt.UserRole + 15, "is_installed") # Scheduled pkgs are included in the model but should not be marked as actually installed self.addRoleName(Qt.UserRole + 16, "has_configs") self.addRoleName(Qt.UserRole + 17, "supported_configs") @@ -75,7 +75,7 @@ class PackagesModel(ListModel): "download_url": package["download_url"] if "download_url" in package else None, "last_updated": package["last_updated"] if "last_updated" in package else None, "is_bundled": package["is_bundled"] if "is_bundled" in package else False, - "is_enabled": package["is_enabled"] if "is_enabled" in package else False, + "is_active": package["is_active"] if "is_active" in package else False, "is_installed": package["is_installed"] if "is_installed" in package else False, "has_configs": has_configs, "supported_configs": configs_model, From 9418b241d19093229fa39917105b61d7988255fb Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 27 Jul 2018 16:04:36 +0200 Subject: [PATCH 27/95] CURA-5541 Remove duplicated bundled packages. Packages that belong to Uranium must stay in the Uranium's file. --- resources/bundled_packages.json | 272 -------------------------------- 1 file changed, 272 deletions(-) diff --git a/resources/bundled_packages.json b/resources/bundled_packages.json index f281d0d01a..40ed0a9aa2 100644 --- a/resources/bundled_packages.json +++ b/resources/bundled_packages.json @@ -1384,276 +1384,4 @@ } } }, - "ConsoleLogger": { - "package_info": { - "package_id": "ConsoleLogger", - "package_type": "plugin", - "display_name": "Console Logger", - "description": "Outputs log information to the console.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "OBJReader": { - "package_info": { - "package_id": "OBJReader", - "package_type": "plugin", - "display_name": "Wavefront OBJ Reader", - "description": "Makes it possible to read Wavefront OBJ files.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "OBJWriter": { - "package_info": { - "package_id": "OBJWriter", - "package_type": "plugin", - "display_name": "Wavefront OBJ Writer", - "description": "Makes it possible to write Wavefront OBJ files.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "STLReader": { - "package_info": { - "package_id": "STLReader", - "package_type": "plugin", - "display_name": "STL Reader", - "description": "Provides support for reading STL files.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "STLWriter": { - "package_info": { - "package_id": "STLWriter", - "package_type": "plugin", - "display_name": "STL Writer", - "description": "Provides support for writing STL files.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "FileLogger": { - "package_info": { - "package_id": "FileLogger", - "package_type": "plugin", - "display_name": "File Logger", - "description": "Outputs log information to a file in your settings folder.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "LocalContainerProvider": { - "package_info": { - "package_id": "LocalContainerProvider", - "package_type": "plugin", - "display_name": "Local Container Provider", - "description": "Provides built-in setting containers that come with the installation of the application.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "LocalFileOutputDevice": { - "package_info": { - "package_id": "LocalFileOutputDevice", - "package_type": "plugin", - "display_name": "Local File Output Device", - "description": "Enables saving to local files.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "CameraTool": { - "package_info": { - "package_id": "CameraTool", - "package_type": "plugin", - "display_name": "Camera Tool", - "description": "Provides the tool to manipulate the camera.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "MirrorTool": { - "package_info": { - "package_id": "MirrorTool", - "package_type": "plugin", - "display_name": "Mirror Tool", - "description": "Provides the Mirror tool.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "RotateTool": { - "package_info": { - "package_id": "RotateTool", - "package_type": "plugin", - "display_name": "Rotate Tool", - "description": "Provides the Rotate tool.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "ScaleTool": { - "package_info": { - "package_id": "ScaleTool", - "package_type": "plugin", - "display_name": "Scale Tool", - "description": "Provides the Scale tool.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "SelectionTool": { - "package_info": { - "package_id": "SelectionTool", - "package_type": "plugin", - "display_name": "Selection Tool", - "description": "Provides the Selection tool.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "TranslateTool": { - "package_info": { - "package_id": "TranslateTool", - "package_type": "plugin", - "display_name": "Move Tool", - "description": "Provides the Move tool.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "UpdateChecker": { - "package_info": { - "package_id": "UpdateChecker", - "package_type": "plugin", - "display_name": "Update Checker", - "description": "Checks for updates of the software.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - }, - "SimpleView": { - "package_info": { - "package_id": "SimpleView", - "package_type": "plugin", - "display_name": "Simple View", - "description": "Provides a simple solid mesh view.", - "package_version": "1.0.0", - "sdk_version": 4, - "website": "https://ultimaker.com", - "author": { - "author_id": "Ultimaker", - "display_name": "Ultimaker B.V.", - "email": "plugins@ultimaker.com", - "website": "https://ultimaker.com" - } - } - } } From 729569034d38c9b7d599f63347bcce1c691a9c95 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 27 Jul 2018 16:12:29 +0200 Subject: [PATCH 28/95] Rename setting Raft Line Spacing -> Raft Base Line Spacing --- resources/definitions/fdmprinter.def.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index e29e08228b..74b36e8d94 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1713,6 +1713,16 @@ "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, + "infill_wall_line_count": + { + "label": "infill_wall_line_count", + "description": "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage.", + "default_value": 0, + "type": "int", + "minimum_value": "0", + "maximum_value_warning": "infill_line_distance / infill_line_width", + "settable_per_mesh": true + }, "sub_div_rad_add": { "label": "Cubic Subdivision Shell", @@ -4723,7 +4733,7 @@ }, "raft_base_line_spacing": { - "label": "Raft Line Spacing", + "label": "Raft Base Line Spacing", "description": "The distance between the raft lines for the base raft layer. Wide spacing makes for easy removal of the raft from the build plate.", "unit": "mm", "type": "float", From e1db7eb83148053b5f8d39fbcb2e4519711fce76 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Fri, 18 May 2018 12:17:28 +0200 Subject: [PATCH 29/95] setting: infill_wall_line_count --- resources/definitions/fdmprinter.def.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 74b36e8d94..373ddc879c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1715,12 +1715,13 @@ }, "infill_wall_line_count": { - "label": "infill_wall_line_count", - "description": "Convert each infill line to this many lines. The extra lines do not cross over each other, but avoid each other. This makes the infill stiffer, but increases print time and material usage.", + "label": "Extra Infill Wall Count", + "description": "Add extra wals around the infill area. Such walls can make top/bottom skin lines sag down less which means you need less top/bottom skin layers for the same quality at the cost of some extra material.\nThis feature can combine with the Connect Infill Polygons to connect all the infill into a single extrusion path without the need for travels or retractions if configured right.", "default_value": 0, "type": "int", "minimum_value": "0", - "maximum_value_warning": "infill_line_distance / infill_line_width", + "enabled": "infill_sparse_density > 0 and not spaghetti_infill_enabled", + "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, "sub_div_rad_add": From a1661df9d794cb63355dcdb5a09a74a094d4806a Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:04:30 +0800 Subject: [PATCH 30/95] Update winbo_superhelper105_extruder.def.json --- resources/extruders/winbo_superhelper105_extruder.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/extruders/winbo_superhelper105_extruder.def.json b/resources/extruders/winbo_superhelper105_extruder.def.json index 1224a5a29a..a974317937 100644 --- a/resources/extruders/winbo_superhelper105_extruder.def.json +++ b/resources/extruders/winbo_superhelper105_extruder.def.json @@ -1,5 +1,4 @@ { - "id": "winbo_superhelper105_extruder", "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", @@ -13,6 +12,8 @@ "default_value": 0, "maximum_value": "2" }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 } } From 29f9beb55000d96f3d50f20f811af5e7abc86839 Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:06:23 +0800 Subject: [PATCH 31/95] Update winbo_superhelper105.def.json --- resources/definitions/winbo_superhelper105.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/winbo_superhelper105.def.json b/resources/definitions/winbo_superhelper105.def.json index f51d5d9070..59e71fb446 100644 --- a/resources/definitions/winbo_superhelper105.def.json +++ b/resources/definitions/winbo_superhelper105.def.json @@ -41,7 +41,6 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "material_diameter": { "default_value": 1.75 }, "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, From 66a9c885a79965be7fc24b4a9f585834c50ece1c Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:09:09 +0800 Subject: [PATCH 32/95] Update winbo_superhelper155_extruder.def.json --- resources/extruders/winbo_superhelper155_extruder.def.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/resources/extruders/winbo_superhelper155_extruder.def.json b/resources/extruders/winbo_superhelper155_extruder.def.json index 9935084872..2b406ed43c 100644 --- a/resources/extruders/winbo_superhelper155_extruder.def.json +++ b/resources/extruders/winbo_superhelper155_extruder.def.json @@ -13,6 +13,8 @@ "default_value": 0, "maximum_value": "2" }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 } } From 43e5110db666c487a5eccdb0656192b580aba941 Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:12:32 +0800 Subject: [PATCH 33/95] Update winbo_mini2_extruder.def.json --- resources/extruders/winbo_mini2_extruder.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/extruders/winbo_mini2_extruder.def.json b/resources/extruders/winbo_mini2_extruder.def.json index 5348e6ad43..a57ec28109 100644 --- a/resources/extruders/winbo_mini2_extruder.def.json +++ b/resources/extruders/winbo_mini2_extruder.def.json @@ -1,5 +1,4 @@ { - "id": "winbo_mini2_extruder", "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", @@ -13,6 +12,8 @@ "default_value": 0, "maximum_value": "2" }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_size": { "default_value": 0.4 }, "machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 } } From c4647cd8ad25305148ef3b5e22d57cca986af6c3 Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:12:49 +0800 Subject: [PATCH 34/95] Update winbo_superhelper155_extruder.def.json --- resources/extruders/winbo_superhelper155_extruder.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/extruders/winbo_superhelper155_extruder.def.json b/resources/extruders/winbo_superhelper155_extruder.def.json index 2b406ed43c..6d83689bf4 100644 --- a/resources/extruders/winbo_superhelper155_extruder.def.json +++ b/resources/extruders/winbo_superhelper155_extruder.def.json @@ -1,5 +1,4 @@ { - "id": "winbo_superhelper155_extruder", "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", From c05d85f1e426bba65f646830f5e51cda80084640 Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:14:04 +0800 Subject: [PATCH 35/95] Update winbo_dragonl4_extruder.def.json --- resources/extruders/winbo_dragonl4_extruder.def.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/extruders/winbo_dragonl4_extruder.def.json b/resources/extruders/winbo_dragonl4_extruder.def.json index a4f65bbf0e..37a08c8d08 100644 --- a/resources/extruders/winbo_dragonl4_extruder.def.json +++ b/resources/extruders/winbo_dragonl4_extruder.def.json @@ -1,5 +1,4 @@ { - "id": "winbo_dragonl4_extruder", "version": 2, "name": "Extruder 1", "inherits": "fdmextruder", @@ -13,6 +12,8 @@ "default_value": 0, "maximum_value": "2" }, + "material_diameter": { "default_value": 3.0 }, + "machine_nozzle_size": { "default_value": 0.8 }, "machine_nozzle_offset_x": { "default_value": 0.0 }, "machine_nozzle_offset_y": { "default_value": 0.0 } } From 29f2bb8a3a6344f66ee1bd64118dbd2759e3ca52 Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:15:36 +0800 Subject: [PATCH 36/95] Update winbo_dragonl4.def.json --- resources/definitions/winbo_dragonl4.def.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/definitions/winbo_dragonl4.def.json b/resources/definitions/winbo_dragonl4.def.json index cb5566c46b..5aa004414a 100644 --- a/resources/definitions/winbo_dragonl4.def.json +++ b/resources/definitions/winbo_dragonl4.def.json @@ -25,7 +25,6 @@ "machine_filament_park_distance": { "value": "machine_heat_zone_length" }, "machine_nozzle_heat_up_speed": { "default_value": 1.4 }, "machine_nozzle_cool_down_speed": { "default_value": 0.8 }, - "machine_nozzle_size": { "default_value": 0.8 }, "machine_head_with_fans_polygon": { "default_value": @@ -42,7 +41,6 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nM9998\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F800 X585 E12\nG92 E0" }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "material_diameter": { "default_value": 3.0 }, "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, From 380ab22c4237a39f36ba50e351f23e45cb9b3832 Mon Sep 17 00:00:00 2001 From: milkok Date: Sat, 28 Jul 2018 17:19:13 +0800 Subject: [PATCH 37/95] Update winbo_mini2.def.json --- resources/definitions/winbo_mini2.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/winbo_mini2.def.json b/resources/definitions/winbo_mini2.def.json index d166b7847e..85c5a445bd 100644 --- a/resources/definitions/winbo_mini2.def.json +++ b/resources/definitions/winbo_mini2.def.json @@ -41,7 +41,6 @@ "machine_extruder_count": { "default_value": 1 }, "machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F1000 Z3\nG1 F4000 X0\nG1 F4000 Y0\nG1 F1000 Z0.2\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." }, "machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" }, - "material_diameter": { "default_value": 1.75 }, "prime_blob_enable": { "enabled": true }, "acceleration_enabled": { "value": "True" }, "acceleration_layer_0": { "value": "acceleration_topbottom" }, From 2ef48c725ec59fb7fa422c77dd783763f1051941 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 28 Jul 2018 16:13:14 +0200 Subject: [PATCH 38/95] add new definition/quality/mesh of 3D printer by TiZYX --- resources/definitions/tizyx_k25.def.json | 47 ++++++++++++++++++ resources/meshes/tizyx_k25_platform.stl | Bin 0 -> 63884 bytes .../tizyx_k25/tizyx_k25_normal.inst.cfg | 31 ++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 resources/definitions/tizyx_k25.def.json create mode 100644 resources/meshes/tizyx_k25_platform.stl create mode 100644 resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg diff --git a/resources/definitions/tizyx_k25.def.json b/resources/definitions/tizyx_k25.def.json new file mode 100644 index 0000000000..f460b524a2 --- /dev/null +++ b/resources/definitions/tizyx_k25.def.json @@ -0,0 +1,47 @@ +{ + "version": 2, + "name": "TiZYX K25", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "TiZYX", + "manufacturer": "TiZYX", + "file_formats": "text/x-gcode", + "platform": "tizyx_k25_platform.stl", + "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pla", "generic_pla_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ], + "preferred_material": "tizyx_pla", + "has_machine_quality": true, + "has_materials": true + + }, + + "overrides": + { + "machine_heated_bed": { "default_value": true }, + "machine_width": { "default_value": 255 }, + "machine_height": { "default_value": 255 }, + "machine_depth": { "default_value": 255 }, + "machine_center_is_zero": { "default_value": false }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 }, + "gantry_height": { "default_value": 500 }, + "machine_head_with_fans_polygon": { + "default_value": [ + [25, 49], + [25, -49], + [-25, -49], + [25, 49] + ] + }, + "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, + "machine_start_gcode": + { + "default_value": "M82\nG90\nG28 X\nG28 Y\nG28 Z\nG29\nG91\nG1 Z0\nG90\nM82\nG92 E0\nG1 X125 Y245 F3000\nG1 Z0" + }, + "machine_end_gcode": + { + "default_value": "M104 S0\nM140 S0\nG91\nG1 E-5 F300\nG1 Z+3 F3000\nG1 Y245 F3000\nM84" + } + } +} diff --git a/resources/meshes/tizyx_k25_platform.stl b/resources/meshes/tizyx_k25_platform.stl new file mode 100644 index 0000000000000000000000000000000000000000..5417aaed5f7ec2e8b4c62467bfc6b115b07a6bb5 GIT binary patch literal 63884 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 ZB7k7|Sf(rM57&|4Xkl^l4H$gA% z)uaR!?zS*?N^qXw-n$?Fzvn0tZfgyvDC!?n+_ss4`|#;mxtFCyFSoUZV+<;8+swdy z_%w!lSz7dRTWdJRpyIa84BUrLW4M>4MK8CthGPsWZrjM&+Sv|}O4q$CEqb}#o(-I^ zbh*FpM0;$fLV`Q@F&Cwe?XKAB&IwyhdP?oHqC&#Ywk|7+(YI(^8*0Ys#k--JiF(!j zTJv;*3JJ|o;ZAkD&uQ+X2zt4l%xdwhsJLzEYAw;Lu50a_su(4eQAFJmOFt_TZkw0Z zM7`>|Hil4Hl~hI%b&slJkZ{|)w6^P2*R_m6WfW1540Q|=Zkw0ZsOepqSmz~`QA9Fc z#rh!Ows~px85M&H35|)p_}qc=?e#%|UK)2t#HjB4NFm{NvTl$0pyIaWLu2L0`l#+< z+gLk_sOuwSMm>sYxjh_%N3|=BqEbc?b-Su#kZ^lA29N3=8bzgyBI^E8#~|VMa18EM z`&X(%wJVJ>QbrN=$WX^1;kJ2c9P3s0&l!WtC?XjXW1Tx;3JHym8toLpYmfxJ{JyHL zws}^r*h=3CTj_gB$!w6El_@0r4C^tmE-Ur}w})%^QT>BGY7|kg^h?jV6Q+>R`mtBt z8AZ;kUFTlBUqdhMa?8JpQSz=8?~*ZILe%}-a!Z1D<+=%a@$O{9RxBIME?z}g_noVLPHAsSYPr3$5$EFQ~h|mpHm^>D<|D)P!!D{B(^b literal 0 HcmV?d00001 diff --git a/resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg b/resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg new file mode 100644 index 0000000000..399a7a51ab --- /dev/null +++ b/resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg @@ -0,0 +1,31 @@ +[general] +version = 4 +name = TiZYX K25 Normal +definition = tizyx_k25 + +[metadata] +quality_type = normal +setting_version = 4 +type = quality +global_quality = True + +[values] +adhesion_type = skirt +skirt_line_count = 2 +skirt_gap = 2 +cool_fan_speed_0 = 100 +fill_outline_gaps = True +infill_angles = [0,90 ] +infill_sparse_density = 15 +layer_height = 0.2 +layer_height_0 = 0.25 +material_diameter = 1.75 +retraction_amount = 2.5 +retraction_min_travel = 2 +retraction_speed = 30 +skin_angles = [0,90] +speed_print = 60 +speed_topbottom = 50 +speed_wall_0 = 40 +top_layers = 4 +wall_line_count = 2 From 2790650686e8d0487381f4adfab3928595f9fb19 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 30 Jul 2018 09:39:10 +0200 Subject: [PATCH 39/95] Code style improvements Contributes to CURA-5551 --- resources/qml/SaveButton.qml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/qml/SaveButton.qml b/resources/qml/SaveButton.qml index 86339b6795..9b5e3befb0 100644 --- a/resources/qml/SaveButton.qml +++ b/resources/qml/SaveButton.qml @@ -48,7 +48,7 @@ Item { } function sliceOrStopSlicing() { - if ( [ 1, 5 ].indexOf( base.backendState ) != -1 ) + if ([1, 5].indexOf(base.backendState) != -1) { prepareButton.preparingToSlice = true; CuraApplication.backend.forceSlice(); @@ -182,13 +182,13 @@ Item { // 1 = not started, 4 = error, 5 = disabled text: { - if ( preparingToSlice ) + if (preparingToSlice) { return catalog.i18nc("@label:Printjob", "Preparing"); } else { - if ( [ 1, 4, 5 ].indexOf( base.backendState ) != -1 ) + if ([1, 4, 5].indexOf(base.backendState) != -1) { return catalog.i18nc("@label:Printjob", "Prepare"); } @@ -259,11 +259,10 @@ Item { target: UM.Backend onStateChanged: { - if ( [ 2, 3 ].indexOf( UM.Backend.state) != -1 ) + if ([2, 3].indexOf(UM.Backend.state) != -1) { prepareButton.preparingToSlice = false; } - } } } From 6a083e91b0c6b7a2f26466235af3a0a4c8306cec Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 30 Jul 2018 11:05:14 +0200 Subject: [PATCH 40/95] Fix typo. Remove comma. --- resources/bundled_packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/bundled_packages.json b/resources/bundled_packages.json index 40ed0a9aa2..d216415921 100644 --- a/resources/bundled_packages.json +++ b/resources/bundled_packages.json @@ -1383,5 +1383,5 @@ "website": "https://www.vellemanprojects.eu" } } - }, + } } From 7215b8081d64d724ace6967f096c9334eddff556 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 30 Jul 2018 13:08:13 +0200 Subject: [PATCH 41/95] Fix the scrolling when the cursor is hovering the combobox settings. --- resources/qml/Settings/SettingComboBox.qml | 7 ------- resources/qml/Settings/SettingExtruder.qml | 7 ------- resources/qml/Settings/SettingOptionalExtruder.qml | 7 ------- 3 files changed, 21 deletions(-) diff --git a/resources/qml/Settings/SettingComboBox.qml b/resources/qml/Settings/SettingComboBox.qml index 5462c26398..5d283d5ebb 100644 --- a/resources/qml/Settings/SettingComboBox.qml +++ b/resources/qml/Settings/SettingComboBox.qml @@ -20,13 +20,6 @@ SettingItem anchors.fill: parent - MouseArea - { - anchors.fill: parent - acceptedButtons: Qt.NoButton - onWheel: wheel.accepted = true - } - background: Rectangle { color: diff --git a/resources/qml/Settings/SettingExtruder.qml b/resources/qml/Settings/SettingExtruder.qml index 83f06ebc5f..4c00a60d0e 100644 --- a/resources/qml/Settings/SettingExtruder.qml +++ b/resources/qml/Settings/SettingExtruder.qml @@ -71,13 +71,6 @@ SettingItem currentIndex: propertyProvider.properties.value - MouseArea - { - anchors.fill: parent - acceptedButtons: Qt.NoButton - onWheel: wheel.accepted = true; - } - property string color: "#fff" Binding diff --git a/resources/qml/Settings/SettingOptionalExtruder.qml b/resources/qml/Settings/SettingOptionalExtruder.qml index db79468315..2d4f25125f 100644 --- a/resources/qml/Settings/SettingOptionalExtruder.qml +++ b/resources/qml/Settings/SettingOptionalExtruder.qml @@ -76,13 +76,6 @@ SettingItem when: control.model.items.length > 0 } - MouseArea - { - anchors.fill: parent - acceptedButtons: Qt.NoButton - onWheel: wheel.accepted = true; - } - property string color: "#fff" Binding From c036912752df2f47f674c6196f83e9df54f90200 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Mon, 30 Jul 2018 13:31:10 +0200 Subject: [PATCH 42/95] Pressing enter on project window will now open the file dialog to save instead of just closing the window --- resources/qml/WorkspaceSummaryDialog.qml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/qml/WorkspaceSummaryDialog.qml b/resources/qml/WorkspaceSummaryDialog.qml index 079d840ae7..24e94beb88 100644 --- a/resources/qml/WorkspaceSummaryDialog.qml +++ b/resources/qml/WorkspaceSummaryDialog.qml @@ -24,6 +24,10 @@ UM.Dialog signal yes(); + function accept() { // pressing enter will call this function + close(); + yes(); + } onClosing: { @@ -290,4 +294,4 @@ UM.Dialog } } } -} \ No newline at end of file +} From 2584d58904c01f14c7a5fa3ca60717ff60bdf1e9 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 30 Jul 2018 22:51:02 +0200 Subject: [PATCH 43/95] correction extruder --- resources/definitions/tizyx_k25.def.json | 12 +++++++----- .../extruders/tizyx_k25_extruder_0.def.json | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 resources/extruders/tizyx_k25_extruder_0.def.json diff --git a/resources/definitions/tizyx_k25.def.json b/resources/definitions/tizyx_k25.def.json index f460b524a2..55256a29d6 100644 --- a/resources/definitions/tizyx_k25.def.json +++ b/resources/definitions/tizyx_k25.def.json @@ -12,20 +12,22 @@ "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pla", "generic_pla_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ], "preferred_material": "tizyx_pla", "has_machine_quality": true, - "has_materials": true - + "has_materials": true, + "machine_extruder_trains": + { + "0": "tizyx_k25_extruder_0" + } }, "overrides": { + "machine_name": { "default_value": "TiZYX K25" }, "machine_heated_bed": { "default_value": true }, "machine_width": { "default_value": 255 }, "machine_height": { "default_value": 255 }, "machine_depth": { "default_value": 255 }, "machine_center_is_zero": { "default_value": false }, - "machine_nozzle_size": { "default_value": 0.4 }, - "material_diameter": { "default_value": 1.75 }, - "gantry_height": { "default_value": 500 }, + "gantry_height": { "default_value": 500 }, "machine_head_with_fans_polygon": { "default_value": [ [25, 49], diff --git a/resources/extruders/tizyx_k25_extruder_0.def.json b/resources/extruders/tizyx_k25_extruder_0.def.json new file mode 100644 index 0000000000..409198d77c --- /dev/null +++ b/resources/extruders/tizyx_k25_extruder_0.def.json @@ -0,0 +1,16 @@ +{ + "id": "tizyx_k25_extruder_0", + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": { + "machine": "tizyx_k25", + "position": "0" + }, + + "overrides": { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file From 846c55a99d0486bea3623e47412c36d0ab71f0fe Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Tue, 31 Jul 2018 09:47:18 +0200 Subject: [PATCH 44/95] Simplify detection of url-encoded filepatch --- plugins/USBPrinting/USBPrinterOutputDevice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index 6a97a3c163..7c4d85a5cd 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -127,8 +127,8 @@ class USBPrinterOutputDevice(PrinterOutputDevice): @pyqtSlot(str) def updateFirmware(self, file): - # the file path could be qurl encoded. - if file[:7] == "file://": + # the file path could be url-encoded. + if file.startswith("file://"): self._firmware_location = QUrl(file).toLocalFile() else: self._firmware_location = file From 1e2c590c54aa77d7945c6eb4953c4a0d0d823bf7 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 31 Jul 2018 09:50:43 +0200 Subject: [PATCH 45/95] In multi build plate mode objects are now always arranged instead of never. CURA-5606 --- cura/CuraApplication.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 8dd17896bb..9f4ea7b3d3 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1605,8 +1605,7 @@ class CuraApplication(QtApplication): self._currently_loading_files.remove(file_name) self.fileLoaded.emit(file_name) - arrange_objects_on_load = not self.getPreferences().getValue("cura/use_multi_build_plate") - target_build_plate = self.getMultiBuildPlateModel().activeBuildPlate if arrange_objects_on_load else -1 + target_build_plate = self.getMultiBuildPlateModel().activeBuildPlate root = self.getController().getScene().getRoot() fixed_nodes = [] @@ -1660,7 +1659,7 @@ class CuraApplication(QtApplication): if not child.getDecorator(ConvexHullDecorator): child.addDecorator(ConvexHullDecorator()) - if file_extension != "3mf" and arrange_objects_on_load: + if file_extension != "3mf": if node.callDecoration("isSliceable"): # Only check position if it's not already blatantly obvious that it won't fit. if node.getBoundingBox() is None or self._volume.getBoundingBox() is None or node.getBoundingBox().width < self._volume.getBoundingBox().width or node.getBoundingBox().depth < self._volume.getBoundingBox().depth: From e55775175230efeb4a87eeb82d14b9498619dd4c Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 31 Jul 2018 11:31:46 +0200 Subject: [PATCH 46/95] Add the active build plate name to default (not user specified) job name --- cura/PrintInformation.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 41faa7cef8..1e09cd9baa 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -267,6 +267,7 @@ class PrintInformation(QObject): new_active_build_plate = self._multi_build_plate_model.activeBuildPlate if new_active_build_plate != self._active_build_plate: self._active_build_plate = new_active_build_plate + self._updateJobName() self._initVariablesWithBuildPlate(self._active_build_plate) @@ -310,15 +311,18 @@ class PrintInformation(QObject): # Only update the job name when it's not user-specified. if not self._is_user_specified_job_name: if self._pre_sliced: - self._job_name = catalog.i18nc("@label", "Pre-sliced file {0}", base_name) + job_name = catalog.i18nc("@label", "Pre-sliced file {0}", base_name) elif self._application.getInstance().getPreferences().getValue("cura/jobname_prefix"): # Don't add abbreviation if it already has the exact same abbreviation. if base_name.startswith(self._abbr_machine + "_"): - self._job_name = base_name + job_name = base_name else: - self._job_name = self._abbr_machine + "_" + base_name + job_name = self._abbr_machine + "_" + base_name else: - self._job_name = base_name + job_name = base_name + if self._active_build_plate != 0: + job_name += "-{}".format(self._active_build_plate) + self._job_name = job_name self.jobNameChanged.emit() From be177939b56be6dcb605bc4e5c44f01769b546d7 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 31 Jul 2018 17:09:33 +0200 Subject: [PATCH 47/95] Reverts other commit bound to CURA-5563, that was not correct. --- 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 373ddc879c..b767aac7b9 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1074,7 +1074,7 @@ "maximum_value_warning": "top_layers - 1", "type": "int", "value": "0", - "limit_to_extruder": "top_bottom_extruder_nr", + "limit_to_extruder": "roofing_extruder_nr", "settable_per_mesh": true, "enabled": "top_layers > 0" }, From d1b6aa8c375f070f49fdf3b8c216ecf4564bf69e Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 1 Aug 2018 08:33:47 +0200 Subject: [PATCH 48/95] Set the focus in the upper handle in the layer view instead of in the text field. That makes it easier to release the focus by clicking in the main view and use the arrow keys to rotate the view. --- plugins/SimulationView/LayerSlider.qml | 4 ++++ plugins/SimulationView/SimulationSliderLabel.qml | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml index 22f9d91340..ab752419db 100644 --- a/plugins/SimulationView/LayerSlider.qml +++ b/plugins/SimulationView/LayerSlider.qml @@ -67,6 +67,10 @@ Item { activeHandle = handle } + // make sure the upper handle is focussed when pressing the parent handle + // needed to connect the key bindings when switching active handle + onVisibleChanged: if (visible) upperHandleLabel.forceActiveFocus() + // slider track Rectangle { id: track diff --git a/plugins/SimulationView/SimulationSliderLabel.qml b/plugins/SimulationView/SimulationSliderLabel.qml index 8615a382da..94167d001e 100644 --- a/plugins/SimulationView/SimulationSliderLabel.qml +++ b/plugins/SimulationView/SimulationSliderLabel.qml @@ -25,10 +25,6 @@ UM.PointingRectangle { width: valueLabel.width + UM.Theme.getSize("default_margin").width visible: false - // make sure the text field is focussed when pressing the parent handle - // needed to connect the key bindings when switching active handle - onVisibleChanged: if (visible) valueLabel.forceActiveFocus() - color: UM.Theme.getColor("tool_panel_background") borderColor: UM.Theme.getColor("lining") borderWidth: UM.Theme.getSize("default_lining").width From 4406b621a5d3935ca55ba9b737d53127f1a14924 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 1 Aug 2018 08:46:44 +0200 Subject: [PATCH 49/95] Fix quality profiles for Dagoma Neva Magis. Contributes to CURA-5499. --- resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg | 2 +- resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg | 2 +- .../quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg index efdf2f7d32..e52cba165c 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fast.inst.cfg @@ -1,7 +1,7 @@ [general] version = 4 name = Fast -definition = dagoma_neva +definition = dagoma_neva_magis [metadata] setting_version = 5 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg index 50915db112..033cfbc8fa 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_fine.inst.cfg @@ -1,7 +1,7 @@ [general] version = 4 name = Fine -definition = dagoma_neva +definition = dagoma_neva_magis [metadata] setting_version = 5 diff --git a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg index ed67800eac..d07d5b58d5 100644 --- a/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg +++ b/resources/quality/dagoma/dagoma_neva_magis_pla_standard.inst.cfg @@ -1,7 +1,7 @@ [general] version = 4 name = Standard -definition = dagoma_neva +definition = dagoma_neva_magis [metadata] setting_version = 5 From 56437af4d2a892c8789d433d67046de467188314 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 1 Aug 2018 10:50:29 +0200 Subject: [PATCH 50/95] CURA-5613 Don't focus on slider This way arrow keys are able to rotate the viewport --- plugins/SimulationView/LayerSlider.qml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml index ab752419db..22f9d91340 100644 --- a/plugins/SimulationView/LayerSlider.qml +++ b/plugins/SimulationView/LayerSlider.qml @@ -67,10 +67,6 @@ Item { activeHandle = handle } - // make sure the upper handle is focussed when pressing the parent handle - // needed to connect the key bindings when switching active handle - onVisibleChanged: if (visible) upperHandleLabel.forceActiveFocus() - // slider track Rectangle { id: track From b8ec1d0fa768d790b6fb172d212060a9b500f1ae Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 1 Aug 2018 10:52:31 +0200 Subject: [PATCH 51/95] In relative mode, the feedback is still absolute and not relative. CURA-5480 --- plugins/PostProcessingPlugin/scripts/Stretch.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/Stretch.py b/plugins/PostProcessingPlugin/scripts/Stretch.py index 377bc4e8da..9757296041 100644 --- a/plugins/PostProcessingPlugin/scripts/Stretch.py +++ b/plugins/PostProcessingPlugin/scripts/Stretch.py @@ -62,13 +62,12 @@ class GCodeStep(): delta_step_y = _getValue(line, "Y", 0) delta_step_z = _getValue(line, "Z", 0) delta_step_e = _getValue(line, "E", 0) - delta_step_f = _getValue(line, "F", 0) self.step_x += delta_step_x self.step_y += delta_step_y self.step_z += delta_step_z self.step_e += delta_step_e - self.step_f += delta_step_f + self.step_f = _getValue(line, "F", self.step_f) # the feedrate is not relative def copyPosFrom(self, step): """ From d57090c049f43cb5d3f62894bc0bada3ef654b2c Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 1 Aug 2018 12:53:07 +0200 Subject: [PATCH 52/95] Allow the user to change the name and even though the name in the different buildplates will change accordingly to the build plate number. --- cura/PrintInformation.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 1e09cd9baa..21e2040dc1 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -311,18 +311,24 @@ class PrintInformation(QObject): # Only update the job name when it's not user-specified. if not self._is_user_specified_job_name: if self._pre_sliced: - job_name = catalog.i18nc("@label", "Pre-sliced file {0}", base_name) + self._job_name = catalog.i18nc("@label", "Pre-sliced file {0}", base_name) elif self._application.getInstance().getPreferences().getValue("cura/jobname_prefix"): # Don't add abbreviation if it already has the exact same abbreviation. if base_name.startswith(self._abbr_machine + "_"): - job_name = base_name + self._job_name = base_name else: - job_name = self._abbr_machine + "_" + base_name + self._job_name = self._abbr_machine + "_" + base_name else: - job_name = base_name + self._job_name = base_name + + # In case there are several buildplates, a suffix is attached + if self._multi_build_plate_model.maxBuildPlate > 0: + connector = "_#" + suffix = connector + str(self._active_build_plate + 1) + if connector in self._job_name: + self._job_name = self._job_name.split(connector)[0] # get the real name if self._active_build_plate != 0: - job_name += "-{}".format(self._active_build_plate) - self._job_name = job_name + self._job_name += suffix self.jobNameChanged.emit() From aca4ebec50ac4245f2203e10d65325aac24b4ffb Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Wed, 1 Aug 2018 17:03:49 +0200 Subject: [PATCH 53/95] Update version number for quality profile. Contributes to CURA-5610. --- resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg b/resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg index 399a7a51ab..8c6349d27a 100644 --- a/resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg +++ b/resources/quality/tizyx_k25/tizyx_k25_normal.inst.cfg @@ -5,7 +5,7 @@ definition = tizyx_k25 [metadata] quality_type = normal -setting_version = 4 +setting_version = 5 type = quality global_quality = True From c14539d63ae56836ec3840c3bed7f620d53b6573 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Thu, 2 Aug 2018 13:12:01 +0200 Subject: [PATCH 54/95] Fix the sliders that went out of range when using the arrow keys. --- plugins/SimulationView/LayerSlider.qml | 24 ++++++++++++++++++------ plugins/SimulationView/PathSlider.qml | 11 +++++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml index 22f9d91340..d7e22d601e 100644 --- a/plugins/SimulationView/LayerSlider.qml +++ b/plugins/SimulationView/LayerSlider.qml @@ -40,33 +40,41 @@ Item { property bool layersVisible: true - function getUpperValueFromSliderHandle () { + function getUpperValueFromSliderHandle() { return upperHandle.getValue() } - function setUpperValue (value) { + function setUpperValue(value) { upperHandle.setValue(value) updateRangeHandle() } - function getLowerValueFromSliderHandle () { + function getLowerValueFromSliderHandle() { return lowerHandle.getValue() } - function setLowerValue (value) { + function setLowerValue(value) { lowerHandle.setValue(value) updateRangeHandle() } - function updateRangeHandle () { + function updateRangeHandle() { rangeHandle.height = lowerHandle.y - (upperHandle.y + upperHandle.height) } // set the active handle to show only one label at a time - function setActiveHandle (handle) { + function setActiveHandle(handle) { activeHandle = handle } + function normalizeValue(value) { + if (value > sliderRoot.maximumValue) + return sliderRoot.maximumValue + else if (value < sliderRoot.minimumValue) + return sliderRoot.minimumValue + return value + } + // slider track Rectangle { id: track @@ -188,6 +196,8 @@ Item { // set the slider position based on the upper value function setValue (value) { + // Normalize values between range, since using arrow keys will create out-of-the-range values + value = sliderRoot.normalizeValue(value) UM.SimulationView.setCurrentLayer(value) @@ -274,6 +284,8 @@ Item { // set the slider position based on the lower value function setValue (value) { + // Normalize values between range, since using arrow keys will create out-of-the-range values + value = sliderRoot.normalizeValue(value) UM.SimulationView.setMinimumLayer(value) diff --git a/plugins/SimulationView/PathSlider.qml b/plugins/SimulationView/PathSlider.qml index 0a4af904aa..a73cacee69 100644 --- a/plugins/SimulationView/PathSlider.qml +++ b/plugins/SimulationView/PathSlider.qml @@ -29,6 +29,7 @@ Item { // value properties property real maximumValue: 100 + property real minimumValue: 0 property bool roundValues: true property real handleValue: maximumValue @@ -47,6 +48,14 @@ Item { rangeHandle.width = handle.x - sliderRoot.handleSize } + function normalizeValue(value) { + if (value > sliderRoot.maximumValue) + return sliderRoot.maximumValue + else if (value < sliderRoot.minimumValue) + return sliderRoot.minimumValue + return value + } + // slider track Rectangle { id: track @@ -110,6 +119,8 @@ Item { // set the slider position based on the value function setValue (value) { + // Normalize values between range, since using arrow keys will create out-of-the-range values + value = sliderRoot.normalizeValue(value) UM.SimulationView.setCurrentPath(value) From 7157118889d2520b1fa630092d10e03eadb351a2 Mon Sep 17 00:00:00 2001 From: milkok Date: Fri, 3 Aug 2018 09:53:25 +0800 Subject: [PATCH 55/95] Update winbo_mini2.def.json --- resources/definitions/winbo_mini2.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/winbo_mini2.def.json b/resources/definitions/winbo_mini2.def.json index 85c5a445bd..7393fdf910 100644 --- a/resources/definitions/winbo_mini2.def.json +++ b/resources/definitions/winbo_mini2.def.json @@ -1,6 +1,6 @@ { "version": 2, - "name": "Winbo FDM-Mini2", + "name": "Winbo Mini2", "inherits": "fdmprinter", "metadata": { "author": "Winbo", @@ -16,7 +16,7 @@ }, "overrides": { - "machine_name": { "default_value": "Winbo FDM-Mini2" }, + "machine_name": { "default_value": "Winbo Mini2" }, "machine_width": { "default_value": 205 }, "machine_depth": { "default_value": 155 }, "machine_height": { "default_value": 205 }, From 85575f67820570c3188965a0b464aeec8b86723b Mon Sep 17 00:00:00 2001 From: milkok Date: Fri, 3 Aug 2018 09:58:23 +0800 Subject: [PATCH 56/95] Update winbo_dragonl4.def.json --- resources/definitions/winbo_dragonl4.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/winbo_dragonl4.def.json b/resources/definitions/winbo_dragonl4.def.json index 5aa004414a..0ca68cdcee 100644 --- a/resources/definitions/winbo_dragonl4.def.json +++ b/resources/definitions/winbo_dragonl4.def.json @@ -1,6 +1,6 @@ { "version": 2, - "name": "Winbo FDM-Dragon(L)4", + "name": "Winbo Dragon(L)4", "inherits": "fdmprinter", "metadata": { "author": "Winbo", @@ -16,7 +16,7 @@ }, "overrides": { - "machine_name": { "default_value": "Winbo FDM-Dragon(L)4" }, + "machine_name": { "default_value": "Winbo Dragon(L)4" }, "machine_width": { "default_value": 615 }, "machine_depth": { "default_value": 463 }, "machine_height": { "default_value": 615 }, From 1a189ba4f5be0d0a377ddcdd8671e0a59b5d7533 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 3 Aug 2018 09:13:19 +0200 Subject: [PATCH 57/95] Simplify normalization formula. --- plugins/SimulationView/LayerSlider.qml | 6 +----- plugins/SimulationView/PathSlider.qml | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/plugins/SimulationView/LayerSlider.qml b/plugins/SimulationView/LayerSlider.qml index d7e22d601e..6dcaa3f475 100644 --- a/plugins/SimulationView/LayerSlider.qml +++ b/plugins/SimulationView/LayerSlider.qml @@ -68,11 +68,7 @@ Item { } function normalizeValue(value) { - if (value > sliderRoot.maximumValue) - return sliderRoot.maximumValue - else if (value < sliderRoot.minimumValue) - return sliderRoot.minimumValue - return value + return Math.min(Math.max(value, sliderRoot.minimumValue), sliderRoot.maximumValue) } // slider track diff --git a/plugins/SimulationView/PathSlider.qml b/plugins/SimulationView/PathSlider.qml index a73cacee69..999912e3ba 100644 --- a/plugins/SimulationView/PathSlider.qml +++ b/plugins/SimulationView/PathSlider.qml @@ -49,11 +49,7 @@ Item { } function normalizeValue(value) { - if (value > sliderRoot.maximumValue) - return sliderRoot.maximumValue - else if (value < sliderRoot.minimumValue) - return sliderRoot.minimumValue - return value + return Math.min(Math.max(value, sliderRoot.minimumValue), sliderRoot.maximumValue) } // slider track From 1a050968a51f6f1e91e9ff72a8b856b2510ecc28 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 10:51:01 +0200 Subject: [PATCH 58/95] Clear out old gcode This way if you move the model, and don't hit prepare again, you can end up exporting the old gcode again thinking its new gcode. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index beec374d8d..796495fef8 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -541,6 +541,9 @@ class CuraEngineBackend(QObject, Backend): ## Remove old layer data (if any) def _clearLayerData(self, build_plate_numbers: Set = None) -> None: + # Clear out any old gcode + self._scene.gcode_dict = {} # type: dict + for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax. if node.callDecoration("getLayerData"): if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers: From 1d0e88dc161844f4342176b1da4b810348bf0ba0 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 11:00:56 +0200 Subject: [PATCH 59/95] Fix typing issue --- plugins/CuraEngineBackend/CuraEngineBackend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 796495fef8..56763a6632 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -542,7 +542,7 @@ class CuraEngineBackend(QObject, Backend): ## Remove old layer data (if any) def _clearLayerData(self, build_plate_numbers: Set = None) -> None: # Clear out any old gcode - self._scene.gcode_dict = {} # type: dict + self._scene.gcode_dict = {} # type: ignore for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax. if node.callDecoration("getLayerData"): From aadbebd4572c8be0886c9a78c99daa89ba45a52d Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 3 Aug 2018 11:13:35 +0200 Subject: [PATCH 60/95] After enabling the video strem from a printer the first image is Null CURA-5612 --- cura/CameraImageProvider.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cura/CameraImageProvider.py b/cura/CameraImageProvider.py index ddf978f625..428b174ed4 100644 --- a/cura/CameraImageProvider.py +++ b/cura/CameraImageProvider.py @@ -12,7 +12,13 @@ class CameraImageProvider(QQuickImageProvider): def requestImage(self, id, size): for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): try: - return output_device.activePrinter.camera.getImage(), QSize(15, 15) + + image = output_device.activePrinter.camera.getImage() + + if image.isNull(): + return QImage(), QSize(15, 15) + + return image, QSize(15, 15) except AttributeError: pass return QImage(), QSize(15, 15) \ No newline at end of file From bcedef3bbeffbe3317fbb49b43bd97efd9860d2a Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 11:38:42 +0200 Subject: [PATCH 61/95] Continue scrolling over compatibility charts Contributes to CURA-5598 --- .../Toolbox/resources/qml/ToolboxCompatibilityChart.qml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml index 4978af6168..f4ee82e7cf 100644 --- a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml +++ b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml @@ -29,6 +29,14 @@ Item anchors.topMargin: UM.Theme.getSize("default_margin").height width: parent.width frameVisible: false + + // Workaround for scroll issues (QTBUG-49652) + flickableItem.interactive: false + Component.onCompleted: { + for (var i = 0; i < flickableItem.children.length; ++i) { + flickableItem.children[i].enabled = false + } + } selectionMode: 0 model: packageData.supported_configs headerDelegate: Rectangle From c47de049830f236ebbfd2479a59c8a4b585c5a66 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 11:41:08 +0200 Subject: [PATCH 62/95] Fix bracket style Contributes to CURA-5598 --- plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml index f4ee82e7cf..1efcde2110 100644 --- a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml +++ b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml @@ -32,8 +32,10 @@ Item // Workaround for scroll issues (QTBUG-49652) flickableItem.interactive: false - Component.onCompleted: { - for (var i = 0; i < flickableItem.children.length; ++i) { + Component.onCompleted: + { + for (var i = 0; i < flickableItem.children.length; ++i) + { flickableItem.children[i].enabled = false } } From 9c8ac6e9ed25a52e9370f520fae703404be7f6c5 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 3 Aug 2018 11:42:55 +0200 Subject: [PATCH 63/95] After switching the Monitor Tab set Null to active output printer CURA-5612 --- plugins/UM3NetworkPrinting/ClusterMonitorItem.qml | 11 +++++++++++ plugins/UM3NetworkPrinting/PrinterVideoStream.qml | 10 ++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index 86bdaae0a5..c21ff3f472 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -9,6 +9,7 @@ Component { Rectangle { + id: rectangle width: maximumWidth height: maximumHeight color: UM.Theme.getColor("viewport_background") @@ -103,5 +104,15 @@ Component visible: OutputDevice.activePrinter != null anchors.fill:parent } + + onVisibleChanged: + { + if(rectangle != null && !rectangle.visible) + { + // After switching the Tab ensure that active printer is Null, the video stream image + // might be active + OutputDevice.setActivePrinter(null) + } + } } } diff --git a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml index 7f7b2ad546..e34924ba88 100644 --- a/plugins/UM3NetworkPrinting/PrinterVideoStream.qml +++ b/plugins/UM3NetworkPrinting/PrinterVideoStream.qml @@ -89,9 +89,11 @@ Item MouseArea { - anchors.fill: cameraImage - onClicked: { /* no-op */ } - z: 1 + anchors.fill: cameraImage + onClicked: + { + OutputDevice.setActivePrinter(null) + } + z: 1 } - } From 38a0c9b66de36f46390b42834f595557a56d1df0 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 3 Aug 2018 12:02:11 +0200 Subject: [PATCH 64/95] Add some extra information when the Cura can't write the files. --- plugins/3MFWriter/ThreeMFWriter.py | 4 ++++ plugins/GCodeGzWriter/GCodeGzWriter.py | 8 +++++++- plugins/GCodeWriter/GCodeWriter.py | 5 +++++ plugins/UFPWriter/UFPWriter.py | 10 +++++++++- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/plugins/3MFWriter/ThreeMFWriter.py b/plugins/3MFWriter/ThreeMFWriter.py index 8d54f475d6..640aabd30c 100644 --- a/plugins/3MFWriter/ThreeMFWriter.py +++ b/plugins/3MFWriter/ThreeMFWriter.py @@ -25,6 +25,9 @@ except ImportError: import zipfile import UM.Application +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + class ThreeMFWriter(MeshWriter): def __init__(self): @@ -173,6 +176,7 @@ class ThreeMFWriter(MeshWriter): archive.writestr(relations_file, b' \n' + ET.tostring(relations_element)) except Exception as e: Logger.logException("e", "Error writing zip file") + self.setInformation(catalog.i18nc("@error:zip", "Error writing 3mf file.")) return False finally: if not self._store_archive: diff --git a/plugins/GCodeGzWriter/GCodeGzWriter.py b/plugins/GCodeGzWriter/GCodeGzWriter.py index 6ddecdb0bd..e191a9c427 100644 --- a/plugins/GCodeGzWriter/GCodeGzWriter.py +++ b/plugins/GCodeGzWriter/GCodeGzWriter.py @@ -10,6 +10,9 @@ from UM.Mesh.MeshWriter import MeshWriter #The class we're extending/implementin from UM.PluginRegistry import PluginRegistry from UM.Scene.SceneNode import SceneNode #For typing. +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + ## A file writer that writes gzipped g-code. # # If you're zipping g-code, you might as well use gzip! @@ -28,12 +31,15 @@ class GCodeGzWriter(MeshWriter): def write(self, stream: BufferedIOBase, nodes: List[SceneNode], mode = MeshWriter.OutputMode.BinaryMode) -> bool: if mode != MeshWriter.OutputMode.BinaryMode: Logger.log("e", "GCodeGzWriter does not support text mode.") + self.setInformation(catalog.i18nc("@error:not supported", "GCodeGzWriter does not support text mode.")) return False #Get the g-code from the g-code writer. gcode_textio = StringIO() #We have to convert the g-code into bytes. - success = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter")).write(gcode_textio, None) + gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter")) + success = gcode_writer.write(gcode_textio, None) if not success: #Writing the g-code failed. Then I can also not write the gzipped g-code. + self.setInformation(gcode_writer.getInformation()) return False result = gzip.compress(gcode_textio.getvalue().encode("utf-8")) diff --git a/plugins/GCodeWriter/GCodeWriter.py b/plugins/GCodeWriter/GCodeWriter.py index aea0698d19..59e9a29691 100644 --- a/plugins/GCodeWriter/GCodeWriter.py +++ b/plugins/GCodeWriter/GCodeWriter.py @@ -12,6 +12,8 @@ from UM.Settings.InstanceContainer import InstanceContainer from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") ## Writes g-code to a file. # @@ -62,11 +64,13 @@ class GCodeWriter(MeshWriter): def write(self, stream, nodes, mode = MeshWriter.OutputMode.TextMode): if mode != MeshWriter.OutputMode.TextMode: Logger.log("e", "GCodeWriter does not support non-text mode.") + self.setInformation(catalog.i18nc("@error:not supported", "GCodeWriter does not support non-text mode.")) return False active_build_plate = Application.getInstance().getMultiBuildPlateModel().activeBuildPlate scene = Application.getInstance().getController().getScene() if not hasattr(scene, "gcode_dict"): + self.setInformation(catalog.i18nc("@warning:status", "Please generate G-code before saving.")) return False gcode_dict = getattr(scene, "gcode_dict") gcode_list = gcode_dict.get(active_build_plate, None) @@ -82,6 +86,7 @@ class GCodeWriter(MeshWriter): stream.write(settings) return True + self.setInformation(catalog.i18nc("@warning:status", "Please generate G-code before saving.")) return False ## Create a new container with container 2 as base and container 1 written over it. diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index aca293e25a..9344bf54da 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -1,5 +1,6 @@ #Copyright (c) 2018 Ultimaker B.V. #Cura is released under the terms of the LGPLv3 or higher. +from typing import cast from Charon.VirtualFile import VirtualFile #To open UFP files. from Charon.OpenMode import OpenMode #To indicate that we want to write to UFP files. @@ -13,6 +14,9 @@ from PyQt5.QtCore import QBuffer from cura.Snapshot import Snapshot +from UM.i18n import i18nCatalog +catalog = i18nCatalog("cura") + class UFPWriter(MeshWriter): def __init__(self): @@ -32,7 +36,11 @@ class UFPWriter(MeshWriter): #Store the g-code from the scene. archive.addContentType(extension = "gcode", mime_type = "text/x-gcode") gcode_textio = StringIO() #We have to convert the g-code into bytes. - PluginRegistry.getInstance().getPluginObject("GCodeWriter").write(gcode_textio, None) + gcode_writer = cast(MeshWriter, PluginRegistry.getInstance().getPluginObject("GCodeWriter")) + success = gcode_writer.write(gcode_textio, None) + if not success: #Writing the g-code failed. Then I can also not write the gzipped g-code. + self.setInformation(gcode_writer.getInformation()) + return False gcode = archive.getStream("/3D/model.gcode") gcode.write(gcode_textio.getvalue().encode("UTF-8")) archive.addRelation(virtual_path = "/3D/model.gcode", relation_type = "http://schemas.ultimaker.org/package/2018/relationships/gcode") From 977c0958a337505b3ef982bc6d77c11e5b8614b6 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 3 Aug 2018 13:40:54 +0200 Subject: [PATCH 65/95] The manually added priters by IP have "(manual) suffix --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 7 +------ plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index 8ecbe016f1..e4d75e8f6d 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -349,11 +349,6 @@ Cura.MachineAction addressField.focus = true; } - onAccepted: - { - manager.setManualDevice(printerKey, addressText) - } - Column { anchors.fill: parent spacing: UM.Theme.getSize("default_margin").height @@ -393,7 +388,7 @@ Cura.MachineAction text: catalog.i18nc("@action:button", "OK") onClicked: { - manualPrinterDialog.accept() + manager.setManualDevice(manualPrinterDialog.printerKey, manualPrinterDialog.addressText) manualPrinterDialog.hide() } enabled: manualPrinterDialog.addressText.trim() != "" diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 3644bbf056..f4749a6747 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -198,7 +198,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): 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"name": (system_info["name"] + " (manual)").encode("utf-8"), b"address": address.encode("utf-8"), b"firmware_version": system_info["firmware"].encode("utf-8"), b"manual": b"true", From 38ce73365a8315e0b5ccaa52dab3b5dc49ac8469 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 3 Aug 2018 13:45:08 +0200 Subject: [PATCH 66/95] Manually added printers have suffix "( manual)" --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 7 +------ plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index 8ecbe016f1..e4d75e8f6d 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -349,11 +349,6 @@ Cura.MachineAction addressField.focus = true; } - onAccepted: - { - manager.setManualDevice(printerKey, addressText) - } - Column { anchors.fill: parent spacing: UM.Theme.getSize("default_margin").height @@ -393,7 +388,7 @@ Cura.MachineAction text: catalog.i18nc("@action:button", "OK") onClicked: { - manualPrinterDialog.accept() + manager.setManualDevice(manualPrinterDialog.printerKey, manualPrinterDialog.addressText) manualPrinterDialog.hide() } enabled: manualPrinterDialog.addressText.trim() != "" diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index 3644bbf056..f4749a6747 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -198,7 +198,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): 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"name": (system_info["name"] + " (manual)").encode("utf-8"), b"address": address.encode("utf-8"), b"firmware_version": system_info["firmware"].encode("utf-8"), b"manual": b"true", From 99cb9e93b30fcc8ca061ef379d0df81b7b9ba1d4 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Fri, 3 Aug 2018 13:46:22 +0200 Subject: [PATCH 67/95] Revert "The manually added priters by IP have "(manual) suffix" This reverts commit 977c0958a337505b3ef982bc6d77c11e5b8614b6. --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 7 ++++++- plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index e4d75e8f6d..8ecbe016f1 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -349,6 +349,11 @@ Cura.MachineAction addressField.focus = true; } + onAccepted: + { + manager.setManualDevice(printerKey, addressText) + } + Column { anchors.fill: parent spacing: UM.Theme.getSize("default_margin").height @@ -388,7 +393,7 @@ Cura.MachineAction text: catalog.i18nc("@action:button", "OK") onClicked: { - manager.setManualDevice(manualPrinterDialog.printerKey, manualPrinterDialog.addressText) + manualPrinterDialog.accept() manualPrinterDialog.hide() } enabled: manualPrinterDialog.addressText.trim() != "" diff --git a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py index f4749a6747..3644bbf056 100644 --- a/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py +++ b/plugins/UM3NetworkPrinting/UM3OutputDevicePlugin.py @@ -198,7 +198,7 @@ class UM3OutputDevicePlugin(OutputDevicePlugin): has_cluster_capable_firmware = Version(system_info["firmware"]) > self._min_cluster_version instance_name = "manual:%s" % address properties = { - b"name": (system_info["name"] + " (manual)").encode("utf-8"), + 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", From ea8d10783ce1e3ba58309c2e5fe1cdbb6654c0a3 Mon Sep 17 00:00:00 2001 From: DavidGergely Date: Fri, 3 Aug 2018 14:12:36 +0200 Subject: [PATCH 68/95] Cura-5457 prime tower settings New settings for the prime towers for all profiles expect PP0.8 printcore --- resources/definitions/fdmprinter.def.json | 2 +- .../quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg | 2 -- .../quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg | 2 -- resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.25_ABS_Normal_Quality.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg | 2 -- .../quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg | 1 - resources/variants/ultimaker3_bb0.8.inst.cfg | 1 - resources/variants/ultimaker3_bb04.inst.cfg | 1 - resources/variants/ultimaker3_extended_bb0.8.inst.cfg | 1 - resources/variants/ultimaker3_extended_bb04.inst.cfg | 1 - resources/variants/ultimaker_s5_bb0.8.inst.cfg | 1 - resources/variants/ultimaker_s5_bb04.inst.cfg | 1 - 17 files changed, 1 insertion(+), 21 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b767aac7b9..daf09d2701 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5057,7 +5057,7 @@ "description": "The minimum volume for each layer of the prime tower in order to purge enough material.", "unit": "mm³", "type": "float", - "default_value": 5, + "default_value": 6, "minimum_value": "0", "maximum_value_warning": "((resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height') if prime_tower_circular else resolveOrValue('prime_tower_size') ** 2 * resolveOrValue('layer_height')) - sum(extruderValues('prime_tower_min_volume')) + prime_tower_min_volume", "enabled": "resolveOrValue('prime_tower_enable')", diff --git a/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg index 428f5c1101..5139a1fea8 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_ABS_Normal_Quality.inst.cfg @@ -15,8 +15,6 @@ variant = AA 0.25 cool_fan_speed = 40 infill_overlap = 15 material_final_print_temperature = =material_print_temperature - 5 -prime_tower_size = 12 -prime_tower_min_volume = 2 retraction_prime_speed = 25 speed_topbottom = =math.ceil(speed_print * 30 / 55) wall_thickness = 0.92 diff --git a/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg index 127032e118..4e81b4f39e 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_CPE_Normal_Quality.inst.cfg @@ -12,8 +12,6 @@ material = generic_cpe variant = AA 0.25 [values] -prime_tower_size = 12 -prime_tower_min_volume = 2 retraction_extrusion_window = 0.5 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg index 1d5cea601f..b6e6fdecb6 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Draft_Print.inst.cfg @@ -34,7 +34,6 @@ material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 -prime_tower_min_volume = 10 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg index 0c94b64159..b64d37310e 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -35,7 +35,6 @@ material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 -prime_tower_min_volume = 15 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 diff --git a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg index 50282f8b49..d9e8f9ec2e 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -34,7 +34,6 @@ material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 -prime_tower_min_volume = 20 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_ABS_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_ABS_Normal_Quality.inst.cfg index e58a1bd87d..f2e05b08e8 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_ABS_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_ABS_Normal_Quality.inst.cfg @@ -15,8 +15,6 @@ variant = AA 0.25 cool_fan_speed = 40 infill_overlap = 15 material_final_print_temperature = =material_print_temperature - 5 -prime_tower_size = 12 -prime_tower_min_volume = 2 retraction_prime_speed = 25 speed_topbottom = =math.ceil(speed_print * 30 / 55) wall_thickness = 0.92 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg index 1c1833a385..2068ed51c0 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg @@ -12,8 +12,6 @@ material = generic_cpe variant = AA 0.25 [values] -prime_tower_size = 12 -prime_tower_min_volume = 2 retraction_extrusion_window = 0.5 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg index f88da43ac1..e8c58ce32c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Draft_Print.inst.cfg @@ -32,7 +32,6 @@ material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 -prime_tower_min_volume = 10 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg index 2967f3539b..ff723c4ed4 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Superdraft_Print.inst.cfg @@ -33,7 +33,6 @@ material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 -prime_tower_min_volume = 20 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg index caa87f9437..7e36e9d354 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_TPU_Verydraft_Print.inst.cfg @@ -32,7 +32,6 @@ material_standby_temperature = 100 multiple_mesh_overlap = 0.2 prime_tower_enable = True prime_tower_flow = 100 -prime_tower_min_volume = 15 retract_at_layer_change = False retraction_count_max = 12 retraction_extra_prime_amount = 0.5 diff --git a/resources/variants/ultimaker3_bb0.8.inst.cfg b/resources/variants/ultimaker3_bb0.8.inst.cfg index 9ad4284b40..ace0bf3a94 100644 --- a/resources/variants/ultimaker3_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_bb0.8.inst.cfg @@ -40,7 +40,6 @@ material_print_temperature = =default_material_print_temperature + 10 material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False -prime_tower_min_volume = 20 prime_tower_wipe_enabled = True raft_acceleration = =acceleration_layer_0 raft_airgap = 0 diff --git a/resources/variants/ultimaker3_bb04.inst.cfg b/resources/variants/ultimaker3_bb04.inst.cfg index f07a4a55f9..d571cabc9b 100644 --- a/resources/variants/ultimaker3_bb04.inst.cfg +++ b/resources/variants/ultimaker3_bb04.inst.cfg @@ -22,7 +22,6 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 machine_nozzle_tip_outer_diameter = 1.0 -prime_tower_min_volume = 15 raft_base_speed = 20 raft_interface_speed = 20 raft_speed = 25 diff --git a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg index d7a76d538a..fe760c93b8 100644 --- a/resources/variants/ultimaker3_extended_bb0.8.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb0.8.inst.cfg @@ -40,7 +40,6 @@ material_print_temperature = =default_material_print_temperature + 10 material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False -prime_tower_min_volume = 20 prime_tower_wipe_enabled = True raft_acceleration = =acceleration_layer_0 raft_airgap = 0 diff --git a/resources/variants/ultimaker3_extended_bb04.inst.cfg b/resources/variants/ultimaker3_extended_bb04.inst.cfg index 6e882cfa04..742dc9896e 100644 --- a/resources/variants/ultimaker3_extended_bb04.inst.cfg +++ b/resources/variants/ultimaker3_extended_bb04.inst.cfg @@ -22,7 +22,6 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 machine_nozzle_tip_outer_diameter = 1.0 -prime_tower_min_volume = 15 raft_base_speed = 20 raft_interface_speed = 20 raft_speed = 25 diff --git a/resources/variants/ultimaker_s5_bb0.8.inst.cfg b/resources/variants/ultimaker_s5_bb0.8.inst.cfg index 6b954041ab..c1c5c1a10b 100644 --- a/resources/variants/ultimaker_s5_bb0.8.inst.cfg +++ b/resources/variants/ultimaker_s5_bb0.8.inst.cfg @@ -40,7 +40,6 @@ material_print_temperature = =default_material_print_temperature + 10 material_standby_temperature = 100 multiple_mesh_overlap = 0 prime_tower_enable = False -prime_tower_min_volume = 20 prime_tower_wipe_enabled = True raft_acceleration = =acceleration_layer_0 raft_airgap = 0 diff --git a/resources/variants/ultimaker_s5_bb04.inst.cfg b/resources/variants/ultimaker_s5_bb04.inst.cfg index 634920ca65..b5ff8d51f6 100644 --- a/resources/variants/ultimaker_s5_bb04.inst.cfg +++ b/resources/variants/ultimaker_s5_bb04.inst.cfg @@ -22,7 +22,6 @@ jerk_support_bottom = =math.ceil(jerk_support_interface * 1 / 10) machine_nozzle_heat_up_speed = 1.5 machine_nozzle_id = BB 0.4 machine_nozzle_tip_outer_diameter = 1.0 -prime_tower_min_volume = 20 raft_base_speed = 20 raft_interface_speed = 20 raft_speed = 25 From 2a6da9fe8ea901aaa3942b20363285ec78fe55c8 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 14:28:45 +0200 Subject: [PATCH 69/95] Only show material packages when clicking an author Contributes to CURA-5604 --- .../resources/qml/ToolboxDownloadsGridTile.qml | 4 ++++ plugins/Toolbox/src/Toolbox.py | 11 ++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml index 392b867071..f7b964b957 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml @@ -115,6 +115,10 @@ Item { toolbox.viewPage = "author" toolbox.filterModelByProp("packages", "author_id", model.id) + toolbox.setFilters("packages", { + "author_id": model.id, + "type": "material" + }) } break default: diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index a9d0bb03d1..fbc2f98b3b 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -783,7 +783,16 @@ class Toolbox(QObject, Extension): self._models[modelType].setFilter({ filterType: parameter }) self.filterChanged.emit() - @pyqtSlot() + @pyqtSlot(str, "QVariantMap") + def setFilters(self, modelType: str, filterDict: dict): + if not self._models[modelType]: + Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", modelType) + return + print(filterDict) + self._models[modelType].setFilter(filterDict) + self.filterChanged.emit() + + @pyqtSlot(str) def removeFilters(self, modelType: str): if not self._models[modelType]: Logger.log("w", "Toolbox: Couldn't remove filters on %s model because it doesn't exist.", modelType) From 7856e4746711c648a24d34b25a9d95f821495763 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 14:30:49 +0200 Subject: [PATCH 70/95] Remove old filtering Contributes to CURA-5604 --- plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml index f7b964b957..ebd4c006f8 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGridTile.qml @@ -114,7 +114,6 @@ Item else { toolbox.viewPage = "author" - toolbox.filterModelByProp("packages", "author_id", model.id) toolbox.setFilters("packages", { "author_id": model.id, "type": "material" From 8268419eda658541ca03e793047a0ff064954aad Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 14:31:30 +0200 Subject: [PATCH 71/95] Remove debug print() Contributes to CURA-5604 --- plugins/Toolbox/src/Toolbox.py | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index fbc2f98b3b..e948236baf 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -788,7 +788,6 @@ class Toolbox(QObject, Extension): if not self._models[modelType]: Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", modelType) return - print(filterDict) self._models[modelType].setFilter(filterDict) self.filterChanged.emit() From 20806eeb72afeae35b33808381986978a982088c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 3 Aug 2018 14:37:09 +0200 Subject: [PATCH 72/95] Refactor some code CURA-5612 --- cura/CameraImageProvider.py | 9 ++++----- plugins/UM3NetworkPrinting/ClusterMonitorItem.qml | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cura/CameraImageProvider.py b/cura/CameraImageProvider.py index 428b174ed4..ff5c51f24b 100644 --- a/cura/CameraImageProvider.py +++ b/cura/CameraImageProvider.py @@ -4,21 +4,20 @@ from PyQt5.QtCore import QSize from UM.Application import Application + class CameraImageProvider(QQuickImageProvider): def __init__(self): - QQuickImageProvider.__init__(self, QQuickImageProvider.Image) + super().__init__(QQuickImageProvider.Image) ## Request a new image. def requestImage(self, id, size): for output_device in Application.getInstance().getOutputDeviceManager().getOutputDevices(): try: - image = output_device.activePrinter.camera.getImage() - if image.isNull(): - return QImage(), QSize(15, 15) + image = QImage() return image, QSize(15, 15) except AttributeError: pass - return QImage(), QSize(15, 15) \ No newline at end of file + return QImage(), QSize(15, 15) diff --git a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml index c21ff3f472..0e86d55de8 100644 --- a/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterMonitorItem.qml @@ -9,7 +9,7 @@ Component { Rectangle { - id: rectangle + id: monitorFrame width: maximumWidth height: maximumHeight color: UM.Theme.getColor("viewport_background") @@ -107,7 +107,7 @@ Component onVisibleChanged: { - if(rectangle != null && !rectangle.visible) + if (!monitorFrame.visible) { // After switching the Tab ensure that active printer is Null, the video stream image // might be active From 1bacdabf358ae8a52342aca8b29263cc680c42f2 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 3 Aug 2018 14:42:34 +0200 Subject: [PATCH 73/95] Minor refactor --- plugins/Toolbox/src/Toolbox.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index e948236baf..c4205b8ed5 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -776,25 +776,25 @@ class Toolbox(QObject, Extension): # Filter Models: # -------------------------------------------------------------------------- @pyqtSlot(str, str, str) - def filterModelByProp(self, modelType: str, filterType: str, parameter: str): - if not self._models[modelType]: - Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", modelType) + def filterModelByProp(self, model_type: str, filter_type: str, parameter: str) -> None: + if not self._models[model_type]: + Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", model_type) return - self._models[modelType].setFilter({ filterType: parameter }) + self._models[model_type].setFilter({filter_type: parameter}) self.filterChanged.emit() @pyqtSlot(str, "QVariantMap") - def setFilters(self, modelType: str, filterDict: dict): - if not self._models[modelType]: - Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", modelType) + def setFilters(self, model_type: str, filter_dict: dict) -> None: + if not self._models[model_type]: + Logger.log("w", "Toolbox: Couldn't filter %s model because it doesn't exist.", model_type) return - self._models[modelType].setFilter(filterDict) + self._models[model_type].setFilter(filter_dict) self.filterChanged.emit() @pyqtSlot(str) - def removeFilters(self, modelType: str): - if not self._models[modelType]: - Logger.log("w", "Toolbox: Couldn't remove filters on %s model because it doesn't exist.", modelType) + def removeFilters(self, model_type: str) -> None: + if not self._models[model_type]: + Logger.log("w", "Toolbox: Couldn't remove filters on %s model because it doesn't exist.", model_type) return - self._models[modelType].setFilter({}) + self._models[model_type].setFilter({}) self.filterChanged.emit() From 944ababa1cb44e7c33249e81692ce2a5c8d5994e Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 3 Aug 2018 14:48:04 +0200 Subject: [PATCH 74/95] Copy normal tile behavior to showcase tiles Contributes to CURA-5604 --- .../qml/ToolboxDownloadsShowcaseTile.qml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml index 2ca0b522fe..15d1ae302c 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsShowcaseTile.qml @@ -105,8 +105,21 @@ Rectangle switch(toolbox.viewCategory) { case "material": - toolbox.viewPage = "author" - toolbox.filterModelByProp("packages", "author_name", model.name) + + // If model has a type, it must be a package + if (model.type !== undefined) + { + toolbox.viewPage = "detail" + toolbox.filterModelByProp("packages", "id", model.id) + } + else + { + toolbox.viewPage = "author" + toolbox.setFilters("packages", { + "author_id": model.id, + "type": "material" + }) + } break default: toolbox.viewPage = "detail" From 4491d5164a91b6ba5d5b4fe9b6fa7ba3daedb81b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 6 Aug 2018 09:24:48 +0200 Subject: [PATCH 75/95] Fix the gcode start/end formatter. Fixes #4181. --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index eb392de121..76ff1cfc85 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -41,7 +41,7 @@ class StartJobResult(IntEnum): ## Formatter class that handles token expansion in start/end gcode class GcodeStartEndFormatter(Formatter): - def get_value(self, key: str, *args: str, default_extruder_nr: str = "-1", **kwargs) -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class] + def get_value(self, key: str, args: str, kwargs: Dict[int, Dict[str, Any]], default_extruder_nr: str = "-1") -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class] # The kwargs dictionary contains a dictionary for each stack (with a string of the extruder_nr as their key), # and a default_extruder_nr to use when no extruder_nr is specified From bfaaa4a47103da633ce57a34862eb8fd61282944 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Mon, 6 Aug 2018 09:32:12 +0200 Subject: [PATCH 76/95] Fix code-style --- plugins/CuraEngineBackend/StartSliceJob.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py index 76ff1cfc85..0ebcafdbb2 100644 --- a/plugins/CuraEngineBackend/StartSliceJob.py +++ b/plugins/CuraEngineBackend/StartSliceJob.py @@ -41,7 +41,7 @@ class StartJobResult(IntEnum): ## Formatter class that handles token expansion in start/end gcode class GcodeStartEndFormatter(Formatter): - def get_value(self, key: str, args: str, kwargs: Dict[int, Dict[str, Any]], default_extruder_nr: str = "-1") -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class] + def get_value(self, key: str, args: str, kwargs: dict, default_extruder_nr: str = "-1") -> str: #type: ignore # [CodeStyle: get_value is an overridden function from the Formatter class] # The kwargs dictionary contains a dictionary for each stack (with a string of the extruder_nr as their key), # and a default_extruder_nr to use when no extruder_nr is specified From 95481b856061f18aac6f4a0c58b90366cb90dd40 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 6 Aug 2018 17:11:28 +0200 Subject: [PATCH 77/95] Fix print order for one-at-a-time mode --- cura/OneAtATimeIterator.py | 183 +++++++++++++++--------------- cura/Scene/ConvexHullDecorator.py | 2 +- cura/Settings/GlobalStack.py | 3 + 3 files changed, 93 insertions(+), 95 deletions(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 84d65bae8e..cb063bfde5 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -1,112 +1,107 @@ -# Copyright (c) 2015 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import sys + from UM.Scene.Iterator import Iterator from UM.Scene.SceneNode import SceneNode -from functools import cmp_to_key -from UM.Application import Application -## Iterator that returns a list of nodes in the order that they need to be printed -# If there is no solution an empty list is returned. -# Take note that the list of nodes can have children (that may or may not contain mesh data) + +# Iterator that determines the object print order when one-at a time mode is enabled. +# +# In one-at-a-time mode, only one extruder can be enabled to print. In order to maximize the number of objects we can +# print, we need to print from the corner that's closest to the extruder that's being used. Here is an illustration: +# +# +--------------------------------+ +# | | +# | | +# | | - Rectangle represents the complete print head including fans, etc. +# | X X | y - X's are the nozzles +# | (1) (2) | | +# | | | +# +--------------------------------+ +--> x +# +# In this case, the nozzles are symmetric, nozzle (1) is closer to the bottom left corner while (2) is closer to the +# bottom right. If we use nozzle (1) to print, then we better off printing from the bottom left corner so the print +# head will not collide into an object on its top-right side, which is a very large unused area. Following the same +# logic, if we are printing with nozzle (2), then it's better to print from the bottom-right side. +# +# This iterator determines the print order following the rules above. +# class OneAtATimeIterator(Iterator.Iterator): + def __init__(self, scene_node): - super().__init__(scene_node) # Call super to make multiple inheritence work. - self._hit_map = [[]] + from cura.CuraApplication import CuraApplication + self._global_stack = CuraApplication.getInstance().getGlobalContainerStack() self._original_node_list = [] - + super().__init__(scene_node) # Call super to make multiple inheritance work. + + def getMachineNearestCornerToExtruder(self, global_stack): + head_and_fans_coordinates = global_stack.getHeadAndFansCoordinates() + + used_extruder = None + for extruder in global_stack.extruders.values(): + if extruder.isEnabled: + used_extruder = extruder + break + + extruder_offsets = [used_extruder.getProperty("machine_nozzle_offset_x", "value"), + used_extruder.getProperty("machine_nozzle_offset_y", "value")] + + # find the corner that's closest to the origin + min_distance2 = sys.maxsize + min_coord = None + for coord in head_and_fans_coordinates: + x = coord[0] - extruder_offsets[0] + y = coord[1] - extruder_offsets[1] + + distance2 = x**2 + y**2 + if distance2 <= min_distance2: + min_distance2 = distance2 + min_coord = coord + + return min_coord + def _fillStack(self): + min_coord = self.getMachineNearestCornerToExtruder(self._global_stack) + transform_x = -int(round(min_coord[0] / abs(min_coord[0]))) + transform_y = -int(round(min_coord[1] / abs(min_coord[1]))) + + machine_size = [self._global_stack.getProperty("machine_width", "value"), + self._global_stack.getProperty("machine_depth", "value")] + + def flip_x(polygon): + tm2 = [-1, 0, 0, 1, 0, 0] + return affinity.affine_transform(affinity.translate(polygon, xoff = -machine_size[0]), tm2) + def flip_y(polygon): + tm2 = [1, 0, 0, -1, 0, 0] + return affinity.affine_transform(affinity.translate(polygon, yoff = -machine_size[1]), tm2) + + from shapely import affinity + from shapely.geometry import Polygon + node_list = [] for node in self._scene_node.getChildren(): if not issubclass(type(node), SceneNode): continue - if node.callDecoration("getConvexHull"): - node_list.append(node) + convex_hull = node.callDecoration("getConvexHull") + if convex_hull: + xmin = min(x for x, _ in convex_hull._points) + xmax = max(x for x, _ in convex_hull._points) + ymin = min(y for _, y in convex_hull._points) + ymax = max(y for _, y in convex_hull._points) + convex_hull_polygon = Polygon.from_bounds(xmin, ymin, xmax, ymax) + if transform_x < 0: + convex_hull_polygon = flip_x(convex_hull_polygon) + if transform_y < 0: + convex_hull_polygon = flip_y(convex_hull_polygon) - if len(node_list) < 2: - self._node_stack = node_list[:] - return + node_list.append({"node": node, + "min_coord": [convex_hull_polygon.bounds[0], convex_hull_polygon.bounds[1]], + }) - # Copy the list - self._original_node_list = node_list[:] - - ## Initialise the hit map (pre-compute all hits between all objects) - self._hit_map = [[self._checkHit(i,j) for i in node_list] for j in node_list] - - # Check if we have to files that block eachother. If this is the case, there is no solution! - for a in range(0,len(node_list)): - for b in range(0,len(node_list)): - if a != b and self._hit_map[a][b] and self._hit_map[b][a]: - return - - # Sort the original list so that items that block the most other objects are at the beginning. - # This does not decrease the worst case running time, but should improve it in most cases. - sorted(node_list, key = cmp_to_key(self._calculateScore)) - - todo_node_list = [_ObjectOrder([], node_list)] - while len(todo_node_list) > 0: - current = todo_node_list.pop() - for node in current.todo: - # Check if the object can be placed with what we have and still allows for a solution in the future - if not self._checkHitMultiple(node, current.order) and not self._checkBlockMultiple(node, current.todo): - # We found a possible result. Create new todo & order list. - new_todo_list = current.todo[:] - new_todo_list.remove(node) - new_order = current.order[:] + [node] - if len(new_todo_list) == 0: - # We have no more nodes to check, so quit looking. - todo_node_list = None - self._node_stack = new_order - - return - todo_node_list.append(_ObjectOrder(new_order, new_todo_list)) - self._node_stack = [] #No result found! - - - # Check if first object can be printed before the provided list (using the hit map) - def _checkHitMultiple(self, node, other_nodes): - node_index = self._original_node_list.index(node) - for other_node in other_nodes: - other_node_index = self._original_node_list.index(other_node) - if self._hit_map[node_index][other_node_index]: - return True - return False - - def _checkBlockMultiple(self, node, other_nodes): - node_index = self._original_node_list.index(node) - for other_node in other_nodes: - other_node_index = self._original_node_list.index(other_node) - if self._hit_map[other_node_index][node_index] and node_index != other_node_index: - return True - return False - - ## Calculate score simply sums the number of other objects it 'blocks' - def _calculateScore(self, a, b): - score_a = sum(self._hit_map[self._original_node_list.index(a)]) - score_b = sum(self._hit_map[self._original_node_list.index(b)]) - return score_a - score_b - - # Checks if A can be printed before B - def _checkHit(self, a, b): - if a == b: - return False - - overlap = a.callDecoration("getConvexHullBoundary").intersectsPolygon(b.callDecoration("getConvexHullHeadFull")) - if overlap: - return True - else: - return False - - -## Internal object used to keep track of a possible order in which to print objects. -class _ObjectOrder(): - def __init__(self, order, todo): - """ - :param order: List of indexes in which to print objects, ordered by printing order. - :param todo: List of indexes which are not yet inserted into the order list. - """ - self.order = order - self.todo = todo + node_list = sorted(node_list, key = lambda d: d["min_coord"]) + self._node_stack = [d["node"] for d in node_list] diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 66bc8a7fc3..367144abfc 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -229,7 +229,7 @@ class ConvexHullDecorator(SceneNodeDecorator): return offset_hull def _getHeadAndFans(self): - return Polygon(numpy.array(self._global_stack.getProperty("machine_head_with_fans_polygon", "value"), numpy.float32)) + return Polygon(numpy.array(self._global_stack.getHeadAndFansCoordinates(), numpy.float32)) def _compute2DConvexHeadFull(self): return self._compute2DConvexHull().getMinkowskiHull(self._getHeadAndFans()) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index 66f3290b85..ea955d24b0 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -172,6 +172,9 @@ class GlobalStack(CuraContainerStack): return False return True + def getHeadAndFansCoordinates(self): + return self.getProperty("machine_head_with_fans_polygon", "value") + ## private: global_stack_mime = MimeType( From aac6fe486066d7244d53c3337f64a03103e2ebc6 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Aug 2018 09:35:50 +0200 Subject: [PATCH 78/95] Fix some code style --- cura/OneAtATimeIterator.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index cb063bfde5..990ed37ab7 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -3,6 +3,9 @@ import sys +from shapely import affinity +from shapely.geometry import Polygon + from UM.Scene.Iterator import Iterator from UM.Scene.SceneNode import SceneNode @@ -73,13 +76,11 @@ class OneAtATimeIterator(Iterator.Iterator): def flip_x(polygon): tm2 = [-1, 0, 0, 1, 0, 0] return affinity.affine_transform(affinity.translate(polygon, xoff = -machine_size[0]), tm2) + def flip_y(polygon): tm2 = [1, 0, 0, -1, 0, 0] return affinity.affine_transform(affinity.translate(polygon, yoff = -machine_size[1]), tm2) - from shapely import affinity - from shapely.geometry import Polygon - node_list = [] for node in self._scene_node.getChildren(): if not issubclass(type(node), SceneNode): From 59bb7744368626df2b5333f7b139d8c56c47b0d9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 7 Aug 2018 10:51:56 +0200 Subject: [PATCH 79/95] Remove unused variables --- plugins/USBPrinting/AutoDetectBaudJob.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugins/USBPrinting/AutoDetectBaudJob.py b/plugins/USBPrinting/AutoDetectBaudJob.py index 30ab65bc55..f8af61c567 100644 --- a/plugins/USBPrinting/AutoDetectBaudJob.py +++ b/plugins/USBPrinting/AutoDetectBaudJob.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Job import Job @@ -21,7 +21,6 @@ class AutoDetectBaudJob(Job): def run(self): Logger.log("d", "Auto detect baud rate started.") - timeout = 3 wait_response_timeouts = [3, 15, 30] wait_bootloader_times = [1.5, 5, 15] write_timeout = 3 @@ -52,7 +51,7 @@ class AutoDetectBaudJob(Job): if serial is None: try: serial = Serial(str(self._serial_port), baud_rate, timeout = read_timeout, writeTimeout = write_timeout) - except SerialException as e: + except SerialException: Logger.logException("w", "Unable to create serial") continue else: From 58e5a8123625eaf14279efb3e4c9ac9032cea44d Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 7 Aug 2018 13:10:03 +0200 Subject: [PATCH 80/95] Fix units for initial layer print/travel acceleration These two were wrong. Contributes to issue CURA-5495. --- resources/definitions/fdmprinter.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index daf09d2701..2ea87a890d 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -3025,7 +3025,7 @@ { "label": "Initial Layer Print Acceleration", "description": "The acceleration during the printing of the initial layer.", - "unit": "mm/s", + "unit": "mm/s²", "type": "float", "default_value": 3000, "value": "acceleration_layer_0", @@ -3039,7 +3039,7 @@ { "label": "Initial Layer Travel Acceleration", "description": "The acceleration for travel moves in the initial layer.", - "unit": "mm/s", + "unit": "mm/s²", "type": "float", "default_value": 3000, "value": "acceleration_layer_0 * acceleration_travel / acceleration_print", From 910ffe0ad53dd71e83d46b74cfad932061a92cd5 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 7 Aug 2018 16:15:03 +0200 Subject: [PATCH 81/95] Fix quality reset upon material deletion CURA-5621 --- cura/Settings/MachineManager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index ff585deb54..f945cbb30c 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1455,9 +1455,13 @@ class MachineManager(QObject): if quality_group.node_for_global is None: Logger.log("e", "Could not set quality group [%s] because it has no node_for_global", str(quality_group)) return + # This is not changing the quality for the active machine !!!!!!!! global_stack.quality = quality_group.node_for_global.getContainer() for extruder_nr, extruder_stack in global_stack.extruders.items(): - extruder_stack.quality = quality_group.nodes_for_extruders[extruder_nr].getContainer() + quality_container = self._empty_quality_container + if extruder_nr in quality_group.nodes_for_extruders: + quality_container = quality_group.nodes_for_extruders[extruder_nr].getContainer() + extruder_stack.quality = quality_container return self.blurSettings.emit() From 55cf1fa137bac81d3f83564e9e656456ac4dfa32 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 7 Aug 2018 16:51:31 +0200 Subject: [PATCH 82/95] Turn on CuraEngine debug mode when front-end is in debug mode You can test this by running Cura's front-end with parameter --debug. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index 56763a6632..9a5c95b04d 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -1,6 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import argparse #To run the engine in debug mode if the front-end is in debug mode. from collections import defaultdict import os from PyQt5.QtCore import QObject, QTimer, pyqtSlot @@ -179,7 +180,15 @@ class CuraEngineBackend(QObject, Backend): # \return list of commands and args / parameters. def getEngineCommand(self) -> List[str]: json_path = Resources.getPath(Resources.DefinitionContainers, "fdmprinter.def.json") - return [self._application.getPreferences().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, ""] + command = [self._application.getPreferences().getValue("backend/location"), "connect", "127.0.0.1:{0}".format(self._port), "-j", json_path, ""] + + parser = argparse.ArgumentParser(prog = "cura", add_help = False) + parser.add_argument("--debug", action = "store_true", default = False, help = "Turn on the debug mode by setting this option.") + known_args = vars(parser.parse_known_args()[0]) + if known_args["debug"]: + command.append("-vvv") + + return command ## Emitted when we get a message containing print duration and material amount. # This also implies the slicing has finished. From 387fb3ce1f7af5f6e8b37c966291e4710cb2d143 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 8 Aug 2018 11:31:21 +0200 Subject: [PATCH 83/95] Fix missing attribute CURA-5622 self._plugins_loaded should be there in the beginning or Cura will crash when it gets used. --- cura/CuraApplication.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 9f4ea7b3d3..6164fc8756 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -226,6 +226,8 @@ class CuraApplication(QtApplication): self._need_to_show_user_agreement = True + self._plugins_loaded = False + # Backups self._auto_save = None self._save_data_enabled = True From 9239e82b1f16e112aaa9da042515f995c6532e93 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 8 Aug 2018 12:56:46 +0200 Subject: [PATCH 84/95] Make mypy happy CURA-5578 --- cura/Settings/MachineManager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f945cbb30c..a14977df03 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1460,7 +1460,8 @@ class MachineManager(QObject): for extruder_nr, extruder_stack in global_stack.extruders.items(): quality_container = self._empty_quality_container if extruder_nr in quality_group.nodes_for_extruders: - quality_container = quality_group.nodes_for_extruders[extruder_nr].getContainer() + container = quality_group.nodes_for_extruders[extruder_nr].getContainer() + quality_container = container if container is not None else quality_container extruder_stack.quality = quality_container return From ea770a26a37e8673b24067e814344f01b29bf488 Mon Sep 17 00:00:00 2001 From: ValentinPitre <35694201+ValentinPitre@users.noreply.github.com> Date: Wed, 8 Aug 2018 23:23:32 +0200 Subject: [PATCH 85/95] Add mesh offset --- resources/definitions/tizyx_k25.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/tizyx_k25.def.json b/resources/definitions/tizyx_k25.def.json index 55256a29d6..94a20b371e 100644 --- a/resources/definitions/tizyx_k25.def.json +++ b/resources/definitions/tizyx_k25.def.json @@ -9,6 +9,7 @@ "manufacturer": "TiZYX", "file_formats": "text/x-gcode", "platform": "tizyx_k25_platform.stl", + "platform_offset": [0, -4, 0], "exclude_materials": ["chromatik_pla", "dsm_arnitel2045_175", "dsm_novamid1070_175", "fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu", "fiberlogy_hd_pla", "filo3d_pla", "filo3d_pla_green", "filo3d_pla_red", "generic_abs", "generic_abs_175", "generic_bam", "generic_cpe", "generic_cpe_175", "generic_cpe_plus", "generic_hips", "generic_hips_175", "generic_nylon", "generic_nylon_175", "generic_pc", "generic_pc_175", "generic_petg", "generic_petg_175", "generic_pla", "generic_pla_175", "generic_pp", "generic_pva", "generic_pva_175", "generic_tough_pla", "generic_tpu", "imade3d_petg_green", "imade3d_petg_pink", "imade3d_pla_green", "imade3d_pla_pink", "innofill_innoflex60_175", "octofiber_pla", "polyflex_pla", "polymax_pla", "polyplus_pla", "polywood_pla", "ultimaker_abs_black", "ultimaker_abs_blue", "ultimaker_abs_green", "ultimaker_abs_grey", "ultimaker_abs_orange", "ultimaker_abs_pearl-gold", "ultimaker_abs_red", "ultimaker_abs_silver-metallic", "ultimaker_abs_white", "ultimaker_abs_yellow", "ultimaker_bam", "ultimaker_cpe_black", "ultimaker_cpe_blue", "ultimaker_cpe_dark-grey", "ultimaker_cpe_green", "ultimaker_cpe_light-grey", "ultimaker_cpe_plus_black", "ultimaker_cpe_plus_transparent", "ultimaker_cpe_plus_white", "ultimaker_cpe_red", "ultimaker_cpe_transparent", "ultimaker_cpe_white", "ultimaker_cpe_yellow", "ultimaker_nylon_black", "ultimaker_nylon_transparent", "ultimaker_pc_black", "ultimaker_pc_transparent", "ultimaker_pc_white", "ultimaker_pla_black", "ultimaker_pla_blue", "ultimaker_pla_green", "ultimaker_pla_magenta", "ultimaker_pla_orange", "ultimaker_pla_pearl-white", "ultimaker_pla_red", "ultimaker_pla_silver-metallic", "ultimaker_pla_transparent", "ultimaker_pla_white", "ultimaker_pla_yellow", "ultimaker_pp_transparent", "ultimaker_pva", "ultimaker_tough_pla_black", "ultimaker_tough_pla_green", "ultimaker_tough_pla_red", "ultimaker_tough_pla_white", "ultimaker_tpu_black", "ultimaker_tpu_blue", "ultimaker_tpu_red", "ultimaker_tpu_white", "verbatim_bvoh_175", "Vertex_Delta_ABS", "Vertex_Delta_PET", "Vertex_Delta_PLA", "Vertex_Delta_TPU", "zyyx_pro_flex", "zyyx_pro_pla" ], "preferred_material": "tizyx_pla", "has_machine_quality": true, From 41a892796d29d6240ce135c7f5a838e14dd398c2 Mon Sep 17 00:00:00 2001 From: Andreea Scorojitu Date: Thu, 9 Aug 2018 09:14:25 +0200 Subject: [PATCH 86/95] CURA-5626 Remove UM3 from connection message "This printer is not set up to host a group of Ultimaker 3 printers.", Ultimker 3 was removed from the message. --- plugins/UM3NetworkPrinting/DiscoverUM3Action.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml index e4d75e8f6d..127b3c35bd 100644 --- a/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml +++ b/plugins/UM3NetworkPrinting/DiscoverUM3Action.qml @@ -299,11 +299,11 @@ Cura.MachineAction } else if (base.selectedDevice.clusterSize === 0) { - return catalog.i18nc("@label", "This printer is not set up to host a group of Ultimaker 3 printers."); + return catalog.i18nc("@label", "This printer is not set up to host a group of printers."); } else { - return catalog.i18nc("@label", "This printer is the host for a group of %1 Ultimaker 3 printers.".arg(base.selectedDevice.clusterSize)); + return catalog.i18nc("@label", "This printer is the host for a group of %1 printers.".arg(base.selectedDevice.clusterSize)); } } From 5c860d95928204dbeccc35fed7edfcaf456abbc9 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Aug 2018 11:11:41 +0200 Subject: [PATCH 87/95] Fixed typo --- cura/PrinterOutput/PrinterOutputModel.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/PrinterOutput/PrinterOutputModel.py b/cura/PrinterOutput/PrinterOutputModel.py index 6fafa368bb..f10d6bd75b 100644 --- a/cura/PrinterOutput/PrinterOutputModel.py +++ b/cura/PrinterOutput/PrinterOutputModel.py @@ -120,7 +120,7 @@ class PrinterOutputModel(QObject): @pyqtProperty(QVariant, notify = headPositionChanged) def headPosition(self): - return {"x": self._head_position.x, "y": self._head_position.y, "z": self.head_position_z} + 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: From 1180fad62f41a3af08f412dc6dc220d60d6a8f36 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Aug 2018 11:33:04 +0200 Subject: [PATCH 88/95] Fix binding loop --- resources/qml/PrintMonitor.qml | 1 - resources/qml/PrinterOutput/OutputDeviceHeader.qml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/qml/PrintMonitor.qml b/resources/qml/PrintMonitor.qml index b24bcb6d6c..7727f9cb52 100644 --- a/resources/qml/PrintMonitor.qml +++ b/resources/qml/PrintMonitor.qml @@ -26,7 +26,6 @@ Column OutputDeviceHeader { - width: parent.width outputDevice: connectedDevice } diff --git a/resources/qml/PrinterOutput/OutputDeviceHeader.qml b/resources/qml/PrinterOutput/OutputDeviceHeader.qml index d5ce32786c..03e6d78699 100644 --- a/resources/qml/PrinterOutput/OutputDeviceHeader.qml +++ b/resources/qml/PrinterOutput/OutputDeviceHeader.qml @@ -16,7 +16,7 @@ Item Rectangle { - anchors.fill: parent + height: childrenRect.height color: UM.Theme.getColor("setting_category") property var activePrinter: outputDevice != null ? outputDevice.activePrinter : null From d31df8ec679281280421a97458e089047e74c8a4 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 9 Aug 2018 12:47:49 +0200 Subject: [PATCH 89/95] Fixed that long printernames overlap other GUI elements --- plugins/UM3NetworkPrinting/ClusterControlItem.qml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterControlItem.qml b/plugins/UM3NetworkPrinting/ClusterControlItem.qml index b42515de51..5cf550955c 100644 --- a/plugins/UM3NetworkPrinting/ClusterControlItem.qml +++ b/plugins/UM3NetworkPrinting/ClusterControlItem.qml @@ -30,7 +30,12 @@ Component anchors.horizontalCenter: parent.horizontalCenter anchors.topMargin: UM.Theme.getSize("default_margin").height anchors.top: parent.top + anchors.left: parent.left + anchors.leftMargin: UM.Theme.getSize("default_margin").width + anchors.right:parent.right + anchors.rightMargin: UM.Theme.getSize("default_margin").width text: Cura.MachineManager.printerOutputDevices[0].name + elide: Text.ElideRight } Rectangle From e4bdd8096a3e99ca304938c8ad26a819add31cd2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 10 Aug 2018 11:02:16 +0200 Subject: [PATCH 90/95] Remap shortcut This is a bit more logical than 'G', I'd say. E is now available since other shortcuts were remapped as well. Contributes to issue CURA-5634 and fixes #3969. --- plugins/SupportEraser/SupportEraser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/SupportEraser/SupportEraser.py b/plugins/SupportEraser/SupportEraser.py index 44d4831c04..97850c3f3d 100644 --- a/plugins/SupportEraser/SupportEraser.py +++ b/plugins/SupportEraser/SupportEraser.py @@ -28,7 +28,7 @@ from UM.Settings.SettingInstance import SettingInstance class SupportEraser(Tool): def __init__(self): super().__init__() - self._shortcut_key = Qt.Key_G + self._shortcut_key = Qt.Key_E self._controller = self.getController() self._selection_pass = None From 4a22bb3b695e531a9ddf6f89f3a3d53109d13580 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 10 Aug 2018 11:06:25 +0200 Subject: [PATCH 91/95] Code style --- resources/qml/Toolbar.qml | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 613a462db9..6483804c38 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2015 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 @@ -21,8 +21,8 @@ Item { id: buttons; - anchors.bottom: parent.bottom; - anchors.left: parent.left; + anchors.bottom: parent.bottom + anchors.left: parent.left spacing: UM.Theme.getSize("button_lining").width Repeater @@ -41,13 +41,15 @@ Item enabled: model.enabled && UM.Selection.hasSelection && UM.Controller.toolsEnabled style: UM.Theme.styles.tool_button - onCheckedChanged: { - if (checked) { - base.activeY = y + onCheckedChanged: + { + if (checked) + { + base.activeY = y; } } - //Workaround since using ToolButton"s onClicked would break the binding of the checked property, instead + //Workaround since using ToolButton's onClicked would break the binding of the checked property, instead //just catch the click so we do not trigger that behaviour. MouseArea { @@ -57,7 +59,7 @@ Item forceActiveFocus() //First grab focus, so all the text fields are updated if(parent.checked) { - UM.Controller.setActiveTool(null) + UM.Controller.setActiveTool(null); } else { @@ -96,11 +98,13 @@ Item width: { - if (panel.item && panel.width > 0){ - return Math.max(panel.width + 2 * UM.Theme.getSize("default_margin").width) + if (panel.item && panel.width > 0) + { + return Math.max(panel.width + 2 * UM.Theme.getSize("default_margin").width); } - else { - return 0 + else + { + return 0; } } height: panel.item ? panel.height + 2 * UM.Theme.getSize("default_margin").height : 0; @@ -124,7 +128,7 @@ Item x: UM.Theme.getSize("default_margin").width; y: UM.Theme.getSize("default_margin").height; - source: UM.ActiveTool.valid ? UM.ActiveTool.activeToolPanel : ""; + source: UM.ActiveTool.valid ? UM.ActiveTool.activeToolPanel : "" enabled: UM.Controller.toolsEnabled; } } @@ -148,6 +152,6 @@ Item anchors.horizontalCenter: parent.horizontalCenter } - visible: toolHint.text != ""; + visible: toolHint.text != "" } } From f247c328c695ba27d9273c53b06cf7f8a73cdc61 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 10 Aug 2018 11:22:33 +0200 Subject: [PATCH 92/95] Show shortcut key in tool tooltips In brackets. I couldn't translate it to an icon easily. It was possible but I'd have to create a giant mapping from every key to the key icons and add a bunch of icons and I don't think that's necessary. Contributes to issue CURA-5634. --- resources/qml/Toolbar.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Toolbar.qml b/resources/qml/Toolbar.qml index 6483804c38..a04b3650df 100644 --- a/resources/qml/Toolbar.qml +++ b/resources/qml/Toolbar.qml @@ -34,7 +34,7 @@ Item height: childrenRect.height Button { - text: model.name + text: model.name + (model.shortcut ? (" (" + model.shortcut + ")") : "") iconSource: (UM.Theme.getIcon(model.icon) != "") ? UM.Theme.getIcon(model.icon) : "file:///" + model.location + "/" + model.icon checkable: true checked: model.active From 89ed2bcff80a7a414f77c455baa0023c631eae7c Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Fri, 10 Aug 2018 11:45:25 +0200 Subject: [PATCH 93/95] Revert "Merge pull request #4203 from Ultimaker/CURA-5538-fix-one-at-a-time-order-2" This reverts commit 82e1a7c5fc43a12d1498779d392286c6e49ee4ea, reversing changes made to 1915659393b72f7e4d4dbd9b73e92b8a665efcdc. --- cura/OneAtATimeIterator.py | 184 +++++++++++++++--------------- cura/Scene/ConvexHullDecorator.py | 2 +- cura/Settings/GlobalStack.py | 3 - 3 files changed, 95 insertions(+), 94 deletions(-) diff --git a/cura/OneAtATimeIterator.py b/cura/OneAtATimeIterator.py index 990ed37ab7..84d65bae8e 100644 --- a/cura/OneAtATimeIterator.py +++ b/cura/OneAtATimeIterator.py @@ -1,108 +1,112 @@ -# Copyright (c) 2018 Ultimaker B.V. +# Copyright (c) 2015 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import sys - -from shapely import affinity -from shapely.geometry import Polygon - from UM.Scene.Iterator import Iterator from UM.Scene.SceneNode import SceneNode +from functools import cmp_to_key +from UM.Application import Application - -# Iterator that determines the object print order when one-at a time mode is enabled. -# -# In one-at-a-time mode, only one extruder can be enabled to print. In order to maximize the number of objects we can -# print, we need to print from the corner that's closest to the extruder that's being used. Here is an illustration: -# -# +--------------------------------+ -# | | -# | | -# | | - Rectangle represents the complete print head including fans, etc. -# | X X | y - X's are the nozzles -# | (1) (2) | | -# | | | -# +--------------------------------+ +--> x -# -# In this case, the nozzles are symmetric, nozzle (1) is closer to the bottom left corner while (2) is closer to the -# bottom right. If we use nozzle (1) to print, then we better off printing from the bottom left corner so the print -# head will not collide into an object on its top-right side, which is a very large unused area. Following the same -# logic, if we are printing with nozzle (2), then it's better to print from the bottom-right side. -# -# This iterator determines the print order following the rules above. -# +## Iterator that returns a list of nodes in the order that they need to be printed +# If there is no solution an empty list is returned. +# Take note that the list of nodes can have children (that may or may not contain mesh data) class OneAtATimeIterator(Iterator.Iterator): - def __init__(self, scene_node): - from cura.CuraApplication import CuraApplication - self._global_stack = CuraApplication.getInstance().getGlobalContainerStack() + super().__init__(scene_node) # Call super to make multiple inheritence work. + self._hit_map = [[]] self._original_node_list = [] - super().__init__(scene_node) # Call super to make multiple inheritance work. - - def getMachineNearestCornerToExtruder(self, global_stack): - head_and_fans_coordinates = global_stack.getHeadAndFansCoordinates() - - used_extruder = None - for extruder in global_stack.extruders.values(): - if extruder.isEnabled: - used_extruder = extruder - break - - extruder_offsets = [used_extruder.getProperty("machine_nozzle_offset_x", "value"), - used_extruder.getProperty("machine_nozzle_offset_y", "value")] - - # find the corner that's closest to the origin - min_distance2 = sys.maxsize - min_coord = None - for coord in head_and_fans_coordinates: - x = coord[0] - extruder_offsets[0] - y = coord[1] - extruder_offsets[1] - - distance2 = x**2 + y**2 - if distance2 <= min_distance2: - min_distance2 = distance2 - min_coord = coord - - return min_coord - + def _fillStack(self): - min_coord = self.getMachineNearestCornerToExtruder(self._global_stack) - transform_x = -int(round(min_coord[0] / abs(min_coord[0]))) - transform_y = -int(round(min_coord[1] / abs(min_coord[1]))) - - machine_size = [self._global_stack.getProperty("machine_width", "value"), - self._global_stack.getProperty("machine_depth", "value")] - - def flip_x(polygon): - tm2 = [-1, 0, 0, 1, 0, 0] - return affinity.affine_transform(affinity.translate(polygon, xoff = -machine_size[0]), tm2) - - def flip_y(polygon): - tm2 = [1, 0, 0, -1, 0, 0] - return affinity.affine_transform(affinity.translate(polygon, yoff = -machine_size[1]), tm2) - node_list = [] for node in self._scene_node.getChildren(): if not issubclass(type(node), SceneNode): continue - convex_hull = node.callDecoration("getConvexHull") - if convex_hull: - xmin = min(x for x, _ in convex_hull._points) - xmax = max(x for x, _ in convex_hull._points) - ymin = min(y for _, y in convex_hull._points) - ymax = max(y for _, y in convex_hull._points) + if node.callDecoration("getConvexHull"): + node_list.append(node) - convex_hull_polygon = Polygon.from_bounds(xmin, ymin, xmax, ymax) - if transform_x < 0: - convex_hull_polygon = flip_x(convex_hull_polygon) - if transform_y < 0: - convex_hull_polygon = flip_y(convex_hull_polygon) - node_list.append({"node": node, - "min_coord": [convex_hull_polygon.bounds[0], convex_hull_polygon.bounds[1]], - }) + if len(node_list) < 2: + self._node_stack = node_list[:] + return - node_list = sorted(node_list, key = lambda d: d["min_coord"]) + # Copy the list + self._original_node_list = node_list[:] + + ## Initialise the hit map (pre-compute all hits between all objects) + self._hit_map = [[self._checkHit(i,j) for i in node_list] for j in node_list] + + # Check if we have to files that block eachother. If this is the case, there is no solution! + for a in range(0,len(node_list)): + for b in range(0,len(node_list)): + if a != b and self._hit_map[a][b] and self._hit_map[b][a]: + return + + # Sort the original list so that items that block the most other objects are at the beginning. + # This does not decrease the worst case running time, but should improve it in most cases. + sorted(node_list, key = cmp_to_key(self._calculateScore)) + + todo_node_list = [_ObjectOrder([], node_list)] + while len(todo_node_list) > 0: + current = todo_node_list.pop() + for node in current.todo: + # Check if the object can be placed with what we have and still allows for a solution in the future + if not self._checkHitMultiple(node, current.order) and not self._checkBlockMultiple(node, current.todo): + # We found a possible result. Create new todo & order list. + new_todo_list = current.todo[:] + new_todo_list.remove(node) + new_order = current.order[:] + [node] + if len(new_todo_list) == 0: + # We have no more nodes to check, so quit looking. + todo_node_list = None + self._node_stack = new_order + + return + todo_node_list.append(_ObjectOrder(new_order, new_todo_list)) + self._node_stack = [] #No result found! + + + # Check if first object can be printed before the provided list (using the hit map) + def _checkHitMultiple(self, node, other_nodes): + node_index = self._original_node_list.index(node) + for other_node in other_nodes: + other_node_index = self._original_node_list.index(other_node) + if self._hit_map[node_index][other_node_index]: + return True + return False + + def _checkBlockMultiple(self, node, other_nodes): + node_index = self._original_node_list.index(node) + for other_node in other_nodes: + other_node_index = self._original_node_list.index(other_node) + if self._hit_map[other_node_index][node_index] and node_index != other_node_index: + return True + return False + + ## Calculate score simply sums the number of other objects it 'blocks' + def _calculateScore(self, a, b): + score_a = sum(self._hit_map[self._original_node_list.index(a)]) + score_b = sum(self._hit_map[self._original_node_list.index(b)]) + return score_a - score_b + + # Checks if A can be printed before B + def _checkHit(self, a, b): + if a == b: + return False + + overlap = a.callDecoration("getConvexHullBoundary").intersectsPolygon(b.callDecoration("getConvexHullHeadFull")) + if overlap: + return True + else: + return False + + +## Internal object used to keep track of a possible order in which to print objects. +class _ObjectOrder(): + def __init__(self, order, todo): + """ + :param order: List of indexes in which to print objects, ordered by printing order. + :param todo: List of indexes which are not yet inserted into the order list. + """ + self.order = order + self.todo = todo - self._node_stack = [d["node"] for d in node_list] diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 367144abfc..66bc8a7fc3 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -229,7 +229,7 @@ class ConvexHullDecorator(SceneNodeDecorator): return offset_hull def _getHeadAndFans(self): - return Polygon(numpy.array(self._global_stack.getHeadAndFansCoordinates(), numpy.float32)) + return Polygon(numpy.array(self._global_stack.getProperty("machine_head_with_fans_polygon", "value"), numpy.float32)) def _compute2DConvexHeadFull(self): return self._compute2DConvexHull().getMinkowskiHull(self._getHeadAndFans()) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index ea955d24b0..66f3290b85 100755 --- a/cura/Settings/GlobalStack.py +++ b/cura/Settings/GlobalStack.py @@ -172,9 +172,6 @@ class GlobalStack(CuraContainerStack): return False return True - def getHeadAndFansCoordinates(self): - return self.getProperty("machine_head_with_fans_polygon", "value") - ## private: global_stack_mime = MimeType( From 6924d28ee7eb92c47e5d1df63874a7da5b2b0be4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 10 Aug 2018 11:52:35 +0200 Subject: [PATCH 94/95] Disambiguate translation of 'Settings' from 'Preferences' The 'settings' entry contains the set-up of the printer so Konfiguration is a better word there. Discovered during investigation of #3971. --- resources/i18n/de_DE/cura.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 37b8840468..31ce980615 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -4036,7 +4036,7 @@ msgstr "&Ansicht" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:184 msgctxt "@title:menu" msgid "&Settings" -msgstr "&Einstellungen" +msgstr "&Konfiguration" #: /home/ruben/Projects/Cura/resources/qml/Cura.qml:186 msgctxt "@title:menu menubar:toplevel" From f91c696e4bfaa1ace21dabfdb91d4651599768ea Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 10 Aug 2018 13:17:20 +0200 Subject: [PATCH 95/95] Clarify error message a bit more The QA engineer was a bit confused by this one. Let's make the language a bit easier. --- plugins/UM3NetworkPrinting/SendMaterialJob.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/UM3NetworkPrinting/SendMaterialJob.py b/plugins/UM3NetworkPrinting/SendMaterialJob.py index 0ac38843a1..8491e79c29 100644 --- a/plugins/UM3NetworkPrinting/SendMaterialJob.py +++ b/plugins/UM3NetworkPrinting/SendMaterialJob.py @@ -39,12 +39,12 @@ class SendMaterialJob(Job): try: remote_materials_list = json.loads(remote_materials_list) except json.JSONDecodeError: - Logger.log("e", "Current material storage on printer was a corrupted reply.") + Logger.log("e", "Request material storage on printer: I didn't understand the printer's answer.") return try: remote_materials_by_guid = {material["guid"]: material for material in remote_materials_list} #Index by GUID. except KeyError: - Logger.log("e", "Current material storage on printer was an invalid reply (missing GUIDs).") + Logger.log("e", "Request material storage on printer: Printer's answer was missing GUIDs.") return container_registry = ContainerRegistry.getInstance()