From ad82da4cba7a40521875f6e985547b89a3f34f96 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sun, 27 Mar 2022 13:38:21 +0200 Subject: [PATCH 001/171] Update anycubic_i3_mega_s.def.json Added nozzle size --- resources/definitions/anycubic_i3_mega_s.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/anycubic_i3_mega_s.def.json b/resources/definitions/anycubic_i3_mega_s.def.json index bf14aed04c..b30b152fbc 100644 --- a/resources/definitions/anycubic_i3_mega_s.def.json +++ b/resources/definitions/anycubic_i3_mega_s.def.json @@ -29,7 +29,7 @@ "machine_center_is_zero": { "default_value": false }, "gantry_height": { "value": "0" }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { "default_value": ";Profil Homepage: https://github.com/NilsRo/Cura_Anycubic_MegaS_Profile\n\n;Slicer Information - (Support for OctoPrint Slicer Estimator)\n;Slicer info:material_guid;{material_guid}\n;Slicer info:material_id;{material_id}\n;Slicer info:material_brand;{material_brand}\n;Slicer info:material_name;{material_name}\n;Slicer info:material_bed_temperature;{material_bed_temperature}\n;Slicer info:material_bed_temperature_layer_0;{material_bed_temperature_layer_0}\n;Slicer info:material_print_temperature;{material_print_temperature}\n;Slicer info:material_print_temperature_layer_0;{material_print_temperature_layer_0}\n;Slicer info:material_flow;{material_flow}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:wall_thickness;{wall_thickness}\n;Slicer info:speed_print;{speed_print}\n;Slicer info:speed_topbottom;{speed_topbottom}\n;Slicer info:travel_speed;{travel_speed}\n;Slicer info:support;{support}\n;Slicer info:retraction_speed;{retraction_speed}\n;Slicer info:retraction_amount;{retraction_amount}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:infill_pattern;{infill_pattern}\n;Slicer info:infill_sparse_density;{infill_sparse_density}\n;Slicer info:cool_fan_enabled;{cool_fan_enabled}\n;Slicer info:cool_fan_speed;{cool_fan_speed}\n;Slicer info:sliced_at;{day} {date} {time}\nG21 ; metric values \nG90 ; absolute positioning \nM82 ; set extruder to absolute mode \nM107 ; start with the fan off \nM140 S{material_bed_temperature_layer_0} ; Start heating the bed \nG4 S60 ; wait 1 minute \nM104 S{material_print_temperature_layer_0} ; start heating the hot end \nM190 S{material_bed_temperature_layer_0} ; wait for bed \nM109 S{material_print_temperature_layer_0} ; wait for hotend \nM300 S1000 P500 ; BEEP heating done \nG28 X0 Y10 Z0 ; move X/Y to min endstops \nM420 S1 ; Enable leveling \nM420 Z2.0 ; Set leveling fading height to 2 mm \nG0 Z0.15 ; lift nozzle a bit \nG92 E0 ; zero the extruded length \nG1 X50 E20 F500 ; Extrude 20mm of filament in a 5cm line. \nG92 E0 ; zero the extruded length again \nG1 E-2 F500 ; Retract a little \nG1 X120 F4000 ; Quickly wipe away from the filament line`" }, + "machine_start_gcode": { "default_value": ";Profil Homepage: https://github.com/NilsRo/Cura_Anycubic_MegaS_Profile\n\n;Slicer Information - (Support for OctoPrint Slicer Estimator)\n;Slicer info:material_guid;{material_guid}\n;Slicer info:material_id;{material_id}\n;Slicer info:material_brand;{material_brand}\n;Slicer info:material_name;{material_name}\n;Slicer info:material_bed_temperature;{material_bed_temperature}\n;Slicer info:material_bed_temperature_layer_0;{material_bed_temperature_layer_0}\n;Slicer info:material_print_temperature;{material_print_temperature}\n;Slicer info:material_print_temperature_layer_0;{material_print_temperature_layer_0}\n;Slicer info:material_flow;{material_flow}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:machine_nozzle_size;{machine_nozzle_size}\n;Slicer info:wall_thickness;{wall_thickness}\n;Slicer info:speed_print;{speed_print}\n;Slicer info:speed_topbottom;{speed_topbottom}\n;Slicer info:travel_speed;{travel_speed}\n;Slicer info:support;{support}\n;Slicer info:retraction_speed;{retraction_speed}\n;Slicer info:retraction_amount;{retraction_amount}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:infill_pattern;{infill_pattern}\n;Slicer info:infill_sparse_density;{infill_sparse_density}\n;Slicer info:cool_fan_enabled;{cool_fan_enabled}\n;Slicer info:cool_fan_speed;{cool_fan_speed}\n;Slicer info:sliced_at;{day} {date} {time}\nG21 ; metric values \nG90 ; absolute positioning \nM82 ; set extruder to absolute mode \nM107 ; start with the fan off \nM140 S{material_bed_temperature_layer_0} ; Start heating the bed \nG4 S60 ; wait 1 minute \nM104 S{material_print_temperature_layer_0} ; start heating the hot end \nM190 S{material_bed_temperature_layer_0} ; wait for bed \nM109 S{material_print_temperature_layer_0} ; wait for hotend \nM300 S1000 P500 ; BEEP heating done \nG28 X0 Y10 Z0 ; move X/Y to min endstops \nM420 S1 ; Enable leveling \nM420 Z2.0 ; Set leveling fading height to 2 mm \nG0 Z0.15 ; lift nozzle a bit \nG92 E0 ; zero the extruded length \nG1 X50 E20 F500 ; Extrude 20mm of filament in a 5cm line. \nG92 E0 ; zero the extruded length again \nG1 E-2 F500 ; Retract a little \nG1 X120 F4000 ; Quickly wipe away from the filament line`" }, "machine_end_gcode": { "default_value": "M104 S0 ; Extruder off \nM140 S0 ; Heatbed off \nM107 ; Fan off \nG91 ; relative positioning \nG1 E-5 F300 ; retract a little \nG1 Z+10 E-5 ; X-20 Y-20 F{travel_xy_speed} ; lift print head \nG28 X0 Y0 ; homing \nG1 Y180 F2000 ; reset feedrate \nM84 ; disable stepper motors \nG90 ; absolute positioning \nM300 S440 P200 ; Make Print Completed Tones \nM300 S660 P250 ; beep \nM300 S880 P300 ; beep" }, "machine_max_acceleration_x": { "value": 3000 }, From 62cbc5abe2f299ddcc137a5281af94c1d4683c2e Mon Sep 17 00:00:00 2001 From: NilsRo Date: Wed, 30 Mar 2022 07:43:40 +0200 Subject: [PATCH 002/171] Update anycubic_i3_mega_s.def.json dynamic wall_thickness by nozzle diameter --- resources/definitions/anycubic_i3_mega_s.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/anycubic_i3_mega_s.def.json b/resources/definitions/anycubic_i3_mega_s.def.json index b30b152fbc..d9e53e0afc 100644 --- a/resources/definitions/anycubic_i3_mega_s.def.json +++ b/resources/definitions/anycubic_i3_mega_s.def.json @@ -139,6 +139,6 @@ "minimum_support_area": { "value": 2 }, "minimum_interface_area": { "value": 10 }, "top_bottom_thickness": { "value": "layer_height_0 + layer_height * math.floor(1.2 / layer_height)" }, - "wall_thickness": { "value": "line_width * 3" } + "wall_thickness": { "value": "line_width * 3 if line_width < 0.6 else line_width * 2" } } } From 558f7a963d81a36434bca63a803b16189f303916 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Wed, 30 Mar 2022 07:50:05 +0200 Subject: [PATCH 003/171] Update anycubic_i3_mega_s.def.json Dynamic wall thickness by nozzle diameter --- resources/definitions/anycubic_i3_mega_s.def.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/resources/definitions/anycubic_i3_mega_s.def.json b/resources/definitions/anycubic_i3_mega_s.def.json index d9e53e0afc..0f33f95c40 100644 --- a/resources/definitions/anycubic_i3_mega_s.def.json +++ b/resources/definitions/anycubic_i3_mega_s.def.json @@ -51,6 +51,9 @@ "material_final_print_temperature": { "value": "material_print_temperature" }, "material_flow": { "value": 100 }, + "top_bottom_thickness": { "value": "layer_height_0 + layer_height * math.floor(1.2 / layer_height)" }, + "wall_thickness": { "value": "line_width * 3 if line_width < 0.6 else line_width * 2" }, + "acceleration_print": { "value": 1500 }, "acceleration_enabled": { "value": false }, "acceleration_travel": { "value": 3000 }, @@ -137,8 +140,6 @@ "support_interface_pattern": { "value": "'grid'" }, "support_interface_skip_height": { "value": 0.2 }, "minimum_support_area": { "value": 2 }, - "minimum_interface_area": { "value": 10 }, - "top_bottom_thickness": { "value": "layer_height_0 + layer_height * math.floor(1.2 / layer_height)" }, - "wall_thickness": { "value": "line_width * 3 if line_width < 0.6 else line_width * 2" } + "minimum_interface_area": { "value": 10 } } } From df3e93218af9fa2038d1edfd1d31c4459f426314 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sun, 3 Apr 2022 17:10:24 +0200 Subject: [PATCH 004/171] Update anycubic_i3_mega_s.def.json Added filment costs to standard --- resources/definitions/anycubic_i3_mega_s.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/anycubic_i3_mega_s.def.json b/resources/definitions/anycubic_i3_mega_s.def.json index 0f33f95c40..db9ccf7072 100644 --- a/resources/definitions/anycubic_i3_mega_s.def.json +++ b/resources/definitions/anycubic_i3_mega_s.def.json @@ -29,7 +29,7 @@ "machine_center_is_zero": { "default_value": false }, "gantry_height": { "value": "0" }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { "default_value": ";Profil Homepage: https://github.com/NilsRo/Cura_Anycubic_MegaS_Profile\n\n;Slicer Information - (Support for OctoPrint Slicer Estimator)\n;Slicer info:material_guid;{material_guid}\n;Slicer info:material_id;{material_id}\n;Slicer info:material_brand;{material_brand}\n;Slicer info:material_name;{material_name}\n;Slicer info:material_bed_temperature;{material_bed_temperature}\n;Slicer info:material_bed_temperature_layer_0;{material_bed_temperature_layer_0}\n;Slicer info:material_print_temperature;{material_print_temperature}\n;Slicer info:material_print_temperature_layer_0;{material_print_temperature_layer_0}\n;Slicer info:material_flow;{material_flow}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:machine_nozzle_size;{machine_nozzle_size}\n;Slicer info:wall_thickness;{wall_thickness}\n;Slicer info:speed_print;{speed_print}\n;Slicer info:speed_topbottom;{speed_topbottom}\n;Slicer info:travel_speed;{travel_speed}\n;Slicer info:support;{support}\n;Slicer info:retraction_speed;{retraction_speed}\n;Slicer info:retraction_amount;{retraction_amount}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:infill_pattern;{infill_pattern}\n;Slicer info:infill_sparse_density;{infill_sparse_density}\n;Slicer info:cool_fan_enabled;{cool_fan_enabled}\n;Slicer info:cool_fan_speed;{cool_fan_speed}\n;Slicer info:sliced_at;{day} {date} {time}\nG21 ; metric values \nG90 ; absolute positioning \nM82 ; set extruder to absolute mode \nM107 ; start with the fan off \nM140 S{material_bed_temperature_layer_0} ; Start heating the bed \nG4 S60 ; wait 1 minute \nM104 S{material_print_temperature_layer_0} ; start heating the hot end \nM190 S{material_bed_temperature_layer_0} ; wait for bed \nM109 S{material_print_temperature_layer_0} ; wait for hotend \nM300 S1000 P500 ; BEEP heating done \nG28 X0 Y10 Z0 ; move X/Y to min endstops \nM420 S1 ; Enable leveling \nM420 Z2.0 ; Set leveling fading height to 2 mm \nG0 Z0.15 ; lift nozzle a bit \nG92 E0 ; zero the extruded length \nG1 X50 E20 F500 ; Extrude 20mm of filament in a 5cm line. \nG92 E0 ; zero the extruded length again \nG1 E-2 F500 ; Retract a little \nG1 X120 F4000 ; Quickly wipe away from the filament line`" }, + "machine_start_gcode": { "default_value": ";Profil Homepage: https://github.com/NilsRo/Cura_Anycubic_MegaS_Profile\n\n;Slicer Information - (Support for OctoPrint Slicer Estimator)\n;Slicer info:material_guid;{material_guid}\n;Slicer info:material_id;{material_id}\n;Slicer info:material_brand;{material_brand}\n;Slicer info:material_name;{material_name}\n;Slicer info:filament_cost;{filament_cost}\n;Slicer info:material_bed_temperature;{material_bed_temperature}\n;Slicer info:material_bed_temperature_layer_0;{material_bed_temperature_layer_0}\n;Slicer info:material_print_temperature;{material_print_temperature}\n;Slicer info:material_print_temperature_layer_0;{material_print_temperature_layer_0}\n;Slicer info:material_flow;{material_flow}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:machine_nozzle_size;{machine_nozzle_size}\n;Slicer info:wall_thickness;{wall_thickness}\n;Slicer info:speed_print;{speed_print}\n;Slicer info:speed_topbottom;{speed_topbottom}\n;Slicer info:travel_speed;{travel_speed}\n;Slicer info:support;{support}\n;Slicer info:retraction_speed;{retraction_speed}\n;Slicer info:retraction_amount;{retraction_amount}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:infill_pattern;{infill_pattern}\n;Slicer info:infill_sparse_density;{infill_sparse_density}\n;Slicer info:cool_fan_enabled;{cool_fan_enabled}\n;Slicer info:cool_fan_speed;{cool_fan_speed}\n;Slicer info:sliced_at;{day} {date} {time}\nG21 ; metric values \nG90 ; absolute positioning \nM82 ; set extruder to absolute mode \nM107 ; start with the fan off \nM140 S{material_bed_temperature_layer_0} ; Start heating the bed \nG4 S60 ; wait 1 minute \nM104 S{material_print_temperature_layer_0} ; start heating the hot end \nM190 S{material_bed_temperature_layer_0} ; wait for bed \nM109 S{material_print_temperature_layer_0} ; wait for hotend \nM300 S1000 P500 ; BEEP heating done \nG28 X0 Y10 Z0 ; move X/Y to min endstops \nM420 S1 ; Enable leveling \nM420 Z2.0 ; Set leveling fading height to 2 mm \nG0 Z0.15 ; lift nozzle a bit \nG92 E0 ; zero the extruded length \nG1 X50 E20 F500 ; Extrude 20mm of filament in a 5cm line. \nG92 E0 ; zero the extruded length again \nG1 E-2 F500 ; Retract a little \nG1 X120 F4000 ; Quickly wipe away from the filament line`" }, "machine_end_gcode": { "default_value": "M104 S0 ; Extruder off \nM140 S0 ; Heatbed off \nM107 ; Fan off \nG91 ; relative positioning \nG1 E-5 F300 ; retract a little \nG1 Z+10 E-5 ; X-20 Y-20 F{travel_xy_speed} ; lift print head \nG28 X0 Y0 ; homing \nG1 Y180 F2000 ; reset feedrate \nM84 ; disable stepper motors \nG90 ; absolute positioning \nM300 S440 P200 ; Make Print Completed Tones \nM300 S660 P250 ; beep \nM300 S880 P300 ; beep" }, "machine_max_acceleration_x": { "value": 3000 }, From 836a7cc2d1b2bbe6d1b0176ed65983d608b21ee7 Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Wed, 20 Apr 2022 16:02:28 -0400 Subject: [PATCH 005/171] Add Anneal After Print PostProcessingPlugin This new plugin generates annealing gcode with the following features: - Bed and chamber heating options - Provides progress bar and time remaining feedback - Beep on annealing start - Gradual annealing cooldown to desired temperature --- .../scripts/AnnealAfterPrint.py | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py diff --git a/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py b/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py new file mode 100644 index 0000000000..a9cffd9e88 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py @@ -0,0 +1,160 @@ +# Copyright (c) 2021 Anson Liu +# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. + +from ..Script import Script + +class AnnealAfterPrint(Script): + """Adds timed annealing GCODE after objects finish printing. + + Bed annealing works best with a glass bed and a plastic container placed on top of the object during annealing. + """ + + def getSettingDataString(self): + return """{ + "name": "Anneal After Print", + "key": "AnnealAfterPrint", + "metadata": {}, + "version": 2, + "settings": + { + "heatingElement": + { + "label": "Heating Element", + "description": "Printer heating element to use for annealing.", + "type": "enum", + "options": + { + "bed": "Bed", + "chamber": "Chamber", + "all": "Bed and Chamber" + }, + "default_value": "bed" + }, + "annealBedTemp": + { + "label": "Bed Temperature", + "description": "Bed temperature annealing. Recommended bed temperature is greater of build plate printing or vendor specified annealing temperature for material. E.g. PC 90-110 C, PLA 60-90 C", + "unit": "C", + "type": "float", + "default_value": 0, + "minimum_value": 0, + "enabled": "heatingElement == \\\"bed\\\" or heatingElement == \\\"all\\\"" + }, + "annealChamberTemp": + { + "label": "Chamber Temperature", + "description": "Chamber temperature for annealing.", + "unit": "C", + "type": "float", + "default_value": 0, + "minimum_value": 0, + "enabled": "heatingElement == \\\"chamber\\\" or heatingElement == \\\"all\\\"" + }, + "annealMinutes": + { + "label": "Annealing Target Temperature Duration", + "description": "Duration in minutes to anneal at target temperature. After duration ends gradually cool down to End Cooling Temperature.", + "unit": "min", + "type": "int", + "default_value": 120, + "minimum_value": 0 + }, + "reminderBeep": + { + "label": "Beep on annealing start", + "description": "", + "type": "bool", + "default_value": false + }, + "endCoolingTemp": + { + "label": "End Cooling Temperature", + "description": "Temperature to end gradual cooling at. After annealing at target temperature for specified duration temperature decreases by 1 degree after 1 minute at each step.", + "unit": "C", + "type": "float", + "default_value": 50, + "minimum_value": 0 + } + } + }""" + + def generateAnnealCode(self, annealBedTemp, annealChamberTemp, annealMinutes, initialBeep, endCoolingTemp): + anneal_code = ';Generated Annealing GCODE by Anson Liu' + + if initialBeep: + anneal_code += '\nM300 ;play beep for plastic container placement reminder' + + anneal_code += '\nM117 ' + if annealBedTemp: + anneal_code += 'Place plastic container over objects on bed now! ' + anneal_code += 'Waiting until annealing temp reached...' + anneal_code += '\nM73 P00 ;reset progress bar to 0' + + if annealBedTemp: + anneal_code += '\nM190 R{} ;wait for buildplate to reach temp in C even if cooling'.format(annealBedTemp) + if annealChamberTemp: + anneal_code += '\nM191 R{} ;wait for chamber to reach temp in C even if cooling'.format(annealChamberTemp) + + anneal_code += '\nM117 ' + if annealBedTemp: + anneal_code += 'Keep plastic container over objects. ' + anneal_code += 'Annealing...' + anneal_code += '\nM73 P00' # reset progress bar to 0 + + def generateDwellAndProgressCode(minutes): # Update progress bar and time every minute + dp_code = 'M73 P0 R{}'.format(minutes) + for x in range(1, minutes+1): + dwellWaitSeconds = 60 + dp_code += '\nG4 S{}'.format(dwellWaitSeconds) + progress = round(x/minutes * 100, 2) + remainingMinutes = minutes - x + dp_code += '\nM73 P{} R{}'.format(progress, remainingMinutes) + + return dp_code + + anneal_code += '\n' + generateDwellAndProgressCode(int(annealMinutes)) + + anneal_code += '\nM117 Annealing complete. Gradually lowering bed temperature...' + + for x in reversed(range(endCoolingTemp, max(annealBedTemp, annealChamberTemp))): + if annealBedTemp and annealBedTemp > x: + anneal_code += '\nM190 S{}'.format(x) # Wait for buildplate only if heating + if annealChamberTemp and annealChamberTemp > x: + anneal_code += '\nM191 S{}'.format(x) + anneal_code += '\nG4 S60' # Wait 60 seconds after reaching each cooldown temperature + + if annealBedTemp: + anneal_code += '\nM140 S0' + if annealChamberTemp: + anneal_code += '\nM141 S0' + anneal_code += '\nM117 Annealing complete.' + + return anneal_code + + def execute(self, data): + heating_element = self.getSettingValueByKey("heatingElement") + + # Set bed and chamber temp to true/false value based on heating element selection + anneal_bed_temp = 0 + anneal_chamber_temp = 0 + if heating_element == "bed" or heating_element == "all": + anneal_bed_temp = self.getSettingValueByKey("annealBedTemp") + if heating_element == "chamber" or heating_element == "all": + anneal_chamber_temp = self.getSettingValueByKey("annealChamberTemp") + + anneal_minutes = self.getSettingValueByKey("annealMinutes") + initial_beep = self.getSettingValueByKey("firmware_config") + final_cooling_temp = self.getSettingValueByKey("endCoolingTemp") + + # Test printing the generated anneal code + #print(self.generateAnnealCode(110, 120, False, 50)) + anneal_code = self.generateAnnealCode(anneal_bed_temp, anneal_chamber_temp, anneal_minutes, initial_beep, final_cooling_temp) + + try: + end_of_gcode_index = data[-1].index(';End sof Gcode') + except ValueError: + data[-1] += anneal_code + '\n' + else: + data[-1] = data[-1][:end_of_gcode_index] + anneal_code + '\n' + data[-1][end_of_gcode_index:] + + return data \ No newline at end of file From e39b1d8bb37bb127e92fc68337a5ea254dbee8ee Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Wed, 20 Apr 2022 16:16:33 -0400 Subject: [PATCH 006/171] Update AnnealAfterPrint.py --- plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py b/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py index a9cffd9e88..7ca8fac79d 100644 --- a/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py +++ b/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py @@ -151,10 +151,10 @@ class AnnealAfterPrint(Script): anneal_code = self.generateAnnealCode(anneal_bed_temp, anneal_chamber_temp, anneal_minutes, initial_beep, final_cooling_temp) try: - end_of_gcode_index = data[-1].index(';End sof Gcode') + end_of_gcode_index = data[-1].index(';End of Gcode') except ValueError: data[-1] += anneal_code + '\n' else: data[-1] = data[-1][:end_of_gcode_index] + anneal_code + '\n' + data[-1][end_of_gcode_index:] - return data \ No newline at end of file + return data From b8b7ec0666b2f281fc24730af75bcee1af818cc6 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sat, 14 May 2022 09:29:06 +0200 Subject: [PATCH 007/171] Update anycubic_i3_mega_s.def.json first layer speed inheritance --- resources/definitions/anycubic_i3_mega_s.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/anycubic_i3_mega_s.def.json b/resources/definitions/anycubic_i3_mega_s.def.json index db9ccf7072..c2dd2be358 100644 --- a/resources/definitions/anycubic_i3_mega_s.def.json +++ b/resources/definitions/anycubic_i3_mega_s.def.json @@ -74,8 +74,8 @@ "speed_roofing": { "value": "speed_topbottom" }, "speed_travel": { "value": 100.0, "maximum_value_warning": 150.0, "maximum_value": 200.0 }, "speed_layer_0": { "value": "speed_topbottom if speed_topbottom < 20 else 20" }, - "speed_print_layer_0": { "value": "speed_topbottom if speed_topbottom < 20 else 20" }, - "speed_travel_layer_0": { "value": 100.0 }, + "speed_print_layer_0": { "value": "speed_layer_0" }, + "speed_travel_layer_0": { "value": "speed_travel" }, "speed_prime_tower": { "value": "speed_topbottom" }, "speed_support": { "value": "speed_wall_0" }, "speed_support_interface": { "value": "speed_topbottom" }, From 7b4d8585f916e8e84a58eaa4dfb03bf588197638 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sat, 14 May 2022 09:46:53 +0200 Subject: [PATCH 008/171] Update anycubic_i3_mega_s.def.json Added maximum temp warnings --- resources/definitions/anycubic_i3_mega_s.def.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/resources/definitions/anycubic_i3_mega_s.def.json b/resources/definitions/anycubic_i3_mega_s.def.json index c2dd2be358..f04b6a8467 100644 --- a/resources/definitions/anycubic_i3_mega_s.def.json +++ b/resources/definitions/anycubic_i3_mega_s.def.json @@ -47,8 +47,12 @@ "machine_max_jerk_e": { "value": 5 }, "material_diameter": { "default_value": 1.75 }, - "material_print_temperature_layer_0": { "value": "material_print_temperature + 5"}, + "material_print_temperature": { "maximum_value_warning": 260 }, + "material_print_temperature_layer_0": { "value": "material_print_temperature + 5", "maximum_value_warning": 260 }, "material_final_print_temperature": { "value": "material_print_temperature" }, + "material_bed_temperature": { "maximum_value_warning": 110 }, + "material_bed_temperature_layer_0": { "maximum_value_warning": 110 }, + "material_flow": { "value": 100 }, "top_bottom_thickness": { "value": "layer_height_0 + layer_height * math.floor(1.2 / layer_height)" }, From 1f5589828b7601490fbb41fb4dfac1dbfd4215fe Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sun, 15 May 2022 19:59:24 +0200 Subject: [PATCH 009/171] Update anycubic_i3_mega_s.def.json Updated FAN Optimized initial purge of filament --- resources/definitions/anycubic_i3_mega_s.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/anycubic_i3_mega_s.def.json b/resources/definitions/anycubic_i3_mega_s.def.json index f04b6a8467..2e972c78b6 100644 --- a/resources/definitions/anycubic_i3_mega_s.def.json +++ b/resources/definitions/anycubic_i3_mega_s.def.json @@ -29,7 +29,7 @@ "machine_center_is_zero": { "default_value": false }, "gantry_height": { "value": "0" }, "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" }, - "machine_start_gcode": { "default_value": ";Profil Homepage: https://github.com/NilsRo/Cura_Anycubic_MegaS_Profile\n\n;Slicer Information - (Support for OctoPrint Slicer Estimator)\n;Slicer info:material_guid;{material_guid}\n;Slicer info:material_id;{material_id}\n;Slicer info:material_brand;{material_brand}\n;Slicer info:material_name;{material_name}\n;Slicer info:filament_cost;{filament_cost}\n;Slicer info:material_bed_temperature;{material_bed_temperature}\n;Slicer info:material_bed_temperature_layer_0;{material_bed_temperature_layer_0}\n;Slicer info:material_print_temperature;{material_print_temperature}\n;Slicer info:material_print_temperature_layer_0;{material_print_temperature_layer_0}\n;Slicer info:material_flow;{material_flow}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:machine_nozzle_size;{machine_nozzle_size}\n;Slicer info:wall_thickness;{wall_thickness}\n;Slicer info:speed_print;{speed_print}\n;Slicer info:speed_topbottom;{speed_topbottom}\n;Slicer info:travel_speed;{travel_speed}\n;Slicer info:support;{support}\n;Slicer info:retraction_speed;{retraction_speed}\n;Slicer info:retraction_amount;{retraction_amount}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:infill_pattern;{infill_pattern}\n;Slicer info:infill_sparse_density;{infill_sparse_density}\n;Slicer info:cool_fan_enabled;{cool_fan_enabled}\n;Slicer info:cool_fan_speed;{cool_fan_speed}\n;Slicer info:sliced_at;{day} {date} {time}\nG21 ; metric values \nG90 ; absolute positioning \nM82 ; set extruder to absolute mode \nM107 ; start with the fan off \nM140 S{material_bed_temperature_layer_0} ; Start heating the bed \nG4 S60 ; wait 1 minute \nM104 S{material_print_temperature_layer_0} ; start heating the hot end \nM190 S{material_bed_temperature_layer_0} ; wait for bed \nM109 S{material_print_temperature_layer_0} ; wait for hotend \nM300 S1000 P500 ; BEEP heating done \nG28 X0 Y10 Z0 ; move X/Y to min endstops \nM420 S1 ; Enable leveling \nM420 Z2.0 ; Set leveling fading height to 2 mm \nG0 Z0.15 ; lift nozzle a bit \nG92 E0 ; zero the extruded length \nG1 X50 E20 F500 ; Extrude 20mm of filament in a 5cm line. \nG92 E0 ; zero the extruded length again \nG1 E-2 F500 ; Retract a little \nG1 X120 F4000 ; Quickly wipe away from the filament line`" }, + "machine_start_gcode": { "default_value": ";Profil Homepage: https://github.com/NilsRo/Cura_Anycubic_MegaS_Profile\n\n;Slicer Information - (Support for OctoPrint Slicer Estimator)\n;Slicer info:material_guid;{material_guid}\n;Slicer info:material_id;{material_id}\n;Slicer info:material_brand;{material_brand}\n;Slicer info:material_name;{material_name}\n;Slicer info:filament_cost;{filament_cost}\n;Slicer info:material_bed_temperature;{material_bed_temperature}\n;Slicer info:material_bed_temperature_layer_0;{material_bed_temperature_layer_0}\n;Slicer info:material_print_temperature;{material_print_temperature}\n;Slicer info:material_print_temperature_layer_0;{material_print_temperature_layer_0}\n;Slicer info:material_flow;{material_flow}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:machine_nozzle_size;{machine_nozzle_size}\n;Slicer info:wall_thickness;{wall_thickness}\n;Slicer info:speed_print;{speed_print}\n;Slicer info:speed_topbottom;{speed_topbottom}\n;Slicer info:travel_speed;{travel_speed}\n;Slicer info:support;{support}\n;Slicer info:retraction_speed;{retraction_speed}\n;Slicer info:retraction_amount;{retraction_amount}\n;Slicer info:layer_height;{layer_height}\n;Slicer info:infill_pattern;{infill_pattern}\n;Slicer info:infill_sparse_density;{infill_sparse_density}\n;Slicer info:cool_fan_enabled;{cool_fan_enabled}\n;Slicer info:cool_fan_speed;{cool_fan_speed}\n;Slicer info:sliced_at;{day} {date} {time}\nG21 ; metric values \nG90 ; absolute positioning \nM82 ; set extruder to absolute mode \nM107 ; start with the fan off \nM140 S{material_bed_temperature_layer_0} ; Start heating the bed \nG4 S60 ; wait 1 minute \nM104 S{material_print_temperature_layer_0} ; start heating the hot end \nM190 S{material_bed_temperature_layer_0} ; wait for bed \nM109 S{material_print_temperature_layer_0} ; wait for hotend \nM300 S1000 P500 ; BEEP heating done \nG28 X0 Y10 Z0 ; move X/Y to min endstops \nM420 S1 ; Enable leveling \nM420 Z2.0 ; Set leveling fading height to 2 mm \nG0 Z0.15 ; lift nozzle a bit \nG92 E0 ; zero the extruded length \nG1 X50 E20 F500 ; Extrude 20mm of filament in a 5cm line. \nG92 E0 ; zero the extruded length again \nG1 E-2 F500 ; Retract a little \nG1 X50 F500 ; wipe away from the filament line\nG1 X100 F9000 ; Quickly wipe away from the filament line" }, "machine_end_gcode": { "default_value": "M104 S0 ; Extruder off \nM140 S0 ; Heatbed off \nM107 ; Fan off \nG91 ; relative positioning \nG1 E-5 F300 ; retract a little \nG1 Z+10 E-5 ; X-20 Y-20 F{travel_xy_speed} ; lift print head \nG28 X0 Y0 ; homing \nG1 Y180 F2000 ; reset feedrate \nM84 ; disable stepper motors \nG90 ; absolute positioning \nM300 S440 P200 ; Make Print Completed Tones \nM300 S660 P250 ; beep \nM300 S880 P300 ; beep" }, "machine_max_acceleration_x": { "value": 3000 }, @@ -111,7 +111,7 @@ "travel_retract_before_outer_wall": { "value": true }, "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_fan_speed": { "value": 70 }, + "cool_fan_speed": { "value": 100 }, "cool_fan_speed_0": { "value": 30 }, "cool_fan_enabled": { "value": true }, From c7946e5c78872d7ab51188195d349e430ade8efb Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Sat, 6 Aug 2022 16:54:37 -0400 Subject: [PATCH 010/171] Added Cooling Rate setting --- .../scripts/AnnealAfterPrint.py | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py b/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py index 7ca8fac79d..1e47f2d9af 100644 --- a/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py +++ b/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py @@ -1,4 +1,4 @@ -# Copyright (c) 2021 Anson Liu +# Copyright (c) 2022 Anson Liu # The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. from ..Script import Script @@ -6,10 +6,11 @@ from ..Script import Script class AnnealAfterPrint(Script): """Adds timed annealing GCODE after objects finish printing. - Bed annealing works best with a glass bed and a plastic container placed on top of the object during annealing. + Bed annealing works best with a glass bed and a container placed on top of the object during annealing. """ def getSettingDataString(self): + return """{ "name": "Anneal After Print", "key": "AnnealAfterPrint", @@ -20,7 +21,7 @@ class AnnealAfterPrint(Script): "heatingElement": { "label": "Heating Element", - "description": "Printer heating element to use for annealing.", + "description": "Printer heating element to use for annealing. Glass bed and 4-8 mm brim is recommended if XY dimensional stability is desired.", "type": "enum", "options": { @@ -33,7 +34,7 @@ class AnnealAfterPrint(Script): "annealBedTemp": { "label": "Bed Temperature", - "description": "Bed temperature annealing. Recommended bed temperature is greater of build plate printing or vendor specified annealing temperature for material. E.g. PC 90-110 C, PLA 60-90 C", + "description": "Bed temperature annealing. Recommended bed temperature is greater of build plate printing or vendor specified annealing temperature for material. Temperature should be between material glass transition temperature and melting point. E.g. PC 90-110 C, PLA 60-90 C", "unit": "C", "type": "float", "default_value": 0, @@ -43,7 +44,7 @@ class AnnealAfterPrint(Script): "annealChamberTemp": { "label": "Chamber Temperature", - "description": "Chamber temperature for annealing.", + "description": "Chamber temperature for annealing. Temperature should be between material glass transition temperature and melting point.", "unit": "C", "type": "float", "default_value": 0, @@ -57,7 +58,7 @@ class AnnealAfterPrint(Script): "unit": "min", "type": "int", "default_value": 120, - "minimum_value": 0 + "minimum_value": 1 }, "reminderBeep": { @@ -69,24 +70,37 @@ class AnnealAfterPrint(Script): "endCoolingTemp": { "label": "End Cooling Temperature", - "description": "Temperature to end gradual cooling at. After annealing at target temperature for specified duration temperature decreases by 1 degree after 1 minute at each step.", + "description": "Temperature to end gradual cooling at after annealing at target temperature for specified duration.", "unit": "C", "type": "float", "default_value": 50, "minimum_value": 0 + }, + "coolingRate": + { + "label": "Cooling Rate", + "description": "Gradual cooling rate. Temperature decreases by 1 C after specified seconds at each degree", + "unit": "sec/C", + "type": "int", + "default_value": 60, + "minimum_value": 0 } } }""" - def generateAnnealCode(self, annealBedTemp, annealChamberTemp, annealMinutes, initialBeep, endCoolingTemp): + settingData = settingData.format(anneal_temp_guideline) + print(settingData) + return settingData + + def generateAnnealCode(self, annealBedTemp, annealChamberTemp, annealMinutes, initialBeep, endCoolingTemp, coolingRate): anneal_code = ';Generated Annealing GCODE by Anson Liu' if initialBeep: - anneal_code += '\nM300 ;play beep for plastic container placement reminder' + anneal_code += '\nM300 ;play beep for container placement reminder' anneal_code += '\nM117 ' if annealBedTemp: - anneal_code += 'Place plastic container over objects on bed now! ' + anneal_code += 'Place container over objects on bed. ' anneal_code += 'Waiting until annealing temp reached...' anneal_code += '\nM73 P00 ;reset progress bar to 0' @@ -121,7 +135,7 @@ class AnnealAfterPrint(Script): anneal_code += '\nM190 S{}'.format(x) # Wait for buildplate only if heating if annealChamberTemp and annealChamberTemp > x: anneal_code += '\nM191 S{}'.format(x) - anneal_code += '\nG4 S60' # Wait 60 seconds after reaching each cooldown temperature + anneal_code += '\nG4 S{}'.format(int(coolingRate)) # Wait user specified seconds after reaching each cooldown temperature if annealBedTemp: anneal_code += '\nM140 S0' @@ -143,12 +157,13 @@ class AnnealAfterPrint(Script): anneal_chamber_temp = self.getSettingValueByKey("annealChamberTemp") anneal_minutes = self.getSettingValueByKey("annealMinutes") - initial_beep = self.getSettingValueByKey("firmware_config") + initial_beep = self.getSettingValueByKey("reminderBeep") final_cooling_temp = self.getSettingValueByKey("endCoolingTemp") + cooling_rate = self.getSettingValueByKey("coolingRate") # Test printing the generated anneal code #print(self.generateAnnealCode(110, 120, False, 50)) - anneal_code = self.generateAnnealCode(anneal_bed_temp, anneal_chamber_temp, anneal_minutes, initial_beep, final_cooling_temp) + anneal_code = self.generateAnnealCode(anneal_bed_temp, anneal_chamber_temp, anneal_minutes, initial_beep, final_cooling_temp, cooling_rate) try: end_of_gcode_index = data[-1].index(';End of Gcode') From c8a4b8fe62a9439ea6c1bf2703a15c4024b3e59a Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Sun, 21 Aug 2022 22:44:10 -0400 Subject: [PATCH 011/171] Create definition file for UMO+ version of DXU Override default machine disallow area to fit UMO+ bed size --- resources/definitions/dxu_umo.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 resources/definitions/dxu_umo.def.json diff --git a/resources/definitions/dxu_umo.def.json b/resources/definitions/dxu_umo.def.json new file mode 100644 index 0000000000..315cfd0143 --- /dev/null +++ b/resources/definitions/dxu_umo.def.json @@ -0,0 +1,12 @@ +{ + "version": 2, + "name": "UMO+ DXU", + "inherits": "dxu", + "overrides": { + "machine_disallowed_areas": { + "default_value": [ + [[100, -102.5], [ 110, -102.5], [ 110, -62.5], [100, -62.5]] + ] + } + } +} From d25a3818033f9bd3d04d734288747f8b41ac5ef2 Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Sun, 21 Aug 2022 22:46:08 -0400 Subject: [PATCH 012/171] Create UMO+ version of dxu_dual definition Overrides machine disallowed area with correct values for UMO+ bed --- resources/definitions/dxu_umo_dual.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 resources/definitions/dxu_umo_dual.def.json diff --git a/resources/definitions/dxu_umo_dual.def.json b/resources/definitions/dxu_umo_dual.def.json new file mode 100644 index 0000000000..cf0658e49c --- /dev/null +++ b/resources/definitions/dxu_umo_dual.def.json @@ -0,0 +1,12 @@ +{ + "version": 2, + "name": "UMO+ DXU Dual", + "inherits": "dxu_dual", + "overrides": { + "machine_disallowed_areas": { + "default_value": [ + [[100, -102.5], [ 110, -102.5], [ 110, -62.5], [100, -62.5]] + ] + } + } +} From 4f39f58f64b157a0d0e26b9378de9e7a3d4458be Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Sun, 21 Aug 2022 22:47:07 -0400 Subject: [PATCH 013/171] Delete AnnealAfterPrint.py clean up dxu_umo branch --- .../scripts/AnnealAfterPrint.py | 175 ------------------ 1 file changed, 175 deletions(-) delete mode 100644 plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py diff --git a/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py b/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py deleted file mode 100644 index 1e47f2d9af..0000000000 --- a/plugins/PostProcessingPlugin/scripts/AnnealAfterPrint.py +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright (c) 2022 Anson Liu -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. - -from ..Script import Script - -class AnnealAfterPrint(Script): - """Adds timed annealing GCODE after objects finish printing. - - Bed annealing works best with a glass bed and a container placed on top of the object during annealing. - """ - - def getSettingDataString(self): - - return """{ - "name": "Anneal After Print", - "key": "AnnealAfterPrint", - "metadata": {}, - "version": 2, - "settings": - { - "heatingElement": - { - "label": "Heating Element", - "description": "Printer heating element to use for annealing. Glass bed and 4-8 mm brim is recommended if XY dimensional stability is desired.", - "type": "enum", - "options": - { - "bed": "Bed", - "chamber": "Chamber", - "all": "Bed and Chamber" - }, - "default_value": "bed" - }, - "annealBedTemp": - { - "label": "Bed Temperature", - "description": "Bed temperature annealing. Recommended bed temperature is greater of build plate printing or vendor specified annealing temperature for material. Temperature should be between material glass transition temperature and melting point. E.g. PC 90-110 C, PLA 60-90 C", - "unit": "C", - "type": "float", - "default_value": 0, - "minimum_value": 0, - "enabled": "heatingElement == \\\"bed\\\" or heatingElement == \\\"all\\\"" - }, - "annealChamberTemp": - { - "label": "Chamber Temperature", - "description": "Chamber temperature for annealing. Temperature should be between material glass transition temperature and melting point.", - "unit": "C", - "type": "float", - "default_value": 0, - "minimum_value": 0, - "enabled": "heatingElement == \\\"chamber\\\" or heatingElement == \\\"all\\\"" - }, - "annealMinutes": - { - "label": "Annealing Target Temperature Duration", - "description": "Duration in minutes to anneal at target temperature. After duration ends gradually cool down to End Cooling Temperature.", - "unit": "min", - "type": "int", - "default_value": 120, - "minimum_value": 1 - }, - "reminderBeep": - { - "label": "Beep on annealing start", - "description": "", - "type": "bool", - "default_value": false - }, - "endCoolingTemp": - { - "label": "End Cooling Temperature", - "description": "Temperature to end gradual cooling at after annealing at target temperature for specified duration.", - "unit": "C", - "type": "float", - "default_value": 50, - "minimum_value": 0 - }, - "coolingRate": - { - "label": "Cooling Rate", - "description": "Gradual cooling rate. Temperature decreases by 1 C after specified seconds at each degree", - "unit": "sec/C", - "type": "int", - "default_value": 60, - "minimum_value": 0 - } - } - }""" - - settingData = settingData.format(anneal_temp_guideline) - print(settingData) - return settingData - - def generateAnnealCode(self, annealBedTemp, annealChamberTemp, annealMinutes, initialBeep, endCoolingTemp, coolingRate): - anneal_code = ';Generated Annealing GCODE by Anson Liu' - - if initialBeep: - anneal_code += '\nM300 ;play beep for container placement reminder' - - anneal_code += '\nM117 ' - if annealBedTemp: - anneal_code += 'Place container over objects on bed. ' - anneal_code += 'Waiting until annealing temp reached...' - anneal_code += '\nM73 P00 ;reset progress bar to 0' - - if annealBedTemp: - anneal_code += '\nM190 R{} ;wait for buildplate to reach temp in C even if cooling'.format(annealBedTemp) - if annealChamberTemp: - anneal_code += '\nM191 R{} ;wait for chamber to reach temp in C even if cooling'.format(annealChamberTemp) - - anneal_code += '\nM117 ' - if annealBedTemp: - anneal_code += 'Keep plastic container over objects. ' - anneal_code += 'Annealing...' - anneal_code += '\nM73 P00' # reset progress bar to 0 - - def generateDwellAndProgressCode(minutes): # Update progress bar and time every minute - dp_code = 'M73 P0 R{}'.format(minutes) - for x in range(1, minutes+1): - dwellWaitSeconds = 60 - dp_code += '\nG4 S{}'.format(dwellWaitSeconds) - progress = round(x/minutes * 100, 2) - remainingMinutes = minutes - x - dp_code += '\nM73 P{} R{}'.format(progress, remainingMinutes) - - return dp_code - - anneal_code += '\n' + generateDwellAndProgressCode(int(annealMinutes)) - - anneal_code += '\nM117 Annealing complete. Gradually lowering bed temperature...' - - for x in reversed(range(endCoolingTemp, max(annealBedTemp, annealChamberTemp))): - if annealBedTemp and annealBedTemp > x: - anneal_code += '\nM190 S{}'.format(x) # Wait for buildplate only if heating - if annealChamberTemp and annealChamberTemp > x: - anneal_code += '\nM191 S{}'.format(x) - anneal_code += '\nG4 S{}'.format(int(coolingRate)) # Wait user specified seconds after reaching each cooldown temperature - - if annealBedTemp: - anneal_code += '\nM140 S0' - if annealChamberTemp: - anneal_code += '\nM141 S0' - anneal_code += '\nM117 Annealing complete.' - - return anneal_code - - def execute(self, data): - heating_element = self.getSettingValueByKey("heatingElement") - - # Set bed and chamber temp to true/false value based on heating element selection - anneal_bed_temp = 0 - anneal_chamber_temp = 0 - if heating_element == "bed" or heating_element == "all": - anneal_bed_temp = self.getSettingValueByKey("annealBedTemp") - if heating_element == "chamber" or heating_element == "all": - anneal_chamber_temp = self.getSettingValueByKey("annealChamberTemp") - - anneal_minutes = self.getSettingValueByKey("annealMinutes") - initial_beep = self.getSettingValueByKey("reminderBeep") - final_cooling_temp = self.getSettingValueByKey("endCoolingTemp") - cooling_rate = self.getSettingValueByKey("coolingRate") - - # Test printing the generated anneal code - #print(self.generateAnnealCode(110, 120, False, 50)) - anneal_code = self.generateAnnealCode(anneal_bed_temp, anneal_chamber_temp, anneal_minutes, initial_beep, final_cooling_temp, cooling_rate) - - try: - end_of_gcode_index = data[-1].index(';End of Gcode') - except ValueError: - data[-1] += anneal_code + '\n' - else: - data[-1] = data[-1][:end_of_gcode_index] + anneal_code + '\n' + data[-1][end_of_gcode_index:] - - return data From 11350097aaa7413c8cce99db7fc799c1edf774ad Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Mon, 12 Sep 2022 14:59:14 -0400 Subject: [PATCH 014/171] Update dxu_umo_dual.def.json --- resources/definitions/dxu_umo_dual.def.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/definitions/dxu_umo_dual.def.json b/resources/definitions/dxu_umo_dual.def.json index cf0658e49c..82f8675fb0 100644 --- a/resources/definitions/dxu_umo_dual.def.json +++ b/resources/definitions/dxu_umo_dual.def.json @@ -7,6 +7,15 @@ "default_value": [ [[100, -102.5], [ 110, -102.5], [ 110, -62.5], [100, -62.5]] ] + }, + "machine_width": { "default_value": 220 }, + "machine_depth": { "default_value": 205 }, + "machine_height": { "default_value": 200 }, + "machine_nozzle_heat_up_speed": { + "default_value": 2.0 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 0.8 } } } From 6472c679fd51eb262014de220dec37ec1b320735 Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Mon, 12 Sep 2022 14:59:30 -0400 Subject: [PATCH 015/171] Update dxu_umo.def.json --- resources/definitions/dxu_umo.def.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/resources/definitions/dxu_umo.def.json b/resources/definitions/dxu_umo.def.json index 315cfd0143..ae1b671255 100644 --- a/resources/definitions/dxu_umo.def.json +++ b/resources/definitions/dxu_umo.def.json @@ -7,6 +7,15 @@ "default_value": [ [[100, -102.5], [ 110, -102.5], [ 110, -62.5], [100, -62.5]] ] + }, + "machine_width": { "default_value": 220 }, + "machine_depth": { "default_value": 205 }, + "machine_height": { "default_value": 200 }, + "machine_nozzle_heat_up_speed": { + "default_value": 2.0 + }, + "machine_nozzle_cool_down_speed": { + "default_value": 0.8 } } } From 4201305712d7de0633b49e7ec3a96e6a665f7e8c Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Tue, 20 Sep 2022 09:37:00 -0400 Subject: [PATCH 016/171] Update nozzle heat up speed --- resources/definitions/dxu_umo.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/dxu_umo.def.json b/resources/definitions/dxu_umo.def.json index ae1b671255..9347211224 100644 --- a/resources/definitions/dxu_umo.def.json +++ b/resources/definitions/dxu_umo.def.json @@ -12,7 +12,7 @@ "machine_depth": { "default_value": 205 }, "machine_height": { "default_value": 200 }, "machine_nozzle_heat_up_speed": { - "default_value": 2.0 + "default_value": 1.95 }, "machine_nozzle_cool_down_speed": { "default_value": 0.8 From 4830eb8f5af55db3c768bcf86e2a42036e5de86b Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Tue, 20 Sep 2022 09:37:23 -0400 Subject: [PATCH 017/171] Update nozzle heat up speed --- resources/definitions/dxu_umo_dual.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/dxu_umo_dual.def.json b/resources/definitions/dxu_umo_dual.def.json index 82f8675fb0..d0bea5b5a2 100644 --- a/resources/definitions/dxu_umo_dual.def.json +++ b/resources/definitions/dxu_umo_dual.def.json @@ -12,7 +12,7 @@ "machine_depth": { "default_value": 205 }, "machine_height": { "default_value": 200 }, "machine_nozzle_heat_up_speed": { - "default_value": 2.0 + "default_value": 1.95 }, "machine_nozzle_cool_down_speed": { "default_value": 0.8 From f1fc0b44f7bf8485d2bbbc30c5f1dba30a0f5d89 Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Wed, 5 Oct 2022 13:03:39 -0400 Subject: [PATCH 018/171] Updated start and end gcode --- resources/definitions/dxu_umo.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/definitions/dxu_umo.def.json b/resources/definitions/dxu_umo.def.json index 9347211224..be40747b6e 100644 --- a/resources/definitions/dxu_umo.def.json +++ b/resources/definitions/dxu_umo.def.json @@ -16,6 +16,18 @@ }, "machine_nozzle_cool_down_speed": { "default_value": 0.8 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_start_gcode" : { + "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"; Script based on an original created by tjjfvi (https://github.com/tjjfvi)\\n; An up-to-date version of the tjjfvi's original script can be found\\n; here: https://csi.t6.fyi/\\n; Note - This script will only work in Cura V4.2 and above!\\n; --- Global Settings\\n; layer_height = {layer_height}\\n; smooth_spiralized_contours = {smooth_spiralized_contours}\\n; magic_mesh_surface_mode = {magic_mesh_surface_mode}\\n; machine_extruder_count = {machine_extruder_count}\\n; --- Single Extruder Settings\\n; speed_z_hop = {speed_z_hop}\\n; retraction_amount = {retraction_amount}\\n; retraction_hop = {retraction_hop}\\n; retraction_hop_enabled = {retraction_hop_enabled}\\n; retraction_enable = {retraction_enable}\\n; retraction_speed = {retraction_speed}\\n; retraction_retract_speed = {retraction_retract_speed}\\n; retraction_prime_speed = {retraction_prime_speed}\\n; speed_travel = {speed_travel}\\n\\nM355 S1 P25;turn on case light\\n\\n;material_bed_temperature={material_bed_temperature} material_print_temperature={material_print_temperature} material_print_temperature_layer_0={material_print_temperature_layer_0}\\nM190 S{material_bed_temperature_layer_0}\\nG21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nM200 D0 T{initial_extruder_nr} ;reset filament diameter\\nG28 ;home all\\nT{initial_extruder_nr} ;switch to the first nozzle used for print\\nM104 T{initial_extruder_nr} S{material_standby_temperature, initial_extruder_nr}\\nG0 X25 Y20 F7200 ;change Y20 to Y0 ansonl\\nG0 Z20 F2400\\nM109 T{initial_extruder_nr} S{material_print_temperature_layer_0, initial_extruder_nr}\\nG0 X210 Y0 F7200\\nG92 E-12.0 ; increase purge 6.5 to 12\\nG1 E0 F200 ;purge nozzle ;change F45 to F200 like ultimaker code ansonl\\nG1 E-6.5 F1500\\nG1 E0 F1500\\nG1 Y50 F9000 ;add quick movement to Y50 like ultimaker code ansonl\\nM400 ;finish all moves\\nT{initial_extruder_nr}\\n;end of startup sequence\\n\\nM355 S1 P50;turn on case light\"" + }, + "machine_end_gcode" : { + "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \";end code from UM3\\nG91 ;Relative movement\\nG0 F15000 X8.0 Y8.0 Z3.5 E-4.5 ;Wiping+material retraction ;increase bed lower 0.5>5.0 and add Y movement\\nG0 F10000 Z1.5 E4.5 ;Compensation for the retraction\\nG90 ;Disable relative movement\\n\\nG90 ;absolute positioning\\nM104 S0 T0 ;extruder heater off\\nM104 S0 T1\\nM140 S0 ;turn off bed\\nT0 ; move to the first head\\nM107 ;fan off\\nM355 S0 ;turn off case light\"" } } } From 1b705338b813be75b4295c0ecf24684110899763 Mon Sep 17 00:00:00 2001 From: Anson Liu Date: Wed, 5 Oct 2022 13:04:04 -0400 Subject: [PATCH 019/171] Updated dual extruder start and end gcode --- resources/definitions/dxu_umo_dual.def.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/resources/definitions/dxu_umo_dual.def.json b/resources/definitions/dxu_umo_dual.def.json index d0bea5b5a2..1744bf1d52 100644 --- a/resources/definitions/dxu_umo_dual.def.json +++ b/resources/definitions/dxu_umo_dual.def.json @@ -16,6 +16,18 @@ }, "machine_nozzle_cool_down_speed": { "default_value": 0.8 + }, + "machine_nozzle_size": { + "default_value": 0.4 + }, + "material_diameter": { + "default_value": 1.75 + }, + "machine_start_gcode" : { + "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"; Script based on an original created by tjjfvi (https://github.com/tjjfvi)\\n; An up-to-date version of the tjjfvi's original script can be found\\n; here: https://csi.t6.fyi/\\n; Note - This script will only work in Cura V4.2 and above!\\n; --- Global Settings\\n; layer_height = {layer_height}\\n; smooth_spiralized_contours = {smooth_spiralized_contours}\\n; magic_mesh_surface_mode = {magic_mesh_surface_mode}\\n; machine_extruder_count = {machine_extruder_count}\\n; --- Single Extruder Settings\\n; speed_z_hop = {speed_z_hop}\\n; retraction_amount = {retraction_amount}\\n; retraction_hop = {retraction_hop}\\n; retraction_hop_enabled = {retraction_hop_enabled}\\n; retraction_enable = {retraction_enable}\\n; retraction_speed = {retraction_speed}\\n; retraction_retract_speed = {retraction_retract_speed}\\n; retraction_prime_speed = {retraction_prime_speed}\\n; speed_travel = {speed_travel}\\n; --- Multi-Extruder Settings\\n; speed_z_hop_0 = {speed_z_hop, 0}\\n; speed_z_hop_1 = {speed_z_hop, 1}\\n; retraction_amount_0 = {retraction_amount, 0}\\n; retraction_amount_1 = {retraction_amount, 1}\\n; retraction_hop_0 = {retraction_hop, 0}\\n; retraction_hop_1 = {retraction_hop, 1}\\n; retraction_hop_enabled_0 = {retraction_hop_enabled, 0}\\n; retraction_hop_enabled_1 = {retraction_hop_enabled, 1}\\n; retraction_prime_speed_0 = {retraction_prime_speed, 0}\\n; retraction_prime_speed_1 = {retraction_prime_speed, 1}\\n; retraction_retract_speed_0 = {retraction_retract_speed, 0}\\n; retraction_retract_speed_1 = {retraction_retract_speed, 1}\\n; retraction_speed_0 = {retraction_speed, 0}\\n; retraction_speed_1 = {retraction_speed, 1}\\n; retraction_enable_0 = {retraction_enable, 0}\\n; retraction_enable_1 = {retraction_enable, 1}\\n; speed_travel_0 = {speed_travel, 0}\\n; speed_travel_1 = {speed_travel, 1}\\n\\nM355 S1 P25;turn on case light\\n\\n;material_bed_temperature={material_bed_temperature} material_print_temperature={material_print_temperature} material_print_temperature_layer_0={material_print_temperature_layer_0}\\nM190 S{material_bed_temperature_layer_0}\\nM104 T0 S{material_standby_temperature, 0}\\nM104 T0 S{material_print_temperature_layer_0, 0}\\nG21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nM200 D0 T0 ;reset filament diameter\\nM200 D0 T1\\nG28 ;home all\\nT1 ; move to the nozzle 2\\nG0 Z20 F2400 ;move the platform to 30mm\\nM109 T1 S{material_print_temperature_layer_0, 1}\\nG0 X210 Y0 F7200 ;change Y20 to Y0 ansonl\\nG92 E0\\nG92 E-12.0 ;prime distance ;increase purge 6.5 to 12\\nG1 E0 F200 ;purge nozzle ;change F45 to F200 like ultimaker code ansonl\\nG1 E-6.5 F1500 ; retract\\nT0 ; move to the nozzle 1\\nM104 T1 S{material_standby_temperature, 1}\\nG0 Z20 F2400\\nM109 T0 S{material_print_temperature_layer_0, 0}\\nG0 X210 Y0 F7200 ;change Y20 to Y0 ansonl\\nG92 E0\\nG92 E-12.0\\nG1 E0 F200 ;purge nozzle\\nG1 E-6.5 F1500\\nM104 T0 S{material_standby_temperature, 0}\\nT{initial_extruder_nr} ;switch to the first nozzle used for print\\nM109 T{initial_extruder_nr} S{material_print_temperature_layer_0, initial_extruder_nr}\\nM400 ;finish all moves\\nG1 E0 F1500\\nG92 E0\\nG1 Y100 F9000 ;add quick movement to Y50 like ultimaker code ansonl\\n;end of startup sequence\\n\\nM355 S1 P50;turn on case light\"" + }, + "machine_end_gcode" : { + "value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \";end code from UM3\\nG91 ;Relative movement\\nG0 F15000 X8.0 Y8.0 Z3.5 E-4.5 ;Wiping+material retraction ;increase bed lower 0.5>5.0 and add Y movement\\nG0 F10000 Z1.5 E4.5 ;Compensation for the retraction\\nG90 ;Disable relative movement\\n\\nG90 ;absolute positioning\\nM104 S0 T0 ;extruder heater off\\nM104 S0 T1\\nM140 S0 ;turn off bed\\nT0 ; move to the first head\\nM107 ;fan off\\nM355 S0 ;turn off case light\"" } } } From f638942dd514b42e64b2c0593404d73b2a5d213e Mon Sep 17 00:00:00 2001 From: Luke Harrison Date: Sun, 9 Oct 2022 22:38:15 +0200 Subject: [PATCH 020/171] Added the Hurakan --- resources/definitions/biqu_hurakan.def.json | 62 ++++++++++++++++++ resources/meshes/BIQU_Hurakan_bed.stl | Bin 0 -> 2906984 bytes .../base/biqu_base_0.3_TPU_adaptive.inst.cfg | 2 + .../base/biqu_base_0.3_TPU_standard.inst.cfg | 2 + .../base/biqu_base_0.3_TPU_super.inst.cfg | 2 + .../base/biqu_base_0.4_TPU_adaptive.inst.cfg | 2 + .../base/biqu_base_0.4_TPU_standard.inst.cfg | 2 + .../base/biqu_base_0.4_TPU_super.inst.cfg | 2 + .../base/biqu_base_0.5_TPU_adaptive.inst.cfg | 2 + .../base/biqu_base_0.5_TPU_standard.inst.cfg | 2 + .../base/biqu_base_0.5_TPU_super.inst.cfg | 2 + .../base/biqu_base_0.6_TPU_standard.inst.cfg | 2 + .../base/biqu_base_0.8_TPU_draft.inst.cfg | 2 + .../base/biqu_base_1.0_TPU_draft.inst.cfg | 2 + resources/variants/biqu_hurakan_0.2.inst.cfg | 12 ++++ resources/variants/biqu_hurakan_0.3.inst.cfg | 12 ++++ resources/variants/biqu_hurakan_0.4.inst.cfg | 12 ++++ resources/variants/biqu_hurakan_0.5.inst.cfg | 12 ++++ resources/variants/biqu_hurakan_0.6.inst.cfg | 12 ++++ resources/variants/biqu_hurakan_0.8.inst.cfg | 12 ++++ 20 files changed, 158 insertions(+) create mode 100755 resources/definitions/biqu_hurakan.def.json create mode 100644 resources/meshes/BIQU_Hurakan_bed.stl create mode 100755 resources/variants/biqu_hurakan_0.2.inst.cfg create mode 100755 resources/variants/biqu_hurakan_0.3.inst.cfg create mode 100755 resources/variants/biqu_hurakan_0.4.inst.cfg create mode 100755 resources/variants/biqu_hurakan_0.5.inst.cfg create mode 100755 resources/variants/biqu_hurakan_0.6.inst.cfg create mode 100755 resources/variants/biqu_hurakan_0.8.inst.cfg diff --git a/resources/definitions/biqu_hurakan.def.json b/resources/definitions/biqu_hurakan.def.json new file mode 100755 index 0000000000..4de63bb52d --- /dev/null +++ b/resources/definitions/biqu_hurakan.def.json @@ -0,0 +1,62 @@ +{ + "name": "Biqu Hurakan", + "version": 2, + "inherits": "biqu_base", + "metadata": { + "quality_definition": "biqu_base", + "visible": true, + "has_machine_materials": true, + "platform": "BIQU_Hurakan_bed.stl", + "platform_offset": [ + 0, + 0, + 0.01 + ] + }, + "overrides": { + "coasting_enable": { "value": false }, + "retraction_amount": { "value": 2.7 }, + "retraction_speed": { "value": 45 }, + "retraction_extrusion_window": { "value": 2.7 }, + "retract_at_layer_change": { "value": true }, + "support_enable": { "value": false }, + "support_structure": { "value": "'normal'" }, + "support_type": { "value": "'buildplate'" }, + "support_angle": { "value": 45 }, + "support_infill_rate": { "value": 20 }, + "infill_overlap": { "value": 15.0 }, + "skin_overlap": { "value": 20.0 }, + "fill_outline_gaps": { "value": true }, + "roofing_layer_count": { "value": 2 }, + "xy_offset_layer_0": { "value": -0.1 }, + "speed_print": { "value": 60 }, + "machine_name": { "default_value": "Biqu Hurakan" }, + "machine_width": { "value": 235 }, + "machine_depth": { "value": 235 }, + "machine_height": { "value": 270 }, + "machine_head_with_fans_polygon": { "default_value": [ + [-31, -35.3], + [-31, 25.5], + [31, 25.5], + [31, -35.5] + ] + }, + "machine_max_acceleration_x": { "value": 3000 }, + "machine_max_acceleration_y": { "value": 3000 }, + "machine_max_acceleration_z": { "value": 100 }, + "machine_max_acceleration_e": { "value": 10000 }, + "machine_acceleration": { "value": 3000 }, + "acceleration_print": { "value": 3000 }, + "acceleration_travel": { "value": 3000 }, + "jerk_print": { "value": 12 }, + "skin_overlap": { "value": 20.0 }, + "machine_start_gcode": { + "default_value": ";BIQU Hurakan start code. Much complex. Very wow. Klipper FTW.\r\n\r\nSTART_PRINT BED_TEMP={material_bed_temperature_layer_0} EXTRUDER_TEMP={material_print_temperature_layer_0}\r\n\r\n; Note: This start\/end code is designed to work with the stock cfg files provided \r\n; with the BIQU Hurakan. If you alter the macros in the cfg files then you\r\n; may also need to alter this code.\r\n\r\n; Another note: This profile will get you part of the way to good prints.\r\n; You still need to tweak settings for each different filament that you\r\n; use. Settings such as retraction distance\/speed, flow,\r\n; bed\/nozzle temperatures and others may need to be adjusted.\r\n; Use https:\/\/teachingtechyt.github.io\/calibration.html to calibrate." + }, + "machine_end_gcode": { + "default_value": ";BIQU Hurakan end code. More complex. Such wow. Klipper4Life.\r\n\r\nEND_PRINT" + }, + + "gantry_height": { "value": 35 } + } +} diff --git a/resources/meshes/BIQU_Hurakan_bed.stl b/resources/meshes/BIQU_Hurakan_bed.stl new file mode 100644 index 0000000000000000000000000000000000000000..28540137ef2e1bc100b6ef2689036e1e463728c9 GIT binary patch literal 2906984 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