From f02ac17a30558125f3f92926c0332023563518bb Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Thu, 7 May 2020 13:38:09 +0100 Subject: [PATCH 1/6] GL ES compatibility fixes. --- resources/shaders/overhang.shader | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/resources/shaders/overhang.shader b/resources/shaders/overhang.shader index 4add78b531..a43b44f181 100644 --- a/resources/shaders/overhang.shader +++ b/resources/shaders/overhang.shader @@ -40,11 +40,6 @@ fragment = uniform lowp float u_renderError; - float round(float f) - { - return sign(f) * floor(abs(f) + 0.5); - } - void main() { mediump vec4 finalColor = vec4(0.0); @@ -68,7 +63,7 @@ fragment = finalColor = (-normal.y > u_overhangAngle) ? u_overhangColor : finalColor; - vec3 grid = vec3(f_vertex.x - floor(f_vertex.x - 0.5), f_vertex.y - floor(f_vertex.y - 0.5), f_vertex.z - floor(f_vertex.z - 0.5)); + highp vec3 grid = vec3(f_vertex.x - floor(f_vertex.x - 0.5), f_vertex.y - floor(f_vertex.y - 0.5), f_vertex.z - floor(f_vertex.z - 0.5)); finalColor.a = (u_renderError > 0.5) && dot(grid, grid) < 0.245 ? 0.667 : 1.0; gl_FragColor = finalColor; From 1946615fff768bff4795bba5974f07315597c389 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 11 May 2020 17:36:24 +0200 Subject: [PATCH 2/6] Fix asynchronous bug if job gets cancelled If the print job happens to get cancelled right after checking if the index is correct, but before actually reading the line, it would get an IndexError when trying to read the line since cancelling the job clears the _gcode list. This prevents that asynchronous issue by using the internal check in the list access to check that, and just uses an exception to check whether it's reached the end. Fixes Sentry issue CURA-QC. --- plugins/USBPrinting/USBPrinterOutputDevice.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/plugins/USBPrinting/USBPrinterOutputDevice.py b/plugins/USBPrinting/USBPrinterOutputDevice.py index cf07b98ca1..6be3827e5e 100644 --- a/plugins/USBPrinting/USBPrinterOutputDevice.py +++ b/plugins/USBPrinting/USBPrinterOutputDevice.py @@ -1,4 +1,4 @@ -# Copyright (c) 2019 Ultimaker B.V. +# Copyright (c) 2020 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import os @@ -367,11 +367,18 @@ class USBPrinterOutputDevice(PrinterOutputDevice): self._sendCommand("M84") def _sendNextGcodeLine(self): - if self._gcode_position >= len(self._gcode): + """ + Send the next line of g-code, at the current `_gcode_position`, via a + serial port to the printer. + + If the print is done, this sets `_is_printing` to `False` as well. + """ + try: + line = self._gcode[self._gcode_position] + except IndexError: # End of print, or print got cancelled. self._printers[0].updateActivePrintJob(None) self._is_printing = False return - line = self._gcode[self._gcode_position] if ";" in line: line = line[:line.find(";")] @@ -401,7 +408,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice): if print_job is None: controller = GenericOutputController(self) controller.setCanUpdateFirmware(True) - print_job = PrintJobOutputModel(output_controller=controller, name=CuraApplication.getInstance().getPrintInformation().jobName) + print_job = PrintJobOutputModel(output_controller = controller, name = CuraApplication.getInstance().getPrintInformation().jobName) print_job.updateState("printing") self._printers[0].updateActivePrintJob(print_job) From 05b0bf5988317d7cd496a5f3c5d05dc3b760d751 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 11 May 2020 18:34:41 +0200 Subject: [PATCH 3/6] Turn 'Redo Layers' into a boolean for at most 1 layer We've deemed it irresponsible to redo multiple layers. This will dig the nozzle back down into the layers that were printed before the pause. This doesn't include a version upgrade yet. Contributes to issue CURA-7413. --- .../scripts/PauseAtHeight.py | 40 +++++++++---------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 1ba8b8213b..8507565ef3 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -108,13 +108,12 @@ class PauseAtHeight(Script): "type": "float", "default_value": 3.3333 }, - "redo_layers": + "redo_layer": { - "label": "Redo Layers", - "description": "Redo a number of previous layers after a pause to increases adhesion.", - "unit": "layers", - "type": "int", - "default_value": 0 + "label": "Redo Layer", + "description": "Redo the last layer before the pause, to get the filament flowing again after having oozed a bit during the pause.", + "type": "bool", + "default_value": false }, "standby_temperature": { @@ -160,7 +159,7 @@ class PauseAtHeight(Script): park_x = self.getSettingValueByKey("head_park_x") park_y = self.getSettingValueByKey("head_park_y") layers_started = False - redo_layers = self.getSettingValueByKey("redo_layers") + redo_layer = self.getSettingValueByKey("redo_layer") standby_temperature = self.getSettingValueByKey("standby_temperature") firmware_retract = Application.getInstance().getGlobalContainerStack().getProperty("machine_firmware_retract", "value") control_temperatures = Application.getInstance().getGlobalContainerStack().getProperty("machine_nozzle_temp_enabled", "value") @@ -264,24 +263,23 @@ class PauseAtHeight(Script): if current_e >= 0: break - # include a number of previous layers - for i in range(1, redo_layers + 1): - prev_layer = data[index - i] + # Maybe redo the last layer. + if redo_layer: + prev_layer = data[index - 1] layer = prev_layer + layer # Get extruder's absolute position at the - # beginning of the first layer redone + # beginning of the redone layer. # see https://github.com/nallath/PostProcessingPlugin/issues/55 - if i == redo_layers: - # Get X and Y from the next layer (better position for - # the nozzle) - x, y = self.getNextXY(layer) - prev_lines = prev_layer.split("\n") - for lin in prev_lines: - new_e = self.getValue(lin, "E", current_e) - if new_e != current_e: - current_e = new_e - break + # Get X and Y from the next layer (better position for + # the nozzle) + x, y = self.getNextXY(layer) + prev_lines = prev_layer.split("\n") + for lin in prev_lines: + new_e = self.getValue(lin, "E", current_e) + if new_e != current_e: + current_e = new_e + break prepend_gcode = ";TYPE:CUSTOM\n" prepend_gcode += ";added code by post processing\n" From aff28d821f8bcf53aa7f1559cbf3b77661cbbe40 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 11 May 2020 18:35:27 +0200 Subject: [PATCH 4/6] Also reset extrusion for Griffin printers The rest may not be necessary but the G92 is crucial if redo layer is activated. Contributes to issue CURA-7413. --- plugins/PostProcessingPlugin/scripts/PauseAtHeight.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 8507565ef3..03cc2c31a7 100644 --- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py +++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py @@ -362,8 +362,8 @@ class PauseAtHeight(Script): prepend_gcode += self.putValue(M = 82) + " ; switch back to absolute E values\n" - # reset extrude value to pre pause value - prepend_gcode += self.putValue(G = 92, E = current_e) + "\n" + # reset extrude value to pre pause value + prepend_gcode += self.putValue(G = 92, E = current_e) + "\n" layer = prepend_gcode + layer From 89fc4c94bf70ffaf87e362ef3f1cb69173bef2bc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 11 May 2020 18:50:49 +0200 Subject: [PATCH 5/6] Add version upgrade for changed Redo Layer parameter of Pause script This was changed from a number of layers to just a boolean for 1 or 0 layers. Contributes to issue CURA-7413. --- .../VersionUpgrade462to47.py | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/plugins/VersionUpgrade/VersionUpgrade462to47/VersionUpgrade462to47.py b/plugins/VersionUpgrade/VersionUpgrade462to47/VersionUpgrade462to47.py index c8a8131dee..c340fd0c72 100644 --- a/plugins/VersionUpgrade/VersionUpgrade462to47/VersionUpgrade462to47.py +++ b/plugins/VersionUpgrade/VersionUpgrade462to47/VersionUpgrade462to47.py @@ -78,6 +78,27 @@ class VersionUpgrade462to47(VersionUpgrade): parser["metadata"] = {} parser["metadata"]["setting_version"] = "15" + # Update Pause at Height script parameters if present. + if "post_processing_scripts" in parser["metadata"]: + new_scripts_entries = [] + for script_str in parser["metadata"]["post_processing_scripts"].split("\n"): + if not script_str: + continue + script_str = script_str.replace(r"\\\n", "\n").replace(r"\\\\", "\\\\") # Unescape escape sequences. + script_parser = configparser.ConfigParser(interpolation=None) + script_parser.optionxform = str # type: ignore # Don't transform the setting keys as they are case-sensitive. + script_parser.read_string(script_str) + if "PauseAtHeight" in script_parser: + if "redo_layers" in script_parser["PauseAtHeight"]: + script_parser["PauseAtHeight"]["redo_layer"] = str(int(script_parser["PauseAtHeight"]["redo_layers"]) > 0) + del script_parser["PauseAtHeight"]["redo_layers"] # Has been renamed to without the S. + script_io = io.StringIO() + script_parser.write(script_io) + script_str = script_io.getvalue() + script_str = script_str.replace("\\\\", r"\\\\").replace("\n", r"\\\n") # Escape newlines because configparser sees those as section delimiters. + new_scripts_entries.append(script_str) + parser["metadata"]["post_processing_scripts"] = "\n".join(new_scripts_entries) + result = io.StringIO() parser.write(result) return [filename], [result.getvalue()] From 9976889e5e33240285fc08795795467b74c5c1e4 Mon Sep 17 00:00:00 2001 From: Psych0meter <38450421+Psych0meter@users.noreply.github.com> Date: Tue, 12 May 2020 11:13:51 +0200 Subject: [PATCH 6/6] Leapfrog Creatr HS / XL Integration (#7723) Add the leapfrog creatr HS and leapfrog creatr XL --- .../definitions/leapfrog_creatr_hs.def.json | 35 +++++++++++++++++++ .../leapfrog_creatr_hs_xl.def.json | 35 +++++++++++++++++++ .../leapfrog_creatr_hs_extruder_left.def.json | 18 ++++++++++ ...leapfrog_creatr_hs_extruder_right.def.json | 18 ++++++++++ ...apfrog_creatr_hs_xl_extruder_left.def.json | 18 ++++++++++ ...pfrog_creatr_hs_xl_extruder_right.def.json | 18 ++++++++++ 6 files changed, 142 insertions(+) create mode 100644 resources/definitions/leapfrog_creatr_hs.def.json create mode 100644 resources/definitions/leapfrog_creatr_hs_xl.def.json create mode 100644 resources/extruders/leapfrog_creatr_hs_extruder_left.def.json create mode 100644 resources/extruders/leapfrog_creatr_hs_extruder_right.def.json create mode 100644 resources/extruders/leapfrog_creatr_hs_xl_extruder_left.def.json create mode 100644 resources/extruders/leapfrog_creatr_hs_xl_extruder_right.def.json diff --git a/resources/definitions/leapfrog_creatr_hs.def.json b/resources/definitions/leapfrog_creatr_hs.def.json new file mode 100644 index 0000000000..762e1e88e2 --- /dev/null +++ b/resources/definitions/leapfrog_creatr_hs.def.json @@ -0,0 +1,35 @@ +{ + "version": 2, + "name": "Leapfrog Creatr HS", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Psychometer", + "manufacturer": "Leapfrog B.V.", + "file_formats": "text/x-gcode", + "supports_usb_connection": true, + "machine_extruder_trains": + { + "0": "leapfrog_creatr_hs_extruder_right", + "1": "leapfrog_creatr_hs_extruder_left" + } + }, + "overrides": { + "machine_name": {"default_value": "Leapfrog Creatr HS" }, + "machine_width": {"default_value": 270}, + "machine_depth": {"default_value": 280}, + "machine_height": {"default_value": 180}, + "machine_shape": { "default_value": "Rectangular"}, + "machine_center_is_zero": {"default_value": false}, + "machine_heated_bed": {"default_value": true}, + "build_volume_temperature": {"enabled": false}, + "machine_gcode_flavor": {"default_value": "Marlin"}, + + "machine_head_with_fans_polygon": {"default_value": [[-40, -50 ], [-40, 100], [40, -50 ], [40, 100]]}, + "gantry_height": {"value": "2"}, + "machine_extruder_count": {"default_value": 2}, + + "machine_start_gcode": {"default_value": "M107 ; start with the fan off\nG28 X0 Y0 ; home XY axes\nG28 Z0 ; home Z\nG92 X0 Y0 Z0 E0 ; reset software positions\nG1 Z15.0 F180\nT0\nG92 E0 ; zero the extruded length\nG1 E3 F200\nG92 E0 ; zero the extruded length again\nG1 F225"}, + "machine_end_gcode": {"default_value": "M104 S0 T0 ; turn off right extruder\nM104 S0 T1 ; turn off left extruder\nM140 S0 T0 ; turn off bed\nG1 Z200 F1200 ; drop bed\nG28 X0 ; home X axis\nM84 ; disable motors"} + } +} diff --git a/resources/definitions/leapfrog_creatr_hs_xl.def.json b/resources/definitions/leapfrog_creatr_hs_xl.def.json new file mode 100644 index 0000000000..78567ac647 --- /dev/null +++ b/resources/definitions/leapfrog_creatr_hs_xl.def.json @@ -0,0 +1,35 @@ +{ + "version": 2, + "name": "Leapfrog Creatr HS XL", + "inherits": "fdmprinter", + "metadata": { + "visible": true, + "author": "Psychometer", + "manufacturer": "Leapfrog B.V.", + "file_formats": "text/x-gcode", + "supports_usb_connection": true, + "machine_extruder_trains": + { + "0": "leapfrog_creatr_hs_xl_extruder_right", + "1": "leapfrog_creatr_hs_xl_extruder_left" + } + }, + "overrides": { + "machine_name": {"default_value": "Leapfrog Creatr HS XL" }, + "machine_width": {"default_value": 270}, + "machine_depth": {"default_value": 280}, + "machine_height": {"default_value": 590}, + "machine_shape": { "default_value": "Rectangular"}, + "machine_center_is_zero": {"default_value": false}, + "machine_heated_bed": {"default_value": true}, + "build_volume_temperature": {"enabled": false}, + "machine_gcode_flavor": {"default_value": "Marlin"}, + + "machine_head_with_fans_polygon": {"default_value": [[-40, -50 ], [-40, 100], [40, -50 ], [40, 100]]}, + "gantry_height": {"value": "2"}, + "machine_extruder_count": {"default_value": 2}, + + "machine_start_gcode": {"default_value": "M107 ; start with the fan off\nG28 X0 Y0 ; home XY axes\nG28 Z0 ; home Z\nG92 X0 Y0 Z0 E0 ; reset software positions\nG1 Z15.0 F180\nT0\nG92 E0 ; zero the extruded length\nG1 E3 F200\nG92 E0 ; zero the extruded length again\nG1 F225"}, + "machine_end_gcode": {"default_value": "G92 E0 ; Zero extruder\nG1 E-6.00 F1500 ; Retract filament\nM104 S0 T0 ; turn off right extruder\nM104 S0 T1 ; turn off left extruder\nM140 S0 T0 ; turn off bed\nG1 Z590 F1200 ; drop bed\nG28 X0 ; home X axis\nG1 Y270 F12000 ; Move Y axis to the backside\nM84 ; disable motors"} + } +} diff --git a/resources/extruders/leapfrog_creatr_hs_extruder_left.def.json b/resources/extruders/leapfrog_creatr_hs_extruder_left.def.json new file mode 100644 index 0000000000..52f3848e47 --- /dev/null +++ b/resources/extruders/leapfrog_creatr_hs_extruder_left.def.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "name": "Left extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "leapfrog_creatr_hs", + "position": "1" + }, + "overrides": { + "extruder_nr": { + "default_value": 1 + }, + "machine_nozzle_size": { "default_value": 0.35 }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_offset_x": { "default_value": 20 }, + "machine_nozzle_offset_y": { "default_value": 25 } + } +} \ No newline at end of file diff --git a/resources/extruders/leapfrog_creatr_hs_extruder_right.def.json b/resources/extruders/leapfrog_creatr_hs_extruder_right.def.json new file mode 100644 index 0000000000..6be5456210 --- /dev/null +++ b/resources/extruders/leapfrog_creatr_hs_extruder_right.def.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "name": "Right extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "leapfrog_creatr_hs", + "position": "0" + }, + "overrides": { + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { "default_value": 0.35 }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_offset_x": { "default_value": 35 }, + "machine_nozzle_offset_y": { "default_value": 25 } + } +} diff --git a/resources/extruders/leapfrog_creatr_hs_xl_extruder_left.def.json b/resources/extruders/leapfrog_creatr_hs_xl_extruder_left.def.json new file mode 100644 index 0000000000..647fd12a2c --- /dev/null +++ b/resources/extruders/leapfrog_creatr_hs_xl_extruder_left.def.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "name": "Left extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "leapfrog_creatr_hs_xl", + "position": "1" + }, + "overrides": { + "extruder_nr": { + "default_value": 1 + }, + "machine_nozzle_size": { "default_value": 0.35 }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_offset_x": { "default_value": 20 }, + "machine_nozzle_offset_y": { "default_value": 25 } + } +} \ No newline at end of file diff --git a/resources/extruders/leapfrog_creatr_hs_xl_extruder_right.def.json b/resources/extruders/leapfrog_creatr_hs_xl_extruder_right.def.json new file mode 100644 index 0000000000..b866b684b1 --- /dev/null +++ b/resources/extruders/leapfrog_creatr_hs_xl_extruder_right.def.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "name": "Right extruder", + "inherits": "fdmextruder", + "metadata": { + "machine": "leapfrog_creatr_hs_xl", + "position": "0" + }, + "overrides": { + "extruder_nr": { + "default_value": 0 + }, + "machine_nozzle_size": { "default_value": 0.35 }, + "material_diameter": { "default_value": 1.75 }, + "machine_nozzle_offset_x": { "default_value": 35 }, + "machine_nozzle_offset_y": { "default_value": 25 } + } +}