From 99fde4a24e2cbed4477d3c49f5f248f7d3c8925e Mon Sep 17 00:00:00 2001 From: Sandmann <31391404+sandman21vs@users.noreply.github.com> Date: Wed, 24 Jun 2026 08:13:45 +0200 Subject: [PATCH 1/8] fix(CrealityPrint): avoid false 'End of file' error when K1 closes the WS after start (#14344) K1C: corrige erro 'End of file' ao enviar impressao (start_print) A K1-family fecha o WebSocket 9999 assim que aceita o comando de iniciar impressao. O start_print fazia um ws.read() bloqueante logo apos o write, que estourava 'End of file [asio.misc:2]' e era reportado como erro -- embora a impressao ja tivesse iniciado (o comando e entregue no write). Torna o read e o close best-effort (overloads com error_code), eliminando o falso erro. Mesmo padrao ja usado em feed_filament; cobre os caminhos single-color e multicor. --- src/slic3r/Utils/CrealityPrint.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/slic3r/Utils/CrealityPrint.cpp b/src/slic3r/Utils/CrealityPrint.cpp index 99f62a3824..772e1da80e 100644 --- a/src/slic3r/Utils/CrealityPrint.cpp +++ b/src/slic3r/Utils/CrealityPrint.cpp @@ -414,11 +414,19 @@ bool CrealityPrint::start_print(wxString &msg, const std::string &filename, cons }; ws.write(net::buffer(to_string(cmd))); + // K1-family firmware closes the WebSocket right after accepting the + // start command, so a blocking read here surfaces a benign + // "End of file [asio.misc:2]" even though the print already started + // (the command is delivered by write()). Read best-effort, ignore errors. beast::flat_buffer buffer; - ws.read(buffer); + beast::error_code read_ec; + ws.read(buffer, read_ec); } - ws.close(websocket::close_code::normal); + // Same reason: the printer may have already closed the connection. A close + // error here is not a failure — the start command was sent above. + beast::error_code close_ec; + ws.close(websocket::close_code::normal, close_ec); return true; } catch(std::exception const& e) { BOOST_LOG_TRIVIAL(error) << "CrealityPrint: Error starting print: " << e.what(); From 8491f87ddb14062a7f8ee45633a89f3ce6a0c0e2 Mon Sep 17 00:00:00 2001 From: TheLegendTubaGuy <95944177+thelegendtubaguy@users.noreply.github.com> Date: Wed, 24 Jun 2026 01:16:20 -0500 Subject: [PATCH 2/8] Set Qidi X-Max 4 printer agent (#14334) * Set Qidi X-Max 4 printer agent * bump version --------- Co-authored-by: SoftFever --- resources/profiles/Qidi.json | 2 +- resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/resources/profiles/Qidi.json b/resources/profiles/Qidi.json index 7ff96dbeea..b2d823adaf 100644 --- a/resources/profiles/Qidi.json +++ b/resources/profiles/Qidi.json @@ -1,6 +1,6 @@ { "name": "Qidi", - "version": "02.04.00.03", + "version": "02.04.00.04", "force_update": "0", "description": "Qidi configurations", "machine_model_list": [ diff --git a/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json b/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json index 50ebf15682..fe4cad7500 100644 --- a/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json +++ b/resources/profiles/Qidi/machine/Qidi X-Max 4 0.4 nozzle.json @@ -79,5 +79,6 @@ "150x150" ], "fan_direction": "left", + "printer_agent": "qidi", "use_3mf": "1" } From 91b712a237e4ea8ee5f21a42cee696a56928759a Mon Sep 17 00:00:00 2001 From: NM <34319168+ni4223@users.noreply.github.com> Date: Tue, 23 Jun 2026 23:18:38 -0700 Subject: [PATCH 3/8] feat(profiles): Snapmaker U1, add 0.2mm & 0.8mm nozzle profiles, complete 0.6mm process lineup (#14305) * Snapmaker U1: add 0.2mm and 0.8mm nozzle profiles Add machine and process profiles for the Snapmaker U1's 0.2mm and 0.8mm nozzles, and complete the 0.6mm process lineup. Follows the same data-only pattern used to add the 0.6 / 0.4+0.6 nozzles in commit afc3756. The U1 ships with 0.4, 0.4+0.6 and 0.6 nozzle options today; the 0.2 and 0.8 nozzles are supported hardware but have no profiles, so they cannot be selected. This adds them the Orca-native way: per-nozzle machine presets plus a model-file dropdown entry, with their process profiles filtered in via compatible_printers. Machine (2): lean presets inheriting fdm_U1, mirroring the existing SM_U1_06 (0.6) preset and overriding only the per-nozzle values; setting_ids SM_U1_02 / SM_U1_08. Process (21): 2 per-nozzle commons (fdm_process_U1_0.2_common, _0.8_common) holding the nozzle line widths, plus 19 profiles (0.2: 8, 0.6: 6, 0.8: 5) that inherit their per-nozzle common and carry their own layer height, matching upstream's factoring. The two 0.24 Standard profiles that shared id GP029 are split into GP029_06_024 / GP029_08_024. Model dropdown: machine/Snapmaker U1.json nozzle_diameter "0.4;0.4+0.6;0.6" -> "0.2;0.4;0.4+0.6;0.6;0.8". Vendor index: register the new presets in Snapmaker.json. The existing 0.4 / 0.6 / 0.4+0.6 presets resolve identically before and after. scripts/orca_extra_profile_check.py and the profile validator both pass. * chore(profiles): bump Snapmaker vendor version to 02.04.00.04 Bump the Snapmaker vendor config_version so existing installs pick up the new 0.2mm and 0.8mm U1 nozzle profiles. PresetUpdater only re-imports a vendor bundle when the shipped version is strictly greater than the cached one. --------- Co-authored-by: ni4223 --- resources/profiles/Snapmaker.json | 94 ++++++++++++++++++- .../machine/Snapmaker U1 (0.2 nozzle).json | 30 ++++++ .../machine/Snapmaker U1 (0.8 nozzle).json | 30 ++++++ .../Snapmaker/machine/Snapmaker U1.json | 2 +- ...gh Quality @Snapmaker U1 (0.2 nozzle).json | 43 +++++++++ ...6 Standard @Snapmaker U1 (0.2 nozzle).json | 39 ++++++++ ...gh Quality @Snapmaker U1 (0.2 nozzle).json | 43 +++++++++ ...8 Standard @Snapmaker U1 (0.2 nozzle).json | 39 ++++++++ ...gh Quality @Snapmaker U1 (0.2 nozzle).json | 43 +++++++++ ...0 Standard @Snapmaker U1 (0.2 nozzle).json | 41 ++++++++ ...2 Standard @Snapmaker U1 (0.2 nozzle).json | 39 ++++++++ ...4 Standard @Snapmaker U1 (0.2 nozzle).json | 39 ++++++++ ...8 Standard @Snapmaker U1 (0.6 nozzle).json | 42 +++++++++ ...4 Standard @Snapmaker U1 (0.6 nozzle).json | 41 ++++++++ ...4 Standard @Snapmaker U1 (0.8 nozzle).json | 43 +++++++++ ...0 Standard @Snapmaker U1 (0.6 nozzle).json | 40 ++++++++ ...0 Strength @Snapmaker U1 (0.6 nozzle).json | 42 +++++++++ ...2 Standard @Snapmaker U1 (0.8 nozzle).json | 44 +++++++++ ...6 Standard @Snapmaker U1 (0.6 nozzle).json | 41 ++++++++ ...0 Standard @Snapmaker U1 (0.8 nozzle).json | 45 +++++++++ ...2 Standard @Snapmaker U1 (0.6 nozzle).json | 41 ++++++++ ...8 Standard @Snapmaker U1 (0.8 nozzle).json | 43 +++++++++ ...6 Standard @Snapmaker U1 (0.8 nozzle).json | 41 ++++++++ .../process/fdm_process_U1_0.2_common.json | 16 ++++ .../process/fdm_process_U1_0.8_common.json | 16 ++++ 25 files changed, 975 insertions(+), 2 deletions(-) create mode 100644 resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.2_common.json create mode 100644 resources/profiles/Snapmaker/process/fdm_process_U1_0.8_common.json diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index 6545b26f4b..56dee2ce38 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,6 +1,6 @@ { "name": "Snapmaker", - "version": "02.04.00.03", + "version": "02.04.00.04", "force_update": "0", "description": "Snapmaker configurations", "machine_model_list": [ @@ -477,6 +477,90 @@ { "name": "0.06 Standard @Snapmaker Artisan (0.2 nozzle)", "sub_path": "process/0.06 Standard @Snapmaker Artisan (0.2 nozzle).json" + }, + { + "name": "fdm_process_U1_0.2_common", + "sub_path": "process/fdm_process_U1_0.2_common.json" + }, + { + "name": "fdm_process_U1_0.8_common", + "sub_path": "process/fdm_process_U1_0.8_common.json" + }, + { + "name": "0.06 High Quality @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.06 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.08 High Quality @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.08 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.10 High Quality @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.12 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.14 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "0.18 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "0.24 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "0.30 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "0.30 Strength @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "0.36 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "0.42 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "0.24 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json" + }, + { + "name": "0.32 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json" + }, + { + "name": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json" + }, + { + "name": "0.48 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json" + }, + { + "name": "0.56 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json" } ], "filament_list": [ @@ -1985,6 +2069,14 @@ { "name": "Snapmaker A350 Dual QS+B Kit (0.8 nozzle)", "sub_path": "machine/Snapmaker A350 Dual QS+B Kit (0.8 nozzle).json" + }, + { + "name": "Snapmaker U1 (0.2 nozzle)", + "sub_path": "machine/Snapmaker U1 (0.2 nozzle).json" + }, + { + "name": "Snapmaker U1 (0.8 nozzle)", + "sub_path": "machine/Snapmaker U1 (0.8 nozzle).json" } ] } diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..7a2a528404 --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "setting_id": "SM_U1_02", + "name": "Snapmaker U1 (0.2 nozzle)", + "from": "system", + "instantiation": "true", + "inherits": "fdm_U1", + "printer_model": "Snapmaker U1", + "printer_variant": "0.2", + "default_print_profile": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", + "max_layer_height": [ + "0.14", + "0.14", + "0.14", + "0.14" + ], + "min_layer_height": [ + "0.04", + "0.04", + "0.04", + "0.04" + ], + "nozzle_diameter": [ + "0.2", + "0.2", + "0.2", + "0.2" + ], + "nozzle_type": "hardened_steel" +} diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json new file mode 100644 index 0000000000..f118a6805d --- /dev/null +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.8 nozzle).json @@ -0,0 +1,30 @@ +{ + "type": "machine", + "setting_id": "SM_U1_08", + "name": "Snapmaker U1 (0.8 nozzle)", + "from": "system", + "instantiation": "true", + "inherits": "fdm_U1", + "printer_model": "Snapmaker U1", + "printer_variant": "0.8", + "default_print_profile": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", + "max_layer_height": [ + "0.56", + "0.56", + "0.56", + "0.56" + ], + "min_layer_height": [ + "0.16", + "0.16", + "0.16", + "0.16" + ], + "nozzle_diameter": [ + "0.8", + "0.8", + "0.8", + "0.8" + ], + "nozzle_type": "hardened_steel" +} diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1.json b/resources/profiles/Snapmaker/machine/Snapmaker U1.json index f9c3f98893..fb703f2e75 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1.json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1.json @@ -7,5 +7,5 @@ "model_id": "797581801", "bed_model": "Snapmaker U1_bed.stl", "bed_texture": "Snapmaker U1_texture.svg", - "nozzle_diameter": "0.4;0.4+0.6;0.6" + "nozzle_diameter": "0.2;0.4;0.4+0.6;0.6;0.8" } diff --git a/resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..528334ec4d --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.06 High Quality @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "name": "0.06 High Quality @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.06", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.06", + "support_bottom_z_distance": "0.06", + "setting_id": "GP115", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in minimal layer lines and much higher printing quality, but much longer printing time.", + "default_acceleration": "4000", + "elefant_foot_compensation": "0.15", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "sparse_infill_pattern": "gyroid", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "13.5", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" +} diff --git a/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..0fdf3d780c --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,39 @@ +{ + "type": "process", + "name": "0.06 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.06", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.06", + "support_bottom_z_distance": "0.06", + "setting_id": "GP024", + "description": "Compared with the default profile of 0.2 mm nozzle, it has a smaller layer height, and results in minimal layer lines and higher printing quality, but shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "13.5", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" +} diff --git a/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..cd8f4f89ff --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.08 High Quality @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "name": "0.08 High Quality @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.08", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.08", + "support_bottom_z_distance": "0.08", + "setting_id": "GP122", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer lines, lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in almost invisible layer lines and much higher printing quality, but much longer printing time.", + "default_acceleration": "4000", + "elefant_foot_compensation": "0.15", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "sparse_infill_pattern": "gyroid", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "18", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" +} diff --git a/resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..3e70a2d5b1 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,39 @@ +{ + "type": "process", + "name": "0.08 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.08", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.08", + "support_bottom_z_distance": "0.08", + "setting_id": "GP025", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer height, and results in almost invisible layer lines and higher printing quality, but shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "18", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" +} diff --git a/resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..19327ec74e --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.10 High Quality @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "name": "0.10 High Quality @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.1", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.1", + "support_bottom_z_distance": "0.1", + "setting_id": "GP111", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has lower speeds and acceleration, and the sparse infill pattern is Gyroid. So, it results in much higher printing quality, but a much longer printing time.", + "default_acceleration": "4000", + "elefant_foot_compensation": "0.15", + "outer_wall_acceleration": "2000", + "outer_wall_speed": "60", + "sparse_infill_pattern": "gyroid", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "28", + "prime_volume": "25", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" +} diff --git a/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..d906a28b31 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,41 @@ +{ + "type": "process", + "name": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.1", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.1", + "support_bottom_z_distance": "0.1", + "setting_id": "GP007", + "description": "It has a small layer height, and results in almost negligible layer lines and high printing quality. It is suitable for most general printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "preheat_time": "31", + "prime_tower_brim_width": "6", + "prime_tower_width": "28", + "prime_volume": "25", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "slowdown_for_curled_perimeters": "0" +} diff --git a/resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..e205d640d9 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,39 @@ +{ + "type": "process", + "name": "0.12 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.12", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.12", + "support_bottom_z_distance": "0.12", + "setting_id": "GP026", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a slightly bigger layer height, and results in almost negligible layer lines, and slightly shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "28", + "prime_volume": "27", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" +} diff --git a/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json new file mode 100644 index 0000000000..5e931eb189 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json @@ -0,0 +1,39 @@ +{ + "type": "process", + "name": "0.14 Standard @Snapmaker U1 (0.2 nozzle)", + "inherits": "fdm_process_U1_0.2_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.14", + "initial_layer_print_height": "0.1", + "wall_loops": "4", + "bottom_shell_layers": "5", + "top_shell_layers": "7", + "bridge_flow": "1", + "initial_layer_speed": "40", + "initial_layer_infill_speed": "70", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "support_top_z_distance": "0.14", + "support_bottom_z_distance": "0.14", + "setting_id": "GP027", + "description": "Compared with the default profile of a 0.2 mm nozzle, it has a bigger layer height, and results in slightly visible layer lines, but shorter printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.2 nozzle)" + ], + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "32", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib" +} diff --git a/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json new file mode 100644 index 0000000000..44bc1e06bd --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json @@ -0,0 +1,42 @@ +{ + "type": "process", + "name": "0.18 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.6_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.25", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15", + "support_top_z_distance": "0.18", + "support_bottom_z_distance": "0.18", + "setting_id": "GP028", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and higher printing quality, but longer printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "41", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json new file mode 100644 index 0000000000..a0451b3ebf --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json @@ -0,0 +1,41 @@ +{ + "type": "process", + "name": "0.24 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.6_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.24", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15", + "setting_id": "GP029_06_024", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and slight higher printing quality, but longer printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "55", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json new file mode 100644 index 0000000000..838420fda1 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "name": "0.24 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.8_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.24", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "setting_id": "GP029_08_024", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a smaller layer height, and results in less apparent layer lines and slight higher printing quality, but longer printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "min_width_top_surface": "90", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "54", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json new file mode 100644 index 0000000000..5d9ce3e740 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json @@ -0,0 +1,40 @@ +{ + "type": "process", + "name": "0.30 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.6_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.3", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15", + "setting_id": "GP010", + "description": "It has a big layer height, and results in apparent layer lines and ordinary printing quality and printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "68", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json new file mode 100644 index 0000000000..16336d01cd --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json @@ -0,0 +1,42 @@ +{ + "type": "process", + "name": "0.30 Strength @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.6_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.3", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15", + "setting_id": "GP036", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has more wall loops and a higher sparse infill density. So, it results in higher strength of the prints, but more filament consumption and longer printing time.", + "elefant_foot_compensation": "0.15", + "sparse_infill_density": "25%", + "wall_loops": "4", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_width": "30", + "prime_volume": "68", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "prime_tower_brim_width": "5", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_type": "tree(auto)", + "wipe_tower_extra_spacing": "120%" +} diff --git a/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json new file mode 100644 index 0000000000..194f69d1c6 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json @@ -0,0 +1,44 @@ +{ + "type": "process", + "name": "0.32 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.8_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.32", + "initial_layer_print_height": "0.4", + "bridge_flow": "0.7", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "setting_id": "GP033", + "description": "Compared with the default profile of a 0.8 mm nozzle, it has a slightly smaller layer height, and results in slightly less but still apparent layer lines and slightly higher printing quality, but longer printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "72", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "bridge_density": "70%", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json new file mode 100644 index 0000000000..1bd0a8c18a --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json @@ -0,0 +1,41 @@ +{ + "type": "process", + "name": "0.36 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.6_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.36", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15", + "setting_id": "GP030", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in more apparent layer lines and lower printing quality, but shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "81", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json new file mode 100644 index 0000000000..851b1e67f6 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json @@ -0,0 +1,45 @@ +{ + "type": "process", + "name": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.8_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.4", + "initial_layer_print_height": "0.4", + "bridge_flow": "0.8", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "setting_id": "GP009", + "description": "It has a very big layer height, and results in very apparent layer lines, low printing quality and general printing time.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "90", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "bridge_density": "60%", + "enable_arc_fitting": "0", + "min_width_top_surface": "200%", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "40", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json b/resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json new file mode 100644 index 0000000000..06297c087d --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json @@ -0,0 +1,41 @@ +{ + "type": "process", + "name": "0.42 Standard @Snapmaker U1 (0.6 nozzle)", + "inherits": "fdm_process_U1_0.6_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.42", + "initial_layer_print_height": "0.3", + "bridge_flow": "1", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "15", + "setting_id": "GP031", + "description": "Compared with the default profile of a 0.6 mm nozzle, it has a bigger layer height, and results in much more apparent layer lines and much lower printing quality, but shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.6 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "precise_z_height": "0", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "95", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json new file mode 100644 index 0000000000..7f647e52dc --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json @@ -0,0 +1,43 @@ +{ + "type": "process", + "name": "0.48 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.8_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.48", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "setting_id": "GP034", + "description": "Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer height, and results in very apparent layer lines and much lower printing quality, but shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "internal_bridge_speed": "100%", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "108", + "seam_gap": "15%", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json b/resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json new file mode 100644 index 0000000000..3a8d3bb251 --- /dev/null +++ b/resources/profiles/Snapmaker/process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json @@ -0,0 +1,41 @@ +{ + "type": "process", + "name": "0.56 Standard @Snapmaker U1 (0.8 nozzle)", + "inherits": "fdm_process_U1_0.8_common", + "from": "system", + "instantiation": "true", + "layer_height": "0.56", + "initial_layer_print_height": "0.4", + "bridge_flow": "1", + "top_surface_pattern": "monotonic", + "initial_layer_speed": "35", + "initial_layer_infill_speed": "55", + "sparse_infill_speed": "100", + "top_surface_speed": "150", + "bridge_speed": "30", + "overhang_3_4_speed": "25", + "overhang_4_4_speed": "5", + "setting_id": "GP035", + "description": "Compared with the default profile of a 0.8 mm nozzle, it has a much bigger layer height, and results in extremely apparent layer lines and much lower printing quality, but much shorter printing time in some printing cases.", + "elefant_foot_compensation": "0.15", + "smooth_coefficient": "150", + "overhang_totally_speed": "50", + "compatible_printers": [ + "Snapmaker U1 (0.8 nozzle)" + ], + "filter_out_gap_fill": "1", + "gap_fill_target": "topbottom", + "prime_tower_brim_width": "5", + "prime_tower_width": "30", + "prime_volume": "126", + "wipe_tower_extra_rib_length": "8", + "wipe_tower_extra_spacing": "120%", + "wipe_tower_wall_type": "rib", + "enable_arc_fitting": "0", + "ooze_prevention": "1", + "precise_outer_wall": "0", + "slowdown_for_curled_perimeters": "0", + "standby_temperature_delta": "-150", + "support_threshold_angle": "35", + "support_type": "tree(auto)" +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.2_common.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.2_common.json new file mode 100644 index 0000000000..713b7ea625 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.2_common.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.2_common", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "line_width": "0.22", + "outer_wall_line_width": "0.22", + "inner_wall_line_width": "0.22", + "initial_layer_line_width": "0.25", + "sparse_infill_line_width": "0.22", + "internal_solid_infill_line_width": "0.22", + "support_line_width": "0.22", + "top_surface_line_width": "0.22", + "compatible_printers": [] +} diff --git a/resources/profiles/Snapmaker/process/fdm_process_U1_0.8_common.json b/resources/profiles/Snapmaker/process/fdm_process_U1_0.8_common.json new file mode 100644 index 0000000000..838bfed324 --- /dev/null +++ b/resources/profiles/Snapmaker/process/fdm_process_U1_0.8_common.json @@ -0,0 +1,16 @@ +{ + "type": "process", + "name": "fdm_process_U1_0.8_common", + "inherits": "fdm_process_U1_common", + "from": "system", + "instantiation": "false", + "line_width": "0.82", + "outer_wall_line_width": "0.82", + "inner_wall_line_width": "0.82", + "initial_layer_line_width": "0.82", + "sparse_infill_line_width": "0.82", + "internal_solid_infill_line_width": "0.82", + "support_line_width": "0.82", + "top_surface_line_width": "0.82", + "compatible_printers": [] +} From ff83aa41efca549800d3cd35762be88918a007ce Mon Sep 17 00:00:00 2001 From: Indy Jones <2567378+indyjonesnl@users.noreply.github.com> Date: Wed, 24 Jun 2026 08:20:11 +0200 Subject: [PATCH 4/8] Fix duplicate Flashforge filaments in system filament list (#14316) The `@FF AD5M 0.25 nozzle` filament variants carried the base profile's full printer list (AD5M/AD5M Pro/AD5X 0.4/0.6/0.8) instead of the 0.25 nozzle printers. Combined with base profiles that also listed the AD5X 0.4/0.6/0.8 printers already covered by dedicated `@FF AD5X` variants, multiple presets with the same alias became compatible with the same printer. The filament combobox keys presets by full name but displays them by alias, so these surfaced as duplicate entries (e.g. "Flashforge PLA Silk", "Flashforge ASA Basic" shown twice). Fix the `compatible_printers` lists (data only, no settings changed): - Repoint the 15 `@FF AD5M 0.25 nozzle` variants to the actual 0.25 nozzle printers (Adventurer 5M 0.25 + Adventurer 5M Pro 0.25). - Remove the redundant AD5X 0.4/0.6/0.8 entries from the base profiles where dedicated AD5X variants already exist. - Bump Flashforge profile version to 02.04.00.02. Each affected filament now resolves to exactly one preset per printer, and the previously uncovered AD5M 0.25 nozzle printers gain coverage. --- .../Flashforge ABS Basic @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge ABS Basic.json | 5 +---- .../Flashforge ASA Basic @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge ASA Basic.json | 5 +---- .../Flashforge HS PETG @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge HS PETG.json | 5 +---- .../Flashforge PETG Basic @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge PETG Pro @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PETG Pro.json | 5 +---- ...shforge PETG Transparent @FF AD5M 0.25 nozzle.json | 11 ++--------- .../filament/Flashforge PETG Transparent.json | 5 +---- .../Flashforge PLA Basic @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Basic.json | 5 +---- ...shforge PLA Color Change @FF AD5M 0.25 nozzle.json | 11 ++--------- .../filament/Flashforge PLA Color Change.json | 5 +---- .../Flashforge PLA Galaxy @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Galaxy.json | 5 +---- .../Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Luminous.json | 5 +---- .../Flashforge PLA Matte @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Matte.json | 5 +---- .../Flashforge PLA Metal @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Metal.json | 5 +---- .../Flashforge PLA Pro @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Pro.json | 5 +---- .../Flashforge PLA Silk @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Silk.json | 5 +---- .../Flashforge PLA Sparkle @FF AD5M 0.25 nozzle.json | 11 ++--------- .../Flashforge/filament/Flashforge PLA Sparkle.json | 5 +---- 29 files changed, 44 insertions(+), 191 deletions(-) diff --git a/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF AD5M 0.25 nozzle.json index 972f78447d..c84d934a9c 100644 --- a/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge ABS Basic @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge ABS Basic @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge ABS Basic.json b/resources/profiles/Flashforge/filament/Flashforge ABS Basic.json index e5bb08f036..de58140d42 100644 --- a/resources/profiles/Flashforge/filament/Flashforge ABS Basic.json +++ b/resources/profiles/Flashforge/filament/Flashforge ABS Basic.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF AD5M 0.25 nozzle.json index cc923f33d8..61baec4f3f 100644 --- a/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge ASA Basic @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge ASA Basic @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge ASA Basic.json b/resources/profiles/Flashforge/filament/Flashforge ASA Basic.json index 6ba697f4a5..52f1d0f4c6 100644 --- a/resources/profiles/Flashforge/filament/Flashforge ASA Basic.json +++ b/resources/profiles/Flashforge/filament/Flashforge ASA Basic.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF AD5M 0.25 nozzle.json index a90a1cd188..a924689ecb 100644 --- a/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge HS PETG @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge HS PETG @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge HS PETG.json b/resources/profiles/Flashforge/filament/Flashforge HS PETG.json index bea98c5296..2a2eff18d6 100644 --- a/resources/profiles/Flashforge/filament/Flashforge HS PETG.json +++ b/resources/profiles/Flashforge/filament/Flashforge HS PETG.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF AD5M 0.25 nozzle.json index 6c04a0fe53..1cf707d879 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Basic @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PETG Basic @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF AD5M 0.25 nozzle.json index f8c174545a..4895a32ac1 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Pro @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PETG Pro @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Pro.json b/resources/profiles/Flashforge/filament/Flashforge PETG Pro.json index 40a0cd628d..d3f2c1e368 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PETG Pro.json +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Pro.json @@ -32,9 +32,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF AD5M 0.25 nozzle.json index 174c49edd4..7b6452f09b 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PETG Transparent @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PETG Transparent.json b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent.json index c691ad3ca8..b0fbcaa926 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PETG Transparent.json +++ b/resources/profiles/Flashforge/filament/Flashforge PETG Transparent.json @@ -32,9 +32,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF AD5M 0.25 nozzle.json index 5e86fb8495..f25a820853 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Basic @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Basic @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Basic.json b/resources/profiles/Flashforge/filament/Flashforge PLA Basic.json index 03d99eba73..2a6aed4d67 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Basic.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Basic.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF AD5M 0.25 nozzle.json index 159ef1115a..a2cc3538a2 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Color Change @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Color Change.json b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change.json index 7eaff38a4d..aba1710ad0 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Color Change.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Color Change.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF AD5M 0.25 nozzle.json index 3b10b2f79e..10e7389345 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Galaxy @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy.json b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy.json index c110cea783..616238dc11 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Galaxy.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json index 7707d3224f..08746aef86 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Luminous @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Luminous.json b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous.json index ff7f078a41..10b3a0ea84 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Luminous.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Luminous.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF AD5M 0.25 nozzle.json index 004fab4369..0d973f7034 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Matte @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Matte @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Matte.json b/resources/profiles/Flashforge/filament/Flashforge PLA Matte.json index 8045ee5892..8fdbb59b6c 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Matte.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Matte.json @@ -17,9 +17,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF AD5M 0.25 nozzle.json index 92267b8cb0..9a71005126 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Metal @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Metal @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Metal.json b/resources/profiles/Flashforge/filament/Flashforge PLA Metal.json index 815c53cc69..e8a9c55780 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Metal.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Metal.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF AD5M 0.25 nozzle.json index 292232d148..fa468c42bd 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Pro @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Pro @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Pro.json b/resources/profiles/Flashforge/filament/Flashforge PLA Pro.json index 1c32af871f..a263fa1ebc 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Pro.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Pro.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF AD5M 0.25 nozzle.json index 80b1951ba5..7cac8ae630 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Silk @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Silk @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Silk.json b/resources/profiles/Flashforge/filament/Flashforge PLA Silk.json index 604c013001..f080d5d4c4 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Silk.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Silk.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF AD5M 0.25 nozzle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF AD5M 0.25 nozzle.json index 9d717ea0c9..81efaf0b03 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF AD5M 0.25 nozzle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle @FF AD5M 0.25 nozzle.json @@ -9,14 +9,7 @@ "Flashforge PLA Sparkle @FF AD5M 0.25 nozzle" ], "compatible_printers": [ - "Flashforge Adventurer 5M 0.4 Nozzle", - "Flashforge Adventurer 5M 0.6 Nozzle", - "Flashforge Adventurer 5M 0.8 Nozzle", - "Flashforge Adventurer 5M Pro 0.4 Nozzle", - "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M 0.25 Nozzle", + "Flashforge Adventurer 5M Pro 0.25 Nozzle" ] } diff --git a/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle.json b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle.json index 3472774a0b..a59b7e347b 100644 --- a/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle.json +++ b/resources/profiles/Flashforge/filament/Flashforge PLA Sparkle.json @@ -14,9 +14,6 @@ "Flashforge Adventurer 5M 0.8 Nozzle", "Flashforge Adventurer 5M Pro 0.4 Nozzle", "Flashforge Adventurer 5M Pro 0.6 Nozzle", - "Flashforge Adventurer 5M Pro 0.8 Nozzle", - "Flashforge AD5X 0.4 nozzle", - "Flashforge AD5X 0.6 nozzle", - "Flashforge AD5X 0.8 nozzle" + "Flashforge Adventurer 5M Pro 0.8 Nozzle" ] } From 4c3e30144d3354deb105ac8ea33f908721c1ad50 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 24 Jun 2026 14:58:33 +0800 Subject: [PATCH 5/8] Show a warning dialog about profile sync changes. (#14377) --- src/slic3r/GUI/GUI_App.cpp | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index b46273d64a..89e2338c55 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -940,6 +940,33 @@ void GUI_App::post_init() }); } + // Orca: notify users upgrading from a pre-2.4.0 version that profile syncing + // moved from Bambu Cloud to Orca Cloud. + if (is_editor() && m_last_config_version && m_last_config_version->valid() + && *m_last_config_version < Semver(2, 4, 0)) { + CallAfter([] { + const wxString wiki_url = "https://www.orcaslicer.com/wiki/user_profiles/user_profiles.html#profiles-missing-after-updating-from-bambu-cloud"; + MessageDialog dlg(nullptr, + _L("Since version 2.4.0, OrcaSlicer syncs user profiles through Orca Cloud instead of Bambu Cloud.\n\n" + "To migrate your existing profiles, log in to Orca Cloud and they will be transferred automatically. " + "If any profiles are still missing afterwards, follow the guide in our wiki to restore them.\n\n" + "If you did not use Bambu Cloud to sync profiles, this change does not affect you and you can safely ignore this message."), + _L("Profile syncing change"), + wxOK, + "", + _L("Learn more"), + [wiki_url](const wxString &) { wxLaunchDefaultBrowser(wiki_url); }); + // Hack: the "Learn more" link renders the message in a wxHtmlWindow whose + // height is underestimated for multi-paragraph text, leaving a scrollbar. + // The html sits in a proportion-1 sizer chain, so grow the dialog (never + // shrink it below its content width) to give the text enough room. + const wxSize sz = dlg.GetSize(); + dlg.SetSize(std::max(sz.x, dlg.FromDIP(280)), std::max(sz.y, dlg.FromDIP(200))); + dlg.CenterOnParent(); + dlg.ShowModal(); + }); + } + if(!m_networking_need_update && m_agent) { m_agent->set_on_ssdp_msg_fn( [this](std::string json_str) { @@ -2772,8 +2799,9 @@ bool GUI_App::on_init_inner() } } - if(app_config->get("version") != SLIC3R_VERSION) { - app_config->set("version", SLIC3R_VERSION); + //Orca: write OrcaSlicer version + if(app_config->get("version") != SoftFever_VERSION) { + app_config->set("version", SoftFever_VERSION); } // Orca: use wxWeakRef to provent wild pointer. From 045179150f8f85d6c27431acb41ad21a4e9c1d5b Mon Sep 17 00:00:00 2001 From: Kiss Lorand <50251547+kisslorand@users.noreply.github.com> Date: Wed, 24 Jun 2026 10:48:31 +0300 Subject: [PATCH 6/8] Refactor skirt/brim + bugfixes related to them (#14333) Refactor skirt and brim ownership and emission flow Refactor skirt and brim generation around a common object/group ownership model. Skirts and brims are now emitted as a coordinated preamble (skirt -> brim -> object) instead of being generated and emitted through multiple independent code paths. Changes: - Fix repeated skirt emission caused by the previous skirt state tracking logic. - Restore local skirt/brim ordering for per-object skirts in By Layer mode. - Emit brims together with their owning object or object group. - Handle combined brims independently from skirt grouping. - Handle draft shields through the same ownership model as skirts. - Fix draft shield generation when skirt height is zero. - Generate draft shields after brim geometry is known, preventing draft shields from overlapping brims. - Reject unsafe grouped per-object skirt configurations in By Object mode. - Remove legacy skirt emission paths and state-management workarounds. Support brim generation remains unchanged. Co-authored-by: SoftFever --- src/libslic3r/Brim.cpp | 38 ++++-- src/libslic3r/Brim.hpp | 3 + src/libslic3r/GCode.cpp | 248 ++++++++++++++++++---------------------- src/libslic3r/GCode.hpp | 13 ++- src/libslic3r/Print.cpp | 149 ++++++++++++++++++------ src/libslic3r/Print.hpp | 18 ++- 6 files changed, 282 insertions(+), 187 deletions(-) diff --git a/src/libslic3r/Brim.cpp b/src/libslic3r/Brim.cpp index 814ebf7f7c..91d72faa70 100644 --- a/src/libslic3r/Brim.cpp +++ b/src/libslic3r/Brim.cpp @@ -833,8 +833,7 @@ Polygons tryExPolygonOffset(const ExPolygons& islandAreaEx, const Print& print) } return loops; } -//BBS: a function creates the ExtrusionEntityCollection from the brim area defined by ExPolygons -ExtrusionEntityCollection makeBrimInfill(const ExPolygons& singleBrimArea, const Print& print, const Polygons& islands_area) { +static ExtrusionEntityCollection makeBrimInfillImpl(const ExPolygons& singleBrimArea, const Print& print, const Polygons& islands_area, bool apply_plate_offset) { Polygons loops = tryExPolygonOffset(singleBrimArea, print); Flow flow = print.brim_flow(); loops = union_pt_chained_outside_in(loops); @@ -864,16 +863,29 @@ ExtrusionEntityCollection makeBrimInfill(const ExPolygons& singleBrimArea, const optimize_polylines_by_reversing(&all_loops); all_loops = connect_brim_lines(std::move(all_loops), offset(singleBrimArea, float(SCALED_EPSILON)), float(flow.scaled_spacing()) * 2.f); - //BBS: finally apply the plate offset which may very large - auto plate_offset = print.get_plate_origin(); - Point scaled_plate_offset = Point(scaled(plate_offset.x()), scaled(plate_offset.y())); - for (Polyline& one_loop : all_loops) - one_loop.translate(scaled_plate_offset); + if (apply_plate_offset) { + //BBS: finally apply the plate offset which may very large + auto plate_offset = print.get_plate_origin(); + Point scaled_plate_offset = Point(scaled(plate_offset.x()), scaled(plate_offset.y())); + for (Polyline& one_loop : all_loops) + one_loop.translate(scaled_plate_offset); + } extrusion_entities_append_loops_and_paths(brim.entities, std::move(all_loops), erBrim, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height())); return brim; } +//BBS: a function creates the ExtrusionEntityCollection from the brim area defined by ExPolygons +ExtrusionEntityCollection makeBrimInfill(const ExPolygons& singleBrimArea, const Print& print, const Polygons& islands_area) +{ + return makeBrimInfillImpl(singleBrimArea, print, islands_area, true); +} + +ExtrusionEntityCollection makeBrimInfillFromPlateCoordinates(const ExPolygons& singleBrimArea, const Print& print, const Polygons& islands_area) +{ + return makeBrimInfillImpl(singleBrimArea, print, islands_area, false); +} + //BBS: an overload of the orignal brim generator that generates the brim by obj and by extruders void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_area, std::map& brimMap, @@ -943,11 +955,13 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ if (supportBrimAreasOut != nullptr) *supportBrimAreasOut = translate_area_map(supportBrimAreaMap); - const bool combine_brims = print.config().combine_brims.value; - const bool is_by_object = (print.config().print_sequence == PrintSequence::ByObject); - const bool can_combine_brims = combine_brims && !is_by_object; + const bool has_per_object_skirt_or_shield = print.config().skirt_type == stPerObject && + (print.has_skirt() || print.has_infinite_skirt()); + const bool combine_brims = print.config().combine_brims.value && + !has_per_object_skirt_or_shield && + print.config().print_sequence != PrintSequence::ByObject; - if (!can_combine_brims) { + if (!combine_brims) { // Orca: Generate brims separately when brims cannot be combined. for (auto iter = brimAreaMap.begin(); iter != brimAreaMap.end(); ++iter) { if (!iter->second.empty()) { @@ -960,7 +974,7 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_ }; } } else { - // Orca: Unified brim mode (non-sequential printing) + // Orca: Unified brim mode. ExPolygons all_brims_merged; std::vector brim_object_ids; diff --git a/src/libslic3r/Brim.hpp b/src/libslic3r/Brim.hpp index 52f7d741e3..2afd812247 100644 --- a/src/libslic3r/Brim.hpp +++ b/src/libslic3r/Brim.hpp @@ -24,6 +24,9 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, std::map* objectBrimAreasOut = nullptr, std::map* supportBrimAreasOut = nullptr); +ExtrusionEntityCollection makeBrimInfill(const ExPolygons& singleBrimArea, const Print& print, const Polygons& islands_area); +ExtrusionEntityCollection makeBrimInfillFromPlateCoordinates(const ExPolygons& singleBrimArea, const Print& print, const Polygons& islands_area); + // BBS: automatically make brim ExtrusionEntityCollection make_brim_auto(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area); diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index 96e745a9d2..3cf54d00dc 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2032,6 +2032,7 @@ void GCode::do_export(Print* print, const char* path, GCodeProcessorResult* resu // BBS m_curr_print = print; + m_skirt_group_done.clear(); GCodeWriter::full_gcode_comment = print->config().gcode_comments; CNumericLocalesSetter locales_setter; @@ -3223,6 +3224,11 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato // Ugly hack: Do not set the initial extruder if the extruder is primed using the MMU priming towers at the edge of the print bed. file.write(this->set_extruder(initial_extruder_id, 0.)); } + + this->m_objsWithBrim.clear(); + this->m_objSupportsWithBrim.clear(); + m_brim_done = false; + // BBS: set that indicates objs with brim for (auto iter = print.m_brimMap.begin(); iter != print.m_brimMap.end(); ++iter) { if (!iter->second.empty()) @@ -4282,7 +4288,8 @@ namespace Skirt { std::map> skirt_loops_per_extruder_out; //For sequential print, the following test may fail when extruding the 2nd and other objects. // assert(skirt_done.empty()); - if (skirt_done.empty() && print.has_skirt() && ! skirt.entities.empty() && layer_tools.has_skirt) { + const bool has_skirt_or_draft_shield = print.has_skirt() || print.has_infinite_skirt(); + if (skirt_done.empty() && has_skirt_or_draft_shield && ! skirt.entities.empty() && layer_tools.has_skirt) { skirt_loops_per_extruder_all_printing(print, skirt, layer_tools, skirt_loops_per_extruder_out); skirt_done.emplace_back(layer_tools.print_z); } @@ -4299,15 +4306,16 @@ namespace Skirt { // Extrude skirt at the print_z of the raft layers and normal object layers // not at the print_z of the interlaced support material layers. std::map> skirt_loops_per_extruder_out; - if (print.has_skirt() && ! skirt.entities.empty() && layer_tools.has_skirt && + const bool has_skirt_or_draft_shield = print.has_skirt() || print.has_infinite_skirt(); + if (has_skirt_or_draft_shield && ! skirt.entities.empty() && layer_tools.has_skirt && // Not enough skirt layers printed yet. //FIXME infinite or high skirt does not make sense for sequential print! (skirt_done.size() < (size_t)print.config().skirt_height.value || print.has_infinite_skirt())) { - bool valid = ! skirt_done.empty() && skirt_done.back() < layer_tools.print_z - EPSILON; - assert(valid); - // This print_z has not been extruded yet (sequential print) - // FIXME: The skirt_done should not be empty at this point. The check is a workaround - if (valid) { + assert(!skirt_done.empty()); + if (skirt_done.empty()) + return skirt_loops_per_extruder_out; + // This print_z has not been extruded yet. + if (skirt_done.back() < layer_tools.print_z - EPSILON) { #if 0 // Prime just the first printing extruder. This is original Slic3r's implementation. skirt_loops_per_extruder_out[layer_tools.extruders.front()] = std::pair(0, print.config().skirt_loops.value); @@ -4315,7 +4323,6 @@ namespace Skirt { // Prime all extruders planned for this layer, see skirt_loops_per_extruder_all_printing(print, skirt, layer_tools, skirt_loops_per_extruder_out); #endif - assert(!skirt_done.empty()); skirt_done.emplace_back(layer_tools.print_z); } } @@ -4382,7 +4389,8 @@ std::string GCode::generate_skirt(const Print &print, const float skirt_start_angle, const LayerTools &layer_tools, const Layer& layer, - unsigned int extruder_id) + unsigned int extruder_id, + std::vector &skirt_done) { bool first_layer = (layer.id() == 0 && abs(layer.bottom_z()) < EPSILON); @@ -4392,8 +4400,8 @@ std::string GCode::generate_skirt(const Print &print, // Map from extruder ID to index of skirt loops to be extruded with that extruder. std::map> skirt_loops_per_extruder; skirt_loops_per_extruder = first_layer ? - Skirt::make_skirt_loops_per_extruder_1st_layer(print, skirt, layer_tools, m_skirt_done) : - Skirt::make_skirt_loops_per_extruder_other_layers(print, skirt, layer_tools, m_skirt_done); + Skirt::make_skirt_loops_per_extruder_1st_layer(print, skirt, layer_tools, skirt_done) : + Skirt::make_skirt_loops_per_extruder_other_layers(print, skirt, layer_tools, skirt_done); if (auto loops_it = skirt_loops_per_extruder.find(extruder_id); loops_it != skirt_loops_per_extruder.end()) { const std::pair loops = loops_it->second; @@ -4401,7 +4409,7 @@ std::string GCode::generate_skirt(const Print &print, set_origin(unscaled(offset)); m_avoid_crossing_perimeters.use_external_mp(); - Flow layer_skirt_flow = print.skirt_flow().with_height(float(m_skirt_done.back() - (m_skirt_done.size() == 1 ? 0. : m_skirt_done[m_skirt_done.size() - 2]))); + Flow layer_skirt_flow = print.skirt_flow().with_height(float(skirt_done.back() - (skirt_done.size() == 1 ? 0. : skirt_done[skirt_done.size() - 2]))); double mm3_per_mm = layer_skirt_flow.mm3_per_mm(); // Decide where to start looping: // - If it’s the first layer or if we do NOT want a single-wall skirt/draft shield, @@ -4443,6 +4451,84 @@ std::string GCode::generate_skirt(const Print &print, return gcode; } +static size_t find_skirt_brim_group_idx(const Print& print, ObjectID object_id) +{ + const std::vector& groups = print.skirt_brim_groups(); + for (size_t idx = 0; idx < groups.size(); ++idx) + if (std::find(groups[idx].object_ids.begin(), groups[idx].object_ids.end(), object_id) != groups[idx].object_ids.end()) + return idx; + return size_t(-1); +} + +std::string GCode::generate_object_skirt_group(const Print &print, + const PrintObject &object, + const LayerTools &layer_tools, + const Layer& layer, + unsigned int extruder_id) +{ + if (print.config().skirt_type != stPerObject || print.skirt_brim_groups().empty()) + return {}; + + const size_t group_idx = find_skirt_brim_group_idx(print, object.id()); + if (group_idx == size_t(-1) || print.skirt_brim_groups()[group_idx].skirt.empty()) + return {}; + + LayerTools object_skirt_tools = layer_tools; + object_skirt_tools.extruders = { extruder_id }; + object_skirt_tools.has_skirt = true; + + return generate_skirt(print, print.skirt_brim_groups()[group_idx].skirt, Point(0, 0), object.config().skirt_start_angle, + object_skirt_tools, layer, extruder_id, m_skirt_group_done[group_idx]); +} + +std::string GCode::generate_object_brim(const Print &print, const PrintObject &object, bool first_layer) +{ + if (!first_layer) + return {}; + + auto emit_brim = [this](const ExtrusionEntityCollection& brim, const std::vector& object_ids) { + std::string gcode; + const bool already_emitted = std::none_of(object_ids.begin(), object_ids.end(), [this](ObjectID object_id) { + return m_objsWithBrim.find(object_id) != m_objsWithBrim.end(); + }); + if (already_emitted || brim.empty()) + return gcode; + + this->set_origin(0., 0.); + m_avoid_crossing_perimeters.use_external_mp(); + for (const ExtrusionEntity* ee : brim.entities) + if (ee != nullptr) + gcode += this->extrude_entity(*ee, "brim", m_config.support_speed.value); + m_avoid_crossing_perimeters.use_external_mp(false); + m_avoid_crossing_perimeters.disable_once(); + for (ObjectID object_id : object_ids) + m_objsWithBrim.erase(object_id); + return gcode; + }; + + const bool has_per_object_skirt_or_shield = print.config().skirt_type == stPerObject && + (print.has_skirt() || print.has_infinite_skirt()); + if (print.config().combine_brims && !has_per_object_skirt_or_shield && + print.config().print_sequence != PrintSequence::ByObject && print.m_brimMap.size() == 1) { + const auto brim_it = print.m_brimMap.begin(); + return emit_brim(brim_it->second, { brim_it->first }); + } + + const size_t group_idx = find_skirt_brim_group_idx(print, object.id()); + if (group_idx != size_t(-1)) { + std::string gcode; + for (const Print::SkirtBrimGroup::Brim& brim : print.skirt_brim_groups()[group_idx].brims) + if (std::find(brim.object_ids.begin(), brim.object_ids.end(), object.id()) != brim.object_ids.end()) + gcode += emit_brim(brim.brim, brim.object_ids); + return gcode; + } + + const auto brim_it = print.m_brimMap.find(object.id()); + if (brim_it == print.m_brimMap.end()) + return {}; + return emit_brim(brim_it->second, { object.id() }); +} + // In sequential mode, process_layer is called once per each object and its copy, // therefore layers will contain a single entry and single_object_instance_idx will point to the copy of the object. // In non-sequential mode, process_layer is called per each print_z height with all object and support layers accumulated. @@ -4554,8 +4640,6 @@ LayerResult GCode::process_layer( } PrinterStructure printer_structure = m_config.printer_structure.value; - PrintSequence print_sequence = m_config.print_sequence; - bool sequence_by_layer = print_sequence == PrintSequence::ByLayer; bool is_i3_printer = printer_structure == PrinterStructure::psI3; bool is_multi_extruder = m_config.nozzle_diameter.size() > 1; @@ -5151,27 +5235,17 @@ LayerResult GCode::process_layer( bool has_insert_wrapping_detection_gcode = false; // Extrude the skirt, brim, support, perimeters, infill ordered by the extruders. + m_skirt_group_done.resize(print.skirt_brim_groups().size()); for (unsigned int extruder_id : layer_tools.extruders) { - if ((print.config().skirt_type == stCombined || - (print.config().skirt_type == stPerObject && print.config().print_sequence == PrintSequence::ByLayer)) && - !print.skirt_groups().empty()) { - bool skirt_generated_for_current_print_z = false; - for (const ExtrusionEntityCollection& skirt_group : print.skirt_groups()) { - if (skirt_group.empty()) + if (print.config().skirt_type == stCombined && !print.skirt_brim_groups().empty()) { + for (size_t group_idx = 0; group_idx < print.skirt_brim_groups().size(); ++group_idx) { + const Print::SkirtBrimGroup& group = print.skirt_brim_groups()[group_idx]; + if (group.skirt.empty()) continue; - // Orca: each grouped skirt is emitted as its own collection so higher skirt layers - // follow the same per-group behavior as the first layer. - if (first_layer) - m_skirt_done.clear(); - else if (skirt_generated_for_current_print_z && !m_skirt_done.empty()) - m_skirt_done.pop_back(); - - std::string skirt_gcode = generate_skirt(print, skirt_group, Point(0, 0), layer.object()->config().skirt_start_angle, - layer_tools, layer, extruder_id); - if (!skirt_gcode.empty()) - skirt_generated_for_current_print_z = true; + std::string skirt_gcode = generate_skirt(print, group.skirt, Point(0, 0), layer.object()->config().skirt_start_angle, + layer_tools, layer, extruder_id, m_skirt_group_done[group_idx]); gcode += std::move(skirt_gcode); } } @@ -5245,108 +5319,20 @@ LayerResult GCode::process_layer( std::vector &instances_to_print = filament_to_print_instances[extruder_id]; - // BBS - if (print.config().skirt_type == stPerObject && - print.config().print_sequence == PrintSequence::ByObject && - !layer.object()->object_skirt().empty() && - ((layer.id() < print.config().skirt_height || print.config().draft_shield == DraftShield::dsEnabled)) - ) - { - for (InstanceToPrint& instance_to_print : instances_to_print) { - - if (instance_to_print.print_object.object_skirt().empty()) - continue; - - if (this->m_objSupportsWithBrim.find(instance_to_print.print_object.id()) != this->m_objSupportsWithBrim.end() && - print.m_supportBrimMap.at(instance_to_print.print_object.id()).entities.size() > 0) - continue; - - if (this->m_objsWithBrim.find(instance_to_print.print_object.id()) != this->m_objsWithBrim.end() && - print.m_brimMap.at(instance_to_print.print_object.id()).entities.size() > 0) - continue; - if (first_layer) - m_skirt_done.clear(); - - if (layer.id() == 1 && m_skirt_done.size() > 1) - m_skirt_done.erase(m_skirt_done.begin()+1,m_skirt_done.end()); - - const Point& offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; - gcode += generate_skirt(print, instance_to_print.print_object.object_skirt(), offset, instance_to_print.print_object.config().skirt_start_angle, layer_tools, layer, extruder_id); - } - } - - // Orca: Print unified global brim after the skirt and before any object. - // Only do this if `combine_brims` is enabled and we are printing by layer. - if (first_layer && sequence_by_layer && m_config.combine_brims && !print.m_brimMap.empty()) { - const ObjectID unified_object_id = [&]() -> ObjectID { - ObjectID id; - for (const auto& [obj_id, brim] : print.m_brimMap) { - const bool has_printable_entities = std::any_of(brim.entities.begin(), brim.entities.end(), - [](const ExtrusionEntity* ee) { return ee != nullptr; }); - if (!has_printable_entities) - continue; - - if (id.valid()) - return ObjectID(); - - id = obj_id; - } - return id; - }(); - - if (unified_object_id.valid() && this->m_objsWithBrim.find(unified_object_id) != this->m_objsWithBrim.end()) { - const ExtrusionEntityCollection& unified_brim = print.m_brimMap.at(unified_object_id); - this->set_origin(0., 0.); - for (const ExtrusionEntity* ee : unified_brim.entities) - if (ee != nullptr) - gcode += this->extrude_entity(*ee, "brim", m_config.support_speed.value); - - // Mark brim as printed for this object to avoid per-object brim emission later. - this->m_objsWithBrim.erase(unified_object_id); - } - } - // We are almost ready to print. However, we must go through all the objects twice to print the overridden extrusions first (infill/perimeter wiping feature): std::vector by_region_per_copy_cache; for (int print_wipe_extrusions = is_anything_overridden; print_wipe_extrusions>=0; --print_wipe_extrusions) { if (is_anything_overridden && print_wipe_extrusions == 0) gcode+="; PURGING FINISHED\n"; - bool skirt_generated_for_current_print_z = false; - for (InstanceToPrint &instance_to_print : instances_to_print) { - if (print.config().skirt_type == stPerObject && - !instance_to_print.print_object.object_skirt().empty() && - print.config().print_sequence == PrintSequence::ByLayer) - { - const LayerToPrint& layer_to_print = layers[instance_to_print.layer_id]; - const Layer* skirt_layer = layer_to_print.object_layer; - if (skirt_layer == nullptr && layer_to_print.support_layer != nullptr && - layer_to_print.support_layer->id() < layer_to_print.support_layer->object()->slicing_parameters().raft_layers()) { - skirt_layer = layer_to_print.support_layer; - } - - if (skirt_layer != nullptr && - (skirt_layer->id() < print.config().skirt_height || print.config().draft_shield == DraftShield::dsEnabled)) { - const bool skirt_first_layer = (skirt_layer->id() == 0 && std::abs(skirt_layer->bottom_z()) < EPSILON); - if (skirt_first_layer) - m_skirt_done.clear(); - - if (skirt_generated_for_current_print_z && !m_skirt_done.empty()) - m_skirt_done.pop_back(); - - const Point& offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; - std::string skirt_gcode = generate_skirt(print, instance_to_print.print_object.object_skirt(), offset, - instance_to_print.print_object.config().skirt_start_angle, layer_tools, - *skirt_layer, extruder_id); - if (!skirt_gcode.empty()) - skirt_generated_for_current_print_z = true; - gcode += std::move(skirt_gcode); - } - } - const auto& inst = instance_to_print.print_object.instances()[instance_to_print.instance_id]; const LayerToPrint &layer_to_print = layers[instance_to_print.layer_id]; + if (print_wipe_extrusions == (is_anything_overridden ? 1 : 0)) { + gcode += generate_object_skirt_group(print, instance_to_print.print_object, layer_tools, layer, extruder_id); + gcode += generate_object_brim(print, instance_to_print.print_object, first_layer); + } + // To control print speed of the 1st object layer printed over raft interface. bool object_layer_over_raft = layer_to_print.object_layer && layer_to_print.object_layer->id() > 0 && instance_to_print.print_object.slicing_parameters().raft_layers() == layer_to_print.object_layer->id(); @@ -5445,20 +5431,6 @@ LayerResult GCode::process_layer( // Sequential tool path ordering of multiple parts within the same object, aka. perimeter tracking (#5511) for (ObjectByExtruder::Island &island : instance_to_print.object_by_extruder.islands) { const auto& by_region_specific = is_anything_overridden ? island.by_region_per_copy(by_region_per_copy_cache, static_cast(instance_to_print.instance_id), extruder_id, print_wipe_extrusions != 0) : island.by_region; - //BBS: add brim by obj by extruder - if (first_layer) { - if (this->m_objsWithBrim.find(instance_to_print.print_object.id()) != this->m_objsWithBrim.end() && !print_wipe_extrusions) { - this->set_origin(0., 0.); - m_avoid_crossing_perimeters.use_external_mp(); - for (const ExtrusionEntity* ee : print.m_brimMap.at(instance_to_print.print_object.id()).entities) { - gcode += this->extrude_entity(*ee, "brim", m_config.support_speed.value); - } - m_avoid_crossing_perimeters.use_external_mp(false); - // Allow a straight travel move to the first object point. - m_avoid_crossing_perimeters.disable_once(); - this->m_objsWithBrim.erase(instance_to_print.print_object.id()); - } - } // When starting a new object, use the external motion planner for the first travel move. const Point& offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift; std::pair this_object_copy(&instance_to_print.print_object, offset); diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp index 03e76a1eff..176af4c510 100644 --- a/src/libslic3r/GCode.hpp +++ b/src/libslic3r/GCode.hpp @@ -343,7 +343,16 @@ private: const float skirt_start_angle, const LayerTools &layer_tools, const Layer& layer, + unsigned int extruder_id, + std::vector &skirt_done); + std::string generate_object_skirt_group(const Print &print, + const PrintObject &object, + const LayerTools &layer_tools, + const Layer& layer, unsigned int extruder_id); + std::string generate_object_brim(const Print &print, + const PrintObject &object, + bool first_layer); LayerResult process_layer( const Print &print, @@ -609,8 +618,8 @@ private: std::unique_ptr m_small_area_infill_flow_compensator; - // Heights (print_z) at which the skirt has already been extruded. - std::vector m_skirt_done; + // Heights (print_z) at which each grouped skirt has already been extruded. + std::vector> m_skirt_group_done; // Has the brim been extruded already? Brim is being extruded only for the first object of a multi-object print. bool m_brim_done; // Flag indicating whether the nozzle temperature changes from 1st to 2nd layer were performed. diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 6be171750d..66ceb5aedf 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -2456,21 +2456,14 @@ void Print::process(long long *time_cost_with_cache, bool use_cache) start_time = (long long)Slic3r::Utils::get_current_time_utc(); m_skirt.clear(); - m_skirt_groups.clear(); + m_skirt_brim_groups.clear(); + m_has_shared_per_object_skirt = false; m_skirt_convex_hull.clear(); m_objectBrimAreas.clear(); m_supportBrimAreas.clear(); m_first_layer_convex_hull.points.clear(); for (PrintObject *object : m_objects) object->m_skirt.clear(); - const bool draft_shield = config().draft_shield != dsDisabled; - - if (this->has_skirt() && draft_shield) { - // In case that draft shield is active, generate skirt first so brim - // can be trimmed to make room for it. - _make_skirt(); - } - //BBS: get the objects' indices when GCodes are generated ToolOrdering tool_ordering; unsigned int initial_extruder_id = (unsigned int)-1; @@ -2561,11 +2554,16 @@ void Print::process(long long *time_cost_with_cache, bool use_cache) } - if (has_skirt() && ! draft_shield) { - // In case that draft shield is NOT active, generate skirt now. - // It will be placed around the brim, so brim has to be ready. + if (has_skirt() || has_infinite_skirt() || has_brim()) { + // Generate skirt/brim groups after brim so per-object and draft-shield footprints + // include brims when grouping and offsetting skirt loops. assert(m_skirt.empty()); _make_skirt(); + if (m_config.print_sequence == PrintSequence::ByObject && + m_config.skirt_type == stPerObject && + this->has_shared_per_object_skirt()) { + throw Slic3r::SlicingError(L("Per-object skirts cannot fit between the objects in By object print sequence.\n\nMove the objects farther apart, reduce brim/skirt size, switch Skirt type to Combined, or switch Print sequence to By layer.")); + } } this->finalize_first_layer_convex_hull(); @@ -2657,6 +2655,8 @@ std::string Print::export_gcode(const std::string& path_template, GCodeProcessor void Print::_make_skirt() { + const bool generate_skirt = this->has_skirt() || this->has_infinite_skirt(); + // First off we need to decide how tall the skirt must be. // The skirt_height option from config is expressed in layers, but our // object might have different layer heights, so we need to find the print_z @@ -2668,11 +2668,13 @@ void Print::_make_skirt() // prepended to the first 'n' layers (with 'n' = skirt_height). // $skirt_height_z in this case is the highest possible skirt height for safety. coordf_t skirt_height_z = 0.; - for (const PrintObject *object : m_objects) { - size_t skirt_layers = this->has_infinite_skirt() ? - object->layer_count() : - std::min(size_t(m_config.skirt_height.value), object->layer_count()); - skirt_height_z = std::max(skirt_height_z, object->m_layers[skirt_layers-1]->print_z); + if (generate_skirt) { + for (const PrintObject *object : m_objects) { + size_t skirt_layers = this->has_infinite_skirt() ? + object->layer_count() : + std::min(size_t(m_config.skirt_height.value), object->layer_count()); + skirt_height_z = std::max(skirt_height_z, object->m_layers[skirt_layers-1]->print_z); + } } struct ObjectSkirtHull { @@ -2686,7 +2688,7 @@ void Print::_make_skirt() Points object_points; // Get object layers up to skirt_height_z. for (const Layer *layer : object->m_layers) { - if (layer->print_z > skirt_height_z) + if (generate_skirt && layer->print_z > skirt_height_z) break; for (const ExPolygon &expoly : layer->lslices) // Collect the outer contour points only, ignore holes for the calculation of the convex hull. @@ -2694,7 +2696,7 @@ void Print::_make_skirt() } // Get support layers up to skirt_height_z. for (const SupportLayer *layer : object->support_layers()) { - if (layer->print_z > skirt_height_z) + if (generate_skirt && layer->print_z > skirt_height_z) break; layer->support_fills.collect_points(object_points); } @@ -2784,17 +2786,15 @@ void Print::_make_skirt() }; m_skirt.clear(); - m_skirt_groups.clear(); + m_skirt_brim_groups.clear(); + m_has_shared_per_object_skirt = false; + for (const ObjectSkirtHull& object_hull : object_convex_hulls) + object_hull.object->m_skirt.clear(); - if (m_config.skirt_type == stPerObject && m_config.print_sequence == PrintSequence::ByObject) { - for (const ObjectSkirtHull& object_hull : object_convex_hulls) { - object_hull.object->m_skirt.clear(); - append_skirt_loops_for_hull(object_hull.hull, object_hull.object->m_skirt, false); - object_hull.object->m_skirt.reverse(); - } - } else if (m_config.skirt_type == stCombined || m_config.skirt_type == stPerObject) { + if (m_config.skirt_type == stCombined || m_config.skirt_type == stPerObject) { struct SkirtGroupItem { Points occupied_points; + ObjectID object_id; bool emits_skirt; }; @@ -2824,13 +2824,13 @@ void Print::_make_skirt() continue; // Orca: include the object's brim/support-brim footprint before checking skirt collisions. - group_items.push_back({ std::move(occupied_points), true }); + group_items.push_back({ std::move(occupied_points), object->id(), true }); } // Orca: the wipe tower contributes occupied area, but does not emit a skirt by itself. Points wipe_tower_points = this->first_layer_wipe_tower_corners(); if (wipe_tower_points.size() >= 3) - group_items.push_back({ std::move(wipe_tower_points), false }); + group_items.push_back({ std::move(wipe_tower_points), ObjectID(), false }); std::vector parent(group_items.size()); std::iota(parent.begin(), parent.end(), 0); @@ -2856,14 +2856,17 @@ void Print::_make_skirt() auto build_grouped_points = [&]() { struct GroupData { - Points points; - bool emits_skirt = false; + Points points; + std::vector object_ids; + bool emits_skirt = false; }; std::map grouped; for (size_t i = 0; i < group_items.size(); ++i) { GroupData& group = grouped[find_parent(i)]; append(group.points, group_items[i].occupied_points); + if (group_items[i].object_id.valid()) + group.object_ids.push_back(group_items[i].object_id); group.emits_skirt = group.emits_skirt || group_items[i].emits_skirt; } return grouped; @@ -2902,19 +2905,99 @@ void Print::_make_skirt() } } + auto make_group_brims = [this](const std::vector& group_object_ids) { + std::vector brims; + std::vector brim_object_ids; + for (ObjectID object_id : group_object_ids) { + const auto brim_it = m_brimMap.find(object_id); + if (brim_it != m_brimMap.end() && !brim_it->second.empty()) + brim_object_ids.push_back(object_id); + } + + const bool global_combined_brim = m_config.combine_brims && m_config.skirt_type != stPerObject && m_brimMap.size() == 1; + auto brim_owner_ids = [&group_object_ids, global_combined_brim](const std::vector& object_ids) { + return global_combined_brim ? group_object_ids : object_ids; + }; + + const bool combine_group_brims = m_config.combine_brims && brim_object_ids.size() > 1; + if (!combine_group_brims) { + for (ObjectID object_id : brim_object_ids) + brims.push_back({ m_brimMap.at(object_id), brim_owner_ids({ object_id }) }); + return brims; + } + + std::vector brim_parent(brim_object_ids.size()); + std::iota(brim_parent.begin(), brim_parent.end(), 0); + auto find_brim_parent = [&brim_parent](size_t idx) { + while (brim_parent[idx] != idx) { + brim_parent[idx] = brim_parent[brim_parent[idx]]; + idx = brim_parent[idx]; + } + return idx; + }; + auto unite_brims = [&brim_parent, &find_brim_parent](size_t a, size_t b) { + a = find_brim_parent(a); + b = find_brim_parent(b); + if (a != b) + brim_parent[b] = a; + }; + + const coord_t brim_contact_distance = coord_t(brim_flow().scaled_spacing() * 2.); + for (size_t i = 0; i < brim_object_ids.size(); ++i) { + const auto area_i = m_objectBrimAreas.find(brim_object_ids[i]); + if (area_i == m_objectBrimAreas.end()) + continue; + for (size_t j = i + 1; j < brim_object_ids.size(); ++j) { + const auto area_j = m_objectBrimAreas.find(brim_object_ids[j]); + if (area_j != m_objectBrimAreas.end() && + !intersection_ex(offset_ex(area_i->second, brim_contact_distance, jtRound, SCALED_RESOLUTION), area_j->second).empty()) + unite_brims(i, j); + } + } + + std::map> combined_brim_ids; + for (size_t i = 0; i < brim_object_ids.size(); ++i) + combined_brim_ids[find_brim_parent(i)].push_back(brim_object_ids[i]); + + for (const auto& [_, object_ids] : combined_brim_ids) { + if (object_ids.size() == 1) { + brims.push_back({ m_brimMap.at(object_ids.front()), brim_owner_ids(object_ids) }); + continue; + } + + ExPolygons combined_area; + for (ObjectID object_id : object_ids) + expolygons_append(combined_area, m_objectBrimAreas.at(object_id)); + combined_area = union_ex(combined_area); + const float scaled_resolution = float(scaled(m_config.resolution.value)); + const float brim_cleanup_delta = std::max(scaled_resolution, float(SCALED_EPSILON)); + combined_area = offset2_ex(combined_area, brim_cleanup_delta, -brim_cleanup_delta, jtRound, scaled_resolution); + + Polygons islands_area; + brims.push_back({ makeBrimInfillFromPlateCoordinates(combined_area, *this, islands_area), object_ids }); + } + + return brims; + }; + auto grouped_points = build_grouped_points(); for (auto& [_, group] : grouped_points) { if (!group.emits_skirt || group.points.size() < 3) continue; + if (generate_skirt && m_config.skirt_type == stPerObject && group.object_ids.size() > 1) + m_has_shared_per_object_skirt = true; // Orca: after merging, use the occupied outline directly; do not add skirt distance twice. ExtrusionEntityCollection group_skirt; - append_skirt_loops_for_hull(Geometry::convex_hull(group.points), group_skirt, true); + if (generate_skirt) + append_skirt_loops_for_hull(Geometry::convex_hull(group.points), group_skirt, true); + std::vector group_brims = make_group_brims(group.object_ids); if (!group_skirt.empty()) { group_skirt.reverse(); // Orca: keep m_skirt as a flattened compatibility mirror for preview/extents. m_skirt.append(group_skirt.entities); - m_skirt_groups.push_back(std::move(group_skirt)); } + if (!group_skirt.empty() || !group_brims.empty()) + m_skirt_brim_groups.push_back({ std::move(group_skirt), std::move(group.object_ids), std::move(group_brims) }); } } } diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index f186968846..aed2dd68e4 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -970,8 +970,21 @@ public: PrintObjectPtrs& objects_mutable() { return m_objects; } PrintRegionPtrs& print_regions_mutable() { return m_print_regions; } std::vector layers_sorted_for_object(float start, float end, std::vector &layers_of_objects, std::vector &boundingBox_for_objects, VecOfPoints& objects_instances_shift); + struct SkirtBrimGroup { + struct Brim { + ExtrusionEntityCollection brim; + std::vector object_ids; + }; + + ExtrusionEntityCollection skirt; + std::vector object_ids; + // Brims stay separate unless Combine brims merges colliding brims inside this group. + std::vector brims; + }; + const ExtrusionEntityCollection& skirt() const { return m_skirt; } - const std::vector& skirt_groups() const { return m_skirt_groups; } + const std::vector& skirt_brim_groups() const { return m_skirt_brim_groups; } + bool has_shared_per_object_skirt() const { return m_has_shared_per_object_skirt; } // Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line. // It encompasses the object extrusions, support extrusions, skirt, brim, wipe tower. // It does NOT encompass user extrusions generated by custom G-code, @@ -1145,7 +1158,8 @@ private: // Ordered collections of extrusion paths to build skirt loops and brim. ExtrusionEntityCollection m_skirt; - std::vector m_skirt_groups; + std::vector m_skirt_brim_groups; + bool m_has_shared_per_object_skirt { false }; // BBS: collecting extrusion paths to build brim by objs std::map m_brimMap; std::map m_supportBrimMap; From a6816d8c0d994dc60045aed6974bcd2d00d8445e Mon Sep 17 00:00:00 2001 From: "Markus K." <13160892+MarkusKgit@users.noreply.github.com> Date: Wed, 24 Jun 2026 11:23:55 +0200 Subject: [PATCH 7/8] Fix hyperlink for flow ratio calibration wiki (#14378) --- src/slic3r/GUI/calib_dlg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/calib_dlg.cpp b/src/slic3r/GUI/calib_dlg.cpp index 5a06b24427..8cf33c3851 100644 --- a/src/slic3r/GUI/calib_dlg.cpp +++ b/src/slic3r/GUI/calib_dlg.cpp @@ -1506,7 +1506,7 @@ FlowRateCalibrationDialog::FlowRateCalibrationDialog(wxWindow* parent, wxWindowI auto dlg_btns = new DialogButtons(this, {"OK"}); auto bottom_sizer = new wxBoxSizer(wxHORIZONTAL); - auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/calibration/flow-ratio-calib"); + auto wiki = new HyperLink(this, _L("Wiki Guide"), "https://www.orcaslicer.com/wiki/flow_ratio_calib"); bottom_sizer->Add(wiki, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(20)); bottom_sizer->AddStretchSpacer(); bottom_sizer->Add(dlg_btns, 0, wxEXPAND); From 0b77321d3a5b74301809e2474902ee262851858a Mon Sep 17 00:00:00 2001 From: SoftFever Date: Wed, 24 Jun 2026 19:16:15 +0800 Subject: [PATCH 8/8] bump flashforge profile version --- resources/profiles/Flashforge.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/profiles/Flashforge.json b/resources/profiles/Flashforge.json index da8160ea01..23b81bb56e 100644 --- a/resources/profiles/Flashforge.json +++ b/resources/profiles/Flashforge.json @@ -1,7 +1,7 @@ { "name": "Flashforge", "url": "", - "version": "02.04.00.02", + "version": "02.04.00.03", "force_update": "0", "description": "Flashforge configurations", "machine_model_list": [