From ad82da4cba7a40521875f6e985547b89a3f34f96 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sun, 27 Mar 2022 13:38:21 +0200 Subject: [PATCH 01/51] 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 02/51] 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 03/51] 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 04/51] 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 b8b7ec0666b2f281fc24730af75bcee1af818cc6 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sat, 14 May 2022 09:29:06 +0200 Subject: [PATCH 05/51] 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 06/51] 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 07/51] 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 0bae61b97a2138376fcba70ae10993672d1895a9 Mon Sep 17 00:00:00 2001 From: NilsRo Date: Sat, 12 Nov 2022 10:32:31 +0100 Subject: [PATCH 08/51] Update anycubic_i3_mega_s.def.json Disable lin. adv. if set from ealier print and not in GCODE --- 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 54fa459946..21919af4e1 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 X50 F500 ; wipe away from the filament line\nG1 X100 F9000 ; 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 \nM900 K0 ; disable lin. adv. if not set in GCODE\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 }, From fff03deefa3f1c11d1635e0dd63a6f26c609635c Mon Sep 17 00:00:00 2001 From: Rijk van Manen Date: Mon, 14 Nov 2022 13:20:29 +0100 Subject: [PATCH 09/51] default max comb distance = 15mm All ultimaker profiles get a default max combing distance of 15mm to avoid oozing in the infill. Profile/material specific settings are removed. PP-69 --- resources/definitions/ultimaker.def.json | 1 + .../ultimaker2_plus_connect/um2pc_cpe_0.25_normal.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpe_0.6_normal.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpe_0.8_normal.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg | 1 - .../ultimaker2_plus_connect/um2pc_petg_0.25_normal.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_petg_0.4_draft.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_petg_0.4_fast.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_petg_0.4_normal.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_petg_0.6_normal.inst.cfg | 3 +-- .../ultimaker2_plus_connect/um2pc_petg_0.8_normal.inst.cfg | 3 +-- .../quality/ultimaker3/um3_aa0.25_PETG_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.4_PETG_Draft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.4_PETG_Fast_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.4_PETG_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_PETG_Draft_Print.inst.cfg | 1 - .../ultimaker3/um3_aa0.8_PETG_Superdraft_Print.inst.cfg | 1 - .../quality/ultimaker3/um3_aa0.8_PETG_Verydraft_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.25_PETG_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.4_PETG_Draft_Print.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.4_PETG_Fast_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.4_PETG_High_Quality.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.4_PETG_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg | 1 - .../quality/ultimaker_s3/um_s3_aa0.8_PETG_Draft_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.8_PETG_Superdraft_Print.inst.cfg | 1 - .../ultimaker_s3/um_s3_aa0.8_PETG_Verydraft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.25_PETG_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.4_CPEP_Draft_Print.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.4_CPEP_High_Quality.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.4_CPE_Draft_Print.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.4_CPE_High_Quality.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.4_PETG_Draft_Print.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.4_PETG_Fast_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.4_PETG_High_Quality.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.4_PETG_Normal_Quality.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.8_CPEP_Fast_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_CPEP_Superdraft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_CPEP_Verydraft_Print.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.8_CPE_Draft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_CPE_Superdraft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_CPE_Verydraft_Print.inst.cfg | 1 - .../quality/ultimaker_s5/um_s5_aa0.8_PETG_Draft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_PETG_Superdraft_Print.inst.cfg | 1 - .../ultimaker_s5/um_s5_aa0.8_PETG_Verydraft_Print.inst.cfg | 1 - 72 files changed, 10 insertions(+), 80 deletions(-) diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json index 283e17cc5d..2223b0993c 100644 --- a/resources/definitions/ultimaker.def.json +++ b/resources/definitions/ultimaker.def.json @@ -86,6 +86,7 @@ "enabled": false }, "retraction_combing": { "value": "'no_outer_surfaces'" }, + "retraction_combing_max_distance": { "value": 15 }, "retraction_count_max": { "value": 25 }, "retraction_extrusion_window": { "value": 1 }, "roofing_layer_count": { "value": "1" }, diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.25_normal.inst.cfg index e6ba07e333..59183e1226 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.25_normal.inst.cfg @@ -18,5 +18,4 @@ cool_min_layer_time_fan_speed_max = 15 cool_min_speed = 15 infill_sparse_density = 20 speed_print = 30 -top_bottom_thickness = 0.72 -retraction_combing_max_distance = 50 \ No newline at end of file +top_bottom_thickness = 0.72 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg index ecc275955a..131196e4f2 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_fast.inst.cfg @@ -17,7 +17,6 @@ cool_min_layer_time = 3 cool_min_layer_time_fan_speed_max = 15 cool_min_speed = 10 infill_sparse_density = 20 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 45 speed_travel = 150 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg index 04edfcc04e..21e4815242 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_high.inst.cfg @@ -17,7 +17,6 @@ cool_min_layer_time = 2 cool_min_layer_time_fan_speed_max = 15 cool_min_speed = 15 infill_sparse_density = 20 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 45 speed_wall = =math.ceil(speed_print * 30 / 45) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg index 575f34afa5..a5bc52107a 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.4_normal.inst.cfg @@ -17,7 +17,6 @@ cool_min_layer_time = 3 cool_min_layer_time_fan_speed_max = 15 cool_min_speed = 10 infill_sparse_density = 20 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 45 speed_wall = =math.ceil(speed_print * 30 / 45) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.6_normal.inst.cfg index 3bbfcae59a..f9bb6000df 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.6_normal.inst.cfg @@ -17,7 +17,6 @@ cool_min_layer_time = 5 cool_min_layer_time_fan_speed_max = 20 cool_min_speed = 8 infill_sparse_density = 20 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 40 top_bottom_thickness = 1.2 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.8_normal.inst.cfg index b423160845..ab3546eda5 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpe_0.8_normal.inst.cfg @@ -18,5 +18,4 @@ cool_min_layer_time_fan_speed_max = 25 cool_min_speed = 8 infill_sparse_density = 20 speed_print = 40 -top_bottom_thickness = 1.2 -retraction_combing_max_distance = 50 \ No newline at end of file +top_bottom_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg index 1b72899389..1a617d5a7b 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_draft.inst.cfg @@ -20,7 +20,6 @@ infill_overlap = =0 if infill_sparse_density > 80 else 5 infill_sparse_density = 20 layer_0_z_overlap = 0.22 raft_airgap = 0.37 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 25 speed_topbottom = =math.ceil(speed_print * 20 / 25) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg index 9ca4dec093..e7b4596e32 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.4_normal.inst.cfg @@ -20,7 +20,6 @@ infill_overlap = =0 if infill_sparse_density > 80 else 5 infill_sparse_density = 20 layer_0_z_overlap = 0.22 raft_airgap = 0.37 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 35 speed_topbottom = =math.ceil(speed_print * 20 / 35) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg index bdf526c785..d8390ebf5e 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_draft.inst.cfg @@ -20,7 +20,6 @@ infill_overlap = =0 if infill_sparse_density > 80 else 5 infill_sparse_density = 20 layer_0_z_overlap = 0.22 raft_airgap = 0.37 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 25 speed_topbottom = =math.ceil(speed_print * 20 / 25) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg index f9348f6118..780e81c8ec 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.6_normal.inst.cfg @@ -20,7 +20,6 @@ infill_overlap = =0 if infill_sparse_density > 80 else 5 infill_sparse_density = 20 layer_0_z_overlap = 0.22 raft_airgap = 0.37 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_print = 35 speed_topbottom = =math.ceil(speed_print * 20 / 35) diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg index a612263cfa..1fcd6241b0 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_draft.inst.cfg @@ -27,5 +27,4 @@ speed_wall_x = =speed_print support_angle = 45 support_enable = True support_z_distance = 0.26 -top_bottom_thickness = 1.2 -retraction_combing_max_distance = 50 \ No newline at end of file +top_bottom_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg index 5bf30209fe..156c0cb434 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_cpep_0.8_normal.inst.cfg @@ -28,4 +28,3 @@ support_angle = 45 support_enable = True support_z_distance = 0.26 top_bottom_thickness = 1.2 -retraction_combing_max_distance = 50 diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.25_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.25_normal.inst.cfg index dbdc672498..6aaf960862 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.25_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.25_normal.inst.cfg @@ -18,5 +18,4 @@ cool_min_layer_time_fan_speed_max = 25 cool_min_speed = 15 infill_sparse_density = 20 speed_print = 30 -top_bottom_thickness = 0.72 -retraction_combing_max_distance = 8 \ No newline at end of file +top_bottom_thickness = 0.72 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_draft.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_draft.inst.cfg index fc7dec4b93..4880801cc4 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_draft.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_draft.inst.cfg @@ -24,5 +24,4 @@ top_bottom_thickness = 0.75 speed_wall_0 = =math.ceil(speed_print * 30 / 45) speed_topbottom = =math.ceil(speed_print * 30 / 45) speed_wall_x = =math.ceil(speed_print * 40 / 45) -speed_infill = =math.ceil(speed_print * 45 / 45) -retraction_combing_max_distance = 8 \ No newline at end of file +speed_infill = =math.ceil(speed_print * 45 / 45) \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_fast.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_fast.inst.cfg index a14e2fa0e9..242094359e 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_fast.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_fast.inst.cfg @@ -24,5 +24,4 @@ top_bottom_thickness = 0.75 speed_wall_0 = =math.ceil(speed_print * 30 / 45) speed_topbottom = =math.ceil(speed_print * 30 / 45) speed_wall_x = =math.ceil(speed_print * 40 / 45) -speed_infill = =math.ceil(speed_print * 45 / 45) -retraction_combing_max_distance = 8 \ No newline at end of file +speed_infill = =math.ceil(speed_print * 45 / 45) \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_normal.inst.cfg index 1daeacf5b1..9eabf0f070 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.4_normal.inst.cfg @@ -19,5 +19,4 @@ cool_min_speed = 10 infill_sparse_density = 20 speed_print = 45 speed_wall = =math.ceil(speed_print * 30 / 45) -top_bottom_thickness = 0.8 -retraction_combing_max_distance = 8 \ No newline at end of file +top_bottom_thickness = 0.8 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.6_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.6_normal.inst.cfg index 7598e7bce6..fa4835b5e0 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.6_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.6_normal.inst.cfg @@ -18,5 +18,4 @@ cool_min_layer_time_fan_speed_max = 20 cool_min_speed = 8 infill_sparse_density = 20 speed_print = 40 -top_bottom_thickness = 1.2 -retraction_combing_max_distance = 8 \ No newline at end of file +top_bottom_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.8_normal.inst.cfg b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.8_normal.inst.cfg index 17badc67ef..e816088c5e 100644 --- a/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.8_normal.inst.cfg +++ b/resources/quality/ultimaker2_plus_connect/um2pc_petg_0.8_normal.inst.cfg @@ -18,5 +18,4 @@ cool_min_layer_time_fan_speed_max = 25 cool_min_speed = 8 infill_sparse_density = 20 speed_print = 40 -top_bottom_thickness = 1.2 -retraction_combing_max_distance = 8 \ No newline at end of file +top_bottom_thickness = 1.2 \ No newline at end of file diff --git a/resources/quality/ultimaker3/um3_aa0.25_PETG_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.25_PETG_Normal_Quality.inst.cfg index ce7087bf3a..c9a96ecf1c 100644 --- a/resources/quality/ultimaker3/um3_aa0.25_PETG_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.25_PETG_Normal_Quality.inst.cfg @@ -16,5 +16,4 @@ speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) top_bottom_thickness = 0.8 material_print_temperature = =default_material_print_temperature - 5 -retraction_combing_max_distance = 8 retraction_combing = all diff --git a/resources/quality/ultimaker3/um3_aa0.4_PETG_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PETG_Draft_Print.inst.cfg index df43409808..398f4be2a0 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PETG_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PETG_Draft_Print.inst.cfg @@ -20,5 +20,4 @@ speed_print = 60 speed_topbottom = =math.ceil(speed_print * 35 / 60) speed_wall = =math.ceil(speed_print * 45 / 60) speed_wall_0 = =math.ceil(speed_wall * 35 / 45) -retraction_combing_max_distance = 8 retraction_combing = all diff --git a/resources/quality/ultimaker3/um3_aa0.4_PETG_Fast_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PETG_Fast_Print.inst.cfg index d7c1434f85..292389472c 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PETG_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PETG_Fast_Print.inst.cfg @@ -21,5 +21,4 @@ speed_topbottom = =math.ceil(speed_print * 30 / 60) speed_wall = =math.ceil(speed_print * 40 / 60) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) speed_infill = =math.ceil(speed_print * 50 / 60) -retraction_combing_max_distance = 8 retraction_combing = all diff --git a/resources/quality/ultimaker3/um3_aa0.4_PETG_Normal_Quality.inst.cfg b/resources/quality/ultimaker3/um3_aa0.4_PETG_Normal_Quality.inst.cfg index 22d4a931c4..69bff08818 100644 --- a/resources/quality/ultimaker3/um3_aa0.4_PETG_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.4_PETG_Normal_Quality.inst.cfg @@ -21,5 +21,4 @@ speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) speed_wall = =math.ceil(speed_print * 30 / 55) speed_infill = =math.ceil(speed_print * 45 / 55) -retraction_combing_max_distance = 8 retraction_combing = all diff --git a/resources/quality/ultimaker3/um3_aa0.8_PETG_Draft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PETG_Draft_Print.inst.cfg index 5e296b117a..caa2516bb4 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PETG_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PETG_Draft_Print.inst.cfg @@ -18,5 +18,4 @@ prime_tower_enable = True speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) -retraction_combing_max_distance = 8 retraction_combing = all diff --git a/resources/quality/ultimaker3/um3_aa0.8_PETG_Superdraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PETG_Superdraft_Print.inst.cfg index 7b203fe360..c36030f0f6 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PETG_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PETG_Superdraft_Print.inst.cfg @@ -21,5 +21,4 @@ speed_topbottom = =math.ceil(speed_print * 30 / 45) speed_wall = =math.ceil(speed_print * 33 / 45) speed_wall_0 = =math.ceil(speed_wall * 30 / 40) speed_infill = =math.ceil(speed_print * 33 / 45) -retraction_combing_max_distance = 8 retraction_combing = all diff --git a/resources/quality/ultimaker3/um3_aa0.8_PETG_Verydraft_Print.inst.cfg b/resources/quality/ultimaker3/um3_aa0.8_PETG_Verydraft_Print.inst.cfg index 1117ab1a43..0dbd21ea00 100644 --- a/resources/quality/ultimaker3/um3_aa0.8_PETG_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker3/um3_aa0.8_PETG_Verydraft_Print.inst.cfg @@ -19,5 +19,4 @@ prime_tower_enable = True speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) -retraction_combing_max_distance = 8 retraction_combing = all diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg index 5ced8748b1..2c7b1f63f3 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_CPE_Normal_Quality.inst.cfg @@ -12,7 +12,6 @@ material = generic_cpe variant = AA 0.25 [values] -retraction_combing_max_distance = 50 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_PETG_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_PETG_Normal_Quality.inst.cfg index 8b42be13b0..45afd4501a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.25_PETG_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_PETG_Normal_Quality.inst.cfg @@ -13,7 +13,6 @@ variant = AA 0.25 [values] material_print_temperature = =default_material_print_temperature - 5 -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg index 562023183d..177290c551 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Draft_Print.inst.cfg @@ -23,7 +23,6 @@ material_print_temperature = =default_material_print_temperature + 10 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg index 86a955c24a..ebb934c56c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Fast_Print.inst.cfg @@ -23,7 +23,6 @@ material_print_temperature = =default_material_print_temperature + 10 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg index cbd48442e3..42faffdd88 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_High_Quality.inst.cfg @@ -25,7 +25,6 @@ material_print_temperature = =default_material_print_temperature + 2 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg index f70b6b22bf..bbbf14001b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPEP_Normal_Quality.inst.cfg @@ -25,7 +25,6 @@ material_print_temperature = =default_material_print_temperature + 5 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg index 57ae37e209..7a0115080e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Draft_Print.inst.cfg @@ -16,7 +16,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature + 10 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed skin_overlap = 20 speed_infill = =math.ceil(speed_print * 50 / 60) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg index 2becdb2bc2..5759d4d710 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Fast_Print.inst.cfg @@ -17,7 +17,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature + 5 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_infill = =math.ceil(speed_print * 50 / 60) speed_print = 60 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg index 4774cea71f..df2df7d58f 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_High_Quality.inst.cfg @@ -19,7 +19,6 @@ machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature - 5 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg index e34a9c943d..5c182298a0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_CPE_Normal_Quality.inst.cfg @@ -17,7 +17,6 @@ machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Draft_Print.inst.cfg index 08e059547d..5630992467 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Draft_Print.inst.cfg @@ -16,7 +16,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature material_print_temperature = =default_material_print_temperature + 5 -retraction_combing_max_distance = 8 skin_overlap = 20 speed_infill = =math.ceil(speed_print * 50 / 60) speed_print = 60 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Fast_Print.inst.cfg index 81431a2089..d7a21b7db9 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Fast_Print.inst.cfg @@ -17,7 +17,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 50 / 60) speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_High_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_High_Quality.inst.cfg index 943b720e4d..7dc95765e5 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_High_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_High_Quality.inst.cfg @@ -19,7 +19,6 @@ machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 15 material_initial_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature - 10 -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Normal_Quality.inst.cfg index c16ac3fb99..0d4448d7c5 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_PETG_Normal_Quality.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 15 material_initial_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature - 5 -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg index 16464b6394..a04f4ce184 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Fast_Print.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 10 prime_tower_enable = True -retraction_combing_max_distance = 50 retraction_hop = 0.1 retraction_hop_enabled = False skin_overlap = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg index 17bcb153be..8d93a7cc86 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 50 retraction_hop = 0.1 retraction_hop_enabled = False skin_overlap = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg index cd22ced2ce..d68a2fa7a5 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 7 prime_tower_enable = True -retraction_combing_max_distance = 50 retraction_hop = 0.1 retraction_hop_enabled = False skin_overlap = 0 diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg index c05205a9f2..7672b99659 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Draft_Print.inst.cfg @@ -15,7 +15,6 @@ variant = AA 0.8 brim_width = 15 material_print_temperature = =default_material_print_temperature + 15 prime_tower_enable = True -retraction_combing_max_distance = 50 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg index 8cd5ba4ac2..c5fd2c0955 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Superdraft_Print.inst.cfg @@ -15,7 +15,6 @@ variant = AA 0.8 brim_width = 15 material_print_temperature = =default_material_print_temperature + 20 prime_tower_enable = True -retraction_combing_max_distance = 50 speed_infill = =math.ceil(speed_print * 33 / 45) speed_print = 45 speed_topbottom = =math.ceil(speed_print * 30 / 45) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg index 1d619bf42c..e0b9362e0b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_CPE_Verydraft_Print.inst.cfg @@ -15,7 +15,6 @@ variant = AA 0.8 brim_width = 15 material_print_temperature = =default_material_print_temperature + 17 prime_tower_enable = True -retraction_combing_max_distance = 50 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Draft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Draft_Print.inst.cfg index d4a1f6c985..b4ff2efe6c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Draft_Print.inst.cfg @@ -16,7 +16,6 @@ brim_width = 7 cool_fan_speed = 20 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 8 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Superdraft_Print.inst.cfg index 127166bd62..437c9a8a1e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Superdraft_Print.inst.cfg @@ -16,7 +16,6 @@ brim_width = 7 cool_fan_speed = 20 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 33 / 45) speed_print = 45 speed_topbottom = =math.ceil(speed_print * 30 / 45) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Verydraft_Print.inst.cfg index ca5a5b8404..3c115ddec1 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_PETG_Verydraft_Print.inst.cfg @@ -16,7 +16,6 @@ brim_width = 7 cool_fan_speed = 20 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 8 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg index f895450c0a..5220dc917c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_CPE_Normal_Quality.inst.cfg @@ -12,7 +12,6 @@ material = generic_cpe variant = AA 0.25 [values] -retraction_combing_max_distance = 50 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_PETG_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_PETG_Normal_Quality.inst.cfg index afd987af02..3f99451398 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.25_PETG_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_PETG_Normal_Quality.inst.cfg @@ -13,7 +13,6 @@ variant = AA 0.25 [values] material_print_temperature = =default_material_print_temperature - 5 -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 40 / 55) speed_topbottom = =math.ceil(speed_print * 30 / 55) top_bottom_thickness = 0.8 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Draft_Print.inst.cfg index 757c495559..6a7089ebe5 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Draft_Print.inst.cfg @@ -23,7 +23,6 @@ material_print_temperature = =default_material_print_temperature + 10 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print.inst.cfg index 5e438c8704..06f2cc19b6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Fast_Print.inst.cfg @@ -23,7 +23,6 @@ material_print_temperature = =default_material_print_temperature + 10 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_High_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_High_Quality.inst.cfg index 6bcd25a9b9..be93585e5b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_High_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_High_Quality.inst.cfg @@ -25,7 +25,6 @@ material_print_temperature = =default_material_print_temperature + 2 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality.inst.cfg index cc08c9d5d6..1dce2eff05 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPEP_Normal_Quality.inst.cfg @@ -25,7 +25,6 @@ material_print_temperature = =default_material_print_temperature + 5 multiple_mesh_overlap = 0 prime_tower_enable = True prime_tower_wipe_enabled = True -retraction_combing_max_distance = 50 retraction_hop = 0.2 retraction_hop_enabled = False retraction_hop_only_when_collides = True diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Draft_Print.inst.cfg index b1f0be1594..b961ede473 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Draft_Print.inst.cfg @@ -16,7 +16,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature + 10 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed skin_overlap = 20 speed_infill = =math.ceil(speed_print * 50 / 60) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print.inst.cfg index e34aa7fd24..cf0eab0fca 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Fast_Print.inst.cfg @@ -17,7 +17,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature + 5 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_infill = =math.ceil(speed_print * 50 / 60) speed_print = 60 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_High_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_High_Quality.inst.cfg index 270b03521a..68a04f4f61 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_High_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_High_Quality.inst.cfg @@ -19,7 +19,6 @@ machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature - 5 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality.inst.cfg index f7f7979188..3a136fdd40 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_CPE_Normal_Quality.inst.cfg @@ -17,7 +17,6 @@ machine_nozzle_cool_down_speed = 0.85 machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 -retraction_combing_max_distance = 50 retraction_prime_speed = =retraction_speed speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Draft_Print.inst.cfg index f1e55234df..b07d4d37f1 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Draft_Print.inst.cfg @@ -16,7 +16,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 5 material_initial_print_temperature = =material_print_temperature material_print_temperature = =default_material_print_temperature + 5 -retraction_combing_max_distance = 8 skin_overlap = 20 speed_infill = =math.ceil(speed_print * 50 / 60) speed_print = 60 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Fast_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Fast_Print.inst.cfg index bdb4e78d6a..97b6d52fa8 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Fast_Print.inst.cfg @@ -17,7 +17,6 @@ infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' material_final_print_temperature = =material_print_temperature - 10 material_initial_print_temperature = =material_print_temperature - 5 material_print_temperature = =default_material_print_temperature -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 50 / 60) speed_print = 60 speed_topbottom = =math.ceil(speed_print * 30 / 60) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_High_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_High_Quality.inst.cfg index 58ddfca383..118dbded28 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_High_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_High_Quality.inst.cfg @@ -19,7 +19,6 @@ machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 15 material_initial_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature - 10 -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 40 / 50) speed_print = 50 speed_topbottom = =math.ceil(speed_print * 30 / 50) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Normal_Quality.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Normal_Quality.inst.cfg index 5a9addabb1..20c4c73716 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Normal_Quality.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_PETG_Normal_Quality.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_heat_up_speed = 1.5 material_final_print_temperature = =material_print_temperature - 15 material_initial_print_temperature = =material_print_temperature - 10 material_print_temperature = =default_material_print_temperature - 5 -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 45 / 55) speed_print = 55 speed_topbottom = =math.ceil(speed_print * 30 / 55) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Fast_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Fast_Print.inst.cfg index 9f7101546f..e014c6ae90 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Fast_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Fast_Print.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 10 prime_tower_enable = True -retraction_combing_max_distance = 50 retraction_hop = 0.1 retraction_hop_enabled = False skin_overlap = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Superdraft_Print.inst.cfg index c342e4d2f7..a4e265c4cf 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Superdraft_Print.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 50 retraction_hop = 0.1 retraction_hop_enabled = False skin_overlap = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Verydraft_Print.inst.cfg index cf0b8da5b7..c27a37dafb 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPEP_Verydraft_Print.inst.cfg @@ -18,7 +18,6 @@ machine_nozzle_cool_down_speed = 0.9 machine_nozzle_heat_up_speed = 1.4 material_print_temperature = =default_material_print_temperature - 7 prime_tower_enable = True -retraction_combing_max_distance = 50 retraction_hop = 0.1 retraction_hop_enabled = False skin_overlap = 0 diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Draft_Print.inst.cfg index 19f7e7be37..d10b520869 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Draft_Print.inst.cfg @@ -15,7 +15,6 @@ variant = AA 0.8 brim_width = 15 material_print_temperature = =default_material_print_temperature + 15 prime_tower_enable = True -retraction_combing_max_distance = 50 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Superdraft_Print.inst.cfg index d15f1a7c84..4745f45d52 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Superdraft_Print.inst.cfg @@ -15,7 +15,6 @@ variant = AA 0.8 brim_width = 15 material_print_temperature = =default_material_print_temperature + 20 prime_tower_enable = True -retraction_combing_max_distance = 50 speed_infill = =math.ceil(speed_print * 33 / 45) speed_print = 45 speed_topbottom = =math.ceil(speed_print * 30 / 45) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Verydraft_Print.inst.cfg index 721d0a8752..3e2317aea2 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_CPE_Verydraft_Print.inst.cfg @@ -15,7 +15,6 @@ variant = AA 0.8 brim_width = 15 material_print_temperature = =default_material_print_temperature + 17 prime_tower_enable = True -retraction_combing_max_distance = 50 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Draft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Draft_Print.inst.cfg index c9dc99154d..c38b26a764 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Draft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Draft_Print.inst.cfg @@ -16,7 +16,6 @@ brim_width = 7 cool_fan_speed = 20 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 8 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Superdraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Superdraft_Print.inst.cfg index 67bbef5ac0..2c627b32ca 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Superdraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Superdraft_Print.inst.cfg @@ -16,7 +16,6 @@ brim_width = 7 cool_fan_speed = 20 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 8 speed_infill = =math.ceil(speed_print * 33 / 45) speed_print = 45 speed_topbottom = =math.ceil(speed_print * 30 / 45) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Verydraft_Print.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Verydraft_Print.inst.cfg index e25a61b38a..036943bba7 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Verydraft_Print.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_PETG_Verydraft_Print.inst.cfg @@ -16,7 +16,6 @@ brim_width = 7 cool_fan_speed = 20 material_print_temperature = =default_material_print_temperature - 5 prime_tower_enable = True -retraction_combing_max_distance = 8 speed_print = 40 speed_topbottom = =math.ceil(speed_print * 25 / 40) speed_wall = =math.ceil(speed_print * 30 / 40) From fd546c347e5f9f5e87862fb75adf1dabe9dae7e6 Mon Sep 17 00:00:00 2001 From: xommit <70339941+xommit@users.noreply.github.com> Date: Thu, 17 Nov 2022 15:16:38 +0100 Subject: [PATCH 10/51] Update cura.po --- resources/i18n/fr_FR/cura.po | 340 +++++++++++++++++++---------------- 1 file changed, 190 insertions(+), 150 deletions(-) diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index ef78e258a2..f73616dbc6 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -1,12 +1,10 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. +# Cura +# Copyright (C) 2022 Ultimaker B.V. +# This file is distributed under the same license as the Cura package. # -#, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: Cura 5.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-09-27 14:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" @@ -150,13 +148,13 @@ msgctxt "@label Don't translate the XML tag !" msgid "" "The file {0} already exists. Are you sure you want to " "overwrite it?" -msgstr "Le fichier {0} existe déjà. Êtes-vous sûr de vouloir le remplacer ?" +msgstr "Le fichier {0} existe déjà. Êtes-vous sûr de vouloir le remplacer?" #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/ContainerManager.py:459 #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/ContainerManager.py:462 msgctxt "@info:status" msgid "Invalid file URL:" -msgstr "URL de fichier invalide :" +msgstr "URL de fichier invalide:" #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/cura_empty_instance_containers.py:36 msgctxt "@info:not supported profile" @@ -166,7 +164,7 @@ msgstr "Non pris en charge" #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/cura_empty_instance_containers.py:55 msgctxt "@info:No intent profile selected" msgid "Default" -msgstr "Default" +msgstr "Défaut" #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/MachineManager.py:745 #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:219 @@ -178,7 +176,7 @@ msgstr "Buse" msgctxt "@info:message Followed by a list of settings." msgid "" "Settings have been changed to match the current availability of extruders:" -msgstr "Les paramètres ont été modifiés pour correspondre aux extrudeuses actuellement disponibles :" +msgstr "Les paramètres ont été modifiés pour correspondre aux extrudeuses actuellement disponibles:" #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/MachineManager.py:890 msgctxt "@info:title" @@ -212,7 +210,7 @@ msgctxt "@info:status Don't translate the XML tag !" msgid "" "Failed to export profile to {0}: Writer plugin reported " "failure." -msgstr "Échec de l'exportation du profil vers {0} : le plug-in du générateur a rapporté une erreur." +msgstr "Échec de l'exportation du profil vers {0}: le plugin du générateur a rapporté une erreur." #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/CuraContainerRegistry.py:171 #, python-brace-format @@ -229,7 +227,7 @@ msgstr "L'exportation a réussi" #, python-brace-format msgctxt "@info:status Don't translate the XML tags !" msgid "Failed to import profile from {0}: {1}" -msgstr "Impossible d'importer le profil depuis {0} : {1}" +msgstr "Impossible d'importer le profil depuis {0}: {1}" #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/CuraContainerRegistry.py:209 #, python-brace-format @@ -248,7 +246,7 @@ msgstr "Aucun profil personnalisé à importer dans le fichier {0}!" msgid "Failed to import profile from {0}:" -msgstr "Échec de l'importation du profil depuis le fichier {0} :" +msgstr "Échec de l'importation du profil depuis le fichier {0}:" #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/CuraContainerRegistry.py:252 #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/CuraContainerRegistry.py:262 @@ -309,7 +307,7 @@ msgctxt "@info:status" msgid "" "Quality type '{0}' is not compatible with the current active machine " "definition '{1}'." -msgstr "Le type de qualité « {0} » n'est pas compatible avec la définition actuelle de la machine active « {1} »." +msgstr "Le type de qualité '{0}' n'est pas compatible avec la définition actuelle de la machine active '{1}'." #: /Users/c.lamboo/ultimaker/Cura/cura/Settings/CuraContainerRegistry.py:488 #, python-brace-format @@ -318,8 +316,9 @@ msgid "" "Warning: The profile is not visible because its quality type '{0}' is not " "available for the current configuration. Switch to a material/nozzle " "combination that can use this quality type." -msgstr "Avertissement : le profil n'est pas visible car son type de qualité « {0} » n'est pas disponible pour la configuration actuelle. Passez à une combinaison" -" matériau/buse qui peut utiliser ce type de qualité." +msgstr "" +"Avertissement: le profil n'est pas visible car son type de qualité '{0}' n'est pas disponible pour la configuration actuelle. Passez à une combinaison " +"matériau/buse qui peut utiliser ce type de qualité." #: /Users/c.lamboo/ultimaker/Cura/cura/MultiplyObjectsJob.py:30 msgctxt "@info:status" @@ -477,7 +476,7 @@ msgstr "Pas écrasé" #: /Users/c.lamboo/ultimaker/Cura/cura/Machines/Models/IntentSelectionModel.py:61 msgctxt "@label" msgid "Default" -msgstr "Default" +msgstr "Défaut" #: /Users/c.lamboo/ultimaker/Cura/cura/Machines/Models/IntentTranslations.py:14 #: /Users/c.lamboo/ultimaker/Cura/cura/Machines/Models/IntentCategoryModel.py:45 @@ -580,7 +579,7 @@ msgstr "Imprimantes préréglées" #, python-brace-format msgctxt "@label {0} is the name of a printer that's about to be deleted." msgid "Are you sure you wish to remove {0}? This cannot be undone!" -msgstr "Voulez-vous vraiment supprimer l'objet {0} ? Cette action est irréversible !" +msgstr "Voulez-vous vraiment supprimer l'objet {0}? Cette action est irréversible!" #: /Users/c.lamboo/ultimaker/Cura/cura/Machines/Models/MaterialManagementModel.py:232 msgctxt "@label" @@ -688,7 +687,7 @@ msgstr "Volume d'impression" #: /Users/c.lamboo/ultimaker/Cura/cura/Backups/Backup.py:115 msgctxt "@info:backup_failed" msgid "Could not create archive from user data directory: {}" -msgstr "Impossible de créer une archive à partir du répertoire de données de l'utilisateur : {}" +msgstr "Impossible de créer une archive à partir du répertoire de données de l'utilisateur: {}" #: /Users/c.lamboo/ultimaker/Cura/cura/Backups/Backup.py:122 #: /Users/c.lamboo/ultimaker/Cura/cura/Backups/Backup.py:159 @@ -711,7 +710,7 @@ msgstr "A essayé de restaurer une sauvegarde Cura supérieure à la version act #: /Users/c.lamboo/ultimaker/Cura/cura/Backups/Backup.py:158 msgctxt "@info:backup_failed" msgid "The following error occurred while trying to restore a Cura backup:" -msgstr "L'erreur suivante s'est produite lors de la restauration d'une sauvegarde Cura :" +msgstr "L'erreur suivante s'est produite lors de la restauration d'une sauvegarde Cura:" #: /Users/c.lamboo/ultimaker/Cura/cura/CrashHandler.py:107 msgctxt "@title:window" @@ -820,25 +819,25 @@ msgstr "OpenGL" #: /Users/c.lamboo/ultimaker/Cura/cura/CrashHandler.py:264 msgctxt "@label" msgid "Not yet initialized" -msgstr "Non ancora inizializzato" +msgstr "Pas encore initialisé" #: /Users/c.lamboo/ultimaker/Cura/cura/CrashHandler.py:267 #, python-brace-format msgctxt "@label OpenGL version" msgid "
  • OpenGL Version: {version}
  • " -msgstr "
  • Version OpenGL : {version}
  • " +msgstr "
  • Version OpenGL: {version}
  • " #: /Users/c.lamboo/ultimaker/Cura/cura/CrashHandler.py:268 #, python-brace-format msgctxt "@label OpenGL vendor" msgid "
  • OpenGL Vendor: {vendor}
  • " -msgstr "
  • Revendeur OpenGL : {vendor}
  • " +msgstr "
  • Revendeur OpenGL: {vendor}
  • " #: /Users/c.lamboo/ultimaker/Cura/cura/CrashHandler.py:269 #, python-brace-format msgctxt "@label OpenGL renderer" msgid "
  • OpenGL Renderer: {renderer}
  • " -msgstr "
  • Moteur de rendu OpenGL : {renderer}
  • " +msgstr "
  • Moteur de rendu OpenGL: {renderer}
  • " #: /Users/c.lamboo/ultimaker/Cura/cura/CrashHandler.py:304 msgctxt "@title:groupbox" @@ -915,7 +914,7 @@ msgstr "Modifier le G-Code" #: /Users/c.lamboo/ultimaker/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:66 msgctxt "@info:status" msgid "There are no file formats available to write with!" -msgstr "Aucun format de fichier n'est disponible pour écriture !" +msgstr "Aucun format de fichier n'est disponible pour écriture!" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadQueueFullMessage.py:16 msgctxt "@info:status" @@ -961,7 +960,7 @@ msgstr[1] "... et {0} autres" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py:57 msgctxt "info:status" msgid "Printers added from Digital Factory:" -msgstr "Imprimantes ajoutées à partir de Digital Factory :" +msgstr "Imprimantes ajoutées à partir de Digital Factory:" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py:15 msgctxt "@info:status" @@ -986,7 +985,7 @@ msgstr "Votre imprimante {printer_name} pourrait être connectée via le #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:26 msgctxt "@info:title" msgid "Are you ready for cloud printing?" -msgstr "Êtes-vous prêt pour l'impression dans le cloud ?" +msgstr "Êtes-vous prêt pour l'impression dans le cloud?" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:30 msgctxt "@action" @@ -1060,8 +1059,8 @@ msgstr "Configurer le groupe" msgctxt "info:status" msgid "This printer is not linked to the Digital Factory:" msgid_plural "These printers are not linked to the Digital Factory:" -msgstr[0] "Cette imprimante n'est pas associée à Digital Factory :" -msgstr[1] "Ces imprimantes ne sont pas associées à Digital Factory :" +msgstr[0] "Cette imprimante n'est pas associée à Digital Factory:" +msgstr[1] "Ces imprimantes ne sont pas associées à Digital Factory:" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Messages/RemovedPrintersMessage.py:22 #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:422 @@ -1178,12 +1177,12 @@ msgstr "Pour supprimer {printer_name} définitivement, visitez le site {digital_ #, python-brace-format msgctxt "@message {printer_name} is replaced with the name of the printer" msgid "Are you sure you want to remove {printer_name} temporarily?" -msgstr "Voulez-vous vraiment supprimer {printer_name} temporairement ?" +msgstr "Voulez-vous vraiment supprimer {printer_name} temporairement?" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:474 msgctxt "@title:window" msgid "Remove printers?" -msgstr "Supprimer des imprimantes ?" +msgstr "Supprimer des imprimantes?" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:477 #, python-brace-format @@ -1196,8 +1195,8 @@ msgid_plural "" "You are about to remove {0} printers from Cura. This action cannot be " "undone.\n" "Are you sure you want to continue?" -msgstr[0] "Vous êtes sur le point de supprimer {0} imprimante de Cura. Cette action est irréversible.\nVoulez-vous vraiment continuer ?" -msgstr[1] "Vous êtes sur le point de supprimer {0} imprimantes de Cura. Cette action est irréversible.\nVoulez-vous vraiment continuer ?" +msgstr[0] "Vous êtes sur le point de supprimer {0} imprimante de Cura. Cette action est irréversible.\nVoulez-vous vraiment continuer?" +msgstr[1] "Vous êtes sur le point de supprimer {0} imprimantes de Cura. Cette action est irréversible.\nVoulez-vous vraiment continuer?" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:484 msgctxt "@label" @@ -1205,7 +1204,7 @@ msgid "" "You are about to remove all printers from Cura. This action cannot be " "undone.\n" "Are you sure you want to continue?" -msgstr "Vous êtes sur le point de supprimer toutes les imprimantes de Cura. Cette action est irréversible.\nVoulez-vous vraiment continuer ?" +msgstr "Vous êtes sur le point de supprimer toutes les imprimantes de Cura. Cette action est irréversible.\nVoulez-vous vraiment continuer?" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:276 msgctxt "@action:button" @@ -1221,7 +1220,7 @@ msgstr "Suivre l'impression dans Ultimaker Digital Factory" #, python-brace-format msgctxt "@error:send" msgid "Unknown error code when uploading print job: {0}" -msgstr "Code d'erreur inconnu lors du téléchargement d'une tâche d'impression : {0}" +msgstr "Code d'erreur inconnu lors du téléchargement d'une tâche d'impression: {0}" #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFWriter/__init__.py:28 msgctxt "@item:inlistbox" @@ -1241,7 +1240,7 @@ msgstr "Erreur d'écriture du fichier 3MF." #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFWriter/ThreeMFWorkspaceWriter.py:31 msgctxt "@error:zip" msgid "3MF Writer plug-in is corrupt." -msgstr "Le plug-in 3MF Writer est corrompu." +msgstr "Le plugin 3MF Writer est corrompu." #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFWriter/ThreeMFWorkspaceWriter.py:37 msgctxt "@error" @@ -1320,7 +1319,7 @@ msgstr "Impossible de lire le fichier de données d'exemple." #: /Users/c.lamboo/ultimaker/Cura/plugins/UFPWriter/UFPWriter.py:178 msgctxt "@info:error" msgid "Can't write to UFP file:" -msgstr "Impossible d'écrire dans le fichier UFP :" +msgstr "Impossible d'écrire dans le fichier UFP:" #: /Users/c.lamboo/ultimaker/Cura/plugins/UFPWriter/__init__.py:28 #: /Users/c.lamboo/ultimaker/Cura/plugins/UFPReader/__init__.py:22 @@ -1440,12 +1439,12 @@ msgstr "Accepter" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/CloudSync/LicenseModel.py:77 msgctxt "@title:window" msgid "Plugin License Agreement" -msgstr "Plug-in d'accord de licence" +msgstr "Plugin d'accord de licence" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/CloudSync/CloudPackageChecker.py:144 msgctxt "@info:generic" msgid "Do you want to sync material and software packages with your account?" -msgstr "Vous souhaitez synchroniser du matériel et des logiciels avec votre compte ?" +msgstr "Vous souhaitez synchroniser du matériel et des logiciels avec votre compte?" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/CloudSync/CloudPackageChecker.py:145 #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/CloudSync/DownloadPresenter.py:95 @@ -1476,7 +1475,7 @@ msgstr "Échec de téléchargement des plugins {}" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/LocalPackageList.py:28 msgctxt "@label" msgid "Installed Plugins" -msgstr "Plug-ins installés" +msgstr "Plugins installés" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/LocalPackageList.py:29 msgctxt "@label" @@ -1486,7 +1485,7 @@ msgstr "Matériaux installés" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/LocalPackageList.py:33 msgctxt "@label" msgid "Bundled Plugins" -msgstr "Plug-ins groupés" +msgstr "Plugins groupés" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/LocalPackageList.py:34 msgctxt "@label" @@ -1639,7 +1638,7 @@ msgctxt "@info:status" msgid "" "Unable to slice with the current settings. The following settings have " "errors: {0}" -msgstr "Impossible de couper avec les paramètres actuels. Les paramètres suivants contiennent des erreurs : {0}" +msgstr "Impossible de couper avec les paramètres actuels. Les paramètres suivants contiennent des erreurs: {0}" #: /Users/c.lamboo/ultimaker/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:461 #, python-brace-format @@ -1647,7 +1646,7 @@ msgctxt "@info:status" msgid "" "Unable to slice due to some per-model settings. The following settings have " "errors on one or more models: {error_labels}" -msgstr "Impossible de couper en raison de certains paramètres par modèle. Les paramètres suivants contiennent des erreurs sur un ou plusieurs modèles : {error_labels}" +msgstr "Impossible de couper en raison de certains paramètres par modèle. Les paramètres suivants contiennent des erreurs sur un ou plusieurs modèles: {error_labels}" #: /Users/c.lamboo/ultimaker/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:473 msgctxt "@info:status" @@ -1670,8 +1669,11 @@ msgid "" "- Fit within the build volume\n" "- Are assigned to an enabled extruder\n" "- Are not all set as modifier meshes" -msgstr "Veuillez vérifier les paramètres et si vos modèles :\n- S'intègrent dans le volume de fabrication\n- Sont affectés à un extrudeur activé\n- N sont pas" -" tous définis comme des mailles de modificateur" +msgstr "" +"Veuillez vérifier les paramètres et si vos modèles:\n" +"- S'intègrent dans le volume de fabrication\n" +"- Sont affectés à un extrudeur activé\n" +"- N sont pas tous définis comme des mailles de modificateur" #: /Users/c.lamboo/ultimaker/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:52 #: /Users/c.lamboo/ultimaker/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:260 @@ -1706,18 +1708,19 @@ msgid "" "The material used in this project relies on some material definitions not " "available in Cura, this might produce undesirable print results. We highly " "recommend installing the full material package from the Marketplace." -msgstr "Il materiale utilizzato in questo progetto si basa su alcune definizioni di materiale non disponibili in Cura; ciò potrebbe produrre risultati di stampa" -" indesiderati. Si consiglia vivamente di installare il pacchetto completo di materiali dal Marketplace." +msgstr "" +"Le matériau utilisé dans ce projet repose sur certaines définitions de matériaux non disponibles dans Cura, ce qui peut produire des résultats d’impression indésirables. Nous vous " +"recommandons vivement d’installer l’ensemble complet des matériaux depuis le Marketplace." #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/WorkspaceDialog.py:392 msgctxt "@info:title" msgid "Material profiles not installed" -msgstr "Profili del materiale non installati" +msgstr "Profils des matériaux non installés" #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/WorkspaceDialog.py:405 msgctxt "@action:button" msgid "Install Materials" -msgstr "Installa materiali" +msgstr "Installer les matériaux" #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:545 #, python-brace-format @@ -1740,7 +1743,7 @@ msgctxt "@info:error Don't translate the XML tags or !" msgid "" "Project file {0} is suddenly inaccessible: {1}" "." -msgstr "Le fichier de projet {0} est soudainement inaccessible : {1}." +msgstr "Le fichier de projet {0} est soudainement inaccessible: {1}." #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:651 #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:659 @@ -1755,7 +1758,7 @@ msgstr "Impossible d'ouvrir le fichier de projet" msgctxt "@info:error Don't translate the XML tags or !" msgid "" "Project file {0} is corrupt: {1}." -msgstr "Le fichier de projet {0} est corrompu : {1}." +msgstr "Le fichier de projet {0} est corrompu: {1}." #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:723 #, python-brace-format @@ -1791,9 +1794,11 @@ msgid "" "p>\n" "

    View print quality " "guide

    " -msgstr "

    Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle :

    \n

    {model_names}

    \n

    Découvrez" -" comment optimiser la qualité et la fiabilité de l'impression.

    \n

    Consultez le guide de qualité" -" d'impression

    " +msgstr "" +"

    Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle:

    \n" +"

    {model_names}

    \n" +"

    Découvrez comment optimiser la qualité et la fiabilité de l'impression.

    \n" +"

    Consultez le guide de qualité d'impression

    " #: /Users/c.lamboo/ultimaker/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:42 msgctxt "@item:inmenu" @@ -1819,7 +1824,7 @@ msgstr "Connecté via USB" msgctxt "@label" msgid "" "A USB print is in progress, closing Cura will stop this print. Are you sure?" -msgstr "Une impression USB est en cours, la fermeture de Cura arrêtera cette impression. Êtes-vous sûr ?" +msgstr "Une impression USB est en cours, la fermeture de Cura arrêtera cette impression. Êtes-vous sûr?" #: /Users/c.lamboo/ultimaker/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:135 msgctxt "@message" @@ -1926,8 +1931,9 @@ msgid "" "New features or bug-fixes may be available for your {machine_name}! If you " "haven't done so already, it is recommended to update the firmware on your " "printer to version {latest_version}." -msgstr "De nouvelles fonctionnalités ou des correctifs de bugs sont disponibles pour votre {machine_name} ! Si vous ne l'avez pas encore fait, il est recommandé" -" de mettre à jour le micrologiciel de votre imprimante avec la version {latest_version}." +msgstr "" +"De nouvelles fonctionnalités ou des correctifs de bugs sont disponibles pour votre {machine_name} ! Si vous ne l'avez pas encore fait, il est recommandé de mettre à jour le micrologiciel de " +"votre imprimante avec la version {latest_version}." #: /Users/c.lamboo/ultimaker/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py:22 #, python-format @@ -2178,9 +2184,9 @@ msgid "" "to block more light coming through. For height maps lighter pixels signify " "higher terrain, so lighter pixels should correspond to thicker locations in " "the generated 3D model." -msgstr "Pour les lithophanies, les pixels foncés doivent correspondre à des emplacements plus épais afin d'empêcher la lumière de passer. Pour des cartes de hauteur," -" les pixels clairs signifient un terrain plus élevé, de sorte que les pixels clairs doivent correspondre à des emplacements plus épais dans le modèle 3D" -" généré." +msgstr "" +"Pour les lithophanies, les pixels foncés doivent correspondre à des emplacements plus épais afin d'empêcher la lumière de passer. Pour des cartes de hauteur, les pixels clairs signifient un " +"terrain plus élevé, de sorte que les pixels clairs doivent correspondre à des emplacements plus épais dans le modèle 3D généré." #: /Users/c.lamboo/ultimaker/Cura/plugins/ImageReader/ConfigUI.qml:205 msgctxt "@action:label" @@ -2202,8 +2208,8 @@ msgctxt "@info:tooltip" msgid "" "For lithophanes a simple logarithmic model for translucency is available. " "For height maps the pixel values correspond to heights linearly." -msgstr "Pour les lithophanes, un modèle logarithmique simple de la translucidité est disponible. Pour les cartes de hauteur, les valeurs des pixels correspondent" -" aux hauteurs de façon linéaire." +msgstr "" +"Pour les lithophanes, un modèle logarithmique simple de la translucidité est disponible. Pour les cartes de hauteur, les valeurs des pixels correspondent aux hauteurs de façon linéaire." #: /Users/c.lamboo/ultimaker/Cura/plugins/ImageReader/ConfigUI.qml:242 msgctxt "@action:label" @@ -2216,8 +2222,9 @@ msgid "" "The percentage of light penetrating a print with a thickness of 1 " "millimeter. Lowering this value increases the contrast in dark regions and " "decreases the contrast in light regions of the image." -msgstr "Le pourcentage de lumière pénétrant une impression avec une épaisseur de 1 millimètre. La diminution de cette valeur augmente le contraste dans les régions" -" sombres et diminue le contraste dans les régions claires de l'image." +msgstr "" +"Le pourcentage de lumière pénétrant une impression avec une épaisseur de 1 millimètre. La diminution de cette valeur augmente le contraste dans les régions sombres et diminue le contraste " +"dans les régions claires de l'image." #: /Users/c.lamboo/ultimaker/Cura/plugins/ImageReader/ConfigUI.qml:274 msgctxt "@action:label" @@ -2240,7 +2247,7 @@ msgstr "OK" #: /Users/c.lamboo/ultimaker/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:17 msgctxt "@title:window" msgid "Post Processing Plugin" -msgstr "Plug-in de post-traitement" +msgstr "Plugin de post-traitement" #: /Users/c.lamboo/ultimaker/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:57 msgctxt "@label" @@ -2439,8 +2446,8 @@ msgctxt "@info" msgid "" "Webcam feeds for cloud printers cannot be viewed from Ultimaker Cura. Click " "\"Manage printer\" to visit Ultimaker Digital Factory and view this webcam." -msgstr "Les flux de webcam des imprimantes cloud ne peuvent pas être visualisés depuis Ultimaker Cura. Cliquez sur « Gérer l'imprimante » pour visiter Ultimaker" -" Digital Factory et voir cette webcam." +msgstr "" +"Les flux de webcam des imprimantes cloud ne peuvent pas être visualisés depuis Ultimaker Cura. Cliquez sur « Gérer l'imprimante » pour visiter Ultimaker Digital Factory et voir cette webcam." #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:347 msgctxt "@label:status" @@ -2507,7 +2514,7 @@ msgstr "Premier disponible" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml:117 msgctxt "@info" msgid "Monitor your printers from everywhere using Ultimaker Digital Factory" -msgstr "Surveillez vos imprimantes à distance grâce à Ultimaker Digital Factory" +msgstr "Surveillez vos imprimantes à distance avec Ultimaker Digital Factory" #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml:129 msgctxt "@button" @@ -2527,9 +2534,9 @@ msgid "" "your printer to your WIFI network. If you don't connect Cura with your " "printer, you can still use a USB drive to transfer g-code files to your " "printer." -msgstr "Pour imprimer directement sur votre imprimante via le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble Ethernet ou en connectant" -" votre imprimante à votre réseau Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers" -" g-code sur votre imprimante." +msgstr "" +"Pour imprimer directement sur votre imprimante via le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble Ethernet ou en connectant votre imprimante à votre réseau " +"Wi-Fi. Si vous ne connectez pas Cura avec votre imprimante, vous pouvez utiliser une clé USB pour transférer les fichiers g-code sur votre imprimante." #: /Users/c.lamboo/ultimaker/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:51 msgctxt "@label" @@ -2732,7 +2739,7 @@ msgstr "Profils" #: /Users/c.lamboo/ultimaker/Cura/plugins/CuraDrive/src/qml/components/BackupListItemDetails.qml:53 msgctxt "@backuplist:label" msgid "Plugins" -msgstr "Plug-ins" +msgstr "Plugins" #: /Users/c.lamboo/ultimaker/Cura/plugins/CuraDrive/src/qml/components/BackupListFooter.qml:22 msgctxt "@button" @@ -2823,8 +2830,8 @@ msgctxt "@text:window" msgid "" "Ultimaker Cura collects anonymous data in order to improve the print quality " "and user experience. Below is an example of all the data that is shared:" -msgstr "Ultimaker Cura recueille des données anonymes afin d'améliorer la qualité d'impression et l'expérience utilisateur. Voici un exemple de toutes les données" -" partagées :" +msgstr "" +"Ultimaker Cura recueille des données anonymes afin d'améliorer la qualité d'impression et l'expérience utilisateur. Voici un exemple de toutes les données partagées :" #: /Users/c.lamboo/ultimaker/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:107 msgctxt "@text:window" @@ -2839,12 +2846,12 @@ msgstr "Autoriser l'envoi de données anonymes" #: /Users/c.lamboo/ultimaker/Cura/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml:216 msgctxt "@option" msgid "Save Cura project and print file" -msgstr "Salva progetto Cura e stampa file" +msgstr "Sauvegarder le projet Cura et imprimer le fichier" #: /Users/c.lamboo/ultimaker/Cura/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml:217 msgctxt "@option" msgid "Save Cura project" -msgstr "Salva progetto Cura" +msgstr "Sauvegarder le projet Cura" #: /Users/c.lamboo/ultimaker/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30 msgctxt "@label" @@ -2867,8 +2874,9 @@ msgid "" "To make sure your prints will come out great, you can now adjust your " "buildplate. When you click 'Move to Next Position' the nozzle will move to " "the different positions that can be adjusted." -msgstr "Pour obtenir des résultats d'impression optimaux, vous pouvez maintenant régler votre plateau. Quand vous cliquez sur 'Aller à la position suivante', la" -" buse se déplacera vers les différentes positions pouvant être réglées." +msgstr "" +"Pour obtenir des résultats d'impression optimaux, vous pouvez maintenant régler votre plateau. Quand vous cliquez sur 'Aller à la position suivante', la buse se déplacera vers les " +"différentes positions pouvant être réglées." #: /Users/c.lamboo/ultimaker/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:52 msgctxt "@label" @@ -2876,8 +2884,8 @@ msgid "" "For every position; insert a piece of paper under the nozzle and adjust the " "print build plate height. The print build plate height is right when the " "paper is slightly gripped by the tip of the nozzle." -msgstr "Pour chacune des positions ; glissez un bout de papier sous la buse et ajustez la hauteur du plateau. La hauteur du plateau est juste lorsque la pointe" -" de la buse gratte légèrement le papier." +msgstr "" +"Pour chacune des positions ; glissez un bout de papier sous la buse et ajustez la hauteur du plateau. La hauteur du plateau est juste lorsque la pointe de la buse gratte légèrement le papier." #: /Users/c.lamboo/ultimaker/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:67 msgctxt "@action:button" @@ -2892,7 +2900,7 @@ msgstr "Aller à la position suivante" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/PackageCardHeader.qml:172 msgctxt "@label Is followed by the name of an author" msgid "By" -msgstr "Per mezzo di" +msgstr "Par" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/PackageCardHeader.qml:207 #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/OnboardBanner.qml:101 @@ -2948,14 +2956,14 @@ msgstr "Mise à jour" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/Plugins.qml:8 msgctxt "@header" msgid "Install Plugins" -msgstr "Installer les plug-ins" +msgstr "Installer les plugins" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/Plugins.qml:12 msgctxt "@text" msgid "" "Streamline your workflow and customize your Ultimaker Cura experience with " "plugins contributed by our amazing community of users." -msgstr "Simplifiez votre flux de travail et personnalisez votre expérience Ultimaker Cura avec des plug-ins fournis par notre incroyable communauté d'utilisateurs." +msgstr "Simplifiez votre flux de travail et personnalisez votre expérience Ultimaker Cura avec des plugins fournis par notre incroyable communauté d'utilisateurs." #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/CompatibilityDialog.qml:15 msgctxt "@title" @@ -3000,7 +3008,7 @@ msgstr "Contrat de licence du plugin" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/LicenseDialog.qml:47 msgctxt "@text" msgid "Please read and agree with the plugin licence." -msgstr "Veuillez lire et accepter la licence du plug-in." +msgstr "Veuillez lire et accepter la licence du plugin." #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/LicenseDialog.qml:70 msgctxt "@button" @@ -3075,7 +3083,7 @@ msgstr "Optimisé pour Air Manager" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/PackagePage.qml:243 msgctxt "@button" msgid "Visit plug-in website" -msgstr "Visitez le site Web du plug-in" +msgstr "Visitez le site Web du plugin" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/PackagePage.qml:243 msgctxt "@button" @@ -3140,7 +3148,7 @@ msgstr "Charger plus" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/VerifiedIcon.qml:21 msgctxt "@info" msgid "Ultimaker Verified Plug-in" -msgstr "Plug-in Ultimaker vérifié" +msgstr "Plugin Ultimaker vérifié" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/VerifiedIcon.qml:22 msgctxt "@info" @@ -3162,12 +3170,12 @@ msgctxt "@text" msgid "" "Manage your Ultimaker Cura plugins and material profiles here. Make sure to " "keep your plugins up to date and backup your setup regularly." -msgstr "Gérez vos plug-ins Ultimaker Cura et vos profils matériaux ici. Assurez-vous de maintenir vos plug-ins à jour et de sauvegarder régulièrement votre configuration." +msgstr "Gérez vos plugins Ultimaker Cura et vos profils matériaux ici. Assurez-vous de maintenir vos plugins à jour et de sauvegarder régulièrement votre configuration." #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/InstallMissingPackagesDialog.qml:15 msgctxt "@title" msgid "Install missing Materials" -msgstr "Installa materiali mancanti" +msgstr "Installer les matériaux manquants" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/Marketplace.qml:87 msgctxt "@title" @@ -3177,7 +3185,7 @@ msgstr "Chargement..." #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/Marketplace.qml:148 msgctxt "@button" msgid "Plugins" -msgstr "Plug-ins" +msgstr "Plugins" #: /Users/c.lamboo/ultimaker/Cura/plugins/Marketplace/resources/qml/Marketplace.qml:156 msgctxt "@button" @@ -3206,8 +3214,11 @@ msgid "" "- Check if the printer is turned on.\n" "- Check if the printer is connected to the network.\n" "- Check if you are signed in to discover cloud-connected printers." -msgstr "Assurez-vous que votre imprimante est connectée :\n- Vérifiez si l'imprimante est sous tension.\n- Vérifiez si l'imprimante est connectée au réseau.- Vérifiez" -" si vous êtes connecté pour découvrir les imprimantes connectées au cloud." +msgstr "" +"Assurez-vous que votre imprimante est connectée:\n" +"- Vérifiez si l'imprimante est sous tension.\n" +"- Vérifiez si l'imprimante est connectée au réseau.\n" +"- Vérifiez si vous êtes connecté pour découvrir les imprimantes connectées au cloud." #: /Users/c.lamboo/ultimaker/Cura/plugins/MonitorStage/MonitorMain.qml:113 msgctxt "@info" @@ -3359,7 +3370,8 @@ msgctxt "@label" msgid "" "The material used in this project is currently not installed in Cura.
    Install the material profile and reopen the project." -msgstr "Le matériau utilisé dans ce projet n'est actuellement pas installé dans Cura.
    Installez le profil du matériau et rouvrez le projet." +msgstr "" +"Le matériau utilisé dans ce projet n'est actuellement pas installé dans Cura.
    Installer le profil de matériau et rouvrir le projet." #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/WorkspaceDialog.qml:515 msgctxt "@action:button" @@ -3369,12 +3381,12 @@ msgstr "Ouvrir" #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/WorkspaceDialog.qml:521 msgctxt "@action:button" msgid "Open project anyway" -msgstr "Apri il progetto comunque" +msgstr "Ouvrir tout de même le projet" #: /Users/c.lamboo/ultimaker/Cura/plugins/3MFReader/WorkspaceDialog.qml:530 msgctxt "@action:button" msgid "Install missing material" -msgstr "Installa materiale mancante" +msgstr "Installer le matériel manquant" #: /Users/c.lamboo/ultimaker/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:41 msgctxt "@label" @@ -3443,16 +3455,16 @@ msgid "" "Firmware is the piece of software running directly on your 3D printer. This " "firmware controls the step motors, regulates the temperature and ultimately " "makes your printer work." -msgstr "Le firmware est le logiciel fonctionnant directement dans votre imprimante 3D. Ce firmware contrôle les moteurs pas à pas, régule la température et surtout," -" fait que votre machine fonctionne." +msgstr "" +"Le firmware est le logiciel fonctionnant directement dans votre imprimante 3D. Ce firmware contrôle les moteurs pas à pas, régule la température et surtout, fait que votre machine fonctionne." #: /Users/c.lamboo/ultimaker/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:43 msgctxt "@label" msgid "" "The firmware shipping with new printers works, but new versions tend to have " "more features and improvements." -msgstr "Le firmware fourni avec les nouvelles imprimantes fonctionne, mais les nouvelles versions ont tendance à fournir davantage de fonctionnalités ainsi que" -" des améliorations." +msgstr "" +"Le firmware fourni avec les nouvelles imprimantes fonctionne, mais les nouvelles versions ont tendance à fournir davantage de fonctionnalités ainsi que des améliorations." #: /Users/c.lamboo/ultimaker/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:55 msgctxt "@action:button" @@ -3654,7 +3666,10 @@ msgid "" "This setting has a value that is different from the profile.\n" "\n" "Click to restore the value of the profile." -msgstr "Ce paramètre possède une valeur qui est différente du profil.\n\nCliquez pour restaurer la valeur du profil." +msgstr "" +"Ce paramètre possède une valeur qui est différente du profil.\n" +"\n" +"Cliquez pour restaurer la valeur du profil." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Settings/SettingItem.qml:334 msgctxt "@label" @@ -3663,7 +3678,10 @@ msgid "" "set.\n" "\n" "Click to restore the calculated value." -msgstr "Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n\nCliquez pour restaurer la valeur calculée." +msgstr "" +"Ce paramètre est normalement calculé mais il possède actuellement une valeur absolue définie.\n" +"\n" +"Cliquez pour restaurer la valeur calculée." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Settings/SettingView.qml:48 msgctxt "@label:textbox" @@ -3708,12 +3726,15 @@ msgid "" "value.\n" "\n" "Click to make these settings visible." -msgstr "Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n\nCliquez pour rendre ces paramètres visibles." +msgstr "" +"Certains paramètres masqués utilisent des valeurs différentes de leur valeur normalement calculée.\n" +"\n" +"Cliquez pour rendre ces paramètres visibles." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/MainWindow/MainWindowHeader.qml:135 msgctxt "@action:button" msgid "Marketplace" -msgstr "Marché en ligne" +msgstr "Marketplace" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/MainWindow/ApplicationMenu.qml:63 #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Menus/SettingsMenu.qml:13 @@ -3865,8 +3886,8 @@ msgid "" "It seems like you don't have any compatible printers connected to Digital " "Factory. Make sure your printer is connected and it's running the latest " "firmware." -msgstr "Il semble que vous n'ayez aucune imprimante compatible connectée à Digital Factory. Assurez-vous que votre imprimante est connectée et qu'elle utilise" -" le dernier micrologiciel." +msgstr "" +"Il semble que vous n'ayez aucune imprimante compatible connectée à Digital Factory. Assurez-vous que votre imprimante est connectée et qu'elle utilise le dernier micrologiciel." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/Materials/MaterialsSyncDialog.qml:585 msgctxt "@button" @@ -4156,12 +4177,12 @@ msgstr "Interface" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:215 msgctxt "@heading" msgid "-- incomplete --" -msgstr "--complet --" +msgstr "-- incomplet —-" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:261 msgctxt "@label" msgid "Currency:" -msgstr "Devise :" +msgstr "Devise:" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:277 msgctxt "" @@ -4217,8 +4238,8 @@ msgctxt "@info:tooltip" msgid "" "Highlight missing or extraneous surfaces of the model using warning signs. " "The toolpaths will often be missing parts of the intended geometry." -msgstr "Surlignez les surfaces du modèle manquantes ou étrangères en utilisant les signes d'avertissement. Les Toolpaths seront souvent les parties manquantes" -" de la géométrie prévue." +msgstr "" +"Surlignez les surfaces du modèle manquantes ou étrangères en utilisant les signes d'avertissement. Les Toolpaths seront souvent les parties manquantes de la géométrie prévue." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:409 msgctxt "@option:check" @@ -4322,7 +4343,7 @@ msgstr "Quel type de rendu de la caméra doit-il être utilisé?" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:569 msgctxt "@window:text" msgid "Camera rendering:" -msgstr "Rendu caméra :" +msgstr "Rendu caméra:" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:576 msgid "Perspective" @@ -4359,7 +4380,7 @@ msgstr "Les objets doivent-ils être supprimés du plateau de fabrication avant #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:646 msgctxt "@option:check" msgid "Clear buildplate before loading model into the single instance" -msgstr "Supprimez les objets du plateau de fabrication avant de charger un modèle dans l'instance unique" +msgstr "Supprimer les objets du plateau avant de charger un modèle dans l'instance unique" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:656 msgctxt "@info:tooltip" @@ -4446,8 +4467,9 @@ msgid "" "When you have made changes to a profile and switched to a different one, a " "dialog will be shown asking whether you want to keep your modifications or " "not, or you can choose a default behaviour and never show that dialog again." -msgstr "Lorsque vous apportez des modifications à un profil puis passez à un autre profil, une boîte de dialogue apparaît, vous demandant si vous souhaitez conserver" -" les modifications. Vous pouvez aussi choisir une option par défaut, et le dialogue ne s'affichera plus." +msgstr "" +"Lorsque vous apportez des modifications à un profil puis passez à un autre profil, une boîte de dialogue apparaît, vous demandant si vous souhaitez conserver les modifications. Vous pouvez " +"aussi choisir une option par défaut, et le dialogue ne s'affichera plus." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:801 #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedPrintSetup.qml:36 @@ -4489,8 +4511,9 @@ msgid "" "Should anonymous data about your print be sent to Ultimaker? Note, no " "models, IP addresses or other personally identifiable information is sent or " "stored." -msgstr "Les données anonymes de votre impression doivent-elles être envoyées à Ultimaker ? Notez qu'aucun modèle, aucune adresse IP ni aucune autre information" -" permettant de vous identifier personnellement ne seront envoyés ou stockés." +msgstr "" +"Les données anonymes de votre impression doivent-elles être envoyées à Ultimaker ? Notez qu'aucun modèle, aucune adresse IP ni aucune autre information permettant de vous identifier " +"personnellement ne seront envoyés ou stockés." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:867 msgctxt "@option:check" @@ -4537,8 +4560,8 @@ msgctxt "@info:tooltip" msgid "" "Should an automatic check for new plugins be done every time Cura is " "started? It is highly recommended that you do not disable this!" -msgstr "Une vérification automatique des nouveaux plugins doit-elle être effectuée à chaque fois que Cura est lancé ? Il est fortement recommandé de ne pas désactiver" -" cette fonction !" +msgstr "" +"Une vérification automatique des nouveaux plugins doit-elle être effectuée à chaque fois que Cura est lancé ? Il est fortement recommandé de ne pas désactiver cette fonction !" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Preferences/GeneralPage.qml:962 msgctxt "@option:check" @@ -4814,17 +4837,17 @@ msgstr "Connectez-vous à la plateforme Ultimaker" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/WelcomePages/CloudContent.qml:123 msgctxt "@text" msgid "Add material settings and plugins from the Marketplace" -msgstr "Ajoutez des paramètres de matériaux et des plug-ins depuis la Marketplace" +msgstr "Ajoutez des paramètres de matériaux et des plugins depuis la Marketplace" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/WelcomePages/CloudContent.qml:149 msgctxt "@text" msgid "Backup and sync your material settings and plugins" -msgstr "Sauvegardez et synchronisez vos paramètres de matériaux et vos plug-ins" +msgstr "Sauvegardez et synchronisez vos paramètres de matériaux et vos plugins" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/WelcomePages/CloudContent.qml:175 msgctxt "@text" msgid "Share ideas and get help from 48,000+ users in the Ultimaker Community" -msgstr "Partagez vos idées et obtenez l'aide de plus de 48 000 utilisateurs de la communauté Ultimaker" +msgstr "Partagez vos idées et obtenez l'aide de plus de 48,000 utilisateurs de la communauté Ultimaker" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/WelcomePages/CloudContent.qml:189 msgctxt "@button" @@ -4972,7 +4995,9 @@ msgctxt "@text" msgid "" "Please follow these steps to set up Ultimaker Cura. This will only take a " "few moments." -msgstr "Veuillez suivre ces étapes pour configurer\nUltimaker Cura. Cela ne prendra que quelques instants." +msgstr "" +"Veuillez suivre ces étapes pour configurer\n" +"Ultimaker Cura. Cela ne prendra que quelques instants." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/WelcomePages/WelcomeContent.qml:82 msgctxt "@button" @@ -5164,7 +5189,7 @@ msgstr "Sélectionner tous les modèles" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Actions.qml:393 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" -msgstr "Supprimer les objets du plateau" +msgstr "Supprimer les modèles du plateau" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Actions.qml:403 msgctxt "@action:inmenu menubar:file" @@ -5414,7 +5439,7 @@ msgstr "Cette configuration n'est pas disponible car %1 n'est pas reconnu. Veuil #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml:138 msgctxt "@label" msgid "Marketplace" -msgstr "Marché en ligne" +msgstr "Marketplace" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:106 msgctxt "@tooltip" @@ -5519,7 +5544,7 @@ msgstr "Gérer la visibilité des paramètres..." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Dialogs/ChoosePrinterDialog.qml:17 msgctxt "@title:window" msgid "Select Printer" -msgstr "Sélectionner une imprimante" +msgstr "Sélectionner l’imprimante" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Dialogs/ChoosePrinterDialog.qml:54 msgctxt "@title:label" @@ -5543,8 +5568,9 @@ msgid "" "We have found one or more project file(s) within the files you have " "selected. You can open only one project file at a time. We suggest to only " "import models from those files. Would you like to proceed?" -msgstr "Nous avons trouvé au moins un fichier de projet parmi les fichiers que vous avez sélectionnés. Vous ne pouvez ouvrir qu'un seul fichier de projet à la" -" fois. Nous vous conseillons de n'importer que les modèles de ces fichiers. Souhaitez-vous continuer ?" +msgstr "" +"Nous avons trouvé au moins un fichier de projet parmi les fichiers que vous avez sélectionnés. Vous ne pouvez ouvrir qu'un seul fichier de projet à la fois. Nous vous conseillons de " +"n'importer que les modèles de ces fichiers. Souhaitez-vous continuer?" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:64 msgctxt "@action:button" @@ -5589,8 +5615,10 @@ msgid "" "You have customized some profile settings. Would you like to Keep these " "changed settings after switching profiles? Alternatively, you can discard " "the changes to load the defaults from '%1'." -msgstr "Vous avez personnalisé certains paramètres de profil.\nSouhaitez-vous conserver ces paramètres modifiés après avoir changé de profil ?\nVous pouvez également" -" annuler les modifications pour charger les valeurs par défaut de '%1'." +msgstr "" +"Vous avez personnalisé certains paramètres de profil.\n" +"Souhaitez-vous conserver ces paramètres modifiés après avoir changé de profil ?\n" +"Vous pouvez également annuler les modifications pour charger les valeurs par défaut de '%1'." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:85 msgctxt "@title:column" @@ -5672,7 +5700,9 @@ msgctxt "@info:credit" msgid "" "Cura is developed by Ultimaker B.V. in cooperation with the community.\n" "Cura proudly uses the following open source projects:" -msgstr "Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\nCura est fier d'utiliser les projets open source suivants :" +msgstr "" +"Cura a été développé par Ultimaker B.V. en coopération avec la communauté Ultimaker.\n" +"Cura est fier d'utiliser les projets open source suivants :" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Dialogs/AboutDialog.qml:138 msgctxt "@label Description for application component" @@ -5806,6 +5836,7 @@ msgid "Support library for scientific computing" msgstr "Prise en charge de la bibliothèque pour le calcul scientifique" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Dialogs/AboutDialog.qml:171 +#, fuzzy msgctxt "@Label Description for application dependency" msgid "Python Error tracking library" msgstr "Bibliothèque de suivi des erreurs Python" @@ -5878,7 +5909,7 @@ msgstr "Surveillez les tâches d'impression et réimprimez à partir de votre hi #: /Users/c.lamboo/ultimaker/Cura/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml:55 msgctxt "@tooltip:button" msgid "Extend Ultimaker Cura with plugins and material profiles." -msgstr "Étendez Ultimaker Cura avec des plug-ins et des profils de matériaux." +msgstr "Étendez Ultimaker Cura avec des plugins et des profils de matériaux." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml:62 msgctxt "@tooltip:button" @@ -5946,7 +5977,7 @@ msgstr "Le profil personnalisé %1 remplace certains paramètres." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/ProfileWarningReset.qml:79 msgctxt "@info" msgid "Some settings were changed." -msgstr "Alcune impostazioni sono state modificate." +msgstr "Certains paramètres ont été modifiés." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:78 #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:254 @@ -5963,7 +5994,7 @@ msgstr "Remplissage graduel" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/UnsupportedProfileIndication.qml:31 msgctxt "@error" msgid "Configuration not supported" -msgstr "Configurazione non supportata" +msgstr "Configuration non supportée" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/UnsupportedProfileIndication.qml:39 msgctxt "@message:text %1 is the name the printer uses for 'nozzle'." @@ -5975,7 +6006,7 @@ msgstr "Nessun profilo disponibile per la configurazione del materiale /%1 selez #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/UnsupportedProfileIndication.qml:47 msgctxt "@button:label" msgid "Learn more" -msgstr "Ulteriori informazioni" +msgstr "En savoir plus" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:27 msgctxt "@label" @@ -5987,13 +6018,13 @@ msgctxt "@label" msgid "" "Enable printing a brim or raft. This will add a flat area around or under " "your object which is easy to cut off afterwards." -msgstr "Activez l'impression d'une bordure ou plaquette (Brim/Raft). Cela ajoutera une zone plate autour de ou sous votre objet qui est facile à découper par la" -" suite." +msgstr "" +"Activez l'impression d'une bordure ou plaquette (Brim/Raft). Cela ajoutera une zone plate autour de ou sous votre objet qui est facile à découper par la suite." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedResolutionSelector.qml:27 msgctxt "@label" msgid "Resolution" -msgstr "Risoluzione" +msgstr "Résolution" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:20 msgctxt "@label shown when we load a Gcode file" @@ -6037,7 +6068,10 @@ msgid "" "profile.\n" "\n" "Click to open the profile manager." -msgstr "Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n\nCliquez pour ouvrir le gestionnaire de profils." +msgstr "" +"Certaines valeurs de paramètre / forçage sont différentes des valeurs enregistrées dans le profil. \n" +"\n" +"Cliquez pour ouvrir le gestionnaire de profils." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrintSetupSelector/Custom/QualitiesWithIntentMenu.qml:158 msgctxt "@label:header" @@ -6059,8 +6093,8 @@ msgctxt "@tooltip" msgid "" "The target temperature of the heated bed. The bed will heat up or cool down " "towards this temperature. If this is 0, the bed heating is turned off." -msgstr "Température cible du plateau chauffant. Le plateau sera chauffé ou refroidi pour tendre vers cette température. Si la valeur est 0, le chauffage du plateau" -" sera éteint." +msgstr "" +"Température cible du plateau chauffant. Le plateau sera chauffé ou refroidi pour tendre vers cette température. Si la valeur est 0, le chauffage du plateau sera éteint." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrinterOutput/HeatedBedBox.qml:88 msgctxt "@tooltip" @@ -6090,8 +6124,9 @@ msgid "" "Heat the bed in advance before printing. You can continue adjusting your " "print while it is heating, and you won't have to wait for the bed to heat up " "when you're ready to print." -msgstr "Préchauffez le plateau avant l'impression. Vous pouvez continuer à ajuster votre impression pendant qu'il chauffe, et vous n'aurez pas à attendre que le" -" plateau chauffe lorsque vous serez prêt à lancer l'impression." +msgstr "" +"Préchauffez le plateau avant l'impression. Vous pouvez continuer à ajuster votre impression pendant qu'il chauffe, et vous n'aurez pas à attendre que le plateau chauffe lorsque vous serez " +"prêt à lancer l'impression." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:40 msgctxt "@label" @@ -6103,8 +6138,9 @@ msgctxt "@tooltip" msgid "" "The target temperature of the hotend. The hotend will heat up or cool down " "towards this temperature. If this is 0, the hotend heating is turned off." -msgstr "Température cible de l'extrémité chauffante. L'extrémité chauffante sera chauffée ou refroidie pour tendre vers cette température. Si la valeur est 0," -" le chauffage de l'extrémité chauffante sera coupé." +msgstr "" +"Température cible de l'extrémité chauffante. L'extrémité chauffante sera chauffée ou refroidie pour tendre vers cette température. Si la valeur est 0, le chauffage de l'extrémité chauffante " +"sera coupé." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:105 msgctxt "@tooltip" @@ -6122,8 +6158,9 @@ msgid "" "Heat the hotend in advance before printing. You can continue adjusting your " "print while it is heating, and you won't have to wait for the hotend to heat " "up when you're ready to print." -msgstr "Préchauffez l'extrémité chauffante avant l'impression. Vous pouvez continuer l'ajustement de votre impression pendant qu'elle chauffe, ce qui vous évitera" -" un temps d'attente lorsque vous serez prêt à lancer l'impression." +msgstr "" +"Préchauffez l'extrémité chauffante avant l'impression. Vous pouvez continuer l'ajustement de votre impression pendant qu'elle chauffe, ce qui vous évitera un temps d'attente lorsque vous " +"serez prêt à lancer l'impression." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/PrinterOutput/ExtruderBox.qml:335 msgctxt "@tooltip" @@ -6175,7 +6212,7 @@ msgctxt "@tooltip of G-code command input" msgid "" "Send a custom G-code command to the connected printer. Press 'enter' to send " "the command." -msgstr "Envoyer une commande G-Code personnalisée à l'imprimante connectée. Appuyez sur « Entrée » pour envoyer la commande." +msgstr "Envoyer une commande G-Code personnalisée à l'imprimante connectée. Appuyez sur « Entrée » pour envoyer la commande." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Cura.qml:250 msgctxt "@label" @@ -6196,7 +6233,7 @@ msgstr "Fermeture de %1" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Cura.qml:597 msgctxt "@label %1 is the application name" msgid "Are you sure you want to exit %1?" -msgstr "Voulez-vous vraiment quitter %1 ?" +msgstr "Voulez-vous vraiment quitter %1?" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Cura.qml:740 msgctxt "@window:title" @@ -6214,8 +6251,9 @@ msgid "" "We have found one or more G-Code files within the files you have selected. " "You can only open one G-Code file at a time. If you want to open a G-Code " "file, please just select only one." -msgstr "Nous avons trouvé au moins un fichier G-Code parmi les fichiers que vous avez sélectionné. Vous ne pouvez ouvrir qu'un seul fichier G-Code à la fois. Si" -" vous souhaitez ouvrir un fichier G-Code, veuillez ne sélectionner qu'un seul fichier de ce type." +msgstr "" +"Nous avons trouvé au moins un fichier G-Code parmi les fichiers que vous avez sélectionné. Vous ne pouvez ouvrir qu'un seul fichier G-Code à la fois. Si vous souhaitez ouvrir un fichier G-" +"Code, veuillez ne sélectionner qu'un seul fichier de ce type." #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Cura.qml:829 msgctxt "@title:window" @@ -6233,8 +6271,10 @@ msgid "" "- Add material profiles and plug-ins from the Marketplace\n" "- Back-up and sync your material profiles and plug-ins\n" "- Share ideas and get help from 48,000+ users in the Ultimaker community" -msgstr "- Ajoutez des profils de matériaux et des plug-ins à partir de la Marketplace\n- Sauvegardez et synchronisez vos profils de matériaux et vos plug-ins\n-" -" Partagez vos idées et obtenez l'aide de plus de 48 000 utilisateurs de la communauté Ultimaker" +msgstr "" +"- Ajoutez des profils de matériaux et des plugins à partir de la Marketplace\n" +"- Sauvegardez et synchronisez vos profils de matériaux et vos plugins\n" +"- Partagez vos idées et obtenez l'aide de plus de 48,000 utilisateurs de la communauté Ultimaker" #: /Users/c.lamboo/ultimaker/Cura/resources/qml/Account/GeneralOperations.qml:58 msgctxt "@button" From 663dcb896877629e9660eaf62976bb03871675e5 Mon Sep 17 00:00:00 2001 From: xommit <70339941+xommit@users.noreply.github.com> Date: Thu, 17 Nov 2022 15:21:34 +0100 Subject: [PATCH 11/51] Update cura.po --- resources/i18n/fr_FR/cura.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index f73616dbc6..d2b48930c9 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -1,10 +1,12 @@ -# Cura -# Copyright (C) 2022 Ultimaker B.V. -# This file is distributed under the same license as the Cura package. +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. # +#, fuzzy msgid "" msgstr "" -"Project-Id-Version: Cura 5.2\n" +"Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-09-27 14:50+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" From f78fbd3edfc49a8a68a6a8e6441f9bebfeccd5c7 Mon Sep 17 00:00:00 2001 From: jspijker Date: Sun, 20 Nov 2022 10:51:42 +0100 Subject: [PATCH 12/51] Auto format printer/profiles with printer-linter Runs only master and release branch, will create a co-authored commit if formatting was applied --- .github/workflows/printer_linter_format.yml | 45 +++++++++++++++++++ .../workflows/requirements-printer-linter.txt | 1 + 2 files changed, 46 insertions(+) create mode 100644 .github/workflows/printer_linter_format.yml create mode 100644 .github/workflows/requirements-printer-linter.txt diff --git a/.github/workflows/printer_linter_format.yml b/.github/workflows/printer_linter_format.yml new file mode 100644 index 0000000000..75134cddbb --- /dev/null +++ b/.github/workflows/printer_linter_format.yml @@ -0,0 +1,45 @@ +name: printer-linter-format + +on: + push: + branches: + - main + - '[1-9].[0-9]' + - '[1-9].[0-9][0-9]' + path: + - 'resources/**' + +jobs: + printer_lint: + name: Printer linter auto format + + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: 3.11.x + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-printer-linter.txt + + - uses: technote-space/get-diff-action@v6 + with: + PATTERNS: | + resources/+(definitions|extruders)/*.def.json + resources/+(intent|quality|variants)/**/*.inst.cfg + + - name: Install Python requirements for runner + if: env.GIT_DIFF && !env.MATCHED_FILES + run: pip install -r .github/workflows/requirements-printer-linter.txt + + - name: Format file + if: env.GIT_DIFF && !env.MATCHED_FILES + run: python printer-linter/printer-linter.py --format ${{ env.GIT_DIFF_FILTERED }} + + - uses: stefanzweifel/git-auto-commit-action@v4 + if: env.GIT_DIFF && !env.MATCHED_FILES + with: + commit_message: "Applied printer-linter format" diff --git a/.github/workflows/requirements-printer-linter.txt b/.github/workflows/requirements-printer-linter.txt new file mode 100644 index 0000000000..4818cc5419 --- /dev/null +++ b/.github/workflows/requirements-printer-linter.txt @@ -0,0 +1 @@ +pyyaml \ No newline at end of file From db7e89815ee6d189aa5efd3ddc6f997688f88da3 Mon Sep 17 00:00:00 2001 From: jspijker Date: Mon, 21 Nov 2022 13:16:26 +0100 Subject: [PATCH 13/51] Renamed the workflow for consistency --- .github/workflows/printer-linter-format.yml | 45 +++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/printer-linter-format.yml diff --git a/.github/workflows/printer-linter-format.yml b/.github/workflows/printer-linter-format.yml new file mode 100644 index 0000000000..9fb5a1c584 --- /dev/null +++ b/.github/workflows/printer-linter-format.yml @@ -0,0 +1,45 @@ +name: printer-linter-format + +on: + push: + branches: + - main + - '[1-9].[0-9]' + - '[1-9].[0-9][0-9]' + path: + - 'resources/**' + +jobs: + printer-linter-format: + name: Printer linter auto format + + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: 3.11.x + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-printer-linter.txt + + - uses: technote-space/get-diff-action@v6 + with: + PATTERNS: | + resources/+(definitions|extruders)/*.def.json + resources/+(intent|quality|variants)/**/*.inst.cfg + + - name: Install Python requirements for runner + if: env.GIT_DIFF && !env.MATCHED_FILES + run: pip install -r .github/workflows/requirements-printer-linter.txt + + - name: Format file + if: env.GIT_DIFF && !env.MATCHED_FILES + run: python printer-linter/src/terminal.py --format ${{ env.GIT_DIFF_FILTERED }} + + - uses: stefanzweifel/git-auto-commit-action@v4 + if: env.GIT_DIFF && !env.MATCHED_FILES + with: + commit_message: "Applied printer-linter format" From def686e61af04f9330d797b7d1ab60bcd5eba536 Mon Sep 17 00:00:00 2001 From: jspijker Date: Mon, 21 Nov 2022 13:32:23 +0100 Subject: [PATCH 14/51] Remove old workflow --- .github/workflows/printer_linter_format.yml | 45 --------------------- 1 file changed, 45 deletions(-) delete mode 100644 .github/workflows/printer_linter_format.yml diff --git a/.github/workflows/printer_linter_format.yml b/.github/workflows/printer_linter_format.yml deleted file mode 100644 index 75134cddbb..0000000000 --- a/.github/workflows/printer_linter_format.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: printer-linter-format - -on: - push: - branches: - - main - - '[1-9].[0-9]' - - '[1-9].[0-9][0-9]' - path: - - 'resources/**' - -jobs: - printer_lint: - name: Printer linter auto format - - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: 3.11.x - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-printer-linter.txt - - - uses: technote-space/get-diff-action@v6 - with: - PATTERNS: | - resources/+(definitions|extruders)/*.def.json - resources/+(intent|quality|variants)/**/*.inst.cfg - - - name: Install Python requirements for runner - if: env.GIT_DIFF && !env.MATCHED_FILES - run: pip install -r .github/workflows/requirements-printer-linter.txt - - - name: Format file - if: env.GIT_DIFF && !env.MATCHED_FILES - run: python printer-linter/printer-linter.py --format ${{ env.GIT_DIFF_FILTERED }} - - - uses: stefanzweifel/git-auto-commit-action@v4 - if: env.GIT_DIFF && !env.MATCHED_FILES - with: - commit_message: "Applied printer-linter format" From 187dfe1210e9755841780fffb85b0b5054a89706 Mon Sep 17 00:00:00 2001 From: jspijker Date: Mon, 21 Nov 2022 14:20:53 +0100 Subject: [PATCH 15/51] single-value-single-line formatting Need to figure out the regex expression. To only select overrides consisting of a single value --- .printer-linter | 1 + printer-linter/src/terminal.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/.printer-linter b/.printer-linter index 82eadb6d53..856649f420 100644 --- a/.printer-linter +++ b/.printer-linter @@ -9,6 +9,7 @@ format: format-definition-paired-coordinate-array: true format-definition-sort-keys: true format-definition-indent: 4 + format-definition-single-value-single-line: true format-profile-space-around-delimiters: true format-profile-sort-keys: true diagnostic-mesh-file-size: 1200000 \ No newline at end of file diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index 55af41281f..4a31340445 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -48,6 +48,9 @@ def formatFile(file: Path, settings): newline = re.compile(r"(\B\s+)(\"[\w\"]+)(\:\s\{)") content = newline.sub(r"\1\2:\1{", content) + if settings["format"].get("format-definition-single-value-single-line", True): + pass # TODO: format entries in the override section which only define a single value to be on one line + if settings["format"].get("format-definition-paired-coordinate-array", True): paired_coordinates = re.compile(r"(\[)\s+(-?\d*),\s*(-?\d*)\s*(\])") content = paired_coordinates.sub(r"\1 \2, \3 \4", content) From 91daf89c2d70433dafea85fab1f43d3babe986ad Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Tue, 22 Nov 2022 14:38:41 +0100 Subject: [PATCH 16/51] add return types --- printer-linter/src/printerlinter/defintion.py | 15 ++++++++------- printer-linter/src/printerlinter/diagnostic.py | 4 ++-- printer-linter/src/printerlinter/meshes.py | 6 +++--- printer-linter/src/printerlinter/profile.py | 4 ++-- printer-linter/src/printerlinter/replacement.py | 2 +- printer-linter/src/terminal.py | 8 ++++---- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/printer-linter/src/printerlinter/defintion.py b/printer-linter/src/printerlinter/defintion.py index a92828f31b..4d47900d68 100644 --- a/printer-linter/src/printerlinter/defintion.py +++ b/printer-linter/src/printerlinter/defintion.py @@ -7,7 +7,7 @@ from .replacement import Replacement class Definition: - def __init__(self, file, settings): + def __init__(self, file, settings) -> None: self._settings = settings self._file = file self._defs = {} @@ -20,7 +20,7 @@ class Definition: self._getSetting(k, v, settings) self._defs["fdmprinter"] = {"overrides": settings} - def check(self): + def check(self) -> None: if self._settings["checks"].get("diagnostic-definition-redundant-override", False): for check in self.checkRedefineOverride(): yield check @@ -32,7 +32,7 @@ class Definition: yield - def checkRedefineOverride(self): + def checkRedefineOverride(self) -> None: definition_name = list(self._defs.keys())[0] definition = self._defs[definition_name] if "overrides" in definition and definition_name != "fdmprinter": @@ -54,17 +54,18 @@ class Definition: replacement_text = "")] ) - def checkValueOutOfBounds(self): + def checkValueOutOfBounds(self) -> None: pass - def _getSetting(self, name, setting, settings): + def _getSetting(self, name, setting, settings) -> None: if "children" in setting: for childname, child in setting["children"].items(): self._getSetting(childname, child, settings) settings |= {name: setting} - def _getDefs(self, file): - if not file.exists(): + def _getDefs(self, file) -> None: + """ Loads up file, and it's parent definitions into self._defs """ + if not file.exists() or Path(file.stem).stem in self._defs: return self._defs[Path(file.stem).stem] = json.loads(file.read_text()) if "inherits" in self._defs[Path(file.stem).stem]: diff --git a/printer-linter/src/printerlinter/diagnostic.py b/printer-linter/src/printerlinter/diagnostic.py index 7941929c43..a6843ed38f 100644 --- a/printer-linter/src/printerlinter/diagnostic.py +++ b/printer-linter/src/printerlinter/diagnostic.py @@ -1,5 +1,5 @@ class Diagnostic: - def __init__(self, file, diagnostic_name, message, level, offset, replacements=None): + def __init__(self, file, diagnostic_name, message, level, offset, replacements=None) -> None: self.file = file self.diagnostic_name = diagnostic_name self.message = message @@ -7,7 +7,7 @@ class Diagnostic: self.level = level self.replacements = replacements - def toDict(self): + def toDict(self) -> dict: diagnostic_dict = {"DiagnosticName": self.diagnostic_name, "DiagnosticMessage": { "Message": self.message, diff --git a/printer-linter/src/printerlinter/meshes.py b/printer-linter/src/printerlinter/meshes.py index 404f194100..47205ce219 100644 --- a/printer-linter/src/printerlinter/meshes.py +++ b/printer-linter/src/printerlinter/meshes.py @@ -2,12 +2,12 @@ from .diagnostic import Diagnostic class Meshes: - def __init__(self, file, settings): + def __init__(self, file, settings) -> None: self._settings = settings self._file = file self._max_file_size = self._settings.get("diagnostic-mesh-file-size", 1e6) - def check(self): + def check(self) -> None: if self._settings["checks"].get("diagnostic-mesh-file-extension", False): for check in self.checkFileFormat(): yield check @@ -18,7 +18,7 @@ class Meshes: yield - def checkFileFormat(self): + def checkFileFormat(self) -> None: if self._file.suffix.lower() not in (".3mf", ".obj", ".stl"): yield Diagnostic( file = self._file, diff --git a/printer-linter/src/printerlinter/profile.py b/printer-linter/src/printerlinter/profile.py index 137344fe71..c5386ab0e8 100644 --- a/printer-linter/src/printerlinter/profile.py +++ b/printer-linter/src/printerlinter/profile.py @@ -1,7 +1,7 @@ class Profile: - def __init__(self, file, settings): + def __init__(self, file, settings) -> None: self._settings = settings self._file = file - def check(self): + def check(self) -> None: yield diff --git a/printer-linter/src/printerlinter/replacement.py b/printer-linter/src/printerlinter/replacement.py index d609071875..bc6b58a97b 100644 --- a/printer-linter/src/printerlinter/replacement.py +++ b/printer-linter/src/printerlinter/replacement.py @@ -5,7 +5,7 @@ class Replacement: self.length = length self.replacement_text = replacement_text - def toDict(self): + def toDict(self) -> dict: return {"FilePath": self.file.as_posix(), "Offset": self.offset, "Length": self.length, diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index 4a31340445..f388dda4c5 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -11,7 +11,7 @@ import yaml from printerlinter import factory -def examineFile(file, settings, full_body_check): +def examineFile(file, settings, full_body_check) -> None: patient = factory.create(file, settings) if patient is None: return @@ -21,7 +21,7 @@ def examineFile(file, settings, full_body_check): full_body_check["Diagnostics"].append(diagnostic.toDict()) -def fixFile(file, settings, full_body_check): +def fixFile(file, settings, full_body_check) -> None: if not file.exists(): return ext = ".".join(file.name.split(".")[-2:]) @@ -34,7 +34,7 @@ def fixFile(file, settings, full_body_check): pass -def formatFile(file: Path, settings): +def formatFile(file: Path, settings) -> None: if not file.exists(): return ext = ".".join(file.name.split(".")[-2:]) @@ -70,7 +70,7 @@ def formatFile(file: Path, settings): config.write(f, space_around_delimiters=settings["format"].get("format-profile-space-around-delimiters", True)) -def main(): +def main() -> None: parser = ArgumentParser( description="UltiMaker Cura printer linting, static analysis and formatting of Cura printer definitions and other resources") parser.add_argument("--setting", required=False, type=Path, help="Path to the `.printer-linter` setting file") From a470f02373d7806e597d1dccfe9c6e23cdf56961 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Tue, 22 Nov 2022 19:26:50 +0100 Subject: [PATCH 17/51] Move linters into seperate module. Give linters an abstract type to inherit, since they share an interface. Add empty README --- printer-linter/README.md | 0 printer-linter/src/printerlinter/__init__.py | 5 +---- printer-linter/src/printerlinter/factory.py | 11 +++++++---- .../src/printerlinter/linters/__init__.py | 6 ++++++ .../src/printerlinter/{ => linters}/defintion.py | 13 +++++++------ .../printerlinter/linters/diagnostic_generator.py | 14 ++++++++++++++ .../src/printerlinter/{ => linters}/meshes.py | 9 +++++---- .../src/printerlinter/linters/profile.py | 9 +++++++++ printer-linter/src/printerlinter/profile.py | 7 ------- 9 files changed, 49 insertions(+), 25 deletions(-) create mode 100644 printer-linter/README.md create mode 100644 printer-linter/src/printerlinter/linters/__init__.py rename printer-linter/src/printerlinter/{ => linters}/defintion.py (93%) create mode 100644 printer-linter/src/printerlinter/linters/diagnostic_generator.py rename printer-linter/src/printerlinter/{ => linters}/meshes.py (89%) create mode 100644 printer-linter/src/printerlinter/linters/profile.py delete mode 100644 printer-linter/src/printerlinter/profile.py diff --git a/printer-linter/README.md b/printer-linter/README.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/printer-linter/src/printerlinter/__init__.py b/printer-linter/src/printerlinter/__init__.py index 8023686891..a157443ff5 100644 --- a/printer-linter/src/printerlinter/__init__.py +++ b/printer-linter/src/printerlinter/__init__.py @@ -1,7 +1,4 @@ -from .defintion import Definition from .diagnostic import Diagnostic from .factory import create -from .meshes import Meshes -from .profile import Profile -__all__ = ["Profile", "Definition", "Meshes", "Diagnostic", "create"] +__all__ = ["Diagnostic", "create"] diff --git a/printer-linter/src/printerlinter/factory.py b/printer-linter/src/printerlinter/factory.py index 12e2d36628..3e76456af9 100644 --- a/printer-linter/src/printerlinter/factory.py +++ b/printer-linter/src/printerlinter/factory.py @@ -1,9 +1,12 @@ -from .profile import Profile -from .defintion import Definition -from .meshes import Meshes +from typing import Optional + +from .linters.profile import Profile +from .linters.defintion import Definition +from .linters.diagnostic_generator import DiagnosticGenerator +from .linters.meshes import Meshes -def create(file, settings): +def create(file, settings) -> Optional[DiagnosticGenerator]: if not file.exists(): return None if ".inst" in file.suffixes and ".cfg" in file.suffixes: diff --git a/printer-linter/src/printerlinter/linters/__init__.py b/printer-linter/src/printerlinter/linters/__init__.py new file mode 100644 index 0000000000..bf16caa933 --- /dev/null +++ b/printer-linter/src/printerlinter/linters/__init__.py @@ -0,0 +1,6 @@ +from .profile import Profile +from .meshes import Meshes +from .diagnostic_generator import DiagnosticGenerator +from .defintion import Definition + +__all__ = ["Profile", "Meshes", "DiagnosticGenerator", "Definition"] \ No newline at end of file diff --git a/printer-linter/src/printerlinter/defintion.py b/printer-linter/src/printerlinter/linters/defintion.py similarity index 93% rename from printer-linter/src/printerlinter/defintion.py rename to printer-linter/src/printerlinter/linters/defintion.py index 4d47900d68..c5202f76eb 100644 --- a/printer-linter/src/printerlinter/defintion.py +++ b/printer-linter/src/printerlinter/linters/defintion.py @@ -1,15 +1,16 @@ import json import re from pathlib import Path +from typing import Iterator -from .diagnostic import Diagnostic -from .replacement import Replacement +from ..diagnostic import Diagnostic +from .diagnostic_generator import DiagnosticGenerator +from ..replacement import Replacement -class Definition: +class Definition(DiagnosticGenerator): def __init__(self, file, settings) -> None: - self._settings = settings - self._file = file + super().__init__(file, settings) self._defs = {} self._getDefs(file) @@ -20,7 +21,7 @@ class Definition: self._getSetting(k, v, settings) self._defs["fdmprinter"] = {"overrides": settings} - def check(self) -> None: + def check(self) -> Iterator[Diagnostic]: if self._settings["checks"].get("diagnostic-definition-redundant-override", False): for check in self.checkRedefineOverride(): yield check diff --git a/printer-linter/src/printerlinter/linters/diagnostic_generator.py b/printer-linter/src/printerlinter/linters/diagnostic_generator.py new file mode 100644 index 0000000000..17fccd51f6 --- /dev/null +++ b/printer-linter/src/printerlinter/linters/diagnostic_generator.py @@ -0,0 +1,14 @@ +from abc import ABC, abstractmethod +from typing import Iterator + +from ..diagnostic import Diagnostic + + +class DiagnosticGenerator(ABC): + def __init__(self, file, settings) -> None: + self._settings = settings + self._file = file + + @abstractmethod + def check(self) -> Iterator[Diagnostic]: + pass \ No newline at end of file diff --git a/printer-linter/src/printerlinter/meshes.py b/printer-linter/src/printerlinter/linters/meshes.py similarity index 89% rename from printer-linter/src/printerlinter/meshes.py rename to printer-linter/src/printerlinter/linters/meshes.py index 47205ce219..0a8d0aa8a6 100644 --- a/printer-linter/src/printerlinter/meshes.py +++ b/printer-linter/src/printerlinter/linters/meshes.py @@ -1,13 +1,14 @@ -from .diagnostic import Diagnostic +from typing import Iterator + +from ..diagnostic import Diagnostic class Meshes: def __init__(self, file, settings) -> None: - self._settings = settings - self._file = file + super().__init__(file, settings) self._max_file_size = self._settings.get("diagnostic-mesh-file-size", 1e6) - def check(self) -> None: + def check(self) -> Iterator[Diagnostic]: if self._settings["checks"].get("diagnostic-mesh-file-extension", False): for check in self.checkFileFormat(): yield check diff --git a/printer-linter/src/printerlinter/linters/profile.py b/printer-linter/src/printerlinter/linters/profile.py new file mode 100644 index 0000000000..ac48084943 --- /dev/null +++ b/printer-linter/src/printerlinter/linters/profile.py @@ -0,0 +1,9 @@ +from typing import Iterator + +from ..diagnostic import Diagnostic +from .diagnostic_generator import DiagnosticGenerator + + +class Profile(DiagnosticGenerator): + def check(self) -> Iterator[Diagnostic]: + yield diff --git a/printer-linter/src/printerlinter/profile.py b/printer-linter/src/printerlinter/profile.py deleted file mode 100644 index c5386ab0e8..0000000000 --- a/printer-linter/src/printerlinter/profile.py +++ /dev/null @@ -1,7 +0,0 @@ -class Profile: - def __init__(self, file, settings) -> None: - self._settings = settings - self._file = file - - def check(self) -> None: - yield From ad7e7191464e024c0520fc913ede468fd2bf1115 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Tue, 22 Nov 2022 21:42:42 +0100 Subject: [PATCH 18/51] Format lists and dicts of a single item onto one line example: "dict": { "value": 10 } becomes "dict": { "value": 10 } --- .printer-linter | 2 +- printer-linter/README.md | 11 +++++++++++ printer-linter/src/terminal.py | 6 +++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.printer-linter b/.printer-linter index 856649f420..f9f105e1f7 100644 --- a/.printer-linter +++ b/.printer-linter @@ -9,7 +9,7 @@ format: format-definition-paired-coordinate-array: true format-definition-sort-keys: true format-definition-indent: 4 - format-definition-single-value-single-line: true + format-definition-single-value-single-line: true # Format dicts and lists with a single item on one line "dict": { "value": 10 } format-profile-space-around-delimiters: true format-profile-sort-keys: true diagnostic-mesh-file-size: 1200000 \ No newline at end of file diff --git a/printer-linter/README.md b/printer-linter/README.md index e69de29bb2..64246e5440 100644 --- a/printer-linter/README.md +++ b/printer-linter/README.md @@ -0,0 +1,11 @@ +# Printer Linter +Printer linter is a python package that does linting on Cura definitions files. +Running this on your definition files will get them ready for a pull request. + +## Running Locally +From the Cura root folder. + +```python3 printer-linter/src/terminal.py "flashforge_dreamer_nx.def.json" "flashforge_base.def.json" --fix --format``` + +## Developing + diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index f388dda4c5..d363dc3812 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -49,7 +49,11 @@ def formatFile(file: Path, settings) -> None: content = newline.sub(r"\1\2:\1{", content) if settings["format"].get("format-definition-single-value-single-line", True): - pass # TODO: format entries in the override section which only define a single value to be on one line + single_value_dict = re.compile(r"(:)(\s*\n?.*\{\s+)(\".*)(\d*\s*\})(\s*)(,?)") + content = single_value_dict.sub(r"\1 { \3 }\6", content) + + single_value_list = re.compile(r"(:)(\s*\n?.*\[\s+)(\".*)(\d*\s*\])(\s*)(,?)") + content = single_value_list.sub(r"\1 [ \3 ]\6", content) if settings["format"].get("format-definition-paired-coordinate-array", True): paired_coordinates = re.compile(r"(\[)\s+(-?\d*),\s*(-?\d*)\s*(\])") From f74a40bed0db2990f6a5f6ef8f3febc6fb724bf8 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 14:24:09 +0100 Subject: [PATCH 19/51] Flatten main logic. Parse files from directories to remove checking if a file is a directory in many places. --- printer-linter/src/terminal.py | 43 +++++++++++++++++----------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index d363dc3812..2fea211f1e 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -5,6 +5,7 @@ from argparse import ArgumentParser from collections import OrderedDict from os import getcwd from pathlib import Path +from typing import List import yaml @@ -74,6 +75,18 @@ def formatFile(file: Path, settings) -> None: config.write(f, space_around_delimiters=settings["format"].get("format-profile-space-around-delimiters", True)) +def extract_file_paths(paths: List[Path]) -> List[Path]: + """ Takes list of files and directories, returns the files as well as all files within directories as a List """ + file_paths = [] + for path in paths: + if path.is_dir(): + file_paths.extend(path.rglob("**/*")) + else: + file_paths.append(path) + + return file_paths + + def main() -> None: parser = ArgumentParser( description="UltiMaker Cura printer linting, static analysis and formatting of Cura printer definitions and other resources") @@ -85,7 +98,7 @@ def main() -> None: parser.add_argument("Files", metavar="F", type=Path, nargs="+", help="Files or directories to format") args = parser.parse_args() - files = args.Files + files = extract_file_paths(args.Files) setting_path = args.setting to_format = args.format to_fix = args.fix @@ -102,14 +115,11 @@ def main() -> None: with open(setting_path, "r") as f: settings = yaml.load(f, yaml.FullLoader) + full_body_check = {"Diagnostics": []} + if to_fix or to_diagnose: - full_body_check = {"Diagnostics": []} for file in files: - if file.is_dir(): - for fp in file.rglob("**/*"): - examineFile(fp, settings, full_body_check) - else: - examineFile(file, settings, full_body_check) + examineFile(file, settings, full_body_check) results = yaml.dump(full_body_check, default_flow_style=False, indent=4, width=240) if report: @@ -117,23 +127,14 @@ def main() -> None: else: print(results) - if to_fix: - for file in files: - if file.is_dir(): - for fp in file.rglob("**/*"): - if f"{file.as_posix()}" in full_body_check: - fixFile(fp, settings, full_body_check) - else: - if f"{file.as_posix()}" in full_body_check: - fixFile(file, settings, full_body_check) + if to_fix: + for file in files: + if f"{file.as_posix()}" in full_body_check: + fixFile(file, settings, full_body_check) if to_format: for file in files: - if file.is_dir(): - for fp in file.rglob("**/*"): - formatFile(fp, settings) - else: - formatFile(file, settings) + formatFile(file, settings) if __name__ == "__main__": From 4f4523c4b7189cd53d6d9c9facdb1e21c8157777 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 14:38:31 +0100 Subject: [PATCH 20/51] Use Diagnostic Generator super for Meshes --- printer-linter/src/printerlinter/linters/meshes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/printer-linter/src/printerlinter/linters/meshes.py b/printer-linter/src/printerlinter/linters/meshes.py index 0a8d0aa8a6..908f405072 100644 --- a/printer-linter/src/printerlinter/linters/meshes.py +++ b/printer-linter/src/printerlinter/linters/meshes.py @@ -1,9 +1,10 @@ from typing import Iterator from ..diagnostic import Diagnostic +from .diagnostic_generator import DiagnosticGenerator -class Meshes: +class Meshes(DiagnosticGenerator): def __init__(self, file, settings) -> None: super().__init__(file, settings) self._max_file_size = self._settings.get("diagnostic-mesh-file-size", 1e6) From 44af869a2cda08ee447e3e8babb1086dc481fd7c Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 14:59:53 +0100 Subject: [PATCH 21/51] Add documentation to diagnostic and reformat file. --- .../src/printerlinter/diagnostic.py | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/printer-linter/src/printerlinter/diagnostic.py b/printer-linter/src/printerlinter/diagnostic.py index a6843ed38f..a379ff6ba2 100644 --- a/printer-linter/src/printerlinter/diagnostic.py +++ b/printer-linter/src/printerlinter/diagnostic.py @@ -1,5 +1,20 @@ +from pathlib import Path +from typing import Optional, List + +from .replacement import Replacement + + class Diagnostic: - def __init__(self, file, diagnostic_name, message, level, offset, replacements=None) -> None: + def __init__(self, file: Path, diagnostic_name: str, message: str, level: str, offset: int, replacements: Optional[List[Replacement]] = None) -> None: + """ A diagnosis of an issue in "file" at "offset" in that file. May include suggested replacements. + + @param file: The path to the file this diagnostic is for. + @param diagnostic_name: The name of the diagnostic rule that spawned this result. A list can be found in .printer-linter. + @param message: A message explaining the issue with this piece of text. + @param level: How important this diagnostic is, ranges from Warning -> Error. + @param offset: The offset in file where the issue is. + @param replacements: A list of Replacement that contain replacement text. + """ self.file = file self.diagnostic_name = diagnostic_name self.message = message @@ -8,13 +23,12 @@ class Diagnostic: self.replacements = replacements def toDict(self) -> dict: - diagnostic_dict = {"DiagnosticName": self.diagnostic_name, - "DiagnosticMessage": { - "Message": self.message, - "FilePath": self.file.as_posix(), - "FileOffset": self.offset, - "Replacements": [] if self.replacements is None else [r.toDict() for r in self.replacements], - }, - "Level": self.level - } - return diagnostic_dict + return {"DiagnosticName": self.diagnostic_name, + "DiagnosticMessage": { + "Message": self.message, + "FilePath": self.file.as_posix(), + "FileOffset": self.offset, + "Replacements": [] if self.replacements is None else [r.toDict() for r in self.replacements], + }, + "Level": self.level + } From c097838614c2182c9f322256575246c87f479877 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 15:07:28 +0100 Subject: [PATCH 22/51] Add replacement documenation --- printer-linter/src/printerlinter/replacement.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/printer-linter/src/printerlinter/replacement.py b/printer-linter/src/printerlinter/replacement.py index bc6b58a97b..340365a5c3 100644 --- a/printer-linter/src/printerlinter/replacement.py +++ b/printer-linter/src/printerlinter/replacement.py @@ -1,5 +1,15 @@ +from pathlib import Path + + class Replacement: - def __init__(self, file, offset, length, replacement_text): + def __init__(self, file: Path, offset: int, length: int, replacement_text: str): + """ Replacement text for file between offset and offset+length. + + @param file: File to replace text in + @param offset: Offset in file to start text replace + @param length: Length of text that will be replaced. offset -> offset+length is the section of text to replace. + @param replacement_text: Text to insert of offset in file. + """ self.file = file self.offset = offset self.length = length From f49f8b3cb89245eaf96a266a5a237de57f5d0493 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 15:10:55 +0100 Subject: [PATCH 23/51] Add some documentation to factory and format file. --- printer-linter/src/printerlinter/factory.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/printer-linter/src/printerlinter/factory.py b/printer-linter/src/printerlinter/factory.py index 3e76456af9..c573507db9 100644 --- a/printer-linter/src/printerlinter/factory.py +++ b/printer-linter/src/printerlinter/factory.py @@ -1,3 +1,4 @@ +from pathlib import Path from typing import Optional from .linters.profile import Profile @@ -6,15 +7,17 @@ from .linters.diagnostic_generator import DiagnosticGenerator from .linters.meshes import Meshes -def create(file, settings) -> Optional[DiagnosticGenerator]: +def create(file: Path, settings) -> Optional[DiagnosticGenerator]: + """ Returns a DiagnosticGenerator depending on the file format """ if not file.exists(): return None - if ".inst" in file.suffixes and ".cfg" in file.suffixes: + elif ".inst" in file.suffixes and ".cfg" in file.suffixes: return Profile(file, settings) - if ".def" in file.suffixes and ".json" in file.suffixes: + elif ".def" in file.suffixes and ".json" in file.suffixes: if file.stem in ("fdmprinter.def", "fdmextruder.def"): return None return Definition(file, settings) - if file.parent.stem == "meshes": + elif file.parent.stem == "meshes": return Meshes(file, settings) - return None \ No newline at end of file + + return None From d19f1f3e42eccefd425b9354ec5211c72275d8c7 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 15:20:42 +0100 Subject: [PATCH 24/51] Add typing for file and settings. Add diagnostic generator documentation --- printer-linter/src/printerlinter/factory.py | 2 +- printer-linter/src/printerlinter/linters/defintion.py | 2 +- .../src/printerlinter/linters/diagnostic_generator.py | 8 +++++++- printer-linter/src/printerlinter/linters/meshes.py | 3 ++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/printer-linter/src/printerlinter/factory.py b/printer-linter/src/printerlinter/factory.py index c573507db9..24f1b504cf 100644 --- a/printer-linter/src/printerlinter/factory.py +++ b/printer-linter/src/printerlinter/factory.py @@ -7,7 +7,7 @@ from .linters.diagnostic_generator import DiagnosticGenerator from .linters.meshes import Meshes -def create(file: Path, settings) -> Optional[DiagnosticGenerator]: +def create(file: Path, settings: dict) -> Optional[DiagnosticGenerator]: """ Returns a DiagnosticGenerator depending on the file format """ if not file.exists(): return None diff --git a/printer-linter/src/printerlinter/linters/defintion.py b/printer-linter/src/printerlinter/linters/defintion.py index c5202f76eb..2f50f2542c 100644 --- a/printer-linter/src/printerlinter/linters/defintion.py +++ b/printer-linter/src/printerlinter/linters/defintion.py @@ -9,7 +9,7 @@ from ..replacement import Replacement class Definition(DiagnosticGenerator): - def __init__(self, file, settings) -> None: + def __init__(self, file: Path, settings: dict) -> None: super().__init__(file, settings) self._defs = {} self._getDefs(file) diff --git a/printer-linter/src/printerlinter/linters/diagnostic_generator.py b/printer-linter/src/printerlinter/linters/diagnostic_generator.py index 17fccd51f6..52f132a3c8 100644 --- a/printer-linter/src/printerlinter/linters/diagnostic_generator.py +++ b/printer-linter/src/printerlinter/linters/diagnostic_generator.py @@ -1,11 +1,17 @@ from abc import ABC, abstractmethod +from pathlib import Path from typing import Iterator from ..diagnostic import Diagnostic class DiagnosticGenerator(ABC): - def __init__(self, file, settings) -> None: + def __init__(self, file: Path, settings: dict) -> None: + """ Yields Diagnostics for file, these are suggested text replacements based on formatting rules in settings. + + @param file: A file to generate diagnostics for + @param settings: A list of settings containing rules for creating diagnostics + """ self._settings = settings self._file = file diff --git a/printer-linter/src/printerlinter/linters/meshes.py b/printer-linter/src/printerlinter/linters/meshes.py index 908f405072..c7ee058086 100644 --- a/printer-linter/src/printerlinter/linters/meshes.py +++ b/printer-linter/src/printerlinter/linters/meshes.py @@ -1,3 +1,4 @@ +from pathlib import Path from typing import Iterator from ..diagnostic import Diagnostic @@ -5,7 +6,7 @@ from .diagnostic_generator import DiagnosticGenerator class Meshes(DiagnosticGenerator): - def __init__(self, file, settings) -> None: + def __init__(self, file: Path, settings: dict) -> None: super().__init__(file, settings) self._max_file_size = self._settings.get("diagnostic-mesh-file-size", 1e6) From 0b2e4099293f715e18c8184749120f36aab27ea3 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 15:25:13 +0100 Subject: [PATCH 25/51] Update documentation on diagnostic to be less specifically about strings. Since diagnostics can be related to other issues. --- printer-linter/src/printerlinter/diagnostic.py | 2 +- .../src/printerlinter/linters/diagnostic_generator.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/printer-linter/src/printerlinter/diagnostic.py b/printer-linter/src/printerlinter/diagnostic.py index a379ff6ba2..d5eb237c29 100644 --- a/printer-linter/src/printerlinter/diagnostic.py +++ b/printer-linter/src/printerlinter/diagnostic.py @@ -10,7 +10,7 @@ class Diagnostic: @param file: The path to the file this diagnostic is for. @param diagnostic_name: The name of the diagnostic rule that spawned this result. A list can be found in .printer-linter. - @param message: A message explaining the issue with this piece of text. + @param message: A message explaining the issue with this file. @param level: How important this diagnostic is, ranges from Warning -> Error. @param offset: The offset in file where the issue is. @param replacements: A list of Replacement that contain replacement text. diff --git a/printer-linter/src/printerlinter/linters/diagnostic_generator.py b/printer-linter/src/printerlinter/linters/diagnostic_generator.py index 52f132a3c8..b259487828 100644 --- a/printer-linter/src/printerlinter/linters/diagnostic_generator.py +++ b/printer-linter/src/printerlinter/linters/diagnostic_generator.py @@ -7,7 +7,7 @@ from ..diagnostic import Diagnostic class DiagnosticGenerator(ABC): def __init__(self, file: Path, settings: dict) -> None: - """ Yields Diagnostics for file, these are suggested text replacements based on formatting rules in settings. + """ Yields Diagnostics for file, these are issues with the file such as bad text format or too large file size. @param file: A file to generate diagnostics for @param settings: A list of settings containing rules for creating diagnostics From 437b05f60834ca12f0dc4186f8ac412e1138959a Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 15:28:57 +0100 Subject: [PATCH 26/51] Add some doc strings --- printer-linter/src/printerlinter/linters/meshes.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/printer-linter/src/printerlinter/linters/meshes.py b/printer-linter/src/printerlinter/linters/meshes.py index c7ee058086..d31c54fdcd 100644 --- a/printer-linter/src/printerlinter/linters/meshes.py +++ b/printer-linter/src/printerlinter/linters/meshes.py @@ -7,6 +7,7 @@ from .diagnostic_generator import DiagnosticGenerator class Meshes(DiagnosticGenerator): def __init__(self, file: Path, settings: dict) -> None: + """ Finds issues in model files, such as incorrect file format or too large size """ super().__init__(file, settings) self._max_file_size = self._settings.get("diagnostic-mesh-file-size", 1e6) @@ -21,7 +22,8 @@ class Meshes(DiagnosticGenerator): yield - def checkFileFormat(self) -> None: + def checkFileFormat(self) -> Iterator[Diagnostic]: + """ Check if mesh is in supported format """ if self._file.suffix.lower() not in (".3mf", ".obj", ".stl"): yield Diagnostic( file = self._file, @@ -32,7 +34,8 @@ class Meshes(DiagnosticGenerator): ) yield - def checkFileSize(self): + def checkFileSize(self) -> Iterator[Diagnostic]: + """ Check if file is within size limits for Cura """ if self._file.stat().st_size > self._max_file_size: yield Diagnostic( file = self._file, From ad436f37f875f47fc80e87c811be829d1f154afc Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 16:48:39 +0100 Subject: [PATCH 27/51] Add some comments and refactoring --- .../src/printerlinter/linters/defintion.py | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/printer-linter/src/printerlinter/linters/defintion.py b/printer-linter/src/printerlinter/linters/defintion.py index 2f50f2542c..7e80bcdff1 100644 --- a/printer-linter/src/printerlinter/linters/defintion.py +++ b/printer-linter/src/printerlinter/linters/defintion.py @@ -9,17 +9,13 @@ from ..replacement import Replacement class Definition(DiagnosticGenerator): + """ Finds issues in definition files, such as overriding default parameters """ def __init__(self, file: Path, settings: dict) -> None: super().__init__(file, settings) - self._defs = {} - self._getDefs(file) - + self._definitions = {} + self._loadDefinitionFiles(file) self._content = self._file.read_text() - - settings = {} - for k, v in self._defs["fdmprinter"]["settings"].items(): - self._getSetting(k, v, settings) - self._defs["fdmprinter"] = {"overrides": settings} + self._loadBasePrinterSettings() def check(self) -> Iterator[Diagnostic]: if self._settings["checks"].get("diagnostic-definition-redundant-override", False): @@ -33,9 +29,10 @@ class Definition(DiagnosticGenerator): yield - def checkRedefineOverride(self) -> None: - definition_name = list(self._defs.keys())[0] - definition = self._defs[definition_name] + def checkRedefineOverride(self) -> Iterator[Diagnostic]: + """ Checks if definition file overrides its parents settings with the same value. """ + definition_name = list(self._definitions.keys())[0] + definition = self._definitions[definition_name] if "overrides" in definition and definition_name != "fdmprinter": for key, value_dict in definition["overrides"].items(): is_redefined, value, parent = self._isDefinedInParent(key, value_dict, definition['inherits']) @@ -55,30 +52,27 @@ class Definition(DiagnosticGenerator): replacement_text = "")] ) - def checkValueOutOfBounds(self) -> None: - pass + def _loadDefinitionFiles(self, definition_file) -> None: + """ Loads definition file contents into self._definitions. Also load parent definition if it exists. """ + definition_name = Path(definition_file.stem).stem - def _getSetting(self, name, setting, settings) -> None: - if "children" in setting: - for childname, child in setting["children"].items(): - self._getSetting(childname, child, settings) - settings |= {name: setting} - - def _getDefs(self, file) -> None: - """ Loads up file, and it's parent definitions into self._defs """ - if not file.exists() or Path(file.stem).stem in self._defs: + if not definition_file.exists() or definition_name in self._definitions: return - self._defs[Path(file.stem).stem] = json.loads(file.read_text()) - if "inherits" in self._defs[Path(file.stem).stem]: - parent_file = file.parent.joinpath(f"{self._defs[Path(file.stem).stem]['inherits']}.def.json") - self._getDefs(parent_file) + + # Load definition file into dictionary + self._definitions[definition_name] = json.loads(definition_file.read_text()) + + # Load parent definition if it exists + if "inherits" in self._definitions[definition_name]: + parent_file = definition_file.parent.joinpath(f"{self._definitions[definition_name]['inherits']}.def.json") + self._loadDefinitionFiles(parent_file) def _isDefinedInParent(self, key, value_dict, inherits_from): - if "overrides" not in self._defs[inherits_from]: - return self._isDefinedInParent(key, value_dict, self._defs[inherits_from]["inherits"]) + if "overrides" not in self._definitions[inherits_from]: + return self._isDefinedInParent(key, value_dict, self._definitions[inherits_from]["inherits"]) - parent = self._defs[inherits_from]["overrides"] - is_number = self._defs["fdmprinter"]["overrides"][key] in ("float", "int") + parent = self._definitions[inherits_from]["overrides"] + is_number = self._definitions["fdmprinter"]["overrides"][key] in ("float", "int") for value in value_dict.values(): if key in parent: check_values = [cv for cv in [parent[key].get("default_value", None), parent[key].get("value", None)] if cv is not None] @@ -101,3 +95,16 @@ class Definition(DiagnosticGenerator): if "inherits" in parent: return self._isDefinedInParent(key, value_dict, parent["inherits"]) return False, None, None + + def _loadBasePrinterSettings(self): + """ TODO @Jelle please explain why this """ + settings = {} + for k, v in self._definitions["fdmprinter"]["settings"].items(): + self._getSetting(k, v, settings) + self._definitions["fdmprinter"] = {"overrides": settings} + + def _getSetting(self, name, setting, settings) -> None: + if "children" in setting: + for childname, child in setting["children"].items(): + self._getSetting(childname, child, settings) + settings |= {name: setting} From b6ac85d251de4d86940943a8c580bddf974102c0 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 17:19:14 +0100 Subject: [PATCH 28/51] Add separate package with file formatters. --- .../src/printerlinter/formatters/__init__.py | 4 +++ .../formatters/def_json_formatter.py | 29 +++++++++++++++++++ .../src/printerlinter/formatters/formatter.py | 16 ++++++++++ .../formatters/inst_cfg_formatter.py | 21 ++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 printer-linter/src/printerlinter/formatters/__init__.py create mode 100644 printer-linter/src/printerlinter/formatters/def_json_formatter.py create mode 100644 printer-linter/src/printerlinter/formatters/formatter.py create mode 100644 printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py diff --git a/printer-linter/src/printerlinter/formatters/__init__.py b/printer-linter/src/printerlinter/formatters/__init__.py new file mode 100644 index 0000000000..8f5a01bb25 --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/__init__.py @@ -0,0 +1,4 @@ +from def_json_formatter import DefJsonFormatter +from inst_cfg_formatter import InstCfgFormatter + +__all__ = ["DefJsonFormatter", "InstCfgFormatter"] \ No newline at end of file diff --git a/printer-linter/src/printerlinter/formatters/def_json_formatter.py b/printer-linter/src/printerlinter/formatters/def_json_formatter.py new file mode 100644 index 0000000000..ddeccacffd --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/def_json_formatter.py @@ -0,0 +1,29 @@ +import json +import re +from pathlib import Path + +from .formatter import FileFormatter + +class DefJsonFormatter(FileFormatter): + def format(self, file: Path): + """ Format .def.json files according to the rules in settings """ + definition = json.loads(file.read_text()) + content = json.dumps(definition, indent=self._settings["format"].get("format-definition-indent", 4), + sort_keys=self._settings["format"].get("format-definition-sort-keys", True)) + + if self._settings["format"].get("format-definition-bracket-newline", True): + newline = re.compile(r"(\B\s+)(\"[\w\"]+)(\:\s\{)") + content = newline.sub(r"\1\2:\1{", content) + + if self._settings["format"].get("format-definition-single-value-single-line", True): + single_value_dict = re.compile(r"(:)(\s*\n?.*\{\s+)(\".*)(\d*\s*\})(\s*)(,?)") + content = single_value_dict.sub(r"\1 { \3 }\6", content) + + single_value_list = re.compile(r"(:)(\s*\n?.*\[\s+)(\".*)(\d*\s*\])(\s*)(,?)") + content = single_value_list.sub(r"\1 [ \3 ]\6", content) + + if self._settings["format"].get("format-definition-paired-coordinate-array", True): + paired_coordinates = re.compile(r"(\[)\s+(-?\d*),\s*(-?\d*)\s*(\])") + content = paired_coordinates.sub(r"\1 \2, \3 \4", content) + + file.write_text(content) \ No newline at end of file diff --git a/printer-linter/src/printerlinter/formatters/formatter.py b/printer-linter/src/printerlinter/formatters/formatter.py new file mode 100644 index 0000000000..1425825a82 --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/formatter.py @@ -0,0 +1,16 @@ +from abc import ABC, abstractmethod +from pathlib import Path + + +class FileFormatter(ABC): + def __init__(self, settings: dict) -> None: + """ Yields Diagnostics for file, these are issues with the file such as bad text format or too large file size. + + @param file: A file to generate diagnostics for + @param settings: A list of settings containing rules for creating diagnostics + """ + self._settings = settings + + @abstractmethod + def format(self, file: Path) -> None: + pass \ No newline at end of file diff --git a/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py b/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py new file mode 100644 index 0000000000..fc6ccf3c81 --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py @@ -0,0 +1,21 @@ +import configparser +import json +import re +from collections import OrderedDict +from pathlib import Path + +from .formatter import FileFormatter + +class InstCfgFormatter(FileFormatter): + def format(self, file: Path): + """ Format .inst.cfg files according to the rules in settings """ + config = configparser.ConfigParser() + config.read(file) + + if self._settings["format"].get("format-profile-sort-keys", True): + for section in config._sections: + config._sections[section] = OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0])) + config._sections = OrderedDict(sorted(config._sections.items(), key=lambda t: t[0])) + + with open(file, "w") as f: + config.write(f, space_around_delimiters=self._settings["format"].get("format-profile-space-around-delimiters", True)) \ No newline at end of file From a7800f824a7cebab14533e76f6d96bbe6b3540b6 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 17:20:22 +0100 Subject: [PATCH 29/51] Use formatters in terminal.py Do some general refactoring for readability --- .../src/printerlinter/formatters/__init__.py | 4 +- printer-linter/src/terminal.py | 143 ++++++++---------- 2 files changed, 62 insertions(+), 85 deletions(-) diff --git a/printer-linter/src/printerlinter/formatters/__init__.py b/printer-linter/src/printerlinter/formatters/__init__.py index 8f5a01bb25..00d9c7eef3 100644 --- a/printer-linter/src/printerlinter/formatters/__init__.py +++ b/printer-linter/src/printerlinter/formatters/__init__.py @@ -1,4 +1,4 @@ -from def_json_formatter import DefJsonFormatter -from inst_cfg_formatter import InstCfgFormatter +from .def_json_formatter import DefJsonFormatter +from .inst_cfg_formatter import InstCfgFormatter __all__ = ["DefJsonFormatter", "InstCfgFormatter"] \ No newline at end of file diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index 2fea211f1e..212de624a6 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -1,8 +1,4 @@ -import configparser -import json -import re from argparse import ArgumentParser -from collections import OrderedDict from os import getcwd from pathlib import Path from typing import List @@ -10,81 +6,9 @@ from typing import List import yaml from printerlinter import factory - - -def examineFile(file, settings, full_body_check) -> None: - patient = factory.create(file, settings) - if patient is None: - return - - for diagnostic in patient.check(): - if diagnostic: - full_body_check["Diagnostics"].append(diagnostic.toDict()) - - -def fixFile(file, settings, full_body_check) -> None: - if not file.exists(): - return - ext = ".".join(file.name.split(".")[-2:]) - - if ext == "def.json": - issues = full_body_check[f"{file.as_posix()}"] - for issue in issues: - if issue["diagnostic"] == "diagnostic-definition-redundant-override" and settings["fixes"].get( - "diagnostic-definition-redundant-override", True): - pass - - -def formatFile(file: Path, settings) -> None: - if not file.exists(): - return - ext = ".".join(file.name.split(".")[-2:]) - - if ext == "def.json": - definition = json.loads(file.read_text()) - content = json.dumps(definition, indent=settings["format"].get("format-definition-indent", 4), - sort_keys=settings["format"].get("format-definition-sort-keys", True)) - - if settings["format"].get("format-definition-bracket-newline", True): - newline = re.compile(r"(\B\s+)(\"[\w\"]+)(\:\s\{)") - content = newline.sub(r"\1\2:\1{", content) - - if settings["format"].get("format-definition-single-value-single-line", True): - single_value_dict = re.compile(r"(:)(\s*\n?.*\{\s+)(\".*)(\d*\s*\})(\s*)(,?)") - content = single_value_dict.sub(r"\1 { \3 }\6", content) - - single_value_list = re.compile(r"(:)(\s*\n?.*\[\s+)(\".*)(\d*\s*\])(\s*)(,?)") - content = single_value_list.sub(r"\1 [ \3 ]\6", content) - - if settings["format"].get("format-definition-paired-coordinate-array", True): - paired_coordinates = re.compile(r"(\[)\s+(-?\d*),\s*(-?\d*)\s*(\])") - content = paired_coordinates.sub(r"\1 \2, \3 \4", content) - - file.write_text(content) - - if ext == "inst.cfg": - config = configparser.ConfigParser() - config.read(file) - - if settings["format"].get("format-profile-sort-keys", True): - for section in config._sections: - config._sections[section] = OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0])) - config._sections = OrderedDict(sorted(config._sections.items(), key=lambda t: t[0])) - - with open(file, "w") as f: - config.write(f, space_around_delimiters=settings["format"].get("format-profile-space-around-delimiters", True)) - - -def extract_file_paths(paths: List[Path]) -> List[Path]: - """ Takes list of files and directories, returns the files as well as all files within directories as a List """ - file_paths = [] - for path in paths: - if path.is_dir(): - file_paths.extend(path.rglob("**/*")) - else: - file_paths.append(path) - - return file_paths +from printerlinter.diagnostic import Diagnostic +from printerlinter.formatters.def_json_formatter import DefJsonFormatter +from printerlinter.formatters.inst_cfg_formatter import InstCfgFormatter def main() -> None: @@ -98,7 +22,7 @@ def main() -> None: parser.add_argument("Files", metavar="F", type=Path, nargs="+", help="Files or directories to format") args = parser.parse_args() - files = extract_file_paths(args.Files) + files = extractFilePaths(args.Files) setting_path = args.setting to_format = args.format to_fix = args.fix @@ -119,9 +43,11 @@ def main() -> None: if to_fix or to_diagnose: for file in files: - examineFile(file, settings, full_body_check) + diagnostics = diagnoseIssuesWithFile(file, settings) + full_body_check["Diagnostics"].extend([d.toDict() for d in diagnostics]) results = yaml.dump(full_body_check, default_flow_style=False, indent=4, width=240) + if report: report.write_text(results) else: @@ -130,11 +56,62 @@ def main() -> None: if to_fix: for file in files: if f"{file.as_posix()}" in full_body_check: - fixFile(file, settings, full_body_check) + applyFixesToFile(file, settings, full_body_check) if to_format: for file in files: - formatFile(file, settings) + applyFormattingToFile(file, settings) + + +def diagnoseIssuesWithFile(file: Path, settings: dict) -> List[Diagnostic]: + """ For file, runs all diagnostic checks in settings and returns a list of diagnostics """ + # Find correct diagnostic generator for file + diagnostic_generator = factory.create(file, settings) + + if not diagnostic_generator: + return [] + + return list(filter(lambda d: d, diagnostic_generator.check())) + + +def applyFixesToFile(file, settings, full_body_check) -> None: + if not file.exists(): + return + ext = ".".join(file.name.split(".")[-2:]) + + if ext == "def.json": + issues = full_body_check[f"{file.as_posix()}"] + for issue in issues: + if issue["diagnostic"] == "diagnostic-definition-redundant-override" and settings["fixes"].get( + "diagnostic-definition-redundant-override", True): + pass + + +def applyFormattingToFile(file: Path, settings) -> None: + if not file.exists(): + return + + ext = ".".join(file.name.split(".")[-2:]) + + if ext == "def.json": + formatter = DefJsonFormatter(settings) + formatter.format(file) + + if ext == "inst.cfg": + formatter = InstCfgFormatter(settings) + formatter.format(file) + + +def extractFilePaths(paths: List[Path]) -> List[Path]: + """ Takes list of files and directories, returns the files as well as all files within directories as a List """ + file_paths = [] + for path in paths: + if path.is_dir(): + file_paths.extend(path.rglob("**/*")) + else: + file_paths.append(path) + + return file_paths if __name__ == "__main__": From 8e027c4af9bddad5b7ce0b8664cf5d2522a8cffc Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 17:21:31 +0100 Subject: [PATCH 30/51] Add is not None because it makes it clearer that the lamdba returns a boolean. --- printer-linter/src/terminal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index 212de624a6..68be569351 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -71,7 +71,7 @@ def diagnoseIssuesWithFile(file: Path, settings: dict) -> List[Diagnostic]: if not diagnostic_generator: return [] - return list(filter(lambda d: d, diagnostic_generator.check())) + return list(filter(lambda d: d is not None, diagnostic_generator.check())) def applyFixesToFile(file, settings, full_body_check) -> None: From e83ed933e28394dd6c11d046e9bc9adfe3bee123 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Wed, 23 Nov 2022 17:52:33 +0100 Subject: [PATCH 31/51] Update readme with instruction for developing. Change DiagnosticGenerator -> Linter since this is much easier to understand. --- printer-linter/README.md | 22 +++++++++++++++++++ printer-linter/src/printerlinter/__init__.py | 4 ++-- printer-linter/src/printerlinter/factory.py | 6 ++--- .../src/printerlinter/linters/__init__.py | 4 ++-- .../src/printerlinter/linters/defintion.py | 4 ++-- .../{diagnostic_generator.py => linter.py} | 2 +- .../src/printerlinter/linters/meshes.py | 4 ++-- .../src/printerlinter/linters/profile.py | 4 ++-- .../src/printerlinter/replacement.py | 1 - printer-linter/src/terminal.py | 7 +++--- 10 files changed, 39 insertions(+), 19 deletions(-) rename printer-linter/src/printerlinter/linters/{diagnostic_generator.py => linter.py} (94%) diff --git a/printer-linter/README.md b/printer-linter/README.md index 64246e5440..fc6a9a8e29 100644 --- a/printer-linter/README.md +++ b/printer-linter/README.md @@ -8,4 +8,26 @@ From the Cura root folder. ```python3 printer-linter/src/terminal.py "flashforge_dreamer_nx.def.json" "flashforge_base.def.json" --fix --format``` ## Developing +### Printer Linter Rules +Inside ```.printer-linter``` you can find a list of rules. These are seperated into roughly three categories. + +1. Checks + 1. These rules are about checking if a file meets some requirements that can't be fixed by replacing its content. + 2. An example of a check is ```diagnostic-mesh-file-extension``` this checks if a mesh file extension is acceptable. +2. Format + 1. These rules are purely about how a file is structured, not content. + 2. An example of a format rule is ```format-definition-bracket-newline``` This rule says that when assigning a dict value the bracket should go on a new line. +3. Fixes + 1. These are about the content of the file. + 2. An example of a fix is ```diagnostic-definition-redundant-override``` This removes settings that have already been defined by a parent definition + +### Linters +Linters find issues within a file. There are separate linters for each type of file. The linter that is used is decided by the create function in factory.py. All linters implement the abstract class Linter. + +A Linter class returns an iterator of Diagnostics, each diagnostic is an issue with the file. The diagnostics can also contain suggested fixes. + +### Formatters +Formatters load a file reformat it and write it to disk. There are separate formatters for each file type. All formatters implement the abstract class Formatter. + +Formatters should format based on the Format rules in .printer-linter diff --git a/printer-linter/src/printerlinter/__init__.py b/printer-linter/src/printerlinter/__init__.py index a157443ff5..3ec571c3c6 100644 --- a/printer-linter/src/printerlinter/__init__.py +++ b/printer-linter/src/printerlinter/__init__.py @@ -1,4 +1,4 @@ from .diagnostic import Diagnostic -from .factory import create +from .factory import getLinter -__all__ = ["Diagnostic", "create"] +__all__ = ["Diagnostic", "getLinter"] diff --git a/printer-linter/src/printerlinter/factory.py b/printer-linter/src/printerlinter/factory.py index 24f1b504cf..7cff08df2c 100644 --- a/printer-linter/src/printerlinter/factory.py +++ b/printer-linter/src/printerlinter/factory.py @@ -3,12 +3,12 @@ from typing import Optional from .linters.profile import Profile from .linters.defintion import Definition -from .linters.diagnostic_generator import DiagnosticGenerator +from .linters.linter import Linter from .linters.meshes import Meshes -def create(file: Path, settings: dict) -> Optional[DiagnosticGenerator]: - """ Returns a DiagnosticGenerator depending on the file format """ +def getLinter(file: Path, settings: dict) -> Optional[Linter]: + """ Returns a Linter depending on the file format """ if not file.exists(): return None elif ".inst" in file.suffixes and ".cfg" in file.suffixes: diff --git a/printer-linter/src/printerlinter/linters/__init__.py b/printer-linter/src/printerlinter/linters/__init__.py index bf16caa933..a4a48acb3d 100644 --- a/printer-linter/src/printerlinter/linters/__init__.py +++ b/printer-linter/src/printerlinter/linters/__init__.py @@ -1,6 +1,6 @@ from .profile import Profile from .meshes import Meshes -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter from .defintion import Definition -__all__ = ["Profile", "Meshes", "DiagnosticGenerator", "Definition"] \ No newline at end of file +__all__ = ["Profile", "Meshes", "Linter", "Definition"] \ No newline at end of file diff --git a/printer-linter/src/printerlinter/linters/defintion.py b/printer-linter/src/printerlinter/linters/defintion.py index 7e80bcdff1..909265e829 100644 --- a/printer-linter/src/printerlinter/linters/defintion.py +++ b/printer-linter/src/printerlinter/linters/defintion.py @@ -4,11 +4,11 @@ from pathlib import Path from typing import Iterator from ..diagnostic import Diagnostic -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter from ..replacement import Replacement -class Definition(DiagnosticGenerator): +class Definition(Linter): """ Finds issues in definition files, such as overriding default parameters """ def __init__(self, file: Path, settings: dict) -> None: super().__init__(file, settings) diff --git a/printer-linter/src/printerlinter/linters/diagnostic_generator.py b/printer-linter/src/printerlinter/linters/linter.py similarity index 94% rename from printer-linter/src/printerlinter/linters/diagnostic_generator.py rename to printer-linter/src/printerlinter/linters/linter.py index b259487828..fbcd91196d 100644 --- a/printer-linter/src/printerlinter/linters/diagnostic_generator.py +++ b/printer-linter/src/printerlinter/linters/linter.py @@ -5,7 +5,7 @@ from typing import Iterator from ..diagnostic import Diagnostic -class DiagnosticGenerator(ABC): +class Linter(ABC): def __init__(self, file: Path, settings: dict) -> None: """ Yields Diagnostics for file, these are issues with the file such as bad text format or too large file size. diff --git a/printer-linter/src/printerlinter/linters/meshes.py b/printer-linter/src/printerlinter/linters/meshes.py index d31c54fdcd..d49caf7dc9 100644 --- a/printer-linter/src/printerlinter/linters/meshes.py +++ b/printer-linter/src/printerlinter/linters/meshes.py @@ -2,10 +2,10 @@ from pathlib import Path from typing import Iterator from ..diagnostic import Diagnostic -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter -class Meshes(DiagnosticGenerator): +class Meshes(Linter): def __init__(self, file: Path, settings: dict) -> None: """ Finds issues in model files, such as incorrect file format or too large size """ super().__init__(file, settings) diff --git a/printer-linter/src/printerlinter/linters/profile.py b/printer-linter/src/printerlinter/linters/profile.py index ac48084943..85cc2d9f0b 100644 --- a/printer-linter/src/printerlinter/linters/profile.py +++ b/printer-linter/src/printerlinter/linters/profile.py @@ -1,9 +1,9 @@ from typing import Iterator from ..diagnostic import Diagnostic -from .diagnostic_generator import DiagnosticGenerator +from .linter import Linter -class Profile(DiagnosticGenerator): +class Profile(Linter): def check(self) -> Iterator[Diagnostic]: yield diff --git a/printer-linter/src/printerlinter/replacement.py b/printer-linter/src/printerlinter/replacement.py index 340365a5c3..b9f390107d 100644 --- a/printer-linter/src/printerlinter/replacement.py +++ b/printer-linter/src/printerlinter/replacement.py @@ -1,6 +1,5 @@ from pathlib import Path - class Replacement: def __init__(self, file: Path, offset: int, length: int, replacement_text: str): """ Replacement text for file between offset and offset+length. diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index 68be569351..3591d841a4 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -65,13 +65,12 @@ def main() -> None: def diagnoseIssuesWithFile(file: Path, settings: dict) -> List[Diagnostic]: """ For file, runs all diagnostic checks in settings and returns a list of diagnostics """ - # Find correct diagnostic generator for file - diagnostic_generator = factory.create(file, settings) + linter = factory.getLinter(file, settings) - if not diagnostic_generator: + if not linter: return [] - return list(filter(lambda d: d is not None, diagnostic_generator.check())) + return list(filter(lambda d: d is not None, linter.check())) def applyFixesToFile(file, settings, full_body_check) -> None: From 7e84082aff26195d82b8d3c9239dee863949c099 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Nov 2022 13:55:31 +0100 Subject: [PATCH 32/51] Add quality type to ufp files Cura-9773 --- cura/Settings/MachineManager.py | 17 ++++++++++++----- plugins/UFPWriter/UFPWriter.py | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 27d8fbbc78..b5d43ba8a1 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1764,14 +1764,21 @@ class MachineManager(QObject): global_stack = self._application.getGlobalContainerStack() return global_stack is None or global_stack.qualityChanges != empty_quality_changes_container - @pyqtProperty(str, notify = activeQualityGroupChanged) - def activeQualityOrQualityChangesName(self) -> str: + def activeQualityOrQualityChanges(self) -> GlobalStack: global_container_stack = self._application.getGlobalContainerStack() if not global_container_stack: - return empty_quality_container.getName() + return empty_quality_container if global_container_stack.qualityChanges != empty_quality_changes_container: - return global_container_stack.qualityChanges.getName() - return global_container_stack.quality.getName() + return global_container_stack.qualityChanges + return global_container_stack.quality + + @pyqtProperty(str, notify = activeQualityGroupChanged) + def activeQualityOrQualityChangesName(self) -> str: + return self.activeQualityOrQualityChanges().getName() + + @pyqtProperty(str, notify = activeQualityGroupChanged) + def activeQualityOrQualityChangesId(self) -> str: + return self.activeQualityOrQualityChanges().getId() @pyqtProperty(bool, notify = activeQualityGroupChanged) def hasNotSupportedQuality(self) -> bool: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d7671d02c8..f328bb2b11 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,6 +227,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, + "quality_type": machine_manager.activeQualityOrQualityChangesId, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 6dc0a24311599bc327d8e75b1604d3a04a5046c2 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 24 Nov 2022 15:33:39 +0100 Subject: [PATCH 33/51] Cache and genericize ID to Product table. part of CURA-9931 --- .../XmlMaterialProfile/XmlMaterialProfile.py | 13 ++++++++++--- plugins/XmlMaterialProfile/product_to_id.json | 17 +++++++---------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 527fa4ec13..524b7f099c 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -1125,21 +1125,28 @@ class XmlMaterialProfile(InstanceContainer): id_list = list(id_list) return id_list + __product_to_id_map: Optional[Dict[str, List[str]]] = None + @classmethod def getProductIdMap(cls) -> Dict[str, List[str]]: """Gets a mapping from product names in the XML files to their definition IDs. This loads the mapping from a file. """ + if cls.__product_to_id_map is not None: + return cls.__product_to_id_map plugin_path = cast(str, PluginRegistry.getInstance().getPluginPath("XmlMaterialProfile")) product_to_id_file = os.path.join(plugin_path, "product_to_id.json") with open(product_to_id_file, encoding = "utf-8") as f: - product_to_id_map = json.load(f) - product_to_id_map = {key: [value] for key, value in product_to_id_map.items()} + contents = "" + for line in f: + contents += line if "#" not in line else "".join([line.replace("#", str(n)) for n in range(1, 12)]) + cls.__product_to_id_map = json.loads(contents) + cls.__product_to_id_map = {key: [value] for key, value in cls.__product_to_id_map.items()} #This also loads "Ultimaker S5" -> "ultimaker_s5" even though that is not strictly necessary with the default to change spaces into underscores. #However it is not always loaded with that default; this mapping is also used in serialize() without that default. - return product_to_id_map + return cls.__product_to_id_map @staticmethod def _parseCompatibleValue(value: str): diff --git a/plugins/XmlMaterialProfile/product_to_id.json b/plugins/XmlMaterialProfile/product_to_id.json index 053c8d13f5..07e14f1276 100644 --- a/plugins/XmlMaterialProfile/product_to_id.json +++ b/plugins/XmlMaterialProfile/product_to_id.json @@ -1,14 +1,11 @@ { - "Ultimaker 2": "ultimaker2", - "Ultimaker 2 Extended": "ultimaker2_extended", - "Ultimaker 2 Extended+": "ultimaker2_extended_plus", - "Ultimaker 2 Go": "ultimaker2_go", - "Ultimaker 2+": "ultimaker2_plus", - "Ultimaker 2+ Connect": "ultimaker2_plus_connect", - "Ultimaker 3": "ultimaker3", - "Ultimaker 3 Extended": "ultimaker3_extended", - "Ultimaker S3": "ultimaker_s3", - "Ultimaker S5": "ultimaker_s5", + "Ultimaker #": "ultimaker#", + "Ultimaker # Extended": "ultimaker#_extended", + "Ultimaker # Extended+": "ultimaker#_extended_plus", + "Ultimaker # Go": "ultimaker#_go", + "Ultimaker #+": "ultimaker#_plus", + "Ultimaker #+ Connect": "ultimaker#_plus_connect", + "Ultimaker S#": "ultimaker_s#", "Ultimaker Original": "ultimaker_original", "Ultimaker Original+": "ultimaker_original_plus", "Ultimaker Original Dual Extrusion": "ultimaker_original_dual", From e8f6786e972898ed715ce63015c91bf86faafd94 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Nov 2022 22:56:35 +0100 Subject: [PATCH 34/51] Revert "Add quality type to ufp files" This reverts commit 7e84082aff26195d82b8d3c9239dee863949c099. --- cura/Settings/MachineManager.py | 19 ++++++------------- plugins/UFPWriter/UFPWriter.py | 1 - 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index b5d43ba8a1..27d8fbbc78 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1764,21 +1764,14 @@ class MachineManager(QObject): global_stack = self._application.getGlobalContainerStack() return global_stack is None or global_stack.qualityChanges != empty_quality_changes_container - def activeQualityOrQualityChanges(self) -> GlobalStack: - global_container_stack = self._application.getGlobalContainerStack() - if not global_container_stack: - return empty_quality_container - if global_container_stack.qualityChanges != empty_quality_changes_container: - return global_container_stack.qualityChanges - return global_container_stack.quality - @pyqtProperty(str, notify = activeQualityGroupChanged) def activeQualityOrQualityChangesName(self) -> str: - return self.activeQualityOrQualityChanges().getName() - - @pyqtProperty(str, notify = activeQualityGroupChanged) - def activeQualityOrQualityChangesId(self) -> str: - return self.activeQualityOrQualityChanges().getId() + global_container_stack = self._application.getGlobalContainerStack() + if not global_container_stack: + return empty_quality_container.getName() + if global_container_stack.qualityChanges != empty_quality_changes_container: + return global_container_stack.qualityChanges.getName() + return global_container_stack.quality.getName() @pyqtProperty(bool, notify = activeQualityGroupChanged) def hasNotSupportedQuality(self) -> bool: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index f328bb2b11..d7671d02c8 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,7 +227,6 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, - "quality_type": machine_manager.activeQualityOrQualityChangesId, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From c2ad41e10eff1caa3bc2b17daa438cb1202ddf81 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Nov 2022 23:02:13 +0100 Subject: [PATCH 35/51] Add quality type to ufp files Cura-9773 --- plugins/UFPWriter/UFPWriter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d7671d02c8..3693352c1d 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,6 +227,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, + "quality_display_name": machine_manager.activeQualityDisplayNameMap, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 86ac4c4ab841c50222f339c3b293ecb810276a05 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Fri, 25 Nov 2022 14:09:12 +0100 Subject: [PATCH 36/51] Fix regex for list/dict match last item in list without comma at end. Add some custom ordering to the json. This is so that important values like "version" don't get pushed to the end of the json. --- .../formatters/def_json_formatter.py | 73 ++++++++++++++++--- 1 file changed, 64 insertions(+), 9 deletions(-) diff --git a/printer-linter/src/printerlinter/formatters/def_json_formatter.py b/printer-linter/src/printerlinter/formatters/def_json_formatter.py index ddeccacffd..c74f077249 100644 --- a/printer-linter/src/printerlinter/formatters/def_json_formatter.py +++ b/printer-linter/src/printerlinter/formatters/def_json_formatter.py @@ -1,29 +1,84 @@ import json import re +from collections import OrderedDict from pathlib import Path +from typing import Dict from .formatter import FileFormatter + +# Dictionary items with matching keys will be sorted as if they were the value +# Example: "version" will be sorted as if it was "0" +TOP_LEVEL_SORT_PRIORITY = { + "version": "0", + "name": "1", + "inherits": "3" +} + +METADATA_SORT_PRIORITY = { + "visible": "0", + "author": "1", + "manufacturer": "2", + "file_formats": "3", + "platform" : "4" +} + + class DefJsonFormatter(FileFormatter): def format(self, file: Path): - """ Format .def.json files according to the rules in settings """ - definition = json.loads(file.read_text()) - content = json.dumps(definition, indent=self._settings["format"].get("format-definition-indent", 4), - sort_keys=self._settings["format"].get("format-definition-sort-keys", True)) + """ Format .def.json files according to the rules in settings. + + You can assume that you will be running regex on standard formatted json files, because we load the json first and then + dump it to a string. This means you only have to write regex that works on the output of json.dump() + """ + + definition = json.loads(file.read_text(), object_pairs_hook=OrderedDict) + + if self._settings["format"].get("format-definition-sort-keys", True): + definition = self.order_keys(definition) + + content = json.dumps(definition, indent=self._settings["format"].get("format-definition-indent", 4)) if self._settings["format"].get("format-definition-bracket-newline", True): newline = re.compile(r"(\B\s+)(\"[\w\"]+)(\:\s\{)") content = newline.sub(r"\1\2:\1{", content) if self._settings["format"].get("format-definition-single-value-single-line", True): - single_value_dict = re.compile(r"(:)(\s*\n?.*\{\s+)(\".*)(\d*\s*\})(\s*)(,?)") - content = single_value_dict.sub(r"\1 { \3 }\6", content) + single_value_dict = re.compile(r"(:)(\s*\n?.*\{\s+)(\".*)(\d*\s*\})(.*\n,?)") + content = single_value_dict.sub(r"\1 { \3 }\5", content) - single_value_list = re.compile(r"(:)(\s*\n?.*\[\s+)(\".*)(\d*\s*\])(\s*)(,?)") - content = single_value_list.sub(r"\1 [ \3 ]\6", content) + single_value_list = re.compile(r"(:)(\s*\n?.*\[\s+)(\".*)(\d*\s*\])(.*\n,?)") + content = single_value_list.sub(r"\1 [ \3 ]\5", content) if self._settings["format"].get("format-definition-paired-coordinate-array", True): paired_coordinates = re.compile(r"(\[)\s+(-?\d*),\s*(-?\d*)\s*(\])") content = paired_coordinates.sub(r"\1 \2, \3 \4", content) - file.write_text(content) \ No newline at end of file + file.write_text(content) + + def order_keys(self, json_content: OrderedDict) -> OrderedDict: + """ Orders json keys lexicographically """ + # First order all keys (Recursive) lexicographically + json_content_text = json.dumps(json_content, sort_keys=True) + json_content = json.loads(json_content_text, object_pairs_hook=OrderedDict) + + # Do a custom ordered sort on the top level items in the json. This is so that keys like "version" appear at the top. + json_content = self.custom_sort_keys(json_content, TOP_LEVEL_SORT_PRIORITY) + + # Do a custom ordered sort on collections that are one level deep into the json + if "metadata" in json_content.keys(): + json_content["metadata"] = self.custom_sort_keys(json_content["metadata"], METADATA_SORT_PRIORITY) + + return json_content + + + def custom_sort_keys(self, ordered_dictionary: OrderedDict, sort_priority: Dict[str, str]) -> OrderedDict: + """ Orders keys in dictionary lexicographically, except for keys with matching strings in sort_priority. + + Keys in ordered_dictionary that match keys in sort_priority will sort based on the value in sort_priority. + + @param ordered_dictionary: A dictionary that will have it's top level keys sorted + @param sort_priority: A mapping from string keys to alternative strings to be used instead when sorting. + @return: A dictionary sorted by it's top level keys + """ + return OrderedDict(sorted(ordered_dictionary.items(), key=lambda x: sort_priority[x[0]] if str(x[0]) in sort_priority.keys() else str(x[0]))) From 00acc3f31a94b1f963dba9c076e1fc444d552cfa Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Fri, 25 Nov 2022 14:29:03 +0100 Subject: [PATCH 37/51] Update printer-linter/src/printerlinter/diagnostic.py Co-authored-by: Jelle Spijker --- printer-linter/src/printerlinter/diagnostic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/printer-linter/src/printerlinter/diagnostic.py b/printer-linter/src/printerlinter/diagnostic.py index d5eb237c29..ac6e3b829e 100644 --- a/printer-linter/src/printerlinter/diagnostic.py +++ b/printer-linter/src/printerlinter/diagnostic.py @@ -22,7 +22,7 @@ class Diagnostic: self.level = level self.replacements = replacements - def toDict(self) -> dict: + def toDict(self) -> Dict[str, Any[str, int, List[Replacements]]]: return {"DiagnosticName": self.diagnostic_name, "DiagnosticMessage": { "Message": self.message, From f8590be6da6498001be68ae179c98f0fb6db05b3 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Fri, 25 Nov 2022 14:11:06 +0100 Subject: [PATCH 38/51] Remove elif after returns --- printer-linter/src/printerlinter/factory.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/printer-linter/src/printerlinter/factory.py b/printer-linter/src/printerlinter/factory.py index 7cff08df2c..d27f82244b 100644 --- a/printer-linter/src/printerlinter/factory.py +++ b/printer-linter/src/printerlinter/factory.py @@ -11,13 +11,16 @@ def getLinter(file: Path, settings: dict) -> Optional[Linter]: """ Returns a Linter depending on the file format """ if not file.exists(): return None - elif ".inst" in file.suffixes and ".cfg" in file.suffixes: + + if ".inst" in file.suffixes and ".cfg" in file.suffixes: return Profile(file, settings) - elif ".def" in file.suffixes and ".json" in file.suffixes: + + if ".def" in file.suffixes and ".json" in file.suffixes: if file.stem in ("fdmprinter.def", "fdmextruder.def"): return None return Definition(file, settings) - elif file.parent.stem == "meshes": + + if file.parent.stem == "meshes": return Meshes(file, settings) return None From 57ec36b7fef22e1ade94e1062fd98c66f84e8dc3 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Fri, 25 Nov 2022 14:37:22 +0100 Subject: [PATCH 39/51] Fix typing --- printer-linter/src/printerlinter/diagnostic.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/printer-linter/src/printerlinter/diagnostic.py b/printer-linter/src/printerlinter/diagnostic.py index ac6e3b829e..27f4fdd14a 100644 --- a/printer-linter/src/printerlinter/diagnostic.py +++ b/printer-linter/src/printerlinter/diagnostic.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Optional, List +from typing import Optional, List, Dict, Any from .replacement import Replacement @@ -22,7 +22,7 @@ class Diagnostic: self.level = level self.replacements = replacements - def toDict(self) -> Dict[str, Any[str, int, List[Replacements]]]: + def toDict(self) -> Dict[str, Any]: return {"DiagnosticName": self.diagnostic_name, "DiagnosticMessage": { "Message": self.message, From 52ee149edc1960382595f71c30a8e98a37d93aa7 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:09:55 +0100 Subject: [PATCH 40/51] Unify `activeQualityDisplayNameMap` string creation Generation quality display names in `CustomPrintSetup.qml` and `PrintSetupSelectorHeader.qml` were so similar that I decided to combine the logic. Cura-9773 --- cura/Settings/MachineManager.py | 66 ++++++++++++------- .../Custom/CustomPrintSetup.qml | 31 +-------- .../PrintSetupSelectorHeader.qml | 20 +----- 3 files changed, 46 insertions(+), 71 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 27d8fbbc78..6992ffc4e0 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1631,33 +1631,49 @@ class MachineManager(QObject): # Examples: # - "my_profile - Fine" (only based on a default quality, no intent involved) # - "my_profile - Engineering - Fine" (based on an intent) + @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) + def activeQualityDisplayNameStringParts(self) -> [str]: + result_map = self.activeQualityDisplayNameMap + string_parts = list() + + if result_map["custom_profile"] is not None: + string_parts.append(result_map["custom_profile"]) + + string_parts.append(result_map["profile"]) + + if result_map["intent_category"] is not "default": + string_parts.append(result_map["intent_name"]) + + if result_map["layer_height"]: + string_parts.append(f"""{result_map["layer_height"]}mm""") + + if result_map["is_experimental"]: + string_parts.append(catalog.i18nc("@label", "Experimental")) + + return string_parts + @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) - def activeQualityDisplayNameMap(self) -> Dict[str, str]: + def activeQualityDisplayNameMap(self) -> Dict[str, Any]: global_stack = self._application.getGlobalContainerStack() if global_stack is None: - return {"main": "", - "suffix": ""} + return { + "profile": "", + "intent_category": "", + "intent": "", + "custom_profile": None, + "is_experimental": False + } - display_name = global_stack.quality.getName() - - intent_category = self.activeIntentCategory - if intent_category != "default": - intent_display_name = IntentCategoryModel.translation(intent_category, - "name", - intent_category.title()) - display_name = "{intent_name} - {the_rest}".format(intent_name = intent_display_name, - the_rest = display_name) - - main_part = display_name - suffix_part = "" - - # Not a custom quality - if global_stack.qualityChanges != empty_quality_changes_container: - main_part = self.activeQualityOrQualityChangesName - suffix_part = display_name - - return {"main": main_part, - "suffix": suffix_part} + return { + "profile": global_stack.quality.getName(), + "intent_category": self.activeIntentCategory, + "intent_name": IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), + "custom_profile": self.activeQualityOrQualityChangesName \ + if global_stack.qualityChanges is not empty_quality_changes_container \ + else None, + "layer_height": self.activeQualityLayerHeight if self.isActiveQualitySupported else None, + "is_experimental": self.isActiveQualityExperimental and self.isActiveQualitySupported, + } @pyqtSlot(str) def setIntentByCategory(self, intent_category: str) -> None: @@ -1776,7 +1792,9 @@ class MachineManager(QObject): @pyqtProperty(bool, notify = activeQualityGroupChanged) def hasNotSupportedQuality(self) -> bool: global_container_stack = self._application.getGlobalContainerStack() - return (not global_container_stack is None) and global_container_stack.quality == empty_quality_container and global_container_stack.qualityChanges == empty_quality_changes_container + return global_container_stack is not None\ + and global_container_stack.quality == empty_quality_container \ + and global_container_stack.qualityChanges == empty_quality_changes_container @pyqtProperty(bool, notify = activeQualityGroupChanged) def isActiveQualityCustom(self) -> bool: diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 554b663a9b..6385d60c6a 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -67,7 +67,7 @@ Item UM.Label { id: textLabel - text: Cura.MachineManager.activeQualityDisplayNameMap["main"] + text: Cura.MachineManager.activeQualityDisplayNameStringParts[0] Layout.margins: 0 Layout.maximumWidth: Math.floor(parent.width * 0.7) // Always leave >= 30% for the rest of the row. height: contentHeight @@ -77,7 +77,8 @@ Item UM.Label { - text: activeQualityDetailText() + text: Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ") + color: UM.Theme.getColor("text_detail") Layout.margins: 0 Layout.fillWidth: true @@ -85,32 +86,6 @@ Item height: contentHeight elide: Text.ElideRight wrapMode: Text.NoWrap - function activeQualityDetailText() - { - var resultMap = Cura.MachineManager.activeQualityDisplayNameMap - var resultSuffix = resultMap["suffix"] - var result = "" - - if (Cura.MachineManager.isActiveQualityExperimental) - { - resultSuffix += " (Experimental)" - } - - if (Cura.MachineManager.isActiveQualitySupported) - { - if (Cura.MachineManager.activeQualityLayerHeight > 0) - { - if (resultSuffix) - { - result += " - " + resultSuffix - } - result += " - " - result += Cura.MachineManager.activeQualityLayerHeight + "mm" - } - } - - return result - } } } diff --git a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml index 41e913a2c1..8804e51bb2 100644 --- a/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml +++ b/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml @@ -17,26 +17,8 @@ RowLayout { source: UM.Theme.getIcon("Sliders", "medium") iconSize: UM.Theme.getSize("button_icon").width - text: - { - if (Cura.MachineManager.activeStack) - { - var resultMap = Cura.MachineManager.activeQualityDisplayNameMap - var text = resultMap["main"] - if (resultMap["suffix"]) - { - text += " - " + resultMap["suffix"] - } - if (!Cura.MachineManager.hasNotSupportedQuality) - { - text += " - " + layerHeight.properties.value + "mm" - text += Cura.MachineManager.isActiveQualityExperimental ? " - " + catalog.i18nc("@label", "Experimental") : "" - } - return text - } - return "" - } + text: Cura.MachineManager.activeQualityDisplayNameStringParts.join(" - ") font: UM.Theme.getFont("medium") elide: Text.ElideMiddle wrapMode: Text.NoWrap From 1ae8f2da62b21bd11c45555959e9cf13f5562517 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:12:44 +0100 Subject: [PATCH 41/51] Add quality display name with ufp files Cura-9773 --- plugins/UFPWriter/UFPWriter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index d7671d02c8..3693352c1d 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -227,6 +227,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, + "quality_display_name": machine_manager.activeQualityDisplayNameMap, } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 76564f7bc4a893cb585bdabeaae87690f226908c Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:46:21 +0100 Subject: [PATCH 42/51] Add dash between main, and suffix part of quality display name Cura-9773 --- resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 6385d60c6a..0870e14d44 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -77,7 +77,7 @@ Item UM.Label { - text: Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ") + text: ` - ${Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ")}` color: UM.Theme.getColor("text_detail") Layout.margins: 0 From 4fa024cd317f4f8409790e29b7e440fca2bc01f6 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 25 Nov 2022 16:48:06 +0100 Subject: [PATCH 43/51] Group intent and quality Bit of an ugly hack. At later point in the code it is assumed the first element of the list is the main part and the remaining elements form the suffix. Intent and the profile form both the main part so these need to be grouped together. Cura-9773 --- cura/Settings/MachineManager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 6992ffc4e0..657eeb6089 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1639,10 +1639,10 @@ class MachineManager(QObject): if result_map["custom_profile"] is not None: string_parts.append(result_map["custom_profile"]) - string_parts.append(result_map["profile"]) - if result_map["intent_category"] is not "default": - string_parts.append(result_map["intent_name"]) + string_parts.append(f"""{result_map["intent_name"]} - {result_map["profile"]}""") + else: + string_parts.append(result_map["profile"]) if result_map["layer_height"]: string_parts.append(f"""{result_map["layer_height"]}mm""") From a809e5a91cffe0cebfc3c769d3372cdbb7ec49d4 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Mon, 28 Nov 2022 09:13:19 +0100 Subject: [PATCH 44/51] don't shadow format function. --- .../src/printerlinter/formatters/def_json_formatter.py | 2 +- printer-linter/src/printerlinter/formatters/formatter.py | 2 +- .../src/printerlinter/formatters/inst_cfg_formatter.py | 2 +- printer-linter/src/terminal.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/printer-linter/src/printerlinter/formatters/def_json_formatter.py b/printer-linter/src/printerlinter/formatters/def_json_formatter.py index c74f077249..0421b8547d 100644 --- a/printer-linter/src/printerlinter/formatters/def_json_formatter.py +++ b/printer-linter/src/printerlinter/formatters/def_json_formatter.py @@ -25,7 +25,7 @@ METADATA_SORT_PRIORITY = { class DefJsonFormatter(FileFormatter): - def format(self, file: Path): + def formatFile(self, file: Path): """ Format .def.json files according to the rules in settings. You can assume that you will be running regex on standard formatted json files, because we load the json first and then diff --git a/printer-linter/src/printerlinter/formatters/formatter.py b/printer-linter/src/printerlinter/formatters/formatter.py index 1425825a82..c668744f42 100644 --- a/printer-linter/src/printerlinter/formatters/formatter.py +++ b/printer-linter/src/printerlinter/formatters/formatter.py @@ -12,5 +12,5 @@ class FileFormatter(ABC): self._settings = settings @abstractmethod - def format(self, file: Path) -> None: + def formatFile(self, file: Path) -> None: pass \ No newline at end of file diff --git a/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py b/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py index fc6ccf3c81..c4113bcb48 100644 --- a/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py +++ b/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py @@ -7,7 +7,7 @@ from pathlib import Path from .formatter import FileFormatter class InstCfgFormatter(FileFormatter): - def format(self, file: Path): + def formatFile(self, file: Path): """ Format .inst.cfg files according to the rules in settings """ config = configparser.ConfigParser() config.read(file) diff --git a/printer-linter/src/terminal.py b/printer-linter/src/terminal.py index 3591d841a4..6e6d1af4e5 100644 --- a/printer-linter/src/terminal.py +++ b/printer-linter/src/terminal.py @@ -94,11 +94,11 @@ def applyFormattingToFile(file: Path, settings) -> None: if ext == "def.json": formatter = DefJsonFormatter(settings) - formatter.format(file) + formatter.formatFile(file) if ext == "inst.cfg": formatter = InstCfgFormatter(settings) - formatter.format(file) + formatter.formatFile(file) def extractFilePaths(paths: List[Path]) -> List[Path]: From 3eb5f91fd62f29b567b51b9e6cf408477790e392 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Mon, 28 Nov 2022 09:14:42 +0100 Subject: [PATCH 45/51] align dictionary values and add comma to end of dict. --- .../printerlinter/formatters/def_json_formatter.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/printer-linter/src/printerlinter/formatters/def_json_formatter.py b/printer-linter/src/printerlinter/formatters/def_json_formatter.py index 0421b8547d..f839594ea5 100644 --- a/printer-linter/src/printerlinter/formatters/def_json_formatter.py +++ b/printer-linter/src/printerlinter/formatters/def_json_formatter.py @@ -10,17 +10,17 @@ from .formatter import FileFormatter # Dictionary items with matching keys will be sorted as if they were the value # Example: "version" will be sorted as if it was "0" TOP_LEVEL_SORT_PRIORITY = { - "version": "0", - "name": "1", - "inherits": "3" + "version": "0", + "name": "1", + "inherits": "3", } METADATA_SORT_PRIORITY = { - "visible": "0", - "author": "1", + "visible": "0", + "author": "1", "manufacturer": "2", "file_formats": "3", - "platform" : "4" + "platform": "4", } From a645fa7d96cbf4da5c09943cf472c951d8f5f316 Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Mon, 28 Nov 2022 11:22:53 +0100 Subject: [PATCH 46/51] Use bracket to initialise list Co-authored-by: Joey de l'Arago --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 657eeb6089..28a79b6fd3 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1634,7 +1634,7 @@ class MachineManager(QObject): @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameStringParts(self) -> [str]: result_map = self.activeQualityDisplayNameMap - string_parts = list() + string_parts = [] if result_map["custom_profile"] is not None: string_parts.append(result_map["custom_profile"]) From f297909a82cf3b852df25ad270bc896c509cfe23 Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Mon, 28 Nov 2022 11:23:53 +0100 Subject: [PATCH 47/51] Fix type signature of function Co-authored-by: Joey de l'Arago --- cura/Settings/MachineManager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 28a79b6fd3..fabfc27db8 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1632,7 +1632,7 @@ class MachineManager(QObject): # - "my_profile - Fine" (only based on a default quality, no intent involved) # - "my_profile - Engineering - Fine" (based on an intent) @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) - def activeQualityDisplayNameStringParts(self) -> [str]: + def activeQualityDisplayNameStringParts(self) -> List[str]: result_map = self.activeQualityDisplayNameMap string_parts = [] From 8dcccd941b72fc1f9e5324937cecec1eeb2b6234 Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Mon, 28 Nov 2022 12:40:35 +0100 Subject: [PATCH 48/51] Add dataclass for ActiveQuality. Move some logic out of MachineManager into ActiveQuality. CURA-9793 --- cura/Settings/ActiveQuality.py | 37 ++++++++++++++++++++++++++ cura/Settings/MachineManager.py | 46 +++++++-------------------------- plugins/UFPWriter/UFPWriter.py | 3 ++- 3 files changed, 49 insertions(+), 37 deletions(-) create mode 100644 cura/Settings/ActiveQuality.py diff --git a/cura/Settings/ActiveQuality.py b/cura/Settings/ActiveQuality.py new file mode 100644 index 0000000000..48af2c5d1a --- /dev/null +++ b/cura/Settings/ActiveQuality.py @@ -0,0 +1,37 @@ +from dataclasses import dataclass +from typing import List + +from UM import i18nCatalog + +catalog = i18nCatalog("cura") + + +@dataclass +class ActiveQuality: + """ Represents the active intent+profile combination, contains all information needed to display active quality. """ + intent_category: str = "" # Name of the base intent. For example "visual" or "engineering". + intent_name: str = "" # Name of the base intent formatted for display. For Example "Visual" or "Engineering" + profile: str = "" # Name of the base profile. For example "Fine" or "Fast" + custom_profile: str = "" # Name of the custom profile, this is based on profile. For example "MyCoolCustomProfile" + layer_height: float = None # Layer height of quality in mm. For example 0.4 + is_experimental: bool = False # If the quality experimental. + + def getStringParts(self) -> List[str]: + string_parts = [] + + if self.custom_profile is not None: + string_parts.append(self.custom_profile) + + if self.intent_category is not "default": + string_parts.append(f"{self.intent_name} - {self.profile}") + else: + string_parts.append(self.profile) + + if self.layer_height: + string_parts.append(f"{self.layer_height}mm") + + if self.is_experimental: + string_parts.append(catalog.i18nc("@label", "Experimental")) + + return string_parts + diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index fabfc27db8..350cac906a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -40,6 +40,7 @@ from cura.Settings.cura_empty_instance_containers import (empty_definition_chang empty_material_container, empty_quality_container, empty_quality_changes_container, empty_intent_container) from cura.UltimakerCloud.UltimakerCloudConstants import META_UM_LINKED_TO_ACCOUNT +from .ActiveQuality import ActiveQuality from .CuraStackBuilder import CuraStackBuilder @@ -1633,47 +1634,20 @@ class MachineManager(QObject): # - "my_profile - Engineering - Fine" (based on an intent) @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameStringParts(self) -> List[str]: - result_map = self.activeQualityDisplayNameMap - string_parts = [] - - if result_map["custom_profile"] is not None: - string_parts.append(result_map["custom_profile"]) - - if result_map["intent_category"] is not "default": - string_parts.append(f"""{result_map["intent_name"]} - {result_map["profile"]}""") - else: - string_parts.append(result_map["profile"]) - - if result_map["layer_height"]: - string_parts.append(f"""{result_map["layer_height"]}mm""") - - if result_map["is_experimental"]: - string_parts.append(catalog.i18nc("@label", "Experimental")) - - return string_parts + return self.activeQualityDisplayNameMap.getStringParts() @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) - def activeQualityDisplayNameMap(self) -> Dict[str, Any]: + def activeQualityDisplayNameMap(self) -> ActiveQuality: global_stack = self._application.getGlobalContainerStack() if global_stack is None: - return { - "profile": "", - "intent_category": "", - "intent": "", - "custom_profile": None, - "is_experimental": False - } + return ActiveQuality() - return { - "profile": global_stack.quality.getName(), - "intent_category": self.activeIntentCategory, - "intent_name": IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), - "custom_profile": self.activeQualityOrQualityChangesName \ - if global_stack.qualityChanges is not empty_quality_changes_container \ - else None, - "layer_height": self.activeQualityLayerHeight if self.isActiveQualitySupported else None, - "is_experimental": self.isActiveQualityExperimental and self.isActiveQualitySupported, - } + return ActiveQuality(profile = global_stack.quality.getName(), + intent_category = self.activeIntentCategory, + intent_name = IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), + custom_profile = self.activeQualityOrQualityChangesName if global_stack.qualityChanges is not empty_quality_changes_container else None, + layer_height = self.activeQualityLayerHeight if self.isActiveQualitySupported else None, + is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported) @pyqtSlot(str) def setIntentByCategory(self, intent_category: str) -> None: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 3693352c1d..6594557584 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -1,6 +1,7 @@ # Copyright (c) 2022 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import json +from dataclasses import asdict from typing import cast, List, Dict from Charon.VirtualFile import VirtualFile # To open UFP files. @@ -227,7 +228,7 @@ class UFPWriter(MeshWriter): }, "intent": machine_manager.activeIntentCategory, "quality": machine_manager.activeQualityOrQualityChangesName, - "quality_display_name": machine_manager.activeQualityDisplayNameMap, + "quality_display_name": asdict(machine_manager.activeQualityDisplayNameMap), } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 5ed572779dd1509262fe4f3e4b68217d4053d07e Mon Sep 17 00:00:00 2001 From: Joey de l'Arago Date: Mon, 28 Nov 2022 12:44:20 +0100 Subject: [PATCH 49/51] remove redundant properties in settings CURA-9773 --- plugins/UFPWriter/UFPWriter.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index 6594557584..b9bcc94bf8 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -226,9 +226,7 @@ class UFPWriter(MeshWriter): "changes": {}, "all_settings": {}, }, - "intent": machine_manager.activeIntentCategory, - "quality": machine_manager.activeQualityOrQualityChangesName, - "quality_display_name": asdict(machine_manager.activeQualityDisplayNameMap), + "quality": asdict(machine_manager.activeQualityDisplayNameMap), } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) From 8e8437eab050ff4ce1fc663159f15869203722a3 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 28 Nov 2022 13:10:52 +0100 Subject: [PATCH 50/51] Split of `getStringParts` function Spit into `getMainStringParts` and `getTailStringParts` so we can easily differentiate between the two in the front-end. Cura-9773 --- cura/Settings/ActiveQuality.py | 19 +++++++++++++++---- cura/Settings/MachineManager.py | 14 ++++++++++++-- .../Custom/CustomPrintSetup.qml | 15 +++++++++++++-- 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/cura/Settings/ActiveQuality.py b/cura/Settings/ActiveQuality.py index 48af2c5d1a..420d1f24fc 100644 --- a/cura/Settings/ActiveQuality.py +++ b/cura/Settings/ActiveQuality.py @@ -16,16 +16,25 @@ class ActiveQuality: layer_height: float = None # Layer height of quality in mm. For example 0.4 is_experimental: bool = False # If the quality experimental. - def getStringParts(self) -> List[str]: + def getMainStringParts(self) -> List[str]: string_parts = [] if self.custom_profile is not None: string_parts.append(self.custom_profile) - - if self.intent_category is not "default": - string_parts.append(f"{self.intent_name} - {self.profile}") else: string_parts.append(self.profile) + if self.intent_category is not "default": + string_parts.append(self.intent_name) + + return string_parts + + def getTailStringParts(self) -> List[str]: + string_parts = [] + + if self.custom_profile is not None: + string_parts.append(self.profile) + if self.intent_category is not "default": + string_parts.append(self.intent_name) if self.layer_height: string_parts.append(f"{self.layer_height}mm") @@ -35,3 +44,5 @@ class ActiveQuality: return string_parts + def getStringParts(self) -> List[str]: + return self.getMainStringParts() + self.getTailStringParts() diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 350cac906a..2ee0facab8 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1636,18 +1636,28 @@ class MachineManager(QObject): def activeQualityDisplayNameStringParts(self) -> List[str]: return self.activeQualityDisplayNameMap.getStringParts() + @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) + def activeQualityDisplayNameMainStringParts(self) -> List[str]: + return self.activeQualityDisplayNameMap.getMainStringParts() + + @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) + def activeQualityDisplayNameTailStringParts(self) -> List[str]: + return self.activeQualityDisplayNameMap.getTailStringParts() + @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameMap(self) -> ActiveQuality: global_stack = self._application.getGlobalContainerStack() if global_stack is None: return ActiveQuality() - return ActiveQuality(profile = global_stack.quality.getName(), + return ActiveQuality( + profile = global_stack.quality.getName(), intent_category = self.activeIntentCategory, intent_name = IntentCategoryModel.translation(self.activeIntentCategory, "name", self.activeIntentCategory.title()), custom_profile = self.activeQualityOrQualityChangesName if global_stack.qualityChanges is not empty_quality_changes_container else None, layer_height = self.activeQualityLayerHeight if self.isActiveQualitySupported else None, - is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported) + is_experimental = self.isActiveQualityExperimental and self.isActiveQualitySupported + ) @pyqtSlot(str) def setIntentByCategory(self, intent_category: str) -> None: diff --git a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml index 0870e14d44..e64f211cd1 100644 --- a/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml +++ b/resources/qml/PrintSetupSelector/Custom/CustomPrintSetup.qml @@ -67,7 +67,7 @@ Item UM.Label { id: textLabel - text: Cura.MachineManager.activeQualityDisplayNameStringParts[0] + text: Cura.MachineManager.activeQualityDisplayNameMainStringParts.join(" - ") Layout.margins: 0 Layout.maximumWidth: Math.floor(parent.width * 0.7) // Always leave >= 30% for the rest of the row. height: contentHeight @@ -77,7 +77,18 @@ Item UM.Label { - text: ` - ${Cura.MachineManager.activeQualityDisplayNameStringParts.slice(1).join(" - ")}` + text: + { + const string_parts = Cura.MachineManager.activeQualityDisplayNameTailStringParts; + if (string_parts.length === 0) + { + return ""; + } + else + { + ` - ${string_parts.join(" - ")}` + } + } color: UM.Theme.getColor("text_detail") Layout.margins: 0 From be409200425bcca50f21cbc397b4f58d043c039e Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 28 Nov 2022 13:14:47 +0100 Subject: [PATCH 51/51] Fix cura crashing `activeQualityDisplayNameMap` no longer returned a dict and could thus not be a pyqt property Cura-9773 --- cura/Settings/MachineManager.py | 7 +++---- plugins/UFPWriter/UFPWriter.py | 2 +- .../qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 2ee0facab8..b8a5e7d885 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1634,17 +1634,16 @@ class MachineManager(QObject): # - "my_profile - Engineering - Fine" (based on an intent) @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameStringParts(self) -> List[str]: - return self.activeQualityDisplayNameMap.getStringParts() + return self.activeQualityDisplayNameMap().getStringParts() @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameMainStringParts(self) -> List[str]: - return self.activeQualityDisplayNameMap.getMainStringParts() + return self.activeQualityDisplayNameMap().getMainStringParts() @pyqtProperty("QList", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameTailStringParts(self) -> List[str]: - return self.activeQualityDisplayNameMap.getTailStringParts() + return self.activeQualityDisplayNameMap().getTailStringParts() - @pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged) def activeQualityDisplayNameMap(self) -> ActiveQuality: global_stack = self._application.getGlobalContainerStack() if global_stack is None: diff --git a/plugins/UFPWriter/UFPWriter.py b/plugins/UFPWriter/UFPWriter.py index b9bcc94bf8..f90ef823e7 100644 --- a/plugins/UFPWriter/UFPWriter.py +++ b/plugins/UFPWriter/UFPWriter.py @@ -226,7 +226,7 @@ class UFPWriter(MeshWriter): "changes": {}, "all_settings": {}, }, - "quality": asdict(machine_manager.activeQualityDisplayNameMap), + "quality": asdict(machine_manager.activeQualityDisplayNameMap()), } global_stack = cast(GlobalStack, Application.getInstance().getGlobalContainerStack()) diff --git a/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml b/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml index 0b39d84177..0fecb6b662 100644 --- a/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml +++ b/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml @@ -56,7 +56,7 @@ UM.Dialog UM.Label { id: infoText - text: catalog.i18nc("@text:window, %1 is a profile name", "You have customized some profile settings. Would you like to Keep these changed settings after switching profiles? Alternatively, you can discard the changes to load the defaults from '%1'.").arg(Cura.MachineManager.activeQualityDisplayNameMap["main"]) + text: catalog.i18nc("@text:window, %1 is a profile name", "You have customized some profile settings. Would you like to Keep these changed settings after switching profiles? Alternatively, you can discard the changes to load the defaults from '%1'.").arg(Cura.MachineManager.activeQualityDisplayNameMainStringParts.join(" - ")) anchors.left: parent.left anchors.right: parent.right wrapMode: Text.WordWrap @@ -83,7 +83,7 @@ UM.Dialog columnHeaders: [ catalog.i18nc("@title:column", "Profile settings"), - Cura.MachineManager.activeQualityDisplayNameMap["main"], + Cura.MachineManager.activeQualityDisplayNameMainStringParts.join(" - "), catalog.i18nc("@title:column", "Current changes") ] model: UM.TableModel