From 0ba72bccf9f5f66f201450246ffe97248c86a9a1 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Sat, 20 Apr 2024 15:35:26 -0400 Subject: [PATCH 1/5] Re-write Time Lapse An update to the script. - Added insertion frequency - Added support for relative extrusion - Retract is now a boolean and the settings come from Cura. There won't be a retraction if there is already a retraction. --- .../PostProcessingPlugin/scripts/TimeLapse.py | 234 ++++++++++++------ 1 file changed, 157 insertions(+), 77 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 210199e087..788f948d22 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -1,17 +1,21 @@ # Copyright (c) 2020 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. # Created by Wayne Porter +# Re-write April 15, 2024 by GregValiant (Greg Foresi) +# Changes: +# Added insertion frequency +# Added support for Relative Extrusion mode +# Changed Retract to a boolean and when True use the regular Cura retract settings. +# Use the regular Cura settings for Travel Speed and Speed_Z instead of asking. +# Added code to prevent retracts when parking if the filament was already retracted. from ..Script import Script - +from UM.Application import Application class TimeLapse(Script): - def __init__(self): - super().__init__() def getSettingDataString(self): return """{ - "name": "Time Lapse", + "name": "Time Lapse Camera", "key": "TimeLapse", "metadata": {}, "version": 2, @@ -19,32 +23,48 @@ class TimeLapse(Script): { "trigger_command": { - "label": "Trigger camera command", - "description": "G-code command used to trigger camera.", + "label": "Camera Trigger Command", + "description": "G-code command used to trigger the camera. The command will be inserted at the ends of layers.", "type": "str", "default_value": "M240" }, + "insert_frequency": + { + "label": "How often (layers)", + "description": "Every so many layers (always starts at the first layer whether it's the model or a raft).", + "type": "enum", + "options": { + "every_layer": "Every Layer", + "every_2nd": "Every 2nd", + "every_3rd": "Every 3rd", + "every_5th": "Every 5th", + "every_10th": "Every 10th", + "every_25th": "Every 25th", + "every_50th": "Every 50th", + "every_100th": "Every 100th"}, + "default_value": "every_layer" + }, "pause_length": { - "label": "Pause length", - "description": "How long to wait (in ms) after camera was triggered.", + "label": "Wait for Camera", + "description": "How long to wait (in ms) after the camera was triggered before returning to the print.", "type": "int", "default_value": 700, "minimum_value": 0, - "unit": "ms" + "unit": "ms " }, "park_print_head": { "label": "Park Print Head", - "description": "Park the print head out of the way. Assumes absolute positioning.", + "description": "Park the print head out of the way.", "type": "bool", "default_value": true }, "head_park_x": { "label": "Park Print Head X", - "description": "What X location does the head move to for photo.", - "unit": "mm", + "description": "What X location does the head move to for the photo.", + "unit": "mm ", "type": "float", "default_value": 0, "enabled": "park_print_head" @@ -52,93 +72,153 @@ class TimeLapse(Script): "head_park_y": { "label": "Park Print Head Y", - "description": "What Y location does the head move to for photo.", - "unit": "mm", + "description": "What Y location does the head move to for the photo.", + "unit": "mm ", "type": "float", - "default_value": 190, - "enabled": "park_print_head" - }, - "park_feed_rate": - { - "label": "Park Feed Rate", - "description": "How fast does the head move to the park coordinates.", - "unit": "mm/s", - "type": "float", - "default_value": 9000, + "default_value": 0, "enabled": "park_print_head" }, "retract": { - "label": "Retraction Distance", - "description": "Filament retraction distance for camera trigger.", - "unit": "mm", - "type": "int", - "default_value": 0 + "label": "Retract when required", + "description": "Retract if there is not already a retraction. If unchecked then there will be no retraction even if there is none in the gcode. If retractions are not enabled in Cura there won't be a retraction regardless of this setting.", + "type": "bool", + "default_value": true }, "zhop": { "label": "Z-Hop Height When Parking", - "description": "Z-hop length before parking", - "unit": "mm", + "description": "The height to lift the nozzle off the print before parking.", + "unit": "mm ", "type": "float", - "default_value": 0 + "default_value": 2.0, + "minimum_value": 0.0 + }, + "ensure_final_image": + { + "label": "Ensure Final Image", + "description": "Depending on how the layer numbers work out with the 'How Often' frequency there might not be an image taken at the end of the last layer. This will ensure that one is taken. There is no parking because the 'End Gcode' occurs immediately after.", + "type": "bool", + "default_value": false } } }""" def execute(self, data): - feed_rate = self.getSettingValueByKey("park_feed_rate") + # Get the settings and initialize some variables + mycura = Application.getInstance().getGlobalContainerStack() + relative_extrusion = bool(mycura.getProperty("relative_extrusion", "value")) + extruder = mycura.extruderList + retract_speed = int(extruder[0].getProperty("retraction_speed", "value"))*60 + retract_dist = int(extruder[0].getProperty("retraction_amount", "value")) + retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) + speed_z = int(extruder[0].getProperty("speed_z_hop", "value"))*60 + if relative_extrusion: + rel_cmd = 83 + else: + rel_cmd = 82 + trav_speed = int(extruder[0].getProperty("speed_travel", "value"))*60 park_print_head = self.getSettingValueByKey("park_print_head") x_park = self.getSettingValueByKey("head_park_x") y_park = self.getSettingValueByKey("head_park_y") trigger_command = self.getSettingValueByKey("trigger_command") pause_length = self.getSettingValueByKey("pause_length") - retract = int(self.getSettingValueByKey("retract")) + retract = bool(self.getSettingValueByKey("retract")) zhop = self.getSettingValueByKey("zhop") - gcode_to_append = ";TimeLapse Begin\n" + ensure_final_image = bool(self.getSettingValueByKey("ensure_final_image")) + when_to_insert = self.getSettingValueByKey("insert_frequency") last_x = 0 last_y = 0 last_z = 0 - + last_e = 0 + prev_e = 0 + is_retracted = False + gcode_to_append = "" if park_print_head: - gcode_to_append += self.putValue(G=1, F=feed_rate, - X=x_park, Y=y_park) + " ;Park print head\n" - gcode_to_append += self.putValue(M=400) + " ;Wait for moves to finish\n" - gcode_to_append += trigger_command + " ;Snap Photo\n" - gcode_to_append += self.putValue(G=4, P=pause_length) + " ;Wait for camera\n" - - for idx, layer in enumerate(data): - for line in layer.split("\n"): - if self.getValue(line, "G") in {0, 1}: # Track X,Y,Z location. - last_x = self.getValue(line, "X", last_x) - last_y = self.getValue(line, "Y", last_y) - last_z = self.getValue(line, "Z", last_z) - # Check that a layer is being printed - lines = layer.split("\n") - for line in lines: - if ";LAYER:" in line: - if retract != 0: # Retract the filament so no stringing happens - layer += self.putValue(M=83) + " ;Extrude Relative\n" - layer += self.putValue(G=1, E=-retract, F=3000) + " ;Retract filament\n" - layer += self.putValue(M=82) + " ;Extrude Absolute\n" - layer += self.putValue(M=400) + " ;Wait for moves to finish\n" # Wait to fully retract before hopping - - if zhop != 0: - layer += self.putValue(G=1, Z=last_z+zhop, F=3000) + " ;Z-Hop\n" - - layer += gcode_to_append - - if zhop != 0: - layer += self.putValue(G=0, X=last_x, Y=last_y, Z=last_z) + "; Restore position \n" - else: - layer += self.putValue(G=0, X=last_x, Y=last_y) + "; Restore position \n" - - if retract != 0: - layer += self.putValue(M=400) + " ;Wait for moves to finish\n" - layer += self.putValue(M=83) + " ;Extrude Relative\n" - layer += self.putValue(G=1, E=retract, F=3000) + " ;Retract filament\n" - layer += self.putValue(M=82) + " ;Extrude Absolute\n" - - data[idx] = layer - break + gcode_to_append += f"G1 F{trav_speed} X{x_park} Y{y_park} ;Park print head\n" + gcode_to_append += "M400 ;Wait for moves to finish\n" + gcode_to_append += trigger_command + " ;Snap the Image\n" + gcode_to_append += f"G4 P{pause_length} ;Wait for camera\n" + match when_to_insert: + case "every_layer": + step_freq = 1 + case "every_2nd": + step_freq = 2 + case "every_3rd": + step_freq = 3 + case "every_5th": + step_freq = 5 + case "every_10th": + step_freq = 10 + case "every_25th": + step_freq = 25 + case "every_50th": + step_freq = 50 + case "every_100th": + step_freq = 100 + case _: + step_freq = 1 + # Use the step_freq to index through the layers---------------------------------------- + for num in range(2,len(data)-1,step_freq): + layer = data[num] + try: + # Track X,Y,Z location.-------------------------------------------------------- + for line in layer.split("\n"): + if self.getValue(line, "G") in {0, 1}: + last_x = self.getValue(line, "X", last_x) + last_y = self.getValue(line, "Y", last_y) + last_z = self.getValue(line, "Z", last_z) + #Track the E location so that if there is already a retraction we don't double dip. + if rel_cmd == 82: + if " E" in line: + last_e = line.split("E")[1] + if float(last_e) < float(prev_e): + is_retracted = True + else: + is_retracted = False + prev_e = last_e + elif rel_cmd == 83: + if " E" in line: + last_e = line.split("E")[1] + if float(last_e) < 0: + is_retracted = True + else: + is_retracted = False + prev_e = last_e + # Insert the code---------------------------------------------------- + lines = layer.split("\n") + camera_code = "" + for line in lines: + if ";LAYER:" in line: + # Retract unless already retracted + if retract and not is_retracted and retract_enabled: + camera_code += ";TYPE:CUSTOM-----------------TimeLapse Begin\n" + camera_code += "M83 ;Extrude Relative\n" + camera_code += f"G1 F{retract_speed} E-{retract_dist} ;Retract filament\n" + else: + camera_code += ";TYPE:CUSTOM-----------------TimeLapse Begin\n" + if zhop != 0: + camera_code += f"G1 F{speed_z} Z{last_z + zhop} ;Z-Hop\n" + camera_code += gcode_to_append + camera_code += self.putValue(G=0, F=trav_speed, X=last_x, Y=last_y) + " ;Restore XY position \n" + if zhop != 0: + camera_code += self.putValue(G=0, F=speed_z, Z=last_z) + " ;Restore Z position \n" + if retract and not is_retracted and retract_enabled: + camera_code += self.putValue(G=1, E=retract_dist, F=retract_speed) + " ;Un-Retract filament\n" + camera_code += self.putValue(M=rel_cmd) + " ;Extrude Mode\n" + camera_code += f";{'-' * 28}TimeLapse End" + # Format the camera code to be inserted + temp_lines = camera_code.split("\n") + for temp_index, temp_line in enumerate(temp_lines): + if ";" in temp_line and not temp_line.startswith(";"): + temp_lines[temp_index] = temp_line.replace(temp_line.split(";")[0], temp_line.split(";")[0] + str(" " * (29 - len(temp_line.split(";")[0]))),1) + temp_lines = "\n".join(temp_lines) + lines.insert(len(lines) - 2, temp_lines) + data[num] = "\n".join(lines) + break + except: + pass + # Take a final image if there was no camera shot at the end of the last layer. + if "TimeLapse Begin" not in data[len(data) - (3 if retract_enabled else 2)] and ensure_final_image: + data[len(data)-1] = "M400 ; Wait for all moves to finish\n" + trigger_command + " ;Snap the final Image\n" + f"G4 P{pause_length} ;Wait for camera\n" + data[len(data)-1] return data From 0e0d022fe67b688a11998db2ed0b4acce1f57dd5 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Tue, 14 May 2024 08:39:41 -0400 Subject: [PATCH 2/5] Update TimeLapse.py Added support for Firmware Retraction --- .../PostProcessingPlugin/scripts/TimeLapse.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 788f948d22..7c4c6fc49c 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -4,6 +4,7 @@ # Changes: # Added insertion frequency # Added support for Relative Extrusion mode +# Added support for Firmware Retraction # Changed Retract to a boolean and when True use the regular Cura retract settings. # Use the regular Cura settings for Travel Speed and Speed_Z instead of asking. # Added code to prevent retracts when parking if the filament was already retracted. @@ -111,7 +112,8 @@ class TimeLapse(Script): extruder = mycura.extruderList retract_speed = int(extruder[0].getProperty("retraction_speed", "value"))*60 retract_dist = int(extruder[0].getProperty("retraction_amount", "value")) - retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) + retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) + firmware_retraction = bool(mycura.getProperty("machine_firmware_retract", "value")) speed_z = int(extruder[0].getProperty("speed_z_hop", "value"))*60 if relative_extrusion: rel_cmd = 83 @@ -185,6 +187,11 @@ class TimeLapse(Script): else: is_retracted = False prev_e = last_e + if self.getValue(line, "G") in {10, 11}: + if line.startswith("G10"): + is_retracted = True + if line.startswith("G11"): + is_retracted = False # Insert the code---------------------------------------------------- lines = layer.split("\n") camera_code = "" @@ -194,7 +201,10 @@ class TimeLapse(Script): if retract and not is_retracted and retract_enabled: camera_code += ";TYPE:CUSTOM-----------------TimeLapse Begin\n" camera_code += "M83 ;Extrude Relative\n" - camera_code += f"G1 F{retract_speed} E-{retract_dist} ;Retract filament\n" + if not firmware_retraction: + camera_code += f"G1 F{retract_speed} E-{retract_dist} ;Retract filament\n" + else: + camera_code += "G10 ;Retract filament\n" else: camera_code += ";TYPE:CUSTOM-----------------TimeLapse Begin\n" if zhop != 0: @@ -204,7 +214,10 @@ class TimeLapse(Script): if zhop != 0: camera_code += self.putValue(G=0, F=speed_z, Z=last_z) + " ;Restore Z position \n" if retract and not is_retracted and retract_enabled: - camera_code += self.putValue(G=1, E=retract_dist, F=retract_speed) + " ;Un-Retract filament\n" + if not firmware_retraction: + camera_code += self.putValue(G=1, E=retract_dist, F=retract_speed) + " ;Un-Retract filament\n" + else: + camera_code += "G11 ;Un-Retract filament\n" camera_code += self.putValue(M=rel_cmd) + " ;Extrude Mode\n" camera_code += f";{'-' * 28}TimeLapse End" # Format the camera code to be inserted From ffc21403a13763c145ea55eec436bd27e0f2fb93 Mon Sep 17 00:00:00 2001 From: GregValiant <64202104+GregValiant@users.noreply.github.com> Date: Thu, 22 Aug 2024 12:47:15 -0400 Subject: [PATCH 3/5] Update TimeLapse.py Update TimeLapse.py Update to include a pause before the image is snapped. --- .../PostProcessingPlugin/scripts/TimeLapse.py | 96 +++++++++++-------- 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 7c4c6fc49c..6295464056 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -1,18 +1,19 @@ -# Copyright (c) 2020 Ultimaker B.V. -# Created by Wayne Porter -# Re-write April 15, 2024 by GregValiant (Greg Foresi) -# Changes: +# Modified 5/15/2023 - Greg Valiant (Greg Foresi) +# Created by Wayne Porter # Added insertion frequency -# Added support for Relative Extrusion mode -# Added support for Firmware Retraction -# Changed Retract to a boolean and when True use the regular Cura retract settings. +# Adjusted for use with Relative Extrusion +# Changed Retract to a boolean and when true use the regular Cura retract settings. # Use the regular Cura settings for Travel Speed and Speed_Z instead of asking. -# Added code to prevent retracts when parking if the filament was already retracted. +# Added code to check the E location to prevent retracts if the filament was already retracted. +# Added 'Pause before image' per LemanRus from ..Script import Script from UM.Application import Application +from UM.Logger import Logger class TimeLapse(Script): + def __init__(self): + super().__init__() def getSettingDataString(self): return """{ @@ -25,7 +26,7 @@ class TimeLapse(Script): "trigger_command": { "label": "Camera Trigger Command", - "description": "G-code command used to trigger the camera. The command will be inserted at the ends of layers.", + "description": "G-code command used to trigger the camera. The setting box will take any command and parameters.", "type": "str", "default_value": "M240" }, @@ -45,12 +46,21 @@ class TimeLapse(Script): "every_100th": "Every 100th"}, "default_value": "every_layer" }, + "anti_shake_length": + { + "label": "Pause before image", + "description": "How long to wait (in ms) before capturing the image. This is to allow the printer to 'settle down' after movement. To disable set this to '0'.", + "type": "int", + "default_value": 0, + "minimum_value": 0, + "unit": "ms " + }, "pause_length": { - "label": "Wait for Camera", - "description": "How long to wait (in ms) after the camera was triggered before returning to the print.", + "label": "Pause after image", + "description": "How long to wait (in ms) after camera was triggered.", "type": "int", - "default_value": 700, + "default_value": 500, "minimum_value": 0, "unit": "ms " }, @@ -64,8 +74,8 @@ class TimeLapse(Script): "head_park_x": { "label": "Park Print Head X", - "description": "What X location does the head move to for the photo.", - "unit": "mm ", + "description": "What X location does the head move to for photo.", + "unit": "mm", "type": "float", "default_value": 0, "enabled": "park_print_head" @@ -73,7 +83,7 @@ class TimeLapse(Script): "head_park_y": { "label": "Park Print Head Y", - "description": "What Y location does the head move to for the photo.", + "description": "What Y location does the head move to for photo.", "unit": "mm ", "type": "float", "default_value": 0, @@ -82,7 +92,7 @@ class TimeLapse(Script): "retract": { "label": "Retract when required", - "description": "Retract if there is not already a retraction. If unchecked then there will be no retraction even if there is none in the gcode. If retractions are not enabled in Cura there won't be a retraction regardless of this setting.", + "description": "Retract if there isn't already a retraction. If unchecked then there will be no retraction even if there is none in the gcode. If retractions are not enabled in Cura there won't be a retraction. regardless of this setting.", "type": "bool", "default_value": true }, @@ -98,7 +108,7 @@ class TimeLapse(Script): "ensure_final_image": { "label": "Ensure Final Image", - "description": "Depending on how the layer numbers work out with the 'How Often' frequency there might not be an image taken at the end of the last layer. This will ensure that one is taken. There is no parking because the 'End Gcode' occurs immediately after.", + "description": "Depending on how the layer numbers work out with the 'How Often' frequency there might not be an image taken at the end of the last layer. This will ensure that one is taken. There is no parking as the Ending Gcode comes right up.", "type": "bool", "default_value": false } @@ -106,20 +116,19 @@ class TimeLapse(Script): }""" def execute(self, data): - # Get the settings and initialize some variables mycura = Application.getInstance().getGlobalContainerStack() relative_extrusion = bool(mycura.getProperty("relative_extrusion", "value")) extruder = mycura.extruderList retract_speed = int(extruder[0].getProperty("retraction_speed", "value"))*60 - retract_dist = int(extruder[0].getProperty("retraction_amount", "value")) - retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) - firmware_retraction = bool(mycura.getProperty("machine_firmware_retract", "value")) + retract_dist = round(float(extruder[0].getProperty("retraction_amount", "value")), 2) + retract_enabled = bool(extruder[0].getProperty("retraction_enable", "value")) + firmware_retract = bool(mycura.getProperty("machine_firmware_retract", "value")) speed_z = int(extruder[0].getProperty("speed_z_hop", "value"))*60 if relative_extrusion: rel_cmd = 83 else: rel_cmd = 82 - trav_speed = int(extruder[0].getProperty("speed_travel", "value"))*60 + travel_speed = int(extruder[0].getProperty("speed_travel", "value"))*60 park_print_head = self.getSettingValueByKey("park_print_head") x_park = self.getSettingValueByKey("head_park_x") y_park = self.getSettingValueByKey("head_park_y") @@ -137,10 +146,13 @@ class TimeLapse(Script): is_retracted = False gcode_to_append = "" if park_print_head: - gcode_to_append += f"G1 F{trav_speed} X{x_park} Y{y_park} ;Park print head\n" + gcode_to_append += f"G0 F{travel_speed} X{x_park} Y{y_park} ;Park print head\n" gcode_to_append += "M400 ;Wait for moves to finish\n" + anti_shake_length = self.getSettingValueByKey("anti_shake_length") + if anti_shake_length > 0: + gcode_to_append += f"G4 P{anti_shake_length} ;Wait for printer to settle down\n" gcode_to_append += trigger_command + " ;Snap the Image\n" - gcode_to_append += f"G4 P{pause_length} ;Wait for camera\n" + gcode_to_append += f"G4 P{pause_length} ;Wait for camera to finish\n" match when_to_insert: case "every_layer": step_freq = 1 @@ -170,7 +182,7 @@ class TimeLapse(Script): last_x = self.getValue(line, "X", last_x) last_y = self.getValue(line, "Y", last_y) last_z = self.getValue(line, "Z", last_z) - #Track the E location so that if there is already a retraction we don't double dip. + #Track the E location so that if there is already a retraction we don't double dip. if rel_cmd == 82: if " E" in line: last_e = line.split("E")[1] @@ -187,38 +199,40 @@ class TimeLapse(Script): else: is_retracted = False prev_e = last_e - if self.getValue(line, "G") in {10, 11}: - if line.startswith("G10"): + if firmware_retract and self.getValue(line, "G") in {10, 11}: + if self.getValue(line, "G") == 10: is_retracted = True - if line.startswith("G11"): + last_e = float(prev_e) - float(retract_dist) + if self.getValue(line, "G") == 11: is_retracted = False - # Insert the code---------------------------------------------------- + last_e = float(prev_e) + float(retract_dist) + prev_e = last_e lines = layer.split("\n") + # Insert the code---------------------------------------------------- camera_code = "" for line in lines: if ";LAYER:" in line: - # Retract unless already retracted - if retract and not is_retracted and retract_enabled: + if retract and not is_retracted and retract_enabled: # Retract unless already retracted camera_code += ";TYPE:CUSTOM-----------------TimeLapse Begin\n" camera_code += "M83 ;Extrude Relative\n" - if not firmware_retraction: + if not firmware_retract: camera_code += f"G1 F{retract_speed} E-{retract_dist} ;Retract filament\n" else: camera_code += "G10 ;Retract filament\n" else: camera_code += ";TYPE:CUSTOM-----------------TimeLapse Begin\n" if zhop != 0: - camera_code += f"G1 F{speed_z} Z{last_z + zhop} ;Z-Hop\n" + camera_code += f"G1 F{speed_z} Z{round(last_z + zhop,2)} ;Z-Hop\n" camera_code += gcode_to_append - camera_code += self.putValue(G=0, F=trav_speed, X=last_x, Y=last_y) + " ;Restore XY position \n" + camera_code += f"G0 F{travel_speed} X{last_x} Y{last_y} ;Restore XY position\n" if zhop != 0: - camera_code += self.putValue(G=0, F=speed_z, Z=last_z) + " ;Restore Z position \n" + camera_code += f"G0 F{speed_z} Z{last_z} ;Restore Z position\n" if retract and not is_retracted and retract_enabled: - if not firmware_retraction: - camera_code += self.putValue(G=1, E=retract_dist, F=retract_speed) + " ;Un-Retract filament\n" + if not firmware_retract: + camera_code += f"G1 F{retract_speed} E{retract_dist} ;Un-Retract filament\n" else: - camera_code += "G11 ;Un-Retract filament\n" - camera_code += self.putValue(M=rel_cmd) + " ;Extrude Mode\n" + camera_code += "G11 ;Un-Retract filament\n" + camera_code += f"M{rel_cmd} ;Extrude Mode\n" camera_code += f";{'-' * 28}TimeLapse End" # Format the camera code to be inserted temp_lines = camera_code.split("\n") @@ -229,8 +243,8 @@ class TimeLapse(Script): lines.insert(len(lines) - 2, temp_lines) data[num] = "\n".join(lines) break - except: - pass + except Exception as e: + Logger.log("w", "TimeLapse Error: " + repr(e)) # Take a final image if there was no camera shot at the end of the last layer. if "TimeLapse Begin" not in data[len(data) - (3 if retract_enabled else 2)] and ensure_final_image: data[len(data)-1] = "M400 ; Wait for all moves to finish\n" + trigger_command + " ;Snap the final Image\n" + f"G4 P{pause_length} ;Wait for camera\n" + data[len(data)-1] From e4b4b8e4a4fa5351331d2146617b6b595a0fc14e Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Tue, 1 Oct 2024 15:16:43 +0200 Subject: [PATCH 4/5] Remove extra-spaces after units --- plugins/PostProcessingPlugin/scripts/TimeLapse.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py index 6295464056..f78765f3f0 100644 --- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py +++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py @@ -53,7 +53,7 @@ class TimeLapse(Script): "type": "int", "default_value": 0, "minimum_value": 0, - "unit": "ms " + "unit": "ms" }, "pause_length": { @@ -62,7 +62,7 @@ class TimeLapse(Script): "type": "int", "default_value": 500, "minimum_value": 0, - "unit": "ms " + "unit": "ms" }, "park_print_head": { @@ -84,7 +84,7 @@ class TimeLapse(Script): { "label": "Park Print Head Y", "description": "What Y location does the head move to for photo.", - "unit": "mm ", + "unit": "mm", "type": "float", "default_value": 0, "enabled": "park_print_head" @@ -100,7 +100,7 @@ class TimeLapse(Script): { "label": "Z-Hop Height When Parking", "description": "The height to lift the nozzle off the print before parking.", - "unit": "mm ", + "unit": "mm", "type": "float", "default_value": 2.0, "minimum_value": 0.0 From e3211d412849637ced23eeacce9f6fb74ab79428 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 2 Oct 2024 12:57:25 +0200 Subject: [PATCH 5/5] Make slicing work for the --external-backend option again. --- plugins/CuraEngineBackend/CuraEngineBackend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index a7126af14e..af015396e3 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -570,7 +570,8 @@ class CuraEngineBackend(QObject, Backend): return # Preparation completed, send it to the backend. - if not self._socket.sendMessage(job.getSliceMessage()): + immediate_success = self._socket.sendMessage(job.getSliceMessage()) + if (not CuraApplication.getInstance().getUseExternalBackend()) and (not immediate_success): if self._last_socket_error is not None and self._last_socket_error.getErrorCode() == Arcus.ErrorCode.MessageTooBigError: error_txt = catalog.i18nc("@info:status", "Unable to send the model data to the engine. Please try to use a less detailed model, or reduce the number of instances.") else: