diff --git a/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py index 6e43e98969..64678189ab 100644 --- a/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py +++ b/plugins/PostProcessingPlugin/scripts/AddCoolingProfile.py @@ -286,7 +286,7 @@ class AddCoolingProfile(Script): "description": "For machines with independent layer cooling fans. Leaving a fan running while the other nozzle is printing can help with oozing. You can pick the speed % for the idle nozzle layer cooling fan to hold at.", "type": "bool", "default_value": false, - "enabled": "enable_off_fan_speed_enable" + "enabled": "enable_off_fan_speed_enable and self.extruder_count > 1" }, "off_fan_speed": { @@ -297,7 +297,7 @@ class AddCoolingProfile(Script): "minimum_value": 0, "maximum_value": 100, "unit": "% ", - "enabled": "enable_off_fan_speed_enable and enable_off_fan_speed" + "enabled": "enable_off_fan_speed_enable and enable_off_fan_speed and self.extruder_count > 1" }, "enable_off_fan_speed_enable": { @@ -378,13 +378,35 @@ class AddCoolingProfile(Script): if script_count > 0: # Set 'Remove M106 lines' to "false" if there is already an instance of this script running. self._instance.setProperty("delete_existing_m106", "value", False) + self._instance.setProperty("enable_off_fan_speed_enable", "value", False) if self.extruder_count > 1: if self.extruder_list[0].getProperty("machine_extruder_cooling_fan_number", "value") != self.extruder_list[1].getProperty("machine_extruder_cooling_fan_number", "value"): - self._instance.setProperty("enable_off_fan_speed_enable", "value", True) + self._instance.setProperty("enable_off_fan_speed_enable", "value", True) if bool(self.global_stack.getProperty("machine_heated_bed", "value")): self._instance.setProperty("enable_bv_fan", "value", True) - + def execute(self, data): + """ + Collect the settings from Cura and from this script + params: + t0_fan thru t3_fan: The fan numbers for up to 4 layer cooling circuits + fan_mode: Whether the fan scale will be 0-255 PWM (when true) or 0-1 RepRap (when false) + bed_adhesion: Is only important if a raft is enabled + print_seuence: Options are slightly different if in One-at-a-Time mode + is_multi-fan: Used to distinguish between a multi-extruder with a single fan for each nozzle, or one fan for both nozzles. + is_multi_extr_print: For the slight difference in handling a multi-extruder printer and a print that only uses one of the extruders. + fan_list: A list of fan speeds (even numbered items) and layer numbers (odd numbered items) + feature_speed_list: A list of the speeds for each ';TYPE:' in the gcode + feature_name_list: The list of each 'TYPE' in the gcode + off_fan_speed: The speed that will be maintained by the fan for the inactive extruder (for an anti-oozing effect) + init_fan: The fan number of the first extruder used in a print + delete_existing_m106: The first instance of the script in the post processing list should remove the CUra M106 lines. Following instances should not delete the changes made by the first instance. + feature_fan_combing: Whether or not to shut the cooling fan off during travel moves. + the_start_layer: When in By Feature this is the user selected start of the fan changes. + the_end_layer: When in By Feature this is the user selected end of the fan changes + the_end_is_enabled: When in By Feature, if the fan control ends before the print ends, then this will enable the Final Fan Speed to carry through to the print end. + + """ # Exit if the gcode has been previously post-processed. if ";POSTPROCESSED" in data[0]: return data @@ -396,8 +418,9 @@ class AddCoolingProfile(Script): # For 4.x versions that don't have the 0-1 option try: fan_mode = not bool(self.extruder_list[0].getProperty("machine_scale_fan_speed_zero_to_one", "value")) - except: + except AttributeError: pass + bed_adhesion = (self.extruder_list[0].getProperty("adhesion_type", "value")) print_sequence = str(self.global_stack.getProperty("print_sequence", "value")) @@ -454,7 +477,7 @@ class AddCoolingProfile(Script): # Catch a possible input error. if the_end_layer < the_start_layer: the_end_layer = the_start_layer - except: + except ValueError: the_end_layer = -1 # If there is an input error then default to the entire gcode file. # Get the speed for each feature @@ -480,7 +503,7 @@ class AddCoolingProfile(Script): if the_end_layer == -1 or the_end_is_enabled == False: the_end_layer = len(data) + 2 - # For multi-extruder printers with separate fans the 'idle' nozzle fan can be left on for ooze control + # For multi-extruder printers with separate cooling fans the 'idle' nozzle fan can be left on for ooze control off_fan_speed = 0 if self.extruder_count > 1: if self.getSettingValueByKey("enable_off_fan_speed"): @@ -494,7 +517,7 @@ class AddCoolingProfile(Script): number_of_raft_layers = 0 layer_0_index = 0 # Catch the number of raft layers. - for l_num in range(1,10,1): + for l_num in range(1,len(data) - 1): layer = data[l_num] if ";LAYER:-" in layer: number_of_raft_layers += 1 @@ -511,7 +534,7 @@ class AddCoolingProfile(Script): T2_used = False T3_used = False # Bypass the file header and ending gcode. - for num in range(1,len(data)-1,1): + for num in range(1,len(data)-1): lines = data[num] if "T0" in lines: T0_used = True @@ -635,10 +658,10 @@ class AddCoolingProfile(Script): layer = data[layer_num] data[layer_num] = re.sub(";MESH:NOMESH", ";MESH:NONMESH", layer) data = self._add_travel_comment(data, layer_0_index) - + if bool(self.getSettingValueByKey("bv_fan_speed_control_enable")): data = self._control_bv_fan(data) - + # Single Fan "By Layer" if by_layer_or_feature == "by_layer" and not is_multi_fan: return self._single_fan_by_layer(data, layer_0_index, fan_list, t0_fan) @@ -681,11 +704,12 @@ class AddCoolingProfile(Script): this_fan = str(t0_fan) start_index = str(len(multi_fan_data)) for num in range(0,15,2): + # The fan_list may not be in ascending order. Get the lowest layer number try: if int(fan_list[num]) < int(start_index): start_index = str(fan_list[num]) - except: + except ValueError: pass # Move the start point if delete_existing_m106 is false start_index = int(start_index) + int(layer_0_index) @@ -706,12 +730,13 @@ class AddCoolingProfile(Script): elif line == "T3": prev_fan = this_fan this_fan = t3_fan + # With Active Tool tracked - now the body of changes can start for l_index in range(int(start_index),len(multi_fan_data)-1,1): modified_data = "" layer = multi_fan_data[l_index] fan_lines = layer.split("\n") for fan_line in fan_lines: - # Prepare to shut down the previous fan and start the next one. + # Prepare to turn off the previous fan and start the next one. if fan_line.startswith("T"): if fan_line == "T0": this_fan = str(t0_fan) if fan_line == "T1": this_fan = str(t1_fan) @@ -751,6 +776,7 @@ class AddCoolingProfile(Script): for line in lines: if ";LAYER:" in line: layer_number = str(line.split(":")[1]) + continue if int(layer_number) >= int(the_start_layer) and int(layer_number) < int(the_end_layer)-1: temp = line.split(" ")[0] try: @@ -836,8 +862,9 @@ class AddCoolingProfile(Script): temp = line.split(" ")[0] try: name_index = feature_name_list.index(temp) - except: + except IndexError: name_index = -1 + if name_index != -1: modified_data += line + "\n" + feature_speed_list[name_index] + this_fan + "\n" current_fan_speed = str(feature_speed_list[name_index].split("S")[1]) @@ -848,6 +875,7 @@ class AddCoolingProfile(Script): current_fan_speed = "0" else: modified_data += line + "\n" + # If an end layer is defined - Insert the final speed and set the other variables to Final Speed to finish the file # There cannot be a 'break' here because if there are multiple fan numbers they still need to be shut off and turned on. elif line == ";LAYER:" + str(the_end_layer): @@ -857,6 +885,7 @@ class AddCoolingProfile(Script): else: # Layer and Tool get inserted into modified_data above. All other lines go into modified_data here if not line.startswith("T") and not line.startswith(";LAYER:"): modified_data += line + "\n" + if modified_data.endswith("\n"): modified_data = modified_data[0: - 1] multi_fan_data[l_index] = modified_data modified_data = "" @@ -950,7 +979,7 @@ class AddCoolingProfile(Script): return comment_data def _control_bv_fan(self, bv_data: str) -> str: - # Control the chamber fan + # Control any secondary fan. Can be used for an Auxilliary/Chamber fan bv_start_layer = self.getSettingValueByKey("bv_fan_start_layer") - 1 bv_end_layer = self.getSettingValueByKey("bv_fan_end_layer") bv_fan_nr = self.getSettingValueByKey("bv_fan_nr")