diff --git a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py index 1ba8b8213b..03cc2c31a7 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" @@ -364,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 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) 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()] 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 } + } +} 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;