From 4d05ba0d02120ee5fba701bdc1033d9918a9f345 Mon Sep 17 00:00:00 2001 From: anjis Date: Mon, 1 Jun 2026 00:11:07 +0800 Subject: [PATCH] Support GIGA multi-printhead configuration options (#13901) * Support GIGA multi-printhead configuration options * Removed unused G-code comments. * Added parallel_printheads_count option to configure parallel printhead count. --------- Co-authored-by: SoftFever --- .../Elegoo OrangeStorm Giga 0.4 nozzle.json | 12 +++++++-- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/PrintConfig.cpp | 20 +++++++++++++++ src/libslic3r/PrintConfig.hpp | 3 +++ src/slic3r/GUI/Field.hpp | 3 ++- src/slic3r/GUI/Tab.cpp | 25 +++++++++++++++++++ 6 files changed, 61 insertions(+), 4 deletions(-) diff --git a/resources/profiles/Elegoo/machine/EOSGIGA/Elegoo OrangeStorm Giga 0.4 nozzle.json b/resources/profiles/Elegoo/machine/EOSGIGA/Elegoo OrangeStorm Giga 0.4 nozzle.json index 773a0e39fc..eca11e5cc3 100644 --- a/resources/profiles/Elegoo/machine/EOSGIGA/Elegoo OrangeStorm Giga 0.4 nozzle.json +++ b/resources/profiles/Elegoo/machine/EOSGIGA/Elegoo OrangeStorm Giga 0.4 nozzle.json @@ -24,6 +24,14 @@ "printer_variant": "0.4", "auxiliary_fan": "0", "bed_exclude_area": [], + "support_parallel_printheads": "1", + "parallel_printheads_count": "1", + "parallel_printheads_bed_exclude_areas": [ + "", + "400x0, 810x0, 810x805, 400x805", + "200x0, 810x0, 810x805, 200x805", + "200x0, 810x0, 810x805, 200x805" + ], "default_filament_profile": [ "Elegoo PLA @Elegoo Giga" ], @@ -96,8 +104,8 @@ "use_relative_e_distances": "0", "change_filament_gcode": "M600", "machine_pause_gcode": "M600", - "machine_start_gcode": ";===== START GCODE BEGIN =====\n;===== date: 20251231 =====================\n;Machine_use_extruders:{number_of_giga_printheads}\n;TIME:\nM400 ; wait for buffer to clear\n;[printer_model]\n;initial_filament:{filament_type[initial_extruder]}\n;curr_bed_type={curr_bed_type}\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\n;Giga zoned hot bed control\nM140 S0\n\n{if number_of_giga_printheads == 1}\n;Case 1\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T0 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T1 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405 && ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 2\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 3\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T1 S[bed_temperature_initial_layer_single]\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 4\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n{if number_of_giga_printheads > 1}\n;Heat all 4 bed zones for multi-printhead\nM140 T0 S[bed_temperature_initial_layer_single]\nM140 T1 S[bed_temperature_initial_layer_single]\nM140 T2 S[bed_temperature_initial_layer_single]\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n\nG90\nG28 ;home\nG1 Z10 F300\n\n{if number_of_giga_printheads == 1}\nG1 X{print_bed_max[0]*0.75-50} Y0.5 F6000\n{endif}\n\n{if number_of_giga_printheads == 2}\nG1 X{print_bed_max[0]*0.25-50} Y0.5 F6000\n{endif}\n\n{if number_of_giga_printheads > 2}\nG1 X{print_bed_max[0]*0.125-50} Y0.5 F6000\n{endif}\n\n;\n;Giga zoned hot bed control\n{if number_of_giga_printheads == 1}\n;Case 1\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM190 T0 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM190 T1 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((first_layer_print_max[1])) > 402.5}\nM190 T3 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405 && ((first_layer_print_max[1])) > 402.5}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 2\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM190 T3 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 3\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM190 T1 S[bed_temperature_initial_layer_single]\n{if ((first_layer_print_max[1])) > 402.5}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 4\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n{if number_of_giga_printheads > 1}\n;Wait for all 4 bed zones to reach temperature\nM190 T0 S[bed_temperature_initial_layer_single]\nM190 T1 S[bed_temperature_initial_layer_single]\nM190 T2 S[bed_temperature_initial_layer_single]\nM190 T3 S[bed_temperature_initial_layer_single]\n{endif}\nG1 Z0.4 F300\nM109 S[nozzle_temperature_initial_layer]\nG92 E0 ;Reset Extruder\n\n{if number_of_giga_printheads == 1}\nG1 X{print_bed_max[0]*0.75+50} E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X{print_bed_max[0]*0.75+47} F3000\n{endif}\n\n{if number_of_giga_printheads == 2}\nG1 X{print_bed_max[0]*0.25+50} E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X{print_bed_max[0]*0.25+47} F3000\n{endif}\n\n{if number_of_giga_printheads > 2}\nG1 X{print_bed_max[0]*0.125+50} E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X{print_bed_max[0]*0.125+47} F3000\n{endif}\n\nG92 E0 ;Reset Extruder\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0\n", + "machine_start_gcode": ";===== START GCODE BEGIN =====\n;===== date: 20260528 =====================\n;Machine_use_extruders:{parallel_printheads_count}\nM400 ; wait for buffer to clear\n;[printer_model]\n;initial_filament:{filament_type[initial_extruder]}\n;curr_bed_type={curr_bed_type}\nM220 S100 ;Set the feed speed to 100%\nM221 S100 ;Set the flow rate to 100%\nM104 S140\n;Giga zoned hot bed control\nM140 S0\n\n{if parallel_printheads_count == 1}\n;Case 1\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T0 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T1 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405 && ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 2\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 3\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T1 S[bed_temperature_initial_layer_single]\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 4\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n{if parallel_printheads_count > 1}\n;Heat all 4 bed zones for multi-printhead\nM140 T0 S[bed_temperature_initial_layer_single]\nM140 T1 S[bed_temperature_initial_layer_single]\nM140 T2 S[bed_temperature_initial_layer_single]\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n\nG90\nG28 ;home\nG1 Z10 F300\n\n{if parallel_printheads_count == 1}\nG1 X{print_bed_max[0]*0.75-50} Y0.5 F6000\n{endif}\n\n{if parallel_printheads_count == 2}\nG1 X{print_bed_max[0]*0.25-50} Y0.5 F6000\n{endif}\n\n{if parallel_printheads_count > 2}\nG1 X{print_bed_max[0]*0.125-50} Y0.5 F6000\n{endif}\n\n;\n;Giga zoned hot bed control\n{if parallel_printheads_count == 1}\n;Case 1\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM190 T0 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM190 T1 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((first_layer_print_max[1])) > 402.5}\nM190 T3 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405 && ((first_layer_print_max[1])) > 402.5}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 2\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM190 T3 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 3\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM190 T1 S[bed_temperature_initial_layer_single]\n{if ((first_layer_print_max[1])) > 402.5}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 4\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM190 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n{if parallel_printheads_count > 1}\n;Wait for all 4 bed zones to reach temperature\nM190 T0 S[bed_temperature_initial_layer_single]\nM190 T1 S[bed_temperature_initial_layer_single]\nM190 T2 S[bed_temperature_initial_layer_single]\nM190 T3 S[bed_temperature_initial_layer_single]\n{endif}\nG1 Z0.4 F300\nM109 S[nozzle_temperature_initial_layer]\nG92 E0 ;Reset Extruder\n\n{if parallel_printheads_count == 1}\nG1 X{print_bed_max[0]*0.75+50} E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X{print_bed_max[0]*0.75+47} F3000\n{endif}\n\n{if parallel_printheads_count == 2}\nG1 X{print_bed_max[0]*0.25+50} E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X{print_bed_max[0]*0.25+47} F3000\n{endif}\n\n{if parallel_printheads_count > 2}\nG1 X{print_bed_max[0]*0.125+50} E30 F400 ;Draw the first line\nG1 Z0.6 F120.0 ;Move to side a little\nG1 X{print_bed_max[0]*0.125+47} F3000\n{endif}\n\nG92 E0 ;Reset Extruder\n;LAYER_COUNT:[total_layer_count]\n;LAYER:0\n", "machine_end_gcode": ";PRINT_END\nG90 ;Absolute positionning\nM83 ; extruder relative mode\nG1 X30 Y30 Z{min(max_layer_z+200, printable_height)} E-5 F{travel_speed*60} ; Move print head up\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\nM84 X Y E ;Disable all steppers but Z", "before_layer_change_gcode": ";BEFORE_LAYER_CHANGE\n;[layer_z]\n", - "layer_change_gcode": ";===== LAYER CHANGE GCODE BEGIN =====\n;===== date: 20251230 =====================\n;LAYER:{layer_num+1}\n{if layer_num > 0 and layer_num < 3}\n;Giga zoned hot bed control\nM140 S0\n\n{if number_of_giga_printheads == 1}\n;Case 1\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T0 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T1 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405 && ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 2\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 3\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T1 S[bed_temperature_initial_layer_single]\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 4\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n{if number_of_giga_printheads > 1}\n;Heat all 4 bed zones for multi-printhead\nM140 T0 S[bed_temperature_initial_layer_single]\nM140 T1 S[bed_temperature_initial_layer_single]\nM140 T2 S[bed_temperature_initial_layer_single]\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n\n{endif}" + "layer_change_gcode": ";===== LAYER CHANGE GCODE BEGIN =====\n;===== date: 20251230 =====================\n;LAYER:{layer_num+1}\n{if layer_num > 0 and layer_num < 3}\n;Giga zoned hot bed control\nM140 S0\n\n{if parallel_printheads_count == 1}\n;Case 1\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T0 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T1 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405 && ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 2\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) < 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T3 S[bed_temperature_initial_layer_single]\n{if ((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) > 405}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 3\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) < 402.5}\nM140 T1 S[bed_temperature_initial_layer_single]\n{if ((first_layer_print_max[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n;Case 4\n{if (min(print_bed_max[0], first_layer_print_min[0] + 32) - 32) > 405 && (max(0, first_layer_print_min[1])) > 402.5}\nM140 T2 S[bed_temperature_initial_layer_single]\n{endif}\n{endif}\n\n{if parallel_printheads_count > 1}\n;Heat all 4 bed zones for multi-printhead\nM140 T0 S[bed_temperature_initial_layer_single]\nM140 T1 S[bed_temperature_initial_layer_single]\nM140 T2 S[bed_temperature_initial_layer_single]\nM140 T3 S[bed_temperature_initial_layer_single]\n{endif}\n\n{endif}" } diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 4e7234d1bc..484283e5ea 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -1318,7 +1318,7 @@ static std::vector s_Preset_machine_limits_options { static std::vector s_Preset_printer_options { "printer_technology", - "printable_area", "extruder_printable_area", "bed_exclude_area","bed_custom_texture", "bed_custom_model", "gcode_flavor", + "printable_area", "extruder_printable_area", "support_parallel_printheads", "parallel_printheads_count", "parallel_printheads_bed_exclude_areas", "bed_exclude_area","bed_custom_texture", "bed_custom_model", "gcode_flavor", "fan_kickstart", "part_cooling_fan_min_pwm", "fan_speedup_time", "fan_speedup_overhangs", "single_extruder_multi_material", "manual_filament_change", "file_start_gcode", "machine_start_gcode", "machine_end_gcode", "before_layer_change_gcode", "printing_by_object_gcode", "layer_change_gcode", "time_lapse_gcode", "wrapping_detection_gcode", "change_filament_gcode", "change_extrusion_role_gcode", "printer_model", "printer_variant", "printer_extruder_id", "printer_extruder_variant", "extruder_variant_list", "default_nozzle_volume_type", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 7c68e70b8f..552a884fd9 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -693,6 +693,26 @@ void PrintConfigDef::init_common_params() def->gui_type = ConfigOptionDef::GUIType::one_string; def->set_default_value(new ConfigOptionPointsGroups{}); + def = this->add("support_parallel_printheads", coBool); + def->label = L("Support parallel printheads"); + def->tooltip = L("Enable printer settings for machines that can use multiple printheads in parallel."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionBool{false}); + + def = this->add("parallel_printheads_count", coInt); + def->label = L("Parallel printheads count"); + def->tooltip = L("Set the number of parallel printheads for machines like OrangeStorm Giga printer."); + def->mode = comAdvanced; + def->min = 1; + def->max = 4; + def->set_default_value(new ConfigOptionInt{1}); + + def = this->add("parallel_printheads_bed_exclude_areas", coStrings); + def->label = L("Parallel printheads bed exclude areas"); + def->tooltip = L("Ordered list of bed exclude areas by parallel printhead count. Item 1 applies to one printhead, item 2 to two printheads, and so on. Leave an item empty for no excluded area."); + def->mode = comAdvanced; + def->set_default_value(new ConfigOptionStrings()); + //BBS: add "bed_exclude_area" def = this->add("bed_exclude_area", coPoints); def->label = L("Bed exclude area"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index cdde293cfa..bb3051f7fa 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1480,6 +1480,9 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionFloatOrPercent, max_travel_detour_distance)) ((ConfigOptionPoints, printable_area)) ((ConfigOptionPointsGroups, extruder_printable_area)) + ((ConfigOptionBool, support_parallel_printheads)) + ((ConfigOptionInt, parallel_printheads_count)) + ((ConfigOptionStrings, parallel_printheads_bed_exclude_areas)) //BBS: add bed_exclude_area ((ConfigOptionPoints, bed_exclude_area)) ((ConfigOptionPoints, head_wrap_detect_zone)) diff --git a/src/slic3r/GUI/Field.hpp b/src/slic3r/GUI/Field.hpp index a668ea3fab..2fae710a93 100644 --- a/src/slic3r/GUI/Field.hpp +++ b/src/slic3r/GUI/Field.hpp @@ -190,6 +190,7 @@ public: /// Call the attached m_fn_edit_value method. void on_edit_value(); + virtual void propagate_value(){} public: /// parent wx item, opportunity to refactor (probably not necessary - data duplication) wxWindow* m_parent {nullptr}; @@ -317,7 +318,7 @@ public: void BUILD() override; bool value_was_changed(); // Propagate value from field to the OptionGroupe and Config after kill_focus/ENTER - void propagate_value(); + virtual void propagate_value() override; wxWindow* window {nullptr}; void set_value(const std::string& value, bool change_event = false) { diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index eb95d18e1b..5a6c909877 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -1935,6 +1935,26 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value) } } + if (opt_key == "parallel_printheads_count" || opt_key == "parallel_printheads_bed_exclude_areas") { + if (m_config->opt_bool("support_parallel_printheads")) { + const int count = opt_key == "parallel_printheads_count" ? boost::any_cast(value) : m_config->opt_int("parallel_printheads_count"); + if (auto *field = this->get_field("bed_exclude_area")) { + wxString exclude_area; + if (count > 0) { + if (const auto *areas = m_config->option("parallel_printheads_bed_exclude_areas"); + areas != nullptr) { + const size_t index = static_cast(count - 1); + if (index < areas->values.size()) + exclude_area = wxString::FromUTF8(areas->values[index]); + } + } + + field->set_value(exclude_area, true); + field->propagate_value(); + } + } + } + if (m_postpone_update_ui) { // It means that not all values are rolled to the system/last saved values jet. // And call of the update() can causes a redundant check of the config values, @@ -4429,6 +4449,7 @@ void TabPrinter::build_fff() create_line_with_widget(optgroup.get(), "printable_area", "custom-svg-and-png-bed-textures_124612", [this](wxWindow* parent) { return create_bed_shape_widget(parent); }); + optgroup->append_single_option_line("parallel_printheads_count"); Option option = optgroup->get_option("bed_exclude_area"); option.opt.full_width = true; optgroup->append_single_option_line(option, "printer_basic_information_printable_space#excluded-bed-area"); @@ -5409,6 +5430,7 @@ void TabPrinter::toggle_options() // toggle_option("change_filament_gcode", have_multiple_extruders); //} if (m_active_page->title() == L("Basic information")) { + const auto &printer_cfg = m_preset_bundle->printers.get_edited_preset().config; // SoftFever: hide BBL specific settings for (auto el : {"scan_first_layer", "bbl_calib_mark_logo", "bbl_use_printhost"}) @@ -5420,6 +5442,9 @@ void TabPrinter::toggle_options() auto gcf = m_config->option>("gcode_flavor")->value; toggle_line("enable_power_loss_recovery", is_BBL_printer || gcf == gcfMarlinFirmware); + + const bool support_parallel_printheads = printer_cfg.opt_bool("support_parallel_printheads"); + toggle_line("parallel_printheads_count", support_parallel_printheads); }