From ffe5e0c012eaef90fb5c97a648dcf43796326c47 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 16 Mar 2026 19:31:18 +0800 Subject: [PATCH 01/46] feature add printer info sync entrance. --- src/slic3r/GUI/Plater.cpp | 101 +++++++++++++++++++++++++++++++++----- 1 file changed, 88 insertions(+), 13 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 20ae8863e7a..da9a63fa95b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -645,6 +645,7 @@ struct Sidebar::priv // BBS printer config StaticBox* m_panel_printer_title = nullptr; ScalableButton* m_printer_icon = nullptr; + ScalableButton* m_printerinfo_syncbtn = nullptr; ScalableButton* m_printer_setting = nullptr; wxStaticText* m_text_printer_settings = nullptr; wxPanel* m_panel_printer_content = nullptr; @@ -988,17 +989,77 @@ Sidebar::Sidebar(Plater *parent) p->m_printer_icon = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "printer"); p->m_text_printer_settings = new Label(p->m_panel_printer_title, _L("Printer"), LB_PROPAGATE_MOUSE_EVENT); - p->m_printer_icon->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) { - //auto wizard_t = new ConfigWizard(wxGetApp().mainframe); - //wizard_t->run(ConfigWizard::RR_USER, ConfigWizard::SP_CUSTOM); - }); + // Use ams_fila_sync icon (sync_nozzle_info.svg does not exist in resources) + p->m_printerinfo_syncbtn = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "printer"); + p->m_printerinfo_syncbtn->SetToolTip(_L("sync nozzle info")); + p->m_printerinfo_syncbtn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { + bool hasConnectDevice = false; + auto devices = wxGetApp().app_config->get_devices(); + for (const auto& device : devices) { + if (device.connected) + hasConnectDevice = true; + } + + if (!hasConnectDevice) + { + // showdialog tips no connect device + wxTheApp->CallAfter([this]() { + MessageDialog dlg(wxGetApp().mainframe, + _L("No device connected. Please connect a printer in Home or Device page."), + _L("Unbound device"), wxOK); + dlg.ShowModal(); + }); + return; + } + + std::string machine_type = ""; + std::vector nozzle_diameters; + std::string device_name = ""; + std::shared_ptr host = nullptr; + wxGetApp().get_connect_host(host); + if (SSWCP::query_machine_info(host, machine_type, nozzle_diameters, device_name) && machine_type == "Snapmaker U1") + { + if (nozzle_diameters.size() <= 0) + { + wxTheApp->CallAfter([this]() { + MessageDialog dlgEx(wxGetApp().mainframe, + _L("No printer nozzle information detected. Please go to printer configuration nozzles."), + _L("Printer has no nozzle information"), wxOK); + dlgEx.ShowModal(); + }); + + return; + } + + bool res = false; + std::string headNozzleSize = nozzle_diameters[0]; + for (int i = 1; i < nozzle_diameters.size(); i++) + { + if (headNozzleSize != nozzle_diameters[i]) + { + res = true; + break; + } + } + if (res) + { + //select the someone nozzle size to show + return; + } + wxTheApp->CallAfter([this]() { + MessageDialog dlg_Ex(wxGetApp().mainframe, _L("Nozzle information synchronization successful"), + _L("Nozzle information synchronization results"), wxOK); + dlg_Ex.ShowModal(); + }); + } + + }); + p->m_printer_setting = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "settings"); + p->m_printer_setting->SetToolTip(_L("settings")); p->m_printer_setting->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { - // p->editing_filament = -1; - // wxGetApp().params_dialog()->Popup(); - // wxGetApp().get_tab(Preset::TYPE_FILAMENT)->restore_last_select_item(); wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS); }); @@ -1007,6 +1068,8 @@ Sidebar::Sidebar(Plater *parent) h_sizer_title->AddSpacer(FromDIP(SidebarProps::ElementSpacing())); h_sizer_title->Add(p->m_text_printer_settings, 0, wxALIGN_CENTER); h_sizer_title->AddStretchSpacer(); + h_sizer_title->Add(p->m_printerinfo_syncbtn, 0, wxALIGN_CENTER); + h_sizer_title->wxSizer::AddSpacer(FromDIP(10)); h_sizer_title->Add(p->m_printer_setting, 0, wxALIGN_CENTER); h_sizer_title->AddSpacer(FromDIP(SidebarProps::TitlebarMargin())); h_sizer_title->SetMinSize(-1, 3 * em); @@ -1014,12 +1077,6 @@ Sidebar::Sidebar(Plater *parent) p->m_panel_printer_title->SetSizer(h_sizer_title); p->m_panel_printer_title->Layout(); - // 1.2 Add spliters around title bar - // add spliter 1 - //auto spliter_1 = new ::StaticLine(p->scrolled); - //spliter_1->SetBackgroundColour("#A6A9AA"); - //scrolled_sizer->Add(spliter_1, 0, wxEXPAND); - // add printer title scrolled_sizer->Add(p->m_panel_printer_title, 0, wxEXPAND | wxALL, 0); p->m_panel_printer_title->Bind(wxEVT_LEFT_UP, [this] (auto & e) { @@ -1892,6 +1949,21 @@ void Sidebar::update_presets(Preset::Type preset_type) case Preset::TYPE_PRINTER: { // update_nozzle_settings(); + PresetBundle* preset_bundle = wxGetApp().preset_bundle; + if (preset_bundle) + { + std::string model_id = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); + + if (model_id == "SM_U1") { + p->m_printerinfo_syncbtn->Show(); + } + else + { + p->m_printerinfo_syncbtn->Hide(); + } + + } + update_all_preset_comboboxes(); p->show_preset_comboboxes(); @@ -1922,6 +1994,7 @@ void Sidebar::update_presets(Preset::Type preset_type) wxGetApp().preset_bundle->export_selections(*wxGetApp().app_config); BOOST_LOG_TRIVIAL(debug) << __FUNCTION__ << boost::format(": exit."); + } //BBS @@ -1973,6 +2046,7 @@ void Sidebar::msw_rescale() p->m_panel_filament_title->GetSizer() ->SetMinSize(-1, 3 * wxGetApp().em_unit()); p->m_printer_icon->msw_rescale(); + p->m_printerinfo_syncbtn->msw_rescale(); p->m_printer_setting->msw_rescale(); p->m_filament_icon->msw_rescale(); p->m_bpButton_add_filament->msw_rescale(); @@ -2044,6 +2118,7 @@ void Sidebar::sys_color_changed() //for (wxWindow* btn : std::vector{ p->btn_reslice, p->btn_export_gcode }) // wxGetApp().UpdateDarkUI(btn, true); p->m_printer_icon->msw_rescale(); + p->m_printerinfo_syncbtn->msw_rescale(); p->m_printer_setting->msw_rescale(); p->m_filament_icon->msw_rescale(); p->m_bpButton_add_filament->msw_rescale(); From 1303cbe2d6e563e3aaf4e9937edf428fef662c88 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 16 Mar 2026 20:04:20 +0800 Subject: [PATCH 02/46] feature limit only one nozzle and not allow to choose nozzle. --- src/libslic3r/Preset.cpp | 3 ++- src/slic3r/GUI/Plater.cpp | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 694cb20a729..4846a694a63 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2640,7 +2640,8 @@ std::vector PresetCollection::diameters_of_selected_printer() std::set diameters; auto printer_model = m_edited_preset.config.opt_string("printer_model"); for (auto &preset : m_presets) { - if (preset.config.opt_string("printer_model") == printer_model) + // 仅统计在「选择打印机」中勾选过的喷嘴(is_visible),与侧栏直径下拉是否禁用一致 + if (preset.is_visible && preset.config.opt_string("printer_model") == printer_model) diameters.insert(preset.config.opt_string("printer_variant")); } return std::vector{diameters.begin(), diameters.end()}; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index da9a63fa95b..8125b221c2d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2600,8 +2600,7 @@ void Sidebar::update_nozzle_settings(bool switch_machine) } else { auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer(); if (diameters.size() < 2) { - diameter_combo->Enable(false); - + diameter_combo->Enable(false); // 仅 0/1 种直径时无可选,禁用下拉 } for (auto& diameter : diameters) { wxString str = diameter + "mm"; From c3ac79450e5419b50a161d944585251dcc522d53 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 16 Mar 2026 20:05:59 +0800 Subject: [PATCH 03/46] fix remove not work code. --- src/libslic3r/Preset.cpp | 1 - src/slic3r/GUI/Plater.cpp | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 4846a694a63..2fec35c7c59 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2640,7 +2640,6 @@ std::vector PresetCollection::diameters_of_selected_printer() std::set diameters; auto printer_model = m_edited_preset.config.opt_string("printer_model"); for (auto &preset : m_presets) { - // 仅统计在「选择打印机」中勾选过的喷嘴(is_visible),与侧栏直径下拉是否禁用一致 if (preset.is_visible && preset.config.opt_string("printer_model") == printer_model) diameters.insert(preset.config.opt_string("printer_variant")); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8125b221c2d..3120e247b04 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2600,7 +2600,7 @@ void Sidebar::update_nozzle_settings(bool switch_machine) } else { auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer(); if (diameters.size() < 2) { - diameter_combo->Enable(false); // 仅 0/1 种直径时无可选,禁用下拉 + diameter_combo->Enable(false); } for (auto& diameter : diameters) { wxString str = diameter + "mm"; From b170b26d5ed41e867727e7af0869c41d799c9f2e Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 17 Mar 2026 10:33:14 +0800 Subject: [PATCH 04/46] feature select the u1 machine and show the sync btn entrance. fix the machine config not adapt current machine nozzle info. --- src/libslic3r/Preset.cpp | 27 +++++++++++++++++++++------ src/slic3r/GUI/Plater.cpp | 22 +++++++++++++--------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 2fec35c7c59..7c686506609 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2865,13 +2865,28 @@ bool PresetCollection::select_preset_by_name(const std::string &name_w_suffix, b // Preset found by its name and it is visible. idx = it - m_presets.begin(); else { - // Find the first visible preset. - for (size_t i = m_default_suppressed ? m_num_default_presets : 0; i < m_presets.size(); ++ i) - if (m_presets[i].is_visible) { - idx = i; - break; + bool found = false; + //Only U1 cancel current preset and select the other avalibale preset to show and not switch the other machine + if (m_type == Preset::Type::TYPE_PRINTER && it != m_presets.end() && it->name == name && !it->is_visible) { + std::string printer_model = it->config.opt_string("printer_model"); + if (!printer_model.empty()) { + for (size_t i = m_default_suppressed ? m_num_default_presets : 0; i < m_presets.size(); ++i) { + if (m_presets[i].is_visible && m_presets[i].config.opt_string("printer_model") == printer_model) { + idx = i; + found = true; + break; + } + } } - // If the first visible preset was not found, return the 0th element, which is the default preset. + } + if (!found) { + // Find the first visible preset. + for (size_t i = m_default_suppressed ? m_num_default_presets : 0; i < m_presets.size(); ++ i) + if (m_presets[i].is_visible) { + idx = i; + break; + } + } } // 2) Select the new preset. diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 3120e247b04..336193e8876 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1949,19 +1949,23 @@ void Sidebar::update_presets(Preset::Type preset_type) case Preset::TYPE_PRINTER: { // update_nozzle_settings(); - PresetBundle* preset_bundle = wxGetApp().preset_bundle; - if (preset_bundle) + auto machineName = wxGetApp().preset_bundle->printers.get_selected_preset_name(); + + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto printer_model_opt = printer_config.option("printer_model"); + if (printer_model_opt) { - std::string model_id = preset_bundle->printers.get_edited_preset().get_printer_type(preset_bundle); + std::string printer_model = printer_model_opt->value; + bool is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); - if (model_id == "SM_U1") { - p->m_printerinfo_syncbtn->Show(); - } - else + if (is_snapmaker_u1) { - p->m_printerinfo_syncbtn->Hide(); + p->m_printerinfo_syncbtn->Show(); + } + else + { + p->m_printerinfo_syncbtn->Hide(); } - } update_all_preset_comboboxes(); From 876c72356a56c415b6bf93f0dc0925cede4a4f6c Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 17 Mar 2026 11:45:52 +0800 Subject: [PATCH 05/46] feature when on U1 switch the nozzle diameter and show a tips. --- src/slic3r/GUI/Plater.cpp | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 336193e8876..bf82dc55bfb 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2614,12 +2614,37 @@ void Sidebar::update_nozzle_settings(bool switch_machine) diameter_combo->Bind(wxEVT_COMBOBOX, [this, diameter_combo, i](wxCommandEvent& event) { + + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto printer_model_opt = printer_config.option("printer_model"); + if (printer_model_opt) { + std::string printer_model = printer_model_opt->value; + bool is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); + + if (is_snapmaker_u1) + { + //check the config has flags to tips switch nozzle and all nozzle will be changed to the same type + auto notShow = wxGetApp().app_config->get("app", "sync_diameter_flags"); + if (notShow != "true") + { + RichMessageDialog dlg(static_cast(wxGetApp().mainframe), + _L("Note: After modification, the dimensions of the other three nozzles will also be adjusted to the same size."), + _L("Set nozzle diameter"), + wxYES); + dlg.ShowCheckBox(_L("not note again"), false); + auto res = dlg.ShowModal(); + bool isCheckBox = dlg.IsCheckBoxChecked(); + + wxGetApp().app_config->set("app", "sync_diameter_flags", isCheckBox); + } + } + } + auto diameter = diameter_combo->GetValue().substr(0, 3); auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, diameter.ToStdString()); if (preset == nullptr) { - MessageDialog dlg(nullptr, _L(""), _L("")); - dlg.ShowModal(); - return false; + BOOST_LOG_TRIVIAL(error) << "get the similar printer preset fail"; + return; } preset->is_visible = true; // force visible @@ -2628,7 +2653,8 @@ void Sidebar::update_nozzle_settings(bool switch_machine) p->m_nozzle_diameter_lists[i]->SetValue(diameter + "mm"); } - return wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); + wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); + event.Skip(); }); auto diam_str = wxGetApp().preset_bundle->printers.get_edited_preset().config.option("printer_variant")->value; From 644527f236c6d43dc2d5f3eee045f28869ccf0ff Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 17 Mar 2026 16:38:44 +0800 Subject: [PATCH 06/46] feature add Graphic Effect Steel Plate for U1 --- src/libslic3r/Preset.cpp | 5 ++++- src/libslic3r/Print.cpp | 4 +++- src/libslic3r/PrintConfig.cpp | 20 ++++++++++++++++++++ src/libslic3r/PrintConfig.hpp | 7 +++++++ src/libslic3r/ProjectTask.hpp | 2 ++ src/slic3r/GUI/Plater.cpp | 11 +++++++++-- src/slic3r/GUI/SelectMachine.cpp | 12 ++++++++++++ src/slic3r/GUI/Tab.cpp | 10 ++++++++++ 8 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 7c686506609..42902e9163f 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -876,7 +876,10 @@ static std::vector s_Preset_filament_options { "filament_flow_ratio", "filament_density", "filament_cost", "filament_minimal_purge_on_wipe_tower", "nozzle_temperature", "nozzle_temperature_initial_layer", // BBS - "cool_plate_temp", "textured_cool_plate_temp", "eng_plate_temp", "hot_plate_temp", "textured_plate_temp", "cool_plate_temp_initial_layer", "textured_cool_plate_temp_initial_layer", "eng_plate_temp_initial_layer", "hot_plate_temp_initial_layer", "textured_plate_temp_initial_layer", "supertack_plate_temp_initial_layer", "supertack_plate_temp", + "cool_plate_temp", "textured_cool_plate_temp", "eng_plate_temp", "hot_plate_temp", "textured_plate_temp", + "cool_plate_temp_initial_layer", "textured_cool_plate_temp_initial_layer", "eng_plate_temp_initial_layer", + "hot_plate_temp_initial_layer", "textured_plate_temp_initial_layer", "supertack_plate_temp_initial_layer", "supertack_plate_temp", + "graphic_effect_steel_plate_temp", "graphic_effect_steel_plate_temp_initial_layer", // "bed_type", //BBS:temperature_vitrification "temperature_vitrification", "reduce_fan_stop_start_freq","dont_slow_down_outer_wall", "slow_down_for_layer_cooling", "fan_min_speed", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index b20f22a1333..8d27e02dbe2 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -135,6 +135,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "eng_plate_temp_initial_layer", "hot_plate_temp_initial_layer", "textured_plate_temp_initial_layer", + "graphic_effect_steel_plate_temp_initial_layer", "gcode_add_line_number", "layer_change_gcode", "time_lapse_gcode", @@ -281,7 +282,8 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "textured_cool_plate_temp" || opt_key == "eng_plate_temp" || opt_key == "hot_plate_temp" - || opt_key == "textured_plate_temp" + || opt_key == "textured_plate_temp" + || opt_key == "graphic_effect_steel_plate_temp" || opt_key == "enable_prime_tower" || opt_key == "prime_tower_width" || opt_key == "prime_tower_brim_width" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 4bcb6be574c..9a6629b6d67 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -759,6 +759,16 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Bed temperature"); def->min = 0; def->max = 300; + def->set_default_value(new ConfigOptionInts{45});//todo by alves will be update the mini temp + + def = this->add("graphic_effect_steel_plate_temp", coInts); + def->label = L("Other layers"); + def->tooltip = L("Bed temperature for layers except the initial one. " + "A value of 0 means the filament does not support printing on the Graphic Effect Steel Plate."); + def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation + def->full_label = L("Bed temperature"); + def->min = 0; + def->max = 300; def->set_default_value(new ConfigOptionInts{45}); def = this->add("supertack_plate_temp_initial_layer", coInts); @@ -820,6 +830,16 @@ void PrintConfigDef::init_fff_params() def->max = 300; def->set_default_value(new ConfigOptionInts{45}); + def = this->add("graphic_effect_steel_plate_temp_initial_layer", coInts); + def->label = L("Initial layer"); + def->full_label = L("Initial layer bed temperature"); + def->tooltip = L("Bed temperature of the initial layer. " + "A value of 0 means the filament does not support printing on the Graphic Effect Steel Plate."); + def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation + def->min = 0; + def->max = 300; + def->set_default_value(new ConfigOptionInts{45}); + def = this->add("curr_bed_type", coEnum); def->label = L("Bed type"); def->tooltip = L("Bed types supported by the printer."); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 33c21a98da7..e6fbc6ea139 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -286,6 +286,7 @@ enum BedType { btPEI, btPTE, btPCT, + btGESP, btSuperTack, btCount }; @@ -422,6 +423,9 @@ static std::string get_bed_temp_key(const BedType type) if (type == btPTE) return "textured_plate_temp"; + if (type == btGESP) + return "graphic_effect_steel_plate_temp"; + return ""; } @@ -445,6 +449,9 @@ static std::string get_bed_temp_1st_layer_key(const BedType type) if (type == btPTE) return "textured_plate_temp_initial_layer"; + if (type == btGESP) + return "graphic_effect_steel_plate_temp_initial_layer"; + return ""; } diff --git a/src/libslic3r/ProjectTask.hpp b/src/libslic3r/ProjectTask.hpp index ef2033eefdc..2bc91bffff0 100644 --- a/src/libslic3r/ProjectTask.hpp +++ b/src/libslic3r/ProjectTask.hpp @@ -27,6 +27,8 @@ enum MachineBedType { BED_TYPE_PEI, BED_TYPE_PTE, BED_TYPE_COUNT, + BED_TYPE_COUNT_EX, + BED_TYPE_COUNT_ALL, }; enum MappingResult { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index bf82dc55bfb..605e2d9ccec 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1196,6 +1196,7 @@ Sidebar::Sidebar(Plater *parent) m_bed_type_list = new ComboBox(p->panel_printer_preset, wxID_ANY, wxString(""), wxDefaultPosition, {-1, FromDIP(30)}, 0, nullptr, wxCB_READONLY); const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); if (bed_type_def && bed_type_def->enum_keys_map) { + //changed the combobox data for (auto item : bed_type_def->enum_labels) { m_bed_type_list->AppendString(_L(item)); } @@ -1822,8 +1823,14 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) show_SEMM_buttons(/*cfg.opt_bool("single_extruder_multi_material")*/true); //p->m_staticText_filament_settings->Update(); - - if (is_bbl_vendor || cfg.opt_bool("support_multi_bed_types")) { + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto printer_model_opt = printer_config.option("printer_model"); + bool is_snapmaker_u1 = false; + if (printer_model_opt) { + std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); + } + if (is_bbl_vendor || cfg.opt_bool("support_multi_bed_types") || is_snapmaker_u1) { m_bed_type_list->Enable(); // Orca: don't update bed type if loading project if (!p->plater->is_loading_project()) { diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index fbd9200c3d8..00b43ca857a 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -49,6 +49,18 @@ static wxString MACHINE_BED_TYPE_STRING[BED_TYPE_COUNT] = { _L("Bambu Smooth PEI Plate") + "/" + _L("High temperature Plate"), _L("Bambu Textured PEI Plate")}; +static wxString MACHINE_BED_TYPE_STRING_EX[BED_TYPE_COUNT_EX] = { + _L("Bambu Textured PEI Plate"), + _L("Bambu Smooth PEI Plate"), + _L("Graphic Effect Steel Plate")}; + +static wxString MACHINE_BED_TYPE_STRING_ALL[BED_TYPE_COUNT_ALL] = { + _L("Bambu Cool Plate") + " / " + _L("PLA Plate"), + _L("Bambu Engineering Plate"), + _L("Bambu Smooth PEI Plate") + "/" + _L("High temperature Plate"), + _L("Bambu Textured PEI Plate"), + _L("Graphic Effect Steel Plate")}; + void SelectMachineDialog::stripWhiteSpace(std::string& str) { if (str == "") { return; } diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index de4e163ff72..d7b9ac393fb 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3555,6 +3555,12 @@ void TabFilament::build() line.append_option(optgroup->get_option("textured_plate_temp")); optgroup->append_line(line); + line = {L("Graphic Effect Steel Plate"), + L("Bed temperature when the Graphic Effect Steel Plate is installed. A value of 0 means the filament does not support printing on the Graphic Effect Steel Plate.")}; + line.append_option(optgroup->get_option("graphic_effect_steel_plate_temp_initial_layer")); + line.append_option(optgroup->get_option("graphic_effect_steel_plate_temp")); + optgroup->append_line(line); + optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) { DynamicPrintConfig& filament_config = wxGetApp().preset_bundle->filaments.get_edited_preset().config; @@ -3821,6 +3827,8 @@ void TabFilament::toggle_options() toggle_line("hot_plate_temp", true); toggle_line("textured_plate_temp_initial_layer", true); toggle_line("textured_plate_temp", true); + toggle_line("graphic_effect_steel_plate_temp_initial_layer", true); + toggle_line("graphic_effect_steel_plate_temp", true); } else { // 不支持多床型:只显示当前选择的床型 @@ -3838,6 +3846,8 @@ void TabFilament::toggle_options() toggle_line("hot_plate_temp", curr_bed_type == btPEI); toggle_line("textured_plate_temp_initial_layer", curr_bed_type == btPTE); toggle_line("textured_plate_temp", curr_bed_type == btPTE); + toggle_line("graphic_effect_steel_plate_temp_initial_layer", curr_bed_type == btGESP); + toggle_line("graphic_effect_steel_plate_temp", curr_bed_type == btGESP); } From 142e5bb74e09e945e5a542d46dbb28ca3700e927 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 17 Mar 2026 17:41:50 +0800 Subject: [PATCH 07/46] feature add new plate for U1, and U1 default show 3 plates and use support more plate, U1 will show 7 plates. --- src/libslic3r/Config.hpp | 4 ++ src/libslic3r/PrintConfig.cpp | 25 +++++++++- src/slic3r/GUI/Plater.cpp | 88 ++++++++++++++++++++++++++++------- src/slic3r/GUI/Plater.hpp | 2 + src/slic3r/GUI/Tab.cpp | 30 +++++++++--- 5 files changed, 124 insertions(+), 25 deletions(-) diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp index 6c1f3c5b22a..d06ea7e99e1 100644 --- a/src/libslic3r/Config.hpp +++ b/src/libslic3r/Config.hpp @@ -1992,6 +1992,10 @@ class ConfigOptionDef // Mostly used for enums (when type == coEnum), but may be used for ints resp. floats, if gui_type is set to "i_enum_open" resp. "f_enum_open". std::vector enum_values; std::vector enum_labels; + std::vector enum_values_u1; + std::vector enum_labels_u1; + std::vector enum_values_ex; + std::vector enum_labels_ex; // For enums (when type == coEnum). Maps enum_values to enums. // Initialized by ConfigOptionEnum::get_enum_values() const t_config_enum_values *enum_keys_map = nullptr; diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 9a6629b6d67..c07aee7a693 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -392,7 +392,8 @@ static const t_config_enum_values s_keys_map_BedType = { { "Engineering Plate", btEP }, { "High Temp Plate", btPEI }, { "Textured PEI Plate", btPTE }, - { "Textured Cool Plate", btPCT } + { "Textured Cool Plate", btPCT }, + { "Graphic Effect Steel Plate", btGESP } }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BedType) @@ -858,6 +859,28 @@ void PrintConfigDef::init_fff_params() def->enum_labels.emplace_back(L("Textured PEI Plate")); def->enum_labels.emplace_back(L("Textured Cool Plate")); def->enum_labels.emplace_back(L("Cool Plate (SuperTack)")); + // U1 only 3 + def->enum_values_u1.emplace_back("Textured PEI Plate"); + def->enum_values_u1.emplace_back("High Temp Plate"); + def->enum_values_u1.emplace_back("Graphic Effect Steel Plate"); + def->enum_labels_u1.emplace_back(L("Textured PEI Plate")); + def->enum_labels_u1.emplace_back(L("Smooth High Temp Plate")); + def->enum_labels_u1.emplace_back(L("Graphic Effect Steel Plate")); + // U1 use 7 when open support_multi_bed_types + def->enum_values_ex.emplace_back("Cool Plate"); + def->enum_values_ex.emplace_back("Engineering Plate"); + def->enum_values_ex.emplace_back("High Temp Plate"); + def->enum_values_ex.emplace_back("Textured PEI Plate"); + def->enum_values_ex.emplace_back("Textured Cool Plate"); + def->enum_values_ex.emplace_back("Supertack Plate"); + def->enum_values_ex.emplace_back("Graphic Effect Steel Plate"); + def->enum_labels_ex.emplace_back(L("Smooth Cool Plate")); + def->enum_labels_ex.emplace_back(L("Engineering Plate")); + def->enum_labels_ex.emplace_back(L("Smooth High Temp Plate")); + def->enum_labels_ex.emplace_back(L("Textured PEI Plate")); + def->enum_labels_ex.emplace_back(L("Textured Cool Plate")); + def->enum_labels_ex.emplace_back(L("Cool Plate (SuperTack)")); + def->enum_labels_ex.emplace_back(L("Graphic Effect Steel Plate")); def->set_default_value(new ConfigOptionEnum(btPC)); // Orca: allow profile maker to set default bed type in machine profile diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 605e2d9ccec..d7ae908d283 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1196,10 +1196,10 @@ Sidebar::Sidebar(Plater *parent) m_bed_type_list = new ComboBox(p->panel_printer_preset, wxID_ANY, wxString(""), wxDefaultPosition, {-1, FromDIP(30)}, 0, nullptr, wxCB_READONLY); const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); if (bed_type_def && bed_type_def->enum_keys_map) { - //changed the combobox data - for (auto item : bed_type_def->enum_labels) { + for (const auto& item : bed_type_def->enum_labels) m_bed_type_list->AppendString(_L(item)); - } + for (const auto& v : bed_type_def->enum_values) + m_bed_type_combo_enum_values.push_back(v); } // 添加链接事件等 @@ -1825,12 +1825,51 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) //p->m_staticText_filament_settings->Update(); auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; auto printer_model_opt = printer_config.option("printer_model"); - bool is_snapmaker_u1 = false; + bool is_snapmaker_u1 = false; if (printer_model_opt) { - std::string printer_model = printer_model_opt->value; + std::string printer_model = printer_model_opt->value; is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); } - if (is_bbl_vendor || cfg.opt_bool("support_multi_bed_types") || is_snapmaker_u1) { + bool support_multi_bed_types = cfg.opt_bool("support_multi_bed_types"); + const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); + const t_config_enum_values* keys_map = bed_type_def ? bed_type_def->enum_keys_map : nullptr; + + m_bed_type_list->Clear(); + m_bed_type_combo_enum_values.clear(); + if (bed_type_def && keys_map) { + if (is_snapmaker_u1 && !support_multi_bed_types) { + for (const auto& item : bed_type_def->enum_labels_u1) + m_bed_type_list->AppendString(_L(item)); + for (const auto& v : bed_type_def->enum_values_u1) + m_bed_type_combo_enum_values.push_back(v); + } else if (is_snapmaker_u1 && support_multi_bed_types) { + for (const auto& item : bed_type_def->enum_labels_ex) + m_bed_type_list->AppendString(_L(item)); + for (const auto& v : bed_type_def->enum_values_ex) + m_bed_type_combo_enum_values.push_back(v); + } else { + for (const auto& item : bed_type_def->enum_labels) + m_bed_type_list->AppendString(_L(item)); + for (const auto& v : bed_type_def->enum_values) + m_bed_type_combo_enum_values.push_back(v); + } + } + + auto get_key_for_bed_type = [keys_map](BedType bt) -> std::string { + if (!keys_map) return {}; + for (const auto& item : *keys_map) + if ((BedType)item.second == bt) return item.first; + return {}; + }; + auto get_selection_index = [&]() -> int { + BedType curr = wxGetApp().preset_bundle->project_config.opt_enum("curr_bed_type"); + std::string key = get_key_for_bed_type(curr); + for (size_t i = 0; i < m_bed_type_combo_enum_values.size(); ++i) + if (m_bed_type_combo_enum_values[i] == key) return (int)i; + return 0; + }; + + if (is_bbl_vendor || support_multi_bed_types || is_snapmaker_u1) { m_bed_type_list->Enable(); // Orca: don't update bed type if loading project if (!p->plater->is_loading_project()) { @@ -1856,22 +1895,32 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) } // Orca: Update proj_config directly to avoid callback context issues + if (is_snapmaker_u1 && !support_multi_bed_types) { + if (bed_type_to_use != btPTE && bed_type_to_use != btPEI && bed_type_to_use != btGESP) { + bed_type_to_use = btPTE; + wxGetApp().app_config->set("curr_bed_type", std::to_string(int(bed_type_to_use))); + wxGetApp().app_config->set_printer_setting(printer_name, "curr_bed_type", std::to_string(int(bed_type_to_use))); + } + } + wxGetApp().preset_bundle->project_config.set_key_value("curr_bed_type", new ConfigOptionEnum(bed_type_to_use)); - - // Orca: Update UI without triggering callback to avoid unintended side effects - // The callback should only be triggered by user manual changes, not by preset switching - m_bed_type_list->SetSelection((int)bed_type_to_use - 1); + int sel_idx = get_selection_index(); + m_bed_type_list->SetSelection(sel_idx); + } else { + if (is_snapmaker_u1 && !support_multi_bed_types) { + BedType curr = wxGetApp().preset_bundle->project_config.opt_enum("curr_bed_type"); + if (curr != btPTE && curr != btPEI && curr != btGESP) { + wxGetApp().preset_bundle->project_config.set_key_value("curr_bed_type", new ConfigOptionEnum(btPTE)); + m_bed_type_list->SetSelection(0); + } else + m_bed_type_list->SetSelection(get_selection_index()); + } else + m_bed_type_list->SetSelection(get_selection_index()); } } else { - // Orca: 不支持多床型时,从配置读取默认床型 BedType default_bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle); - - // Orca: 即使不支持多床型,也需要保存床型到 project_config,确保数据一致性 wxGetApp().preset_bundle->project_config.set_key_value("curr_bed_type", new ConfigOptionEnum(default_bed_type)); - - // Orca: combobox don't have the btDefault option, so we need to -1 - // Orca: use Select instead of SelectAndNotify to avoid overwriting printer settings when switching printers - m_bed_type_list->Select((int)default_bed_type - 1); + m_bed_type_list->SetSelection(get_selection_index()); m_bed_type_list->Disable(); } @@ -7494,7 +7543,10 @@ void Plater::priv::on_select_bed_type(wxCommandEvent &evt) { ComboBox* combo = static_cast(evt.GetEventObject()); int selection = combo->GetSelection(); - std::string bed_type_name = print_config_def.get("curr_bed_type")->enum_values[selection]; + const std::vector& combo_values = sidebar->get_bed_type_combo_enum_values(); + std::string bed_type_name = (combo_values.size() > (size_t)selection) + ? combo_values[selection] + : print_config_def.get("curr_bed_type")->enum_values[selection]; PresetBundle& preset_bundle = *wxGetApp().preset_bundle; DynamicPrintConfig& proj_config = wxGetApp().preset_bundle->project_config; diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp index 9bd596c98ad..82460adf9ee 100644 --- a/src/slic3r/GUI/Plater.hpp +++ b/src/slic3r/GUI/Plater.hpp @@ -205,6 +205,7 @@ class Sidebar : public wxPanel Search::OptionsSearcher& get_searcher(); std::string& get_search_line(); void update_printer_thumbnail(); + const std::vector& get_bed_type_combo_enum_values() const { return m_bed_type_combo_enum_values; } private: struct priv; @@ -212,6 +213,7 @@ class Sidebar : public wxPanel wxBoxSizer* m_scrolled_sizer = nullptr; ComboBox* m_bed_type_list = nullptr; + std::vector m_bed_type_combo_enum_values; ScalableButton* connection_btn = nullptr; ScalableButton* machine_connecting_btn = nullptr; ScalableButton* ams_btn = nullptr; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index d7b9ac393fb..fecbaa37a9c 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3810,11 +3810,32 @@ void TabFilament::toggle_options() { bool pa = m_config->opt_bool("enable_pressure_advance", 0); toggle_option("pressure_advance", pa); - + // BBS: 控制床温选项的显示 auto support_multi_bed_types = is_BBL_printer || cfg.opt_bool("support_multi_bed_types"); - if (support_multi_bed_types) { - // 支持多床型:显示所有床温选项 + bool is_snapmaker_u1 = false; + if (auto printer_model_opt = cfg.option("printer_model")) { + std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); + } + if (is_snapmaker_u1 && !support_multi_bed_types) { + // U1 default show 3 plates + toggle_line("supertack_plate_temp_initial_layer", false); + toggle_line("supertack_plate_temp", false); + toggle_line("cool_plate_temp_initial_layer", false); + toggle_line("cool_plate_temp", false); + toggle_line("textured_cool_plate_temp_initial_layer", false); + toggle_line("textured_cool_plate_temp", false); + toggle_line("eng_plate_temp_initial_layer", false); + toggle_line("eng_plate_temp", false); + toggle_line("hot_plate_temp_initial_layer", true); + toggle_line("hot_plate_temp", true); + toggle_line("textured_plate_temp_initial_layer", true); + toggle_line("textured_plate_temp", true); + toggle_line("graphic_effect_steel_plate_temp_initial_layer", true); + toggle_line("graphic_effect_steel_plate_temp", true); + } else if (support_multi_bed_types) { + // u1 has 7 plates toggle_line("supertack_plate_temp_initial_layer", true); toggle_line("cool_plate_temp", true); toggle_line("cool_plate_temp_initial_layer", true); @@ -3830,10 +3851,7 @@ void TabFilament::toggle_options() toggle_line("graphic_effect_steel_plate_temp_initial_layer", true); toggle_line("graphic_effect_steel_plate_temp", true); } else { - // 不支持多床型:只显示当前选择的床型 - BedType curr_bed_type = m_preset_bundle->printers.get_edited_preset().get_default_bed_type(m_preset_bundle); - toggle_line("supertack_plate_temp_initial_layer", curr_bed_type == btSuperTack); toggle_line("supertack_plate_temp", curr_bed_type == btSuperTack); toggle_line("cool_plate_temp_initial_layer", curr_bed_type == btPC); From 45c6e57b3f9e2e5b517668af5f322de3842b166b Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 17 Mar 2026 18:01:24 +0800 Subject: [PATCH 08/46] feature only U1 has new plate. --- src/slic3r/GUI/Tab.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index fecbaa37a9c..7b9fbf51de9 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3848,8 +3848,8 @@ void TabFilament::toggle_options() toggle_line("hot_plate_temp", true); toggle_line("textured_plate_temp_initial_layer", true); toggle_line("textured_plate_temp", true); - toggle_line("graphic_effect_steel_plate_temp_initial_layer", true); - toggle_line("graphic_effect_steel_plate_temp", true); + toggle_line("graphic_effect_steel_plate_temp_initial_layer", is_snapmaker_u1); + toggle_line("graphic_effect_steel_plate_temp", is_snapmaker_u1); } else { BedType curr_bed_type = m_preset_bundle->printers.get_edited_preset().get_default_bed_type(m_preset_bundle); toggle_line("supertack_plate_temp_initial_layer", curr_bed_type == btSuperTack); From 4d185b2421cd5f7986c99a9e658028590445fe50 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 18 Mar 2026 14:59:05 +0800 Subject: [PATCH 09/46] feature merge U1 nozzle to U1 type and handle it the same logic. --- src/slic3r/GUI/GUI_App.cpp | 52 +++------------- src/slic3r/GUI/MainFrame.cpp | 39 +++--------- src/slic3r/GUI/MainFrame.hpp | 2 - src/slic3r/GUI/Plater.cpp | 114 +++++++++++------------------------ 4 files changed, 52 insertions(+), 155 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 9b530d3fc9f..2b906d5d018 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -3549,8 +3549,6 @@ void GUI_App::recreate_GUI(const wxString &msg_name) mainframe->select_tab(size_t(MainFrame::tp3DEditor)); // Propagate model objects to object list. sidebar().obj_list()->init(); - //sidebar().aux_list()->init_auxiliary(); - //mainframe->m_auxiliary->init_auxiliary(); SetTopWindow(mainframe); dlg.Update(30, _L("Rebuild") + dots); @@ -3560,7 +3558,6 @@ void GUI_App::recreate_GUI(const wxString &msg_name) m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg())); load_current_presets(); mainframe->Show(true); - //mainframe->refresh_plugin_tips(); dlg.Update(90, _L("Loading a mode view") + dots); @@ -3574,18 +3571,11 @@ void GUI_App::recreate_GUI(const wxString &msg_name) //BBS: trigger restore project logic here, and skip confirm plater_->trigger_restore_project(1); - // #ys_FIXME_delete_after_testing Do we still need this ? -// CallAfter([]() { -// // Run the config wizard, don't offer the "reset user profile" checkbox. -// config_wizard_startup(true); -// }); - - update_publish_status(); m_is_recreating_gui = false; - //// 重新加载首页和设备页 + //reload home and device page sm_disconnect_current_machine(true); auto devices = wxGetApp().app_config->get_devices(); for (auto iter = devices.begin(); iter != devices.end();) { @@ -3596,39 +3586,19 @@ void GUI_App::recreate_GUI(const wxString &msg_name) } } - - - // wxGetApp().mainframe->plater()->sidebar().update_all_preset_comboboxes(true); - - // auto url = wxString::FromUTF8(LOCALHOST_URL + std::to_string(PAGE_HTTP_PORT) + "/web/flutter_web/index.html?path=2"); - // wxGetApp().mainframe->load_printer_url(url); - bool use_new_connection = wxGetApp().app_config->get("use_new_connect") == "true"; - const auto& edit_preset = preset_bundle->printers.get_edited_preset(); - std::string local_name = ""; - if (edit_preset.is_system) { - local_name = edit_preset.name; - } else { - const auto& base_preset = preset_bundle->printers.get_preset_base(edit_preset); - if (base_preset) - local_name = base_preset->name; - else - local_name = ""; + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto printer_model_opt = printer_config.option("printer_model"); + bool is_snapmaker_u1 = false; + if (printer_model_opt) { + std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); } - local_name.erase(std::remove(local_name.begin(), local_name.end(), '('), local_name.end()); - local_name.erase(std::remove(local_name.begin(), local_name.end(), ')'), local_name.end()); - - // Snapmaker U1 - std::string test_preset_name = "Snapmaker U1 0.4 nozzle"; - bool is_test = (test_preset_name == local_name); - - - if (!preset_bundle->is_bbl_vendor()) { - if (is_test) { + if (is_snapmaker_u1) { wxString url = wxString::FromUTF8(LOCALHOST_URL + std::to_string(PAGE_HTTP_PORT) + "/web/flutter_web/index.html?path=2"); auto real_url = wxGetApp().get_international_url(url); mainframe->load_printer_url(real_url); @@ -3639,14 +3609,8 @@ void GUI_App::recreate_GUI(const wxString &msg_name) } } - - - - - // wcp订阅 wxGetApp().device_card_notify(devices); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << "recreate_GUI exit"; } diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 5db1ead689a..72a4b2b5800 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1529,16 +1529,16 @@ bool MainFrame::can_send_gcode() const std::string preset_name = "Snapmaker U1 0.4 nozzle"; const auto& edit_preset = wxGetApp().preset_bundle->printers.get_edited_preset(); - std::string local_name = ""; - if (edit_preset.is_system) { - local_name = edit_preset.name; - } else { - const auto& base_preset = wxGetApp().preset_bundle->printers.get_preset_base(edit_preset); - local_name = base_preset->name; + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto printer_model_opt = printer_config.option("printer_model"); + bool is_snapmaker_u1 = false; + if (printer_model_opt) { + std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); } - local_name.erase(std::remove(local_name.begin(), local_name.end(), '('), local_name.end()); - local_name.erase(std::remove(local_name.begin(), local_name.end(), ')'), local_name.end()); - if (local_name == preset_name) { + + if (is_snapmaker_u1) + { return true; } @@ -1554,27 +1554,6 @@ bool MainFrame::can_send_gcode() const return true; } -/*bool MainFrame::can_export_gcode_sd() const -{ - if (m_plater == nullptr) - return false; - - if (m_plater->model().objects.empty()) - return false; - - if (m_plater->is_export_gcode_scheduled()) - return false; - - // TODO:: add other filters - - return wxGetApp().removable_drive_manager()->status().has_removable_drives; -} - -bool MainFrame::can_eject() const -{ - return wxGetApp().removable_drive_manager()->status().has_eject; -}*/ - bool MainFrame::can_slice() const { #ifdef SUPPORT_BACKGROUND_PROCESSING diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index 661fe3ca4b7..34fd53dd443 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -125,8 +125,6 @@ class MainFrame : public DPIFrame bool can_export_all_gcode() const; bool can_print_3mf() const; bool can_send_gcode() const; - //bool can_export_gcode_sd() const; - //bool can_eject() const; bool can_slice() const; bool can_change_view() const; bool can_select() const; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d7ae908d283..317a3ffb933 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1703,51 +1703,34 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) bool use_new_connection = appconfig->get("use_new_connect") == "true"; - // 隐藏所有按钮(使用 combo 内部的按钮) + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto printer_model_opt = printer_config.option("printer_model"); + bool is_snapmaker_u1 = false; + if (printer_model_opt) { + std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); + } + p->combo_printer->set_show_machine_connecting_button(false); p->combo_printer->set_show_connection_button(false); if (preset_bundle.use_bbl_network()) { - //only show connection button for not-BBL printer - // connection_btn->Hide(); // 已在上面隐藏 - //only show sync-ams button for BBL printer ams_btn->Show(); - //update print button default value for bbl or third-party printer p_mainframe->set_print_button_to_default(MainFrame::PrintSelectType::ePrintPlate); } else { - // connection_btn->Hide(); // 已在上面隐藏 ams_btn->Hide(); auto print_btn_type = MainFrame::PrintSelectType::eExportGcode; const auto& edit_preset = preset_bundle.printers.get_edited_preset(); - std::string local_name = ""; - if (edit_preset.is_system) { - local_name = edit_preset.name; - } else { - const auto& base_preset = preset_bundle.printers.get_preset_base(edit_preset); - if (base_preset) - local_name = base_preset->name; - else - local_name = ""; - } - local_name.erase(std::remove(local_name.begin(), local_name.end(), '('), local_name.end()); - local_name.erase(std::remove(local_name.begin(), local_name.end(), ')'), local_name.end()); - - // Snapmaker U1 - std::string test_preset_name = "Snapmaker U1 0.4 nozzle"; - bool is_test = (test_preset_name == local_name); - - static bool is_sm_page = false; - if (!use_new_connection && !is_test && reload_printer_view) { + if (!use_new_connection && !is_snapmaker_u1 && reload_printer_view) { p->combo_printer->set_show_connection_button(true); wxString url = cfg.opt_string("print_host_webui").empty() ? cfg.opt_string("print_host") : cfg.opt_string("print_host_webui"); wxString apikey; if (url.empty()) { - // url = wxString::Format("file://%s/web/orca/missing_connection.html", from_u8(resources_dir())); std::string base_url = LOCALHOST_URL + std::to_string(wxGetApp().m_page_http_server.get_port()); url = wxString::Format("%s/web/orca/missing_connection.html", from_u8(base_url)); } @@ -1761,7 +1744,6 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) MainFrame::PrintSelectType::eSendGcode; if (url.find("127.0.0.1") != std::string::npos) { - // 加载二代机页面 url = wxString::FromUTF8(LOCALHOST_URL + std::to_string(PAGE_HTTP_PORT) + "/web/flutter_web/index.html?path=3"); } } @@ -1775,41 +1757,36 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) MainFrame::PrintSelectType::eSendGcode; p_mainframe->set_print_button_to_default(print_btn_type); - auto devices = wxGetApp().app_config->get_devices(); - std::string preset_name = ""; - for (const auto& device : devices) { - if (device.connected) { - preset_name = device.preset_name; - break; - } - } - - if (preset_name != "") { - preset_name.erase(std::remove(preset_name.begin(), preset_name.end(), '('), preset_name.end()); - preset_name.erase(std::remove(preset_name.begin(), preset_name.end(), ')'), preset_name.end()); + if (is_snapmaker_u1) { - if (local_name == preset_name) { - p->combo_printer->set_show_machine_connecting_button(true); + auto devices = wxGetApp().app_config->get_devices(); + bool hasOnlineMachine = false; + for (const auto& device : devices) { + if (device.connected) { + hasOnlineMachine = true; + break; + } } + + if(hasOnlineMachine) + p->combo_printer->set_show_machine_connecting_button(true); } else { - // 未连接机器 + wxString url = wxString::FromUTF8(LOCALHOST_URL + std::to_string(PAGE_HTTP_PORT) + "/web/flutter_web/index.html?path=2"); auto real_url = wxGetApp().get_international_url(url); if (!is_sm_page && reload_printer_view) { - wxGetApp().mainframe->load_printer_url(real_url); // 到时全部加载本地交互页面 + wxGetApp().mainframe->load_printer_url(real_url); is_sm_page = true; - } - + } } - if (!p->combo_printer->get_show_machine_connecting_button() && !is_test) { + if (!p->combo_printer->get_show_machine_connecting_button() && !is_snapmaker_u1) { p->combo_printer->set_show_connection_button(true); } } - } if (cfg.opt_bool("pellet_modded_printer")) { @@ -1822,14 +1799,6 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) show_SEMM_buttons(/*cfg.opt_bool("single_extruder_multi_material")*/true); - //p->m_staticText_filament_settings->Update(); - auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; - auto printer_model_opt = printer_config.option("printer_model"); - bool is_snapmaker_u1 = false; - if (printer_model_opt) { - std::string printer_model = printer_model_opt->value; - is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); - } bool support_multi_bed_types = cfg.opt_bool("support_multi_bed_types"); const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type"); const t_config_enum_values* keys_map = bed_type_def ? bed_type_def->enum_keys_map : nullptr; @@ -1924,13 +1893,6 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) m_bed_type_list->Disable(); } - // Update the print choosers to only contain the compatible presets, update the dirty flags. - //BBS - - // Update the printer choosers, update the dirty flags. - //p->combo_printer->update(); - // Update the filament choosers to only contain the compatible presets, update the color preview, - // update the dirty flags. if (print_tech == ptFFF) { for (PlaterPresetComboBox* cb : p->combos_filament) cb->update(); @@ -1941,9 +1903,6 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) update_printer_thumbnail(); } - - // Orca:: show device tab based on vendor type - p_mainframe->show_device(preset_bundle.use_bbl_device_tab() && !use_new_connection); p_mainframe->m_tabpanel->SetSelection(p_mainframe->m_tabpanel->GetSelection()); } @@ -13914,19 +13873,17 @@ void Plater::send_gcode_legacy(int plate_idx, Export3mfProgressFn proFn, bool us // Snapmaker U1 const auto preset = wxGetApp().preset_bundle->printers.get_edited_preset(); - std::string local_name = ""; - if (preset.is_system) { - local_name = preset.name; - } else { - const auto& base_preset = wxGetApp().preset_bundle->printers.get_preset_base(preset); - local_name = base_preset->name; + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto printer_model_opt = printer_config.option("printer_model"); + bool is_snapmaker_u1 = false; + if (printer_model_opt) { + std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); } - local_name.erase(std::remove(local_name.begin(), local_name.end(), '('), local_name.end()); - local_name.erase(std::remove(local_name.begin(), local_name.end(), ')'), local_name.end()); - if (wxGetApp().app_config->get("use_new_connect") == "true" || local_name == "Snapmaker U1 0.4 nozzle") { - // 先不创建job,直接创建上传 / 上传下载对话框 - // 获取默认文件名 + if (wxGetApp().app_config->get("use_new_connect") == "true" || is_snapmaker_u1) { + // firstly upload and open upload download dialog, + // get default name // Obtain default output path fs::path default_output_file; try { @@ -13949,12 +13906,12 @@ void Plater::send_gcode_legacy(int plate_idx, Export3mfProgressFn proFn, bool us default_output_file.replace_extension("3mf"); } - // 获取文件路径 + // get file path auto file_path = get_partplate_list().get_curr_plate()->get_tmp_gcode_path(); upload_job.upload_data.source_path = file_path; upload_job.upload_data.upload_path = default_output_file; - // 选择上传 or 打印 + // upload or print // Repetier specific: Query the server for the list of file groups. wxArrayString groups; @@ -13967,7 +13924,6 @@ void Plater::send_gcode_legacy(int plate_idx, Export3mfProgressFn proFn, bool us config->get_bool("open_device_tab_post_upload")); dlg.init(); if (dlg.ShowModal() == wxID_CANCEL) { - // 如果用户取消操作,直接返回 return; } config->set_bool("open_device_tab_post_upload", dlg.switch_to_device_tab()); From e92633be9c8c4cbcfebe041fe53cae3664aa8c84 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 18 Mar 2026 16:22:13 +0800 Subject: [PATCH 10/46] feature upload or print notify web the nozzle info --- src/slic3r/GUI/SSWCP.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index d459f4504c7..dae26fd25c6 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -3020,6 +3020,7 @@ void SSWCP_MachineOption_Instance::sw_FinishFilamentMapping() void SSWCP_MachineOption_Instance::sw_GetFileFilamentMapping() { try { + auto data2 = m_param_data.dump(); std::string filename = m_param_data.count("filename") ? m_param_data["filename"].get() : ""; if (filename == "") { @@ -3123,6 +3124,25 @@ void SSWCP_MachineOption_Instance::sw_GetFileFilamentMapping() response["filament_extruder_map"] = object; } + //nozzle info + PartPlate* cur_plate = wxGetApp().plater()->get_partplate_list().get_curr_plate(); + if (cur_plate) + { + auto* nozzle_opt = cur_plate->fff_print()->config().option("nozzle_diameter"); + std::vector nozzle_list; + if (nozzle_opt) { + for (float d : nozzle_opt->values) { + nozzle_list.push_back(std::abs(d - 0.2f) < 1e-5f ? "0.2" : + std::abs(d - 0.4f) < 1e-5f ? "0.4" : + std::abs(d - 0.6f) < 1e-5f ? "0.6" : + std::abs(d - 0.8f) < 1e-5f ? "0.8" : + std::to_string(d)); + } + + response["nozzle_info"] = nozzle_list; + } + } + // printer model auto current_preset = wxGetApp().preset_bundle->printers.get_edited_preset(); std::string c_preset = ""; From 2c2aa192a1a77e42f2cd6ecd4de99fe1216fb4d9 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 18 Mar 2026 16:23:03 +0800 Subject: [PATCH 11/46] feature remove not work code. --- src/slic3r/GUI/SSWCP.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index dae26fd25c6..c0c47427b72 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -3020,7 +3020,6 @@ void SSWCP_MachineOption_Instance::sw_FinishFilamentMapping() void SSWCP_MachineOption_Instance::sw_GetFileFilamentMapping() { try { - auto data2 = m_param_data.dump(); std::string filename = m_param_data.count("filename") ? m_param_data["filename"].get() : ""; if (filename == "") { From 224c40341c8d3af0bd7d2bad0c9a7a17b5d1fcd3 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 19 Mar 2026 18:15:34 +0800 Subject: [PATCH 12/46] feature rename the graphic effect plate, add dialog for sync nozzle select from machine. --- src/libslic3r/Preset.cpp | 2 +- src/libslic3r/Print.cpp | 4 +- src/libslic3r/PrintConfig.cpp | 20 +++--- src/libslic3r/PrintConfig.hpp | 4 +- src/slic3r/GUI/Plater.cpp | 90 ++++++++++++++++++++++++++- src/slic3r/GUI/Tab.cpp | 16 ++--- src/slic3r/GUI/Widgets/RadioGroup.cpp | 45 ++++++++++++-- src/slic3r/GUI/Widgets/RadioGroup.hpp | 4 ++ 8 files changed, 155 insertions(+), 30 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 42902e9163f..b252795c2cc 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -879,7 +879,7 @@ static std::vector s_Preset_filament_options { "cool_plate_temp", "textured_cool_plate_temp", "eng_plate_temp", "hot_plate_temp", "textured_plate_temp", "cool_plate_temp_initial_layer", "textured_cool_plate_temp_initial_layer", "eng_plate_temp_initial_layer", "hot_plate_temp_initial_layer", "textured_plate_temp_initial_layer", "supertack_plate_temp_initial_layer", "supertack_plate_temp", - "graphic_effect_steel_plate_temp", "graphic_effect_steel_plate_temp_initial_layer", + "graphic_effect_plate_temp", "graphic_effect_plate_temp_initial_layer", // "bed_type", //BBS:temperature_vitrification "temperature_vitrification", "reduce_fan_stop_start_freq","dont_slow_down_outer_wall", "slow_down_for_layer_cooling", "fan_min_speed", diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 8d27e02dbe2..5439d638879 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -135,7 +135,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n "eng_plate_temp_initial_layer", "hot_plate_temp_initial_layer", "textured_plate_temp_initial_layer", - "graphic_effect_steel_plate_temp_initial_layer", + "graphic_effect_plate_temp_initial_layer", "gcode_add_line_number", "layer_change_gcode", "time_lapse_gcode", @@ -283,7 +283,7 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n || opt_key == "eng_plate_temp" || opt_key == "hot_plate_temp" || opt_key == "textured_plate_temp" - || opt_key == "graphic_effect_steel_plate_temp" + || opt_key == "graphic_effect_plate_temp" || opt_key == "enable_prime_tower" || opt_key == "prime_tower_width" || opt_key == "prime_tower_brim_width" diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index c07aee7a693..d6ffdbafc66 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -762,15 +762,15 @@ void PrintConfigDef::init_fff_params() def->max = 300; def->set_default_value(new ConfigOptionInts{45});//todo by alves will be update the mini temp - def = this->add("graphic_effect_steel_plate_temp", coInts); + def = this->add("graphic_effect_plate_temp", coInts); def->label = L("Other layers"); def->tooltip = L("Bed temperature for layers except the initial one. " - "A value of 0 means the filament does not support printing on the Graphic Effect Steel Plate."); + "A value of 0 means the filament does not support printing on the Graphic Effect Plate."); def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->full_label = L("Bed temperature"); def->min = 0; def->max = 300; - def->set_default_value(new ConfigOptionInts{45}); + def->set_default_value(new ConfigOptionInts{100}); def = this->add("supertack_plate_temp_initial_layer", coInts); def->label = L("Initial layer"); @@ -831,15 +831,15 @@ void PrintConfigDef::init_fff_params() def->max = 300; def->set_default_value(new ConfigOptionInts{45}); - def = this->add("graphic_effect_steel_plate_temp_initial_layer", coInts); + def = this->add("graphic_effect_plate_temp_initial_layer", coInts); def->label = L("Initial layer"); def->full_label = L("Initial layer bed temperature"); def->tooltip = L("Bed temperature of the initial layer. " - "A value of 0 means the filament does not support printing on the Graphic Effect Steel Plate."); + "A value of 0 means the filament does not support printing on the Graphic Effect Plate."); def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->min = 0; def->max = 300; - def->set_default_value(new ConfigOptionInts{45}); + def->set_default_value(new ConfigOptionInts{100}); def = this->add("curr_bed_type", coEnum); def->label = L("Bed type"); @@ -862,10 +862,10 @@ void PrintConfigDef::init_fff_params() // U1 only 3 def->enum_values_u1.emplace_back("Textured PEI Plate"); def->enum_values_u1.emplace_back("High Temp Plate"); - def->enum_values_u1.emplace_back("Graphic Effect Steel Plate"); + def->enum_values_u1.emplace_back("Graphic Effect Plate"); def->enum_labels_u1.emplace_back(L("Textured PEI Plate")); def->enum_labels_u1.emplace_back(L("Smooth High Temp Plate")); - def->enum_labels_u1.emplace_back(L("Graphic Effect Steel Plate")); + def->enum_labels_u1.emplace_back(L("Graphic Effect Plate")); // U1 use 7 when open support_multi_bed_types def->enum_values_ex.emplace_back("Cool Plate"); def->enum_values_ex.emplace_back("Engineering Plate"); @@ -873,14 +873,14 @@ void PrintConfigDef::init_fff_params() def->enum_values_ex.emplace_back("Textured PEI Plate"); def->enum_values_ex.emplace_back("Textured Cool Plate"); def->enum_values_ex.emplace_back("Supertack Plate"); - def->enum_values_ex.emplace_back("Graphic Effect Steel Plate"); + def->enum_values_ex.emplace_back("Graphic Effect Plate"); def->enum_labels_ex.emplace_back(L("Smooth Cool Plate")); def->enum_labels_ex.emplace_back(L("Engineering Plate")); def->enum_labels_ex.emplace_back(L("Smooth High Temp Plate")); def->enum_labels_ex.emplace_back(L("Textured PEI Plate")); def->enum_labels_ex.emplace_back(L("Textured Cool Plate")); def->enum_labels_ex.emplace_back(L("Cool Plate (SuperTack)")); - def->enum_labels_ex.emplace_back(L("Graphic Effect Steel Plate")); + def->enum_labels_ex.emplace_back(L("Graphic Effect Plate")); def->set_default_value(new ConfigOptionEnum(btPC)); // Orca: allow profile maker to set default bed type in machine profile diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index e6fbc6ea139..d9a403f8015 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -424,7 +424,7 @@ static std::string get_bed_temp_key(const BedType type) return "textured_plate_temp"; if (type == btGESP) - return "graphic_effect_steel_plate_temp"; + return "graphic_effect_plate_temp"; return ""; } @@ -450,7 +450,7 @@ static std::string get_bed_temp_1st_layer_key(const BedType type) return "textured_plate_temp_initial_layer"; if (type == btGESP) - return "graphic_effect_steel_plate_temp_initial_layer"; + return "graphic_effect_plate_temp_initial_layer"; return ""; } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 317a3ffb933..e6947efe5cb 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -126,6 +127,7 @@ #include "Widgets/Label.hpp" #include "Widgets/RoundedRectangle.hpp" #include "Widgets/RadioGroup.hpp" +#include "Widgets/DialogButtons.hpp" #include "Widgets/CheckBox.hpp" #include "Widgets/Button.hpp" @@ -211,6 +213,69 @@ wxDEFINE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent); #define PRINTER_PANEL_SIZE_WIDEN (wxSize(FromDIP(136), FromDIP(68))) #define PRINTER_PANEL_SIZE (wxSize(FromDIP(98), FromDIP(98))) +// Nozzle diameter selection when multiple diameters are reported (e.g. U1 sync). +// diameters_raw: list from device (may have duplicates or fewer than 4). Dedup and full-list logic inside. +namespace { +class NozzleDiameterSelectDialog : public DPIDialog +{ + RadioGroup* m_radio = nullptr; + std::vector m_diameters; + +public: + NozzleDiameterSelectDialog(wxWindow* parent, const wxString& message, const wxString& caption, + const std::vector& diameters_raw) + : DPIDialog(parent, wxID_ANY, caption, wxDefaultPosition, wxDefaultSize, wxCAPTION | wxCLOSE_BOX) + { + static const std::vector full_list = {"0.2", "0.4", "0.6", "0.8"}; + std::set returned_set(diameters_raw.begin(), diameters_raw.end()); + std::vector item_enabled(full_list.size(), true); + bool any_enabled = false; + for (size_t i = 0; i < full_list.size(); ++i) { + bool in = (returned_set.count(full_list[i]) > 0); + item_enabled[i] = in; + if (in) any_enabled = true; + } + if (!any_enabled) + item_enabled.assign(full_list.size(), true); + m_diameters = full_list; + + SetBackgroundColour(*wxWHITE); + wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL); + wxStaticText* msg = new wxStaticText(this, wxID_ANY, message); + msg->Wrap(FromDIP(400)); + sizer->Add(msg, 0, wxALL, FromDIP(10)); + std::vector labels; + for (const auto& d : m_diameters) + labels.push_back(_L("Nozzle") + ": " + from_u8(d) + "mm"); + m_radio = new RadioGroup(this, labels, wxHORIZONTAL, 2); + for (size_t i = 0; i < item_enabled.size(); ++i) + if (!item_enabled[i]) + m_radio->SetItemEnabled((int)i, false); + int first = 0; + for (; first < (int)item_enabled.size(); ++first) + if (item_enabled[first]) break; + if (first >= (int)item_enabled.size()) first = 0; + m_radio->SetSelection(first, false); + sizer->Add(m_radio, 0, wxALL, FromDIP(10)); + auto* btns = new DialogButtons(this, {"OK", "Cancel"}); + btns->GetOK()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_OK); }); + btns->GetCANCEL()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_CANCEL); }); + sizer->Add(btns, 0, wxEXPAND); + SetSizer(sizer); + Layout(); + Fit(); + Centre(wxBOTH); + wxGetApp().UpdateDlgDarkUI(this); + } + int GetSelection() const { return m_radio ? m_radio->GetSelection() : -1; } + std::string GetSelectedDiameter() const { + int idx = GetSelection(); + return (idx >= 0 && idx < (int)m_diameters.size()) ? m_diameters[idx] : std::string(); + } + void on_dpi_changed(const wxRect& suggested_rect) override {} +}; +} // namespace + bool Plater::has_illegal_filename_characters(const wxString& wxs_name) { std::string name = into_u8(wxs_name); @@ -1044,7 +1109,28 @@ Sidebar::Sidebar(Plater *parent) if (res) { - //select the someone nozzle size to show + //std::vector diameters_raw = nozzle_diameters; + std::vector diameters_raw = {"0.2", "0.8"}; + wxTheApp->CallAfter([this, diameters_raw]() { + NozzleDiameterSelectDialog dlg( + wxGetApp().mainframe, + _L("Tip: The current version does not support multi-nozzle mixed diameter printing. " + "Inconsistent printer nozzle diameters detected; please select the nozzle to be used for this print."), + _L("Set nozzle diameter"), + diameters_raw); + if (dlg.ShowModal() == wxID_OK) { + std::string sel = dlg.GetSelectedDiameter(); + if (!sel.empty()) { + auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, sel); + if (preset) { + preset->is_visible = true; + wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); + wxGetApp().plater()->sidebar().update_all_preset_comboboxes(true); + wxGetApp().plater()->sidebar().update_nozzle_settings(true); + } + } + } + }); return; } @@ -2669,7 +2755,7 @@ void Sidebar::update_nozzle_settings(bool switch_machine) } wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); - event.Skip(); + // Do not event.Skip(): select_preset rebuilds nozzle UI and can destroy this combo; skipping would let sidebar treat this as bed-type combo and use-after-free. }); auto diam_str = wxGetApp().preset_bundle->printers.get_edited_preset().config.option("printer_variant")->value; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 7b9fbf51de9..7f70efae610 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3557,8 +3557,8 @@ void TabFilament::build() line = {L("Graphic Effect Steel Plate"), L("Bed temperature when the Graphic Effect Steel Plate is installed. A value of 0 means the filament does not support printing on the Graphic Effect Steel Plate.")}; - line.append_option(optgroup->get_option("graphic_effect_steel_plate_temp_initial_layer")); - line.append_option(optgroup->get_option("graphic_effect_steel_plate_temp")); + line.append_option(optgroup->get_option("graphic_effect_plate_temp_initial_layer")); + line.append_option(optgroup->get_option("graphic_effect_plate_temp")); optgroup->append_line(line); optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) @@ -3832,8 +3832,8 @@ void TabFilament::toggle_options() toggle_line("hot_plate_temp", true); toggle_line("textured_plate_temp_initial_layer", true); toggle_line("textured_plate_temp", true); - toggle_line("graphic_effect_steel_plate_temp_initial_layer", true); - toggle_line("graphic_effect_steel_plate_temp", true); + toggle_line("graphic_effect_plate_temp_initial_layer", true); + toggle_line("graphic_effect_plate_temp", true); } else if (support_multi_bed_types) { // u1 has 7 plates toggle_line("supertack_plate_temp_initial_layer", true); @@ -3848,8 +3848,8 @@ void TabFilament::toggle_options() toggle_line("hot_plate_temp", true); toggle_line("textured_plate_temp_initial_layer", true); toggle_line("textured_plate_temp", true); - toggle_line("graphic_effect_steel_plate_temp_initial_layer", is_snapmaker_u1); - toggle_line("graphic_effect_steel_plate_temp", is_snapmaker_u1); + toggle_line("graphic_effect_plate_temp_initial_layer", is_snapmaker_u1); + toggle_line("graphic_effect_plate_temp", is_snapmaker_u1); } else { BedType curr_bed_type = m_preset_bundle->printers.get_edited_preset().get_default_bed_type(m_preset_bundle); toggle_line("supertack_plate_temp_initial_layer", curr_bed_type == btSuperTack); @@ -3864,8 +3864,8 @@ void TabFilament::toggle_options() toggle_line("hot_plate_temp", curr_bed_type == btPEI); toggle_line("textured_plate_temp_initial_layer", curr_bed_type == btPTE); toggle_line("textured_plate_temp", curr_bed_type == btPTE); - toggle_line("graphic_effect_steel_plate_temp_initial_layer", curr_bed_type == btGESP); - toggle_line("graphic_effect_steel_plate_temp", curr_bed_type == btGESP); + toggle_line("graphic_effect_plate_temp_initial_layer", curr_bed_type == btGESP); + toggle_line("graphic_effect_plate_temp", curr_bed_type == btGESP); } diff --git a/src/slic3r/GUI/Widgets/RadioGroup.cpp b/src/slic3r/GUI/Widgets/RadioGroup.cpp index a5f63a9ac0e..6ef9e2eb4ab 100644 --- a/src/slic3r/GUI/Widgets/RadioGroup.cpp +++ b/src/slic3r/GUI/Widgets/RadioGroup.cpp @@ -30,6 +30,7 @@ void RadioGroup::Create( { m_labels = labels; m_item_count = m_labels.size(); + m_item_enabled.assign(m_item_count, true); auto bg = parent->GetBackgroundColour(); this->SetBackgroundColour(bg); @@ -110,7 +111,7 @@ void RadioGroup::Create( void RadioGroup::SetSelection(int index, bool focus) { - if (index >= 0 && index < m_item_count){ + if (index >= 0 && index < m_item_count && (m_item_enabled.empty() || m_item_enabled[index])) { int prev_index = m_selectedIndex; if(index != prev_index){ // prevent no focusable item on first creation. wxPanel starts taking focus if there is no focusable control m_labelButtons[index]->SetCanFocus(true); @@ -136,17 +137,31 @@ int RadioGroup::GetSelection() void RadioGroup::SelectNext(bool focus) { - SetSelection(m_selectedIndex + 1 > (m_radioButtons.size() - 1) ? 0 : m_selectedIndex + 1, focus); + for (size_t k = 1; k < m_item_count; ++k) { + int idx = (m_selectedIndex + (int)k) % (int)m_item_count; + if (idx < (int)m_item_enabled.size() && m_item_enabled[idx]) { + SetSelection(idx, focus); + return; + } + } } void RadioGroup::SelectPrevious(bool focus) { - SetSelection(m_selectedIndex - 1 < 0 ? (m_radioButtons.size() - 1) : m_selectedIndex - 1, focus); + for (size_t k = 1; k < m_item_count; ++k) { + int idx = m_selectedIndex - (int)k; + if (idx < 0) idx += (int)m_item_count; + if (idx < (int)m_item_enabled.size() && m_item_enabled[idx]) { + SetSelection(idx, focus); + return; + } + } } void RadioGroup::SetRadioIcon(int i, bool hover) { - auto icon = !m_enabled ? m_disabled : m_selectedIndex == i ? (hover ? m_on_hover : m_on) : (hover ? m_off_hover : m_off); + bool item_disabled = !m_enabled || (i < (int)m_item_enabled.size() && !m_item_enabled[i]); + auto icon = item_disabled ? m_disabled : m_selectedIndex == i ? (hover ? m_on_hover : m_on) : (hover ? m_off_hover : m_off); m_radioButtons[i]->SetBitmap(icon.bmp()); } @@ -158,7 +173,9 @@ bool RadioGroup::Enable(bool enable) if (result) { for (size_t i = 0; i < m_item_count; ++i){ SetRadioIcon(i, false); - m_labelButtons[i]->Enable(enable); // normally disabling parent should do this but not + bool item_on = enable && (i >= m_item_enabled.size() || m_item_enabled[i]); + m_labelButtons[i]->Enable(item_on); + m_radioButtons[i]->Enable(item_on); } wxCommandEvent e(EVT_ENABLE_CHANGED); @@ -179,4 +196,22 @@ void RadioGroup::SetRadioTooltip(int i, wxString tooltip) { m_radioButtons[i]->SetToolTip(tooltip); m_labelButtons[i]->SetToolTip(tooltip); +} + +void RadioGroup::SetItemEnabled(int index, bool enable) +{ + if (index < 0 || index >= m_item_count) return; + if ((int)m_item_enabled.size() != m_item_count) + m_item_enabled.assign(m_item_count, true); + m_item_enabled[index] = enable; + m_radioButtons[index]->Enable(enable); + m_labelButtons[index]->Enable(enable); + SetRadioIcon(index, false); + if (!enable && m_selectedIndex == index) { + for (int i = 0; i < m_item_count; ++i) + if (m_item_enabled[i]) { + SetSelection(i, false); + break; + } + } } \ No newline at end of file diff --git a/src/slic3r/GUI/Widgets/RadioGroup.hpp b/src/slic3r/GUI/Widgets/RadioGroup.hpp index 93dc1df73fd..a85a2fe1ca2 100644 --- a/src/slic3r/GUI/Widgets/RadioGroup.hpp +++ b/src/slic3r/GUI/Widgets/RadioGroup.hpp @@ -48,8 +48,12 @@ class RadioGroup : public wxPanel void SetRadioTooltip(int i, wxString tooltip); + /** Enable or disable a single item. By default all items are enabled. */ + void SetItemEnabled(int index, bool enable); + private: std::vector m_labels; + std::vector m_item_enabled; std::vector m_radioButtons; std::vector m_labelButtons; From b324fc8f397be84f8302e74bcef70bd6a08d8c34 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 19 Mar 2026 19:00:49 +0800 Subject: [PATCH 13/46] feature sync nozzle info and set the nozzle combobox data. --- src/slic3r/GUI/Plater.cpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index e6947efe5cb..d194811bbfa 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1109,8 +1109,8 @@ Sidebar::Sidebar(Plater *parent) if (res) { - //std::vector diameters_raw = nozzle_diameters; - std::vector diameters_raw = {"0.2", "0.8"}; + std::vector diameters_raw = nozzle_diameters; + //std::vector diameters_raw = {"0.2", "0.8"}; wxTheApp->CallAfter([this, diameters_raw]() { NozzleDiameterSelectDialog dlg( wxGetApp().mainframe, @@ -1124,6 +1124,19 @@ Sidebar::Sidebar(Plater *parent) auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, sel); if (preset) { preset->is_visible = true; + + auto diameter = sel; + auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, diameter); + if (preset == nullptr) { + BOOST_LOG_TRIVIAL(error) << "get the similar printer preset fail"; + return; + } + preset->is_visible = true; // force visible + + for (size_t i = 0; i < p->m_nozzle_diameter_lists.size(); ++i) { + p->m_nozzle_diameter_lists[i]->SetValue(diameter + "mm"); + } + wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); wxGetApp().plater()->sidebar().update_all_preset_comboboxes(true); wxGetApp().plater()->sidebar().update_nozzle_settings(true); @@ -2750,7 +2763,7 @@ void Sidebar::update_nozzle_settings(bool switch_machine) preset->is_visible = true; // force visible for (size_t i = 0; i < p->m_nozzle_diameter_lists.size(); ++i) { - // 当前原则上不支持两个头使用不同的喷嘴型号 + //set all nozzle use the diameter p->m_nozzle_diameter_lists[i]->SetValue(diameter + "mm"); } From 887101ef02cc3b2b7faaaa766d4cc12bc22fd080 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 20 Mar 2026 14:32:18 +0800 Subject: [PATCH 14/46] feature add tips for plate use filament. --- src/slic3r/GUI/Plater.cpp | 16 ++++++++++++++++ src/slic3r/GUI/PresetComboBoxes.cpp | 10 ++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d194811bbfa..6f85dcf3cc0 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2729,6 +2729,14 @@ void Sidebar::update_nozzle_settings(bool switch_machine) diameter_combo->Bind(wxEVT_COMBOBOX, [this, diameter_combo, i](wxCommandEvent& event) { + auto* pNotice = p->plater->get_notification_manager(); + if (pNotice) + { + pNotice->close_notification_of_type(NotificationType::CustomNotification); + pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); + pNotice->set_slicing_progress_hidden(); + } + auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; auto printer_model_opt = printer_config.option("printer_model"); if (printer_model_opt) { @@ -7582,6 +7590,14 @@ void Plater::priv::set_current_panel(wxPanel* panel, bool no_slice) // BBS void Plater::priv::on_combobox_select(wxCommandEvent &evt) { + auto* pNotice = q->get_notification_manager(); + if(pNotice) + { + pNotice->close_notification_of_type(NotificationType::PlaterWarning); + pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); + pNotice->set_slicing_progress_hidden(); + } + PlaterPresetComboBox* preset_combo_box = dynamic_cast(evt.GetEventObject()); if (preset_combo_box) { this->on_select_preset(evt); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index d7682b8451a..32114b34c2d 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -28,6 +28,7 @@ #include "GUI.hpp" #include "GUI_App.hpp" +#include "NotificationManager.hpp" #include "Plater.hpp" #include "MainFrame.hpp" #include "format.hpp" @@ -845,6 +846,15 @@ static void run_wizard(ConfigWizard::StartPage sp) void PlaterPresetComboBox::OnSelect(wxCommandEvent &evt) { + if (wxGetApp().plater()) { + auto* pNotice = wxGetApp().plater()->get_notification_manager(); + if (pNotice) { + pNotice->close_notification_of_type(NotificationType::CustomNotification); + pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); + pNotice->set_slicing_progress_hidden(); + } + } + auto selected_item = evt.GetSelection(); auto marker = reinterpret_cast(this->GetClientData(selected_item)); From 3654ea055d67f8bb7fa53c2e1afb32304ae93c68 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 20 Mar 2026 14:39:28 +0800 Subject: [PATCH 15/46] feature remove the nozzle modify entrance. --- src/slic3r/GUI/Plater.cpp | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 6f85dcf3cc0..b5a2c8a039d 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2792,28 +2792,7 @@ void Sidebar::update_nozzle_settings(bool switch_machine) // 删除Flow相关控件 - // Add edit button - ScalableButton* edit_btn = new ScalableButton(nozzle_panel, wxID_ANY, "edit"); - if (is_dark) { - edit_btn->SetBackgroundColour(wxColour(45, 45, 49)); - } - else { - edit_btn->SetBackgroundColour(wxColour(255, 255, 255)); - } - - - edit_btn->SetToolTip(_L("Click to edit nozzle settings")); - - edit_btn->Bind(wxEVT_BUTTON, [this, i, new_nozzle_count](wxCommandEvent&) { - p->editing_filament = -1; - wxGetApp().params_dialog()->Show(); - wxGetApp().get_tab(Preset::TYPE_PRINTER)->activate_option("", "Extruder " + std::to_string(i + 1)); - }); - - p->m_nozzle_edit_btns.push_back(edit_btn); - tab_sizer->Add(diameter_sizer, 1, wxEXPAND | wxALIGN_CENTER_VERTICAL); - tab_sizer->Add(edit_btn, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, FromDIP(10)); // 添加右边距 nozzle_panel->SetSizer(tab_sizer); From a78dbcb89326aebbddeb3be687957cd9148fc64b Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 20 Mar 2026 15:41:54 +0800 Subject: [PATCH 16/46] feature update the Smooth PEI Plate layer temp. --- src/libslic3r/PrintConfig.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index d6ffdbafc66..9d232fd9a4a 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -750,7 +750,7 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Bed temperature"); def->min = 0; def->max = 300; - def->set_default_value(new ConfigOptionInts{ 45 }); + def->set_default_value(new ConfigOptionInts{ 120 }); def = this->add("textured_plate_temp", coInts); def->label = L("Other layers"); @@ -819,7 +819,7 @@ void PrintConfigDef::init_fff_params() "A value of 0 means the filament does not support printing on the High Temp Plate."); def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->max = 300; - def->set_default_value(new ConfigOptionInts{ 45 }); + def->set_default_value(new ConfigOptionInts{ 120 }); def = this->add("textured_plate_temp_initial_layer", coInts); def->label = L("Initial layer"); From e1b53208abca733f03fa01be9b878044cf6421ff Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 20 Mar 2026 16:30:02 +0800 Subject: [PATCH 17/46] feature update the plate name for snapmaker u1. --- src/libslic3r/PrintConfig.cpp | 4 +- src/slic3r/GUI/Tab.cpp | 92 ++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 9d232fd9a4a..1a8df85b8d8 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -864,7 +864,7 @@ void PrintConfigDef::init_fff_params() def->enum_values_u1.emplace_back("High Temp Plate"); def->enum_values_u1.emplace_back("Graphic Effect Plate"); def->enum_labels_u1.emplace_back(L("Textured PEI Plate")); - def->enum_labels_u1.emplace_back(L("Smooth High Temp Plate")); + def->enum_labels_u1.emplace_back(L("Smooth PEI Plate")); def->enum_labels_u1.emplace_back(L("Graphic Effect Plate")); // U1 use 7 when open support_multi_bed_types def->enum_values_ex.emplace_back("Cool Plate"); @@ -876,7 +876,7 @@ void PrintConfigDef::init_fff_params() def->enum_values_ex.emplace_back("Graphic Effect Plate"); def->enum_labels_ex.emplace_back(L("Smooth Cool Plate")); def->enum_labels_ex.emplace_back(L("Engineering Plate")); - def->enum_labels_ex.emplace_back(L("Smooth High Temp Plate")); + def->enum_labels_ex.emplace_back(L("Smooth PEI Plate")); def->enum_labels_ex.emplace_back(L("Textured PEI Plate")); def->enum_labels_ex.emplace_back(L("Textured Cool Plate")); def->enum_labels_ex.emplace_back(L("Cool Plate (SuperTack)")); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 7f70efae610..7043ced8805 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -2596,6 +2596,62 @@ void TabPrint::toggle_options() } cb->SetValue(n); } + + // Keep plate bed-type list in sync with currently selected printer. + if (m_type == Preset::TYPE_PLATE && m_active_page->title() == L("Plate Settings")) { + Field* bed_type_field = m_active_page->get_field("curr_bed_type"); + if (auto bed_type_choice = dynamic_cast(bed_type_field)) { + auto bed_type_cb = dynamic_cast(bed_type_choice->window); + auto bed_type_def = print_config_def.get("curr_bed_type"); + if (bed_type_cb && bed_type_def) { + const Preset& printer_preset = m_preset_bundle->printers.get_selected_preset(); + auto printer_cfg = m_preset_bundle->printers.get_edited_preset().config; + bool is_snapmaker_u1 = boost::icontains(printer_preset.name, "Snapmaker U1"); + if (auto printer_model_opt = printer_cfg.option("printer_model")) { + const std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = is_snapmaker_u1 || (boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1")); + } + bool support_multi_bed_types = false; + if (auto support_multi_bed_types_opt = printer_cfg.option("support_multi_bed_types")) { + support_multi_bed_types = support_multi_bed_types_opt->value; + } + + auto& opt = const_cast(bed_type_field->m_opt); + opt.enum_values.clear(); + opt.enum_labels.clear(); + + const std::vector* target_values = &bed_type_def->enum_values; + const std::vector* target_labels = &bed_type_def->enum_labels; + if (is_snapmaker_u1) { + if (support_multi_bed_types) { + target_values = &bed_type_def->enum_values_ex; + target_labels = &bed_type_def->enum_labels_ex; + } else { + target_values = &bed_type_def->enum_values_u1; + target_labels = &bed_type_def->enum_labels_u1; + } + } + + bed_type_cb->Clear(); + for (size_t i = 0; i < target_values->size() && i < target_labels->size(); ++i) { + opt.enum_values.push_back((*target_values)[i]); + opt.enum_labels.push_back((*target_labels)[i]); + bed_type_cb->Append(_((*target_labels)[i])); + } + + int curr_bed_type = m_config->opt_enum("curr_bed_type"); + std::string curr_key; + for (const auto& kv : *bed_type_def->enum_keys_map) { + if (kv.second == curr_bed_type) { + curr_key = kv.first; + break; + } + } + auto it = std::find(opt.enum_values.begin(), opt.enum_values.end(), curr_key); + bed_type_cb->SetSelection(it == opt.enum_values.end() ? 0 : int(it - opt.enum_values.begin())); + } + } + } } void TabPrint::update() @@ -2940,7 +2996,32 @@ void TabPrintPlate::build() auto page = add_options_page(L("Plate Settings"), "empty"); auto optgroup = page->new_optgroup(""); - optgroup->append_single_option_line("curr_bed_type"); + { + Option bed_type_option = optgroup->get_option("curr_bed_type"); + bool is_snapmaker_u1 = false; + bool support_multi_bed_types = false; + const Preset& printer_preset = m_preset_bundle->printers.get_edited_preset(); + auto printer_cfg = printer_preset.config; + is_snapmaker_u1 = boost::icontains(printer_preset.name, "Snapmaker U1"); + if (auto printer_model_opt = printer_cfg.option("printer_model")) { + const std::string printer_model = printer_model_opt->value; + is_snapmaker_u1 = is_snapmaker_u1 || (boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1")); + } + if (auto support_multi_bed_types_opt = printer_cfg.option("support_multi_bed_types")) { + support_multi_bed_types = support_multi_bed_types_opt->value; + } + + if (is_snapmaker_u1) { + if (support_multi_bed_types) { + bed_type_option.opt.enum_values = bed_type_option.opt.enum_values_ex; + bed_type_option.opt.enum_labels = bed_type_option.opt.enum_labels_ex; + } else { + bed_type_option.opt.enum_values = bed_type_option.opt.enum_values_u1; + bed_type_option.opt.enum_labels = bed_type_option.opt.enum_labels_u1; + } + } + optgroup->append_single_option_line(bed_type_option); + } optgroup->append_single_option_line("skirt_start_angle"); optgroup->append_single_option_line("print_sequence"); optgroup->append_single_option_line("spiral_mode"); @@ -3814,9 +3895,16 @@ void TabFilament::toggle_options() // BBS: 控制床温选项的显示 auto support_multi_bed_types = is_BBL_printer || cfg.opt_bool("support_multi_bed_types"); bool is_snapmaker_u1 = false; + const Preset& printer_preset = m_preset_bundle->printers.get_edited_preset(); + is_snapmaker_u1 = boost::icontains(printer_preset.name, "Snapmaker U1"); if (auto printer_model_opt = cfg.option("printer_model")) { std::string printer_model = printer_model_opt->value; - is_snapmaker_u1 = boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1"); + is_snapmaker_u1 = is_snapmaker_u1 || (boost::icontains(printer_model, "Snapmaker") && boost::icontains(printer_model, "U1")); + } + if (Line* hot_plate_line = get_line("hot_plate_temp_initial_layer")) { + hot_plate_line->label = is_snapmaker_u1 + ? _L("Smooth PEI Plate") + : _L("Smooth PEI Plate / High Temp Plate"); } if (is_snapmaker_u1 && !support_multi_bed_types) { // U1 default show 3 plates From 2ffdf640a300b099595dd2f95fc51d90ef6a71d2 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 30 Mar 2026 11:31:23 +0800 Subject: [PATCH 18/46] feature update ui img, guide page merge the nozzle for machine, update nozzle combobox select. --- resources/images/nozzle_sync.svg | 10 ++ resources/web/preset_bind/24/24.js | 145 ++++++++++++----------------- src/libslic3r/Preset.cpp | 13 +++ src/libslic3r/Preset.hpp | 2 + src/slic3r/GUI/ConfigWizard.cpp | 73 +++++++-------- src/slic3r/GUI/Plater.cpp | 29 +++--- src/slic3r/GUI/WebGuideDialog.cpp | 52 +++++------ src/slic3r/GUI/WebPresetDialog.cpp | 56 +++++------ 8 files changed, 185 insertions(+), 195 deletions(-) create mode 100644 resources/images/nozzle_sync.svg diff --git a/resources/images/nozzle_sync.svg b/resources/images/nozzle_sync.svg new file mode 100644 index 00000000000..e7457b9ca6e --- /dev/null +++ b/resources/images/nozzle_sync.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/resources/web/preset_bind/24/24.js b/resources/web/preset_bind/24/24.js index d7548dee8b3..b79abf22c45 100644 --- a/resources/web/preset_bind/24/24.js +++ b/resources/web/preset_bind/24/24.js @@ -89,26 +89,17 @@ function HandleModelList( pVal ) if( !ModelHtml.hasOwnProperty(strVendor)) ModelHtml[strVendor]=''; - let NozzleArray=OneModel['nozzle_diameter'].split(';'); - let HtmlNozzel=''; - for(let m=0;m' + - '' + nNozzel + '' + - 'mm nozzle'; - } + let HtmlNozzel = '
' + + '
'; let CoverImage=OneModel['cover']; ModelHtml[strVendor]+='
'+ '
'+ -'
'+OneModel['model']+'
'+ HtmlNozzel +'
'; +'
'+ HtmlNozzel +'
'+OneModel['model']+'
'; } //Update Nozzel Html Append @@ -125,22 +116,13 @@ function HandleModelList( pVal ) let OneModel=pModel[m]; let SelectList=OneModel['nozzle_selected']; - if(SelectList!='') - { - SelectList=OneModel['nozzle_selected'].split(';'); - let nLen=SelectList.length; - - for(let a=0;a' + - '' + nNozzel + '' + - 'mm nozzle'; - } + let HtmlNozzel = '
' + + '
'; let CoverImage = OneModel['cover']; ModelHtml[strVendor] += '
' + '
' + - '
' + OneModel['model'] + '
' + HtmlNozzel + '
'; + '
' + HtmlNozzel + '
' + OneModel['model'] + '
'; } //Update Nozzel Html Append @@ -290,16 +262,21 @@ function FilterModelList(keyword) { } // 更新radio选中状态 - $('input[type="radio"]').each(function() { + $('input[type="checkbox"]').each(function() { let strModel = $(this).attr("model"); let strVendor = $(this).attr("vendor"); - let strNozzel = $(this).attr("nozzel"); - - if(ModelNozzleSelected[strVendor] && - ModelNozzleSelected[strVendor][strModel] && - ModelNozzleSelected[strVendor][strModel][strNozzel]) { - $(this).prop("checked", true); + let nozzles = (($(this).attr("nozzle_all")) || "").split(';'); + let checked = false; + for (let i = 0; i < nozzles.length; i++) { + let strNozzel = nozzles[i]; + if (strNozzel != '' && ModelNozzleSelected[strVendor] && + ModelNozzleSelected[strVendor][strModel] && + ModelNozzleSelected[strVendor][strModel][strNozzel]) { + checked = true; + break; + } } + if (checked) $(this).prop("checked", true); }); TranslatePage(); @@ -311,25 +288,27 @@ function OnExitFilter() { let ModelAll = {}; for (vendor in ModelNozzleSelected) { for (model in ModelNozzleSelected[vendor]) { + let anyChecked = false; for (nozzel in ModelNozzleSelected[vendor][model]) { - if (!ModelNozzleSelected[vendor][model][nozzel]) - continue; - - if (!ModelAll.hasOwnProperty(model)) { - //alert("ADD: "+strModel); + if (ModelNozzleSelected[vendor][model][nozzel]) { + anyChecked = true; + break; + } + } + if (!anyChecked) + continue; + for (let i = 0; i < pModel.length; i++) { + let pm = pModel[i]; + if (pm['vendor'] == vendor && pm['model'] == model) { ModelAll[model] = {}; - ModelAll[model]["model"] = model; - ModelAll[model]["nozzle_diameter"] = ''; + ModelAll[model]["nozzle_diameter"] = pm["nozzle_diameter"]; ModelAll[model]["vendor"] = vendor; + nTotal++; + break; } - - ModelAll[model]["nozzle_diameter"] += ModelAll[model]["nozzle_diameter"] == '' ? nozzel : ';' + nozzel; - - nTotal++; } - } } @@ -365,7 +344,7 @@ function OnExit() let strModel=OneItem.getAttribute("model"); let strVendor=OneItem.getAttribute("vendor"); - let strNozzel=OneItem.getAttribute("nozzel"); + let strNozzelAll=OneItem.getAttribute("nozzle_all"); //alert(strModel+strVendor+strNozzel); @@ -380,7 +359,7 @@ function OnExit() ModelAll[strModel]["vendor"]=strVendor; } - ModelAll[strModel]["nozzle_diameter"]+=ModelAll[strModel]["nozzle_diameter"]==''?strNozzel:';'+strNozzel; + ModelAll[strModel]["nozzle_diameter"]=strNozzelAll; } var tSend={}; diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index b252795c2cc..bdbec08e98a 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -2649,6 +2649,19 @@ std::vector PresetCollection::diameters_of_selected_printer() return std::vector{diameters.begin(), diameters.end()}; } +std::vector PresetCollection::diameters_for_same_printer_model() +{ + std::set diameters; + const std::string printer_model = m_edited_preset.config.opt_string("printer_model"); + for (auto &preset : m_presets) { + if (!preset.is_system) + continue; + if (preset.config.opt_string("printer_model") == printer_model) + diameters.insert(preset.config.opt_string("printer_variant")); + } + return std::vector{diameters.begin(), diameters.end()}; +} + void PresetCollection::set_default_suppressed(bool default_suppressed) { if (m_default_suppressed != default_suppressed) { diff --git a/src/libslic3r/Preset.hpp b/src/libslic3r/Preset.hpp index 7ad35da6334..e5fae9bd1fd 100644 --- a/src/libslic3r/Preset.hpp +++ b/src/libslic3r/Preset.hpp @@ -619,6 +619,8 @@ class PresetCollection Preset* find_preset2(const std::string& name, bool auto_match = true); std::vector diameters_of_selected_printer(); + // All nozzle variants shipped for the current edited preset's printer_model (ignores is_visible). + std::vector diameters_for_same_printer_model(); const Preset* find_preset2(const std::string& name, bool auto_match = true) const { diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp index 2fcae845ffa..2b197e6abd0 100644 --- a/src/slic3r/GUI/ConfigWizard.cpp +++ b/src/slic3r/GUI/ConfigWizard.cpp @@ -216,7 +216,6 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt const auto font_title = GetFont().MakeBold().Scaled(1.3f); const auto font_name = GetFont().MakeBold(); - const auto font_alt_nozzle = GetFont().Scaled(0.9f); // wxGrid appends widgets by rows, but we need to construct them in columns. // These vectors are used to hold the elements so that they can be appended in the right order. @@ -227,7 +226,6 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt int max_row_width = 0; int current_row_width = 0; - bool is_variants = false; for (const auto &model : models) { if (! filter(model)) { continue; } @@ -273,32 +271,25 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt variants_panel->SetSizer(variants_sizer); const auto model_id = model.id; - for (size_t i = 0; i < model.variants.size(); i++) { - const auto &variant = model.variants[i]; + // Model-level selection: one checkbox per machine, internally maps to all variants. + const auto label = from_u8(model.name); + std::string primary_variant = model.variants.empty() ? std::string() : model.variants.front().name; + auto *cbox = new Checkbox(variants_panel, label, model_id, primary_variant); + cboxes.push_back(cbox); - const auto label = model.technology == ptFFF - ? from_u8((boost::format("%1% %2% %3%") % variant.name % _utf8("mm") % _utf8(L("nozzle"))).str()) - : from_u8(model.name); - - if (i == 1) { - auto *alt_label = new wxStaticText(variants_panel, wxID_ANY, _L("Alternate nozzles:")); - alt_label->SetFont(font_alt_nozzle); - variants_sizer->Add(alt_label, 0, wxBOTTOM, 3); - is_variants = true; + bool enabled = false; + for (const auto &variant : model.variants) { + if (appconfig.get_variant(vendor.id, model_id, variant.name)) { + enabled = true; + break; } - - auto *cbox = new Checkbox(variants_panel, label, model_id, variant.name); - i == 0 ? cboxes.push_back(cbox) : cboxes_alt.push_back(cbox); - - const bool enabled = appconfig.get_variant(vendor.id, model_id, variant.name); - cbox->SetValue(enabled); - - variants_sizer->Add(cbox, 0, wxBOTTOM, 3); - - cbox->Bind(wxEVT_CHECKBOX, [this, cbox](wxCommandEvent &event) { - on_checkbox(cbox, event.IsChecked()); - }); } + cbox->SetValue(enabled); + + variants_sizer->Add(cbox, 0, wxBOTTOM, 3); + cbox->Bind(wxEVT_CHECKBOX, [this, cbox](wxCommandEvent &event) { + on_checkbox(cbox, event.IsChecked()); + }); variants_panels.push_back(variants_panel); } @@ -342,9 +333,8 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt } title_sizer->AddStretchSpacer(); - if (titles.size() > 1 || is_variants) { + if (titles.size() > 1) { // It only makes sense to add the All / None buttons if there's multiple printers - // All Standard button is added when there are more variants for at least one printer auto *sel_all_std = new Button(this, titles.size() > 1 ? _L("All standard") : _L("Standard")); auto *sel_all = new Button(this, _L("All")); auto *sel_none = new Button(this, _L("None")); @@ -353,12 +343,8 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt wxGetApp().UpdateDarkUI(sel_all); wxGetApp().UpdateDarkUI(sel_none); - if (is_variants) - sel_all_std->Bind(wxEVT_BUTTON, [this](const wxCommandEvent& event) { this->select_all(true, false); }); sel_all->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &event) { this->select_all(true, true); }); sel_none->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &event) { this->select_all(false); }); - if (is_variants) - title_sizer->Add(sel_all_std, 0, wxRIGHT, BTN_SPACING); title_sizer->Add(sel_all, 0, wxRIGHT, BTN_SPACING); title_sizer->Add(sel_none); @@ -367,12 +353,8 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt wxGetApp().UpdateDarkUI(sel_none); // fill button indexes used later for buttons rescaling - if (is_variants) - m_button_indexes = { sel_all_std->GetId(), sel_all->GetId(), sel_none->GetId() }; - else { - sel_all_std->Destroy(); - m_button_indexes = { sel_all->GetId(), sel_none->GetId() }; - } + sel_all_std->Destroy(); + m_button_indexes = { sel_all->GetId(), sel_none->GetId() }; } sizer->Add(title_sizer, 0, wxEXPAND | wxBOTTOM, BTN_SPACING); @@ -442,8 +424,21 @@ std::set PrinterPicker::get_selected_models() const void PrinterPicker::on_checkbox(const Checkbox *cbox, bool checked) { - PrinterPickerEvent evt(EVT_PRINTER_PICK, GetId(), vendor_id, cbox->model, cbox->variant, checked); - AddPendingEvent(evt); + auto sync_group = [&](std::vector &group) { + for (auto *cb : group) { + if (cb->model != cbox->model) + continue; + if (cb->GetValue() != checked) + cb->SetValue(checked); + + PrinterPickerEvent evt(EVT_PRINTER_PICK, GetId(), vendor_id, cb->model, cb->variant, checked); + AddPendingEvent(evt); + } + }; + + // Treat a model selection as selecting all of its nozzle variants. + sync_group(cboxes); + sync_group(cboxes_alt); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index b5a2c8a039d..ce6b6d1707e 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1055,7 +1055,7 @@ Sidebar::Sidebar(Plater *parent) p->m_text_printer_settings = new Label(p->m_panel_printer_title, _L("Printer"), LB_PROPAGATE_MOUSE_EVENT); // Use ams_fila_sync icon (sync_nozzle_info.svg does not exist in resources) - p->m_printerinfo_syncbtn = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "printer"); + p->m_printerinfo_syncbtn = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "nozzle_sync"); p->m_printerinfo_syncbtn->SetToolTip(_L("sync nozzle info")); p->m_printerinfo_syncbtn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { bool hasConnectDevice = false; @@ -2711,22 +2711,21 @@ void Sidebar::update_nozzle_settings(bool switch_machine) nullptr, wxCB_READONLY); - if (!wxGetApp().preset_bundle->printers.get_edited_preset().is_system) { - auto diameter = wxGetApp().preset_bundle->printers.get_edited_preset().config.option("printer_variant")->value; - diameter_combo->AppendString(diameter); + // Use all system presets for this printer_model so the combo stays usable when only one + // variant is marked visible (e.g. after setup wizard / preset visibility filters). + auto diameters = wxGetApp().preset_bundle->printers.diameters_for_same_printer_model(); + for (auto& diameter : diameters) { + diameter_combo->AppendString(wxString(diameter) + "mm"); + } + if (diameter_combo->GetCount() == 0) { + const auto *pv = wxGetApp().preset_bundle->printers.get_edited_preset().config.option("printer_variant"); + if (pv) + diameter_combo->AppendString(wxString(pv->value) + "mm"); + } + if (diameters.size() < 2) { diameter_combo->Enable(false); - } else { - auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer(); - if (diameters.size() < 2) { - diameter_combo->Enable(false); - } - for (auto& diameter : diameters) { - wxString str = diameter + "mm"; - diameter_combo->AppendString(str); - } } - - + diameter_combo->Bind(wxEVT_COMBOBOX, [this, diameter_combo, i](wxCommandEvent& event) { auto* pNotice = p->plater->get_notification_manager(); diff --git a/src/slic3r/GUI/WebGuideDialog.cpp b/src/slic3r/GUI/WebGuideDialog.cpp index 9a67906dba6..dd9f096302e 100644 --- a/src/slic3r/GUI/WebGuideDialog.cpp +++ b/src/slic3r/GUI/WebGuideDialog.cpp @@ -683,21 +683,27 @@ int GuideFrame::SaveProfile() std::string model_name = temp_model["model"]; std::string vendor_name = temp_model["vendor"]; std::string selected = temp_model["nozzle_selected"]; + std::string nozzle_diameter = temp_model["nozzle_diameter"]; boost::trim(selected); - std::string nozzle; - while (selected.size() > 0) { - auto pos = selected.find(';'); - if (pos != std::string::npos) { - nozzle = selected.substr(0, pos); - m_appconfig_new.set_variant(vendor_name, model_name, nozzle, "true"); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("vendor_name %1%, model_name %2%, nozzle %3% selected")%vendor_name %model_name %nozzle; - selected = selected.substr(pos + 1); - boost::trim(selected); - } - else { - m_appconfig_new.set_variant(vendor_name, model_name, selected, "true"); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format("vendor_name %1%, model_name %2%, nozzle %3% selected")%vendor_name %model_name %selected; - break; + boost::trim(nozzle_diameter); + if (!selected.empty()) { + std::string nozzle; + while (nozzle_diameter.size() > 0) { + auto pos = nozzle_diameter.find(';'); + if (pos != std::string::npos) { + nozzle = nozzle_diameter.substr(0, pos); + boost::trim(nozzle); + if (!nozzle.empty()) + m_appconfig_new.set_variant(vendor_name, model_name, nozzle, "true"); + nozzle_diameter = nozzle_diameter.substr(pos + 1); + boost::trim(nozzle_diameter); + } + else { + boost::trim(nozzle_diameter); + if (!nozzle_diameter.empty()) + m_appconfig_new.set_variant(vendor_name, model_name, nozzle_diameter, "true"); + break; + } } } } @@ -1146,32 +1152,24 @@ int GuideFrame::SaveProfileData() std::string selected; boost::trim(nozzle_diameter); std::string nozzle; - bool enabled = false, first=true; + bool enabled = false; + bool any_enabled = false; while (nozzle_diameter.size() > 0) { auto pos = nozzle_diameter.find(';'); if (pos != std::string::npos) { nozzle = nozzle_diameter.substr(0, pos); enabled = m_appconfig_new.get_variant(vendor_name, model_name, nozzle); - if (enabled) { - if (!first) - selected += ";"; - selected += nozzle; - first = false; - } + any_enabled = any_enabled || enabled; nozzle_diameter = nozzle_diameter.substr(pos + 1); boost::trim(nozzle_diameter); } else { enabled = m_appconfig_new.get_variant(vendor_name, model_name, nozzle_diameter); - if (enabled) { - if (!first) - selected += ";"; - selected += nozzle_diameter; - } + any_enabled = any_enabled || enabled; break; } } - temp_model["nozzle_selected"] = selected; + temp_model["nozzle_selected"] = any_enabled ? temp_model["nozzle_diameter"] : ""; //m_ProfileJson["model"][a]["nozzle_selected"] } } diff --git a/src/slic3r/GUI/WebPresetDialog.cpp b/src/slic3r/GUI/WebPresetDialog.cpp index b8f07a3da8e..4b1d0d3ec09 100644 --- a/src/slic3r/GUI/WebPresetDialog.cpp +++ b/src/slic3r/GUI/WebPresetDialog.cpp @@ -800,25 +800,27 @@ int WebPresetDialog::SaveProfile() json temp_model = it.value(); std::string model_name = temp_model["model"]; std::string vendor_name = temp_model["vendor"]; - std::string selected = temp_model["nozzle_selected"]; + std::string selected = temp_model["nozzle_selected"]; + std::string nozzle_diameter = temp_model["nozzle_diameter"]; boost::trim(selected); - std::string nozzle; - while (selected.size() > 0) { - auto pos = selected.find(';'); - if (pos != std::string::npos) { - nozzle = selected.substr(0, pos); - m_appconfig_new.set_variant(vendor_name, model_name, nozzle, "true"); - BOOST_LOG_TRIVIAL(info) - << __FUNCTION__ - << boost::format("vendor_name %1%, model_name %2%, nozzle %3% selected") % vendor_name % model_name % nozzle; - selected = selected.substr(pos + 1); - boost::trim(selected); - } else { - m_appconfig_new.set_variant(vendor_name, model_name, selected, "true"); - BOOST_LOG_TRIVIAL(info) - << __FUNCTION__ - << boost::format("vendor_name %1%, model_name %2%, nozzle %3% selected") % vendor_name % model_name % selected; - break; + boost::trim(nozzle_diameter); + if (!selected.empty()) { + std::string nozzle; + while (nozzle_diameter.size() > 0) { + auto pos = nozzle_diameter.find(';'); + if (pos != std::string::npos) { + nozzle = nozzle_diameter.substr(0, pos); + boost::trim(nozzle); + if (!nozzle.empty()) + m_appconfig_new.set_variant(vendor_name, model_name, nozzle, "true"); + nozzle_diameter = nozzle_diameter.substr(pos + 1); + boost::trim(nozzle_diameter); + } else { + boost::trim(nozzle_diameter); + if (!nozzle_diameter.empty()) + m_appconfig_new.set_variant(vendor_name, model_name, nozzle_diameter, "true"); + break; + } } } } @@ -1264,31 +1266,23 @@ int WebPresetDialog::LoadProfile() std::string selected; boost::trim(nozzle_diameter); std::string nozzle; - bool enabled = false, first = true; + bool enabled = false; + bool any_enabled = false; while (nozzle_diameter.size() > 0) { auto pos = nozzle_diameter.find(';'); if (pos != std::string::npos) { nozzle = nozzle_diameter.substr(0, pos); enabled = m_appconfig_new.get_variant(vendor_name, model_name, nozzle); - if (enabled) { - if (!first) - selected += ";"; - selected += nozzle; - first = false; - } + any_enabled = any_enabled || enabled; nozzle_diameter = nozzle_diameter.substr(pos + 1); boost::trim(nozzle_diameter); } else { enabled = m_appconfig_new.get_variant(vendor_name, model_name, nozzle_diameter); - if (enabled) { - if (!first) - selected += ";"; - selected += nozzle_diameter; - } + any_enabled = any_enabled || enabled; break; } } - temp_model["nozzle_selected"] = selected; + temp_model["nozzle_selected"] = any_enabled ? temp_model["nozzle_diameter"] : ""; // m_ProfileJson["model"][a]["nozzle_selected"] } } From a3317260ab6c50b7e3433662487cd8e141b4e112 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 30 Mar 2026 11:31:54 +0800 Subject: [PATCH 19/46] feature update guide page machine select. --- resources/web/guide/21/21.css | 13 +++- resources/web/guide/21/21.js | 101 +++++++++++--------------- resources/web/guide/24/24.css | 13 +++- resources/web/guide/24/24.js | 109 +++++++++++++--------------- resources/web/preset_bind/24/24.css | 43 +++-------- 5 files changed, 131 insertions(+), 148 deletions(-) diff --git a/resources/web/guide/21/21.css b/resources/web/guide/21/21.css index c0c7bfbd93f..7f9d1e95547 100644 --- a/resources/web/guide/21/21.css +++ b/resources/web/guide/21/21.css @@ -64,6 +64,14 @@ text-align:left; } +.PNameRow +{ + display: flex; + align-items: center; + justify-content: flex-start; + gap: 8px; +} + .pNozzel { display: flex; @@ -71,12 +79,15 @@ justify-content:flex-start; color: #5A5A5A; padding-left: 0px; /* ORCA Align checkboxes with with model text */ + min-width: 20px; } .pNozzel input { vertical-align: middle; - margin-right: 5px; + margin-right: 0; + width: 16px; + height: 16px; } diff --git a/resources/web/guide/21/21.js b/resources/web/guide/21/21.js index cd359610b68..e9f5ec8ad91 100644 --- a/resources/web/guide/21/21.js +++ b/resources/web/guide/21/21.js @@ -93,19 +93,12 @@ function HandleModelList( pVal ) if( !ModelHtml.hasOwnProperty(strVendor)) ModelHtml[strVendor]=''; - let NozzleArray=OneModel['nozzle_diameter'].split(';'); - let HtmlNozzel=''; - for(let m=0;m'+nNozzel+'mm nozzle'; - } + let HtmlNozzel = ''; let CoverImage=OneModel['cover']; ModelHtml[strVendor]+='
'+ '
'+ -'
'+OneModel['name']+'
'+ HtmlNozzel +'
'; +'
'+ HtmlNozzel +'
'+OneModel['name']+'
'; } //Update Nozzel Html Append @@ -122,22 +115,13 @@ function HandleModelList( pVal ) let OneModel=pModel[m]; let SelectList=OneModel['nozzle_selected']; - if(SelectList!='') - { - SelectList=OneModel['nozzle_selected'].split(';'); - let nLen=SelectList.length; - - for(let a=0;a' + nNozzel + 'mm nozzle'; - } + let HtmlNozzel = ''; let CoverImage = OneModel['cover']; ModelHtml[strVendor] += '
' + '
' + - '
' + OneModel['name'] + '
' + HtmlNozzel + '
'; + '
' + HtmlNozzel + '
' + OneModel['name'] + '
'; } //Update Nozzel Html Append @@ -284,13 +264,18 @@ function FilterModelList(keyword) { ModelSelect = $('input[type=checkbox]'); for (let n = 0; n < ModelSelect.length; n++) { let OneItem = ModelSelect[n]; - let strModel = OneItem.getAttribute("model"); let strVendor = OneItem.getAttribute("vendor"); - let strNozzel = OneItem.getAttribute("nozzel"); - - let checked = GetModelSelect(strVendor, strModel, strNozzel); - + let nozzleAll = OneItem.getAttribute("nozzle_all") || ""; + let nozzles = nozzleAll.split(';'); + let checked = false; + for (let i = 0; i < nozzles.length; i++) { + let noz = nozzles[i]; + if (noz != '' && GetModelSelect(strVendor, strModel, noz)) { + checked = true; + break; + } + } OneItem.checked = checked; } @@ -336,25 +321,27 @@ function OnExitFilter() { let ModelAll = {}; for (vendor in ModelNozzleSelected) { for (model in ModelNozzleSelected[vendor]) { + let anyChecked = false; for (nozzel in ModelNozzleSelected[vendor][model]) { - if (!ModelNozzleSelected[vendor][model][nozzel]) - continue; - - if (!ModelAll.hasOwnProperty(model)) { - //alert("ADD: "+strModel); + if (ModelNozzleSelected[vendor][model][nozzel]) { + anyChecked = true; + break; + } + } + if (!anyChecked) + continue; + for (let i = 0; i < pModel.length; i++) { + let pm = pModel[i]; + if (pm['vendor'] == vendor && pm['model'] == model) { ModelAll[model] = {}; - ModelAll[model]["model"] = model; - ModelAll[model]["nozzle_diameter"] = ''; + ModelAll[model]["nozzle_diameter"] = pm["nozzle_diameter"]; ModelAll[model]["vendor"] = vendor; + nTotal++; + break; } - - ModelAll[model]["nozzle_diameter"] += ModelAll[model]["nozzle_diameter"] == '' ? nozzel : ';' + nozzel; - - nTotal++; } - } } @@ -390,7 +377,7 @@ function OnExit() let strModel=OneItem.getAttribute("model"); let strVendor=OneItem.getAttribute("vendor"); - let strNozzel=OneItem.getAttribute("nozzel"); + let strNozzelAll=OneItem.getAttribute("nozzle_all"); //alert(strModel+strVendor+strNozzel); @@ -405,7 +392,7 @@ function OnExit() ModelAll[strModel]["vendor"]=strVendor; } - ModelAll[strModel]["nozzle_diameter"]+=ModelAll[strModel]["nozzle_diameter"]==''?strNozzel:';'+strNozzel; + ModelAll[strModel]["nozzle_diameter"]=strNozzelAll; } var tSend={}; diff --git a/resources/web/guide/24/24.css b/resources/web/guide/24/24.css index 0be070940b2..25951d4b4c0 100644 --- a/resources/web/guide/24/24.css +++ b/resources/web/guide/24/24.css @@ -88,6 +88,14 @@ text-align:left; } +.PNameRow +{ + display: flex; + align-items: center; + justify-content: flex-start; + gap: 8px; +} + .pNozzel { display: flex; @@ -95,12 +103,15 @@ justify-content:flex-start; color: #5A5A5A; padding-left: 0px; /* ORCA Align checkboxes with with model text */ + min-width: 20px; } .pNozzel input { vertical-align: middle; - margin-right: 5px; + margin-right: 0; + width: 16px; + height: 16px; } diff --git a/resources/web/guide/24/24.js b/resources/web/guide/24/24.js index e972a1201ba..d8e8afd8a9f 100644 --- a/resources/web/guide/24/24.js +++ b/resources/web/guide/24/24.js @@ -96,19 +96,12 @@ function HandleModelList( pVal ) if( !ModelHtml.hasOwnProperty(strVendor)) ModelHtml[strVendor]=''; - let NozzleArray=OneModel['nozzle_diameter'].split(';'); - let HtmlNozzel=''; - for(let m=0;m'+nNozzel+'mm nozzle'; - } + let HtmlNozzel = ''; let CoverImage=OneModel['cover']; ModelHtml[strVendor]+='
'+ '
'+ -'
'+OneModel['name']+'
'+ HtmlNozzel +'
'; +'
'+ HtmlNozzel +'
'+OneModel['name']+'
'; } //Append Vendor blocks in priority order @@ -142,22 +135,13 @@ function HandleModelList( pVal ) let OneModel=pModel[m]; let SelectList=OneModel['nozzle_selected']; - if(SelectList!='') - { - SelectList=OneModel['nozzle_selected'].split(';'); - let nLen=SelectList.length; - - for(let a=0;a' + nNozzel + 'mm nozzle'; - } + let HtmlNozzel = ''; let CoverImage = OneModel['cover']; ModelHtml[strVendor] += '
' + '
' + - '
' + OneModel['name'] + '
' + HtmlNozzel + '
'; + '
' + HtmlNozzel + '
' + OneModel['name'] + '
'; } //Append Vendor blocks in priority order @@ -322,10 +307,16 @@ function FilterModelList(keyword) { let strModel = OneItem.getAttribute("model"); let strVendor = OneItem.getAttribute("vendor"); - let strNozzel = OneItem.getAttribute("nozzel"); - - let checked = GetModelSelect(strVendor, strModel, strNozzel); - + let nozzleAll = OneItem.getAttribute("nozzle_all") || ""; + let nozzles = nozzleAll.split(';'); + let checked = false; + for (let i = 0; i < nozzles.length; i++) { + let strNozzel = nozzles[i]; + if (strNozzel != '' && GetModelSelect(strVendor, strModel, strNozzel)) { + checked = true; + break; + } + } OneItem.checked = checked; } @@ -362,25 +353,27 @@ function OnExitFilter() { let ModelAll = {}; for (vendor in ModelNozzleSelected) { for (model in ModelNozzleSelected[vendor]) { + let anyChecked = false; for (nozzel in ModelNozzleSelected[vendor][model]) { - if (!ModelNozzleSelected[vendor][model][nozzel]) - continue; - - if (!ModelAll.hasOwnProperty(model)) { - //alert("ADD: "+strModel); + if (ModelNozzleSelected[vendor][model][nozzel]) { + anyChecked = true; + break; + } + } + if (!anyChecked) + continue; + for (let i = 0; i < pModel.length; i++) { + let pm = pModel[i]; + if (pm['vendor'] == vendor && pm['model'] == model) { ModelAll[model] = {}; - ModelAll[model]["model"] = model; - ModelAll[model]["nozzle_diameter"] = ''; + ModelAll[model]["nozzle_diameter"] = pm["nozzle_diameter"]; ModelAll[model]["vendor"] = vendor; + nTotal++; + break; } - - ModelAll[model]["nozzle_diameter"] += ModelAll[model]["nozzle_diameter"] == '' ? nozzel : ';' + nozzel; - - nTotal++; } - } } @@ -416,7 +409,7 @@ function OnExit() let strModel=OneItem.getAttribute("model"); let strVendor=OneItem.getAttribute("vendor"); - let strNozzel=OneItem.getAttribute("nozzel"); + let strNozzelAll=OneItem.getAttribute("nozzle_all"); //alert(strModel+strVendor+strNozzel); @@ -431,7 +424,7 @@ function OnExit() ModelAll[strModel]["vendor"]=strVendor; } - ModelAll[strModel]["nozzle_diameter"]+=ModelAll[strModel]["nozzle_diameter"]==''?strNozzel:';'+strNozzel; + ModelAll[strModel]["nozzle_diameter"]=strNozzelAll; } var tSend={}; diff --git a/resources/web/preset_bind/24/24.css b/resources/web/preset_bind/24/24.css index a648916098f..377fc529712 100644 --- a/resources/web/preset_bind/24/24.css +++ b/resources/web/preset_bind/24/24.css @@ -46,49 +46,30 @@ text-align:left; } +.PNameRow +{ + display: flex; + align-items: center; + justify-content: flex-start; + gap: 8px; +} + .pNozzel { display: flex; align-items: center; justify-content:flex-start; color: #5A5A5A; - padding-left: 10px; + padding-left: 0; + min-width: 20px; } -.pNozzel input[type="radio"] { +.pNozzel input[type="checkbox"] { vertical-align: middle; - margin-right: 5px; + margin-right: 0; cursor: pointer; -} - -.pNozzel input[type="radio"] { - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; width: 16px; height: 16px; - border: 2px solid #009688; - border-radius: 50%; - outline: none; - margin-right: 8px; - position: relative; -} - -.pNozzel input[type="radio"]:checked { - background-color: #009688; - border-color: #009688; -} - -.pNozzel input[type="radio"]:checked:after { - content: ''; - width: 6px; - height: 6px; - background: white; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - border-radius: 50%; } /*-----Notice-----*/ From 440c7c2990ded241a3efdf97bff421e7671897b6 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 30 Mar 2026 11:50:27 +0800 Subject: [PATCH 20/46] feature update guide ui, profiles source. --- resources/profiles/Snapmaker.json | 1932 +++++++++++++---- .../filament/Generic PETG HF @base.json | 3 - .../Snapmaker/filament/PolyLite PLA @U1.json | 3 - .../Snapmaker/filament/PolyTerra PLA @U1.json | 3 - .../Polymaker General PLA Family @U1.json | 6 - .../filament/Polymaker PLA @U1 base.json | 2 +- .../Polymaker Silk PLA Family @U1.json | 6 - .../Polymaker Tough PLA Family @U1.json | 6 - .../Snapmaker/filament/Snapmaker ABS @U1.json | 3 - .../filament/Snapmaker ABS Benchy @U1.json | 3 - .../Snapmaker/filament/Snapmaker ASA @U1.json | 3 - ...apmaker Breakaway Support For PLA @U1.json | 3 - .../filament/Snapmaker PA-CF @U1.json | 3 - .../Snapmaker/filament/Snapmaker PET @U1.json | 3 - .../filament/Snapmaker PETG @U1.json | 3 - .../filament/Snapmaker PETG-CF @U1.json | 3 - .../Snapmaker/filament/Snapmaker PLA @U1.json | 3 - .../filament/Snapmaker PLA Eco @U1.json | 3 - .../filament/Snapmaker PLA Metal @U1.json | 3 - .../filament/Snapmaker PLA Silk @U1.json | 3 - .../filament/Snapmaker PLA-CF @U1.json | 3 - .../Snapmaker/filament/Snapmaker PVA @U1.json | 3 - .../Snapmaker/filament/Snapmaker TPE @U1.json | 3 - .../Snapmaker/filament/Snapmaker TPU @U1.json | 3 - .../filament/Snapmaker TPU High-Flow @U1.json | 3 - .../machine/Snapmaker U1 (0.4 nozzle).json | 5 +- .../Snapmaker/machine/Snapmaker U1.json | 4 +- .../profiles/Snapmaker/machine/fdm_U1.json | 3 +- resources/web/guide/21/21.css | 17 +- resources/web/guide/24/24.css | 17 +- resources/web/preset_bind/24/24.css | 27 +- 31 files changed, 1502 insertions(+), 583 deletions(-) diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index 6c055724c08..c7fb29915c1 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,6 +1,6 @@ { "name": "Snapmaker", - "version": "02.02.44.02", + "version": "02.02.45.02", "force_update": "0", "description": "Snapmaker configurations", "machine_model_list": [ @@ -163,8 +163,8 @@ "sub_path": "process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json" }, { - "name": "0.20 Strength @Snapmaker U1 (0.4 nozzle)", - "sub_path": "process/0.20 Strength @Snapmaker U1 (0.4 nozzle).json" + "name": "0.20 strength @Snapmaker U1 (0.4 nozzle)", + "sub_path": "process/0.20 strength @Snapmaker U1 (0.4 nozzle).json" }, { "name": "0.24 Draft @Snapmaker U1 (0.4 nozzle)", @@ -449,888 +449,1876 @@ { "name": "0.48 Draft @Snapmaker Artisan (0.8 nozzle)", "sub_path": "process/0.48 Draft @Snapmaker Artisan (0.8 nozzle).json" - } - ], - "filament_list": [ + }, + + + + + + + + + + + + + { - "name": "fdm_filament_common_generic", - "sub_path": "filament/fdm_filament_common_generic.json" + "name": "fdm_process_U1_0.06_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.06_nozzle_0.2.json" }, { - "name": "fdm_filament_pla_generic", - "sub_path": "filament/fdm_filament_pla_generic.json" + "name": "fdm_process_U1_0.08_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.08_nozzle_0.2.json" }, { - "name": "fdm_filament_pctg_generic", - "sub_path": "filament/fdm_filament_pctg_generic.json" + "name": "fdm_process_U1_0.10_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.10_nozzle_0.2.json" }, { - "name": "fdm_filament_bvoh_generic", - "sub_path":"filament/fdm_filament_bvoh_generic.json" + "name": "fdm_process_U1_0.12_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.12_nozzle_0.2.json" }, { - "name": "fdm_filament_abs_generic", - "sub_path": "filament/fdm_filament_abs_generic.json" + "name": "fdm_process_U1_0.14_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.14_nozzle_0.2.json" }, { - "name": "fdm_filament_asa_generic", - "sub_path": "filament/fdm_filament_asa_generic.json" + "name": "fdm_process_U1_0.18_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.18_nozzle_0.6.json" }, { - "name": "fdm_filament_pa_generic", - "sub_path": "filament/fdm_filament_pa_generic.json" + "name": "fdm_process_U1_0.24_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.24_nozzle_0.6.json" }, { - "name": "fdm_filament_pc_generic", - "sub_path": "filament/fdm_filament_pc_generic.json" + "name": "fdm_process_U1_0.30_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.30_nozzle_0.6.json" }, { - "name": "Generic ABS @base", - "sub_path": "filament/Generic ABS @base.json" + "name": "fdm_process_U1_0.36_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.36_nozzle_0.6.json" }, { - "name": "Generic ABS", - "sub_path": "filament/Generic ABS.json" + "name": "fdm_process_U1_0.42_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.42_nozzle_0.6.json" }, { - "name": "Generic ASA @base", - "sub_path": "filament/Generic ASA @base.json" + "name": "fdm_process_U1_0.32_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.32_nozzle_0.8.json" }, { - "name": "Generic ASA", - "sub_path": "filament/Generic ASA.json" + "name": "fdm_process_U1_0.40_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.40_nozzle_0.8.json" }, { - "name": "Generic PA", - "sub_path": "filament/Generic PA.json" + "name": "fdm_process_U1_0.48_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.48_nozzle_0.8.json" }, { - "name": "Generic PA-CF", - "sub_path": "filament/Generic PA-CF.json" + "name": "fdm_process_U1_0.24_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.24_nozzle_0.8.json" }, { - "name": "Generic PC @base", - "sub_path": "filament/Generic PC @base.json" + "name": "fdm_process_U1_0.56_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.56_nozzle_0.8.json" }, + { - "name": "Generic PC", - "sub_path": "filament/Generic PC.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": "Generic Support For PLA @base", - "sub_path": "filament/Generic Support For PLA @base.json" + "name": "0.06 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "Generic Support For PLA", - "sub_path": "filament/Generic Support For PLA.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": "fdm_filament_pva_generic", - "sub_path": "filament/fdm_filament_pva_generic.json" + "name": "0.08 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "Generic PVA @base", - "sub_path": "filament/Generic PVA @base.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": "Generic PVA", - "sub_path": "filament/Generic PVA.json" + "name": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "fdm_filament_pet_generic", - "sub_path": "filament/fdm_filament_pet_generic.json" + "name": "0.12 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "Generic PETG @base", - "sub_path": "filament/Generic PETG @base.json" + "name": "0.14 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json" }, + { - "name": "Generic PETG", - "sub_path": "filament/Generic PETG.json" + "name": "0.18 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "fdm_filament_tpu_generic", - "sub_path": "filament/fdm_filament_tpu_generic.json" + "name": "0.24 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic TPU", - "sub_path": "filament/Generic TPU.json" + "name": "0.30 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic PCTG @base", - "sub_path": "filament/Generic PCTG @base.json" + "name": "0.30 Strength @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic PCTG", - "sub_path": "filament/Generic PCTG.json" + "name": "0.36 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic PETG HF @base", - "sub_path": "filament/Generic PETG HF @base.json" + "name": "0.42 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json" }, + + { - "name": "Generic PETG HF", - "sub_path": "filament/Generic PETG HF.json" + "name": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json" }, { - "name": "Generic PETG-CF @base", - "sub_path": "filament/Generic PETG-CF @base.json" + "name": "0.48 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json" }, + { - "name": "Generic PETG-CF", - "sub_path": "filament/Generic PETG-CF.json" + "name": "0.32 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json" }, + { - "name": "Generic PETG-GF @base", - "sub_path": "filament/Generic PETG-GF @base.json" + "name": "0.24 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.24 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": [ { - "name": "Generic PETG-GF", - "sub_path": "filament/Generic PETG-GF.json" + "name": "fdm_filament_common_generic", + "sub_path": "filament/fdm_filament_common_generic.json" }, { - "name": "Generic PLA High Speed @base", - "sub_path": "filament/Generic PLA High Speed @base.json" + "name": "fdm_filament_pla_generic", + "sub_path": "filament/fdm_filament_pla_generic.json" }, { - "name": "Generic PLA High Speed", - "sub_path": "filament/Generic PLA High Speed.json" + "name": "fdm_filament_abs_generic", + "sub_path": "filament/fdm_filament_abs_generic.json" }, { - "name": "Generic PLA Silk @base", - "sub_path": "filament/Generic PLA Silk @base.json" + "name": "fdm_filament_asa_generic", + "sub_path": "filament/fdm_filament_asa_generic.json" }, { - "name": "Generic PLA Silk", - "sub_path": "filament/Generic PLA Silk.json" + "name": "fdm_filament_pctg_generic", + "sub_path": "filament/fdm_filament_pctg_generic.json" }, { - "name": "Generic PLA @base", - "sub_path": "filament/Generic PLA @base.json" + "name": "fdm_filament_bvoh_generic", + "sub_path":"filament/fdm_filament_bvoh_generic.json" }, { - "name": "Generic PLA", - "sub_path": "filament/Generic PLA.json" + "name": "fdm_filament_pc_generic", + "sub_path": "filament/fdm_filament_pc_generic.json" }, { - "name": "Generic PLA-CF @base", - "sub_path": "filament/Generic PLA-CF @base.json" + "name": "fdm_filament_pa_generic", + "sub_path": "filament/fdm_filament_pa_generic.json" }, { - "name": "Generic PLA-CF", - "sub_path": "filament/Generic PLA-CF.json" + "name": "fdm_filament_pet_generic", + "sub_path": "filament/fdm_filament_pet_generic.json" }, { - "name": "Generic BVOH @base", - "sub_path": "filament/Generic BVOH @base.json" + "name": "fdm_filament_pva_generic", + "sub_path": "filament/fdm_filament_pva_generic.json" }, { - "name": "Generic BVOH", - "sub_path": "filament/Generic BVOH.json" + "name": "fdm_filament_tpu_generic", + "sub_path": "filament/fdm_filament_tpu_generic.json" }, { - "name": "Generic TPU 95A HF @base", - "sub_path": "filament/Generic TPU 95A HF @base.json" + "name": "Generic Support For PLA @base", + "sub_path": "filament/Generic Support For PLA @base.json" }, { - "name": "Generic TPU 95A HF", - "sub_path": "filament/Generic TPU 95A HF.json" + "name": "Generic Support For PLA test @U1 0.2 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PETG HF @base", - "sub_path": "filament/Snapmaker PETG HF @base.json" + "name": "Generic Support For PLA @U1 0.4 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG HF", - "sub_path": "filament/Snapmaker PETG HF.json" + "name": "Generic Support For PLA test @U1 0.6 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.6 nozzle.json" }, - - - - - - - - - - - - - - - - - - - - - - - - - { - "name": "fdm_filament_common", - "sub_path": "filament/fdm_filament_common.json" + "name": "Generic Support For PLA test @U1 0.8 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.8 nozzle.json" }, { - "name": "fdm_filament_abs", - "sub_path": "filament/fdm_filament_abs.json" + "name": "Generic PVA @base", + "sub_path": "filament/Generic PVA @base.json" }, { - "name": "fdm_filament_asa", - "sub_path": "filament/fdm_filament_asa.json" + "name": "Generic PVA test @U1 0.2 nozzle", + "sub_path": "filament/Generic PVA @U1 0.2 nozzle.json" }, { - "name": "fdm_filament_pa", - "sub_path": "filament/fdm_filament_pa.json" + "name": "Generic PVA @U1 0.4 nozzle", + "sub_path": "filament/Generic PVA @U1 0.4 nozzle.json" }, { - "name": "fdm_filament_petg", - "sub_path": "filament/fdm_filament_petg.json" + "name": "Generic PVA test @U1 0.6 nozzle", + "sub_path": "filament/Generic PVA @U1 0.6 nozzle.json" }, { - "name": "fdm_filament_pet", - "sub_path": "filament/fdm_filament_pet.json" + "name": "Generic PVA test @U1 0.8 nozzle", + "sub_path": "filament/Generic PVA @U1 0.8 nozzle.json" }, { - "name": "fdm_filament_pla", - "sub_path": "filament/fdm_filament_pla.json" + "name": "Generic PETG @base", + "sub_path": "filament/Generic PETG @base.json" }, { - "name": "fdm_filament_pla_eco", - "sub_path": "filament/fdm_filament_pla_eco.json" + "name": "Generic PETG test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG @U1 0.2 nozzle.json" }, { - "name": "fdm_filament_pva", - "sub_path": "filament/fdm_filament_pva.json" + "name": "Generic PETG @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG @U1 0.4 nozzle.json" }, { - "name": "fdm_filament_tpu", - "sub_path": "filament/fdm_filament_tpu.json" + "name": "Generic PETG test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ABS @base", - "sub_path": "filament/Snapmaker ABS @base.json" + "name": "Generic PETG test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS", - "sub_path": "filament/Snapmaker ABS.json" + "name": "Generic TPU test @U1 0.2 nozzle", + "sub_path": "filament/Generic TPU @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ABS @0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @0.2 nozzle.json" + "name": "Generic TPU @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ASA @base", - "sub_path": "filament/Snapmaker ASA @base.json" + "name": "Generic TPU test @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ASA", - "sub_path": "filament/Snapmaker ASA.json" + "name": "Generic TPU test @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ASA @0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @0.2 nozzle.json" + "name": "Generic PCTG @base", + "sub_path": "filament/Generic PCTG @base.json" }, { - "name": "Snapmaker PA-CF @base", - "sub_path": "filament/Snapmaker PA-CF @base.json" + "name": "Generic PCTG test @U1 0.2 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PA-CF", - "sub_path": "filament/Snapmaker PA-CF.json" + "name": "Generic PCTG @U1 0.4 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG @base", - "sub_path": "filament/Snapmaker PETG @base.json" + "name": "Generic PCTG test @U1 0.6 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG", - "sub_path": "filament/Snapmaker PETG.json" + "name": "Generic PCTG test @U1 0.8 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG @0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @0.2 nozzle.json" + "name": "Generic PETG HF @base", + "sub_path": "filament/Generic PETG HF @base.json" }, { - "name": "Snapmaker PET @base", - "sub_path": "filament/Snapmaker PET @base.json" + "name": "Generic PETG HF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PET", - "sub_path": "filament/Snapmaker PET.json" + "name": "Generic PETG HF @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG-CF @base", - "sub_path": "filament/Snapmaker PETG-CF @base.json" + "name": "Generic PETG HF test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG-CF", - "sub_path": "filament/Snapmaker PETG-CF.json" + "name": "Generic PETG HF test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Eco @base", - "sub_path": "filament/Snapmaker PLA Eco @base.json" + "name": "Generic PETG-CF @base", + "sub_path": "filament/Generic PETG-CF @base.json" }, { - "name": "Snapmaker PLA Eco", - "sub_path": "filament/Snapmaker PLA Eco.json" + "name": "Generic PETG-CF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA @base", - "sub_path": "filament/Snapmaker PLA @base.json" + "name": "Generic PETG-CF @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA", - "sub_path": "filament/Snapmaker PLA.json" + "name": "Generic PETG-CF test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA-CF @base", - "sub_path": "filament/Snapmaker PLA-CF @base.json" + "name": "Generic PETG-CF test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA-CF", - "sub_path": "filament/Snapmaker PLA-CF.json" + "name": "Generic PETG-GF @base", + "sub_path": "filament/Generic PETG-GF @base.json" }, { - "name": "Snapmaker PLA Silk @base", - "sub_path": "filament/Snapmaker PLA Silk @base.json" + "name": "Generic PETG-GF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Silk", - "sub_path": "filament/Snapmaker PLA Silk.json" + "name": "Generic PETG-GF @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Silk @0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @0.2 nozzle.json" + "name": "Generic PETG-GF test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.6 nozzle.json" }, { - "name": "PolyLite PLA @base", - "sub_path": "filament/PolyLite PLA @base.json" + "name": "Generic PETG-GF test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.8 nozzle.json" }, { - "name": "PolyLite PLA", - "sub_path": "filament/PolyLite PLA.json" + "name": "Generic PLA High Speed @base", + "sub_path": "filament/Generic PLA High Speed @base.json" }, { - "name": "PolyLite PLA @0.2 nozzle", - "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" + "name": "Generic PLA Silk @base", + "sub_path": "filament/Generic PLA Silk @base.json" }, { - "name": "PolyTerra PLA @base", - "sub_path": "filament/PolyTerra PLA @base.json" + "name": "Generic PLA @base", + "sub_path": "filament/Generic PLA @base.json" }, { - "name": "PolyTerra PLA", - "sub_path": "filament/PolyTerra PLA.json" + "name": "Generic PLA-CF @base", + "sub_path": "filament/Generic PLA-CF @base.json" }, { - "name": "PolyTerra PLA @0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" + "name": "Generic BVOH @base", + "sub_path": "filament/Generic BVOH @base.json" }, { - "name": "Snapmaker PVA @base", - "sub_path": "filament/Snapmaker PVA @base.json" + "name": "Generic BVOH test @U1 0.2 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PVA", - "sub_path": "filament/Snapmaker PVA.json" + "name": "Generic BVOH @U1 0.4 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PVA @0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @0.2 nozzle.json" + "name": "Generic BVOH test @U1 0.6 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.6 nozzle.json" }, { - "name": "Snapmaker TPU @base", - "sub_path": "filament/Snapmaker TPU @base.json" + "name": "Generic BVOH test @U1 0.8 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.8 nozzle.json" }, { - "name": "Snapmaker TPU", - "sub_path": "filament/Snapmaker TPU.json" + "name": "Generic TPU 95A HF @base", + "sub_path": "filament/Generic TPU 95A HF @base.json" }, { - "name": "Snapmaker TPE", - "sub_path": "filament/Snapmaker TPE.json" + "name": "Generic TPU 95A HF test @U1 0.2 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ABS @J1 base", - "sub_path": "filament/Snapmaker ABS @J1 base.json" + "name": "Generic TPU 95A HF @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.4 nozzle.json" + }, + { + "name": "Generic TPU 95A HF test @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.6 nozzle.json" + }, + { + "name": "Generic TPU 95A HF test @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.8 nozzle.json" + }, + { + "name": "Generic ABS @base", + "sub_path": "filament/Generic ABS @base.json" + }, + { + "name": "Generic ABS @U1 0.2 nozzle", + "sub_path": "filament/Generic ABS @U1 0.2 nozzle.json" + }, + { + "name": "Generic ABS @U1 0.4 nozzle", + "sub_path": "filament/Generic ABS @U1 0.4 nozzle.json" + }, + { + "name": "Generic ABS @U1 0.6 nozzle", + "sub_path": "filament/Generic ABS @U1 0.6 nozzle.json" + }, + { + "name": "Generic ABS @U1 0.8 nozzle", + "sub_path": "filament/Generic ABS @U1 0.8 nozzle.json" + }, + { + "name": "Generic ASA @base", + "sub_path": "filament/Generic ASA @base.json" + }, + { + "name": "Generic ASA @U1 0.2 nozzle", + "sub_path": "filament/Generic ASA @U1 0.2 nozzle.json" + }, + { + "name": "Generic ASA @U1 0.4 nozzle", + "sub_path": "filament/Generic ASA @U1 0.4 nozzle.json" + }, + { + "name": "Generic ASA @U1 0.6 nozzle", + "sub_path": "filament/Generic ASA @U1 0.6 nozzle.json" + }, + { + "name": "Generic ASA @U1 0.8 nozzle", + "sub_path": "filament/Generic ASA @U1 0.8 nozzle.json" + }, + { + "name": "Generic PA @U1 0.2 nozzle", + "sub_path": "filament/Generic PA @U1 0.2 nozzle.json" + }, + { + "name": "Generic PA @U1 0.4 nozzle", + "sub_path": "filament/Generic PA @U1 0.4 nozzle.json" + }, + { + "name": "Generic PA @U1 0.6 nozzle", + "sub_path": "filament/Generic PA @U1 0.6 nozzle.json" + }, + { + "name": "Generic PA @U1 0.8 nozzle", + "sub_path": "filament/Generic PA @U1 0.8 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.2 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.2 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.4 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.4 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.6 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.6 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.8 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.8 nozzle.json" + }, + { + "name": "Generic PC @base", + "sub_path": "filament/Generic PC @base.json" + }, + { + "name": "Generic PC @U1 0.4 nozzle", + "sub_path": "filament/Generic PC @U1 0.4 nozzle.json" + }, + { + "name": "Generic PC @U1 0.6 nozzle", + "sub_path": "filament/Generic PC @U1 0.6 nozzle.json" + }, + { + "name": "Generic PC @U1 0.8 nozzle", + "sub_path": "filament/Generic PC @U1 0.8 nozzle.json" + }, + + + + + + + + + + { + "name": "fdm_filament_common", + "sub_path": "filament/fdm_filament_common.json" + }, + { + "name": "fdm_filament_abs", + "sub_path": "filament/fdm_filament_abs.json" + }, + { + "name": "fdm_filament_asa", + "sub_path": "filament/fdm_filament_asa.json" + }, + { + "name": "fdm_filament_pa", + "sub_path": "filament/fdm_filament_pa.json" + }, + { + "name": "fdm_filament_petg", + "sub_path": "filament/fdm_filament_petg.json" + }, + { + "name": "fdm_filament_pet", + "sub_path": "filament/fdm_filament_pet.json" + }, + { + "name": "fdm_filament_pla", + "sub_path": "filament/fdm_filament_pla.json" + }, + { + "name": "fdm_filament_pla_eco", + "sub_path": "filament/fdm_filament_pla_eco.json" + }, + { + "name": "fdm_filament_pva", + "sub_path": "filament/fdm_filament_pva.json" + }, + { + "name": "fdm_filament_tpu", + "sub_path": "filament/fdm_filament_tpu.json" + }, + { + "name": "Snapmaker ABS @base", + "sub_path": "filament/Snapmaker ABS @base.json" + }, + { + "name": "Snapmaker ABS", + "sub_path": "filament/Snapmaker ABS.json" + }, + { + "name": "Snapmaker ABS @0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @0.2 nozzle.json" + }, + { + "name": "Snapmaker ASA @base", + "sub_path": "filament/Snapmaker ASA @base.json" + }, + { + "name": "Snapmaker ASA", + "sub_path": "filament/Snapmaker ASA.json" + }, + { + "name": "Snapmaker ASA @0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @0.2 nozzle.json" + }, + { + "name": "Snapmaker PA-CF @base", + "sub_path": "filament/Snapmaker PA-CF @base.json" + }, + { + "name": "Snapmaker PA-CF", + "sub_path": "filament/Snapmaker PA-CF.json" + }, + { + "name": "Snapmaker PETG @base", + "sub_path": "filament/Snapmaker PETG @base.json" + }, + { + "name": "Snapmaker PETG", + "sub_path": "filament/Snapmaker PETG.json" + }, + { + "name": "Snapmaker PETG @0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @0.2 nozzle.json" + }, + { + "name": "Snapmaker PET @base", + "sub_path": "filament/Snapmaker PET @base.json" + }, + { + "name": "Snapmaker PET", + "sub_path": "filament/Snapmaker PET.json" + }, + { + "name": "Snapmaker PETG-CF @base", + "sub_path": "filament/Snapmaker PETG-CF @base.json" + }, + { + "name": "Snapmaker PETG-CF", + "sub_path": "filament/Snapmaker PETG-CF.json" + }, + { + "name": "Snapmaker PLA Eco @base", + "sub_path": "filament/Snapmaker PLA Eco @base.json" + }, + { + "name": "Snapmaker PLA Eco", + "sub_path": "filament/Snapmaker PLA Eco.json" + }, + { + "name": "Snapmaker PLA @base", + "sub_path": "filament/Snapmaker PLA @base.json" + }, + { + "name": "Snapmaker PLA", + "sub_path": "filament/Snapmaker PLA.json" + }, + { + "name": "Snapmaker PLA-CF @base", + "sub_path": "filament/Snapmaker PLA-CF @base.json" + }, + { + "name": "Snapmaker PLA-CF", + "sub_path": "filament/Snapmaker PLA-CF.json" + }, + { + "name": "Snapmaker PLA Silk @base", + "sub_path": "filament/Snapmaker PLA Silk @base.json" + }, + { + "name": "Snapmaker PLA Silk", + "sub_path": "filament/Snapmaker PLA Silk.json" + }, + { + "name": "Snapmaker PLA Silk @0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @base", + "sub_path": "filament/PolyLite PLA @base.json" + }, + { + "name": "PolyLite PLA", + "sub_path": "filament/PolyLite PLA.json" + }, + { + "name": "PolyLite PLA @0.2 nozzle", + "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" + }, + { + "name": "PolyTerra PLA @base", + "sub_path": "filament/PolyTerra PLA @base.json" + }, + { + "name": "PolyTerra PLA", + "sub_path": "filament/PolyTerra PLA.json" + }, + { + "name": "PolyTerra PLA @0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" + }, + { + "name": "Snapmaker PVA @base", + "sub_path": "filament/Snapmaker PVA @base.json" + }, + { + "name": "Snapmaker PVA", + "sub_path": "filament/Snapmaker PVA.json" + }, + { + "name": "Snapmaker PVA @0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @0.2 nozzle.json" + }, + { + "name": "Snapmaker TPU @base", + "sub_path": "filament/Snapmaker TPU @base.json" + }, + { + "name": "Snapmaker TPU", + "sub_path": "filament/Snapmaker TPU.json" + }, + { + "name": "Snapmaker TPE", + "sub_path": "filament/Snapmaker TPE.json" + }, + { + "name": "Snapmaker ABS @J1 base", + "sub_path": "filament/Snapmaker ABS @J1 base.json" + }, + { + "name": "Snapmaker ABS @J1", + "sub_path": "filament/Snapmaker ABS @J1.json" + }, + { + "name": "Snapmaker ABS @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker ABS @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker ABS @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker ABS Benchy @J1", + "sub_path": "filament/Snapmaker ABS Benchy @J1.json" + }, + { + "name": "Snapmaker ASA @J1 base", + "sub_path": "filament/Snapmaker ASA @J1 base.json" + }, + { + "name": "Snapmaker ASA @J1", + "sub_path": "filament/Snapmaker ASA @J1.json" + }, + { + "name": "Snapmaker ASA @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PA-CF @J1 base", + "sub_path": "filament/Snapmaker PA-CF @J1 base.json" + }, + { + "name": "Snapmaker PA-CF @J1", + "sub_path": "filament/Snapmaker PA-CF @J1.json" + }, + { + "name": "Snapmaker PETG @J1 base", + "sub_path": "filament/Snapmaker PETG @J1 base.json" + }, + { + "name": "Snapmaker PETG @J1", + "sub_path": "filament/Snapmaker PETG @J1.json" + }, + { + "name": "Snapmaker PETG @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PET @J1 base", + "sub_path": "filament/Snapmaker PET @J1 base.json" + }, + { + "name": "Snapmaker PET @J1", + "sub_path": "filament/Snapmaker PET @J1.json" + }, + { + "name": "Snapmaker PETG-CF @J1 base", + "sub_path": "filament/Snapmaker PETG-CF @J1 base.json" + }, + { + "name": "Snapmaker PETG-CF @J1", + "sub_path": "filament/Snapmaker PETG-CF @J1.json" + }, + { + "name": "Snapmaker PLA Eco @J1 base", + "sub_path": "filament/Snapmaker PLA Eco @J1 base.json" + }, + { + "name": "Snapmaker PLA Eco @J1", + "sub_path": "filament/Snapmaker PLA Eco @J1.json" + }, + { + "name": "Snapmaker PLA Eco @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Eco @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA @J1 base", + "sub_path": "filament/Snapmaker PLA @J1 base.json" + }, + { + "name": "Snapmaker PLA @J1", + "sub_path": "filament/Snapmaker PLA @J1.json" + }, + { + "name": "Snapmaker PLA Matte @base", + "sub_path": "filament/Snapmaker PLA Matte @base.json" + }, + { + "name": "Snapmaker PLA Matte @J1", + "sub_path": "filament/Snapmaker PLA Matte @J1.json" + }, + { + "name": "Snapmaker PLA Metal @J1 base", + "sub_path": "filament/Snapmaker PLA Metal @J1 base.json" + }, + { + "name": "Snapmaker PLA Metal @J1", + "sub_path": "filament/Snapmaker PLA Metal @J1.json" + }, + { + "name": "Snapmaker PLA Metal @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Metal @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA-CF @J1 base", + "sub_path": "filament/Snapmaker PLA-CF @J1 base.json" + }, + { + "name": "Snapmaker PLA-CF @J1", + "sub_path": "filament/Snapmaker PLA-CF @J1.json" + }, + { + "name": "Snapmaker PLA-CF @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Silk @J1 base", + "sub_path": "filament/Snapmaker PLA Silk @J1 base.json" + }, + { + "name": "Snapmaker PLA Silk @J1", + "sub_path": "filament/Snapmaker PLA Silk @J1.json" + }, + { + "name": "Snapmaker PLA Silk @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @J1 0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @J1", + "sub_path": "filament/PolyLite PLA @J1.json" + }, + { + "name": "PolyLite PLA @J1 0.2 nozzle", + "sub_path": "filament/PolyLite PLA @J1 0.2 nozzle.json" + }, + { + "name": "PolyTerra PLA @J1", + "sub_path": "filament/PolyTerra PLA @J1.json" + }, + { + "name": "PolyTerra PLA @J1 0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PVA @J1 base", + "sub_path": "filament/Snapmaker PVA @J1 base.json" + }, + { + "name": "Snapmaker PVA @J1", + "sub_path": "filament/Snapmaker PVA @J1.json" + }, + { + "name": "Snapmaker PVA @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker TPU @J1 base", + "sub_path": "filament/Snapmaker TPU @J1 base.json" + }, + { + "name": "Snapmaker TPU @J1", + "sub_path": "filament/Snapmaker TPU @J1.json" + }, + { + "name": "Snapmaker TPU High-Flow @J1", + "sub_path": "filament/Snapmaker TPU High-Flow @J1.json" + }, + { + "name": "Snapmaker TPE @J1", + "sub_path": "filament/Snapmaker TPE @J1.json" + }, + { + "name": "Snapmaker ABS @Dual base", + "sub_path": "filament/Snapmaker ABS @Dual base.json" + }, + { + "name": "Snapmaker ABS @Dual", + "sub_path": "filament/Snapmaker ABS @Dual.json" + }, + { + "name": "Snapmaker ABS @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker ABS @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker ABS @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker ABS Benchy @Dual", + "sub_path": "filament/Snapmaker ABS Benchy @Dual.json" + }, + { + "name": "Snapmaker ASA @Dual base", + "sub_path": "filament/Snapmaker ASA @Dual base.json" + }, + { + "name": "Snapmaker ASA @Dual", + "sub_path": "filament/Snapmaker ASA @Dual.json" + }, + { + "name": "Snapmaker ASA @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PA-CF @Dual base", + "sub_path": "filament/Snapmaker PA-CF @Dual base.json" + }, + { + "name": "Snapmaker PA-CF @Dual", + "sub_path": "filament/Snapmaker PA-CF @Dual.json" + }, + { + "name": "Snapmaker PETG @Dual base", + "sub_path": "filament/Snapmaker PETG @Dual base.json" + }, + { + "name": "Snapmaker PETG @Dual", + "sub_path": "filament/Snapmaker PETG @Dual.json" + }, + { + "name": "Snapmaker PETG @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PET @Dual base", + "sub_path": "filament/Snapmaker PET @Dual base.json" + }, + { + "name": "Snapmaker PET @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PET @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PET @Dual", + "sub_path": "filament/Snapmaker PET @Dual.json" + }, + { + "name": "Snapmaker PETG-CF @Dual base", + "sub_path": "filament/Snapmaker PETG-CF @Dual base.json" + }, + { + "name": "Snapmaker PETG-CF @Dual", + "sub_path": "filament/Snapmaker PETG-CF @Dual.json" + }, + { + "name": "Snapmaker PLA Eco @Dual base", + "sub_path": "filament/Snapmaker PLA Eco @Dual base.json" + }, + { + "name": "Snapmaker PLA Eco @Dual", + "sub_path": "filament/Snapmaker PLA Eco @Dual.json" + }, + { + "name": "Snapmaker PLA Eco @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Eco @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA @Dual base", + "sub_path": "filament/Snapmaker PLA @Dual base.json" + }, + { + "name": "Snapmaker PLA @Dual", + "sub_path": "filament/Snapmaker PLA @Dual.json" + }, + { + "name": "Snapmaker PLA Matte @Dual", + "sub_path": "filament/Snapmaker PLA Matte @Dual.json" + }, + { + "name": "Snapmaker PLA Metal @Dual base", + "sub_path": "filament/Snapmaker PLA Metal @Dual base.json" + }, + { + "name": "Snapmaker PLA Metal @Dual", + "sub_path": "filament/Snapmaker PLA Metal @Dual.json" + }, + { + "name": "Snapmaker PLA Metal @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Metal @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA-CF @Dual base", + "sub_path": "filament/Snapmaker PLA-CF @Dual base.json" + }, + { + "name": "Snapmaker PLA-CF @Dual", + "sub_path": "filament/Snapmaker PLA-CF @Dual.json" + }, + { + "name": "Snapmaker PLA-CF @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Silk @Dual base", + "sub_path": "filament/Snapmaker PLA Silk @Dual base.json" + }, + { + "name": "Snapmaker PLA Silk @Dual", + "sub_path": "filament/Snapmaker PLA Silk @Dual.json" + }, + { + "name": "Snapmaker PLA Silk @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @Dual 0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @Dual", + "sub_path": "filament/PolyLite PLA @Dual.json" + }, + { + "name": "PolyLite PLA @Dual 0.2 nozzle", + "sub_path": "filament/PolyLite PLA @Dual 0.2 nozzle.json" + }, + { + "name": "PolyTerra PLA @Dual", + "sub_path": "filament/PolyTerra PLA @Dual.json" + }, + { + "name": "PolyTerra PLA @Dual 0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PVA @Dual base", + "sub_path": "filament/Snapmaker PVA @Dual base.json" + }, + { + "name": "Snapmaker PVA @Dual", + "sub_path": "filament/Snapmaker PVA @Dual.json" + }, + { + "name": "Snapmaker PVA @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker TPU @Dual base", + "sub_path": "filament/Snapmaker TPU @Dual base.json" + }, + { + "name": "Snapmaker TPU @Dual", + "sub_path": "filament/Snapmaker TPU @Dual.json" + }, + { + "name": "Snapmaker TPU High-Flow @Dual", + "sub_path": "filament/Snapmaker TPU High-Flow @Dual.json" + }, + { + "name": "Snapmaker TPE @Dual", + "sub_path": "filament/Snapmaker TPE @Dual.json" + }, + { + "name": "Snapmaker Breakaway Support @base", + "sub_path": "filament/Snapmaker Breakaway Support @base.json" + }, + { + "name": "Snapmaker Breakaway Support", + "sub_path": "filament/Snapmaker Breakaway Support.json" + }, + { + "name": "Snapmaker Breakaway Support @J1", + "sub_path": "filament/Snapmaker Breakaway Support @J1.json" + }, + + + + + + + { + "name": "Snapmaker PLA @U1 base", + "sub_path": "filament/Snapmaker PLA @U1 base.json" + }, + { + "name": "Snapmaker PLA Eco @U1 base", + "sub_path": "filament/Snapmaker PLA Eco @U1 base.json" + }, + { + "name": "Snapmaker PLA Matte", + "sub_path": "filament/Snapmaker PLA Matte.json" + }, + { + "name": "Snapmaker PLA Matte @U1 base", + "sub_path": "filament/Snapmaker PLA Matte @U1 base.json" + }, + { + "name": "Snapmaker PLA Matte test @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte test @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte test @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic @U1 base", + "sub_path": "filament/Snapmaker PLA Basic @U1 base.json" + }, + { + "name": "Snapmaker PLA Basic test @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic test @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic test @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @base.json" + }, + { + "name": "Snapmaker PLA SnapSpeed", + "sub_path": "filament/Snapmaker PLA SnapSpeed.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @J1", + "sub_path": "filament/Snapmaker PLA SnapSpeed @J1.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @Dual", + "sub_path": "filament/Snapmaker PLA SnapSpeed @Dual.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Metal @U1 base", + "sub_path": "filament/Snapmaker PLA Metal @U1 base.json" + }, + { + "name": "Snapmaker PLA Silk @U1 base", + "sub_path": "filament/Snapmaker PLA Silk @U1 base.json" + }, + { + "name": "Snapmaker PLA-CF @U1 base", + "sub_path": "filament/Snapmaker PLA-CF @U1 base.json" + }, + { + "name": "Snapmaker PVA @U1 base", + "sub_path": "filament/Snapmaker PVA @U1 base.json" + }, + { + "name": "Snapmaker TPU @U1 base", + "sub_path": "filament/Snapmaker TPU @U1 base.json" + }, + { + "name": "Snapmaker TPU 95A @U1 base", + "sub_path":"filament/Snapmaker TPU 95A @U1 base.json" + }, + { + "name": "Snapmaker PETG HF @base", + "sub_path": "filament/Snapmaker PETG HF @base.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.8 nozzle.json" + }, + + + + + + + + + + + + + + + { + "name": "fdm_filament_common_bambu", + "sub_path": "filament/fdm_filament_common_bambu.json" + }, + + + + + { + "name": "fdm_filament_abs_bambu", + "sub_path": "filament/fdm_filament_abs_bambu.json" + }, + { + "name": "fdm_filament_asa_bambu", + "sub_path": "filament/fdm_filament_asa_bambu.json" + }, + { + "name": "fdm_filament_bvoh_bambu", + "sub_path": "filament/fdm_filament_bvoh_bambu.json" + }, + { + "name": "fdm_filament_eva_bambu", + "sub_path": "filament/fdm_filament_eva_bambu.json" + }, + { + "name": "fdm_filament_hips_bambu", + "sub_path": "filament/fdm_filament_hips_bambu.json" + }, + { + "name": "fdm_filament_pa_bambu", + "sub_path": "filament/fdm_filament_pa_bambu.json" + }, + { + "name": "fdm_filament_pc_bambu", + "sub_path": "filament/fdm_filament_pc_bambu.json" + }, + { + "name": "fdm_filament_pctg_bambu", + "sub_path": "filament/fdm_filament_pctg_bambu.json" + }, + { + "name": "fdm_filament_pe_bambu", + "sub_path": "filament/fdm_filament_pe_bambu.json" + }, + { + "name": "fdm_filament_pet_bambu", + "sub_path": "filament/fdm_filament_pet_bambu.json" + }, + { + "name": "fdm_filament_pha_bambu", + "sub_path": "filament/fdm_filament_pha_bambu.json" + }, + { + "name": "fdm_filament_pla_bambu", + "sub_path": "filament/fdm_filament_pla_bambu.json" + }, + { + "name": "fdm_filament_pp_bambu", + "sub_path": "filament/fdm_filament_pp_bambu.json" + }, + { + "name": "fdm_filament_ppa_bambu", + "sub_path": "filament/fdm_filament_ppa_bambu.json" + }, + { + "name": "fdm_filament_pva_bambu", + "sub_path": "filament/fdm_filament_pva_bambu.json" + }, + { + "name": "fdm_filament_tpu_bambu", + "sub_path": "filament/fdm_filament_tpu_bambu.json" + }, + + + + + + + + + { + "name": "Generic ABS bambu @base", + "sub_path": "filament/Generic ABS bambu @base.json" + }, + { + "name": "Generic ABS bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.2 nozzle.json" + }, + { + "name": "Generic ABS bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic ABS bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.6 nozzle.json" + }, + { + "name": "Generic ABS bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.8 nozzle.json" + }, + + { + "name": "Generic ASA bambu @base", + "sub_path": "filament/Generic ASA bambu @base.json" + }, + { + "name": "Generic ASA bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.2 nozzle.json" + }, + { + "name": "Generic ASA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic ASA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.6 nozzle.json" + }, + { + "name": "Generic ASA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.8 nozzle.json" + }, + { + "name": "Generic BVOH bambu @base", + "sub_path": "filament/Generic BVOH bambu @base.json" + }, + { + "name": "Generic BVOH bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic BVOH bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic BVOH bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic BVOH bambu @U1 0.6 nozzle.json" + }, + { + "name": "Generic BVOH bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic BVOH bambu @U1 0.8 nozzle.json" + }, + { + "name": "Generic EVA bambu @base", + "sub_path": "filament/Generic EVA bambu @base.json" + }, + { + "name": "Generic EVA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic EVA bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic EVA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic EVA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ABS @J1", - "sub_path": "filament/Snapmaker ABS @J1.json" + "name": "Generic EVA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic EVA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @J1 0.2 nozzle.json" + "name": "Generic HIPS bambu @base", + "sub_path": "filament/Generic HIPS bambu @base.json" }, { - "name": "Snapmaker ABS @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker ABS @J1 0.8 nozzle.json" + "name": "Generic HIPS bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ABS Benchy @J1", - "sub_path": "filament/Snapmaker ABS Benchy @J1.json" + "name": "Generic HIPS bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ASA @J1 base", - "sub_path": "filament/Snapmaker ASA @J1 base.json" + "name": "Generic HIPS bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ASA @J1", - "sub_path": "filament/Snapmaker ASA @J1.json" + "name": "Generic HIPS bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ASA @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @J1 0.2 nozzle.json" + "name": "Generic PA bambu @base", + "sub_path": "filament/Generic PA bambu @base.json" }, { - "name": "Snapmaker PA-CF @J1 base", - "sub_path": "filament/Snapmaker PA-CF @J1 base.json" + "name": "Generic PA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PA-CF @J1", - "sub_path": "filament/Snapmaker PA-CF @J1.json" + "name": "Generic PA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG @J1 base", - "sub_path": "filament/Snapmaker PETG @J1 base.json" + "name": "Generic PA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG @J1", - "sub_path": "filament/Snapmaker PETG @J1.json" + "name": "Generic PA-CF bambu @base", + "sub_path": "filament/Generic PA-CF bambu @base.json" }, { - "name": "Snapmaker PETG @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @J1 0.2 nozzle.json" + "name": "Generic PA-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PA-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PETG @J1 0.8 nozzle.json" + "name": "Generic PA-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PA-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PET @J1 base", - "sub_path": "filament/Snapmaker PET @J1 base.json" + "name": "Generic PA-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PA-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PET @J1", - "sub_path": "filament/Snapmaker PET @J1.json" + "name": "Generic PC bambu @base", + "sub_path": "filament/Generic PC bambu @base.json" }, + { - "name": "Snapmaker PETG-CF @J1 base", - "sub_path": "filament/Snapmaker PETG-CF @J1 base.json" + "name": "Generic PC bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG-CF @J1", - "sub_path": "filament/Snapmaker PETG-CF @J1.json" + "name": "Generic PC bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Eco @J1 base", - "sub_path": "filament/Snapmaker PLA Eco @J1 base.json" + "name": "Generic PC bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Eco @J1", - "sub_path": "filament/Snapmaker PLA Eco @J1.json" + "name": "Generic PC bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Eco @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @J1 0.2 nozzle.json" + "name": "Generic PCTG bambu @base", + "sub_path": "filament/Generic PCTG bambu @base.json" }, { - "name": "Snapmaker PLA Eco @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @J1 0.8 nozzle.json" + "name": "Generic PCTG bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PCTG bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA @J1 base", - "sub_path": "filament/Snapmaker PLA @J1 base.json" + "name": "Generic PCTG bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PCTG bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA @J1", - "sub_path": "filament/Snapmaker PLA @J1.json" + "name": "Generic PCTG bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PCTG bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Matte @base", - "sub_path": "filament/Snapmaker PLA Matte @base.json" + "name": "Generic PE bambu @base", + "sub_path": "filament/Generic PE bambu @base.json" }, { - "name": "Snapmaker PLA Matte @J1", - "sub_path": "filament/Snapmaker PLA Matte @J1.json" + "name": "Generic PE bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PE bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Metal @J1 base", - "sub_path": "filament/Snapmaker PLA Metal @J1 base.json" + "name": "Generic PE bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PE bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Metal @J1", - "sub_path": "filament/Snapmaker PLA Metal @J1.json" + "name": "Generic PE bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PE bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Metal @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Metal @J1 0.2 nozzle.json" + "name": "Generic PE-CF bambu @base", + "sub_path": "filament/Generic PE-CF bambu @base.json" }, { - "name": "Snapmaker PLA-CF @J1 base", - "sub_path": "filament/Snapmaker PLA-CF @J1 base.json" + "name": "Generic PE-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PE-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA-CF @J1", - "sub_path": "filament/Snapmaker PLA-CF @J1.json" + "name": "Generic PE-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PE-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA-CF @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA-CF @J1 0.8 nozzle.json" + "name": "Generic PE-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PE-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Silk @J1 base", - "sub_path": "filament/Snapmaker PLA Silk @J1 base.json" + "name": "Generic PETG bambu @base", + "sub_path": "filament/Generic PETG bambu @base.json" }, { - "name": "Snapmaker PLA Silk @J1", - "sub_path": "filament/Snapmaker PLA Silk @J1.json" + "name": "Generic PETG bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Silk @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @J1 0.2 nozzle.json" + "name": "Generic PETG bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.4 nozzle.json" }, { - "name": "PolyLite PLA @J1", - "sub_path": "filament/PolyLite PLA @J1.json" + "name": "Generic PETG bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.6 nozzle.json" }, { - "name": "PolyLite PLA @J1 0.2 nozzle", - "sub_path": "filament/PolyLite PLA @J1 0.2 nozzle.json" + "name": "Generic PETG bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.8 nozzle.json" }, { - "name": "PolyTerra PLA @J1", - "sub_path": "filament/PolyTerra PLA @J1.json" + "name": "Generic PETG HF bambu @base", + "sub_path": "filament/Generic PETG HF bambu @base.json" }, { - "name": "PolyTerra PLA @J1 0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @J1 0.2 nozzle.json" + "name": "Generic PETG HF bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PVA @J1 base", - "sub_path": "filament/Snapmaker PVA @J1 base.json" + "name": "Generic PETG HF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PVA @J1", - "sub_path": "filament/Snapmaker PVA @J1.json" + "name": "Generic PETG HF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PVA @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @J1 0.2 nozzle.json" + "name": "Generic PETG HF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker TPU @J1 base", - "sub_path": "filament/Snapmaker TPU @J1 base.json" + "name": "Generic PETG-CF bambu @base", + "sub_path": "filament/Generic PETG-CF bambu @base.json" }, { - "name": "Snapmaker TPU @J1", - "sub_path": "filament/Snapmaker TPU @J1.json" + "name": "Generic PETG-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker TPU High-Flow @J1", - "sub_path": "filament/Snapmaker TPU High-Flow @J1.json" + "name": "Generic PETG-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker TPE @J1", - "sub_path": "filament/Snapmaker TPE @J1.json" + "name": "Generic PETG-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS @Dual base", - "sub_path": "filament/Snapmaker ABS @Dual base.json" + "name": "Generic PHA bambu @base", + "sub_path": "filament/Generic PHA bambu @base.json" }, { - "name": "Snapmaker ABS @Dual", - "sub_path": "filament/Snapmaker ABS @Dual.json" + "name": "Generic PHA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PHA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ABS @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @Dual 0.2 nozzle.json" + "name": "Generic PHA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PHA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ABS @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker ABS @Dual 0.8 nozzle.json" + "name": "Generic PHA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PHA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS Benchy @Dual", - "sub_path": "filament/Snapmaker ABS Benchy @Dual.json" + "name": "Generic PLA bambu @base", + "sub_path": "filament/Generic PLA bambu @base.json" }, { - "name": "Snapmaker ASA @Dual base", - "sub_path": "filament/Snapmaker ASA @Dual base.json" + "name": "Generic PLA bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ASA @Dual", - "sub_path": "filament/Snapmaker ASA @Dual.json" + "name": "Generic PLA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ASA @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @Dual 0.2 nozzle.json" + "name": "Generic PLA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PA-CF @Dual base", - "sub_path": "filament/Snapmaker PA-CF @Dual base.json" + "name": "Generic PLA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PA-CF @Dual", - "sub_path": "filament/Snapmaker PA-CF @Dual.json" + "name": "Generic PLA High Speed bambu @base", + "sub_path": "filament/Generic PLA High Speed bambu @base.json" }, { - "name": "Snapmaker PETG @Dual base", - "sub_path": "filament/Snapmaker PETG @Dual base.json" + "name": "Generic PLA High Speed bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PETG @Dual", - "sub_path": "filament/Snapmaker PETG @Dual.json" + "name": "Generic PLA High Speed bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @Dual 0.2 nozzle.json" + "name": "Generic PLA High Speed bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PETG @Dual 0.8 nozzle.json" + "name": "Generic PLA High Speed bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PET @Dual base", - "sub_path": "filament/Snapmaker PET @Dual base.json" + "name": "Generic PLA Silk bambu @base", + "sub_path": "filament/Generic PLA Silk bambu @base.json" }, { - "name": "Snapmaker PET @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PET @Dual 0.8 nozzle.json" + "name": "Generic PLA Silk bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA Silk bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PET @Dual", - "sub_path": "filament/Snapmaker PET @Dual.json" + "name": "Generic PLA Silk bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA Silk bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG-CF @Dual base", - "sub_path": "filament/Snapmaker PETG-CF @Dual base.json" + "name": "Generic PLA Silk bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA Silk bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG-CF @Dual", - "sub_path": "filament/Snapmaker PETG-CF @Dual.json" + "name": "Generic PLA-CF bambu @base", + "sub_path": "filament/Generic PLA-CF bambu @base.json" }, { - "name": "Snapmaker PLA Eco @Dual base", - "sub_path": "filament/Snapmaker PLA Eco @Dual base.json" + "name": "Generic PLA-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Eco @Dual", - "sub_path": "filament/Snapmaker PLA Eco @Dual.json" + "name": "Generic PLA-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Eco @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @Dual 0.2 nozzle.json" + "name": "Generic PLA-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Eco @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @Dual 0.8 nozzle.json" + "name": "Generic PP bambu @base", + "sub_path": "filament/Generic PP bambu @base.json" }, { - "name": "Snapmaker PLA @Dual base", - "sub_path": "filament/Snapmaker PLA @Dual base.json" + "name": "Generic PP bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PP bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA @Dual", - "sub_path": "filament/Snapmaker PLA @Dual.json" + "name": "Generic PP bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PP bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Matte @Dual", - "sub_path": "filament/Snapmaker PLA Matte @Dual.json" + "name": "Generic PP bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PP bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Metal @Dual base", - "sub_path": "filament/Snapmaker PLA Metal @Dual base.json" + "name": "Generic PP-CF bambu @base", + "sub_path": "filament/Generic PP-CF bambu @base.json" }, { - "name": "Snapmaker PLA Metal @Dual", - "sub_path": "filament/Snapmaker PLA Metal @Dual.json" + "name": "Generic PP-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PP-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Metal @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Metal @Dual 0.2 nozzle.json" + "name": "Generic PP-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PP-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA-CF @Dual base", - "sub_path": "filament/Snapmaker PLA-CF @Dual base.json" + "name": "Generic PP-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PP-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA-CF @Dual", - "sub_path": "filament/Snapmaker PLA-CF @Dual.json" + "name": "Generic PP-GF bambu @base", + "sub_path": "filament/Generic PP-GF bambu @base.json" }, { - "name": "Snapmaker PLA-CF @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA-CF @Dual 0.8 nozzle.json" + "name": "Generic PP-GF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PP-GF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Silk @Dual base", - "sub_path": "filament/Snapmaker PLA Silk @Dual base.json" + "name": "Generic PP-GF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PP-GF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Silk @Dual", - "sub_path": "filament/Snapmaker PLA Silk @Dual.json" + "name": "Generic PP-GF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PP-GF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Silk @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @Dual 0.2 nozzle.json" + "name": "Generic PPA-CF bambu @base", + "sub_path": "filament/Generic PPA-CF bambu @base.json" }, { - "name": "PolyLite PLA @Dual", - "sub_path": "filament/PolyLite PLA @Dual.json" + "name": "Generic PPA-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PPA-CF bambu @U1 0.4 nozzle.json" }, { - "name": "PolyLite PLA @Dual 0.2 nozzle", - "sub_path": "filament/PolyLite PLA @Dual 0.2 nozzle.json" + "name": "Generic PPA-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PPA-CF bambu @U1 0.6 nozzle.json" }, { - "name": "PolyTerra PLA @Dual", - "sub_path": "filament/PolyTerra PLA @Dual.json" + "name": "Generic PPA-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PPA-CF bambu @U1 0.8 nozzle.json" }, { - "name": "PolyTerra PLA @Dual 0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @Dual 0.2 nozzle.json" + "name": "Generic PPA-GF bambu @base", + "sub_path": "filament/Generic PPA-GF bambu @base.json" }, { - "name": "Snapmaker PVA @Dual base", - "sub_path": "filament/Snapmaker PVA @Dual base.json" + "name": "Generic PPA-GF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PPA-GF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PVA @Dual", - "sub_path": "filament/Snapmaker PVA @Dual.json" + "name": "Generic PPA-GF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PPA-GF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PVA @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @Dual 0.2 nozzle.json" + "name": "Generic PPA-GF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PPA-GF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker TPU @Dual base", - "sub_path": "filament/Snapmaker TPU @Dual base.json" + "name": "Generic PVA bambu @base", + "sub_path": "filament/Generic PVA bambu @base.json" }, { - "name": "Snapmaker TPU @Dual", - "sub_path": "filament/Snapmaker TPU @Dual.json" + "name": "Generic PVA bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker TPU High-Flow @Dual", - "sub_path": "filament/Snapmaker TPU High-Flow @Dual.json" + "name": "Generic PVA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker TPE @Dual", - "sub_path": "filament/Snapmaker TPE @Dual.json" + "name": "Generic PVA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker Breakaway Support @base", - "sub_path": "filament/Snapmaker Breakaway Support @base.json" + "name": "Generic PVA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker Breakaway Support", - "sub_path": "filament/Snapmaker Breakaway Support.json" + "name": "Generic TPU bambu @base", + "sub_path": "filament/Generic TPU bambu @base.json" }, { - "name": "Snapmaker Breakaway Support @J1", - "sub_path": "filament/Snapmaker Breakaway Support @J1.json" + "name": "Generic TPU bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU bambu @U1 0.4 nozzle.json" }, - - - - - - { - "name": "Snapmaker PLA @U1 base", - "sub_path": "filament/Snapmaker PLA @U1 base.json" + "name": "Generic TPU bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Eco @U1 base", - "sub_path": "filament/Snapmaker PLA Eco @U1 base.json" + "name": "Generic TPU bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Matte", - "sub_path": "filament/Snapmaker PLA Matte.json" + "name": "Generic TPU for AMS bambu @base", + "sub_path": "filament/Generic TPU for AMS bambu @base.json" }, { - "name": "Snapmaker PLA Matte @U1 base", - "sub_path": "filament/Snapmaker PLA Matte @U1 base.json" + "name": "Generic TPU for AMS bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU for AMS bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Matte @U1", - "sub_path": "filament/Snapmaker PLA Matte @U1.json" + "name": "Generic TPU for AMS bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU for AMS bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Basic @U1 base", - "sub_path": "filament/Snapmaker PLA Basic @U1 base.json" + "name": "Generic TPU for AMS bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU for AMS bambu @U1 0.8 nozzle.json" }, + + + + + { - "name": "Snapmaker PLA Basic @U1", - "sub_path": "filament/Snapmaker PLA Basic @U1.json" + "name": "Generic PLA @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @base.json" + "name": "Generic PLA @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed", - "sub_path": "filament/Snapmaker PLA SnapSpeed.json" + "name": "Generic PLA @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA @U1 0.6 nozzle.json" + }, + { + "name": "Generic PLA @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA @U1 0.8 nozzle.json" }, + + { - "name": "Snapmaker PLA SnapSpeed @J1", - "sub_path": "filament/Snapmaker PLA SnapSpeed @J1.json" + "name": "Generic PLA High Speed test @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @Dual", - "sub_path": "filament/Snapmaker PLA SnapSpeed @Dual.json" + "name": "Generic PLA High Speed @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @U1 base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + "name": "Generic PLA High Speed @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @U1 base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + "name": "Generic PLA High Speed @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.8 nozzle.json" }, + { - "name": "Snapmaker PLA SnapSpeed @U1", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1.json" + "name": "Generic PLA-CF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Metal @U1 base", - "sub_path": "filament/Snapmaker PLA Metal @U1 base.json" + "name": "Generic PLA-CF @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Silk @U1 base", - "sub_path": "filament/Snapmaker PLA Silk @U1 base.json" + "name": "Generic PLA-CF @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.6 nozzle.json" }, { - "name": "Snapmaker TPU 95A HF @U1", - "sub_path": "filament/Snapmaker TPU 95A HF @U1.json" + "name": "Generic PLA-CF @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.8 nozzle.json" }, + { - "name": "Snapmaker PLA-CF @U1 base", - "sub_path": "filament/Snapmaker PLA-CF @U1 base.json" + "name": "Generic PLA Silk @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PVA @U1 base", - "sub_path": "filament/Snapmaker PVA @U1 base.json" + "name": "Generic PLA Silk @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.4 nozzle.json" }, { - "name": "Snapmaker TPU @U1 base", - "sub_path": "filament/Snapmaker TPU @U1 base.json" + "name": "Generic PLA Silk @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.6 nozzle.json" }, - { - "name": "Snapmaker TPU 95A @U1 base", - "sub_path":"filament/Snapmaker TPU 95A @U1 base.json" + { + "name": "Generic PLA Silk @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.8 nozzle.json" }, - + + + { - "name": "fdm_filament_common_poly", - "sub_path": "filament/fdm_filament_common_poly.json" + "name": "fdm_filament_common_poly_test", + "sub_path": "filament/fdm_filament_common_poly_test.json" }, { - "name": "fdm_filament_pla_poly", - "sub_path": "filament/fdm_filament_pla_poly.json" + "name": "fdm_filament_pla_poly_test", + "sub_path": "filament/fdm_filament_pla_poly_test.json" }, { "name": "Polymaker PLA @U1 base", @@ -1348,6 +2336,12 @@ "name": "Polymaker Tough PLA Family @U1", "sub_path": "filament/Polymaker Tough PLA Family @U1.json" } + + + + + + ], "machine_list": [ { @@ -1718,10 +2712,22 @@ "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.4 nozzle)", "sub_path": "machine/Snapmaker U1 (0.4 nozzle).json" }, + { + "name": "Snapmaker U1 (0.6 nozzle)", + "sub_path": "machine/Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "Snapmaker U1 (0.8 nozzle)", + "sub_path": "machine/Snapmaker U1 (0.8 nozzle).json" + }, { "name": "Snapmaker Artisan (0.2 nozzle)", "sub_path": "machine/Snapmaker Artisan (0.2 nozzle).json" diff --git a/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json b/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json index 51fed0524c1..2caa3f3063c 100644 --- a/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json +++ b/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json @@ -11,9 +11,6 @@ "cool_plate_temp_initial_layer": [ "0" ], - "filament_type": [ - "PETG" - ], "eng_plate_temp": [ "70" ], diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json index 34e7d04d3d4..ad81f2d79d2 100644 --- a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json @@ -7,8 +7,5 @@ "inherits": "PolyLite PLA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json index 10ae30494b8..f77d1d80825 100644 --- a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json @@ -7,8 +7,5 @@ "inherits": "PolyTerra PLA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json index 2f40e7170ea..6cceb35a52c 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json @@ -25,11 +25,5 @@ ], "temperature_vitrification": [ "62" - ], - "textured_plate_temp": [ - "65" - ], - "textured_plate_temp_initial_layer": [ - "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json index 94008ddd0c3..bb30b05f055 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json @@ -1,7 +1,7 @@ { "type": "filament", "name": "Polymaker PLA @U1 base", - "inherits": "fdm_filament_pla_poly", + "inherits": "fdm_filament_pla_poly_test", "from": "system", "setting_id": "OGFSA04", "instantiation": "false", diff --git a/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json index 8eb48fdc722..65f20d02714 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json @@ -25,11 +25,5 @@ ], "nozzle_temperature_range_high": [ "230" - ], - "textured_plate_temp": [ - "65" - ], - "textured_plate_temp_initial_layer": [ - "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json index 8039e284167..c3de9b60035 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json @@ -25,11 +25,5 @@ ], "temperature_vitrification": [ "55" - ], - "textured_plate_temp": [ - "65" - ], - "textured_plate_temp_initial_layer": [ - "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json index e5aa9bd44a6..8e6cf258492 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker ABS @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json index fdec66fc05d..0e791164d75 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json @@ -11,9 +11,6 @@ "compatible_prints": [ "0.25 Benchy @Snapmaker U1 (0.4 nozzle)" ], - "enable_pressure_advance": [ - "0" - ], "overhang_fan_speed": [ "35" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json index 0472b593ba4..d1f75890545 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker ASA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json index 32c20b1f21a..163bb5c6281 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json @@ -10,8 +10,5 @@ ], "filament_type": [ "PLA" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json index 6fefdfc885d..80ef97e3084 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json @@ -9,8 +9,5 @@ "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json index 2309eb767fb..79da9ec77e9 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PET @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json index 14f636d0887..a45967876d0 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PETG @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json index 9ca5d526199..19ca1db4991 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PETG-CF @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json index cc7c3a37fda..d92a90178e8 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json @@ -8,9 +8,6 @@ "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" ], - "enable_pressure_advance": [ - "0" - ], "hot_plate_temp":[ "55" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json index c27ad00a44c..03c51c7ff62 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA Eco @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json index dfd5dcf1ffc..fec713c9be4 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA Metal @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json index 7d0e0e2eda3..d67a1f3badb 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA Silk @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json index 8d278db626b..7a870c11cf0 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA-CF @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json index a544fb2998a..e4622e6bfd3 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PVA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json index 5d0025cde33..841a3583ebb 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json @@ -17,9 +17,6 @@ "overhang_fan_speed": [ "65" ], - "enable_pressure_advance": [ - "0" - ], "filament_flow_ratio": [ "1.1" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json index 4fbf9bf11c2..1d00d0800d9 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json @@ -9,8 +9,5 @@ "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.6 nozzle)", "Snapmaker U1 (0.8 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json index 0b93618885a..bbfd209a0a3 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json @@ -10,9 +10,6 @@ "Snapmaker U1 (0.6 nozzle)", "Snapmaker U1 (0.8 nozzle)" ], - "enable_pressure_advance": [ - "0" - ], "filament_flow_ratio": [ "0.983" ], diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json index 070399c9cec..9c6b1ea6ce7 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json @@ -193,12 +193,13 @@ "0", "0" ], - "ramming_pressure_advance_value": "0.02", "default_print_profile": "0.20 Standard @Snapmaker U1 (0.4 nozzle)", + "ramming_pressure_advance_value": "0.02", "tool_change_temprature_wait": "0", "printer_notes": "", "machine_pause_gcode": "M600", "default_bed_type": "Textured PEI Plate", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", - "nozzle_volume": "143" + "nozzle_volume": "143", + "support_multi_bed_types": "1" } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1.json b/resources/profiles/Snapmaker/machine/Snapmaker U1.json index 601a6ab4ffc..a17bc1246e0 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1.json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1.json @@ -4,10 +4,10 @@ "family": "Snapmaker", "name": "Snapmaker U1", "url": "https://github.com/macdylan", - "model_id": "SM_U1", + "model_id": "797581801", "bed_model": "Snapmaker U1_bed.stl", "bed_texture": "Snapmaker U1_texture.svg", - "nozzle_diameter": "0.4" + "nozzle_diameter": "0.2;0.4;0.6;0.8" } diff --git a/resources/profiles/Snapmaker/machine/fdm_U1.json b/resources/profiles/Snapmaker/machine/fdm_U1.json index f2a119b4a4e..9ed8c453133 100644 --- a/resources/profiles/Snapmaker/machine/fdm_U1.json +++ b/resources/profiles/Snapmaker/machine/fdm_U1.json @@ -183,6 +183,5 @@ "machine_start_gcode": "PRINT_START TOOL_TEMP={first_layer_temperature[initial_tool]} {if is_extruder_used[0]}T0_TEMP={first_layer_temperature[0]}{endif} {if is_extruder_used[1]}T1_TEMP={first_layer_temperature[1]}{endif} {if is_extruder_used[2]}T2_TEMP={first_layer_temperature[2]}{endif} {if is_extruder_used[3]}T3_TEMP={first_layer_temperature[3]}{endif} {if is_extruder_used[4]}T4_TEMP={first_layer_temperature[4]}{endif} {if is_extruder_used[5]}T5_TEMP={first_layer_temperature[5]}{endif} BED_TEMP=[first_layer_bed_temperature] TOOL=[initial_tool]\n\nM83\n; set extruder temp\n{if first_layer_temperature[0] > 0 and (is_extruder_used[0])}M104 T0 S{first_layer_temperature[0]}{endif}\n{if first_layer_temperature[1] > 0 and (is_extruder_used[1])}M104 T1 S{first_layer_temperature[1]}{endif}\n{if first_layer_temperature[2] > 0 and (is_extruder_used[2])}M104 T2 S{first_layer_temperature[2]}{endif}\n{if first_layer_temperature[3] > 0 and (is_extruder_used[3])}M104 T3 S{first_layer_temperature[3]}{endif}\n{if first_layer_temperature[4] > 0 and (is_extruder_used[4])}M104 T4 S{first_layer_temperature[4]}{endif}\n{if (is_extruder_used[0]) and initial_tool != 0}\n;\n; purge first tool\n;\nG1 F{travel_speed * 60}\nM109 T0 S{first_layer_temperature[0]}\nT0; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(0 == 0 ? 0 : (0 == 1 ? 120 : (0 == 2 ? 180 : 300)))} Y{(0 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[0]}10{else}30{endif} X40 Z0.2 F{if filament_multitool_ramming[0]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X40 E9 F800 ; continue purging and wipe the nozzle\nG0 X{40 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{40 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[0]} F2400 ; retract\n{e_retracted[0] = 1.5 * retract_length[0]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[0] == 0 ? (first_layer_temperature[0] + standby_temperature_delta) : (idle_temperature[0]))} T0\n{endif}\n{if (is_extruder_used[1]) and initial_tool != 1}\n;\n; purge second tool\n;\nG1 F{travel_speed * 60}\nM109 T1 S{first_layer_temperature[1]}\nT1; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(1 == 0 ? 0 : (1 == 1 ? 120 : (1 == 2 ? 180 : 300)))} Y{(1 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[1]}10{else}30{endif} X120 Z0.2 F{if filament_multitool_ramming[1]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X80 E9 F800 ; continue purging and wipe the nozzle\nG0 X{80 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{80 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[1]} F2400 ; retract\n{e_retracted[1] = 1.5 * retract_length[1]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[1] == 0 ? (first_layer_temperature[1] + standby_temperature_delta) : (idle_temperature[1]))} T1\n{endif}\n{if (is_extruder_used[2]) and initial_tool != 2}\n;\n; purge third tool\n;\nG1 F{travel_speed * 60}\nM109 T2 S{first_layer_temperature[2]}\nT2; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(2 == 0 ? 0 : (2 == 1 ? 120 : (2 == 2 ? 180 : 300)))} Y{(2 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[2]}10{else}30{endif} X220 Z0.2 F{if filament_multitool_ramming[2]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X220 E9 F800 ; continue purging and wipe the nozzle\nG0 X{220 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{220 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[2]} F2400 ; retract\n{e_retracted[2] = 1.5 * retract_length[2]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[2] == 0 ? (first_layer_temperature[2] + standby_temperature_delta) : (idle_temperature[2]))} T2\n{endif}\n{if (is_extruder_used[3]) and initial_tool != 3}\n;\n; purge fourth tool\n;\nG1 F{travel_speed * 60}\nM109 T3 S{first_layer_temperature[3]}\nT3; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(3 == 0 ? 0 : (3 == 1 ? 120 : (3 == 2 ? 180 : 300)))} Y{(3 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[3]}10{else}30{endif} X290 Z0.2 F{if filament_multitool_ramming[3]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X260 E9 F800 ; continue purging and wipe the nozzle\nG0 X{260 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{260 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[3]} F2400 ; retract\n{e_retracted[3] = 1.5 * retract_length[3]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[3] == 0 ? (first_layer_temperature[3] + standby_temperature_delta) : (idle_temperature[3]))} T3\n{endif}\n{if (is_extruder_used[4]) and initial_tool != 4}\n;\n; purge fifth tool\n;\nG1 F{travel_speed * 60}\nM109 T4 S{first_layer_temperature[4]}\nT4; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(4 == 0 ? 0 : (4 == 1 ? 120 : (4 == 2 ? 180 : 300)))} Y{(4 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[4]}10{else}30{endif} X290 Z0.2 F{if filament_multitool_ramming[4]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X260 E9 F800 ; continue purging and wipe the nozzle\nG0 X{260 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{260 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[4]} F2400 ; retract\n{e_retracted[4] = 1.5 * retract_length[4]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[4] == 0 ? (first_layer_temperature[4] + standby_temperature_delta) : (idle_temperature[4]))} T4\n{endif}\n;\n; purge initial tool\n;\nG1 F{travel_speed * 60}\nM109 T{initial_tool} S{first_layer_temperature[initial_tool]}\nT{initial_tool}; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300)))} Y{(initial_tool < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[initial_tool]}10{else}30{endif} X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 10)} Z0.2 F{if filament_multitool_ramming[initial_tool]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40)} E9 F800 ; continue purging and wipe the nozzle\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 3)} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 3 * 2)} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[initial_tool]} F2400 ; retract\n{e_retracted[initial_tool] = 1.5 * retract_length[initial_tool]}\nG92 E0 ; reset extruder position\n", "scan_first_layer": "0", "nozzle_type": "undefine", - "auxiliary_fan": "0", - "default_bed_type": "Textured PEI Plate" + "auxiliary_fan": "0" } \ No newline at end of file diff --git a/resources/web/guide/21/21.css b/resources/web/guide/21/21.css index 7f9d1e95547..b5519b6de86 100644 --- a/resources/web/guide/21/21.css +++ b/resources/web/guide/21/21.css @@ -69,25 +69,22 @@ display: flex; align-items: center; justify-content: flex-start; - gap: 8px; + gap: 5px; } .pNozzel { - display: flex; - align-items: center; - justify-content:flex-start; - color: #5A5A5A; - padding-left: 0px; /* ORCA Align checkboxes with with model text */ - min-width: 20px; + display: contents; + color: #5A5A5A; } -.pNozzel input +.PNameRow input[type="checkbox"] { - vertical-align: middle; - margin-right: 0; + flex: 0 0 auto; + margin: 0; width: 16px; height: 16px; + vertical-align: middle; } diff --git a/resources/web/guide/24/24.css b/resources/web/guide/24/24.css index 25951d4b4c0..e2122948ee2 100644 --- a/resources/web/guide/24/24.css +++ b/resources/web/guide/24/24.css @@ -93,25 +93,22 @@ display: flex; align-items: center; justify-content: flex-start; - gap: 8px; + gap: 5px; } .pNozzel { - display: flex; - align-items: center; - justify-content:flex-start; - color: #5A5A5A; - padding-left: 0px; /* ORCA Align checkboxes with with model text */ - min-width: 20px; + display: contents; + color: #5A5A5A; } -.pNozzel input +.PNameRow input[type="checkbox"] { - vertical-align: middle; - margin-right: 0; + flex: 0 0 auto; + margin: 0; width: 16px; height: 16px; + vertical-align: middle; } diff --git a/resources/web/preset_bind/24/24.css b/resources/web/preset_bind/24/24.css index 377fc529712..245da69290a 100644 --- a/resources/web/preset_bind/24/24.css +++ b/resources/web/preset_bind/24/24.css @@ -51,25 +51,22 @@ display: flex; align-items: center; justify-content: flex-start; - gap: 8px; + gap: 5px; } .pNozzel { - display: flex; - align-items: center; - justify-content:flex-start; - color: #5A5A5A; - padding-left: 0; - min-width: 20px; -} - -.pNozzel input[type="checkbox"] { - vertical-align: middle; - margin-right: 0; - cursor: pointer; - width: 16px; - height: 16px; + display: contents; + color: #5A5A5A; +} + +.PNameRow input[type="checkbox"] { + flex: 0 0 auto; + margin: 0; + cursor: pointer; + width: 16px; + height: 16px; + vertical-align: middle; } /*-----Notice-----*/ From 1301e1da015b7c91a4c9f87b5705aca6803cb0e6 Mon Sep 17 00:00:00 2001 From: alves Date: Mon, 30 Mar 2026 18:05:04 +0800 Subject: [PATCH 21/46] feature export 3mf include the graphic plate,process soft and load nozzle&filament config, plate&filament config. --- src/libslic3r/Format/bbs_3mf.cpp | 3 ++ src/libslic3r/PrintConfig.cpp | 21 +++++++++- src/slic3r/GUI/GUI_App.cpp | 65 ++++++++++++++++++++++++++++++ src/slic3r/GUI/GUI_App.hpp | 11 +++++ src/slic3r/GUI/Tab.cpp | 69 +++++++++++++++++++++++++++++++- 5 files changed, 166 insertions(+), 3 deletions(-) diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 938b72126ac..5fad697a005 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -4159,6 +4159,9 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) } else if (key == BED_TYPE_ATTR) { + // Legacy 3MF used "Graphic Effect Steel Plate"; canonical key is "Graphic Effect Plate" (same btGESP). + if (value == "Graphic Effect Steel Plate") + value = "Graphic Effect Plate"; BedType bed_type = BedType::btPC; ConfigOptionEnum::from_string(value, bed_type); m_curr_plater->config.set_key_value("curr_bed_type", new ConfigOptionEnum(bed_type)); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 1a8df85b8d8..ed386e6a4fe 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -393,10 +393,25 @@ static const t_config_enum_values s_keys_map_BedType = { { "High Temp Plate", btPEI }, { "Textured PEI Plate", btPTE }, { "Textured Cool Plate", btPCT }, - { "Graphic Effect Steel Plate", btGESP } + // Canonical name for btGESP (UI: "Graphic Effect Plate"). Keep legacy string so old projects/3MF still deserialize. + { "Graphic Effect Plate", btGESP }, + { "Graphic Effect Steel Plate", btGESP }, }; CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(BedType) +namespace { +// Two keys map to btGESP; enum_names_from_keys_map assigns the lexicographically last key to names[btGESP]. +// Force the canonical string used by serialize() / 3MF export. +struct BedTypeGespCanonicalSerializeName +{ + BedTypeGespCanonicalSerializeName() + { + if (s_keys_names_BedType.size() > size_t(btGESP)) + s_keys_names_BedType[size_t(btGESP)] = "Graphic Effect Plate"; + } +} s_bed_type_gesp_canonical_serialize_name; +} // namespace + // BBS static const t_config_enum_values s_keys_map_LayerSeq = { { "Auto", flsAuto }, @@ -760,7 +775,7 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Bed temperature"); def->min = 0; def->max = 300; - def->set_default_value(new ConfigOptionInts{45});//todo by alves will be update the mini temp + def->set_default_value(new ConfigOptionInts{45}); def = this->add("graphic_effect_plate_temp", coInts); def->label = L("Other layers"); @@ -6972,6 +6987,8 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va } } else if (opt_key == "overhang_fan_threshold" && value == "5%") { value = "10%"; + } else if (opt_key == "curr_bed_type" && value == "Graphic Effect Steel Plate") { + value = "Graphic Effect Plate"; } else if( opt_key == "wall_infill_order" ) { if (value == "inner wall/outer wall/infill" || value == "infill/inner wall/outer wall") { opt_key = "wall_sequence"; diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 2b906d5d018..21b0e7b256c 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -177,6 +177,70 @@ namespace pt = boost::property_tree; namespace Slic3r { namespace GUI { +void GUI_App::load_filament_hot_bed_nozzle_relations() +{ + m_bed_support_filament_types.clear(); + m_bed_warning_filament_types.clear(); + m_nozzle_forbidden_filament_presets.clear(); + m_filament_hot_bed_nozzle_rules_loaded = false; + + const auto file_path = (boost::filesystem::path(Slic3r::resources_dir()) / "profiles" / "Snapmaker" / "filament" / "filament_hot_bed_nozzles.json").string(); + if (!boost::filesystem::exists(file_path)) { + BOOST_LOG_TRIVIAL(warning) << "filament_hot_bed_nozzles.json not found: " << file_path; + return; + } + + try { + boost::property_tree::ptree root; + boost::property_tree::read_json(file_path, root); + + for (const auto& kv : root) { + const std::string& rule_key = kv.first; + const auto& rule_obj = kv.second; + auto& support_set = m_bed_support_filament_types[rule_key]; + auto& warning_set = m_bed_warning_filament_types[rule_key]; + auto& forbid_set = m_nozzle_forbidden_filament_presets[rule_key]; + + for (const auto& child : rule_obj) { + if (child.first == "support") { + for (const auto& item : child.second) + support_set.insert(item.second.get_value()); + } else if (child.first == "warning") { + for (const auto& item : child.second) + warning_set.insert(item.second.get_value()); + } else if (child.first == "forbidden") { + for (const auto& item : child.second) + forbid_set.insert(item.second.get_value()); + } + } + } + m_filament_hot_bed_nozzle_rules_loaded = true; + BOOST_LOG_TRIVIAL(info) << "Loaded filament/hotbed/nozzle rules from " << file_path; + } catch (const std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "Failed to parse filament_hot_bed_nozzles.json: " << e.what(); + } +} + +bool GUI_App::is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const +{ + auto it = m_bed_support_filament_types.find(bed_key); + if (it == m_bed_support_filament_types.end()) + return true; + return it->second.empty() || it->second.find(filament_type) != it->second.end(); +} + +bool GUI_App::is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const +{ + auto it = m_bed_warning_filament_types.find(bed_key); + return it != m_bed_warning_filament_types.end() && it->second.find(filament_type) != it->second.end(); +} + +bool GUI_App::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const +{ + auto it = m_nozzle_forbidden_filament_presets.find(nozzle_key); + return it != m_nozzle_forbidden_filament_presets.end() && it->second.find(filament_preset_name) != it->second.end(); +} + class MainFrame; void start_ping_test() @@ -2328,6 +2392,7 @@ bool GUI_App::on_init_inner() const wxString resources_dir = from_u8(Slic3r::resources_dir()); wxCHECK_MSG(wxDirExists(resources_dir), false, wxString::Format(_L("Resources path does not exist or is not a directory: %s"), resources_dir)); + load_filament_hot_bed_nozzle_relations(); #ifdef __linux__ if (! check_old_linux_datadir(GetAppName())) { diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index d8686e9164f..ed541d60c83 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -33,6 +33,8 @@ #include #include +#include +#include //#define BBL_HAS_FIRST_PAGE 1 #define STUDIO_INACTIVE_TIMEOUT 15*60*1000 @@ -422,6 +424,11 @@ class GUI_App : public wxApp wxString get_inf_dialog_contect () {return m_info_dialog_content;}; std::vector split_str(std::string src, std::string separator); + void load_filament_hot_bed_nozzle_relations(); + bool has_filament_hot_bed_nozzle_rules() const { return m_filament_hot_bed_nozzle_rules_loaded; } + bool is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const; + bool is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const; + bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const; // To be called after the GUI is fully built up. // Process command line parameters cached in this->init_params, // load configs, STLs etc. @@ -826,6 +833,10 @@ class GUI_App : public wxApp boost::optional m_last_config_version; bool m_config_corrupted { false }; std::string m_open_method; + bool m_filament_hot_bed_nozzle_rules_loaded { false }; + std::unordered_map> m_bed_support_filament_types; + std::unordered_map> m_bed_warning_filament_types; + std::unordered_map> m_nozzle_forbidden_filament_presets; SMUserInfo m_login_userinfo; diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 7043ced8805..7901c67e161 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include #include @@ -64,6 +66,66 @@ namespace GUI { static const std::vector plate_keys = { "curr_bed_type", "skirt_start_angle", "first_layer_print_sequence", "first_layer_sequence_choice", "other_layers_print_sequence", "other_layers_sequence_choice", "print_sequence", "spiral_mode"}; +static std::string bed_type_to_rule_key(BedType bed_type) +{ + switch (bed_type) { + case btPEI: return "btPEI"; + case btGESP: return "btGESP"; + default: return ""; + } +} + +static std::string nozzle_diameter_to_rule_key(double nozzle_diameter) +{ + std::ostringstream ss; + ss << std::fixed << std::setprecision(2) << nozzle_diameter; + std::string out = ss.str(); + while (!out.empty() && out.back() == '0') + out.pop_back(); + if (!out.empty() && out.back() == '.') + out.pop_back(); + return out + "mm"; +} + +static void validate_filament_hot_bed_nozzle_relation(wxWindow* parent) +{ + (void)parent; + auto& app = wxGetApp(); + if (!app.has_filament_hot_bed_nozzle_rules() || app.preset_bundle == nullptr) + return; + + const Preset& filament_preset = app.preset_bundle->filaments.get_edited_preset(); + std::string filament_type; + if (auto filament_type_opt = filament_preset.config.option("filament_type"); + filament_type_opt != nullptr && !filament_type_opt->values.empty()) + { + filament_type = filament_type_opt->values.front(); + } + if (filament_type.empty()) + return; + + auto& printer_preset = app.preset_bundle->printers.get_edited_preset(); + const auto& printer_config = printer_preset.config; + BedType bed_type = printer_preset.get_default_bed_type(app.preset_bundle); + if (app.preset_bundle->project_config.has("curr_bed_type")) + bed_type = app.preset_bundle->project_config.opt_enum("curr_bed_type"); + const std::string bed_key = bed_type_to_rule_key(bed_type); + + if (!bed_key.empty()) { + const bool is_supported = app.is_bed_filament_supported(bed_key, filament_type); + const bool is_warning = app.is_bed_filament_warning(bed_key, filament_type); + (void)is_supported; + (void)is_warning; + } + + const auto* nozzle_opt = printer_config.option("nozzle_diameter"); + if (nozzle_opt != nullptr && !nozzle_opt->values.empty()) { + const std::string nozzle_key = nozzle_diameter_to_rule_key(nozzle_opt->values.front()); + const bool is_forbidden = app.is_nozzle_filament_forbidden(nozzle_key, filament_preset.name); + (void)is_forbidden; + } +} + void Tab::Highlighter::set_timer_owner(wxEvtHandler* owner, int timerid/* = wxID_ANY*/) { m_timer.SetOwner(owner, timerid); @@ -2986,7 +3048,6 @@ void TabPrintPlate::build() m_config->option("curr_bed_type", true); if (m_preset_bundle->project_config.has("curr_bed_type")) { BedType global_bed_type = m_preset_bundle->project_config.opt_enum("curr_bed_type"); - global_bed_type = BedType(global_bed_type - 1); m_config->set_key_value("curr_bed_type", new ConfigOptionEnum(global_bed_type)); } m_config->option("first_layer_sequence_choice", true); @@ -3163,6 +3224,8 @@ void TabPrintPlate::on_value_change(const std::string& opt_key, const boost::any } wxGetApp().params_panel()->notify_object_config_changed(); + if (k == "curr_bed_type") + validate_filament_hot_bed_nozzle_relation(parent()); update(); } @@ -4695,6 +4758,8 @@ if (is_marlin_flavor) update_dirty(); update(); + if (opt_key.find("nozzle_diameter") != std::string::npos) + validate_filament_hot_bed_nozzle_relation(parent()); }; optgroup = page->new_optgroup(L("Layer height limits"), L"param_layer_height"); @@ -5560,6 +5625,8 @@ bool Tab::select_preset(std::string preset_name, bool delete_current /*=false*/, if (technology_changed) wxGetApp().mainframe->technology_changed(); + if (!canceled && m_presets->type() == Preset::TYPE_FILAMENT) + validate_filament_hot_bed_nozzle_relation(parent()); BOOST_LOG_TRIVIAL(info) << boost::format("select preset, exit"); return !canceled; From 20145b4575dab1c15287e5896917f68dd658445b Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 31 Mar 2026 19:55:04 +0800 Subject: [PATCH 22/46] feature add tips for smooth pei plater for filament relations,and graphic plater for filament relations. --- src/libslic3r/CMakeLists.txt | 2 + src/libslic3r/GCode.cpp | 19 ++++++- src/libslic3r/Print.cpp | 16 ++++++ src/libslic3r/Print.hpp | 6 +++ src/libslic3r/PrintConfig.hpp | 2 + src/slic3r/GUI/GUI_App.cpp | 58 ++++----------------- src/slic3r/GUI/GUI_App.hpp | 9 +--- src/slic3r/GUI/MainFrame.cpp | 4 +- src/slic3r/GUI/Plater.cpp | 80 ++++++++++++++++++++++++----- src/slic3r/GUI/PresetComboBoxes.cpp | 16 +++--- 10 files changed, 130 insertions(+), 82 deletions(-) diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt index da6a6b42c1d..54dd164e891 100644 --- a/src/libslic3r/CMakeLists.txt +++ b/src/libslic3r/CMakeLists.txt @@ -132,6 +132,8 @@ set(lisbslic3r_sources Feature/Interlocking/VoxelUtils.cpp Feature/Interlocking/VoxelUtils.hpp FileParserError.hpp + FilamentHotBedNozzleRules.cpp + FilamentHotBedNozzleRules.hpp Fill/Fill3DHoneycomb.cpp Fill/Fill3DHoneycomb.hpp Fill/FillAdaptive.cpp diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp index af4a2f45bb2..0d41b3a1474 100644 --- a/src/libslic3r/GCode.cpp +++ b/src/libslic3r/GCode.cpp @@ -2347,8 +2347,23 @@ void GCode::_do_export(Print& print, GCodeOutputStream &file, ThumbnailsGenerato int curr_bed_type = m_config.curr_bed_type.getInt(); std::string first_layer_bed_temp_str; - const ConfigOptionInts* first_bed_temp_opt = m_config.option(get_bed_temp_1st_layer_key((BedType)curr_bed_type)); - const ConfigOptionInts* bed_temp_opt = m_config.option(get_bed_temp_key((BedType)curr_bed_type)); + const BedType curr_bed = static_cast(curr_bed_type); + // Some bed types (for example newly added btGESP) may not have dedicated temp options in old presets. + // Fallback to PEI temps to avoid null-dereference during slicing placeholder setup. + const std::string first_bed_temp_key = get_bed_temp_1st_layer_key(curr_bed).empty() ? get_bed_temp_1st_layer_key(btPEI) : get_bed_temp_1st_layer_key(curr_bed); + const std::string bed_temp_key = get_bed_temp_key(curr_bed).empty() ? get_bed_temp_key(btPEI) : get_bed_temp_key(curr_bed); + const ConfigOptionInts* first_bed_temp_opt = m_config.option(first_bed_temp_key); + const ConfigOptionInts* bed_temp_opt = m_config.option(bed_temp_key); + ConfigOptionInts safe_zero_bed_temp({ 0 }); + if (first_bed_temp_opt == nullptr || bed_temp_opt == nullptr) { + first_bed_temp_opt = m_config.option(get_bed_temp_1st_layer_key(btPEI)); + bed_temp_opt = m_config.option(get_bed_temp_key(btPEI)); + } + if (first_bed_temp_opt == nullptr || bed_temp_opt == nullptr) { + BOOST_LOG_TRIVIAL(error) << "Missing bed temperature options for current bed type, using safe zero placeholders."; + first_bed_temp_opt = &safe_zero_bed_temp; + bed_temp_opt = &safe_zero_bed_temp; + } this->placeholder_parser().set("bbl_bed_temperature_gcode", new ConfigOptionBool(false)); this->placeholder_parser().set("bed_temperature_initial_layer", new ConfigOptionInts(*first_bed_temp_opt)); this->placeholder_parser().set("bed_temperature", new ConfigOptionInts(*bed_temp_opt)); diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 5439d638879..e7369d9aa21 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -16,6 +16,7 @@ #include "GCode/WipeTower2.hpp" #include "Utils.hpp" #include "PrintConfig.hpp" +#include "FilamentHotBedNozzleRules.hpp" #include "Model.hpp" #include "format.hpp" #include @@ -492,9 +493,24 @@ std::vector Print::extruders(bool conside_custom_gcode) const } sort_remove_duplicates(extruders); + return extruders; } +void Print::filament_rule_mismatch_flags(std::string& out_nozzle, bool& out_gesp, bool& out_pei_not_pla, bool& out_pei_tpu) const +{ + FilamentHotBedNozzleRules::singleton().ensure_loaded(); + const std::vector used = extruders(true); + FilamentHotBedNozzleRules& rules = FilamentHotBedNozzleRules::singleton(); + out_nozzle = rules.evaluate_nozzle_filament_mismatch(m_config, used); + + out_gesp = rules.evaluate_graphic_effect_bed_filament_mismatch(m_config, used); + + out_pei_tpu = rules.evaluate_pei_bed_filament_mismatch_tpu(m_config, used); + out_pei_not_pla = rules.evaluate_pei_bed_filament_mismatch_not_pla(m_config, used); +} + + // This must be called before the mapping is used (e.g., before export_gcode) void Print::initialize_filament_extruder_map() { diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 2a5e8c9553b..69589eabbe9 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -917,6 +917,12 @@ class Print : public PrintBaseWithState // SM Orca: Initialize filament-to-physical-extruder mapping table void initialize_filament_extruder_map(); std::vector extruders(bool conside_custom_gcode = false) const; + // On-demand evaluation vs filament_hot_bed_nozzles.json (calls extruders(true) once internally). + void filament_rule_mismatch_flags(std::string& out_nozzle, + bool& out_gesp, + bool& out_pei_not_pla, + bool& out_pei_tpu) const; + double max_allowed_layer_height() const; bool has_support_material() const; // Make sure the background processing has no access to this model_object during this call! diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index d9a403f8015..0aaced39faa 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1308,12 +1308,14 @@ PRINT_CONFIG_CLASS_DERIVED_DEFINE( ((ConfigOptionInts, eng_plate_temp)) ((ConfigOptionInts, hot_plate_temp)) // hot is short for high temperature ((ConfigOptionInts, textured_plate_temp)) + ((ConfigOptionInts, graphic_effect_plate_temp)) ((ConfigOptionInts, supertack_plate_temp_initial_layer)) ((ConfigOptionInts, cool_plate_temp_initial_layer)) ((ConfigOptionInts, textured_cool_plate_temp_initial_layer)) ((ConfigOptionInts, eng_plate_temp_initial_layer)) ((ConfigOptionInts, hot_plate_temp_initial_layer)) // hot is short for high temperature ((ConfigOptionInts, textured_plate_temp_initial_layer)) + ((ConfigOptionInts, graphic_effect_plate_temp_initial_layer)) ((ConfigOptionBools, enable_overhang_bridge_fan)) ((ConfigOptionInts, overhang_fan_speed)) ((ConfigOptionEnumsGeneric, overhang_fan_threshold)) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 21b0e7b256c..9b2095a8ab7 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -1,4 +1,5 @@ #include "libslic3r/Technologies.hpp" +#include "libslic3r/FilamentHotBedNozzleRules.hpp" #include "GUI_App.hpp" #include "GUI_Init.hpp" #include "GUI_ObjectList.hpp" @@ -179,66 +180,27 @@ namespace GUI { void GUI_App::load_filament_hot_bed_nozzle_relations() { - m_bed_support_filament_types.clear(); - m_bed_warning_filament_types.clear(); - m_nozzle_forbidden_filament_presets.clear(); - m_filament_hot_bed_nozzle_rules_loaded = false; - - const auto file_path = (boost::filesystem::path(Slic3r::resources_dir()) / "profiles" / "Snapmaker" / "filament" / "filament_hot_bed_nozzles.json").string(); - if (!boost::filesystem::exists(file_path)) { - BOOST_LOG_TRIVIAL(warning) << "filament_hot_bed_nozzles.json not found: " << file_path; - return; - } - - try { - boost::property_tree::ptree root; - boost::property_tree::read_json(file_path, root); - - for (const auto& kv : root) { - const std::string& rule_key = kv.first; - const auto& rule_obj = kv.second; - auto& support_set = m_bed_support_filament_types[rule_key]; - auto& warning_set = m_bed_warning_filament_types[rule_key]; - auto& forbid_set = m_nozzle_forbidden_filament_presets[rule_key]; - - for (const auto& child : rule_obj) { - if (child.first == "support") { - for (const auto& item : child.second) - support_set.insert(item.second.get_value()); - } else if (child.first == "warning") { - for (const auto& item : child.second) - warning_set.insert(item.second.get_value()); - } else if (child.first == "forbidden") { - for (const auto& item : child.second) - forbid_set.insert(item.second.get_value()); - } - } - } - m_filament_hot_bed_nozzle_rules_loaded = true; - BOOST_LOG_TRIVIAL(info) << "Loaded filament/hotbed/nozzle rules from " << file_path; - } catch (const std::exception& e) { - BOOST_LOG_TRIVIAL(error) << "Failed to parse filament_hot_bed_nozzles.json: " << e.what(); - } + FilamentHotBedNozzleRules::singleton().load(); } bool GUI_App::is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const { - auto it = m_bed_support_filament_types.find(bed_key); - if (it == m_bed_support_filament_types.end()) - return true; - return it->second.empty() || it->second.find(filament_type) != it->second.end(); + return FilamentHotBedNozzleRules::singleton().is_bed_filament_supported(bed_key, filament_type); } bool GUI_App::is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const { - auto it = m_bed_warning_filament_types.find(bed_key); - return it != m_bed_warning_filament_types.end() && it->second.find(filament_type) != it->second.end(); + return FilamentHotBedNozzleRules::singleton().is_bed_filament_warning(bed_key, filament_type); } bool GUI_App::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const { - auto it = m_nozzle_forbidden_filament_presets.find(nozzle_key); - return it != m_nozzle_forbidden_filament_presets.end() && it->second.find(filament_preset_name) != it->second.end(); + return FilamentHotBedNozzleRules::singleton().is_nozzle_filament_forbidden(nozzle_key, filament_preset_name); +} + +bool GUI_App::has_filament_hot_bed_nozzle_rules() const +{ + return FilamentHotBedNozzleRules::singleton().is_loaded(); } class MainFrame; diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index ed541d60c83..53e40c0abda 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -34,8 +34,6 @@ #include #include #include -#include - //#define BBL_HAS_FIRST_PAGE 1 #define STUDIO_INACTIVE_TIMEOUT 15*60*1000 #define LOG_FILES_MAX_NUM 30 @@ -425,7 +423,7 @@ class GUI_App : public wxApp std::vector split_str(std::string src, std::string separator); void load_filament_hot_bed_nozzle_relations(); - bool has_filament_hot_bed_nozzle_rules() const { return m_filament_hot_bed_nozzle_rules_loaded; } + bool has_filament_hot_bed_nozzle_rules() const; bool is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const; bool is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const; bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const; @@ -833,11 +831,6 @@ class GUI_App : public wxApp boost::optional m_last_config_version; bool m_config_corrupted { false }; std::string m_open_method; - bool m_filament_hot_bed_nozzle_rules_loaded { false }; - std::unordered_map> m_bed_support_filament_types; - std::unordered_map> m_bed_warning_filament_types; - std::unordered_map> m_nozzle_forbidden_filament_presets; - SMUserInfo m_login_userinfo; public: diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 72a4b2b5800..dae4df75150 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1734,8 +1734,8 @@ wxBoxSizer* MainFrame::create_side_tools() { SidePopup* p = new SidePopup(this); - if (wxGetApp().preset_bundle && !wxGetApp().preset_bundle->is_bbl_vendor()) - //if (0) + //if (wxGetApp().preset_bundle && !wxGetApp().preset_bundle->is_bbl_vendor()) + if (0) { // ThirdParty Buttons SideButton* export_gcode_btn = new SideButton(p, _L("Export G-code file"), ""); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index ce6b6d1707e..21d36633681 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2728,13 +2728,13 @@ void Sidebar::update_nozzle_settings(bool switch_machine) diameter_combo->Bind(wxEVT_COMBOBOX, [this, diameter_combo, i](wxCommandEvent& event) { - auto* pNotice = p->plater->get_notification_manager(); - if (pNotice) - { - pNotice->close_notification_of_type(NotificationType::CustomNotification); - pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); - pNotice->set_slicing_progress_hidden(); - } + //auto* pNotice = p->plater->get_notification_manager(); + //if (pNotice) + //{ + // pNotice->close_notification_of_type(NotificationType::CustomNotification); + // pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); + // pNotice->set_slicing_progress_hidden(); + //} auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; auto printer_model_opt = printer_config.option("printer_model"); @@ -3305,6 +3305,11 @@ struct Plater::priv std::chrono::steady_clock::time_point m_slice_start_time; bool m_slice_timing_active = false; + // Last filament rule mismatch flags (for CustomNotification debouncing). + bool m_prev_filament_nozzle_rule_mismatch{ false }; + bool m_prev_filament_gesp_bed_rule_mismatch{ false }; + bool m_prev_filament_pei_bed_rule_mismatch{ false }; + static const std::regex pattern_bundle; static const std::regex pattern_3mf; static const std::regex pattern_zip_amf; @@ -3493,6 +3498,7 @@ struct Plater::priv } void process_validation_warning(StringObjectException const &warning) const; + void notify_filament_compatibility_after_apply(); bool background_processing_enabled() const { #ifdef SUPPORT_BACKGROUND_PROCESSING @@ -6304,6 +6310,48 @@ void Plater::priv::process_validation_warning(StringObjectException const &warni } } +void Plater::priv::notify_filament_compatibility_after_apply() +{ + if (printer_technology != ptFFF) + return; + if (q->only_gcode_mode()) + return; + + Slic3r::Print *print = background_process.fff_print(); + if (print == nullptr) + return; + + std::string filamentNozzleMsg(""); + bool isGraphicMatch(false), isPeiBedMatchNotPla(false), isPeiBedMatchTpu(false); + + print->filament_rule_mismatch_flags(filamentNozzleMsg, isGraphicMatch, isPeiBedMatchNotPla, isPeiBedMatchTpu); + + wxString filamentMismatchNozzleMsg = wxString(_L("The combination of hot end and consumables is not recommended. The message reads: Printing TPU 95A HF with 0.2mm hardened steel hot end is not recommended. We suggest using 0.4mm or larger.")); + wxString filamentMismatchPeiBedMsgNotPla = wxString(_L("The current PEI glossy filament may have insufficient adhesion on the first layer of the heated bed. It is recommended to apply glue before printing to enhance adhesion.")); + wxString filamentMismatchPeiBedMsgTpu = wxString(_L("Warning: There is a risk of excessive adhesion between the current filament and the smooth PEI heated bed. It is recommended to apply liquid or solid adhesive before printing to protect the heated bed surface and facilitate part removal.")); + wxString filamentMismatchGraphicBedMsg = wxString(_L("The current filament has low adhesion to the special effects texture heated bed, resulting in a higher risk of printing failure. It is recommended to use other filaments for printing.")); + + if (isGraphicMatch || isPeiBedMatchNotPla) + { + notification_manager->close_notification_of_type(NotificationType::CustomNotification); + + if (isGraphicMatch) + notification_manager->push_notification(filamentMismatchGraphicBedMsg.ToStdString(), 0); + if (isPeiBedMatchNotPla) + notification_manager->push_notification(filamentMismatchPeiBedMsgNotPla.ToStdString(), 0); + if (!filamentNozzleMsg.empty()) + notification_manager->push_notification(filamentMismatchNozzleMsg.ToStdString(), 0); + + notification_manager->set_slicing_progress_hidden(); + } + + if (isPeiBedMatchTpu) + { + notification_manager->push_notification(filamentMismatchPeiBedMsgTpu.ToStdString(), 0); + } + +} + // Update background processing thread from the current config and Model. // Returns a bitmask of UpdateBackgroundProcessReturnState. @@ -6328,6 +6376,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool this->preview->update_gcode_result(partplate_list.get_current_slice_result()); } Print::ApplyStatus invalidated = background_process.apply(this->model, wxGetApp().preset_bundle->full_config()); + notify_filament_compatibility_after_apply(); if ((invalidated == Print::APPLY_STATUS_CHANGED) || (invalidated == Print::APPLY_STATUS_INVALIDATED)) // BBS: add only gcode mode @@ -7568,13 +7617,13 @@ void Plater::priv::set_current_panel(wxPanel* panel, bool no_slice) // BBS void Plater::priv::on_combobox_select(wxCommandEvent &evt) { - auto* pNotice = q->get_notification_manager(); - if(pNotice) - { - pNotice->close_notification_of_type(NotificationType::PlaterWarning); - pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); - pNotice->set_slicing_progress_hidden(); - } + //auto* pNotice = q->get_notification_manager(); + //if(pNotice) + //{ + // pNotice->close_notification_of_type(NotificationType::PlaterWarning); + // pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); + // pNotice->set_slicing_progress_hidden(); + //} PlaterPresetComboBox* preset_combo_box = dynamic_cast(evt.GetEventObject()); if (preset_combo_box) { @@ -15108,6 +15157,7 @@ void Plater::apply_background_progress() bool result_valid = part_plate->is_slice_result_valid(); //always apply the current plate's print Print::ApplyStatus invalidated = p->background_process.apply(this->model(), wxGetApp().preset_bundle->full_config()); + p->notify_filament_compatibility_after_apply(); BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" %1%: plate %2%, after apply, invalidated= %3%, previous result_valid %4% ") % __LINE__ % plate_index % invalidated % result_valid; if (invalidated & PrintBase::APPLY_STATUS_INVALIDATED) @@ -15147,6 +15197,7 @@ int Plater::select_plate(int plate_index, bool need_slice) //always apply the current plate's print invalidated = p->background_process.apply(this->model(), wxGetApp().preset_bundle->full_config()); + p->notify_filament_compatibility_after_apply(); bool model_fits, validate_err; BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(" %1%: plate %2%, after apply, invalidated= %3%, previous result_valid %4% ")%__LINE__ %plate_index %invalidated %result_valid; @@ -15453,6 +15504,7 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click, bool isModi part_plate->get_print(&print, &gcode_result, NULL); //always apply the current plate's print invalidated = p->background_process.apply(this->model(), wxGetApp().preset_bundle->full_config()); + p->notify_filament_compatibility_after_apply(); bool model_fits, validate_err; validate_current_plate(model_fits, validate_err); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 32114b34c2d..c6066b2848d 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -846,14 +846,14 @@ static void run_wizard(ConfigWizard::StartPage sp) void PlaterPresetComboBox::OnSelect(wxCommandEvent &evt) { - if (wxGetApp().plater()) { - auto* pNotice = wxGetApp().plater()->get_notification_manager(); - if (pNotice) { - pNotice->close_notification_of_type(NotificationType::CustomNotification); - pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); - pNotice->set_slicing_progress_hidden(); - } - } + // if (wxGetApp().plater()) { + // auto* pNotice = wxGetApp().plater()->get_notification_manager(); + // if (pNotice) { + // pNotice->close_notification_of_type(NotificationType::CustomNotification); + //pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); + // pNotice->set_slicing_progress_hidden(); + // } + // } auto selected_item = evt.GetSelection(); From b1f9931379eec75649d1ae1517c2b70f1054722b Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 31 Mar 2026 19:58:01 +0800 Subject: [PATCH 23/46] feature add file for filament tips. --- src/libslic3r/FilamentHotBedNozzleRules.cpp | 290 ++++++++++++++++++++ src/libslic3r/FilamentHotBedNozzleRules.hpp | 62 +++++ 2 files changed, 352 insertions(+) create mode 100644 src/libslic3r/FilamentHotBedNozzleRules.cpp create mode 100644 src/libslic3r/FilamentHotBedNozzleRules.hpp diff --git a/src/libslic3r/FilamentHotBedNozzleRules.cpp b/src/libslic3r/FilamentHotBedNozzleRules.cpp new file mode 100644 index 00000000000..e66972dfa7a --- /dev/null +++ b/src/libslic3r/FilamentHotBedNozzleRules.cpp @@ -0,0 +1,290 @@ +#include "FilamentHotBedNozzleRules.hpp" +#include "Config.hpp" +#include "Utils.hpp" + +#include +#include +#include +#include +#include +#include + +namespace Slic3r { + +namespace pt = boost::property_tree; +namespace { +std::string to_upper_ascii(std::string s) +{ + for (char& c : s) { + if (c >= 'a' && c <= 'z') + c = char(c - 'a' + 'A'); + } + return s; +} + +bool contains_token_ci(const std::string& text, const std::string& token) +{ + if (token.empty()) + return false; + const std::string up_text = to_upper_ascii(text); + const std::string up_token = to_upper_ascii(token); + return up_text.find(up_token) != std::string::npos; +} + +bool match_any_rule_token_ci(const std::unordered_set& tokens, const std::string& value) +{ + for (const std::string& token : tokens) { + if (contains_token_ci(value, token)) + return true; + } + return false; +} + +bool is_pla_type(const std::string& filament_type) +{ + return contains_token_ci(filament_type, "PLA"); +} + +bool is_tpu_type(const std::string& filament_type) +{ + return contains_token_ci(filament_type, "TPU"); +} +} // namespace + +FilamentHotBedNozzleRules& FilamentHotBedNozzleRules::singleton() +{ + static FilamentHotBedNozzleRules inst; + return inst; +} + +std::string bed_type_to_filament_rule_key(BedType bed_type) +{ + switch (bed_type) { + case btPEI: return "btPEI"; + case btGESP: return "btGESP"; + default: return ""; + } +} + +std::string nozzle_diameter_to_filament_rule_key(double nozzle_diameter_mm) +{ + std::ostringstream ss; + ss << std::fixed << std::setprecision(2) << nozzle_diameter_mm; + std::string out = ss.str(); + while (!out.empty() && out.back() == '0') + out.pop_back(); + if (!out.empty() && out.back() == '.') + out.pop_back(); + return out + "mm"; +} + +void FilamentHotBedNozzleRules::ensure_loaded() +{ + std::scoped_lock lock(m_mutex); + if (m_loaded) + return; + // std::scoped_lock has no unlock(); load() takes the same recursive_mutex (nested lock is OK). + load(); +} + +void FilamentHotBedNozzleRules::load() +{ + std::scoped_lock lock(m_mutex); + + m_bed_support_filament_types.clear(); + m_bed_warning_filament_types.clear(); + m_nozzle_forbidden_filament_presets.clear(); + m_loaded = false; + + const auto file_path = + (boost::filesystem::path(Slic3r::resources_dir()) / "profiles" / "Snapmaker" / "filament" / "filament_hot_bed_nozzles.json").string(); + if (!boost::filesystem::exists(file_path)) { + BOOST_LOG_TRIVIAL(warning) << "filament_hot_bed_nozzles.json not found: " << file_path; + return; + } + + try { + pt::ptree root; + pt::read_json(file_path, root); + + for (const auto& kv : root) { + const std::string& rule_key = kv.first; + const auto& rule_obj = kv.second; + auto& support_set = m_bed_support_filament_types[rule_key]; + auto& warning_set = m_bed_warning_filament_types[rule_key]; + auto& forbid_set = m_nozzle_forbidden_filament_presets[rule_key]; + + for (const auto& child : rule_obj) { + if (child.first == "support") { + for (const auto& item : child.second) + support_set.insert(item.second.get_value()); + } else if (child.first == "warning") { + for (const auto& item : child.second) + warning_set.insert(item.second.get_value()); + } else if (child.first == "forbidden") { + for (const auto& item : child.second) + forbid_set.insert(item.second.get_value()); + } + } + } + m_loaded = true; + BOOST_LOG_TRIVIAL(info) << "Loaded filament/hotbed/nozzle rules from " << file_path; + } catch (const std::exception& e) { + BOOST_LOG_TRIVIAL(error) << "Failed to parse filament_hot_bed_nozzles.json: " << e.what(); + } +} + +bool FilamentHotBedNozzleRules::is_loaded() const +{ + std::scoped_lock lock(m_mutex); + return m_loaded; +} +bool FilamentHotBedNozzleRules::is_bed_filament_tips(const std::string& bed_key, const std::string& filament_type) const +{ + std::scoped_lock lock(m_mutex); + auto it = m_bed_warning_filament_types.find(bed_key); + if (it == m_bed_warning_filament_types.end()) + return false; + + bool res = match_any_rule_token_ci(it->second, filament_type); + + return res; +} + + +bool FilamentHotBedNozzleRules::is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const +{ + std::scoped_lock lock(m_mutex); + auto it = m_bed_support_filament_types.find(bed_key); + if (it == m_bed_support_filament_types.end()) + return true; + if (it->second.empty()) + return true; + if (match_any_rule_token_ci(it->second, filament_type)) + return true; + // Warning-tier materials are still "supported" (separate API reports warning). + auto itw = m_bed_warning_filament_types.find(bed_key); + bool res = false; + res = itw != m_bed_warning_filament_types.end() && match_any_rule_token_ci(itw->second, filament_type); + return res; +} + +bool FilamentHotBedNozzleRules::is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const +{ + std::scoped_lock lock(m_mutex); + auto it = m_bed_warning_filament_types.find(bed_key); + bool res = false; + res = (it != m_bed_warning_filament_types.end() && match_any_rule_token_ci(it->second, filament_type)); + return res; +} + +bool FilamentHotBedNozzleRules::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const +{ + std::scoped_lock lock(m_mutex); + auto it = m_nozzle_forbidden_filament_presets.find(nozzle_key); + bool res = false; + res = (it != m_nozzle_forbidden_filament_presets.end() && it->second.find(filament_preset_name) != it->second.end()); + return res; +} + +std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const +{ + std::scoped_lock lock(m_mutex); + if (!m_loaded || used_filament_indices.empty()) + return ""; + + std::string nozzle_key; + if (!cfg.nozzle_diameter.empty()) + nozzle_key = nozzle_diameter_to_filament_rule_key(cfg.nozzle_diameter.get_at(0)); + if (nozzle_key.empty()) + return ""; + + const ConfigOptionStrings* filament_settings_id = cfg.option("filament_settings_id"); + for (unsigned int fid : used_filament_indices) { + std::string preset_name; + if (filament_settings_id != nullptr && !filament_settings_id->values.empty()) + preset_name = filament_settings_id->get_at(fid); + if (is_nozzle_filament_forbidden(nozzle_key, preset_name)) + return preset_name.empty() ? "forbidden filament preset for current nozzle" : preset_name; + } + + return ""; +} + +bool FilamentHotBedNozzleRules::evaluate_graphic_effect_bed_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const +{ + std::scoped_lock lock(m_mutex); + if (!m_loaded || used_filament_indices.empty()) + return false; + if (static_cast(cfg.curr_bed_type) != btGESP) + return false; + if (cfg.filament_type.empty()) + return false; + + const std::string bed_key = kBedKey_GESP; + for (unsigned int fid : used_filament_indices) { + const std::string ftype = cfg.filament_type.get_at(fid); + if (ftype.empty()) + continue; + if (!is_bed_filament_supported(bed_key, ftype)) + return true; + if (is_bed_filament_warning(bed_key, ftype)) + return true; + } + return false; +} +bool FilamentHotBedNozzleRules::evaluate_pei_bed_filament_mismatch_not_pla(const PrintConfig& cfg, + const std::vector& used_filament_indices) const +{ + std::scoped_lock lock(m_mutex); + if (!m_loaded || used_filament_indices.empty()) + return false; + if (static_cast(cfg.curr_bed_type) != btPEI) + return false; + if (cfg.filament_type.empty()) + return false; + + const std::string bed_key = kBedKey_PEI; + bool res = false;//default not pla and need to show tips + for (unsigned int fid : used_filament_indices) { + const std::string ftype = cfg.filament_type.get_at(fid); + if (ftype.empty()) + continue; + // not_pla means every non-PLA type should be checked, including TPU. + bool checkRes = is_pla_type(ftype); + if (!checkRes) + { + res = !checkRes; + break; + } + } + return res; +} + +bool FilamentHotBedNozzleRules::evaluate_pei_bed_filament_mismatch_tpu(const PrintConfig& cfg, + const std::vector& used_filament_indices) const +{ + std::scoped_lock lock(m_mutex); + if (!m_loaded || used_filament_indices.empty()) + return false; + if (static_cast(cfg.curr_bed_type) != btPEI) + return false; + if (cfg.filament_type.empty()) + return false; + + const std::string bed_key = kBedKey_PEI; + for (unsigned int fid : used_filament_indices) { + const std::string ftype = cfg.filament_type.get_at(fid); + if (ftype.empty()) + continue; + + if (!is_tpu_type(ftype)) + continue; + // TPU on PEI: dedicated warning channel. + if (is_bed_filament_tips(bed_key, ftype)) + return true; + } + return false; +} + +} // namespace Slic3r diff --git a/src/libslic3r/FilamentHotBedNozzleRules.hpp b/src/libslic3r/FilamentHotBedNozzleRules.hpp new file mode 100644 index 00000000000..02121a34ae6 --- /dev/null +++ b/src/libslic3r/FilamentHotBedNozzleRules.hpp @@ -0,0 +1,62 @@ +#ifndef slic3r_FilamentHotBedNozzleRules_hpp_ +#define slic3r_FilamentHotBedNozzleRules_hpp_ + +#include +#include +#include +#include +#include + +#include "PrintConfig.hpp" + +namespace Slic3r { + +// JSON: resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json +// Keys: bed ids (btPEI, btGESP), nozzle ids ("0.2mm"), each with support/warning/forbidden arrays. +class FilamentHotBedNozzleRules +{ +public: + static constexpr const char* kBedKey_PEI = "btPEI"; + static constexpr const char* kBedKey_GESP = "btGESP"; + + static FilamentHotBedNozzleRules& singleton(); + + void load(); + // Loads JSON once if not already loaded (Print::extruders uses this; GUI::load forces reload via load()). + void ensure_loaded(); + bool is_loaded() const; + + // "Supported" includes warning-tier materials (they are allowed but need a separate warning UI). + bool is_bed_filament_tips(const std::string& bed_key, const std::string& filament_type) const; + bool is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const; + bool is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const; + bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const; + + // ① 喷嘴规格 vs 耗材:仅 JSON 中喷嘴直径键(如 "0.2mm")的 "forbidden" 预设名;与当前热床类型无关。 + std::string evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const; + + // ② 特效热床(Graphic Effect / btGESP):仅当 curr_bed_type==btGESP 时校验;使用 JSON 键 "btGESP" 的 support/warning。 + bool evaluate_graphic_effect_bed_filament_mismatch(const PrintConfig& cfg, + const std::vector& used_filament_indices) const; + + // ③ 光面 PEI 热床(btPEI):仅当 curr_bed_type==btPEI 时校验;使用 JSON 键 "btPEI"。 + // 非 PLA 材料由 support 列表约束;TPU 等由 warning 列表单独提示(warning 仍算“可用但需提示”)。 + bool evaluate_pei_bed_filament_mismatch_not_pla(const PrintConfig& cfg, const std::vector& used_filament_indices) const; + bool evaluate_pei_bed_filament_mismatch_tpu(const PrintConfig& cfg, const std::vector& used_filament_indices) const; + +private: + FilamentHotBedNozzleRules() = default; + + mutable std::recursive_mutex m_mutex; + bool m_loaded{ false }; + std::unordered_map> m_bed_support_filament_types; + std::unordered_map> m_bed_warning_filament_types; + std::unordered_map> m_nozzle_forbidden_filament_presets; +}; + +std::string bed_type_to_filament_rule_key(BedType bed_type); +std::string nozzle_diameter_to_filament_rule_key(double nozzle_diameter_mm); + +} // namespace Slic3r + +#endif From 803347cf36b606b63a95dbb408a237652456a5e8 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 1 Apr 2026 14:09:18 +0800 Subject: [PATCH 24/46] feature revert the profiles change. --- resources/profiles/Snapmaker.json | 1932 +++++++++++++---- .../filament/Generic PETG HF @base.json | 3 - .../Snapmaker/filament/PolyLite PLA @U1.json | 3 - .../Snapmaker/filament/PolyTerra PLA @U1.json | 3 - .../Polymaker General PLA Family @U1.json | 6 - .../filament/Polymaker PLA @U1 base.json | 2 +- .../Polymaker Silk PLA Family @U1.json | 6 - .../Polymaker Tough PLA Family @U1.json | 6 - .../Snapmaker/filament/Snapmaker ABS @U1.json | 3 - .../filament/Snapmaker ABS Benchy @U1.json | 3 - .../Snapmaker/filament/Snapmaker ASA @U1.json | 3 - ...apmaker Breakaway Support For PLA @U1.json | 3 - .../filament/Snapmaker PA-CF @U1.json | 3 - .../Snapmaker/filament/Snapmaker PET @U1.json | 3 - .../filament/Snapmaker PETG @U1.json | 3 - .../filament/Snapmaker PETG-CF @U1.json | 3 - .../Snapmaker/filament/Snapmaker PLA @U1.json | 3 - .../filament/Snapmaker PLA Eco @U1.json | 3 - .../filament/Snapmaker PLA Metal @U1.json | 3 - .../filament/Snapmaker PLA Silk @U1.json | 3 - .../filament/Snapmaker PLA-CF @U1.json | 3 - .../Snapmaker/filament/Snapmaker PVA @U1.json | 3 - .../Snapmaker/filament/Snapmaker TPE @U1.json | 3 - .../Snapmaker/filament/Snapmaker TPU @U1.json | 3 - .../filament/Snapmaker TPU High-Flow @U1.json | 3 - .../machine/Snapmaker U1 (0.4 nozzle).json | 5 +- .../Snapmaker/machine/Snapmaker U1.json | 4 +- .../profiles/Snapmaker/machine/fdm_U1.json | 3 +- 28 files changed, 1476 insertions(+), 548 deletions(-) diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index 6c055724c08..c7fb29915c1 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,6 +1,6 @@ { "name": "Snapmaker", - "version": "02.02.44.02", + "version": "02.02.45.02", "force_update": "0", "description": "Snapmaker configurations", "machine_model_list": [ @@ -163,8 +163,8 @@ "sub_path": "process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json" }, { - "name": "0.20 Strength @Snapmaker U1 (0.4 nozzle)", - "sub_path": "process/0.20 Strength @Snapmaker U1 (0.4 nozzle).json" + "name": "0.20 strength @Snapmaker U1 (0.4 nozzle)", + "sub_path": "process/0.20 strength @Snapmaker U1 (0.4 nozzle).json" }, { "name": "0.24 Draft @Snapmaker U1 (0.4 nozzle)", @@ -449,888 +449,1876 @@ { "name": "0.48 Draft @Snapmaker Artisan (0.8 nozzle)", "sub_path": "process/0.48 Draft @Snapmaker Artisan (0.8 nozzle).json" - } - ], - "filament_list": [ + }, + + + + + + + + + + + + + { - "name": "fdm_filament_common_generic", - "sub_path": "filament/fdm_filament_common_generic.json" + "name": "fdm_process_U1_0.06_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.06_nozzle_0.2.json" }, { - "name": "fdm_filament_pla_generic", - "sub_path": "filament/fdm_filament_pla_generic.json" + "name": "fdm_process_U1_0.08_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.08_nozzle_0.2.json" }, { - "name": "fdm_filament_pctg_generic", - "sub_path": "filament/fdm_filament_pctg_generic.json" + "name": "fdm_process_U1_0.10_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.10_nozzle_0.2.json" }, { - "name": "fdm_filament_bvoh_generic", - "sub_path":"filament/fdm_filament_bvoh_generic.json" + "name": "fdm_process_U1_0.12_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.12_nozzle_0.2.json" }, { - "name": "fdm_filament_abs_generic", - "sub_path": "filament/fdm_filament_abs_generic.json" + "name": "fdm_process_U1_0.14_nozzle_0.2", + "sub_path": "process/fdm_process_U1_0.14_nozzle_0.2.json" }, { - "name": "fdm_filament_asa_generic", - "sub_path": "filament/fdm_filament_asa_generic.json" + "name": "fdm_process_U1_0.18_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.18_nozzle_0.6.json" }, { - "name": "fdm_filament_pa_generic", - "sub_path": "filament/fdm_filament_pa_generic.json" + "name": "fdm_process_U1_0.24_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.24_nozzle_0.6.json" }, { - "name": "fdm_filament_pc_generic", - "sub_path": "filament/fdm_filament_pc_generic.json" + "name": "fdm_process_U1_0.30_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.30_nozzle_0.6.json" }, { - "name": "Generic ABS @base", - "sub_path": "filament/Generic ABS @base.json" + "name": "fdm_process_U1_0.36_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.36_nozzle_0.6.json" }, { - "name": "Generic ABS", - "sub_path": "filament/Generic ABS.json" + "name": "fdm_process_U1_0.42_nozzle_0.6", + "sub_path": "process/fdm_process_U1_0.42_nozzle_0.6.json" }, { - "name": "Generic ASA @base", - "sub_path": "filament/Generic ASA @base.json" + "name": "fdm_process_U1_0.32_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.32_nozzle_0.8.json" }, { - "name": "Generic ASA", - "sub_path": "filament/Generic ASA.json" + "name": "fdm_process_U1_0.40_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.40_nozzle_0.8.json" }, { - "name": "Generic PA", - "sub_path": "filament/Generic PA.json" + "name": "fdm_process_U1_0.48_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.48_nozzle_0.8.json" }, { - "name": "Generic PA-CF", - "sub_path": "filament/Generic PA-CF.json" + "name": "fdm_process_U1_0.24_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.24_nozzle_0.8.json" }, { - "name": "Generic PC @base", - "sub_path": "filament/Generic PC @base.json" + "name": "fdm_process_U1_0.56_nozzle_0.8", + "sub_path": "process/fdm_process_U1_0.56_nozzle_0.8.json" }, + { - "name": "Generic PC", - "sub_path": "filament/Generic PC.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": "Generic Support For PLA @base", - "sub_path": "filament/Generic Support For PLA @base.json" + "name": "0.06 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "Generic Support For PLA", - "sub_path": "filament/Generic Support For PLA.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": "fdm_filament_pva_generic", - "sub_path": "filament/fdm_filament_pva_generic.json" + "name": "0.08 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "Generic PVA @base", - "sub_path": "filament/Generic PVA @base.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": "Generic PVA", - "sub_path": "filament/Generic PVA.json" + "name": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "fdm_filament_pet_generic", - "sub_path": "filament/fdm_filament_pet_generic.json" + "name": "0.12 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json" }, { - "name": "Generic PETG @base", - "sub_path": "filament/Generic PETG @base.json" + "name": "0.14 Standard @Snapmaker U1 (0.2 nozzle)", + "sub_path": "process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json" }, + { - "name": "Generic PETG", - "sub_path": "filament/Generic PETG.json" + "name": "0.18 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "fdm_filament_tpu_generic", - "sub_path": "filament/fdm_filament_tpu_generic.json" + "name": "0.24 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic TPU", - "sub_path": "filament/Generic TPU.json" + "name": "0.30 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic PCTG @base", - "sub_path": "filament/Generic PCTG @base.json" + "name": "0.30 Strength @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic PCTG", - "sub_path": "filament/Generic PCTG.json" + "name": "0.36 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json" }, { - "name": "Generic PETG HF @base", - "sub_path": "filament/Generic PETG HF @base.json" + "name": "0.42 Standard @Snapmaker U1 (0.6 nozzle)", + "sub_path": "process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json" }, + + { - "name": "Generic PETG HF", - "sub_path": "filament/Generic PETG HF.json" + "name": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json" }, { - "name": "Generic PETG-CF @base", - "sub_path": "filament/Generic PETG-CF @base.json" + "name": "0.48 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json" }, + { - "name": "Generic PETG-CF", - "sub_path": "filament/Generic PETG-CF.json" + "name": "0.32 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json" }, + { - "name": "Generic PETG-GF @base", - "sub_path": "filament/Generic PETG-GF @base.json" + "name": "0.24 Standard @Snapmaker U1 (0.8 nozzle)", + "sub_path": "process/0.24 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": [ { - "name": "Generic PETG-GF", - "sub_path": "filament/Generic PETG-GF.json" + "name": "fdm_filament_common_generic", + "sub_path": "filament/fdm_filament_common_generic.json" }, { - "name": "Generic PLA High Speed @base", - "sub_path": "filament/Generic PLA High Speed @base.json" + "name": "fdm_filament_pla_generic", + "sub_path": "filament/fdm_filament_pla_generic.json" }, { - "name": "Generic PLA High Speed", - "sub_path": "filament/Generic PLA High Speed.json" + "name": "fdm_filament_abs_generic", + "sub_path": "filament/fdm_filament_abs_generic.json" }, { - "name": "Generic PLA Silk @base", - "sub_path": "filament/Generic PLA Silk @base.json" + "name": "fdm_filament_asa_generic", + "sub_path": "filament/fdm_filament_asa_generic.json" }, { - "name": "Generic PLA Silk", - "sub_path": "filament/Generic PLA Silk.json" + "name": "fdm_filament_pctg_generic", + "sub_path": "filament/fdm_filament_pctg_generic.json" }, { - "name": "Generic PLA @base", - "sub_path": "filament/Generic PLA @base.json" + "name": "fdm_filament_bvoh_generic", + "sub_path":"filament/fdm_filament_bvoh_generic.json" }, { - "name": "Generic PLA", - "sub_path": "filament/Generic PLA.json" + "name": "fdm_filament_pc_generic", + "sub_path": "filament/fdm_filament_pc_generic.json" }, { - "name": "Generic PLA-CF @base", - "sub_path": "filament/Generic PLA-CF @base.json" + "name": "fdm_filament_pa_generic", + "sub_path": "filament/fdm_filament_pa_generic.json" }, { - "name": "Generic PLA-CF", - "sub_path": "filament/Generic PLA-CF.json" + "name": "fdm_filament_pet_generic", + "sub_path": "filament/fdm_filament_pet_generic.json" }, { - "name": "Generic BVOH @base", - "sub_path": "filament/Generic BVOH @base.json" + "name": "fdm_filament_pva_generic", + "sub_path": "filament/fdm_filament_pva_generic.json" }, { - "name": "Generic BVOH", - "sub_path": "filament/Generic BVOH.json" + "name": "fdm_filament_tpu_generic", + "sub_path": "filament/fdm_filament_tpu_generic.json" }, { - "name": "Generic TPU 95A HF @base", - "sub_path": "filament/Generic TPU 95A HF @base.json" + "name": "Generic Support For PLA @base", + "sub_path": "filament/Generic Support For PLA @base.json" }, { - "name": "Generic TPU 95A HF", - "sub_path": "filament/Generic TPU 95A HF.json" + "name": "Generic Support For PLA test @U1 0.2 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PETG HF @base", - "sub_path": "filament/Snapmaker PETG HF @base.json" + "name": "Generic Support For PLA @U1 0.4 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG HF", - "sub_path": "filament/Snapmaker PETG HF.json" + "name": "Generic Support For PLA test @U1 0.6 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.6 nozzle.json" }, - - - - - - - - - - - - - - - - - - - - - - - - - { - "name": "fdm_filament_common", - "sub_path": "filament/fdm_filament_common.json" + "name": "Generic Support For PLA test @U1 0.8 nozzle", + "sub_path": "filament/Generic Support For PLA @U1 0.8 nozzle.json" }, { - "name": "fdm_filament_abs", - "sub_path": "filament/fdm_filament_abs.json" + "name": "Generic PVA @base", + "sub_path": "filament/Generic PVA @base.json" }, { - "name": "fdm_filament_asa", - "sub_path": "filament/fdm_filament_asa.json" + "name": "Generic PVA test @U1 0.2 nozzle", + "sub_path": "filament/Generic PVA @U1 0.2 nozzle.json" }, { - "name": "fdm_filament_pa", - "sub_path": "filament/fdm_filament_pa.json" + "name": "Generic PVA @U1 0.4 nozzle", + "sub_path": "filament/Generic PVA @U1 0.4 nozzle.json" }, { - "name": "fdm_filament_petg", - "sub_path": "filament/fdm_filament_petg.json" + "name": "Generic PVA test @U1 0.6 nozzle", + "sub_path": "filament/Generic PVA @U1 0.6 nozzle.json" }, { - "name": "fdm_filament_pet", - "sub_path": "filament/fdm_filament_pet.json" + "name": "Generic PVA test @U1 0.8 nozzle", + "sub_path": "filament/Generic PVA @U1 0.8 nozzle.json" }, { - "name": "fdm_filament_pla", - "sub_path": "filament/fdm_filament_pla.json" + "name": "Generic PETG @base", + "sub_path": "filament/Generic PETG @base.json" }, { - "name": "fdm_filament_pla_eco", - "sub_path": "filament/fdm_filament_pla_eco.json" + "name": "Generic PETG test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG @U1 0.2 nozzle.json" }, { - "name": "fdm_filament_pva", - "sub_path": "filament/fdm_filament_pva.json" + "name": "Generic PETG @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG @U1 0.4 nozzle.json" }, { - "name": "fdm_filament_tpu", - "sub_path": "filament/fdm_filament_tpu.json" + "name": "Generic PETG test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ABS @base", - "sub_path": "filament/Snapmaker ABS @base.json" + "name": "Generic PETG test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS", - "sub_path": "filament/Snapmaker ABS.json" + "name": "Generic TPU test @U1 0.2 nozzle", + "sub_path": "filament/Generic TPU @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ABS @0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @0.2 nozzle.json" + "name": "Generic TPU @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ASA @base", - "sub_path": "filament/Snapmaker ASA @base.json" + "name": "Generic TPU test @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ASA", - "sub_path": "filament/Snapmaker ASA.json" + "name": "Generic TPU test @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ASA @0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @0.2 nozzle.json" + "name": "Generic PCTG @base", + "sub_path": "filament/Generic PCTG @base.json" }, { - "name": "Snapmaker PA-CF @base", - "sub_path": "filament/Snapmaker PA-CF @base.json" + "name": "Generic PCTG test @U1 0.2 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PA-CF", - "sub_path": "filament/Snapmaker PA-CF.json" + "name": "Generic PCTG @U1 0.4 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG @base", - "sub_path": "filament/Snapmaker PETG @base.json" + "name": "Generic PCTG test @U1 0.6 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG", - "sub_path": "filament/Snapmaker PETG.json" + "name": "Generic PCTG test @U1 0.8 nozzle", + "sub_path": "filament/Generic PCTG @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG @0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @0.2 nozzle.json" + "name": "Generic PETG HF @base", + "sub_path": "filament/Generic PETG HF @base.json" }, { - "name": "Snapmaker PET @base", - "sub_path": "filament/Snapmaker PET @base.json" + "name": "Generic PETG HF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PET", - "sub_path": "filament/Snapmaker PET.json" + "name": "Generic PETG HF @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG-CF @base", - "sub_path": "filament/Snapmaker PETG-CF @base.json" + "name": "Generic PETG HF test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG-CF", - "sub_path": "filament/Snapmaker PETG-CF.json" + "name": "Generic PETG HF test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG HF @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Eco @base", - "sub_path": "filament/Snapmaker PLA Eco @base.json" + "name": "Generic PETG-CF @base", + "sub_path": "filament/Generic PETG-CF @base.json" }, { - "name": "Snapmaker PLA Eco", - "sub_path": "filament/Snapmaker PLA Eco.json" + "name": "Generic PETG-CF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA @base", - "sub_path": "filament/Snapmaker PLA @base.json" + "name": "Generic PETG-CF @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA", - "sub_path": "filament/Snapmaker PLA.json" + "name": "Generic PETG-CF test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA-CF @base", - "sub_path": "filament/Snapmaker PLA-CF @base.json" + "name": "Generic PETG-CF test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG-CF @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA-CF", - "sub_path": "filament/Snapmaker PLA-CF.json" + "name": "Generic PETG-GF @base", + "sub_path": "filament/Generic PETG-GF @base.json" }, { - "name": "Snapmaker PLA Silk @base", - "sub_path": "filament/Snapmaker PLA Silk @base.json" + "name": "Generic PETG-GF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Silk", - "sub_path": "filament/Snapmaker PLA Silk.json" + "name": "Generic PETG-GF @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Silk @0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @0.2 nozzle.json" + "name": "Generic PETG-GF test @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.6 nozzle.json" }, { - "name": "PolyLite PLA @base", - "sub_path": "filament/PolyLite PLA @base.json" + "name": "Generic PETG-GF test @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG-GF @U1 0.8 nozzle.json" }, { - "name": "PolyLite PLA", - "sub_path": "filament/PolyLite PLA.json" + "name": "Generic PLA High Speed @base", + "sub_path": "filament/Generic PLA High Speed @base.json" }, { - "name": "PolyLite PLA @0.2 nozzle", - "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" + "name": "Generic PLA Silk @base", + "sub_path": "filament/Generic PLA Silk @base.json" }, { - "name": "PolyTerra PLA @base", - "sub_path": "filament/PolyTerra PLA @base.json" + "name": "Generic PLA @base", + "sub_path": "filament/Generic PLA @base.json" }, { - "name": "PolyTerra PLA", - "sub_path": "filament/PolyTerra PLA.json" + "name": "Generic PLA-CF @base", + "sub_path": "filament/Generic PLA-CF @base.json" }, { - "name": "PolyTerra PLA @0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" + "name": "Generic BVOH @base", + "sub_path": "filament/Generic BVOH @base.json" }, { - "name": "Snapmaker PVA @base", - "sub_path": "filament/Snapmaker PVA @base.json" + "name": "Generic BVOH test @U1 0.2 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PVA", - "sub_path": "filament/Snapmaker PVA.json" + "name": "Generic BVOH @U1 0.4 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PVA @0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @0.2 nozzle.json" + "name": "Generic BVOH test @U1 0.6 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.6 nozzle.json" }, { - "name": "Snapmaker TPU @base", - "sub_path": "filament/Snapmaker TPU @base.json" + "name": "Generic BVOH test @U1 0.8 nozzle", + "sub_path": "filament/Generic BVOH @U1 0.8 nozzle.json" }, { - "name": "Snapmaker TPU", - "sub_path": "filament/Snapmaker TPU.json" + "name": "Generic TPU 95A HF @base", + "sub_path": "filament/Generic TPU 95A HF @base.json" }, { - "name": "Snapmaker TPE", - "sub_path": "filament/Snapmaker TPE.json" + "name": "Generic TPU 95A HF test @U1 0.2 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ABS @J1 base", - "sub_path": "filament/Snapmaker ABS @J1 base.json" + "name": "Generic TPU 95A HF @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.4 nozzle.json" + }, + { + "name": "Generic TPU 95A HF test @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.6 nozzle.json" + }, + { + "name": "Generic TPU 95A HF test @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU 95A HF @U1 0.8 nozzle.json" + }, + { + "name": "Generic ABS @base", + "sub_path": "filament/Generic ABS @base.json" + }, + { + "name": "Generic ABS @U1 0.2 nozzle", + "sub_path": "filament/Generic ABS @U1 0.2 nozzle.json" + }, + { + "name": "Generic ABS @U1 0.4 nozzle", + "sub_path": "filament/Generic ABS @U1 0.4 nozzle.json" + }, + { + "name": "Generic ABS @U1 0.6 nozzle", + "sub_path": "filament/Generic ABS @U1 0.6 nozzle.json" + }, + { + "name": "Generic ABS @U1 0.8 nozzle", + "sub_path": "filament/Generic ABS @U1 0.8 nozzle.json" + }, + { + "name": "Generic ASA @base", + "sub_path": "filament/Generic ASA @base.json" + }, + { + "name": "Generic ASA @U1 0.2 nozzle", + "sub_path": "filament/Generic ASA @U1 0.2 nozzle.json" + }, + { + "name": "Generic ASA @U1 0.4 nozzle", + "sub_path": "filament/Generic ASA @U1 0.4 nozzle.json" + }, + { + "name": "Generic ASA @U1 0.6 nozzle", + "sub_path": "filament/Generic ASA @U1 0.6 nozzle.json" + }, + { + "name": "Generic ASA @U1 0.8 nozzle", + "sub_path": "filament/Generic ASA @U1 0.8 nozzle.json" + }, + { + "name": "Generic PA @U1 0.2 nozzle", + "sub_path": "filament/Generic PA @U1 0.2 nozzle.json" + }, + { + "name": "Generic PA @U1 0.4 nozzle", + "sub_path": "filament/Generic PA @U1 0.4 nozzle.json" + }, + { + "name": "Generic PA @U1 0.6 nozzle", + "sub_path": "filament/Generic PA @U1 0.6 nozzle.json" + }, + { + "name": "Generic PA @U1 0.8 nozzle", + "sub_path": "filament/Generic PA @U1 0.8 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.2 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.2 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.4 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.4 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.6 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.6 nozzle.json" + }, + { + "name": "Generic PA-CF @U1 0.8 nozzle", + "sub_path": "filament/Generic PA-CF @U1 0.8 nozzle.json" + }, + { + "name": "Generic PC @base", + "sub_path": "filament/Generic PC @base.json" + }, + { + "name": "Generic PC @U1 0.4 nozzle", + "sub_path": "filament/Generic PC @U1 0.4 nozzle.json" + }, + { + "name": "Generic PC @U1 0.6 nozzle", + "sub_path": "filament/Generic PC @U1 0.6 nozzle.json" + }, + { + "name": "Generic PC @U1 0.8 nozzle", + "sub_path": "filament/Generic PC @U1 0.8 nozzle.json" + }, + + + + + + + + + + { + "name": "fdm_filament_common", + "sub_path": "filament/fdm_filament_common.json" + }, + { + "name": "fdm_filament_abs", + "sub_path": "filament/fdm_filament_abs.json" + }, + { + "name": "fdm_filament_asa", + "sub_path": "filament/fdm_filament_asa.json" + }, + { + "name": "fdm_filament_pa", + "sub_path": "filament/fdm_filament_pa.json" + }, + { + "name": "fdm_filament_petg", + "sub_path": "filament/fdm_filament_petg.json" + }, + { + "name": "fdm_filament_pet", + "sub_path": "filament/fdm_filament_pet.json" + }, + { + "name": "fdm_filament_pla", + "sub_path": "filament/fdm_filament_pla.json" + }, + { + "name": "fdm_filament_pla_eco", + "sub_path": "filament/fdm_filament_pla_eco.json" + }, + { + "name": "fdm_filament_pva", + "sub_path": "filament/fdm_filament_pva.json" + }, + { + "name": "fdm_filament_tpu", + "sub_path": "filament/fdm_filament_tpu.json" + }, + { + "name": "Snapmaker ABS @base", + "sub_path": "filament/Snapmaker ABS @base.json" + }, + { + "name": "Snapmaker ABS", + "sub_path": "filament/Snapmaker ABS.json" + }, + { + "name": "Snapmaker ABS @0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @0.2 nozzle.json" + }, + { + "name": "Snapmaker ASA @base", + "sub_path": "filament/Snapmaker ASA @base.json" + }, + { + "name": "Snapmaker ASA", + "sub_path": "filament/Snapmaker ASA.json" + }, + { + "name": "Snapmaker ASA @0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @0.2 nozzle.json" + }, + { + "name": "Snapmaker PA-CF @base", + "sub_path": "filament/Snapmaker PA-CF @base.json" + }, + { + "name": "Snapmaker PA-CF", + "sub_path": "filament/Snapmaker PA-CF.json" + }, + { + "name": "Snapmaker PETG @base", + "sub_path": "filament/Snapmaker PETG @base.json" + }, + { + "name": "Snapmaker PETG", + "sub_path": "filament/Snapmaker PETG.json" + }, + { + "name": "Snapmaker PETG @0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @0.2 nozzle.json" + }, + { + "name": "Snapmaker PET @base", + "sub_path": "filament/Snapmaker PET @base.json" + }, + { + "name": "Snapmaker PET", + "sub_path": "filament/Snapmaker PET.json" + }, + { + "name": "Snapmaker PETG-CF @base", + "sub_path": "filament/Snapmaker PETG-CF @base.json" + }, + { + "name": "Snapmaker PETG-CF", + "sub_path": "filament/Snapmaker PETG-CF.json" + }, + { + "name": "Snapmaker PLA Eco @base", + "sub_path": "filament/Snapmaker PLA Eco @base.json" + }, + { + "name": "Snapmaker PLA Eco", + "sub_path": "filament/Snapmaker PLA Eco.json" + }, + { + "name": "Snapmaker PLA @base", + "sub_path": "filament/Snapmaker PLA @base.json" + }, + { + "name": "Snapmaker PLA", + "sub_path": "filament/Snapmaker PLA.json" + }, + { + "name": "Snapmaker PLA-CF @base", + "sub_path": "filament/Snapmaker PLA-CF @base.json" + }, + { + "name": "Snapmaker PLA-CF", + "sub_path": "filament/Snapmaker PLA-CF.json" + }, + { + "name": "Snapmaker PLA Silk @base", + "sub_path": "filament/Snapmaker PLA Silk @base.json" + }, + { + "name": "Snapmaker PLA Silk", + "sub_path": "filament/Snapmaker PLA Silk.json" + }, + { + "name": "Snapmaker PLA Silk @0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @base", + "sub_path": "filament/PolyLite PLA @base.json" + }, + { + "name": "PolyLite PLA", + "sub_path": "filament/PolyLite PLA.json" + }, + { + "name": "PolyLite PLA @0.2 nozzle", + "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" + }, + { + "name": "PolyTerra PLA @base", + "sub_path": "filament/PolyTerra PLA @base.json" + }, + { + "name": "PolyTerra PLA", + "sub_path": "filament/PolyTerra PLA.json" + }, + { + "name": "PolyTerra PLA @0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" + }, + { + "name": "Snapmaker PVA @base", + "sub_path": "filament/Snapmaker PVA @base.json" + }, + { + "name": "Snapmaker PVA", + "sub_path": "filament/Snapmaker PVA.json" + }, + { + "name": "Snapmaker PVA @0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @0.2 nozzle.json" + }, + { + "name": "Snapmaker TPU @base", + "sub_path": "filament/Snapmaker TPU @base.json" + }, + { + "name": "Snapmaker TPU", + "sub_path": "filament/Snapmaker TPU.json" + }, + { + "name": "Snapmaker TPE", + "sub_path": "filament/Snapmaker TPE.json" + }, + { + "name": "Snapmaker ABS @J1 base", + "sub_path": "filament/Snapmaker ABS @J1 base.json" + }, + { + "name": "Snapmaker ABS @J1", + "sub_path": "filament/Snapmaker ABS @J1.json" + }, + { + "name": "Snapmaker ABS @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker ABS @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker ABS @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker ABS Benchy @J1", + "sub_path": "filament/Snapmaker ABS Benchy @J1.json" + }, + { + "name": "Snapmaker ASA @J1 base", + "sub_path": "filament/Snapmaker ASA @J1 base.json" + }, + { + "name": "Snapmaker ASA @J1", + "sub_path": "filament/Snapmaker ASA @J1.json" + }, + { + "name": "Snapmaker ASA @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PA-CF @J1 base", + "sub_path": "filament/Snapmaker PA-CF @J1 base.json" + }, + { + "name": "Snapmaker PA-CF @J1", + "sub_path": "filament/Snapmaker PA-CF @J1.json" + }, + { + "name": "Snapmaker PETG @J1 base", + "sub_path": "filament/Snapmaker PETG @J1 base.json" + }, + { + "name": "Snapmaker PETG @J1", + "sub_path": "filament/Snapmaker PETG @J1.json" + }, + { + "name": "Snapmaker PETG @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PET @J1 base", + "sub_path": "filament/Snapmaker PET @J1 base.json" + }, + { + "name": "Snapmaker PET @J1", + "sub_path": "filament/Snapmaker PET @J1.json" + }, + { + "name": "Snapmaker PETG-CF @J1 base", + "sub_path": "filament/Snapmaker PETG-CF @J1 base.json" + }, + { + "name": "Snapmaker PETG-CF @J1", + "sub_path": "filament/Snapmaker PETG-CF @J1.json" + }, + { + "name": "Snapmaker PLA Eco @J1 base", + "sub_path": "filament/Snapmaker PLA Eco @J1 base.json" + }, + { + "name": "Snapmaker PLA Eco @J1", + "sub_path": "filament/Snapmaker PLA Eco @J1.json" + }, + { + "name": "Snapmaker PLA Eco @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Eco @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA @J1 base", + "sub_path": "filament/Snapmaker PLA @J1 base.json" + }, + { + "name": "Snapmaker PLA @J1", + "sub_path": "filament/Snapmaker PLA @J1.json" + }, + { + "name": "Snapmaker PLA Matte @base", + "sub_path": "filament/Snapmaker PLA Matte @base.json" + }, + { + "name": "Snapmaker PLA Matte @J1", + "sub_path": "filament/Snapmaker PLA Matte @J1.json" + }, + { + "name": "Snapmaker PLA Metal @J1 base", + "sub_path": "filament/Snapmaker PLA Metal @J1 base.json" + }, + { + "name": "Snapmaker PLA Metal @J1", + "sub_path": "filament/Snapmaker PLA Metal @J1.json" + }, + { + "name": "Snapmaker PLA Metal @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Metal @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA-CF @J1 base", + "sub_path": "filament/Snapmaker PLA-CF @J1 base.json" + }, + { + "name": "Snapmaker PLA-CF @J1", + "sub_path": "filament/Snapmaker PLA-CF @J1.json" + }, + { + "name": "Snapmaker PLA-CF @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @J1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Silk @J1 base", + "sub_path": "filament/Snapmaker PLA Silk @J1 base.json" + }, + { + "name": "Snapmaker PLA Silk @J1", + "sub_path": "filament/Snapmaker PLA Silk @J1.json" + }, + { + "name": "Snapmaker PLA Silk @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @J1 0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @J1", + "sub_path": "filament/PolyLite PLA @J1.json" + }, + { + "name": "PolyLite PLA @J1 0.2 nozzle", + "sub_path": "filament/PolyLite PLA @J1 0.2 nozzle.json" + }, + { + "name": "PolyTerra PLA @J1", + "sub_path": "filament/PolyTerra PLA @J1.json" + }, + { + "name": "PolyTerra PLA @J1 0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PVA @J1 base", + "sub_path": "filament/Snapmaker PVA @J1 base.json" + }, + { + "name": "Snapmaker PVA @J1", + "sub_path": "filament/Snapmaker PVA @J1.json" + }, + { + "name": "Snapmaker PVA @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @J1 0.2 nozzle.json" + }, + { + "name": "Snapmaker TPU @J1 base", + "sub_path": "filament/Snapmaker TPU @J1 base.json" + }, + { + "name": "Snapmaker TPU @J1", + "sub_path": "filament/Snapmaker TPU @J1.json" + }, + { + "name": "Snapmaker TPU High-Flow @J1", + "sub_path": "filament/Snapmaker TPU High-Flow @J1.json" + }, + { + "name": "Snapmaker TPE @J1", + "sub_path": "filament/Snapmaker TPE @J1.json" + }, + { + "name": "Snapmaker ABS @Dual base", + "sub_path": "filament/Snapmaker ABS @Dual base.json" + }, + { + "name": "Snapmaker ABS @Dual", + "sub_path": "filament/Snapmaker ABS @Dual.json" + }, + { + "name": "Snapmaker ABS @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker ABS @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker ABS @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker ABS Benchy @Dual", + "sub_path": "filament/Snapmaker ABS Benchy @Dual.json" + }, + { + "name": "Snapmaker ASA @Dual base", + "sub_path": "filament/Snapmaker ASA @Dual base.json" + }, + { + "name": "Snapmaker ASA @Dual", + "sub_path": "filament/Snapmaker ASA @Dual.json" + }, + { + "name": "Snapmaker ASA @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PA-CF @Dual base", + "sub_path": "filament/Snapmaker PA-CF @Dual base.json" + }, + { + "name": "Snapmaker PA-CF @Dual", + "sub_path": "filament/Snapmaker PA-CF @Dual.json" + }, + { + "name": "Snapmaker PETG @Dual base", + "sub_path": "filament/Snapmaker PETG @Dual base.json" + }, + { + "name": "Snapmaker PETG @Dual", + "sub_path": "filament/Snapmaker PETG @Dual.json" + }, + { + "name": "Snapmaker PETG @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PET @Dual base", + "sub_path": "filament/Snapmaker PET @Dual base.json" + }, + { + "name": "Snapmaker PET @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PET @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PET @Dual", + "sub_path": "filament/Snapmaker PET @Dual.json" + }, + { + "name": "Snapmaker PETG-CF @Dual base", + "sub_path": "filament/Snapmaker PETG-CF @Dual base.json" + }, + { + "name": "Snapmaker PETG-CF @Dual", + "sub_path": "filament/Snapmaker PETG-CF @Dual.json" + }, + { + "name": "Snapmaker PLA Eco @Dual base", + "sub_path": "filament/Snapmaker PLA Eco @Dual base.json" + }, + { + "name": "Snapmaker PLA Eco @Dual", + "sub_path": "filament/Snapmaker PLA Eco @Dual.json" + }, + { + "name": "Snapmaker PLA Eco @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Eco @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA @Dual base", + "sub_path": "filament/Snapmaker PLA @Dual base.json" + }, + { + "name": "Snapmaker PLA @Dual", + "sub_path": "filament/Snapmaker PLA @Dual.json" + }, + { + "name": "Snapmaker PLA Matte @Dual", + "sub_path": "filament/Snapmaker PLA Matte @Dual.json" + }, + { + "name": "Snapmaker PLA Metal @Dual base", + "sub_path": "filament/Snapmaker PLA Metal @Dual base.json" + }, + { + "name": "Snapmaker PLA Metal @Dual", + "sub_path": "filament/Snapmaker PLA Metal @Dual.json" + }, + { + "name": "Snapmaker PLA Metal @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Metal @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA-CF @Dual base", + "sub_path": "filament/Snapmaker PLA-CF @Dual base.json" + }, + { + "name": "Snapmaker PLA-CF @Dual", + "sub_path": "filament/Snapmaker PLA-CF @Dual.json" + }, + { + "name": "Snapmaker PLA-CF @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @Dual 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Silk @Dual base", + "sub_path": "filament/Snapmaker PLA Silk @Dual base.json" + }, + { + "name": "Snapmaker PLA Silk @Dual", + "sub_path": "filament/Snapmaker PLA Silk @Dual.json" + }, + { + "name": "Snapmaker PLA Silk @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @Dual 0.2 nozzle.json" + }, + { + "name": "PolyLite PLA @Dual", + "sub_path": "filament/PolyLite PLA @Dual.json" + }, + { + "name": "PolyLite PLA @Dual 0.2 nozzle", + "sub_path": "filament/PolyLite PLA @Dual 0.2 nozzle.json" + }, + { + "name": "PolyTerra PLA @Dual", + "sub_path": "filament/PolyTerra PLA @Dual.json" + }, + { + "name": "PolyTerra PLA @Dual 0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker PVA @Dual base", + "sub_path": "filament/Snapmaker PVA @Dual base.json" + }, + { + "name": "Snapmaker PVA @Dual", + "sub_path": "filament/Snapmaker PVA @Dual.json" + }, + { + "name": "Snapmaker PVA @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @Dual 0.2 nozzle.json" + }, + { + "name": "Snapmaker TPU @Dual base", + "sub_path": "filament/Snapmaker TPU @Dual base.json" + }, + { + "name": "Snapmaker TPU @Dual", + "sub_path": "filament/Snapmaker TPU @Dual.json" + }, + { + "name": "Snapmaker TPU High-Flow @Dual", + "sub_path": "filament/Snapmaker TPU High-Flow @Dual.json" + }, + { + "name": "Snapmaker TPE @Dual", + "sub_path": "filament/Snapmaker TPE @Dual.json" + }, + { + "name": "Snapmaker Breakaway Support @base", + "sub_path": "filament/Snapmaker Breakaway Support @base.json" + }, + { + "name": "Snapmaker Breakaway Support", + "sub_path": "filament/Snapmaker Breakaway Support.json" + }, + { + "name": "Snapmaker Breakaway Support @J1", + "sub_path": "filament/Snapmaker Breakaway Support @J1.json" + }, + + + + + + + { + "name": "Snapmaker PLA @U1 base", + "sub_path": "filament/Snapmaker PLA @U1 base.json" + }, + { + "name": "Snapmaker PLA Eco @U1 base", + "sub_path": "filament/Snapmaker PLA Eco @U1 base.json" + }, + { + "name": "Snapmaker PLA Matte", + "sub_path": "filament/Snapmaker PLA Matte.json" + }, + { + "name": "Snapmaker PLA Matte @U1 base", + "sub_path": "filament/Snapmaker PLA Matte @U1 base.json" + }, + { + "name": "Snapmaker PLA Matte test @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte test @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Matte test @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Matte @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic @U1 base", + "sub_path": "filament/Snapmaker PLA Basic @U1 base.json" + }, + { + "name": "Snapmaker PLA Basic test @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic test @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA Basic test @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Basic @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @base.json" + }, + { + "name": "Snapmaker PLA SnapSpeed", + "sub_path": "filament/Snapmaker PLA SnapSpeed.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @J1", + "sub_path": "filament/Snapmaker PLA SnapSpeed @J1.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @Dual", + "sub_path": "filament/Snapmaker PLA SnapSpeed @Dual.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PLA SnapSpeed @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json" + }, + { + "name": "Snapmaker PLA Metal @U1 base", + "sub_path": "filament/Snapmaker PLA Metal @U1 base.json" + }, + { + "name": "Snapmaker PLA Silk @U1 base", + "sub_path": "filament/Snapmaker PLA Silk @U1 base.json" + }, + { + "name": "Snapmaker PLA-CF @U1 base", + "sub_path": "filament/Snapmaker PLA-CF @U1 base.json" + }, + { + "name": "Snapmaker PVA @U1 base", + "sub_path": "filament/Snapmaker PVA @U1 base.json" + }, + { + "name": "Snapmaker TPU @U1 base", + "sub_path": "filament/Snapmaker TPU @U1 base.json" + }, + { + "name": "Snapmaker TPU 95A @U1 base", + "sub_path":"filament/Snapmaker TPU 95A @U1 base.json" + }, + { + "name": "Snapmaker PETG HF @base", + "sub_path": "filament/Snapmaker PETG HF @base.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.2 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.4 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.4 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.6 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.6 nozzle.json" + }, + { + "name": "Snapmaker PETG HF @U1 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG HF @U1 0.8 nozzle.json" + }, + + + + + + + + + + + + + + + { + "name": "fdm_filament_common_bambu", + "sub_path": "filament/fdm_filament_common_bambu.json" + }, + + + + + { + "name": "fdm_filament_abs_bambu", + "sub_path": "filament/fdm_filament_abs_bambu.json" + }, + { + "name": "fdm_filament_asa_bambu", + "sub_path": "filament/fdm_filament_asa_bambu.json" + }, + { + "name": "fdm_filament_bvoh_bambu", + "sub_path": "filament/fdm_filament_bvoh_bambu.json" + }, + { + "name": "fdm_filament_eva_bambu", + "sub_path": "filament/fdm_filament_eva_bambu.json" + }, + { + "name": "fdm_filament_hips_bambu", + "sub_path": "filament/fdm_filament_hips_bambu.json" + }, + { + "name": "fdm_filament_pa_bambu", + "sub_path": "filament/fdm_filament_pa_bambu.json" + }, + { + "name": "fdm_filament_pc_bambu", + "sub_path": "filament/fdm_filament_pc_bambu.json" + }, + { + "name": "fdm_filament_pctg_bambu", + "sub_path": "filament/fdm_filament_pctg_bambu.json" + }, + { + "name": "fdm_filament_pe_bambu", + "sub_path": "filament/fdm_filament_pe_bambu.json" + }, + { + "name": "fdm_filament_pet_bambu", + "sub_path": "filament/fdm_filament_pet_bambu.json" + }, + { + "name": "fdm_filament_pha_bambu", + "sub_path": "filament/fdm_filament_pha_bambu.json" + }, + { + "name": "fdm_filament_pla_bambu", + "sub_path": "filament/fdm_filament_pla_bambu.json" + }, + { + "name": "fdm_filament_pp_bambu", + "sub_path": "filament/fdm_filament_pp_bambu.json" + }, + { + "name": "fdm_filament_ppa_bambu", + "sub_path": "filament/fdm_filament_ppa_bambu.json" + }, + { + "name": "fdm_filament_pva_bambu", + "sub_path": "filament/fdm_filament_pva_bambu.json" + }, + { + "name": "fdm_filament_tpu_bambu", + "sub_path": "filament/fdm_filament_tpu_bambu.json" + }, + + + + + + + + + { + "name": "Generic ABS bambu @base", + "sub_path": "filament/Generic ABS bambu @base.json" + }, + { + "name": "Generic ABS bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.2 nozzle.json" + }, + { + "name": "Generic ABS bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic ABS bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.6 nozzle.json" + }, + { + "name": "Generic ABS bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic ABS bambu @U1 0.8 nozzle.json" + }, + + { + "name": "Generic ASA bambu @base", + "sub_path": "filament/Generic ASA bambu @base.json" + }, + { + "name": "Generic ASA bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.2 nozzle.json" + }, + { + "name": "Generic ASA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic ASA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.6 nozzle.json" + }, + { + "name": "Generic ASA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic ASA bambu @U1 0.8 nozzle.json" + }, + { + "name": "Generic BVOH bambu @base", + "sub_path": "filament/Generic BVOH bambu @base.json" + }, + { + "name": "Generic BVOH bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic BVOH bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic BVOH bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic BVOH bambu @U1 0.6 nozzle.json" + }, + { + "name": "Generic BVOH bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic BVOH bambu @U1 0.8 nozzle.json" + }, + { + "name": "Generic EVA bambu @base", + "sub_path": "filament/Generic EVA bambu @base.json" + }, + { + "name": "Generic EVA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic EVA bambu @U1 0.4 nozzle.json" + }, + { + "name": "Generic EVA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic EVA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ABS @J1", - "sub_path": "filament/Snapmaker ABS @J1.json" + "name": "Generic EVA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic EVA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @J1 0.2 nozzle.json" + "name": "Generic HIPS bambu @base", + "sub_path": "filament/Generic HIPS bambu @base.json" }, { - "name": "Snapmaker ABS @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker ABS @J1 0.8 nozzle.json" + "name": "Generic HIPS bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ABS Benchy @J1", - "sub_path": "filament/Snapmaker ABS Benchy @J1.json" + "name": "Generic HIPS bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ASA @J1 base", - "sub_path": "filament/Snapmaker ASA @J1 base.json" + "name": "Generic HIPS bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ASA @J1", - "sub_path": "filament/Snapmaker ASA @J1.json" + "name": "Generic HIPS bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic HIPS bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ASA @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @J1 0.2 nozzle.json" + "name": "Generic PA bambu @base", + "sub_path": "filament/Generic PA bambu @base.json" }, { - "name": "Snapmaker PA-CF @J1 base", - "sub_path": "filament/Snapmaker PA-CF @J1 base.json" + "name": "Generic PA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PA-CF @J1", - "sub_path": "filament/Snapmaker PA-CF @J1.json" + "name": "Generic PA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG @J1 base", - "sub_path": "filament/Snapmaker PETG @J1 base.json" + "name": "Generic PA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG @J1", - "sub_path": "filament/Snapmaker PETG @J1.json" + "name": "Generic PA-CF bambu @base", + "sub_path": "filament/Generic PA-CF bambu @base.json" }, { - "name": "Snapmaker PETG @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @J1 0.2 nozzle.json" + "name": "Generic PA-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PA-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PETG @J1 0.8 nozzle.json" + "name": "Generic PA-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PA-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PET @J1 base", - "sub_path": "filament/Snapmaker PET @J1 base.json" + "name": "Generic PA-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PA-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PET @J1", - "sub_path": "filament/Snapmaker PET @J1.json" + "name": "Generic PC bambu @base", + "sub_path": "filament/Generic PC bambu @base.json" }, + { - "name": "Snapmaker PETG-CF @J1 base", - "sub_path": "filament/Snapmaker PETG-CF @J1 base.json" + "name": "Generic PC bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG-CF @J1", - "sub_path": "filament/Snapmaker PETG-CF @J1.json" + "name": "Generic PC bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Eco @J1 base", - "sub_path": "filament/Snapmaker PLA Eco @J1 base.json" + "name": "Generic PC bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Eco @J1", - "sub_path": "filament/Snapmaker PLA Eco @J1.json" + "name": "Generic PC bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PC bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Eco @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @J1 0.2 nozzle.json" + "name": "Generic PCTG bambu @base", + "sub_path": "filament/Generic PCTG bambu @base.json" }, { - "name": "Snapmaker PLA Eco @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @J1 0.8 nozzle.json" + "name": "Generic PCTG bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PCTG bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA @J1 base", - "sub_path": "filament/Snapmaker PLA @J1 base.json" + "name": "Generic PCTG bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PCTG bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA @J1", - "sub_path": "filament/Snapmaker PLA @J1.json" + "name": "Generic PCTG bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PCTG bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Matte @base", - "sub_path": "filament/Snapmaker PLA Matte @base.json" + "name": "Generic PE bambu @base", + "sub_path": "filament/Generic PE bambu @base.json" }, { - "name": "Snapmaker PLA Matte @J1", - "sub_path": "filament/Snapmaker PLA Matte @J1.json" + "name": "Generic PE bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PE bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Metal @J1 base", - "sub_path": "filament/Snapmaker PLA Metal @J1 base.json" + "name": "Generic PE bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PE bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Metal @J1", - "sub_path": "filament/Snapmaker PLA Metal @J1.json" + "name": "Generic PE bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PE bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Metal @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Metal @J1 0.2 nozzle.json" + "name": "Generic PE-CF bambu @base", + "sub_path": "filament/Generic PE-CF bambu @base.json" }, { - "name": "Snapmaker PLA-CF @J1 base", - "sub_path": "filament/Snapmaker PLA-CF @J1 base.json" + "name": "Generic PE-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PE-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA-CF @J1", - "sub_path": "filament/Snapmaker PLA-CF @J1.json" + "name": "Generic PE-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PE-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA-CF @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA-CF @J1 0.8 nozzle.json" + "name": "Generic PE-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PE-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Silk @J1 base", - "sub_path": "filament/Snapmaker PLA Silk @J1 base.json" + "name": "Generic PETG bambu @base", + "sub_path": "filament/Generic PETG bambu @base.json" }, { - "name": "Snapmaker PLA Silk @J1", - "sub_path": "filament/Snapmaker PLA Silk @J1.json" + "name": "Generic PETG bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Silk @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @J1 0.2 nozzle.json" + "name": "Generic PETG bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.4 nozzle.json" }, { - "name": "PolyLite PLA @J1", - "sub_path": "filament/PolyLite PLA @J1.json" + "name": "Generic PETG bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.6 nozzle.json" }, { - "name": "PolyLite PLA @J1 0.2 nozzle", - "sub_path": "filament/PolyLite PLA @J1 0.2 nozzle.json" + "name": "Generic PETG bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG bambu @U1 0.8 nozzle.json" }, { - "name": "PolyTerra PLA @J1", - "sub_path": "filament/PolyTerra PLA @J1.json" + "name": "Generic PETG HF bambu @base", + "sub_path": "filament/Generic PETG HF bambu @base.json" }, { - "name": "PolyTerra PLA @J1 0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @J1 0.2 nozzle.json" + "name": "Generic PETG HF bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PVA @J1 base", - "sub_path": "filament/Snapmaker PVA @J1 base.json" + "name": "Generic PETG HF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PVA @J1", - "sub_path": "filament/Snapmaker PVA @J1.json" + "name": "Generic PETG HF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PVA @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @J1 0.2 nozzle.json" + "name": "Generic PETG HF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG HF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker TPU @J1 base", - "sub_path": "filament/Snapmaker TPU @J1 base.json" + "name": "Generic PETG-CF bambu @base", + "sub_path": "filament/Generic PETG-CF bambu @base.json" }, { - "name": "Snapmaker TPU @J1", - "sub_path": "filament/Snapmaker TPU @J1.json" + "name": "Generic PETG-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PETG-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker TPU High-Flow @J1", - "sub_path": "filament/Snapmaker TPU High-Flow @J1.json" + "name": "Generic PETG-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PETG-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker TPE @J1", - "sub_path": "filament/Snapmaker TPE @J1.json" + "name": "Generic PETG-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PETG-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS @Dual base", - "sub_path": "filament/Snapmaker ABS @Dual base.json" + "name": "Generic PHA bambu @base", + "sub_path": "filament/Generic PHA bambu @base.json" }, { - "name": "Snapmaker ABS @Dual", - "sub_path": "filament/Snapmaker ABS @Dual.json" + "name": "Generic PHA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PHA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ABS @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @Dual 0.2 nozzle.json" + "name": "Generic PHA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PHA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker ABS @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker ABS @Dual 0.8 nozzle.json" + "name": "Generic PHA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PHA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker ABS Benchy @Dual", - "sub_path": "filament/Snapmaker ABS Benchy @Dual.json" + "name": "Generic PLA bambu @base", + "sub_path": "filament/Generic PLA bambu @base.json" }, { - "name": "Snapmaker ASA @Dual base", - "sub_path": "filament/Snapmaker ASA @Dual base.json" + "name": "Generic PLA bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker ASA @Dual", - "sub_path": "filament/Snapmaker ASA @Dual.json" + "name": "Generic PLA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker ASA @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @Dual 0.2 nozzle.json" + "name": "Generic PLA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PA-CF @Dual base", - "sub_path": "filament/Snapmaker PA-CF @Dual base.json" + "name": "Generic PLA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PA-CF @Dual", - "sub_path": "filament/Snapmaker PA-CF @Dual.json" + "name": "Generic PLA High Speed bambu @base", + "sub_path": "filament/Generic PLA High Speed bambu @base.json" }, { - "name": "Snapmaker PETG @Dual base", - "sub_path": "filament/Snapmaker PETG @Dual base.json" + "name": "Generic PLA High Speed bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PETG @Dual", - "sub_path": "filament/Snapmaker PETG @Dual.json" + "name": "Generic PLA High Speed bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PETG @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @Dual 0.2 nozzle.json" + "name": "Generic PLA High Speed bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PETG @Dual 0.8 nozzle.json" + "name": "Generic PLA High Speed bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA High Speed bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PET @Dual base", - "sub_path": "filament/Snapmaker PET @Dual base.json" + "name": "Generic PLA Silk bambu @base", + "sub_path": "filament/Generic PLA Silk bambu @base.json" }, { - "name": "Snapmaker PET @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PET @Dual 0.8 nozzle.json" + "name": "Generic PLA Silk bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA Silk bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PET @Dual", - "sub_path": "filament/Snapmaker PET @Dual.json" + "name": "Generic PLA Silk bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA Silk bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PETG-CF @Dual base", - "sub_path": "filament/Snapmaker PETG-CF @Dual base.json" + "name": "Generic PLA Silk bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA Silk bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PETG-CF @Dual", - "sub_path": "filament/Snapmaker PETG-CF @Dual.json" + "name": "Generic PLA-CF bambu @base", + "sub_path": "filament/Generic PLA-CF bambu @base.json" }, { - "name": "Snapmaker PLA Eco @Dual base", - "sub_path": "filament/Snapmaker PLA Eco @Dual base.json" + "name": "Generic PLA-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Eco @Dual", - "sub_path": "filament/Snapmaker PLA Eco @Dual.json" + "name": "Generic PLA-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Eco @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @Dual 0.2 nozzle.json" + "name": "Generic PLA-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Eco @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @Dual 0.8 nozzle.json" + "name": "Generic PP bambu @base", + "sub_path": "filament/Generic PP bambu @base.json" }, { - "name": "Snapmaker PLA @Dual base", - "sub_path": "filament/Snapmaker PLA @Dual base.json" + "name": "Generic PP bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PP bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA @Dual", - "sub_path": "filament/Snapmaker PLA @Dual.json" + "name": "Generic PP bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PP bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Matte @Dual", - "sub_path": "filament/Snapmaker PLA Matte @Dual.json" + "name": "Generic PP bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PP bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Metal @Dual base", - "sub_path": "filament/Snapmaker PLA Metal @Dual base.json" + "name": "Generic PP-CF bambu @base", + "sub_path": "filament/Generic PP-CF bambu @base.json" }, { - "name": "Snapmaker PLA Metal @Dual", - "sub_path": "filament/Snapmaker PLA Metal @Dual.json" + "name": "Generic PP-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PP-CF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Metal @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Metal @Dual 0.2 nozzle.json" + "name": "Generic PP-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PP-CF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA-CF @Dual base", - "sub_path": "filament/Snapmaker PLA-CF @Dual base.json" + "name": "Generic PP-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PP-CF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA-CF @Dual", - "sub_path": "filament/Snapmaker PLA-CF @Dual.json" + "name": "Generic PP-GF bambu @base", + "sub_path": "filament/Generic PP-GF bambu @base.json" }, { - "name": "Snapmaker PLA-CF @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA-CF @Dual 0.8 nozzle.json" + "name": "Generic PP-GF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PP-GF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Silk @Dual base", - "sub_path": "filament/Snapmaker PLA Silk @Dual base.json" + "name": "Generic PP-GF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PP-GF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Silk @Dual", - "sub_path": "filament/Snapmaker PLA Silk @Dual.json" + "name": "Generic PP-GF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PP-GF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Silk @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @Dual 0.2 nozzle.json" + "name": "Generic PPA-CF bambu @base", + "sub_path": "filament/Generic PPA-CF bambu @base.json" }, { - "name": "PolyLite PLA @Dual", - "sub_path": "filament/PolyLite PLA @Dual.json" + "name": "Generic PPA-CF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PPA-CF bambu @U1 0.4 nozzle.json" }, { - "name": "PolyLite PLA @Dual 0.2 nozzle", - "sub_path": "filament/PolyLite PLA @Dual 0.2 nozzle.json" + "name": "Generic PPA-CF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PPA-CF bambu @U1 0.6 nozzle.json" }, { - "name": "PolyTerra PLA @Dual", - "sub_path": "filament/PolyTerra PLA @Dual.json" + "name": "Generic PPA-CF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PPA-CF bambu @U1 0.8 nozzle.json" }, { - "name": "PolyTerra PLA @Dual 0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @Dual 0.2 nozzle.json" + "name": "Generic PPA-GF bambu @base", + "sub_path": "filament/Generic PPA-GF bambu @base.json" }, { - "name": "Snapmaker PVA @Dual base", - "sub_path": "filament/Snapmaker PVA @Dual base.json" + "name": "Generic PPA-GF bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PPA-GF bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PVA @Dual", - "sub_path": "filament/Snapmaker PVA @Dual.json" + "name": "Generic PPA-GF bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PPA-GF bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PVA @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @Dual 0.2 nozzle.json" + "name": "Generic PPA-GF bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PPA-GF bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker TPU @Dual base", - "sub_path": "filament/Snapmaker TPU @Dual base.json" + "name": "Generic PVA bambu @base", + "sub_path": "filament/Generic PVA bambu @base.json" }, { - "name": "Snapmaker TPU @Dual", - "sub_path": "filament/Snapmaker TPU @Dual.json" + "name": "Generic PVA bambu @U1 0.2 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.2 nozzle.json" }, { - "name": "Snapmaker TPU High-Flow @Dual", - "sub_path": "filament/Snapmaker TPU High-Flow @Dual.json" + "name": "Generic PVA bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker TPE @Dual", - "sub_path": "filament/Snapmaker TPE @Dual.json" + "name": "Generic PVA bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker Breakaway Support @base", - "sub_path": "filament/Snapmaker Breakaway Support @base.json" + "name": "Generic PVA bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic PVA bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker Breakaway Support", - "sub_path": "filament/Snapmaker Breakaway Support.json" + "name": "Generic TPU bambu @base", + "sub_path": "filament/Generic TPU bambu @base.json" }, { - "name": "Snapmaker Breakaway Support @J1", - "sub_path": "filament/Snapmaker Breakaway Support @J1.json" + "name": "Generic TPU bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU bambu @U1 0.4 nozzle.json" }, - - - - - - { - "name": "Snapmaker PLA @U1 base", - "sub_path": "filament/Snapmaker PLA @U1 base.json" + "name": "Generic TPU bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Eco @U1 base", - "sub_path": "filament/Snapmaker PLA Eco @U1 base.json" + "name": "Generic TPU bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU bambu @U1 0.8 nozzle.json" }, { - "name": "Snapmaker PLA Matte", - "sub_path": "filament/Snapmaker PLA Matte.json" + "name": "Generic TPU for AMS bambu @base", + "sub_path": "filament/Generic TPU for AMS bambu @base.json" }, { - "name": "Snapmaker PLA Matte @U1 base", - "sub_path": "filament/Snapmaker PLA Matte @U1 base.json" + "name": "Generic TPU for AMS bambu @U1 0.4 nozzle", + "sub_path": "filament/Generic TPU for AMS bambu @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Matte @U1", - "sub_path": "filament/Snapmaker PLA Matte @U1.json" + "name": "Generic TPU for AMS bambu @U1 0.6 nozzle", + "sub_path": "filament/Generic TPU for AMS bambu @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA Basic @U1 base", - "sub_path": "filament/Snapmaker PLA Basic @U1 base.json" + "name": "Generic TPU for AMS bambu @U1 0.8 nozzle", + "sub_path": "filament/Generic TPU for AMS bambu @U1 0.8 nozzle.json" }, + + + + + { - "name": "Snapmaker PLA Basic @U1", - "sub_path": "filament/Snapmaker PLA Basic @U1.json" + "name": "Generic PLA @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @base.json" + "name": "Generic PLA @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed", - "sub_path": "filament/Snapmaker PLA SnapSpeed.json" + "name": "Generic PLA @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA @U1 0.6 nozzle.json" + }, + { + "name": "Generic PLA @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA @U1 0.8 nozzle.json" }, + + { - "name": "Snapmaker PLA SnapSpeed @J1", - "sub_path": "filament/Snapmaker PLA SnapSpeed @J1.json" + "name": "Generic PLA High Speed test @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @Dual", - "sub_path": "filament/Snapmaker PLA SnapSpeed @Dual.json" + "name": "Generic PLA High Speed @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @U1 base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + "name": "Generic PLA High Speed @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.6 nozzle.json" }, { - "name": "Snapmaker PLA SnapSpeed @U1 base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" + "name": "Generic PLA High Speed @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA High Speed @U1 0.8 nozzle.json" }, + { - "name": "Snapmaker PLA SnapSpeed @U1", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1.json" + "name": "Generic PLA-CF test @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PLA Metal @U1 base", - "sub_path": "filament/Snapmaker PLA Metal @U1 base.json" + "name": "Generic PLA-CF @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.4 nozzle.json" }, { - "name": "Snapmaker PLA Silk @U1 base", - "sub_path": "filament/Snapmaker PLA Silk @U1 base.json" + "name": "Generic PLA-CF @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.6 nozzle.json" }, { - "name": "Snapmaker TPU 95A HF @U1", - "sub_path": "filament/Snapmaker TPU 95A HF @U1.json" + "name": "Generic PLA-CF @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA-CF @U1 0.8 nozzle.json" }, + { - "name": "Snapmaker PLA-CF @U1 base", - "sub_path": "filament/Snapmaker PLA-CF @U1 base.json" + "name": "Generic PLA Silk @U1 0.2 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.2 nozzle.json" }, { - "name": "Snapmaker PVA @U1 base", - "sub_path": "filament/Snapmaker PVA @U1 base.json" + "name": "Generic PLA Silk @U1 0.4 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.4 nozzle.json" }, { - "name": "Snapmaker TPU @U1 base", - "sub_path": "filament/Snapmaker TPU @U1 base.json" + "name": "Generic PLA Silk @U1 0.6 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.6 nozzle.json" }, - { - "name": "Snapmaker TPU 95A @U1 base", - "sub_path":"filament/Snapmaker TPU 95A @U1 base.json" + { + "name": "Generic PLA Silk @U1 0.8 nozzle", + "sub_path": "filament/Generic PLA Silk @U1 0.8 nozzle.json" }, - + + + { - "name": "fdm_filament_common_poly", - "sub_path": "filament/fdm_filament_common_poly.json" + "name": "fdm_filament_common_poly_test", + "sub_path": "filament/fdm_filament_common_poly_test.json" }, { - "name": "fdm_filament_pla_poly", - "sub_path": "filament/fdm_filament_pla_poly.json" + "name": "fdm_filament_pla_poly_test", + "sub_path": "filament/fdm_filament_pla_poly_test.json" }, { "name": "Polymaker PLA @U1 base", @@ -1348,6 +2336,12 @@ "name": "Polymaker Tough PLA Family @U1", "sub_path": "filament/Polymaker Tough PLA Family @U1.json" } + + + + + + ], "machine_list": [ { @@ -1718,10 +2712,22 @@ "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.4 nozzle)", "sub_path": "machine/Snapmaker U1 (0.4 nozzle).json" }, + { + "name": "Snapmaker U1 (0.6 nozzle)", + "sub_path": "machine/Snapmaker U1 (0.6 nozzle).json" + }, + { + "name": "Snapmaker U1 (0.8 nozzle)", + "sub_path": "machine/Snapmaker U1 (0.8 nozzle).json" + }, { "name": "Snapmaker Artisan (0.2 nozzle)", "sub_path": "machine/Snapmaker Artisan (0.2 nozzle).json" diff --git a/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json b/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json index 51fed0524c1..2caa3f3063c 100644 --- a/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json +++ b/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json @@ -11,9 +11,6 @@ "cool_plate_temp_initial_layer": [ "0" ], - "filament_type": [ - "PETG" - ], "eng_plate_temp": [ "70" ], diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json index 34e7d04d3d4..ad81f2d79d2 100644 --- a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json @@ -7,8 +7,5 @@ "inherits": "PolyLite PLA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json index 10ae30494b8..f77d1d80825 100644 --- a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json @@ -7,8 +7,5 @@ "inherits": "PolyTerra PLA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json index 2f40e7170ea..6cceb35a52c 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json @@ -25,11 +25,5 @@ ], "temperature_vitrification": [ "62" - ], - "textured_plate_temp": [ - "65" - ], - "textured_plate_temp_initial_layer": [ - "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json index 94008ddd0c3..bb30b05f055 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json @@ -1,7 +1,7 @@ { "type": "filament", "name": "Polymaker PLA @U1 base", - "inherits": "fdm_filament_pla_poly", + "inherits": "fdm_filament_pla_poly_test", "from": "system", "setting_id": "OGFSA04", "instantiation": "false", diff --git a/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json index 8eb48fdc722..65f20d02714 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json @@ -25,11 +25,5 @@ ], "nozzle_temperature_range_high": [ "230" - ], - "textured_plate_temp": [ - "65" - ], - "textured_plate_temp_initial_layer": [ - "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json index 8039e284167..c3de9b60035 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json @@ -25,11 +25,5 @@ ], "temperature_vitrification": [ "55" - ], - "textured_plate_temp": [ - "65" - ], - "textured_plate_temp_initial_layer": [ - "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json index e5aa9bd44a6..8e6cf258492 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker ABS @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json index fdec66fc05d..0e791164d75 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json @@ -11,9 +11,6 @@ "compatible_prints": [ "0.25 Benchy @Snapmaker U1 (0.4 nozzle)" ], - "enable_pressure_advance": [ - "0" - ], "overhang_fan_speed": [ "35" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json index 0472b593ba4..d1f75890545 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker ASA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json index 32c20b1f21a..163bb5c6281 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json @@ -10,8 +10,5 @@ ], "filament_type": [ "PLA" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json index 6fefdfc885d..80ef97e3084 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json @@ -9,8 +9,5 @@ "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json index 2309eb767fb..79da9ec77e9 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PET @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json index 14f636d0887..a45967876d0 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PETG @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json index 9ca5d526199..19ca1db4991 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PETG-CF @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json index cc7c3a37fda..d92a90178e8 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json @@ -8,9 +8,6 @@ "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" ], - "enable_pressure_advance": [ - "0" - ], "hot_plate_temp":[ "55" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json index c27ad00a44c..03c51c7ff62 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA Eco @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json index dfd5dcf1ffc..fec713c9be4 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA Metal @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json index 7d0e0e2eda3..d67a1f3badb 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA Silk @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json index 8d278db626b..7a870c11cf0 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PLA-CF @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json index a544fb2998a..e4622e6bfd3 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json @@ -7,8 +7,5 @@ "inherits": "Snapmaker PVA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json index 5d0025cde33..841a3583ebb 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json @@ -17,9 +17,6 @@ "overhang_fan_speed": [ "65" ], - "enable_pressure_advance": [ - "0" - ], "filament_flow_ratio": [ "1.1" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json index 4fbf9bf11c2..1d00d0800d9 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json @@ -9,8 +9,5 @@ "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.6 nozzle)", "Snapmaker U1 (0.8 nozzle)" - ], - "enable_pressure_advance": [ - "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json index 0b93618885a..bbfd209a0a3 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json @@ -10,9 +10,6 @@ "Snapmaker U1 (0.6 nozzle)", "Snapmaker U1 (0.8 nozzle)" ], - "enable_pressure_advance": [ - "0" - ], "filament_flow_ratio": [ "0.983" ], diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json index 070399c9cec..9c6b1ea6ce7 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json @@ -193,12 +193,13 @@ "0", "0" ], - "ramming_pressure_advance_value": "0.02", "default_print_profile": "0.20 Standard @Snapmaker U1 (0.4 nozzle)", + "ramming_pressure_advance_value": "0.02", "tool_change_temprature_wait": "0", "printer_notes": "", "machine_pause_gcode": "M600", "default_bed_type": "Textured PEI Plate", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", - "nozzle_volume": "143" + "nozzle_volume": "143", + "support_multi_bed_types": "1" } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1.json b/resources/profiles/Snapmaker/machine/Snapmaker U1.json index 601a6ab4ffc..a17bc1246e0 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1.json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1.json @@ -4,10 +4,10 @@ "family": "Snapmaker", "name": "Snapmaker U1", "url": "https://github.com/macdylan", - "model_id": "SM_U1", + "model_id": "797581801", "bed_model": "Snapmaker U1_bed.stl", "bed_texture": "Snapmaker U1_texture.svg", - "nozzle_diameter": "0.4" + "nozzle_diameter": "0.2;0.4;0.6;0.8" } diff --git a/resources/profiles/Snapmaker/machine/fdm_U1.json b/resources/profiles/Snapmaker/machine/fdm_U1.json index f2a119b4a4e..9ed8c453133 100644 --- a/resources/profiles/Snapmaker/machine/fdm_U1.json +++ b/resources/profiles/Snapmaker/machine/fdm_U1.json @@ -183,6 +183,5 @@ "machine_start_gcode": "PRINT_START TOOL_TEMP={first_layer_temperature[initial_tool]} {if is_extruder_used[0]}T0_TEMP={first_layer_temperature[0]}{endif} {if is_extruder_used[1]}T1_TEMP={first_layer_temperature[1]}{endif} {if is_extruder_used[2]}T2_TEMP={first_layer_temperature[2]}{endif} {if is_extruder_used[3]}T3_TEMP={first_layer_temperature[3]}{endif} {if is_extruder_used[4]}T4_TEMP={first_layer_temperature[4]}{endif} {if is_extruder_used[5]}T5_TEMP={first_layer_temperature[5]}{endif} BED_TEMP=[first_layer_bed_temperature] TOOL=[initial_tool]\n\nM83\n; set extruder temp\n{if first_layer_temperature[0] > 0 and (is_extruder_used[0])}M104 T0 S{first_layer_temperature[0]}{endif}\n{if first_layer_temperature[1] > 0 and (is_extruder_used[1])}M104 T1 S{first_layer_temperature[1]}{endif}\n{if first_layer_temperature[2] > 0 and (is_extruder_used[2])}M104 T2 S{first_layer_temperature[2]}{endif}\n{if first_layer_temperature[3] > 0 and (is_extruder_used[3])}M104 T3 S{first_layer_temperature[3]}{endif}\n{if first_layer_temperature[4] > 0 and (is_extruder_used[4])}M104 T4 S{first_layer_temperature[4]}{endif}\n{if (is_extruder_used[0]) and initial_tool != 0}\n;\n; purge first tool\n;\nG1 F{travel_speed * 60}\nM109 T0 S{first_layer_temperature[0]}\nT0; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(0 == 0 ? 0 : (0 == 1 ? 120 : (0 == 2 ? 180 : 300)))} Y{(0 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[0]}10{else}30{endif} X40 Z0.2 F{if filament_multitool_ramming[0]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X40 E9 F800 ; continue purging and wipe the nozzle\nG0 X{40 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{40 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[0]} F2400 ; retract\n{e_retracted[0] = 1.5 * retract_length[0]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[0] == 0 ? (first_layer_temperature[0] + standby_temperature_delta) : (idle_temperature[0]))} T0\n{endif}\n{if (is_extruder_used[1]) and initial_tool != 1}\n;\n; purge second tool\n;\nG1 F{travel_speed * 60}\nM109 T1 S{first_layer_temperature[1]}\nT1; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(1 == 0 ? 0 : (1 == 1 ? 120 : (1 == 2 ? 180 : 300)))} Y{(1 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[1]}10{else}30{endif} X120 Z0.2 F{if filament_multitool_ramming[1]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X80 E9 F800 ; continue purging and wipe the nozzle\nG0 X{80 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{80 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[1]} F2400 ; retract\n{e_retracted[1] = 1.5 * retract_length[1]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[1] == 0 ? (first_layer_temperature[1] + standby_temperature_delta) : (idle_temperature[1]))} T1\n{endif}\n{if (is_extruder_used[2]) and initial_tool != 2}\n;\n; purge third tool\n;\nG1 F{travel_speed * 60}\nM109 T2 S{first_layer_temperature[2]}\nT2; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(2 == 0 ? 0 : (2 == 1 ? 120 : (2 == 2 ? 180 : 300)))} Y{(2 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[2]}10{else}30{endif} X220 Z0.2 F{if filament_multitool_ramming[2]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X220 E9 F800 ; continue purging and wipe the nozzle\nG0 X{220 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{220 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[2]} F2400 ; retract\n{e_retracted[2] = 1.5 * retract_length[2]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[2] == 0 ? (first_layer_temperature[2] + standby_temperature_delta) : (idle_temperature[2]))} T2\n{endif}\n{if (is_extruder_used[3]) and initial_tool != 3}\n;\n; purge fourth tool\n;\nG1 F{travel_speed * 60}\nM109 T3 S{first_layer_temperature[3]}\nT3; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(3 == 0 ? 0 : (3 == 1 ? 120 : (3 == 2 ? 180 : 300)))} Y{(3 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[3]}10{else}30{endif} X290 Z0.2 F{if filament_multitool_ramming[3]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X260 E9 F800 ; continue purging and wipe the nozzle\nG0 X{260 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{260 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[3]} F2400 ; retract\n{e_retracted[3] = 1.5 * retract_length[3]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[3] == 0 ? (first_layer_temperature[3] + standby_temperature_delta) : (idle_temperature[3]))} T3\n{endif}\n{if (is_extruder_used[4]) and initial_tool != 4}\n;\n; purge fifth tool\n;\nG1 F{travel_speed * 60}\nM109 T4 S{first_layer_temperature[4]}\nT4; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(4 == 0 ? 0 : (4 == 1 ? 120 : (4 == 2 ? 180 : 300)))} Y{(4 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[4]}10{else}30{endif} X290 Z0.2 F{if filament_multitool_ramming[4]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X260 E9 F800 ; continue purging and wipe the nozzle\nG0 X{260 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{260 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[4]} F2400 ; retract\n{e_retracted[4] = 1.5 * retract_length[4]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[4] == 0 ? (first_layer_temperature[4] + standby_temperature_delta) : (idle_temperature[4]))} T4\n{endif}\n;\n; purge initial tool\n;\nG1 F{travel_speed * 60}\nM109 T{initial_tool} S{first_layer_temperature[initial_tool]}\nT{initial_tool}; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300)))} Y{(initial_tool < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[initial_tool]}10{else}30{endif} X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 10)} Z0.2 F{if filament_multitool_ramming[initial_tool]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40)} E9 F800 ; continue purging and wipe the nozzle\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 3)} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 3 * 2)} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[initial_tool]} F2400 ; retract\n{e_retracted[initial_tool] = 1.5 * retract_length[initial_tool]}\nG92 E0 ; reset extruder position\n", "scan_first_layer": "0", "nozzle_type": "undefine", - "auxiliary_fan": "0", - "default_bed_type": "Textured PEI Plate" + "auxiliary_fan": "0" } \ No newline at end of file From ae0d9fb03ad4b2cc8438b729b766ac6b2db9b9d8 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 1 Apr 2026 14:47:42 +0800 Subject: [PATCH 25/46] fix revert to old profiles --- resources/profiles/Snapmaker.json | 1930 ++++------------- .../filament/Generic PETG HF @base.json | 3 + .../Snapmaker/filament/PolyLite PLA @U1.json | 3 + .../Snapmaker/filament/PolyTerra PLA @U1.json | 3 + .../Polymaker General PLA Family @U1.json | 6 + .../filament/Polymaker PLA @U1 base.json | 2 +- .../Polymaker Silk PLA Family @U1.json | 6 + .../Polymaker Tough PLA Family @U1.json | 6 + .../Snapmaker/filament/Snapmaker ABS @U1.json | 3 + .../filament/Snapmaker ABS Benchy @U1.json | 3 + .../Snapmaker/filament/Snapmaker ASA @U1.json | 3 + ...apmaker Breakaway Support For PLA @U1.json | 3 + .../filament/Snapmaker PA-CF @U1.json | 3 + .../Snapmaker/filament/Snapmaker PET @U1.json | 3 + .../filament/Snapmaker PETG @U1.json | 3 + .../filament/Snapmaker PETG-CF @U1.json | 3 + .../Snapmaker/filament/Snapmaker PLA @U1.json | 3 + .../filament/Snapmaker PLA Eco @U1.json | 3 + .../filament/Snapmaker PLA Metal @U1.json | 3 + .../filament/Snapmaker PLA Silk @U1.json | 3 + .../filament/Snapmaker PLA-CF @U1.json | 3 + .../Snapmaker/filament/Snapmaker PVA @U1.json | 3 + .../Snapmaker/filament/Snapmaker TPE @U1.json | 3 + .../Snapmaker/filament/Snapmaker TPU @U1.json | 3 + .../filament/Snapmaker TPU High-Flow @U1.json | 3 + .../machine/Snapmaker U1 (0.4 nozzle).json | 5 +- .../Snapmaker/machine/Snapmaker U1.json | 4 +- .../profiles/Snapmaker/machine/fdm_U1.json | 3 +- 28 files changed, 547 insertions(+), 1475 deletions(-) diff --git a/resources/profiles/Snapmaker.json b/resources/profiles/Snapmaker.json index c7fb29915c1..6c055724c08 100644 --- a/resources/profiles/Snapmaker.json +++ b/resources/profiles/Snapmaker.json @@ -1,6 +1,6 @@ { "name": "Snapmaker", - "version": "02.02.45.02", + "version": "02.02.44.02", "force_update": "0", "description": "Snapmaker configurations", "machine_model_list": [ @@ -163,8 +163,8 @@ "sub_path": "process/0.16 Optimal @Snapmaker U1 (0.4 nozzle).json" }, { - "name": "0.20 strength @Snapmaker U1 (0.4 nozzle)", - "sub_path": "process/0.20 strength @Snapmaker U1 (0.4 nozzle).json" + "name": "0.20 Strength @Snapmaker U1 (0.4 nozzle)", + "sub_path": "process/0.20 Strength @Snapmaker U1 (0.4 nozzle).json" }, { "name": "0.24 Draft @Snapmaker U1 (0.4 nozzle)", @@ -449,1876 +449,888 @@ { "name": "0.48 Draft @Snapmaker Artisan (0.8 nozzle)", "sub_path": "process/0.48 Draft @Snapmaker Artisan (0.8 nozzle).json" - }, - - - - - - - - - - - - - - { - "name": "fdm_process_U1_0.06_nozzle_0.2", - "sub_path": "process/fdm_process_U1_0.06_nozzle_0.2.json" - }, + } + ], + "filament_list": [ { - "name": "fdm_process_U1_0.08_nozzle_0.2", - "sub_path": "process/fdm_process_U1_0.08_nozzle_0.2.json" + "name": "fdm_filament_common_generic", + "sub_path": "filament/fdm_filament_common_generic.json" }, { - "name": "fdm_process_U1_0.10_nozzle_0.2", - "sub_path": "process/fdm_process_U1_0.10_nozzle_0.2.json" + "name": "fdm_filament_pla_generic", + "sub_path": "filament/fdm_filament_pla_generic.json" }, { - "name": "fdm_process_U1_0.12_nozzle_0.2", - "sub_path": "process/fdm_process_U1_0.12_nozzle_0.2.json" + "name": "fdm_filament_pctg_generic", + "sub_path": "filament/fdm_filament_pctg_generic.json" }, { - "name": "fdm_process_U1_0.14_nozzle_0.2", - "sub_path": "process/fdm_process_U1_0.14_nozzle_0.2.json" + "name": "fdm_filament_bvoh_generic", + "sub_path":"filament/fdm_filament_bvoh_generic.json" }, { - "name": "fdm_process_U1_0.18_nozzle_0.6", - "sub_path": "process/fdm_process_U1_0.18_nozzle_0.6.json" + "name": "fdm_filament_abs_generic", + "sub_path": "filament/fdm_filament_abs_generic.json" }, { - "name": "fdm_process_U1_0.24_nozzle_0.6", - "sub_path": "process/fdm_process_U1_0.24_nozzle_0.6.json" + "name": "fdm_filament_asa_generic", + "sub_path": "filament/fdm_filament_asa_generic.json" }, { - "name": "fdm_process_U1_0.30_nozzle_0.6", - "sub_path": "process/fdm_process_U1_0.30_nozzle_0.6.json" + "name": "fdm_filament_pa_generic", + "sub_path": "filament/fdm_filament_pa_generic.json" }, { - "name": "fdm_process_U1_0.36_nozzle_0.6", - "sub_path": "process/fdm_process_U1_0.36_nozzle_0.6.json" + "name": "fdm_filament_pc_generic", + "sub_path": "filament/fdm_filament_pc_generic.json" }, { - "name": "fdm_process_U1_0.42_nozzle_0.6", - "sub_path": "process/fdm_process_U1_0.42_nozzle_0.6.json" + "name": "Generic ABS @base", + "sub_path": "filament/Generic ABS @base.json" }, { - "name": "fdm_process_U1_0.32_nozzle_0.8", - "sub_path": "process/fdm_process_U1_0.32_nozzle_0.8.json" + "name": "Generic ABS", + "sub_path": "filament/Generic ABS.json" }, { - "name": "fdm_process_U1_0.40_nozzle_0.8", - "sub_path": "process/fdm_process_U1_0.40_nozzle_0.8.json" + "name": "Generic ASA @base", + "sub_path": "filament/Generic ASA @base.json" }, { - "name": "fdm_process_U1_0.48_nozzle_0.8", - "sub_path": "process/fdm_process_U1_0.48_nozzle_0.8.json" + "name": "Generic ASA", + "sub_path": "filament/Generic ASA.json" }, { - "name": "fdm_process_U1_0.24_nozzle_0.8", - "sub_path": "process/fdm_process_U1_0.24_nozzle_0.8.json" + "name": "Generic PA", + "sub_path": "filament/Generic PA.json" }, { - "name": "fdm_process_U1_0.56_nozzle_0.8", - "sub_path": "process/fdm_process_U1_0.56_nozzle_0.8.json" + "name": "Generic PA-CF", + "sub_path": "filament/Generic PA-CF.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": "Generic PC @base", + "sub_path": "filament/Generic PC @base.json" }, { - "name": "0.06 Standard @Snapmaker U1 (0.2 nozzle)", - "sub_path": "process/0.06 Standard @Snapmaker U1 (0.2 nozzle).json" + "name": "Generic PC", + "sub_path": "filament/Generic PC.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": "Generic Support For PLA @base", + "sub_path": "filament/Generic Support For PLA @base.json" }, { - "name": "0.08 Standard @Snapmaker U1 (0.2 nozzle)", - "sub_path": "process/0.08 Standard @Snapmaker U1 (0.2 nozzle).json" + "name": "Generic Support For PLA", + "sub_path": "filament/Generic Support For PLA.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": "fdm_filament_pva_generic", + "sub_path": "filament/fdm_filament_pva_generic.json" }, { - "name": "0.10 Standard @Snapmaker U1 (0.2 nozzle)", - "sub_path": "process/0.10 Standard @Snapmaker U1 (0.2 nozzle).json" + "name": "Generic PVA @base", + "sub_path": "filament/Generic PVA @base.json" }, { - "name": "0.12 Standard @Snapmaker U1 (0.2 nozzle)", - "sub_path": "process/0.12 Standard @Snapmaker U1 (0.2 nozzle).json" + "name": "Generic PVA", + "sub_path": "filament/Generic PVA.json" }, { - "name": "0.14 Standard @Snapmaker U1 (0.2 nozzle)", - "sub_path": "process/0.14 Standard @Snapmaker U1 (0.2 nozzle).json" + "name": "fdm_filament_pet_generic", + "sub_path": "filament/fdm_filament_pet_generic.json" }, - { - "name": "0.18 Standard @Snapmaker U1 (0.6 nozzle)", - "sub_path": "process/0.18 Standard @Snapmaker U1 (0.6 nozzle).json" + "name": "Generic PETG @base", + "sub_path": "filament/Generic PETG @base.json" }, { - "name": "0.24 Standard @Snapmaker U1 (0.6 nozzle)", - "sub_path": "process/0.24 Standard @Snapmaker U1 (0.6 nozzle).json" + "name": "Generic PETG", + "sub_path": "filament/Generic PETG.json" }, { - "name": "0.30 Standard @Snapmaker U1 (0.6 nozzle)", - "sub_path": "process/0.30 Standard @Snapmaker U1 (0.6 nozzle).json" + "name": "fdm_filament_tpu_generic", + "sub_path": "filament/fdm_filament_tpu_generic.json" }, { - "name": "0.30 Strength @Snapmaker U1 (0.6 nozzle)", - "sub_path": "process/0.30 Strength @Snapmaker U1 (0.6 nozzle).json" + "name": "Generic TPU", + "sub_path": "filament/Generic TPU.json" }, { - "name": "0.36 Standard @Snapmaker U1 (0.6 nozzle)", - "sub_path": "process/0.36 Standard @Snapmaker U1 (0.6 nozzle).json" + "name": "Generic PCTG @base", + "sub_path": "filament/Generic PCTG @base.json" }, { - "name": "0.42 Standard @Snapmaker U1 (0.6 nozzle)", - "sub_path": "process/0.42 Standard @Snapmaker U1 (0.6 nozzle).json" + "name": "Generic PCTG", + "sub_path": "filament/Generic PCTG.json" }, - - { - "name": "0.40 Standard @Snapmaker U1 (0.8 nozzle)", - "sub_path": "process/0.40 Standard @Snapmaker U1 (0.8 nozzle).json" + "name": "Generic PETG HF @base", + "sub_path": "filament/Generic PETG HF @base.json" }, { - "name": "0.48 Standard @Snapmaker U1 (0.8 nozzle)", - "sub_path": "process/0.48 Standard @Snapmaker U1 (0.8 nozzle).json" + "name": "Generic PETG HF", + "sub_path": "filament/Generic PETG HF.json" }, - { - "name": "0.32 Standard @Snapmaker U1 (0.8 nozzle)", - "sub_path": "process/0.32 Standard @Snapmaker U1 (0.8 nozzle).json" + "name": "Generic PETG-CF @base", + "sub_path": "filament/Generic PETG-CF @base.json" }, - { - "name": "0.24 Standard @Snapmaker U1 (0.8 nozzle)", - "sub_path": "process/0.24 Standard @Snapmaker U1 (0.8 nozzle).json" + "name": "Generic PETG-CF", + "sub_path": "filament/Generic PETG-CF.json" }, - - - - { - "name": "0.56 Standard @Snapmaker U1 (0.8 nozzle)", - "sub_path": "process/0.56 Standard @Snapmaker U1 (0.8 nozzle).json" - } - - - - ], - "filament_list": [ { - "name": "fdm_filament_common_generic", - "sub_path": "filament/fdm_filament_common_generic.json" + "name": "Generic PETG-GF @base", + "sub_path": "filament/Generic PETG-GF @base.json" }, { - "name": "fdm_filament_pla_generic", - "sub_path": "filament/fdm_filament_pla_generic.json" + "name": "Generic PETG-GF", + "sub_path": "filament/Generic PETG-GF.json" }, { - "name": "fdm_filament_abs_generic", - "sub_path": "filament/fdm_filament_abs_generic.json" + "name": "Generic PLA High Speed @base", + "sub_path": "filament/Generic PLA High Speed @base.json" }, { - "name": "fdm_filament_asa_generic", - "sub_path": "filament/fdm_filament_asa_generic.json" + "name": "Generic PLA High Speed", + "sub_path": "filament/Generic PLA High Speed.json" }, { - "name": "fdm_filament_pctg_generic", - "sub_path": "filament/fdm_filament_pctg_generic.json" + "name": "Generic PLA Silk @base", + "sub_path": "filament/Generic PLA Silk @base.json" }, { - "name": "fdm_filament_bvoh_generic", - "sub_path":"filament/fdm_filament_bvoh_generic.json" + "name": "Generic PLA Silk", + "sub_path": "filament/Generic PLA Silk.json" }, { - "name": "fdm_filament_pc_generic", - "sub_path": "filament/fdm_filament_pc_generic.json" + "name": "Generic PLA @base", + "sub_path": "filament/Generic PLA @base.json" }, { - "name": "fdm_filament_pa_generic", - "sub_path": "filament/fdm_filament_pa_generic.json" + "name": "Generic PLA", + "sub_path": "filament/Generic PLA.json" }, { - "name": "fdm_filament_pet_generic", - "sub_path": "filament/fdm_filament_pet_generic.json" + "name": "Generic PLA-CF @base", + "sub_path": "filament/Generic PLA-CF @base.json" }, { - "name": "fdm_filament_pva_generic", - "sub_path": "filament/fdm_filament_pva_generic.json" + "name": "Generic PLA-CF", + "sub_path": "filament/Generic PLA-CF.json" }, { - "name": "fdm_filament_tpu_generic", - "sub_path": "filament/fdm_filament_tpu_generic.json" + "name": "Generic BVOH @base", + "sub_path": "filament/Generic BVOH @base.json" }, { - "name": "Generic Support For PLA @base", - "sub_path": "filament/Generic Support For PLA @base.json" + "name": "Generic BVOH", + "sub_path": "filament/Generic BVOH.json" }, { - "name": "Generic Support For PLA test @U1 0.2 nozzle", - "sub_path": "filament/Generic Support For PLA @U1 0.2 nozzle.json" + "name": "Generic TPU 95A HF @base", + "sub_path": "filament/Generic TPU 95A HF @base.json" }, { - "name": "Generic Support For PLA @U1 0.4 nozzle", - "sub_path": "filament/Generic Support For PLA @U1 0.4 nozzle.json" + "name": "Generic TPU 95A HF", + "sub_path": "filament/Generic TPU 95A HF.json" }, { - "name": "Generic Support For PLA test @U1 0.6 nozzle", - "sub_path": "filament/Generic Support For PLA @U1 0.6 nozzle.json" + "name": "Snapmaker PETG HF @base", + "sub_path": "filament/Snapmaker PETG HF @base.json" }, { - "name": "Generic Support For PLA test @U1 0.8 nozzle", - "sub_path": "filament/Generic Support For PLA @U1 0.8 nozzle.json" + "name": "Snapmaker PETG HF", + "sub_path": "filament/Snapmaker PETG HF.json" }, + + + + + + + + + + + + + + + + + + + + + + + + + { - "name": "Generic PVA @base", - "sub_path": "filament/Generic PVA @base.json" + "name": "fdm_filament_common", + "sub_path": "filament/fdm_filament_common.json" }, { - "name": "Generic PVA test @U1 0.2 nozzle", - "sub_path": "filament/Generic PVA @U1 0.2 nozzle.json" + "name": "fdm_filament_abs", + "sub_path": "filament/fdm_filament_abs.json" }, { - "name": "Generic PVA @U1 0.4 nozzle", - "sub_path": "filament/Generic PVA @U1 0.4 nozzle.json" + "name": "fdm_filament_asa", + "sub_path": "filament/fdm_filament_asa.json" }, { - "name": "Generic PVA test @U1 0.6 nozzle", - "sub_path": "filament/Generic PVA @U1 0.6 nozzle.json" + "name": "fdm_filament_pa", + "sub_path": "filament/fdm_filament_pa.json" }, { - "name": "Generic PVA test @U1 0.8 nozzle", - "sub_path": "filament/Generic PVA @U1 0.8 nozzle.json" + "name": "fdm_filament_petg", + "sub_path": "filament/fdm_filament_petg.json" }, { - "name": "Generic PETG @base", - "sub_path": "filament/Generic PETG @base.json" + "name": "fdm_filament_pet", + "sub_path": "filament/fdm_filament_pet.json" }, { - "name": "Generic PETG test @U1 0.2 nozzle", - "sub_path": "filament/Generic PETG @U1 0.2 nozzle.json" + "name": "fdm_filament_pla", + "sub_path": "filament/fdm_filament_pla.json" }, { - "name": "Generic PETG @U1 0.4 nozzle", - "sub_path": "filament/Generic PETG @U1 0.4 nozzle.json" + "name": "fdm_filament_pla_eco", + "sub_path": "filament/fdm_filament_pla_eco.json" }, { - "name": "Generic PETG test @U1 0.6 nozzle", - "sub_path": "filament/Generic PETG @U1 0.6 nozzle.json" + "name": "fdm_filament_pva", + "sub_path": "filament/fdm_filament_pva.json" }, { - "name": "Generic PETG test @U1 0.8 nozzle", - "sub_path": "filament/Generic PETG @U1 0.8 nozzle.json" + "name": "fdm_filament_tpu", + "sub_path": "filament/fdm_filament_tpu.json" }, { - "name": "Generic TPU test @U1 0.2 nozzle", - "sub_path": "filament/Generic TPU @U1 0.2 nozzle.json" + "name": "Snapmaker ABS @base", + "sub_path": "filament/Snapmaker ABS @base.json" }, { - "name": "Generic TPU @U1 0.4 nozzle", - "sub_path": "filament/Generic TPU @U1 0.4 nozzle.json" + "name": "Snapmaker ABS", + "sub_path": "filament/Snapmaker ABS.json" }, { - "name": "Generic TPU test @U1 0.6 nozzle", - "sub_path": "filament/Generic TPU @U1 0.6 nozzle.json" + "name": "Snapmaker ABS @0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @0.2 nozzle.json" }, { - "name": "Generic TPU test @U1 0.8 nozzle", - "sub_path": "filament/Generic TPU @U1 0.8 nozzle.json" + "name": "Snapmaker ASA @base", + "sub_path": "filament/Snapmaker ASA @base.json" }, { - "name": "Generic PCTG @base", - "sub_path": "filament/Generic PCTG @base.json" + "name": "Snapmaker ASA", + "sub_path": "filament/Snapmaker ASA.json" }, { - "name": "Generic PCTG test @U1 0.2 nozzle", - "sub_path": "filament/Generic PCTG @U1 0.2 nozzle.json" + "name": "Snapmaker ASA @0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @0.2 nozzle.json" }, { - "name": "Generic PCTG @U1 0.4 nozzle", - "sub_path": "filament/Generic PCTG @U1 0.4 nozzle.json" + "name": "Snapmaker PA-CF @base", + "sub_path": "filament/Snapmaker PA-CF @base.json" }, { - "name": "Generic PCTG test @U1 0.6 nozzle", - "sub_path": "filament/Generic PCTG @U1 0.6 nozzle.json" + "name": "Snapmaker PA-CF", + "sub_path": "filament/Snapmaker PA-CF.json" }, { - "name": "Generic PCTG test @U1 0.8 nozzle", - "sub_path": "filament/Generic PCTG @U1 0.8 nozzle.json" + "name": "Snapmaker PETG @base", + "sub_path": "filament/Snapmaker PETG @base.json" }, { - "name": "Generic PETG HF @base", - "sub_path": "filament/Generic PETG HF @base.json" + "name": "Snapmaker PETG", + "sub_path": "filament/Snapmaker PETG.json" }, { - "name": "Generic PETG HF test @U1 0.2 nozzle", - "sub_path": "filament/Generic PETG HF @U1 0.2 nozzle.json" + "name": "Snapmaker PETG @0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @0.2 nozzle.json" }, { - "name": "Generic PETG HF @U1 0.4 nozzle", - "sub_path": "filament/Generic PETG HF @U1 0.4 nozzle.json" + "name": "Snapmaker PET @base", + "sub_path": "filament/Snapmaker PET @base.json" }, { - "name": "Generic PETG HF test @U1 0.6 nozzle", - "sub_path": "filament/Generic PETG HF @U1 0.6 nozzle.json" + "name": "Snapmaker PET", + "sub_path": "filament/Snapmaker PET.json" }, { - "name": "Generic PETG HF test @U1 0.8 nozzle", - "sub_path": "filament/Generic PETG HF @U1 0.8 nozzle.json" + "name": "Snapmaker PETG-CF @base", + "sub_path": "filament/Snapmaker PETG-CF @base.json" }, { - "name": "Generic PETG-CF @base", - "sub_path": "filament/Generic PETG-CF @base.json" + "name": "Snapmaker PETG-CF", + "sub_path": "filament/Snapmaker PETG-CF.json" }, { - "name": "Generic PETG-CF test @U1 0.2 nozzle", - "sub_path": "filament/Generic PETG-CF @U1 0.2 nozzle.json" + "name": "Snapmaker PLA Eco @base", + "sub_path": "filament/Snapmaker PLA Eco @base.json" }, { - "name": "Generic PETG-CF @U1 0.4 nozzle", - "sub_path": "filament/Generic PETG-CF @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Eco", + "sub_path": "filament/Snapmaker PLA Eco.json" }, { - "name": "Generic PETG-CF test @U1 0.6 nozzle", - "sub_path": "filament/Generic PETG-CF @U1 0.6 nozzle.json" + "name": "Snapmaker PLA @base", + "sub_path": "filament/Snapmaker PLA @base.json" }, { - "name": "Generic PETG-CF test @U1 0.8 nozzle", - "sub_path": "filament/Generic PETG-CF @U1 0.8 nozzle.json" + "name": "Snapmaker PLA", + "sub_path": "filament/Snapmaker PLA.json" }, { - "name": "Generic PETG-GF @base", - "sub_path": "filament/Generic PETG-GF @base.json" + "name": "Snapmaker PLA-CF @base", + "sub_path": "filament/Snapmaker PLA-CF @base.json" }, { - "name": "Generic PETG-GF test @U1 0.2 nozzle", - "sub_path": "filament/Generic PETG-GF @U1 0.2 nozzle.json" + "name": "Snapmaker PLA-CF", + "sub_path": "filament/Snapmaker PLA-CF.json" }, { - "name": "Generic PETG-GF @U1 0.4 nozzle", - "sub_path": "filament/Generic PETG-GF @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Silk @base", + "sub_path": "filament/Snapmaker PLA Silk @base.json" }, { - "name": "Generic PETG-GF test @U1 0.6 nozzle", - "sub_path": "filament/Generic PETG-GF @U1 0.6 nozzle.json" + "name": "Snapmaker PLA Silk", + "sub_path": "filament/Snapmaker PLA Silk.json" }, { - "name": "Generic PETG-GF test @U1 0.8 nozzle", - "sub_path": "filament/Generic PETG-GF @U1 0.8 nozzle.json" + "name": "Snapmaker PLA Silk @0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @0.2 nozzle.json" }, { - "name": "Generic PLA High Speed @base", - "sub_path": "filament/Generic PLA High Speed @base.json" + "name": "PolyLite PLA @base", + "sub_path": "filament/PolyLite PLA @base.json" }, { - "name": "Generic PLA Silk @base", - "sub_path": "filament/Generic PLA Silk @base.json" + "name": "PolyLite PLA", + "sub_path": "filament/PolyLite PLA.json" }, { - "name": "Generic PLA @base", - "sub_path": "filament/Generic PLA @base.json" + "name": "PolyLite PLA @0.2 nozzle", + "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" }, { - "name": "Generic PLA-CF @base", - "sub_path": "filament/Generic PLA-CF @base.json" + "name": "PolyTerra PLA @base", + "sub_path": "filament/PolyTerra PLA @base.json" }, { - "name": "Generic BVOH @base", - "sub_path": "filament/Generic BVOH @base.json" + "name": "PolyTerra PLA", + "sub_path": "filament/PolyTerra PLA.json" }, { - "name": "Generic BVOH test @U1 0.2 nozzle", - "sub_path": "filament/Generic BVOH @U1 0.2 nozzle.json" + "name": "PolyTerra PLA @0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" }, { - "name": "Generic BVOH @U1 0.4 nozzle", - "sub_path": "filament/Generic BVOH @U1 0.4 nozzle.json" + "name": "Snapmaker PVA @base", + "sub_path": "filament/Snapmaker PVA @base.json" }, { - "name": "Generic BVOH test @U1 0.6 nozzle", - "sub_path": "filament/Generic BVOH @U1 0.6 nozzle.json" + "name": "Snapmaker PVA", + "sub_path": "filament/Snapmaker PVA.json" }, { - "name": "Generic BVOH test @U1 0.8 nozzle", - "sub_path": "filament/Generic BVOH @U1 0.8 nozzle.json" + "name": "Snapmaker PVA @0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @0.2 nozzle.json" }, { - "name": "Generic TPU 95A HF @base", - "sub_path": "filament/Generic TPU 95A HF @base.json" + "name": "Snapmaker TPU @base", + "sub_path": "filament/Snapmaker TPU @base.json" }, { - "name": "Generic TPU 95A HF test @U1 0.2 nozzle", - "sub_path": "filament/Generic TPU 95A HF @U1 0.2 nozzle.json" + "name": "Snapmaker TPU", + "sub_path": "filament/Snapmaker TPU.json" }, { - "name": "Generic TPU 95A HF @U1 0.4 nozzle", - "sub_path": "filament/Generic TPU 95A HF @U1 0.4 nozzle.json" - }, - { - "name": "Generic TPU 95A HF test @U1 0.6 nozzle", - "sub_path": "filament/Generic TPU 95A HF @U1 0.6 nozzle.json" - }, - { - "name": "Generic TPU 95A HF test @U1 0.8 nozzle", - "sub_path": "filament/Generic TPU 95A HF @U1 0.8 nozzle.json" - }, - { - "name": "Generic ABS @base", - "sub_path": "filament/Generic ABS @base.json" - }, - { - "name": "Generic ABS @U1 0.2 nozzle", - "sub_path": "filament/Generic ABS @U1 0.2 nozzle.json" - }, - { - "name": "Generic ABS @U1 0.4 nozzle", - "sub_path": "filament/Generic ABS @U1 0.4 nozzle.json" - }, - { - "name": "Generic ABS @U1 0.6 nozzle", - "sub_path": "filament/Generic ABS @U1 0.6 nozzle.json" - }, - { - "name": "Generic ABS @U1 0.8 nozzle", - "sub_path": "filament/Generic ABS @U1 0.8 nozzle.json" - }, - { - "name": "Generic ASA @base", - "sub_path": "filament/Generic ASA @base.json" - }, - { - "name": "Generic ASA @U1 0.2 nozzle", - "sub_path": "filament/Generic ASA @U1 0.2 nozzle.json" - }, - { - "name": "Generic ASA @U1 0.4 nozzle", - "sub_path": "filament/Generic ASA @U1 0.4 nozzle.json" - }, - { - "name": "Generic ASA @U1 0.6 nozzle", - "sub_path": "filament/Generic ASA @U1 0.6 nozzle.json" - }, - { - "name": "Generic ASA @U1 0.8 nozzle", - "sub_path": "filament/Generic ASA @U1 0.8 nozzle.json" - }, - { - "name": "Generic PA @U1 0.2 nozzle", - "sub_path": "filament/Generic PA @U1 0.2 nozzle.json" - }, - { - "name": "Generic PA @U1 0.4 nozzle", - "sub_path": "filament/Generic PA @U1 0.4 nozzle.json" - }, - { - "name": "Generic PA @U1 0.6 nozzle", - "sub_path": "filament/Generic PA @U1 0.6 nozzle.json" - }, - { - "name": "Generic PA @U1 0.8 nozzle", - "sub_path": "filament/Generic PA @U1 0.8 nozzle.json" - }, - { - "name": "Generic PA-CF @U1 0.2 nozzle", - "sub_path": "filament/Generic PA-CF @U1 0.2 nozzle.json" - }, - { - "name": "Generic PA-CF @U1 0.4 nozzle", - "sub_path": "filament/Generic PA-CF @U1 0.4 nozzle.json" - }, - { - "name": "Generic PA-CF @U1 0.6 nozzle", - "sub_path": "filament/Generic PA-CF @U1 0.6 nozzle.json" - }, - { - "name": "Generic PA-CF @U1 0.8 nozzle", - "sub_path": "filament/Generic PA-CF @U1 0.8 nozzle.json" - }, - { - "name": "Generic PC @base", - "sub_path": "filament/Generic PC @base.json" - }, - { - "name": "Generic PC @U1 0.4 nozzle", - "sub_path": "filament/Generic PC @U1 0.4 nozzle.json" - }, - { - "name": "Generic PC @U1 0.6 nozzle", - "sub_path": "filament/Generic PC @U1 0.6 nozzle.json" - }, - { - "name": "Generic PC @U1 0.8 nozzle", - "sub_path": "filament/Generic PC @U1 0.8 nozzle.json" - }, - - - - - - - - - - { - "name": "fdm_filament_common", - "sub_path": "filament/fdm_filament_common.json" - }, - { - "name": "fdm_filament_abs", - "sub_path": "filament/fdm_filament_abs.json" - }, - { - "name": "fdm_filament_asa", - "sub_path": "filament/fdm_filament_asa.json" - }, - { - "name": "fdm_filament_pa", - "sub_path": "filament/fdm_filament_pa.json" - }, - { - "name": "fdm_filament_petg", - "sub_path": "filament/fdm_filament_petg.json" - }, - { - "name": "fdm_filament_pet", - "sub_path": "filament/fdm_filament_pet.json" - }, - { - "name": "fdm_filament_pla", - "sub_path": "filament/fdm_filament_pla.json" - }, - { - "name": "fdm_filament_pla_eco", - "sub_path": "filament/fdm_filament_pla_eco.json" - }, - { - "name": "fdm_filament_pva", - "sub_path": "filament/fdm_filament_pva.json" - }, - { - "name": "fdm_filament_tpu", - "sub_path": "filament/fdm_filament_tpu.json" - }, - { - "name": "Snapmaker ABS @base", - "sub_path": "filament/Snapmaker ABS @base.json" - }, - { - "name": "Snapmaker ABS", - "sub_path": "filament/Snapmaker ABS.json" - }, - { - "name": "Snapmaker ABS @0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @0.2 nozzle.json" - }, - { - "name": "Snapmaker ASA @base", - "sub_path": "filament/Snapmaker ASA @base.json" - }, - { - "name": "Snapmaker ASA", - "sub_path": "filament/Snapmaker ASA.json" - }, - { - "name": "Snapmaker ASA @0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @0.2 nozzle.json" - }, - { - "name": "Snapmaker PA-CF @base", - "sub_path": "filament/Snapmaker PA-CF @base.json" - }, - { - "name": "Snapmaker PA-CF", - "sub_path": "filament/Snapmaker PA-CF.json" - }, - { - "name": "Snapmaker PETG @base", - "sub_path": "filament/Snapmaker PETG @base.json" - }, - { - "name": "Snapmaker PETG", - "sub_path": "filament/Snapmaker PETG.json" - }, - { - "name": "Snapmaker PETG @0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @0.2 nozzle.json" - }, - { - "name": "Snapmaker PET @base", - "sub_path": "filament/Snapmaker PET @base.json" - }, - { - "name": "Snapmaker PET", - "sub_path": "filament/Snapmaker PET.json" - }, - { - "name": "Snapmaker PETG-CF @base", - "sub_path": "filament/Snapmaker PETG-CF @base.json" - }, - { - "name": "Snapmaker PETG-CF", - "sub_path": "filament/Snapmaker PETG-CF.json" - }, - { - "name": "Snapmaker PLA Eco @base", - "sub_path": "filament/Snapmaker PLA Eco @base.json" - }, - { - "name": "Snapmaker PLA Eco", - "sub_path": "filament/Snapmaker PLA Eco.json" - }, - { - "name": "Snapmaker PLA @base", - "sub_path": "filament/Snapmaker PLA @base.json" - }, - { - "name": "Snapmaker PLA", - "sub_path": "filament/Snapmaker PLA.json" - }, - { - "name": "Snapmaker PLA-CF @base", - "sub_path": "filament/Snapmaker PLA-CF @base.json" - }, - { - "name": "Snapmaker PLA-CF", - "sub_path": "filament/Snapmaker PLA-CF.json" - }, - { - "name": "Snapmaker PLA Silk @base", - "sub_path": "filament/Snapmaker PLA Silk @base.json" - }, - { - "name": "Snapmaker PLA Silk", - "sub_path": "filament/Snapmaker PLA Silk.json" - }, - { - "name": "Snapmaker PLA Silk @0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @0.2 nozzle.json" - }, - { - "name": "PolyLite PLA @base", - "sub_path": "filament/PolyLite PLA @base.json" - }, - { - "name": "PolyLite PLA", - "sub_path": "filament/PolyLite PLA.json" - }, - { - "name": "PolyLite PLA @0.2 nozzle", - "sub_path": "filament/PolyLite PLA @0.2 nozzle.json" - }, - { - "name": "PolyTerra PLA @base", - "sub_path": "filament/PolyTerra PLA @base.json" - }, - { - "name": "PolyTerra PLA", - "sub_path": "filament/PolyTerra PLA.json" - }, - { - "name": "PolyTerra PLA @0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @0.2 nozzle.json" - }, - { - "name": "Snapmaker PVA @base", - "sub_path": "filament/Snapmaker PVA @base.json" - }, - { - "name": "Snapmaker PVA", - "sub_path": "filament/Snapmaker PVA.json" - }, - { - "name": "Snapmaker PVA @0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @0.2 nozzle.json" - }, - { - "name": "Snapmaker TPU @base", - "sub_path": "filament/Snapmaker TPU @base.json" - }, - { - "name": "Snapmaker TPU", - "sub_path": "filament/Snapmaker TPU.json" - }, - { - "name": "Snapmaker TPE", - "sub_path": "filament/Snapmaker TPE.json" + "name": "Snapmaker TPE", + "sub_path": "filament/Snapmaker TPE.json" }, { "name": "Snapmaker ABS @J1 base", - "sub_path": "filament/Snapmaker ABS @J1 base.json" - }, - { - "name": "Snapmaker ABS @J1", - "sub_path": "filament/Snapmaker ABS @J1.json" - }, - { - "name": "Snapmaker ABS @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @J1 0.2 nozzle.json" - }, - { - "name": "Snapmaker ABS @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker ABS @J1 0.8 nozzle.json" - }, - { - "name": "Snapmaker ABS Benchy @J1", - "sub_path": "filament/Snapmaker ABS Benchy @J1.json" - }, - { - "name": "Snapmaker ASA @J1 base", - "sub_path": "filament/Snapmaker ASA @J1 base.json" - }, - { - "name": "Snapmaker ASA @J1", - "sub_path": "filament/Snapmaker ASA @J1.json" - }, - { - "name": "Snapmaker ASA @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @J1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PA-CF @J1 base", - "sub_path": "filament/Snapmaker PA-CF @J1 base.json" - }, - { - "name": "Snapmaker PA-CF @J1", - "sub_path": "filament/Snapmaker PA-CF @J1.json" - }, - { - "name": "Snapmaker PETG @J1 base", - "sub_path": "filament/Snapmaker PETG @J1 base.json" - }, - { - "name": "Snapmaker PETG @J1", - "sub_path": "filament/Snapmaker PETG @J1.json" - }, - { - "name": "Snapmaker PETG @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @J1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PETG @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PETG @J1 0.8 nozzle.json" - }, - { - "name": "Snapmaker PET @J1 base", - "sub_path": "filament/Snapmaker PET @J1 base.json" - }, - { - "name": "Snapmaker PET @J1", - "sub_path": "filament/Snapmaker PET @J1.json" - }, - { - "name": "Snapmaker PETG-CF @J1 base", - "sub_path": "filament/Snapmaker PETG-CF @J1 base.json" - }, - { - "name": "Snapmaker PETG-CF @J1", - "sub_path": "filament/Snapmaker PETG-CF @J1.json" - }, - { - "name": "Snapmaker PLA Eco @J1 base", - "sub_path": "filament/Snapmaker PLA Eco @J1 base.json" - }, - { - "name": "Snapmaker PLA Eco @J1", - "sub_path": "filament/Snapmaker PLA Eco @J1.json" - }, - { - "name": "Snapmaker PLA Eco @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @J1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PLA Eco @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @J1 0.8 nozzle.json" - }, - { - "name": "Snapmaker PLA @J1 base", - "sub_path": "filament/Snapmaker PLA @J1 base.json" - }, - { - "name": "Snapmaker PLA @J1", - "sub_path": "filament/Snapmaker PLA @J1.json" - }, - { - "name": "Snapmaker PLA Matte @base", - "sub_path": "filament/Snapmaker PLA Matte @base.json" - }, - { - "name": "Snapmaker PLA Matte @J1", - "sub_path": "filament/Snapmaker PLA Matte @J1.json" - }, - { - "name": "Snapmaker PLA Metal @J1 base", - "sub_path": "filament/Snapmaker PLA Metal @J1 base.json" - }, - { - "name": "Snapmaker PLA Metal @J1", - "sub_path": "filament/Snapmaker PLA Metal @J1.json" - }, - { - "name": "Snapmaker PLA Metal @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Metal @J1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PLA-CF @J1 base", - "sub_path": "filament/Snapmaker PLA-CF @J1 base.json" - }, - { - "name": "Snapmaker PLA-CF @J1", - "sub_path": "filament/Snapmaker PLA-CF @J1.json" - }, - { - "name": "Snapmaker PLA-CF @J1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA-CF @J1 0.8 nozzle.json" - }, - { - "name": "Snapmaker PLA Silk @J1 base", - "sub_path": "filament/Snapmaker PLA Silk @J1 base.json" - }, - { - "name": "Snapmaker PLA Silk @J1", - "sub_path": "filament/Snapmaker PLA Silk @J1.json" - }, - { - "name": "Snapmaker PLA Silk @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @J1 0.2 nozzle.json" - }, - { - "name": "PolyLite PLA @J1", - "sub_path": "filament/PolyLite PLA @J1.json" - }, - { - "name": "PolyLite PLA @J1 0.2 nozzle", - "sub_path": "filament/PolyLite PLA @J1 0.2 nozzle.json" - }, - { - "name": "PolyTerra PLA @J1", - "sub_path": "filament/PolyTerra PLA @J1.json" - }, - { - "name": "PolyTerra PLA @J1 0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @J1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PVA @J1 base", - "sub_path": "filament/Snapmaker PVA @J1 base.json" - }, - { - "name": "Snapmaker PVA @J1", - "sub_path": "filament/Snapmaker PVA @J1.json" - }, - { - "name": "Snapmaker PVA @J1 0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @J1 0.2 nozzle.json" - }, - { - "name": "Snapmaker TPU @J1 base", - "sub_path": "filament/Snapmaker TPU @J1 base.json" - }, - { - "name": "Snapmaker TPU @J1", - "sub_path": "filament/Snapmaker TPU @J1.json" - }, - { - "name": "Snapmaker TPU High-Flow @J1", - "sub_path": "filament/Snapmaker TPU High-Flow @J1.json" - }, - { - "name": "Snapmaker TPE @J1", - "sub_path": "filament/Snapmaker TPE @J1.json" - }, - { - "name": "Snapmaker ABS @Dual base", - "sub_path": "filament/Snapmaker ABS @Dual base.json" - }, - { - "name": "Snapmaker ABS @Dual", - "sub_path": "filament/Snapmaker ABS @Dual.json" - }, - { - "name": "Snapmaker ABS @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker ABS @Dual 0.2 nozzle.json" - }, - { - "name": "Snapmaker ABS @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker ABS @Dual 0.8 nozzle.json" - }, - { - "name": "Snapmaker ABS Benchy @Dual", - "sub_path": "filament/Snapmaker ABS Benchy @Dual.json" - }, - { - "name": "Snapmaker ASA @Dual base", - "sub_path": "filament/Snapmaker ASA @Dual base.json" - }, - { - "name": "Snapmaker ASA @Dual", - "sub_path": "filament/Snapmaker ASA @Dual.json" - }, - { - "name": "Snapmaker ASA @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker ASA @Dual 0.2 nozzle.json" - }, - { - "name": "Snapmaker PA-CF @Dual base", - "sub_path": "filament/Snapmaker PA-CF @Dual base.json" - }, - { - "name": "Snapmaker PA-CF @Dual", - "sub_path": "filament/Snapmaker PA-CF @Dual.json" - }, - { - "name": "Snapmaker PETG @Dual base", - "sub_path": "filament/Snapmaker PETG @Dual base.json" - }, - { - "name": "Snapmaker PETG @Dual", - "sub_path": "filament/Snapmaker PETG @Dual.json" - }, - { - "name": "Snapmaker PETG @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PETG @Dual 0.2 nozzle.json" - }, - { - "name": "Snapmaker PETG @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PETG @Dual 0.8 nozzle.json" - }, - { - "name": "Snapmaker PET @Dual base", - "sub_path": "filament/Snapmaker PET @Dual base.json" - }, - { - "name": "Snapmaker PET @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PET @Dual 0.8 nozzle.json" - }, - { - "name": "Snapmaker PET @Dual", - "sub_path": "filament/Snapmaker PET @Dual.json" - }, - { - "name": "Snapmaker PETG-CF @Dual base", - "sub_path": "filament/Snapmaker PETG-CF @Dual base.json" - }, - { - "name": "Snapmaker PETG-CF @Dual", - "sub_path": "filament/Snapmaker PETG-CF @Dual.json" - }, - { - "name": "Snapmaker PLA Eco @Dual base", - "sub_path": "filament/Snapmaker PLA Eco @Dual base.json" - }, - { - "name": "Snapmaker PLA Eco @Dual", - "sub_path": "filament/Snapmaker PLA Eco @Dual.json" - }, - { - "name": "Snapmaker PLA Eco @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @Dual 0.2 nozzle.json" - }, - { - "name": "Snapmaker PLA Eco @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Eco @Dual 0.8 nozzle.json" - }, - { - "name": "Snapmaker PLA @Dual base", - "sub_path": "filament/Snapmaker PLA @Dual base.json" - }, - { - "name": "Snapmaker PLA @Dual", - "sub_path": "filament/Snapmaker PLA @Dual.json" - }, - { - "name": "Snapmaker PLA Matte @Dual", - "sub_path": "filament/Snapmaker PLA Matte @Dual.json" - }, - { - "name": "Snapmaker PLA Metal @Dual base", - "sub_path": "filament/Snapmaker PLA Metal @Dual base.json" - }, - { - "name": "Snapmaker PLA Metal @Dual", - "sub_path": "filament/Snapmaker PLA Metal @Dual.json" - }, - { - "name": "Snapmaker PLA Metal @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Metal @Dual 0.2 nozzle.json" - }, - { - "name": "Snapmaker PLA-CF @Dual base", - "sub_path": "filament/Snapmaker PLA-CF @Dual base.json" - }, - { - "name": "Snapmaker PLA-CF @Dual", - "sub_path": "filament/Snapmaker PLA-CF @Dual.json" - }, - { - "name": "Snapmaker PLA-CF @Dual 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA-CF @Dual 0.8 nozzle.json" - }, - { - "name": "Snapmaker PLA Silk @Dual base", - "sub_path": "filament/Snapmaker PLA Silk @Dual base.json" - }, - { - "name": "Snapmaker PLA Silk @Dual", - "sub_path": "filament/Snapmaker PLA Silk @Dual.json" - }, - { - "name": "Snapmaker PLA Silk @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Silk @Dual 0.2 nozzle.json" - }, - { - "name": "PolyLite PLA @Dual", - "sub_path": "filament/PolyLite PLA @Dual.json" - }, - { - "name": "PolyLite PLA @Dual 0.2 nozzle", - "sub_path": "filament/PolyLite PLA @Dual 0.2 nozzle.json" - }, - { - "name": "PolyTerra PLA @Dual", - "sub_path": "filament/PolyTerra PLA @Dual.json" - }, - { - "name": "PolyTerra PLA @Dual 0.2 nozzle", - "sub_path": "filament/PolyTerra PLA @Dual 0.2 nozzle.json" - }, - { - "name": "Snapmaker PVA @Dual base", - "sub_path": "filament/Snapmaker PVA @Dual base.json" - }, - { - "name": "Snapmaker PVA @Dual", - "sub_path": "filament/Snapmaker PVA @Dual.json" - }, - { - "name": "Snapmaker PVA @Dual 0.2 nozzle", - "sub_path": "filament/Snapmaker PVA @Dual 0.2 nozzle.json" - }, - { - "name": "Snapmaker TPU @Dual base", - "sub_path": "filament/Snapmaker TPU @Dual base.json" - }, - { - "name": "Snapmaker TPU @Dual", - "sub_path": "filament/Snapmaker TPU @Dual.json" - }, - { - "name": "Snapmaker TPU High-Flow @Dual", - "sub_path": "filament/Snapmaker TPU High-Flow @Dual.json" - }, - { - "name": "Snapmaker TPE @Dual", - "sub_path": "filament/Snapmaker TPE @Dual.json" - }, - { - "name": "Snapmaker Breakaway Support @base", - "sub_path": "filament/Snapmaker Breakaway Support @base.json" - }, - { - "name": "Snapmaker Breakaway Support", - "sub_path": "filament/Snapmaker Breakaway Support.json" - }, - { - "name": "Snapmaker Breakaway Support @J1", - "sub_path": "filament/Snapmaker Breakaway Support @J1.json" - }, - - - - - - - { - "name": "Snapmaker PLA @U1 base", - "sub_path": "filament/Snapmaker PLA @U1 base.json" - }, - { - "name": "Snapmaker PLA Eco @U1 base", - "sub_path": "filament/Snapmaker PLA Eco @U1 base.json" - }, - { - "name": "Snapmaker PLA Matte", - "sub_path": "filament/Snapmaker PLA Matte.json" - }, - { - "name": "Snapmaker PLA Matte @U1 base", - "sub_path": "filament/Snapmaker PLA Matte @U1 base.json" - }, - { - "name": "Snapmaker PLA Matte test @U1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Matte @U1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PLA Matte @U1 0.4 nozzle", - "sub_path": "filament/Snapmaker PLA Matte @U1 0.4 nozzle.json" - }, - { - "name": "Snapmaker PLA Matte test @U1 0.6 nozzle", - "sub_path": "filament/Snapmaker PLA Matte @U1 0.6 nozzle.json" - }, - { - "name": "Snapmaker PLA Matte test @U1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Matte @U1 0.8 nozzle.json" - }, - { - "name": "Snapmaker PLA Basic @U1 base", - "sub_path": "filament/Snapmaker PLA Basic @U1 base.json" - }, - { - "name": "Snapmaker PLA Basic test @U1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA Basic @U1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PLA Basic @U1 0.4 nozzle", - "sub_path": "filament/Snapmaker PLA Basic @U1 0.4 nozzle.json" - }, - { - "name": "Snapmaker PLA Basic test @U1 0.6 nozzle", - "sub_path": "filament/Snapmaker PLA Basic @U1 0.6 nozzle.json" - }, - { - "name": "Snapmaker PLA Basic test @U1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA Basic @U1 0.8 nozzle.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @base.json" - }, - { - "name": "Snapmaker PLA SnapSpeed", - "sub_path": "filament/Snapmaker PLA SnapSpeed.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @J1", - "sub_path": "filament/Snapmaker PLA SnapSpeed @J1.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @Dual", - "sub_path": "filament/Snapmaker PLA SnapSpeed @Dual.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @U1 base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @U1 base", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @U1 0.2 nozzle", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @U1 0.4 nozzle", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.4 nozzle.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @U1 0.6 nozzle", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.6 nozzle.json" - }, - { - "name": "Snapmaker PLA SnapSpeed @U1 0.8 nozzle", - "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 0.8 nozzle.json" - }, - { - "name": "Snapmaker PLA Metal @U1 base", - "sub_path": "filament/Snapmaker PLA Metal @U1 base.json" - }, - { - "name": "Snapmaker PLA Silk @U1 base", - "sub_path": "filament/Snapmaker PLA Silk @U1 base.json" - }, - { - "name": "Snapmaker PLA-CF @U1 base", - "sub_path": "filament/Snapmaker PLA-CF @U1 base.json" - }, - { - "name": "Snapmaker PVA @U1 base", - "sub_path": "filament/Snapmaker PVA @U1 base.json" - }, - { - "name": "Snapmaker TPU @U1 base", - "sub_path": "filament/Snapmaker TPU @U1 base.json" - }, - { - "name": "Snapmaker TPU 95A @U1 base", - "sub_path":"filament/Snapmaker TPU 95A @U1 base.json" - }, - { - "name": "Snapmaker PETG HF @base", - "sub_path": "filament/Snapmaker PETG HF @base.json" - }, - { - "name": "Snapmaker PETG HF @U1 0.2 nozzle", - "sub_path": "filament/Snapmaker PETG HF @U1 0.2 nozzle.json" - }, - { - "name": "Snapmaker PETG HF @U1 0.4 nozzle", - "sub_path": "filament/Snapmaker PETG HF @U1 0.4 nozzle.json" - }, - { - "name": "Snapmaker PETG HF @U1 0.6 nozzle", - "sub_path": "filament/Snapmaker PETG HF @U1 0.6 nozzle.json" - }, - { - "name": "Snapmaker PETG HF @U1 0.8 nozzle", - "sub_path": "filament/Snapmaker PETG HF @U1 0.8 nozzle.json" - }, - - - - - - - - - - - - - - - { - "name": "fdm_filament_common_bambu", - "sub_path": "filament/fdm_filament_common_bambu.json" - }, - - - - - { - "name": "fdm_filament_abs_bambu", - "sub_path": "filament/fdm_filament_abs_bambu.json" - }, - { - "name": "fdm_filament_asa_bambu", - "sub_path": "filament/fdm_filament_asa_bambu.json" - }, - { - "name": "fdm_filament_bvoh_bambu", - "sub_path": "filament/fdm_filament_bvoh_bambu.json" - }, - { - "name": "fdm_filament_eva_bambu", - "sub_path": "filament/fdm_filament_eva_bambu.json" - }, - { - "name": "fdm_filament_hips_bambu", - "sub_path": "filament/fdm_filament_hips_bambu.json" - }, - { - "name": "fdm_filament_pa_bambu", - "sub_path": "filament/fdm_filament_pa_bambu.json" - }, - { - "name": "fdm_filament_pc_bambu", - "sub_path": "filament/fdm_filament_pc_bambu.json" - }, - { - "name": "fdm_filament_pctg_bambu", - "sub_path": "filament/fdm_filament_pctg_bambu.json" - }, - { - "name": "fdm_filament_pe_bambu", - "sub_path": "filament/fdm_filament_pe_bambu.json" - }, - { - "name": "fdm_filament_pet_bambu", - "sub_path": "filament/fdm_filament_pet_bambu.json" - }, - { - "name": "fdm_filament_pha_bambu", - "sub_path": "filament/fdm_filament_pha_bambu.json" - }, - { - "name": "fdm_filament_pla_bambu", - "sub_path": "filament/fdm_filament_pla_bambu.json" - }, - { - "name": "fdm_filament_pp_bambu", - "sub_path": "filament/fdm_filament_pp_bambu.json" - }, - { - "name": "fdm_filament_ppa_bambu", - "sub_path": "filament/fdm_filament_ppa_bambu.json" - }, - { - "name": "fdm_filament_pva_bambu", - "sub_path": "filament/fdm_filament_pva_bambu.json" - }, - { - "name": "fdm_filament_tpu_bambu", - "sub_path": "filament/fdm_filament_tpu_bambu.json" - }, - - - - - - - - - { - "name": "Generic ABS bambu @base", - "sub_path": "filament/Generic ABS bambu @base.json" - }, - { - "name": "Generic ABS bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic ABS bambu @U1 0.2 nozzle.json" - }, - { - "name": "Generic ABS bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic ABS bambu @U1 0.4 nozzle.json" - }, - { - "name": "Generic ABS bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic ABS bambu @U1 0.6 nozzle.json" - }, - { - "name": "Generic ABS bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic ABS bambu @U1 0.8 nozzle.json" - }, - - { - "name": "Generic ASA bambu @base", - "sub_path": "filament/Generic ASA bambu @base.json" - }, - { - "name": "Generic ASA bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic ASA bambu @U1 0.2 nozzle.json" - }, - { - "name": "Generic ASA bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic ASA bambu @U1 0.4 nozzle.json" - }, - { - "name": "Generic ASA bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic ASA bambu @U1 0.6 nozzle.json" - }, - { - "name": "Generic ASA bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic ASA bambu @U1 0.8 nozzle.json" - }, - { - "name": "Generic BVOH bambu @base", - "sub_path": "filament/Generic BVOH bambu @base.json" - }, - { - "name": "Generic BVOH bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic BVOH bambu @U1 0.4 nozzle.json" - }, - { - "name": "Generic BVOH bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic BVOH bambu @U1 0.6 nozzle.json" - }, - { - "name": "Generic BVOH bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic BVOH bambu @U1 0.8 nozzle.json" - }, - { - "name": "Generic EVA bambu @base", - "sub_path": "filament/Generic EVA bambu @base.json" - }, - { - "name": "Generic EVA bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic EVA bambu @U1 0.4 nozzle.json" - }, - { - "name": "Generic EVA bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic EVA bambu @U1 0.6 nozzle.json" + "sub_path": "filament/Snapmaker ABS @J1 base.json" }, { - "name": "Generic EVA bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic EVA bambu @U1 0.8 nozzle.json" + "name": "Snapmaker ABS @J1", + "sub_path": "filament/Snapmaker ABS @J1.json" }, { - "name": "Generic HIPS bambu @base", - "sub_path": "filament/Generic HIPS bambu @base.json" + "name": "Snapmaker ABS @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @J1 0.2 nozzle.json" }, { - "name": "Generic HIPS bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic HIPS bambu @U1 0.2 nozzle.json" + "name": "Snapmaker ABS @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker ABS @J1 0.8 nozzle.json" }, { - "name": "Generic HIPS bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic HIPS bambu @U1 0.4 nozzle.json" + "name": "Snapmaker ABS Benchy @J1", + "sub_path": "filament/Snapmaker ABS Benchy @J1.json" }, { - "name": "Generic HIPS bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic HIPS bambu @U1 0.6 nozzle.json" + "name": "Snapmaker ASA @J1 base", + "sub_path": "filament/Snapmaker ASA @J1 base.json" }, { - "name": "Generic HIPS bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic HIPS bambu @U1 0.8 nozzle.json" + "name": "Snapmaker ASA @J1", + "sub_path": "filament/Snapmaker ASA @J1.json" }, { - "name": "Generic PA bambu @base", - "sub_path": "filament/Generic PA bambu @base.json" + "name": "Snapmaker ASA @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @J1 0.2 nozzle.json" }, { - "name": "Generic PA bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PA bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PA-CF @J1 base", + "sub_path": "filament/Snapmaker PA-CF @J1 base.json" }, { - "name": "Generic PA bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PA bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PA-CF @J1", + "sub_path": "filament/Snapmaker PA-CF @J1.json" }, { - "name": "Generic PA bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PA bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PETG @J1 base", + "sub_path": "filament/Snapmaker PETG @J1 base.json" }, { - "name": "Generic PA-CF bambu @base", - "sub_path": "filament/Generic PA-CF bambu @base.json" + "name": "Snapmaker PETG @J1", + "sub_path": "filament/Snapmaker PETG @J1.json" }, { - "name": "Generic PA-CF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PA-CF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PETG @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @J1 0.2 nozzle.json" }, { - "name": "Generic PA-CF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PA-CF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PETG @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG @J1 0.8 nozzle.json" }, { - "name": "Generic PA-CF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PA-CF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PET @J1 base", + "sub_path": "filament/Snapmaker PET @J1 base.json" }, { - "name": "Generic PC bambu @base", - "sub_path": "filament/Generic PC bambu @base.json" + "name": "Snapmaker PET @J1", + "sub_path": "filament/Snapmaker PET @J1.json" }, - { - "name": "Generic PC bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PC bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PETG-CF @J1 base", + "sub_path": "filament/Snapmaker PETG-CF @J1 base.json" }, { - "name": "Generic PC bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PC bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PETG-CF @J1", + "sub_path": "filament/Snapmaker PETG-CF @J1.json" }, { - "name": "Generic PC bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PC bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Eco @J1 base", + "sub_path": "filament/Snapmaker PLA Eco @J1 base.json" }, { - "name": "Generic PC bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic PC bambu @U1 0.2 nozzle.json" + "name": "Snapmaker PLA Eco @J1", + "sub_path": "filament/Snapmaker PLA Eco @J1.json" }, { - "name": "Generic PCTG bambu @base", - "sub_path": "filament/Generic PCTG bambu @base.json" + "name": "Snapmaker PLA Eco @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @J1 0.2 nozzle.json" }, { - "name": "Generic PCTG bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PCTG bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Eco @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @J1 0.8 nozzle.json" }, { - "name": "Generic PCTG bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PCTG bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA @J1 base", + "sub_path": "filament/Snapmaker PLA @J1 base.json" }, { - "name": "Generic PCTG bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PCTG bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA @J1", + "sub_path": "filament/Snapmaker PLA @J1.json" }, { - "name": "Generic PE bambu @base", - "sub_path": "filament/Generic PE bambu @base.json" + "name": "Snapmaker PLA Matte @base", + "sub_path": "filament/Snapmaker PLA Matte @base.json" }, { - "name": "Generic PE bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PE bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Matte @J1", + "sub_path": "filament/Snapmaker PLA Matte @J1.json" }, { - "name": "Generic PE bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PE bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA Metal @J1 base", + "sub_path": "filament/Snapmaker PLA Metal @J1 base.json" }, { - "name": "Generic PE bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PE bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA Metal @J1", + "sub_path": "filament/Snapmaker PLA Metal @J1.json" }, { - "name": "Generic PE-CF bambu @base", - "sub_path": "filament/Generic PE-CF bambu @base.json" + "name": "Snapmaker PLA Metal @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Metal @J1 0.2 nozzle.json" }, { - "name": "Generic PE-CF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PE-CF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA-CF @J1 base", + "sub_path": "filament/Snapmaker PLA-CF @J1 base.json" }, { - "name": "Generic PE-CF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PE-CF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA-CF @J1", + "sub_path": "filament/Snapmaker PLA-CF @J1.json" }, { - "name": "Generic PE-CF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PE-CF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA-CF @J1 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @J1 0.8 nozzle.json" }, { - "name": "Generic PETG bambu @base", - "sub_path": "filament/Generic PETG bambu @base.json" + "name": "Snapmaker PLA Silk @J1 base", + "sub_path": "filament/Snapmaker PLA Silk @J1 base.json" }, { - "name": "Generic PETG bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic PETG bambu @U1 0.2 nozzle.json" + "name": "Snapmaker PLA Silk @J1", + "sub_path": "filament/Snapmaker PLA Silk @J1.json" }, { - "name": "Generic PETG bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PETG bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Silk @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @J1 0.2 nozzle.json" }, { - "name": "Generic PETG bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PETG bambu @U1 0.6 nozzle.json" + "name": "PolyLite PLA @J1", + "sub_path": "filament/PolyLite PLA @J1.json" }, { - "name": "Generic PETG bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PETG bambu @U1 0.8 nozzle.json" + "name": "PolyLite PLA @J1 0.2 nozzle", + "sub_path": "filament/PolyLite PLA @J1 0.2 nozzle.json" }, { - "name": "Generic PETG HF bambu @base", - "sub_path": "filament/Generic PETG HF bambu @base.json" + "name": "PolyTerra PLA @J1", + "sub_path": "filament/PolyTerra PLA @J1.json" }, { - "name": "Generic PETG HF bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic PETG HF bambu @U1 0.2 nozzle.json" + "name": "PolyTerra PLA @J1 0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @J1 0.2 nozzle.json" }, { - "name": "Generic PETG HF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PETG HF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PVA @J1 base", + "sub_path": "filament/Snapmaker PVA @J1 base.json" }, { - "name": "Generic PETG HF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PETG HF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PVA @J1", + "sub_path": "filament/Snapmaker PVA @J1.json" }, { - "name": "Generic PETG HF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PETG HF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PVA @J1 0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @J1 0.2 nozzle.json" }, { - "name": "Generic PETG-CF bambu @base", - "sub_path": "filament/Generic PETG-CF bambu @base.json" + "name": "Snapmaker TPU @J1 base", + "sub_path": "filament/Snapmaker TPU @J1 base.json" }, { - "name": "Generic PETG-CF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PETG-CF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker TPU @J1", + "sub_path": "filament/Snapmaker TPU @J1.json" }, { - "name": "Generic PETG-CF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PETG-CF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker TPU High-Flow @J1", + "sub_path": "filament/Snapmaker TPU High-Flow @J1.json" }, { - "name": "Generic PETG-CF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PETG-CF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker TPE @J1", + "sub_path": "filament/Snapmaker TPE @J1.json" }, { - "name": "Generic PHA bambu @base", - "sub_path": "filament/Generic PHA bambu @base.json" + "name": "Snapmaker ABS @Dual base", + "sub_path": "filament/Snapmaker ABS @Dual base.json" }, { - "name": "Generic PHA bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PHA bambu @U1 0.4 nozzle.json" + "name": "Snapmaker ABS @Dual", + "sub_path": "filament/Snapmaker ABS @Dual.json" }, { - "name": "Generic PHA bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PHA bambu @U1 0.6 nozzle.json" + "name": "Snapmaker ABS @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker ABS @Dual 0.2 nozzle.json" }, { - "name": "Generic PHA bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PHA bambu @U1 0.8 nozzle.json" + "name": "Snapmaker ABS @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker ABS @Dual 0.8 nozzle.json" }, { - "name": "Generic PLA bambu @base", - "sub_path": "filament/Generic PLA bambu @base.json" + "name": "Snapmaker ABS Benchy @Dual", + "sub_path": "filament/Snapmaker ABS Benchy @Dual.json" }, { - "name": "Generic PLA bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic PLA bambu @U1 0.2 nozzle.json" + "name": "Snapmaker ASA @Dual base", + "sub_path": "filament/Snapmaker ASA @Dual base.json" }, { - "name": "Generic PLA bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA bambu @U1 0.4 nozzle.json" + "name": "Snapmaker ASA @Dual", + "sub_path": "filament/Snapmaker ASA @Dual.json" }, { - "name": "Generic PLA bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA bambu @U1 0.6 nozzle.json" + "name": "Snapmaker ASA @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker ASA @Dual 0.2 nozzle.json" }, { - "name": "Generic PLA bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PA-CF @Dual base", + "sub_path": "filament/Snapmaker PA-CF @Dual base.json" }, { - "name": "Generic PLA High Speed bambu @base", - "sub_path": "filament/Generic PLA High Speed bambu @base.json" + "name": "Snapmaker PA-CF @Dual", + "sub_path": "filament/Snapmaker PA-CF @Dual.json" }, { - "name": "Generic PLA High Speed bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic PLA High Speed bambu @U1 0.2 nozzle.json" + "name": "Snapmaker PETG @Dual base", + "sub_path": "filament/Snapmaker PETG @Dual base.json" }, { - "name": "Generic PLA High Speed bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA High Speed bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PETG @Dual", + "sub_path": "filament/Snapmaker PETG @Dual.json" }, { - "name": "Generic PLA High Speed bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA High Speed bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PETG @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PETG @Dual 0.2 nozzle.json" }, { - "name": "Generic PLA High Speed bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA High Speed bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PETG @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PETG @Dual 0.8 nozzle.json" }, { - "name": "Generic PLA Silk bambu @base", - "sub_path": "filament/Generic PLA Silk bambu @base.json" + "name": "Snapmaker PET @Dual base", + "sub_path": "filament/Snapmaker PET @Dual base.json" }, { - "name": "Generic PLA Silk bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA Silk bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PET @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PET @Dual 0.8 nozzle.json" }, { - "name": "Generic PLA Silk bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA Silk bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PET @Dual", + "sub_path": "filament/Snapmaker PET @Dual.json" }, { - "name": "Generic PLA Silk bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA Silk bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PETG-CF @Dual base", + "sub_path": "filament/Snapmaker PETG-CF @Dual base.json" }, { - "name": "Generic PLA-CF bambu @base", - "sub_path": "filament/Generic PLA-CF bambu @base.json" + "name": "Snapmaker PETG-CF @Dual", + "sub_path": "filament/Snapmaker PETG-CF @Dual.json" }, { - "name": "Generic PLA-CF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA-CF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Eco @Dual base", + "sub_path": "filament/Snapmaker PLA Eco @Dual base.json" }, { - "name": "Generic PLA-CF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA-CF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA Eco @Dual", + "sub_path": "filament/Snapmaker PLA Eco @Dual.json" }, { - "name": "Generic PLA-CF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA-CF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA Eco @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @Dual 0.2 nozzle.json" }, { - "name": "Generic PP bambu @base", - "sub_path": "filament/Generic PP bambu @base.json" + "name": "Snapmaker PLA Eco @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA Eco @Dual 0.8 nozzle.json" }, { - "name": "Generic PP bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PP bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA @Dual base", + "sub_path": "filament/Snapmaker PLA @Dual base.json" }, { - "name": "Generic PP bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PP bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA @Dual", + "sub_path": "filament/Snapmaker PLA @Dual.json" }, { - "name": "Generic PP bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PP bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA Matte @Dual", + "sub_path": "filament/Snapmaker PLA Matte @Dual.json" }, { - "name": "Generic PP-CF bambu @base", - "sub_path": "filament/Generic PP-CF bambu @base.json" + "name": "Snapmaker PLA Metal @Dual base", + "sub_path": "filament/Snapmaker PLA Metal @Dual base.json" }, { - "name": "Generic PP-CF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PP-CF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Metal @Dual", + "sub_path": "filament/Snapmaker PLA Metal @Dual.json" }, { - "name": "Generic PP-CF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PP-CF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA Metal @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Metal @Dual 0.2 nozzle.json" }, { - "name": "Generic PP-CF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PP-CF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA-CF @Dual base", + "sub_path": "filament/Snapmaker PLA-CF @Dual base.json" }, { - "name": "Generic PP-GF bambu @base", - "sub_path": "filament/Generic PP-GF bambu @base.json" + "name": "Snapmaker PLA-CF @Dual", + "sub_path": "filament/Snapmaker PLA-CF @Dual.json" }, { - "name": "Generic PP-GF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PP-GF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA-CF @Dual 0.8 nozzle", + "sub_path": "filament/Snapmaker PLA-CF @Dual 0.8 nozzle.json" }, { - "name": "Generic PP-GF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PP-GF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA Silk @Dual base", + "sub_path": "filament/Snapmaker PLA Silk @Dual base.json" }, { - "name": "Generic PP-GF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PP-GF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA Silk @Dual", + "sub_path": "filament/Snapmaker PLA Silk @Dual.json" }, { - "name": "Generic PPA-CF bambu @base", - "sub_path": "filament/Generic PPA-CF bambu @base.json" + "name": "Snapmaker PLA Silk @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PLA Silk @Dual 0.2 nozzle.json" }, { - "name": "Generic PPA-CF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PPA-CF bambu @U1 0.4 nozzle.json" + "name": "PolyLite PLA @Dual", + "sub_path": "filament/PolyLite PLA @Dual.json" }, { - "name": "Generic PPA-CF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PPA-CF bambu @U1 0.6 nozzle.json" + "name": "PolyLite PLA @Dual 0.2 nozzle", + "sub_path": "filament/PolyLite PLA @Dual 0.2 nozzle.json" }, { - "name": "Generic PPA-CF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PPA-CF bambu @U1 0.8 nozzle.json" + "name": "PolyTerra PLA @Dual", + "sub_path": "filament/PolyTerra PLA @Dual.json" }, { - "name": "Generic PPA-GF bambu @base", - "sub_path": "filament/Generic PPA-GF bambu @base.json" + "name": "PolyTerra PLA @Dual 0.2 nozzle", + "sub_path": "filament/PolyTerra PLA @Dual 0.2 nozzle.json" }, { - "name": "Generic PPA-GF bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PPA-GF bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PVA @Dual base", + "sub_path": "filament/Snapmaker PVA @Dual base.json" }, { - "name": "Generic PPA-GF bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PPA-GF bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PVA @Dual", + "sub_path": "filament/Snapmaker PVA @Dual.json" }, { - "name": "Generic PPA-GF bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PPA-GF bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PVA @Dual 0.2 nozzle", + "sub_path": "filament/Snapmaker PVA @Dual 0.2 nozzle.json" }, { - "name": "Generic PVA bambu @base", - "sub_path": "filament/Generic PVA bambu @base.json" + "name": "Snapmaker TPU @Dual base", + "sub_path": "filament/Snapmaker TPU @Dual base.json" }, { - "name": "Generic PVA bambu @U1 0.2 nozzle", - "sub_path": "filament/Generic PVA bambu @U1 0.2 nozzle.json" + "name": "Snapmaker TPU @Dual", + "sub_path": "filament/Snapmaker TPU @Dual.json" }, { - "name": "Generic PVA bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic PVA bambu @U1 0.4 nozzle.json" + "name": "Snapmaker TPU High-Flow @Dual", + "sub_path": "filament/Snapmaker TPU High-Flow @Dual.json" }, { - "name": "Generic PVA bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic PVA bambu @U1 0.6 nozzle.json" + "name": "Snapmaker TPE @Dual", + "sub_path": "filament/Snapmaker TPE @Dual.json" }, { - "name": "Generic PVA bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic PVA bambu @U1 0.8 nozzle.json" + "name": "Snapmaker Breakaway Support @base", + "sub_path": "filament/Snapmaker Breakaway Support @base.json" }, { - "name": "Generic TPU bambu @base", - "sub_path": "filament/Generic TPU bambu @base.json" + "name": "Snapmaker Breakaway Support", + "sub_path": "filament/Snapmaker Breakaway Support.json" }, { - "name": "Generic TPU bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic TPU bambu @U1 0.4 nozzle.json" + "name": "Snapmaker Breakaway Support @J1", + "sub_path": "filament/Snapmaker Breakaway Support @J1.json" }, + + + + + + { - "name": "Generic TPU bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic TPU bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA @U1 base", + "sub_path": "filament/Snapmaker PLA @U1 base.json" }, { - "name": "Generic TPU bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic TPU bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA Eco @U1 base", + "sub_path": "filament/Snapmaker PLA Eco @U1 base.json" }, { - "name": "Generic TPU for AMS bambu @base", - "sub_path": "filament/Generic TPU for AMS bambu @base.json" + "name": "Snapmaker PLA Matte", + "sub_path": "filament/Snapmaker PLA Matte.json" }, { - "name": "Generic TPU for AMS bambu @U1 0.4 nozzle", - "sub_path": "filament/Generic TPU for AMS bambu @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Matte @U1 base", + "sub_path": "filament/Snapmaker PLA Matte @U1 base.json" }, { - "name": "Generic TPU for AMS bambu @U1 0.6 nozzle", - "sub_path": "filament/Generic TPU for AMS bambu @U1 0.6 nozzle.json" + "name": "Snapmaker PLA Matte @U1", + "sub_path": "filament/Snapmaker PLA Matte @U1.json" }, { - "name": "Generic TPU for AMS bambu @U1 0.8 nozzle", - "sub_path": "filament/Generic TPU for AMS bambu @U1 0.8 nozzle.json" + "name": "Snapmaker PLA Basic @U1 base", + "sub_path": "filament/Snapmaker PLA Basic @U1 base.json" }, - - - - - { - "name": "Generic PLA @U1 0.2 nozzle", - "sub_path": "filament/Generic PLA @U1 0.2 nozzle.json" + "name": "Snapmaker PLA Basic @U1", + "sub_path": "filament/Snapmaker PLA Basic @U1.json" }, { - "name": "Generic PLA @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA @U1 0.4 nozzle.json" + "name": "Snapmaker PLA SnapSpeed @base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @base.json" }, { - "name": "Generic PLA @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA @U1 0.6 nozzle.json" - }, - { - "name": "Generic PLA @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA @U1 0.8 nozzle.json" + "name": "Snapmaker PLA SnapSpeed", + "sub_path": "filament/Snapmaker PLA SnapSpeed.json" }, - - { - "name": "Generic PLA High Speed test @U1 0.2 nozzle", - "sub_path": "filament/Generic PLA High Speed @U1 0.2 nozzle.json" + "name": "Snapmaker PLA SnapSpeed @J1", + "sub_path": "filament/Snapmaker PLA SnapSpeed @J1.json" }, { - "name": "Generic PLA High Speed @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA High Speed @U1 0.4 nozzle.json" + "name": "Snapmaker PLA SnapSpeed @Dual", + "sub_path": "filament/Snapmaker PLA SnapSpeed @Dual.json" }, { - "name": "Generic PLA High Speed @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA High Speed @U1 0.6 nozzle.json" + "name": "Snapmaker PLA SnapSpeed @U1 base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" }, { - "name": "Generic PLA High Speed @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA High Speed @U1 0.8 nozzle.json" + "name": "Snapmaker PLA SnapSpeed @U1 base", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1 base.json" }, - { - "name": "Generic PLA-CF test @U1 0.2 nozzle", - "sub_path": "filament/Generic PLA-CF @U1 0.2 nozzle.json" + "name": "Snapmaker PLA SnapSpeed @U1", + "sub_path": "filament/Snapmaker PLA SnapSpeed @U1.json" }, { - "name": "Generic PLA-CF @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA-CF @U1 0.4 nozzle.json" + "name": "Snapmaker PLA Metal @U1 base", + "sub_path": "filament/Snapmaker PLA Metal @U1 base.json" }, { - "name": "Generic PLA-CF @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA-CF @U1 0.6 nozzle.json" + "name": "Snapmaker PLA Silk @U1 base", + "sub_path": "filament/Snapmaker PLA Silk @U1 base.json" }, { - "name": "Generic PLA-CF @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA-CF @U1 0.8 nozzle.json" + "name": "Snapmaker TPU 95A HF @U1", + "sub_path": "filament/Snapmaker TPU 95A HF @U1.json" }, - { - "name": "Generic PLA Silk @U1 0.2 nozzle", - "sub_path": "filament/Generic PLA Silk @U1 0.2 nozzle.json" + "name": "Snapmaker PLA-CF @U1 base", + "sub_path": "filament/Snapmaker PLA-CF @U1 base.json" }, { - "name": "Generic PLA Silk @U1 0.4 nozzle", - "sub_path": "filament/Generic PLA Silk @U1 0.4 nozzle.json" + "name": "Snapmaker PVA @U1 base", + "sub_path": "filament/Snapmaker PVA @U1 base.json" }, { - "name": "Generic PLA Silk @U1 0.6 nozzle", - "sub_path": "filament/Generic PLA Silk @U1 0.6 nozzle.json" + "name": "Snapmaker TPU @U1 base", + "sub_path": "filament/Snapmaker TPU @U1 base.json" }, - { - "name": "Generic PLA Silk @U1 0.8 nozzle", - "sub_path": "filament/Generic PLA Silk @U1 0.8 nozzle.json" + { + "name": "Snapmaker TPU 95A @U1 base", + "sub_path":"filament/Snapmaker TPU 95A @U1 base.json" }, - - - + { - "name": "fdm_filament_common_poly_test", - "sub_path": "filament/fdm_filament_common_poly_test.json" + "name": "fdm_filament_common_poly", + "sub_path": "filament/fdm_filament_common_poly.json" }, { - "name": "fdm_filament_pla_poly_test", - "sub_path": "filament/fdm_filament_pla_poly_test.json" + "name": "fdm_filament_pla_poly", + "sub_path": "filament/fdm_filament_pla_poly.json" }, { "name": "Polymaker PLA @U1 base", @@ -2336,12 +1348,6 @@ "name": "Polymaker Tough PLA Family @U1", "sub_path": "filament/Polymaker Tough PLA Family @U1.json" } - - - - - - ], "machine_list": [ { @@ -2712,22 +1718,10 @@ "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.4 nozzle)", "sub_path": "machine/Snapmaker U1 (0.4 nozzle).json" }, - { - "name": "Snapmaker U1 (0.6 nozzle)", - "sub_path": "machine/Snapmaker U1 (0.6 nozzle).json" - }, - { - "name": "Snapmaker U1 (0.8 nozzle)", - "sub_path": "machine/Snapmaker U1 (0.8 nozzle).json" - }, { "name": "Snapmaker Artisan (0.2 nozzle)", "sub_path": "machine/Snapmaker Artisan (0.2 nozzle).json" diff --git a/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json b/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json index 2caa3f3063c..51fed0524c1 100644 --- a/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json +++ b/resources/profiles/Snapmaker/filament/Generic PETG HF @base.json @@ -11,6 +11,9 @@ "cool_plate_temp_initial_layer": [ "0" ], + "filament_type": [ + "PETG" + ], "eng_plate_temp": [ "70" ], diff --git a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json index ad81f2d79d2..34e7d04d3d4 100644 --- a/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/PolyLite PLA @U1.json @@ -7,5 +7,8 @@ "inherits": "PolyLite PLA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json index f77d1d80825..10ae30494b8 100644 --- a/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/PolyTerra PLA @U1.json @@ -7,5 +7,8 @@ "inherits": "PolyTerra PLA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json index 6cceb35a52c..2f40e7170ea 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker General PLA Family @U1.json @@ -25,5 +25,11 @@ ], "temperature_vitrification": [ "62" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json index bb30b05f055..94008ddd0c3 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json +++ b/resources/profiles/Snapmaker/filament/Polymaker PLA @U1 base.json @@ -1,7 +1,7 @@ { "type": "filament", "name": "Polymaker PLA @U1 base", - "inherits": "fdm_filament_pla_poly_test", + "inherits": "fdm_filament_pla_poly", "from": "system", "setting_id": "OGFSA04", "instantiation": "false", diff --git a/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json index 65f20d02714..8eb48fdc722 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker Silk PLA Family @U1.json @@ -25,5 +25,11 @@ ], "nozzle_temperature_range_high": [ "230" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json index c3de9b60035..8039e284167 100644 --- a/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json +++ b/resources/profiles/Snapmaker/filament/Polymaker Tough PLA Family @U1.json @@ -25,5 +25,11 @@ ], "temperature_vitrification": [ "55" + ], + "textured_plate_temp": [ + "65" + ], + "textured_plate_temp_initial_layer": [ + "65" ] } diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json index 8e6cf258492..e5aa9bd44a6 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker ABS @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json index 0e791164d75..fdec66fc05d 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ABS Benchy @U1.json @@ -11,6 +11,9 @@ "compatible_prints": [ "0.25 Benchy @Snapmaker U1 (0.4 nozzle)" ], + "enable_pressure_advance": [ + "0" + ], "overhang_fan_speed": [ "35" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json index d1f75890545..0472b593ba4 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker ASA @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker ASA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json index 163bb5c6281..32c20b1f21a 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker Breakaway Support For PLA @U1.json @@ -10,5 +10,8 @@ ], "filament_type": [ "PLA" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json index 80ef97e3084..6fefdfc885d 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PA-CF @U1.json @@ -9,5 +9,8 @@ "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json index 79da9ec77e9..2309eb767fb 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PET @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PET @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json index a45967876d0..14f636d0887 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PETG @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json index 19ca1db4991..9ca5d526199 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PETG-CF @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PETG-CF @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json index d92a90178e8..cc7c3a37fda 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA @U1.json @@ -8,6 +8,9 @@ "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" ], + "enable_pressure_advance": [ + "0" + ], "hot_plate_temp":[ "55" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json index 03c51c7ff62..c27ad00a44c 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Eco @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PLA Eco @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json index fec713c9be4..dfd5dcf1ffc 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Metal @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PLA Metal @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json index d67a1f3badb..7d0e0e2eda3 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA Silk @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PLA Silk @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json index 7a870c11cf0..8d278db626b 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PLA-CF @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PLA-CF @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json index e4622e6bfd3..a544fb2998a 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker PVA @U1.json @@ -7,5 +7,8 @@ "inherits": "Snapmaker PVA @U1 base", "compatible_printers": [ "Snapmaker U1 (0.4 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json index 841a3583ebb..5d0025cde33 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPE @U1.json @@ -17,6 +17,9 @@ "overhang_fan_speed": [ "65" ], + "enable_pressure_advance": [ + "0" + ], "filament_flow_ratio": [ "1.1" ], diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json index 1d00d0800d9..4fbf9bf11c2 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU @U1.json @@ -9,5 +9,8 @@ "Snapmaker U1 (0.4 nozzle)", "Snapmaker U1 (0.6 nozzle)", "Snapmaker U1 (0.8 nozzle)" + ], + "enable_pressure_advance": [ + "0" ] } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json b/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json index bbfd209a0a3..0b93618885a 100644 --- a/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json +++ b/resources/profiles/Snapmaker/filament/Snapmaker TPU High-Flow @U1.json @@ -10,6 +10,9 @@ "Snapmaker U1 (0.6 nozzle)", "Snapmaker U1 (0.8 nozzle)" ], + "enable_pressure_advance": [ + "0" + ], "filament_flow_ratio": [ "0.983" ], diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json index 9c6b1ea6ce7..070399c9cec 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1 (0.4 nozzle).json @@ -193,13 +193,12 @@ "0", "0" ], - "default_print_profile": "0.20 Standard @Snapmaker U1 (0.4 nozzle)", "ramming_pressure_advance_value": "0.02", + "default_print_profile": "0.20 Standard @Snapmaker U1 (0.4 nozzle)", "tool_change_temprature_wait": "0", "printer_notes": "", "machine_pause_gcode": "M600", "default_bed_type": "Textured PEI Plate", "layer_change_gcode": ";AFTER_LAYER_CHANGE\n;[layer_z]\nSET_PRINT_STATS_INFO TOTAL_LAYER={total_layer_count} CURRENT_LAYER={layer_num+1}", - "nozzle_volume": "143", - "support_multi_bed_types": "1" + "nozzle_volume": "143" } \ No newline at end of file diff --git a/resources/profiles/Snapmaker/machine/Snapmaker U1.json b/resources/profiles/Snapmaker/machine/Snapmaker U1.json index a17bc1246e0..601a6ab4ffc 100644 --- a/resources/profiles/Snapmaker/machine/Snapmaker U1.json +++ b/resources/profiles/Snapmaker/machine/Snapmaker U1.json @@ -4,10 +4,10 @@ "family": "Snapmaker", "name": "Snapmaker U1", "url": "https://github.com/macdylan", - "model_id": "797581801", + "model_id": "SM_U1", "bed_model": "Snapmaker U1_bed.stl", "bed_texture": "Snapmaker U1_texture.svg", - "nozzle_diameter": "0.2;0.4;0.6;0.8" + "nozzle_diameter": "0.4" } diff --git a/resources/profiles/Snapmaker/machine/fdm_U1.json b/resources/profiles/Snapmaker/machine/fdm_U1.json index 9ed8c453133..f2a119b4a4e 100644 --- a/resources/profiles/Snapmaker/machine/fdm_U1.json +++ b/resources/profiles/Snapmaker/machine/fdm_U1.json @@ -183,5 +183,6 @@ "machine_start_gcode": "PRINT_START TOOL_TEMP={first_layer_temperature[initial_tool]} {if is_extruder_used[0]}T0_TEMP={first_layer_temperature[0]}{endif} {if is_extruder_used[1]}T1_TEMP={first_layer_temperature[1]}{endif} {if is_extruder_used[2]}T2_TEMP={first_layer_temperature[2]}{endif} {if is_extruder_used[3]}T3_TEMP={first_layer_temperature[3]}{endif} {if is_extruder_used[4]}T4_TEMP={first_layer_temperature[4]}{endif} {if is_extruder_used[5]}T5_TEMP={first_layer_temperature[5]}{endif} BED_TEMP=[first_layer_bed_temperature] TOOL=[initial_tool]\n\nM83\n; set extruder temp\n{if first_layer_temperature[0] > 0 and (is_extruder_used[0])}M104 T0 S{first_layer_temperature[0]}{endif}\n{if first_layer_temperature[1] > 0 and (is_extruder_used[1])}M104 T1 S{first_layer_temperature[1]}{endif}\n{if first_layer_temperature[2] > 0 and (is_extruder_used[2])}M104 T2 S{first_layer_temperature[2]}{endif}\n{if first_layer_temperature[3] > 0 and (is_extruder_used[3])}M104 T3 S{first_layer_temperature[3]}{endif}\n{if first_layer_temperature[4] > 0 and (is_extruder_used[4])}M104 T4 S{first_layer_temperature[4]}{endif}\n{if (is_extruder_used[0]) and initial_tool != 0}\n;\n; purge first tool\n;\nG1 F{travel_speed * 60}\nM109 T0 S{first_layer_temperature[0]}\nT0; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(0 == 0 ? 0 : (0 == 1 ? 120 : (0 == 2 ? 180 : 300)))} Y{(0 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[0]}10{else}30{endif} X40 Z0.2 F{if filament_multitool_ramming[0]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X40 E9 F800 ; continue purging and wipe the nozzle\nG0 X{40 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{40 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[0]} F2400 ; retract\n{e_retracted[0] = 1.5 * retract_length[0]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[0] == 0 ? (first_layer_temperature[0] + standby_temperature_delta) : (idle_temperature[0]))} T0\n{endif}\n{if (is_extruder_used[1]) and initial_tool != 1}\n;\n; purge second tool\n;\nG1 F{travel_speed * 60}\nM109 T1 S{first_layer_temperature[1]}\nT1; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(1 == 0 ? 0 : (1 == 1 ? 120 : (1 == 2 ? 180 : 300)))} Y{(1 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[1]}10{else}30{endif} X120 Z0.2 F{if filament_multitool_ramming[1]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X80 E9 F800 ; continue purging and wipe the nozzle\nG0 X{80 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{80 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[1]} F2400 ; retract\n{e_retracted[1] = 1.5 * retract_length[1]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[1] == 0 ? (first_layer_temperature[1] + standby_temperature_delta) : (idle_temperature[1]))} T1\n{endif}\n{if (is_extruder_used[2]) and initial_tool != 2}\n;\n; purge third tool\n;\nG1 F{travel_speed * 60}\nM109 T2 S{first_layer_temperature[2]}\nT2; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(2 == 0 ? 0 : (2 == 1 ? 120 : (2 == 2 ? 180 : 300)))} Y{(2 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[2]}10{else}30{endif} X220 Z0.2 F{if filament_multitool_ramming[2]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X220 E9 F800 ; continue purging and wipe the nozzle\nG0 X{220 + 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{220 + 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[2]} F2400 ; retract\n{e_retracted[2] = 1.5 * retract_length[2]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[2] == 0 ? (first_layer_temperature[2] + standby_temperature_delta) : (idle_temperature[2]))} T2\n{endif}\n{if (is_extruder_used[3]) and initial_tool != 3}\n;\n; purge fourth tool\n;\nG1 F{travel_speed * 60}\nM109 T3 S{first_layer_temperature[3]}\nT3; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(3 == 0 ? 0 : (3 == 1 ? 120 : (3 == 2 ? 180 : 300)))} Y{(3 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[3]}10{else}30{endif} X290 Z0.2 F{if filament_multitool_ramming[3]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X260 E9 F800 ; continue purging and wipe the nozzle\nG0 X{260 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{260 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[3]} F2400 ; retract\n{e_retracted[3] = 1.5 * retract_length[3]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[3] == 0 ? (first_layer_temperature[3] + standby_temperature_delta) : (idle_temperature[3]))} T3\n{endif}\n{if (is_extruder_used[4]) and initial_tool != 4}\n;\n; purge fifth tool\n;\nG1 F{travel_speed * 60}\nM109 T4 S{first_layer_temperature[4]}\nT4; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(4 == 0 ? 0 : (4 == 1 ? 120 : (4 == 2 ? 180 : 300)))} Y{(4 < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[4]}10{else}30{endif} X290 Z0.2 F{if filament_multitool_ramming[4]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X260 E9 F800 ; continue purging and wipe the nozzle\nG0 X{260 - 3} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{260 - 3 * 2} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[4]} F2400 ; retract\n{e_retracted[4] = 1.5 * retract_length[4]} ; update slicer internal retract variable\nG92 E0 ; reset extruder position\n\nM104 S{(idle_temperature[4] == 0 ? (first_layer_temperature[4] + standby_temperature_delta) : (idle_temperature[4]))} T4\n{endif}\n;\n; purge initial tool\n;\nG1 F{travel_speed * 60}\nM109 T{initial_tool} S{first_layer_temperature[initial_tool]}\nT{initial_tool}; pick the tool\nG92 E0 ; reset extruder position\n\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300)))} Y{(initial_tool < 4 ? 0 : 3)} Z10 F{(travel_speed * 60)} ; move close to the sheet's edge\nG0 E{if filament_multitool_ramming[initial_tool]}10{else}30{endif} X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 10)} Z0.2 F{if filament_multitool_ramming[initial_tool]}500{else}170{endif} ; purge while moving towards the sheet\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40)} E9 F800 ; continue purging and wipe the nozzle\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 3)} Z{0.05} F{8000} ; wipe, move close to the bed\nG0 X{(initial_tool == 0 ? 0 : (initial_tool == 1 ? 120 : (initial_tool == 2 ? 180 : 300))) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 40) + ((initial_tool == 0 or initial_tool == 2 ? 1 : -1) * 3 * 2)} Z0.2 F{8000} ; wipe, move quickly away from the bed\nG1 E{- 1.5 * retract_length[initial_tool]} F2400 ; retract\n{e_retracted[initial_tool] = 1.5 * retract_length[initial_tool]}\nG92 E0 ; reset extruder position\n", "scan_first_layer": "0", "nozzle_type": "undefine", - "auxiliary_fan": "0" + "auxiliary_fan": "0", + "default_bed_type": "Textured PEI Plate" } \ No newline at end of file From 35b7b9dc31e99dcb9733ec87cbc71795c1795df1 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 1 Apr 2026 15:55:50 +0800 Subject: [PATCH 26/46] feature remove not work code. --- src/libslic3r/Print.cpp | 51 ----------------------------------------- 1 file changed, 51 deletions(-) diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 039d0470dbc..0b5e8e6a69f 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -512,57 +512,6 @@ void Print::filament_rule_mismatch_flags(std::string& out_nozzle, bool& out_gesp out_pei_not_pla = rules.evaluate_pei_bed_filament_mismatch_not_pla(m_config, used); } - -// This must be called before the mapping is used (e.g., before export_gcode) -void Print::initialize_filament_extruder_map() -{ - m_filament_extruder_map.clear(); - - // Get the number of physical extruders (number of nozzle_diameter entries) - size_t physical_extruder_count = m_config.nozzle_diameter.values.size(); - - if (physical_extruder_count == 0) { - BOOST_LOG_TRIVIAL(error) << "Print::initialize_filament_extruder_map: ERROR - No physical extruders configured!"; - return; - } - - // Get all filament indices that will be used - std::vector filament_extruders = this->extruders(); - - // IMPORTANT: Always create mappings for ALL configured filaments, not just those used by objects. - // This is critical because filament override parameters need to access the mapping for all filaments. - // For example, if a user has 8 filaments configured but only uses 4 in their model, - // the mapping table must still contain entries for all 8 filaments to correctly - // inherit parameters from the corresponding physical extruders. - // extruders() returns empty. In this case, use filament_diameter.size() to determine filament count. - // This ensures the mapping is created for all configured filaments, not just those used by objects. - if (filament_extruders.empty()) { - size_t filament_count = m_config.filament_diameter.size(); - for (size_t i = 0; i < filament_count; ++i) { - filament_extruders.push_back((unsigned int)i); - } - } else { - // Even if extruders() returns some values, we need to ensure ALL configured filaments are in the map. - // Add any missing filament indices that are configured but not used by objects. - size_t configured_filament_count = m_config.filament_diameter.size(); - for (size_t i = 0; i < configured_filament_count; ++i) { - if (std::find(filament_extruders.begin(), filament_extruders.end(), (unsigned int)i) == filament_extruders.end()) { - filament_extruders.push_back((unsigned int)i); - } - } - } - - // Create mapping: filament_id -> physical_extruder_id - // Mapping formula: physical_extruder = filament_id % physical_extruder_count - // This allows using 8 filaments with 4 physical extruders: - // filament 0,1,2,3 -> extruder 0,1,2,3 - // filament 4,5,6,7 -> extruder 0,1,2,3 - for (unsigned int filament_idx : filament_extruders) { - int physical_extruder = filament_idx % physical_extruder_count; - m_filament_extruder_map[filament_idx] = physical_extruder; - } -} - unsigned int Print::num_object_instances() const { unsigned int instances = 0; From dcac89842ff18f0379977aeed00a33cc3e093f25 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 1 Apr 2026 15:57:28 +0800 Subject: [PATCH 27/46] feature add config for tips on filament. --- .../filament/filament_hot_bed_nozzles.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json diff --git a/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json b/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json new file mode 100644 index 00000000000..0156884a77f --- /dev/null +++ b/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json @@ -0,0 +1,15 @@ +{ + "btPEI": { + "support":["PLA"], + "warning":["TPU"] + }, + "btGESP": { + "support": ["PLA","TPU"] + }, + "0.2mm": { + "forbidden": [ + "Snapmaker TPU 95A HF", + "Snapmaker TPU 95A" + ] + } +} From ebb8b5b94e9ec1b6148d463e84850fa48a2ddfef Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 1 Apr 2026 19:38:50 +0800 Subject: [PATCH 28/46] feature add nozzle changed and tips filament relations for slice. --- src/libslic3r/FilamentHotBedNozzleRules.cpp | 78 +++++++++++++++++---- src/libslic3r/FilamentHotBedNozzleRules.hpp | 13 ++-- src/libslic3r/PresetBundle.cpp | 2 +- src/libslic3r/Print.cpp | 8 ++- src/libslic3r/Print.hpp | 8 ++- src/slic3r/GUI/MainFrame.cpp | 1 - src/slic3r/GUI/Plater.cpp | 11 +-- 7 files changed, 92 insertions(+), 29 deletions(-) diff --git a/src/libslic3r/FilamentHotBedNozzleRules.cpp b/src/libslic3r/FilamentHotBedNozzleRules.cpp index e66972dfa7a..55807b9afa5 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.cpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.cpp @@ -1,11 +1,15 @@ #include "FilamentHotBedNozzleRules.hpp" #include "Config.hpp" +#include "Preset.hpp" +#include "PresetBundle.hpp" #include "Utils.hpp" +#include #include #include #include #include +#include #include #include @@ -40,6 +44,26 @@ bool match_any_rule_token_ci(const std::unordered_set& tokens, cons return false; } +// Resolve filament_settings_id entry: may store preset display name or cloud setting_id / base_id. +static std::string resolve_filament_preset_full_name(const std::string& stored, const PresetCollection* filaments) +{ + if (stored.empty() || filaments == nullptr) + return stored; + if (const Preset* by_name = filaments->find_preset(stored, false)) + return by_name->name; + for (const Preset& preset : filaments->get_presets()) { + if (preset.type != Preset::TYPE_FILAMENT) + continue; + if (!preset.setting_id.empty() && preset.setting_id == stored) + return preset.name; + if (!preset.base_id.empty() && preset.base_id == stored) + return preset.name; + if (!preset.filament_id.empty() && preset.filament_id == stored) + return preset.name; + } + return stored; +} + bool is_pla_type(const std::string& filament_type) { return contains_token_ci(filament_type, "PLA"); @@ -183,28 +207,58 @@ bool FilamentHotBedNozzleRules::is_nozzle_filament_forbidden(const std::string& std::scoped_lock lock(m_mutex); auto it = m_nozzle_forbidden_filament_presets.find(nozzle_key); bool res = false; - res = (it != m_nozzle_forbidden_filament_presets.end() && it->second.find(filament_preset_name) != it->second.end()); + if (it == m_nozzle_forbidden_filament_presets.end()) + return false; + + for (auto iter = it->second.begin(); iter != it->second.end();++iter) + { + std::string filamentData = iter->c_str(); + if (filament_preset_name.find(filamentData) != std::string::npos) + return true; + } + //res = (it != m_nozzle_forbidden_filament_presets.end() && it->second.find(filament_preset_name) != it->second.end()); + return res; } -std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const +std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, + const std::vector& used_filament_indices, + const PresetBundle* preset_bundle) const { std::scoped_lock lock(m_mutex); if (!m_loaded || used_filament_indices.empty()) return ""; - std::string nozzle_key; - if (!cfg.nozzle_diameter.empty()) - nozzle_key = nozzle_diameter_to_filament_rule_key(cfg.nozzle_diameter.get_at(0)); - if (nozzle_key.empty()) - return ""; - const ConfigOptionStrings* filament_settings_id = cfg.option("filament_settings_id"); + const PresetCollection* filament_collection = preset_bundle != nullptr ? &preset_bundle->filaments : nullptr; + for (unsigned int fid : used_filament_indices) { - std::string preset_name; - if (filament_settings_id != nullptr && !filament_settings_id->values.empty()) - preset_name = filament_settings_id->get_at(fid); - if (is_nozzle_filament_forbidden(nozzle_key, preset_name)) + std::string nozzle_key_fid; + if (!cfg.nozzle_diameter.empty()) { + const unsigned int nd_idx = std::min(fid, unsigned(cfg.nozzle_diameter.size() - 1)); + nozzle_key_fid = nozzle_diameter_to_filament_rule_key(cfg.nozzle_diameter.get_at(nd_idx)); + } + if (nozzle_key_fid.empty()) + continue; + + std::string stored; + if (preset_bundle != nullptr && fid < preset_bundle->filament_presets.size()) { + stored = preset_bundle->filament_presets[fid]; + boost::algorithm::trim(stored); + } + if (stored.empty() && filament_settings_id != nullptr && fid < filament_settings_id->values.size()) + stored = filament_settings_id->get_at(fid); + boost::algorithm::trim(stored); + + std::string normalized = stored; + if (preset_bundle != nullptr && !normalized.empty()) { + const std::string trimmed = Preset::remove_suffix_modified(normalized); + const std::string& by_alias = preset_bundle->get_preset_name_by_alias(Preset::TYPE_FILAMENT, trimmed); + normalized.assign(by_alias); + } + + const std::string preset_name = resolve_filament_preset_full_name(normalized, filament_collection); + if (is_nozzle_filament_forbidden(nozzle_key_fid, preset_name)) return preset_name.empty() ? "forbidden filament preset for current nozzle" : preset_name; } diff --git a/src/libslic3r/FilamentHotBedNozzleRules.hpp b/src/libslic3r/FilamentHotBedNozzleRules.hpp index 02121a34ae6..f988dcec973 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.hpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.hpp @@ -11,6 +11,8 @@ namespace Slic3r { +class PresetBundle; + // JSON: resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json // Keys: bed ids (btPEI, btGESP), nozzle ids ("0.2mm"), each with support/warning/forbidden arrays. class FilamentHotBedNozzleRules @@ -31,16 +33,15 @@ class FilamentHotBedNozzleRules bool is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const; bool is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const; bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const; + + std::string evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, + const std::vector& used_filament_indices, + const PresetBundle* preset_bundle = nullptr) const; - // ① 喷嘴规格 vs 耗材:仅 JSON 中喷嘴直径键(如 "0.2mm")的 "forbidden" 预设名;与当前热床类型无关。 - std::string evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const; - - // ② 特效热床(Graphic Effect / btGESP):仅当 curr_bed_type==btGESP 时校验;使用 JSON 键 "btGESP" 的 support/warning。 + bool evaluate_graphic_effect_bed_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const; - // ③ 光面 PEI 热床(btPEI):仅当 curr_bed_type==btPEI 时校验;使用 JSON 键 "btPEI"。 - // 非 PLA 材料由 support 列表约束;TPU 等由 warning 列表单独提示(warning 仍算“可用但需提示”)。 bool evaluate_pei_bed_filament_mismatch_not_pla(const PrintConfig& cfg, const std::vector& used_filament_indices) const; bool evaluate_pei_bed_filament_mismatch_tpu(const PrintConfig& cfg, const std::vector& used_filament_indices) const; diff --git a/src/libslic3r/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp index 407b6bf740e..a21f83daab2 100644 --- a/src/libslic3r/PresetBundle.cpp +++ b/src/libslic3r/PresetBundle.cpp @@ -45,7 +45,7 @@ static std::vector s_project_options { // SM_FEATURE: add Snapmaker machine as default const char* PresetBundle::SM_BUNDLE = "Snapmaker"; -const char* PresetBundle::SM_DEFAULT_PRINTER_MODEL = "Snapmaker U1(0.4 nozzle)"; +const char* PresetBundle::SM_DEFAULT_PRINTER_MODEL = "Snapmaker U1"; const char* PresetBundle::SM_DEFAULT_PRINTER_VARIANT = "0.4"; const char* PresetBundle::SM_DEFAULT_FILAMENT = "Snapmaker PLA SnapSpeed"; const char *PresetBundle::ORCA_FILAMENT_LIBRARY = "OrcaFilamentLibrary"; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 0b5e8e6a69f..a00639223b8 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -499,12 +499,16 @@ std::vector Print::extruders(bool conside_custom_gcode) const return extruders; } -void Print::filament_rule_mismatch_flags(std::string& out_nozzle, bool& out_gesp, bool& out_pei_not_pla, bool& out_pei_tpu) const +void Print::filament_rule_mismatch_flags(std::string& out_nozzle, + bool& out_gesp, + bool& out_pei_not_pla, + bool& out_pei_tpu, + const PresetBundle* preset_bundle) const { FilamentHotBedNozzleRules::singleton().ensure_loaded(); const std::vector used = extruders(true); FilamentHotBedNozzleRules& rules = FilamentHotBedNozzleRules::singleton(); - out_nozzle = rules.evaluate_nozzle_filament_mismatch(m_config, used); + out_nozzle = rules.evaluate_nozzle_filament_mismatch(m_config, used, preset_bundle); out_gesp = rules.evaluate_graphic_effect_bed_filament_mismatch(m_config, used); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index dc35384dc41..9655414917d 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -23,6 +23,7 @@ #include #include +#include #include "calib.hpp" @@ -37,6 +38,8 @@ class SupportLayer; // BBS class TreeSupportData; class TreeSupport; +class PresetCollection; +class PresetBundle; #define MAX_OUTER_NOZZLE_DIAMETER 4 // BBS: move from PrintObjectSlice.cpp @@ -889,10 +892,11 @@ class Print : public PrintBaseWithState std::vector support_material_extruders() const; std::vector extruders(bool conside_custom_gcode = false) const; // On-demand evaluation vs filament_hot_bed_nozzles.json (calls extruders(true) once internally). - void filament_rule_mismatch_flags(std::string& out_nozzle, + void filament_rule_mismatch_flags(std::string& out_nozzle, bool& out_gesp, bool& out_pei_not_pla, - bool& out_pei_tpu) const; + bool& out_pei_tpu, + const PresetBundle* preset_bundle = nullptr) const; double max_allowed_layer_height() const; bool has_support_material() const; diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 56f83d5e422..75bbb90cfc5 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1526,7 +1526,6 @@ bool MainFrame::can_send_gcode() const if (m_plater && !m_plater->model().objects.empty()) { auto devices = wxGetApp().app_config->get_devices(); - std::string preset_name = "Snapmaker U1 0.4 nozzle"; const auto& edit_preset = wxGetApp().preset_bundle->printers.get_edited_preset(); auto printer_config = wxGetApp().preset_bundle->printers.get_edited_preset().config; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 21d36633681..c2a43f1525b 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6323,8 +6323,9 @@ void Plater::priv::notify_filament_compatibility_after_apply() std::string filamentNozzleMsg(""); bool isGraphicMatch(false), isPeiBedMatchNotPla(false), isPeiBedMatchTpu(false); - - print->filament_rule_mismatch_flags(filamentNozzleMsg, isGraphicMatch, isPeiBedMatchNotPla, isPeiBedMatchTpu); + + print->filament_rule_mismatch_flags(filamentNozzleMsg, isGraphicMatch, isPeiBedMatchNotPla, isPeiBedMatchTpu, + wxGetApp().preset_bundle); wxString filamentMismatchNozzleMsg = wxString(_L("The combination of hot end and consumables is not recommended. The message reads: Printing TPU 95A HF with 0.2mm hardened steel hot end is not recommended. We suggest using 0.4mm or larger.")); wxString filamentMismatchPeiBedMsgNotPla = wxString(_L("The current PEI glossy filament may have insufficient adhesion on the first layer of the heated bed. It is recommended to apply glue before printing to enhance adhesion.")); @@ -6339,12 +6340,12 @@ void Plater::priv::notify_filament_compatibility_after_apply() notification_manager->push_notification(filamentMismatchGraphicBedMsg.ToStdString(), 0); if (isPeiBedMatchNotPla) notification_manager->push_notification(filamentMismatchPeiBedMsgNotPla.ToStdString(), 0); - if (!filamentNozzleMsg.empty()) - notification_manager->push_notification(filamentMismatchNozzleMsg.ToStdString(), 0); - notification_manager->set_slicing_progress_hidden(); } + if (!filamentNozzleMsg.empty()) + notification_manager->push_notification(filamentMismatchNozzleMsg.ToStdString(), 0); + if (isPeiBedMatchTpu) { notification_manager->push_notification(filamentMismatchPeiBedMsgTpu.ToStdString(), 0); From 6a06009310b48772f0edb8fc0f9b548441686839 Mon Sep 17 00:00:00 2001 From: alves Date: Wed, 1 Apr 2026 21:10:57 +0800 Subject: [PATCH 29/46] feature add nozzle for filament tips. --- src/libslic3r/FilamentHotBedNozzleRules.cpp | 290 ++++++++++++++++++-- src/libslic3r/FilamentHotBedNozzleRules.hpp | 27 +- src/slic3r/GUI/GUI_App.cpp | 11 +- src/slic3r/GUI/GUI_App.hpp | 5 +- src/slic3r/GUI/Tab.cpp | 7 +- 5 files changed, 315 insertions(+), 25 deletions(-) diff --git a/src/libslic3r/FilamentHotBedNozzleRules.cpp b/src/libslic3r/FilamentHotBedNozzleRules.cpp index 55807b9afa5..b644ef70191 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.cpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.cpp @@ -5,11 +5,13 @@ #include "Utils.hpp" #include +#include #include #include #include #include #include +#include #include #include @@ -73,6 +75,214 @@ bool is_tpu_type(const std::string& filament_type) { return contains_token_ci(filament_type, "TPU"); } + +static bool ptree_key_is_array_index(const std::string& key) +{ + return !key.empty() && std::all_of(key.begin(), key.end(), [](unsigned char c) { return std::isdigit(c); }); +} + +// JSON array elements are usually keyed "0","1",…; some ptree representations use an empty key per element. +static bool ptree_key_is_array_element(const std::string& key) +{ + return key.empty() || ptree_key_is_array_index(key); +} + +// type: "all" | "undefine" | "hardened_steel" | "stainless_steel" | "brass" | ["brass","hardened_steel",...] +// Note: boost::ptree JSON leaves have no children, so node.empty() is true even when data() holds the string. +static void parse_nozzle_rule_type_field(const pt::ptree& rule_obj, FilamentHotBedNozzleRules::NozzleForbiddenBand& band) +{ + auto it = rule_obj.find("type"); + if (it == rule_obj.not_found()) { + band.applies_to_all_nozzle_types = true; + return; + } + const pt::ptree& tn = it->second; + std::string scalar = boost::trim_copy(tn.data()); + if (!scalar.empty()) { + boost::algorithm::to_lower(scalar); + if (scalar == "all") { + band.applies_to_all_nozzle_types = true; + return; + } + band.applies_to_all_nozzle_types = false; + band.nozzle_types.insert(std::move(scalar)); + return; + } + // JSON array: children keyed "0", "1", …; values live in leaf .data() (same empty() quirk per element). + band.applies_to_all_nozzle_types = false; + for (const auto& ch : tn) { + if (!ptree_key_is_array_element(ch.first)) + continue; + std::string v = boost::trim_copy(ch.second.data()); + boost::algorithm::to_lower(v); + if (!v.empty()) + band.nozzle_types.insert(std::move(v)); + } + if (band.nozzle_types.empty()) + band.applies_to_all_nozzle_types = true; +} + +static void parse_forbidden_from_array_tree(const pt::ptree& arr, FilamentHotBedNozzleRules::NozzleForbiddenBand& band) +{ + for (const auto& item : arr) { + if (!ptree_key_is_array_element(item.first)) + continue; + std::string v = boost::trim_copy(item.second.data()); + if (v.empty()) { + try { + v = item.second.get_value(); + } catch (const pt::ptree_error&) { + continue; + } + } + boost::algorithm::trim(v); + std::string lower = boost::algorithm::to_lower_copy(v); + if (lower == "*" || lower == "all") { + band.forbid_all_filaments = true; + continue; + } + if (!v.empty()) + band.forbidden_substrings.insert(std::move(v)); + } +} + +static void parse_nozzle_rule_forbidden(const pt::ptree& rule_obj, FilamentHotBedNozzleRules::NozzleForbiddenBand& band) +{ + auto it = rule_obj.find("forbidden"); + if (it == rule_obj.not_found()) + return; + parse_forbidden_from_array_tree(it->second, band); +} + +static void parse_warning_from_array_tree(const pt::ptree& arr, FilamentHotBedNozzleRules::NozzleForbiddenBand& band) +{ + for (const auto& item : arr) { + if (!ptree_key_is_array_element(item.first)) + continue; + std::string v = boost::trim_copy(item.second.data()); + if (v.empty()) { + try { + v = item.second.get_value(); + } catch (const pt::ptree_error&) { + continue; + } + } + boost::algorithm::trim(v); + if (!v.empty()) + band.warning_substrings.insert(std::move(v)); + } +} + +static void parse_nozzle_rule_warning(const pt::ptree& rule_obj, FilamentHotBedNozzleRules::NozzleForbiddenBand& band) +{ + auto it = rule_obj.find("warning"); + if (it == rule_obj.not_found()) + return; + parse_warning_from_array_tree(it->second, band); +} + +static bool is_typed_nozzle_map_key(std::string k_lower) +{ + boost::algorithm::to_lower(k_lower); + if (k_lower == "all") + return true; + return NozzleTypeStrToEumn.find(k_lower) != NozzleTypeStrToEumn.end(); +} + +static bool rule_obj_has_typed_nozzle_map(const pt::ptree& rule_obj) +{ + for (const auto& ch : rule_obj) { + if (ptree_key_is_array_index(ch.first)) + continue; + std::string k = boost::trim_copy(ch.first); + boost::algorithm::to_lower(k); + if (is_typed_nozzle_map_key(k)) + return true; + } + return false; +} + +// type 为 all(或省略)且无 forbidden / warning 子串时,视为禁用全部耗材(仅有 warning 时不触发全禁)。 +static void finalize_nozzle_band_for_all_default(FilamentHotBedNozzleRules::NozzleForbiddenBand& band) +{ + if (band.applies_to_all_nozzle_types && band.forbidden_substrings.empty() && band.warning_substrings.empty()) + band.forbid_all_filaments = true; +} + +// Per-nozzle-diameter object: { "brass": [...], "undefine": { "forbidden": [...] }, "all": [...] } +static void append_bands_from_typed_nozzle_map(const std::string& rule_key, const pt::ptree& rule_obj, + std::unordered_map>& out_map) +{ + for (const auto& ch : rule_obj) { + if (ptree_key_is_array_index(ch.first)) + continue; + std::string k = boost::trim_copy(ch.first); + boost::algorithm::to_lower(k); + if (!is_typed_nozzle_map_key(k)) + continue; + + FilamentHotBedNozzleRules::NozzleForbiddenBand band; + if (k == "all") { + band.applies_to_all_nozzle_types = true; + } else { + band.applies_to_all_nozzle_types = false; + band.nozzle_types.insert(k); + } + + const pt::ptree& vnode = ch.second; + const bool has_forbidden = vnode.find("forbidden") != vnode.not_found(); + const bool has_warning = vnode.find("warning") != vnode.not_found(); + if (has_forbidden) + parse_nozzle_rule_forbidden(vnode, band); + if (has_warning) + parse_nozzle_rule_warning(vnode, band); + if (!has_forbidden && !has_warning) + parse_forbidden_from_array_tree(vnode, band); + + finalize_nozzle_band_for_all_default(band); + if (!band.forbidden_substrings.empty() || band.forbid_all_filaments || !band.warning_substrings.empty()) + out_map[rule_key].push_back(std::move(band)); + } +} + +static void append_nozzle_bands_from_json(const std::string& rule_key, const pt::ptree& rule_obj, + std::unordered_map>& out_map) +{ + const bool has_top_forbidden = rule_obj.find("forbidden") != rule_obj.not_found(); + const bool has_top_type = rule_obj.find("type") != rule_obj.not_found(); + const bool has_top_warning = rule_obj.find("warning") != rule_obj.not_found(); + + // 顶层 type/forbidden/warning(旧格式)可与分键(brass / undefine / …)并存,不要提前 return,否则分键不会被加载。 + if (has_top_forbidden || has_top_type || has_top_warning) { + FilamentHotBedNozzleRules::NozzleForbiddenBand band; + parse_nozzle_rule_type_field(rule_obj, band); + parse_nozzle_rule_forbidden(rule_obj, band); + parse_nozzle_rule_warning(rule_obj, band); + finalize_nozzle_band_for_all_default(band); + if (!band.forbidden_substrings.empty() || band.forbid_all_filaments || !band.warning_substrings.empty()) + out_map[rule_key].push_back(std::move(band)); + } + + if (rule_obj_has_typed_nozzle_map(rule_obj)) { + append_bands_from_typed_nozzle_map(rule_key, rule_obj, out_map); + return; + } + + for (const auto& ch : rule_obj) { + if (!ptree_key_is_array_index(ch.first)) + continue; + const pt::ptree& el = ch.second; + if (el.find("forbidden") == el.not_found() && el.find("type") == el.not_found() && el.find("warning") == el.not_found()) + continue; + FilamentHotBedNozzleRules::NozzleForbiddenBand band; + parse_nozzle_rule_type_field(el, band); + parse_nozzle_rule_forbidden(el, band); + parse_nozzle_rule_warning(el, band); + finalize_nozzle_band_for_all_default(band); + if (!band.forbidden_substrings.empty() || band.forbid_all_filaments || !band.warning_substrings.empty()) + out_map[rule_key].push_back(std::move(band)); + } +} } // namespace FilamentHotBedNozzleRules& FilamentHotBedNozzleRules::singleton() @@ -117,7 +327,7 @@ void FilamentHotBedNozzleRules::load() m_bed_support_filament_types.clear(); m_bed_warning_filament_types.clear(); - m_nozzle_forbidden_filament_presets.clear(); + m_nozzle_forbidden_bands.clear(); m_loaded = false; const auto file_path = @@ -132,11 +342,16 @@ void FilamentHotBedNozzleRules::load() pt::read_json(file_path, root); for (const auto& kv : root) { - const std::string& rule_key = kv.first; - const auto& rule_obj = kv.second; + const std::string rule_key = boost::trim_copy(kv.first); + const auto& rule_obj = kv.second; + + if (boost::algorithm::ends_with(rule_key, "mm")) { + append_nozzle_bands_from_json(rule_key, rule_obj, m_nozzle_forbidden_bands); + continue; + } + auto& support_set = m_bed_support_filament_types[rule_key]; auto& warning_set = m_bed_warning_filament_types[rule_key]; - auto& forbid_set = m_nozzle_forbidden_filament_presets[rule_key]; for (const auto& child : rule_obj) { if (child.first == "support") { @@ -145,9 +360,6 @@ void FilamentHotBedNozzleRules::load() } else if (child.first == "warning") { for (const auto& item : child.second) warning_set.insert(item.second.get_value()); - } else if (child.first == "forbidden") { - for (const auto& item : child.second) - forbid_set.insert(item.second.get_value()); } } } @@ -202,23 +414,65 @@ bool FilamentHotBedNozzleRules::is_bed_filament_warning(const std::string& bed_k return res; } -bool FilamentHotBedNozzleRules::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const +bool FilamentHotBedNozzleRules::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name, + NozzleType nozzle_type) const { std::scoped_lock lock(m_mutex); - auto it = m_nozzle_forbidden_filament_presets.find(nozzle_key); - bool res = false; - if (it == m_nozzle_forbidden_filament_presets.end()) + auto it = m_nozzle_forbidden_bands.find(nozzle_key); + if (it == m_nozzle_forbidden_bands.end()) return false; - for (auto iter = it->second.begin(); iter != it->second.end();++iter) - { - std::string filamentData = iter->c_str(); - if (filament_preset_name.find(filamentData) != std::string::npos) + std::string cur_type = "undefine"; + auto nit = NozzleTypeEumnToStr.find(nozzle_type); + if (nit != NozzleTypeEumnToStr.end()) + cur_type = nit->second; + + for (const NozzleForbiddenBand& band : it->second) { + if (!band.applies_to_all_nozzle_types) { + if (band.nozzle_types.find(cur_type) == band.nozzle_types.end()) + continue; + } + if (band.forbid_all_filaments) { + if (!filament_preset_name.empty()) return true; + continue; + } + for (const std::string& token : band.forbidden_substrings) { + if (filament_preset_name.find(token) != std::string::npos) + return true; + } + for (const std::string& token : band.warning_substrings) { + if (filament_preset_name.find(token) != std::string::npos) + return true; + } } - //res = (it != m_nozzle_forbidden_filament_presets.end() && it->second.find(filament_preset_name) != it->second.end()); + return false; +} - return res; +bool FilamentHotBedNozzleRules::is_nozzle_filament_warning(const std::string& nozzle_key, const std::string& filament_preset_name, + NozzleType nozzle_type) const +{ + std::scoped_lock lock(m_mutex); + auto it = m_nozzle_forbidden_bands.find(nozzle_key); + if (it == m_nozzle_forbidden_bands.end()) + return false; + + std::string cur_type = "undefine"; + auto nit = NozzleTypeEumnToStr.find(nozzle_type); + if (nit != NozzleTypeEumnToStr.end()) + cur_type = nit->second; + + for (const NozzleForbiddenBand& band : it->second) { + if (!band.applies_to_all_nozzle_types) { + if (band.nozzle_types.find(cur_type) == band.nozzle_types.end()) + continue; + } + for (const std::string& token : band.warning_substrings) { + if (!token.empty() && filament_preset_name.find(token) != std::string::npos) + return true; + } + } + return false; } std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, @@ -258,7 +512,7 @@ std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const P } const std::string preset_name = resolve_filament_preset_full_name(normalized, filament_collection); - if (is_nozzle_filament_forbidden(nozzle_key_fid, preset_name)) + if (is_nozzle_filament_forbidden(nozzle_key_fid, preset_name, cfg.nozzle_type.value)) return preset_name.empty() ? "forbidden filament preset for current nozzle" : preset_name; } diff --git a/src/libslic3r/FilamentHotBedNozzleRules.hpp b/src/libslic3r/FilamentHotBedNozzleRules.hpp index f988dcec973..936ad7be89e 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.hpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.hpp @@ -14,7 +14,14 @@ namespace Slic3r { class PresetBundle; // JSON: resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json -// Keys: bed ids (btPEI, btGESP), nozzle ids ("0.2mm"), each with support/warning/forbidden arrays. +// Keys: bed ids (btPEI, btGESP), nozzle ids ("0.2mm" …) with support/warning. +// 喷嘴规则(键名以 "mm" 结尾),任选其一: +// 1) 单对象 { "type":"all"|材质, "forbidden":[...] } +// 2) 数组 [ { "type", "forbidden" }, ... ] +// 3) 按材质分键对象:键为 all / undefine / hardened_steel / stainless_steel / brass(可只写其中任意几种), +// 值为 forbidden 数组、{ "forbidden": [...] }、warning 数组、{ "warning": [...] },或同时含 forbidden / warning 的对象; +// "all" 表示任意喷嘴材质共用该条规则。warning 为提示级(不拦截切片),与热床 warning 语义类似。 +// type 为 all(或省略 type)时,若 forbidden 为空或仅含 "*" / "all",则对该喷嘴直径禁用全部耗材预设(非空名称即判为禁止)。 class FilamentHotBedNozzleRules { public: @@ -32,7 +39,11 @@ class FilamentHotBedNozzleRules bool is_bed_filament_tips(const std::string& bed_key, const std::string& filament_type) const; bool is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const; bool is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const; - bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const; + bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name, + NozzleType nozzle_type = NozzleType::ntUndefine) const; + /// Substring match on preset name; does not block slicing (see evaluate_nozzle_filament_mismatch). + bool is_nozzle_filament_warning(const std::string& nozzle_key, const std::string& filament_preset_name, + NozzleType nozzle_type = NozzleType::ntUndefine) const; std::string evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices, @@ -45,6 +56,16 @@ class FilamentHotBedNozzleRules bool evaluate_pei_bed_filament_mismatch_not_pla(const PrintConfig& cfg, const std::vector& used_filament_indices) const; bool evaluate_pei_bed_filament_mismatch_tpu(const PrintConfig& cfg, const std::vector& used_filament_indices) const; + // JSON 喷嘴 forbidden 条带(供解析逻辑使用) + struct NozzleForbiddenBand { + bool applies_to_all_nozzle_types{ true }; + std::unordered_set nozzle_types; + std::unordered_set forbidden_substrings; + std::unordered_set warning_substrings; + /// When true, any non-empty filament preset name is forbidden (after nozzle-type filter). + bool forbid_all_filaments{ false }; + }; + private: FilamentHotBedNozzleRules() = default; @@ -52,7 +73,7 @@ class FilamentHotBedNozzleRules bool m_loaded{ false }; std::unordered_map> m_bed_support_filament_types; std::unordered_map> m_bed_warning_filament_types; - std::unordered_map> m_nozzle_forbidden_filament_presets; + std::unordered_map> m_nozzle_forbidden_bands; }; std::string bed_type_to_filament_rule_key(BedType bed_type); diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 9b2095a8ab7..2da256c793a 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -193,9 +193,16 @@ bool GUI_App::is_bed_filament_warning(const std::string& bed_key, const std::str return FilamentHotBedNozzleRules::singleton().is_bed_filament_warning(bed_key, filament_type); } -bool GUI_App::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const +bool GUI_App::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name, + NozzleType nozzle_type) const { - return FilamentHotBedNozzleRules::singleton().is_nozzle_filament_forbidden(nozzle_key, filament_preset_name); + return FilamentHotBedNozzleRules::singleton().is_nozzle_filament_forbidden(nozzle_key, filament_preset_name, nozzle_type); +} + +bool GUI_App::is_nozzle_filament_warning(const std::string& nozzle_key, const std::string& filament_preset_name, + NozzleType nozzle_type) const +{ + return FilamentHotBedNozzleRules::singleton().is_nozzle_filament_warning(nozzle_key, filament_preset_name, nozzle_type); } bool GUI_App::has_filament_hot_bed_nozzle_rules() const diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index 53e40c0abda..8b40e2f4c5f 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -426,7 +426,10 @@ class GUI_App : public wxApp bool has_filament_hot_bed_nozzle_rules() const; bool is_bed_filament_supported(const std::string& bed_key, const std::string& filament_type) const; bool is_bed_filament_warning(const std::string& bed_key, const std::string& filament_type) const; - bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name) const; + bool is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name, + Slic3r::NozzleType nozzle_type = Slic3r::NozzleType::ntUndefine) const; + bool is_nozzle_filament_warning(const std::string& nozzle_key, const std::string& filament_preset_name, + Slic3r::NozzleType nozzle_type = Slic3r::NozzleType::ntUndefine) const; // To be called after the GUI is fully built up. // Process command line parameters cached in this->init_params, // load configs, STLs etc. diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 400224bc909..38549898dc7 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -121,8 +121,13 @@ static void validate_filament_hot_bed_nozzle_relation(wxWindow* parent) const auto* nozzle_opt = printer_config.option("nozzle_diameter"); if (nozzle_opt != nullptr && !nozzle_opt->values.empty()) { const std::string nozzle_key = nozzle_diameter_to_rule_key(nozzle_opt->values.front()); - const bool is_forbidden = app.is_nozzle_filament_forbidden(nozzle_key, filament_preset.name); + NozzleType nozzle_mat = NozzleType::ntUndefine; + if (const auto* nto = printer_config.option>("nozzle_type")) + nozzle_mat = nto->value; + const bool is_forbidden = app.is_nozzle_filament_forbidden(nozzle_key, filament_preset.name, nozzle_mat); + const bool is_noz_warn = app.is_nozzle_filament_warning(nozzle_key, filament_preset.name, nozzle_mat); (void)is_forbidden; + (void)is_noz_warn; } } From 6241343182edf07fb722c43ba1ced476211d2d48 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 2 Apr 2026 10:34:22 +0800 Subject: [PATCH 30/46] feature remove the not work code. --- src/libslic3r/FilamentHotBedNozzleRules.cpp | 32 +++------------------ src/libslic3r/FilamentHotBedNozzleRules.hpp | 3 -- 2 files changed, 4 insertions(+), 31 deletions(-) diff --git a/src/libslic3r/FilamentHotBedNozzleRules.cpp b/src/libslic3r/FilamentHotBedNozzleRules.cpp index b644ef70191..e865cb5fddc 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.cpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.cpp @@ -136,11 +136,6 @@ static void parse_forbidden_from_array_tree(const pt::ptree& arr, FilamentHotBed } } boost::algorithm::trim(v); - std::string lower = boost::algorithm::to_lower_copy(v); - if (lower == "*" || lower == "all") { - band.forbid_all_filaments = true; - continue; - } if (!v.empty()) band.forbidden_substrings.insert(std::move(v)); } @@ -202,13 +197,6 @@ static bool rule_obj_has_typed_nozzle_map(const pt::ptree& rule_obj) return false; } -// type 为 all(或省略)且无 forbidden / warning 子串时,视为禁用全部耗材(仅有 warning 时不触发全禁)。 -static void finalize_nozzle_band_for_all_default(FilamentHotBedNozzleRules::NozzleForbiddenBand& band) -{ - if (band.applies_to_all_nozzle_types && band.forbidden_substrings.empty() && band.warning_substrings.empty()) - band.forbid_all_filaments = true; -} - // Per-nozzle-diameter object: { "brass": [...], "undefine": { "forbidden": [...] }, "all": [...] } static void append_bands_from_typed_nozzle_map(const std::string& rule_key, const pt::ptree& rule_obj, std::unordered_map>& out_map) @@ -239,8 +227,7 @@ static void append_bands_from_typed_nozzle_map(const std::string& rule_key, cons if (!has_forbidden && !has_warning) parse_forbidden_from_array_tree(vnode, band); - finalize_nozzle_band_for_all_default(band); - if (!band.forbidden_substrings.empty() || band.forbid_all_filaments || !band.warning_substrings.empty()) + if (!band.forbidden_substrings.empty() || !band.warning_substrings.empty()) out_map[rule_key].push_back(std::move(band)); } } @@ -258,8 +245,7 @@ static void append_nozzle_bands_from_json(const std::string& rule_key, const pt: parse_nozzle_rule_type_field(rule_obj, band); parse_nozzle_rule_forbidden(rule_obj, band); parse_nozzle_rule_warning(rule_obj, band); - finalize_nozzle_band_for_all_default(band); - if (!band.forbidden_substrings.empty() || band.forbid_all_filaments || !band.warning_substrings.empty()) + if (!band.forbidden_substrings.empty() || !band.warning_substrings.empty()) out_map[rule_key].push_back(std::move(band)); } @@ -278,8 +264,7 @@ static void append_nozzle_bands_from_json(const std::string& rule_key, const pt: parse_nozzle_rule_type_field(el, band); parse_nozzle_rule_forbidden(el, band); parse_nozzle_rule_warning(el, band); - finalize_nozzle_band_for_all_default(band); - if (!band.forbidden_substrings.empty() || band.forbid_all_filaments || !band.warning_substrings.empty()) + if (!band.forbidden_substrings.empty() || !band.warning_substrings.empty()) out_map[rule_key].push_back(std::move(band)); } } @@ -432,17 +417,8 @@ bool FilamentHotBedNozzleRules::is_nozzle_filament_forbidden(const std::string& if (band.nozzle_types.find(cur_type) == band.nozzle_types.end()) continue; } - if (band.forbid_all_filaments) { - if (!filament_preset_name.empty()) - return true; - continue; - } for (const std::string& token : band.forbidden_substrings) { - if (filament_preset_name.find(token) != std::string::npos) - return true; - } - for (const std::string& token : band.warning_substrings) { - if (filament_preset_name.find(token) != std::string::npos) + if (!token.empty() && filament_preset_name.find(token) != std::string::npos) return true; } } diff --git a/src/libslic3r/FilamentHotBedNozzleRules.hpp b/src/libslic3r/FilamentHotBedNozzleRules.hpp index 936ad7be89e..ada1195a710 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.hpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.hpp @@ -21,7 +21,6 @@ class PresetBundle; // 3) 按材质分键对象:键为 all / undefine / hardened_steel / stainless_steel / brass(可只写其中任意几种), // 值为 forbidden 数组、{ "forbidden": [...] }、warning 数组、{ "warning": [...] },或同时含 forbidden / warning 的对象; // "all" 表示任意喷嘴材质共用该条规则。warning 为提示级(不拦截切片),与热床 warning 语义类似。 -// type 为 all(或省略 type)时,若 forbidden 为空或仅含 "*" / "all",则对该喷嘴直径禁用全部耗材预设(非空名称即判为禁止)。 class FilamentHotBedNozzleRules { public: @@ -62,8 +61,6 @@ class FilamentHotBedNozzleRules std::unordered_set nozzle_types; std::unordered_set forbidden_substrings; std::unordered_set warning_substrings; - /// When true, any non-empty filament preset name is forbidden (after nozzle-type filter). - bool forbid_all_filaments{ false }; }; private: From 1c24d193308c65669716dee88280f99f666c1864 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 2 Apr 2026 12:03:37 +0800 Subject: [PATCH 31/46] feature render panel add graphic hot bed for Custom plater. --- src/slic3r/GUI/GUI_App.cpp | 4 ++++ src/slic3r/GUI/PlateSettingsDialog.cpp | 30 ++++++++++++++++++++++++-- src/slic3r/GUI/Plater.cpp | 10 ++++----- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index 2da256c793a..dd54b6920f1 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -6286,6 +6286,10 @@ void GUI_App::load_current_presets(bool active_preset_combox/*= false*/, bool ch if (tab->supports_printer_technology(printer_technology)) { tab->rebuild_page_tree(); } + + // Sidebar nozzle diameter combos depend on visible printer variants; rebuild after import / preset reload. + if (plater() != nullptr) + plater()->sidebar().update_nozzle_settings(); } static std::mutex mutex_delete_cache_presets; diff --git a/src/slic3r/GUI/PlateSettingsDialog.cpp b/src/slic3r/GUI/PlateSettingsDialog.cpp index 3e62d269c09..b550e5f5a59 100644 --- a/src/slic3r/GUI/PlateSettingsDialog.cpp +++ b/src/slic3r/GUI/PlateSettingsDialog.cpp @@ -575,9 +575,35 @@ wxString PlateSettingsDialog::to_bed_type_name(BedType bed_type) { case btDefault: return _L("Same as Global Plate Type"); default: { - const ConfigOptionDef *bed_type_def = print_config_def.get("curr_bed_type"); - return _(bed_type_def->enum_labels[size_t(bed_type) - 1]); + const ConfigOptionDef *def = print_config_def.get("curr_bed_type"); + if (!def || !def->enum_keys_map) + return _L("Same as Global Bed Type"); + std::string key; + for (const auto &kv : *def->enum_keys_map) { + if (kv.second == int(bed_type)) { + key = kv.first; + break; + } } + if (key.empty()) + return _L("Same as Global Bed Type"); + auto match_label = [&](const std::vector &vals, const std::vector &labels) -> wxString { + for (size_t i = 0; i < vals.size() && i < labels.size(); ++i) + if (vals[i] == key) + return _(labels[i]); + return {}; + }; + wxString lab = match_label(def->enum_values, def->enum_labels); + if (!lab.empty()) + return lab; + lab = match_label(def->enum_values_ex, def->enum_labels_ex); + if (!lab.empty()) + return lab; + lab = match_label(def->enum_values_u1, def->enum_labels_u1); + if (!lab.empty()) + return lab; + return _(key); + } } return _L("Same as Global Bed Type"); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index c2a43f1525b..86eba676afa 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -2711,9 +2711,9 @@ void Sidebar::update_nozzle_settings(bool switch_machine) nullptr, wxCB_READONLY); - // Use all system presets for this printer_model so the combo stays usable when only one - // variant is marked visible (e.g. after setup wizard / preset visibility filters). - auto diameters = wxGetApp().preset_bundle->printers.diameters_for_same_printer_model(); + // Visible presets for this printer_model (system + user). Imported multi-nozzle variants are + // usually non-system; diameters_for_same_printer_model() only counted system and kept the combo disabled. + auto diameters = wxGetApp().preset_bundle->printers.diameters_of_selected_printer(); for (auto& diameter : diameters) { diameter_combo->AppendString(wxString(diameter) + "mm"); } @@ -15395,7 +15395,7 @@ void Plater::open_platesettings_dialog(wxCommandEvent& evt) { int plate_index = evt.GetInt(); PlateSettingsDialog dlg(this, _L("Plate Settings"), evt.GetString() == "only_layer_sequence"); PartPlate* curr_plate = p->partplate_list.get_curr_plate(); - dlg.sync_bed_type(curr_plate->get_bed_type()); + dlg.sync_bed_type(curr_plate->get_bed_type(true)); auto curr_print_seq = curr_plate->get_print_seq(); if (curr_print_seq != PrintSequence::ByDefault) { @@ -15421,7 +15421,7 @@ void Plater::open_platesettings_dialog(wxCommandEvent& evt) { dlg.Bind(EVT_SET_BED_TYPE_CONFIRM, [this, plate_index, &dlg](wxCommandEvent& e) { PartPlate* curr_plate = p->partplate_list.get_curr_plate(); - BedType old_bed_type = curr_plate->get_bed_type(); + BedType old_bed_type = curr_plate->get_bed_type(true); auto bt_sel = BedType(dlg.get_bed_type_choice()); if (old_bed_type != bt_sel) { curr_plate->set_bed_type(bt_sel); From 4cc3638f5a07a5748e21dac5347bbbba29878775 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 2 Apr 2026 15:30:22 +0800 Subject: [PATCH 32/46] fix the judge logic for sync machine filament info. --- src/slic3r/GUI/SSWCP.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index e7d6b4db75f..0b3f359a63b 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -1566,7 +1566,7 @@ void SSWCP_Instance::update_filament_info(const json& objects, bool send_message if (tmp_filaments.count(iter->first)) { auto pair = iter->second; auto tmp_pair = tmp_filaments[iter->first]; - if (pair.first == tmp_pair.first && pair.second == pair.second) { + if (pair.first == tmp_pair.first && pair.second == tmp_pair.second) { continue; } else { need_load_preset = true; From e28efd7ffd30d71295056149a228c75d993a1dfa Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 2 Apr 2026 18:17:40 +0800 Subject: [PATCH 33/46] feature load relations json from profiles source,upgrade translations. --- .../i18n/zh_CN/Snapmaker_Orca_zh_CN.po | 625 ++++++------------ src/libslic3r/FilamentHotBedNozzleRules.cpp | 20 +- src/libslic3r/FilamentHotBedNozzleRules.hpp | 2 +- src/slic3r/GUI/GUI_App.cpp | 7 +- src/slic3r/GUI/Plater.cpp | 43 +- src/slic3r/Utils/PresetUpdater.cpp | 10 + 6 files changed, 261 insertions(+), 446 deletions(-) diff --git a/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po b/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po index 851261cf3ed..cdc56eeb088 100644 --- a/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po +++ b/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-09-28 18:44+0800\n" -"PO-Revision-Date: 2026-01-19 17:22+0800\n" +"PO-Revision-Date: 2026-04-02 18:16+0800\n" "Last-Translator: Handle \n" "Language-Team: \n" "Language: zh_CN\n" @@ -2965,9 +2965,7 @@ msgstr "不启用AMS" msgid "Print with the filament mounted on the back of chassis" msgstr "使用机箱背后挂载的材料打印" -msgid "" -"Please change the desiccant when it is too wet. The indicator may not represent accurately in following cases: when the lid is open or the desiccant pack is changed. It take hours to absorb the moisture, and low " -"temperatures also slow down the process." +msgid "Please change the desiccant when it is too wet. The indicator may not represent accurately in following cases: when the lid is open or the desiccant pack is changed. It take hours to absorb the moisture, and low temperatures also slow down the process." msgstr "当干燥剂过于潮湿时,请及时更换。以下几种情况下,指示器可能无法准确反映情况:盖子打开或干燥剂包被替换时。干燥剂需要数小时吸收潮气,低温也会延缓该过程。" msgid "Configure which AMS slot should be used for a filament used in the print job." @@ -4267,11 +4265,8 @@ msgstr "" "对象被放置在构建板的边界上或超过高度限制。\n" "请通过将其完全移动到构建板内或构建板外,并确认高度在构建空间以内来解决问题。" -msgid "" -"Model too close to bed boundary. Disable spiral lifting or keep at least " -"3.5mm gap to avoid collision." -msgstr "" -"模型太靠近热床边界,建议暂时关闭螺旋抬升或至少距离边界3.5mm距离,防止超出打印区域引发撞击。" +msgid "Model too close to bed boundary. Disable spiral lifting or keep at least 3.5mm gap to avoid collision." +msgstr "模型太靠近热床边界,建议暂时关闭螺旋抬升或至少距离边界3.5mm距离,防止超出打印区域引发撞击。" msgid "Calibration step selection" msgstr "校准步骤选择" @@ -5782,9 +5777,7 @@ msgstr "该3mf文件不是来自Snapmaker Orca,将只加载几何数据。" msgid "Load 3mf" msgstr "加载3mf" -msgid "" -"This project was created with an Snapmaker Orca 2.3.1-alpha and uses infill rotation template settings that may not work properly with your current infill pattern. This could result in weak support or print " -"quality issues." +msgid "This project was created with an Snapmaker Orca 2.3.1-alpha and uses infill rotation template settings that may not work properly with your current infill pattern. This could result in weak support or print quality issues." msgstr "该项目由 Snapmaker Orca 2.3.1-alpha 创建,并使用了填充旋转模板设置,这些设置可能无法与您当前的填充模式正常配合,可能导致支撑不足或打印质量问题。" msgid "Would you like Snapmaker Orca to automatically fix this by clearing the rotation template settings?" @@ -7047,12 +7040,8 @@ msgstr "我已阅读并接受" msgid "Terms and Conditions" msgstr "用户使用协议" -msgid "" -"Thank you for purchasing a Bambu Lab device. Before using your Bambu Lab device, please read the terms and conditions. By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy Policy " -"and Terms of Use (collectively, the \"Terms\"). If you do not comply with or agree to the Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." -msgstr "" -"感谢您购买Bambu Lab设备,使用Bambu Lab设备前,请阅读一下条款,单击同意使用您的Bambu Lab设备即表示您同意遵守隐私政策以及使用条款(统称为“条款”)。如果您不符合或不同意Bambu Lab隐私政策,请不要使用Bambu Lab设备和服" -"务。" +msgid "Thank you for purchasing a Bambu Lab device. Before using your Bambu Lab device, please read the terms and conditions. By clicking to agree to use your Bambu Lab device, you agree to abide by the Privacy Policy and Terms of Use (collectively, the \"Terms\"). If you do not comply with or agree to the Bambu Lab Privacy Policy, please do not use Bambu Lab equipment and services." +msgstr "感谢您购买Bambu Lab设备,使用Bambu Lab设备前,请阅读一下条款,单击同意使用您的Bambu Lab设备即表示您同意遵守隐私政策以及使用条款(统称为“条款”)。如果您不符合或不同意Bambu Lab隐私政策,请不要使用Bambu Lab设备和服务。" msgid "and" msgstr "和" @@ -7067,15 +7056,8 @@ msgid "Statement about User Experience Improvement Program" msgstr "关于用户体验改善计划的声明" #, c-format, boost-format -msgid "" -"In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. %s follows the same principle and uses machine learning to improve its " -"performance from the successes and failures of the vast number of prints by our users. We are training %s to be smarter by feeding them the real-world data. If you are willing, this service will access " -"information from your error logs and usage logs, which may include information described in Privacy Policy. We will not collect any Personal Data by which an individual can be identified directly or indirectly, " -"including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy." -msgstr "" -"在3D打印社区,我们从彼此的成功和失败中学习调整自己的切片参数和设置。%s遵循同样的原则,通过机器学习的方式从大量用户打印的成功和失败中获取经验,从而改善打印性能。我们正在通过向%s提供真实世界的数据来训练他们变得更聪" -"明。如果您愿意,此服务将访问您的错误日志和使用日志中的信息,其中可能包括隐私政策中描述的信息。我们不会收集任何可以直接或间接识别个人的个人数据,包括但不限于姓名、地址、支付信息或电话号码。启用此服务即表示您同意这" -"些条款和有关隐私政策的声明。" +msgid "In the 3D Printing community, we learn from each other's successes and failures to adjust our own slicing parameters and settings. %s follows the same principle and uses machine learning to improve its performance from the successes and failures of the vast number of prints by our users. We are training %s to be smarter by feeding them the real-world data. If you are willing, this service will access information from your error logs and usage logs, which may include information described in Privacy Policy. We will not collect any Personal Data by which an individual can be identified directly or indirectly, including without limitation names, addresses, payment information, or phone numbers. By enabling this service, you agree to these terms and the statement about Privacy Policy." +msgstr "在3D打印社区,我们从彼此的成功和失败中学习调整自己的切片参数和设置。%s遵循同样的原则,通过机器学习的方式从大量用户打印的成功和失败中获取经验,从而改善打印性能。我们正在通过向%s提供真实世界的数据来训练他们变得更聪明。如果您愿意,此服务将访问您的错误日志和使用日志中的信息,其中可能包括隐私政策中描述的信息。我们不会收集任何可以直接或间接识别个人的个人数据,包括但不限于姓名、地址、支付信息或电话号码。启用此服务即表示您同意这些条款和有关隐私政策的声明。" msgid "Statement on User Experience Improvement Plan" msgstr "关于用户体验改善计划的声明" @@ -7143,17 +7125,13 @@ msgstr "" "是 - 自动调整这些设置\n" "否 - 不用为我调整这些设置" -msgid "" -"Enabling this option will modify the model's shape. If your print requires precise dimensions or is part of an assembly, it's important to double-check whether this change in geometry impacts the functionality of " -"your print." +msgid "Enabling this option will modify the model's shape. If your print requires precise dimensions or is part of an assembly, it's important to double-check whether this change in geometry impacts the functionality of your print." msgstr "启用此选项将改变模型的形状。如果您的打印件需要精确的尺寸或是装配体的一部分,请务必仔细检查这种形状的变化是否影响了最终功能。" msgid "Are you sure you want to enable this option?" msgstr "您确定要启用此选项吗?" -msgid "" -"Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to " -"insufficient support. Please proceed with caution and thoroughly check for any potential printing issues.Are you sure you want to enable this option?" +msgid "Infill patterns are typically designed to handle rotation automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues.Are you sure you want to enable this option?" msgstr "" msgid "" @@ -7177,14 +7155,10 @@ msgstr "调整" msgid "Ignore" msgstr "忽略" -msgid "" -"Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or " -"other printing complications." +msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications." msgstr "实验性选项。在更换耗材丝时,将耗材丝回抽一段距离后再切断以最小化冲刷。虽然这可以显著减少冲刷,但也可能增加喷嘴堵塞或其他打印问题的风险。" -msgid "" -"Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or " -"other printing complications. Please use with the latest printer firmware." +msgid "Experimental feature: Retracting and cutting off the filament at a greater distance during filament changes to minimize flush. Although it can notably reduce flush, it may also elevate the risk of nozzle clogs or other printing complications. Please use with the latest printer firmware." msgstr "实验性选项。在更换耗材丝时,将耗材丝回抽一段距离后再切断以最小化冲刷。虽然这可以显著减少冲刷,但也可能增加喷嘴堵塞或其他打印问题的风险。请配合打印机最新固件使用。" msgid "" @@ -7452,9 +7426,7 @@ msgstr "部件冷却风扇" msgid "Min fan speed threshold" msgstr "最小风扇速度阈值" -msgid "" -"Part cooling fan speed will start to run at min speed when the estimated layer time is no longer than the layer time in setting. When layer time is shorter than threshold, fan speed is interpolated between the " -"minimum and maximum fan speed according to layer printing time" +msgid "Part cooling fan speed will start to run at min speed when the estimated layer time is no longer than the layer time in setting. When layer time is shorter than threshold, fan speed is interpolated between the minimum and maximum fan speed according to layer printing time" msgstr "当预估的层时间不大于设定的数值时,部件冷却风扇将开始运行在最小速度。层时间小于阈值时,实际风扇转速将根据层打印时间在最大和最小风扇速度之间插值获得" msgid "Max fan speed threshold" @@ -7938,9 +7910,7 @@ msgid "Ramming customization" msgstr "自定义尖端成型" msgid "" -"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new " -"filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are " -"adjustable.\n" +"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n" "\n" "This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc." msgstr "" @@ -8759,9 +8729,7 @@ msgstr "线宽太小" msgid "Too large line width" msgstr "线宽太大" -msgid "" -"Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current filament (support_filament == 0 or support_interface_filament == 0), all nozzles have to be of the same " -"diameter." +msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current filament (support_filament == 0 or support_interface_filament == 0), all nozzles have to be of the same diameter." msgstr "" msgid "The prime tower requires that support has the same layer height with object." @@ -8858,8 +8826,7 @@ msgstr "可打印区域" msgid "Bed exclude area" msgstr "不可打印区域" -msgid "" -"Unprintable area in XY plane. For example, X1 Series printers use the front left corner to cut filament during filament change. The area is expressed as polygon by points in following format: \"XxY, XxY, ...\"" +msgid "Unprintable area in XY plane. For example, X1 Series printers use the front left corner to cut filament during filament change. The area is expressed as polygon by points in following format: \"XxY, XxY, ...\"" msgstr "XY平面上的不可打印区域。例如,X1系列打印机在换料过程中,会使用左前角区域来切断耗材丝。这个多边形区域由以下格式的点表示:“XxY,XxY,…”" msgid "Bed custom texture" @@ -8877,9 +8844,7 @@ msgstr "将首层收缩用于补偿象脚效应" msgid "Elephant foot compensation layers" msgstr "象脚补偿层数" -msgid "" -"The number of layers on which the elephant foot compensation will be active. The first layer will be shrunk by the elephant foot compensation value, then the next layers will be linearly shrunk less, up to the " -"layer indicated by this value." +msgid "The number of layers on which the elephant foot compensation will be active. The first layer will be shrunk by the elephant foot compensation value, then the next layers will be linearly shrunk less, up to the layer indicated by this value." msgstr "" msgid "layers" @@ -8912,12 +8877,8 @@ msgstr "允许通过第三方网络连接控制BambuLab的打印机" msgid "Hostname, IP or URL" msgstr "主机名,IP或者URL" -msgid "" -"Snapmaker Orca can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed " -"by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/" -msgstr "" -"Snapmaker Orca可以将G-code文件上传到打印机主机。此字段应包含打印机主机实例的主机名、IP地址或URL。启用基本身份验证的Print host可以通过将用户名和密码放入以下格式的URL中来访问:https://username:password@your-octopi-" -"address/" +msgid "Snapmaker Orca can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/" +msgstr "Snapmaker Orca可以将G-code文件上传到打印机主机。此字段应包含打印机主机实例的主机名、IP地址或URL。启用基本身份验证的Print host可以通过将用户名和密码放入以下格式的URL中来访问:https://username:password@your-octopi-address/" msgid "Device UI" msgstr "设备用户界面" @@ -8973,9 +8934,7 @@ msgstr "空驶时绕过外墙以避免在模型外观面产生斑点" msgid "Avoid crossing walls - Max detour length" msgstr "避免跨越外墙-最大绕行长度" -msgid "" -"Maximum detour distance for avoiding crossing wall. Don't detour if the detour distance is larger than this value. Detour length could be specified either as an absolute value or as percentage (for example 50%) " -"of a direct travel path. Zero to disable." +msgid "Maximum detour distance for avoiding crossing wall. Don't detour if the detour distance is larger than this value. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path. Zero to disable." msgstr "避免跨越外墙时的最大绕行距离。当绕行距离比这个数值大时,此次空驶不绕行。绕行距离可表达为绝对值,或者相对直线空驶长度的百分比(例如50%)。0表示禁用" msgid "mm or %" @@ -9059,17 +9018,13 @@ msgstr "在每次换层抬升z高度之前插入这段G-code" msgid "Bottom shell layers" msgstr "底部壳体层数" -msgid "" -"This is the number of solid layers of bottom shell, including the bottom surface layer. When the thickness calculated by this value is thinner than bottom shell thickness, the bottom shell layers will be " -"increased." +msgid "This is the number of solid layers of bottom shell, including the bottom surface layer. When the thickness calculated by this value is thinner than bottom shell thickness, the bottom shell layers will be increased." msgstr "底部壳体实心层层数,包括底面。当由该层数计算的厚度小于底部壳体厚度,切片时会增加底部壳体的层数" msgid "Bottom shell thickness" msgstr "底部壳体厚度" -msgid "" -"The number of bottom solid layers is increased when slicing if the thickness calculated by bottom shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means " -"that this setting is disabled and thickness of bottom shell is absolutely determined by bottom shell layers." +msgid "The number of bottom solid layers is increased when slicing if the thickness calculated by bottom shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of bottom shell is absolutely determined by bottom shell layers." msgstr "如果由底部壳体层数算出的厚度小于这个数值,那么切片时将自动增加底部壳体层数。这能够避免当层高很小时,底部壳体过薄。0表示关闭这个设置,同时底部壳体的厚度完全由底部壳体层数决定" msgid "Apply gap fill" @@ -9080,16 +9035,14 @@ msgid "" "\n" "Options:\n" "1. Everywhere: Applies gap fill to top, bottom and internal solid surfaces for maximum strength\n" -"2. Top and Bottom surfaces: Applies gap fill to top and bottom surfaces only, balancing print speed, reducing potential over extrusion in the solid infill and making sure the top and bottom surfaces have no " -"pinhole gaps\n" +"2. Top and Bottom surfaces: Applies gap fill to top and bottom surfaces only, balancing print speed, reducing potential over extrusion in the solid infill and making sure the top and bottom surfaces have no pinhole gaps\n" "3. Nowhere: Disables gap fill for all solid infill areas\n" "\n" "Note that if using the classic perimeter generator, gap fill may also be generated between perimeters, if a full width line cannot fit between them. That perimeter gap fill is not controlled by this setting.\n" "\n" "If you would like all gap fill, including the classic perimeter generated one, removed, set the filter out tiny gaps value to a large number, like 999999.\n" "\n" -"However this is not advised, as gap fill between perimeters is contributing to the model's strength. For models where excessive gap fill is generated between perimeters, a better option would be to switch to the " -"arachne wall generator and use this option to control whether the cosmetic top and bottom surface gap fill is generated." +"However this is not advised, as gap fill between perimeters is contributing to the model's strength. For models where excessive gap fill is generated between perimeters, a better option would be to switch to the arachne wall generator and use this option to control whether the cosmetic top and bottom surface gap fill is generated." msgstr "" msgid "Everywhere" @@ -9104,20 +9057,16 @@ msgstr "不填充" msgid "Force cooling for overhangs and bridges" msgstr "悬垂/桥接强制冷却" -msgid "" -"Enable this option to allow adjustment of the part cooling fan speed for specifically for overhangs, internal and external bridges. Setting the fan speed specifically for these features can improve overall print " -"quality and reduce warping." +msgid "Enable this option to allow adjustment of the part cooling fan speed for specifically for overhangs, internal and external bridges. Setting the fan speed specifically for these features can improve overall print quality and reduce warping." msgstr "启用此选项以允许单独针对悬垂、内部桥接和外部桥接调整部件冷却风扇的速度。针对这些特性设置风扇速度可以提高整体打印质量并减少翘曲。" msgid "Overhangs and external bridges fan speed" msgstr "悬垂和外部桥接风扇速度" msgid "" -"Use this part cooling fan speed when printing bridges or overhang walls with an overhang threshold that exceeds the value set in the 'Overhangs cooling threshold' parameter above. Increasing the cooling " -"specifically for overhangs and bridges can improve the overall print quality of these features.\n" +"Use this part cooling fan speed when printing bridges or overhang walls with an overhang threshold that exceeds the value set in the 'Overhangs cooling threshold' parameter above. Increasing the cooling specifically for overhangs and bridges can improve the overall print quality of these features.\n" "\n" -"Please note, this fan speed is clamped on the lower end by the minimum fan speed threshold set above. It is also adjusted upwards up to the maximum fan speed threshold when the minimum layer time threshold is not " -"met." +"Please note, this fan speed is clamped on the lower end by the minimum fan speed threshold set above. It is also adjusted upwards up to the maximum fan speed threshold when the minimum layer time threshold is not met." msgstr "" "当打印桥接结构或悬垂墙体时,如果悬垂程度超过上述“悬垂冷却阈值”所设定的值,则使用此部件冷却风扇速度。专门针对悬垂和桥接加大冷却力度,有助于提升这些特征整体的打印质量。\n" "\n" @@ -9127,9 +9076,7 @@ msgid "Overhang cooling activation threshold" msgstr "悬垂冷却激活阈值" #, no-c-format, no-boost-format -msgid "" -"When the overhang exceeds this specified threshold, force the cooling fan to run at the 'Overhang Fan Speed' set below. This threshold is expressed as a percentage, indicating the portion of each line's width " -"that is unsupported by the layer beneath it. Setting this value to 0% forces the cooling fan to run for all outer walls, regardless of the overhang degree." +msgid "When the overhang exceeds this specified threshold, force the cooling fan to run at the 'Overhang Fan Speed' set below. This threshold is expressed as a percentage, indicating the portion of each line's width that is unsupported by the layer beneath it. Setting this value to 0% forces the cooling fan to run for all outer walls, regardless of the overhang degree." msgstr "当悬垂超过此指定阈值时,强制部件冷却风扇按照下方设置的“悬垂风扇速度”运转。该阈值以百分比表示,指示每条走线宽度中未被下层支撑的部分。将此值设置为0%即使在任何悬垂条件下也会使风扇运转于所有外壁。" msgid "External bridge infill direction" @@ -9232,8 +9179,7 @@ msgstr "单层墙阈值" #, no-c-format, no-boost-format msgid "" -"If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on top' " -"trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the perimeter extrusion width.\n" +"If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value. This can be useful to not let the 'one perimeter on top' trigger on surface that should be covered only by perimeters. This value can be a mm or a % of the perimeter extrusion width.\n" "Warning: If enabled, artifacts can be created if you have some thin features on the next layer, like letters. Set this setting to 0 to remove these artifacts." msgstr "" "如果顶面需要打印,但是它的一部分被其它层覆盖,那么当它的宽度小于这个值时,它不会被认为是顶层。这个设置可以用于避免在狭窄顶面上触发“顶面单层墙”。这个值可以是毫米或线宽的百分比。\n" @@ -9272,15 +9218,13 @@ msgstr "仅反转内部墙壁" msgid "" "Apply the reverse perimeters logic only on internal perimeters.\n" "\n" -"This setting greatly reduces part stresses as they are now distributed in alternating directions. This should reduce part warping while also maintaining external wall quality. This feature can be very useful for " -"warp prone material, like ABS/ASA, and also for elastic filaments, like TPU and Silk PLA. It can also help reduce warping on floating regions over supports.\n" +"This setting greatly reduces part stresses as they are now distributed in alternating directions. This should reduce part warping while also maintaining external wall quality. This feature can be very useful for warp prone material, like ABS/ASA, and also for elastic filaments, like TPU and Silk PLA. It can also help reduce warping on floating regions over supports.\n" "\n" "For this setting to be the most effective, it is recommended to set the Reverse Threshold to 0 so that all internal walls print in alternating directions on even layers irrespective of their overhang degree." msgstr "" "仅在内墙上应用反转墙壁逻辑。\n" "\n" -"这个设置大大减少了零件的应力,因为它们现在是交替方向分布的。这应该减少零件变形,同时保持外墙的质量。这个功能对于易变形的材料非常有用,比如ABS/ASA,也对于弹性耗材,比如TPU和丝光PLA。它还可以帮助减少支撑上的悬空区域" -"的变形。\n" +"这个设置大大减少了零件的应力,因为它们现在是交替方向分布的。这应该减少零件变形,同时保持外墙的质量。这个功能对于易变形的材料非常有用,比如ABS/ASA,也对于弹性耗材,比如TPU和丝光PLA。它还可以帮助减少支撑上的悬空区域的变形。\n" "\n" "为了使这个设置最有效,建议将反转阈值设置为0,这样所有的内墙都会在偶数层交替打印。" @@ -9331,19 +9275,15 @@ msgstr "翘边降速" #, no-c-format, no-boost-format msgid "" -"Enable this option to slow down printing in areas where perimeters may have curled upwards. For example, additional slowdown will be applied when printing overhangs on sharp corners like the front of the Benchy " -"hull, reducing curling which compounds over multiple layers.\n" +"Enable this option to slow down printing in areas where perimeters may have curled upwards. For example, additional slowdown will be applied when printing overhangs on sharp corners like the front of the Benchy hull, reducing curling which compounds over multiple layers.\n" "\n" -"It is generally recommended to have this option switched on unless your printer cooling is powerful enough or the print speed slow enough that perimeter curling does not happen. If printing with a high external " -"perimeter speed, this parameter may introduce slight artifacts when slowing down due to the large variance in print speeds. If you notice artifacts, ensure your pressure advance is tuned correctly.\n" +"It is generally recommended to have this option switched on unless your printer cooling is powerful enough or the print speed slow enough that perimeter curling does not happen. If printing with a high external perimeter speed, this parameter may introduce slight artifacts when slowing down due to the large variance in print speeds. If you notice artifacts, ensure your pressure advance is tuned correctly.\n" "\n" -"Note: When this option is enabled, overhang perimeters are treated like overhangs, meaning the overhang speed is applied even if the overhanging perimeter is part of a bridge. For example, when the perimeters are " -"100% overhanging, with no wall supporting them from underneath, the 100% overhang speed will be applied." +"Note: When this option is enabled, overhang perimeters are treated like overhangs, meaning the overhang speed is applied even if the overhanging perimeter is part of a bridge. For example, when the perimeters are 100% overhanging, with no wall supporting them from underneath, the 100% overhang speed will be applied." msgstr "" "启用此选项以降低可能向上翘曲的周长区域的打印速度。例如,在打印Benchy船体前部等尖锐角落的悬垂时,将应用额外的减速,减少在多层中复合的翘曲。\n" "\n" -"通常建议启用此选项,除非您的打印机冷却足够强大或打印速度足够慢,以至于周长翘曲不会发生。如果以较高的外部周长速度打印,由于打印速度的巨大差异,此参数在减速时可能会引入轻微的伪影。如果您注意到伪影,请确保您的压力提" -"前已正确调整。\n" +"通常建议启用此选项,除非您的打印机冷却足够强大或打印速度足够慢,以至于周长翘曲不会发生。如果以较高的外部周长速度打印,由于打印速度的巨大差异,此参数在减速时可能会引入轻微的伪影。如果您注意到伪影,请确保您的压力提前已正确调整。\n" "\n" "注意:启用此选项时,悬垂周长将被视为悬垂,这意味着即使悬垂周长是桥接的一部分,也会应用悬垂速度。例如,当周长100%悬垂,没有墙壁从下方支撑时,将应用100%悬垂速度。" @@ -9356,8 +9296,7 @@ msgstr "外部" msgid "" "Speed of the externally visible bridge extrusions.\n" "\n" -"In addition, if Slow down for curled perimeters is disabled or Classic overhang mode is enabled, it will be the print speed of overhang walls that are supported by less than 13%, whether they are part of a bridge " -"or an overhang." +"In addition, if Slow down for curled perimeters is disabled or Classic overhang mode is enabled, it will be the print speed of overhang walls that are supported by less than 13%, whether they are part of a bridge or an overhang." msgstr "" "外部可见桥接挤出的速度。\n" "\n" @@ -9454,9 +9393,7 @@ msgstr "按对象列表中的顺序" msgid "Slow printing down for better layer cooling" msgstr "降低打印速度 以得到更好的冷却" -msgid "" -"Enable this option to slow printing speed down to make the final layer time not shorter than the layer time threshold in \"Max fan speed threshold\", so that layer can be cooled for longer time. This can improve " -"the cooling quality for needle and small details." +msgid "Enable this option to slow printing speed down to make the final layer time not shorter than the layer time threshold in \"Max fan speed threshold\", so that layer can be cooled for longer time. This can improve the cooling quality for needle and small details." msgstr "勾选这个选项,将降低打印速度,使得最终的层打印时间不小于\"最大风扇速度阈值\"里的层时间阈值,从而使得该层获得更久的冷却。这能够改善尖顶和小细节的冷却效果" msgid "Normal printing" @@ -9522,18 +9459,14 @@ msgstr "额外桥层(测试版)" msgid "" "This option enables the generation of an extra bridge layer over internal and/or external bridges.\n" "\n" -"Extra bridge layers help improve bridge appearance and reliability, as the solid infill is better supported. This is especially useful in fast printers, where the bridge and solid infill speeds vary greatly. The " -"extra bridge layer results in reduced pillowing on top surfaces, as well as reduced separation of the external bridge layer from its surrounding perimeters.\n" +"Extra bridge layers help improve bridge appearance and reliability, as the solid infill is better supported. This is especially useful in fast printers, where the bridge and solid infill speeds vary greatly. The extra bridge layer results in reduced pillowing on top surfaces, as well as reduced separation of the external bridge layer from its surrounding perimeters.\n" "\n" "It is generally recommended to set this to at least 'External bridge only', unless specific issues with the sliced model are found.\n" "\n" "Options:\n" "1. Disabled - does not generate second bridge layers. This is the default and is set for compatibility purposes\n" -"2. External bridge only - generates second bridge layers for external-facing bridges only. Please note that small bridges that are shorter or narrower than the set number of perimeters will be skipped as they " -"would not benefit from a second bridge layer. If generated, the second bridge layer will be extruded parallel to the first bridge layer to reinforce the bridge strength\n" -"3. Internal bridge only - generates second bridge layers for internal bridges over sparse infill only. Please note that the internal bridges count towards the top shell layer count of your model. The second " -"internal bridge layer will be extruded as close to perpendicular to the first as possible. If multiple regions in the same island, with varying bridge angles are present, the last region of that island will be " -"selected as the angle reference\n" +"2. External bridge only - generates second bridge layers for external-facing bridges only. Please note that small bridges that are shorter or narrower than the set number of perimeters will be skipped as they would not benefit from a second bridge layer. If generated, the second bridge layer will be extruded parallel to the first bridge layer to reinforce the bridge strength\n" +"3. Internal bridge only - generates second bridge layers for internal bridges over sparse infill only. Please note that the internal bridges count towards the top shell layer count of your model. The second internal bridge layer will be extruded as close to perpendicular to the first as possible. If multiple regions in the same island, with varying bridge angles are present, the last region of that island will be selected as the angle reference\n" "4. Apply to all - generates second bridge layers for both internal and external-facing bridges\n" msgstr "" "此选项启用在内部和/或外部桥接上生成额外桥接层。\n" @@ -9545,8 +9478,7 @@ msgstr "" "选项:\n" "1. 禁用 - 不生成第二桥接层。这是默认设置,出于兼容性目的而设置\n" "2. 仅外部桥接 - 仅为面向外部的桥接生成第二桥接层。请注意,比设置的周长数更短或更窄的小桥接将被跳过,因为它们不会从第二桥接层中受益。如果生成,第二桥接层将与第一桥接层平行挤出,以增强桥接强度\n" -"3. 仅内部桥接 - 仅为稀疏填充上的内部桥接生成第二桥接层。请注意,内部桥接计入模型的顶部外壳层数。第二内部桥接层将尽可能垂直于第一层挤出。如果在同一岛屿中存在多个具有不同桥接角度的区域,则该岛屿的最后一个区域将被选" -"为角度参考\n" +"3. 仅内部桥接 - 仅为稀疏填充上的内部桥接生成第二桥接层。请注意,内部桥接计入模型的顶部外壳层数。第二内部桥接层将尽可能垂直于第一层挤出。如果在同一岛屿中存在多个具有不同桥接角度的区域,则该岛屿的最后一个区域将被选为角度参考\n" "4. 全部应用 - 为内部和面向外部的桥接生成第二桥接层\n" msgid "Disabled" @@ -9566,11 +9498,9 @@ msgstr "过滤掉小的内部桥接" msgid "" "This option can help reduce pillowing on top surfaces in heavily slanted or curved models.\n" -"By default, small internal bridges are filtered out and the internal solid infill is printed directly over the sparse infill. This works well in most cases, speeding up printing without too much compromise on top " -"surface quality.\n" +"By default, small internal bridges are filtered out and the internal solid infill is printed directly over the sparse infill. This works well in most cases, speeding up printing without too much compromise on top surface quality.\n" "However, in heavily slanted or curved models, especially where too low a sparse infill density is used, this may result in curling of the unsupported solid infill, causing pillowing.\n" -"Enabling limited filtering or no filtering will print internal bridge layer over slightly unsupported internal solid infill. The options below control the sensitivity of the filtering, i.e. they control where " -"internal bridges are created:\n" +"Enabling limited filtering or no filtering will print internal bridge layer over slightly unsupported internal solid infill. The options below control the sensitivity of the filtering, i.e. they control where internal bridges are created:\n" "1. Filter - enables this option. This is the default behavior and works well in most cases\n" "2. Limited filtering - creates internal bridges on heavily slanted surfaces while avoiding unnecessary bridges. This works well for most difficult models\n" "3. No filtering - creates internal bridges on every potential internal overhang. This option is useful for heavily slanted top surface models; however, in most cases, it creates too many unnecessary bridges" @@ -9688,9 +9618,7 @@ msgstr "外墙的打印速度。它通常使用比内壁速度慢的速度,以 msgid "Small perimeters" msgstr "微小部位" -msgid "" -"This separate setting will affect the speed of perimeters having radius <= small_perimeter_threshold (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the outer wall speed " -"setting above. Set to zero for auto." +msgid "This separate setting will affect the speed of perimeters having radius <= small_perimeter_threshold (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the outer wall speed setting above. Set to zero for auto." msgstr "此设置将影响半径小于等于small_perimeter_threshold(通常是孔洞)的围墙的速度。如果以百分比表示(例如:80%),则将根据上面的外壁速度设置进行计算。设置为零时为自动。" msgid "Small perimeters threshold" @@ -9705,15 +9633,11 @@ msgstr "墙顺序" msgid "" "Print sequence of the internal (inner) and external (outer) walls.\n" "\n" -"Use Inner/Outer for best overhangs. This is because the overhanging walls can adhere to a neighbouring perimeter while printing. However, this option results in slightly reduced surface quality as the external " -"perimeter is deformed by being squashed to the internal perimeter.\n" +"Use Inner/Outer for best overhangs. This is because the overhanging walls can adhere to a neighbouring perimeter while printing. However, this option results in slightly reduced surface quality as the external perimeter is deformed by being squashed to the internal perimeter.\n" "\n" -"Use Inner/Outer/Inner for the best external surface finish and dimensional accuracy as the external wall is printed undisturbed from an internal perimeter. However, overhang performance will reduce as there is no " -"internal perimeter to print the external wall against. This option requires a minimum of 3 walls to be effective as it prints the internal walls from the 3rd perimeter onwards first, then the external perimeter " -"and, finally, the first internal perimeter. This option is recommended against the Outer/Inner option in most cases.\n" +"Use Inner/Outer/Inner for the best external surface finish and dimensional accuracy as the external wall is printed undisturbed from an internal perimeter. However, overhang performance will reduce as there is no internal perimeter to print the external wall against. This option requires a minimum of 3 walls to be effective as it prints the internal walls from the 3rd perimeter onwards first, then the external perimeter and, finally, the first internal perimeter. This option is recommended against the Outer/Inner option in most cases.\n" "\n" -"Use Outer/Inner for the same external wall quality and dimensional accuracy benefits of Inner/Outer/Inner option. However, the z seams will appear less consistent as the first extrusion of a new layer starts on a " -"visible surface.\n" +"Use Outer/Inner for the same external wall quality and dimensional accuracy benefits of Inner/Outer/Inner option. However, the z seams will appear less consistent as the first extrusion of a new layer starts on a visible surface.\n" "\n" " " msgstr "" @@ -9721,8 +9645,7 @@ msgstr "" "\n" "使用内墙/外墙以获得最佳悬垂效果。这是因为在打印时,悬垂的墙可以粘附到相邻的围墙上。但是,这个选项会导致外墙的表面质量稍微降低,因为外墙被内墙挤压。\n" "\n" -"使用内墙/外墙/内墙以获得最佳的外部表面质量和尺寸精度,因为外墙不会受内墙的影响但是,悬垂性能会降低,因为没有内墙来支撑打印外墙。此选项要求至少3层墙壁才能生效,因为它首先从第3个墙壁开始打印内墙,然后是外墙,最后是" -"第一个内墙。在大多数情况下,此选项建议使用而不是外/内选项。\n" +"使用内墙/外墙/内墙以获得最佳的外部表面质量和尺寸精度,因为外墙不会受内墙的影响但是,悬垂性能会降低,因为没有内墙来支撑打印外墙。此选项要求至少3层墙壁才能生效,因为它首先从第3个墙壁开始打印内墙,然后是外墙,最后是第一个内墙。在大多数情况下,此选项建议使用而不是外/内选项。\n" "\n" "使用外/内以获得与内/外/内选项相同的外部墙质量和尺寸精度优势。但是,由于新层的第一次挤出是在可见表面上开始的,因此z缝隙看起来不那么一致。\n" "\n" @@ -9743,8 +9666,7 @@ msgstr "首先打印填充" msgid "" "Order of wall/infill. When the tickbox is unchecked the walls are printed first, which works best in most cases.\n" "\n" -"Printing infill first may help with extreme overhangs as the walls have the neighbouring infill to adhere to. However, the infill will slightly push out the printed walls where it is attached to them, resulting " -"in a worse external surface finish. It can also cause the infill to shine through the external surfaces of the part." +"Printing infill first may help with extreme overhangs as the walls have the neighbouring infill to adhere to. However, the infill will slightly push out the printed walls where it is attached to them, resulting in a worse external surface finish. It can also cause the infill to shine through the external surfaces of the part." msgstr "" "墙/填充的顺序。当未启用时,首先打印墙壁,这在大多数情况下都是最好的。\n" "\n" @@ -9796,24 +9718,14 @@ msgstr "喷嘴尖端的高度。" msgid "Bed mesh min" msgstr "网床最小点" -msgid "" -"This option sets the min point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the entire bed. To ensure the probe point does not go outside the bed area, the " -"minimum and maximum points of the bed mesh should be set appropriately. Snapmaker Orca ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max points. This information can " -"usually be obtained from your printer manufacturer. The default setting is (-99999, -99999), which means there are no limits, thus allowing probing across the entire bed." -msgstr "" -"此选项设置了允许的网床探测区域的最小点。由于探针的XY偏移,大多数打印机无法探测整个打印床。为了确保探针不会超出床的范围,应适当设置网床的最小和最大点。逆戟鲸切片确保adaptive_bed_mesh_min/adaptive_bed_mesh_max值不超" -"过这些最小/最大点。这些信息通常可以从您的打印机制造商那里获得。默认设置为(-99999, -99999),这意味着没有限制,因此允许在整个床上进行探测。" +msgid "This option sets the min point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the entire bed. To ensure the probe point does not go outside the bed area, the minimum and maximum points of the bed mesh should be set appropriately. Snapmaker Orca ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max points. This information can usually be obtained from your printer manufacturer. The default setting is (-99999, -99999), which means there are no limits, thus allowing probing across the entire bed." +msgstr "此选项设置了允许的网床探测区域的最小点。由于探针的XY偏移,大多数打印机无法探测整个打印床。为了确保探针不会超出床的范围,应适当设置网床的最小和最大点。逆戟鲸切片确保adaptive_bed_mesh_min/adaptive_bed_mesh_max值不超过这些最小/最大点。这些信息通常可以从您的打印机制造商那里获得。默认设置为(-99999, -99999),这意味着没有限制,因此允许在整个床上进行探测。" msgid "Bed mesh max" msgstr "网床最大点" -msgid "" -"This option sets the max point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the entire bed. To ensure the probe point does not go outside the bed area, the " -"minimum and maximum points of the bed mesh should be set appropriately. Snapmaker Orca ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max points. This information can " -"usually be obtained from your printer manufacturer. The default setting is (99999, 99999), which means there are no limits, thus allowing probing across the entire bed." -msgstr "" -"此选项设置了允许的网床探测区域的最大点。由于探针的XY偏移,大多数打印机无法探测整个打印床。为了确保探针不会超出床的范围,应适当设置网床的最小和最大点。逆戟鲸切片确保adaptive_bed_mesh_min/adaptive_bed_mesh_max值不超" -"过这些最小/最大点。这些信息通常可以从您的打印机制造商那里获得。默认设置为(99999, 99999),这意味着没有限制,因此允许在整个床上进行探测。" +msgid "This option sets the max point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the entire bed. To ensure the probe point does not go outside the bed area, the minimum and maximum points of the bed mesh should be set appropriately. Snapmaker Orca ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max points. This information can usually be obtained from your printer manufacturer. The default setting is (99999, 99999), which means there are no limits, thus allowing probing across the entire bed." +msgstr "此选项设置了允许的网床探测区域的最大点。由于探针的XY偏移,大多数打印机无法探测整个打印床。为了确保探针不会超出床的范围,应适当设置网床的最小和最大点。逆戟鲸切片确保adaptive_bed_mesh_min/adaptive_bed_mesh_max值不超过这些最小/最大点。这些信息通常可以从您的打印机制造商那里获得。默认设置为(99999, 99999),这意味着没有限制,因此允许在整个床上进行探测。" msgid "Probe point distance" msgstr "网格点间距离" @@ -9839,14 +9751,11 @@ msgstr "挤出机偏移" msgid "Flow ratio" msgstr "流量比例" -msgid "" -"The material may have volumetric change after switching between molten and crystalline states. This setting changes all extrusion flow of this filament in G-code proportionally. The recommended value range is " -"between 0.95 and 1.05. You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow." +msgid "The material may have volumetric change after switching between molten and crystalline states. This setting changes all extrusion flow of this filament in G-code proportionally. The recommended value range is between 0.95 and 1.05. You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow." msgstr "材料经过融化后凝固可能会产生体积差异。这个设置会等比例改变所有挤出走线的挤出量。推荐的范围为0.95到1.05。发现大平层模型的顶面有轻微的缺料或多料时,或许可以尝试微调这个参数。" msgid "" -"The material may have volumetric change after switching between molten and crystalline states. This setting changes all extrusion flow of this filament in G-code proportionally. The recommended value range is " -"between 0.95 and 1.05. You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow.\n" +"The material may have volumetric change after switching between molten and crystalline states. This setting changes all extrusion flow of this filament in G-code proportionally. The recommended value range is between 0.95 and 1.05. You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow.\n" "\n" "The final object flow ratio is this value multiplied by the filament flow ratio." msgstr "" @@ -9868,12 +9777,9 @@ msgstr "启用自适应压力提前(试验)" #, no-c-format, no-boost-format msgid "" -"With increasing print speeds (and hence increasing volumetric flow through the nozzle) and increasing accelerations, it has been observed that the effective PA value typically decreases. This means that a single " -"PA value is not always 100% optimal for all features and a compromise value is usually used that does not cause too much bulging on features with lower flow speed and accelerations while also not causing gaps on " -"faster features.\n" +"With increasing print speeds (and hence increasing volumetric flow through the nozzle) and increasing accelerations, it has been observed that the effective PA value typically decreases. This means that a single PA value is not always 100% optimal for all features and a compromise value is usually used that does not cause too much bulging on features with lower flow speed and accelerations while also not causing gaps on faster features.\n" "\n" -"This feature aims to address this limitation by modeling the response of your printer's extrusion system depending on the volumetric flow speed and acceleration it is printing at. Internally, it generates a " -"fitted model that can extrapolate the needed pressure advance for any given volumetric flow speed and acceleration, which is then emitted to the printer depending on the current print conditions.\n" +"This feature aims to address this limitation by modeling the response of your printer's extrusion system depending on the volumetric flow speed and acceleration it is printing at. Internally, it generates a fitted model that can extrapolate the needed pressure advance for any given volumetric flow speed and acceleration, which is then emitted to the printer depending on the current print conditions.\n" "\n" "When enabled, the pressure advance value above is overridden. However, a reasonable default value above is strongly recommended to act as a fallback and for when tool changing.\n" "\n" @@ -9891,21 +9797,15 @@ msgid "" "0.026,7.91,10000\n" "\n" "How to calibrate:\n" -"1. Run the pressure advance test for at least 3 speeds per acceleration value. It is recommended that the test is run for at least the speed of the external perimeters, the speed of the internal perimeters and " -"the fastest feature print speed in your profile (usually its the sparse or solid infill). Then run them for the same speeds for the slowest and fastest print accelerations, and no faster than the recommended " -"maximum acceleration as given by the Klipper input shaper\n" -"2. Take note of the optimal PA value for each volumetric flow speed and acceleration. You can find the flow number by selecting flow from the color scheme drop down and move the horizontal slider over the PA " -"pattern lines. The number should be visible at the bottom of the page. The ideal PA value should be decreasing the higher the volumetric flow is. If it is not, confirm that your extruder is functioning correctly. " -"The slower and with less acceleration you print, the larger the range of acceptable PA values. If no difference is visible, use the PA value from the faster test\n" +"1. Run the pressure advance test for at least 3 speeds per acceleration value. It is recommended that the test is run for at least the speed of the external perimeters, the speed of the internal perimeters and the fastest feature print speed in your profile (usually its the sparse or solid infill). Then run them for the same speeds for the slowest and fastest print accelerations, and no faster than the recommended maximum acceleration as given by the Klipper input shaper\n" +"2. Take note of the optimal PA value for each volumetric flow speed and acceleration. You can find the flow number by selecting flow from the color scheme drop down and move the horizontal slider over the PA pattern lines. The number should be visible at the bottom of the page. The ideal PA value should be decreasing the higher the volumetric flow is. If it is not, confirm that your extruder is functioning correctly. The slower and with less acceleration you print, the larger the range of acceptable PA values. If no difference is visible, use the PA value from the faster test\n" "3. Enter the triplets of PA values, Flow and Accelerations in the text box here and save your filament profile" msgstr "" msgid "Enable adaptive pressure advance for overhangs (beta)" msgstr "为悬垂启用自适应压力提前(试验)" -msgid "" -"Enable adaptive PA for overhangs as well as when flow changes within the same feature. This is an experimental option, as if the PA profile is not set accurately, it will cause uniformity issues on the external " -"surfaces before and after overhangs.\n" +msgid "Enable adaptive PA for overhangs as well as when flow changes within the same feature. This is an experimental option, as if the PA profile is not set accurately, it will cause uniformity issues on the external surfaces before and after overhangs.\n" msgstr "" msgid "Pressure advance for bridges" @@ -9914,8 +9814,7 @@ msgstr "为搭桥启用压力提前" msgid "" "Pressure advance value for bridges. Set to 0 to disable.\n" "\n" -"A lower PA value when printing bridges helps reduce the appearance of slight under extrusion immediately after bridges. This is caused by the pressure drop in the nozzle when printing in the air and a lower PA " -"helps counteract this." +"A lower PA value when printing bridges helps reduce the appearance of slight under extrusion immediately after bridges. This is caused by the pressure drop in the nozzle when printing in the air and a lower PA helps counteract this." msgstr "" msgid "Default line width if other line widths are set to 0. If expressed as a %, it will be computed over the nozzle diameter." @@ -9969,8 +9868,7 @@ msgstr "喷嘴硬度要求" msgid "Minimum HRC of nozzle required to print the filament. Zero means no checking of nozzle's HRC." msgstr "打印此材料的所需的最小喷嘴硬度。零值表示不检查喷嘴硬度。" -msgid "" -"This setting stands for how much volume of filament can be melted and extruded per second. Printing speed is limited by max volumetric speed, in case of too high and unreasonable speed setting. Can't be zero." +msgid "This setting stands for how much volume of filament can be melted and extruded per second. Printing speed is limited by max volumetric speed, in case of too high and unreasonable speed setting. Can't be zero." msgstr "这个设置表示在1秒内能够融化和挤出的耗材丝体积。打印速度会受到最大体积速度的限制,防止设置过高和不合理的速度。不允许设置为0。" msgid "Filament load time" @@ -10010,8 +9908,7 @@ msgstr "收缩率(XY)" #, no-c-format, no-boost-format msgid "" -"Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm). The part will be scaled in xy to compensate. Only the filament used for the perimeter is taken " -"into account.\n" +"Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm). The part will be scaled in xy to compensate. Only the filament used for the perimeter is taken into account.\n" "Be sure to allow enough space between objects, as this compensation is done after the checks." msgstr "" "冷却后耗材会收缩的百分比(如果测量的长度是94mm而不是100mm,则为是收缩率为94%)\n" @@ -10072,8 +9969,7 @@ msgstr "用于尖端成型的速度" msgid "Stamping distance measured from the center of the cooling tube" msgstr "从冷却管中心测量的尖端成型距离" -msgid "" -"If set to non-zero value, filament is moved toward the nozzle between the individual cooling moves (\"stamping\"). This option configures how long this movement should be before the filament is retracted again." +msgid "If set to non-zero value, filament is moved toward the nozzle between the individual cooling moves (\"stamping\"). This option configures how long this movement should be before the filament is retracted again." msgstr "如果设置为非零值,则在各个冷却移动之间耗材会向喷嘴方向移动(“印模”)。该选项用于配置耗材在重新回抽前应移动多长时间。" msgid "Speed of the first cooling move" @@ -10085,9 +9981,7 @@ msgstr "从这个速度开始冷却移动逐渐加速" msgid "Minimal purge on wipe tower" msgstr "擦拭塔上的最小清理量" -msgid "" -"After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a " -"sacrificial object, Snapmaker Orca will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." +msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Snapmaker Orca will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably." msgstr "换色后,新加载的耗材在喷嘴内的确切位置可能未知,耗材压力可能还不稳定。在冲刷打印头到填充或作为挤出废料之前,Snapmaker Orca将始终将这些的耗材丝冲刷到擦拭塔中以产生连续的填充或稳定的挤出废料。" msgid "Speed of the last cooling move" @@ -10105,9 +9999,7 @@ msgstr "此内容由尖端成型窗口编辑,包含尖端成型的特定参数 msgid "Enable ramming for multi-tool setups" msgstr "启用多色尖端成型设置" -msgid "" -"Perform ramming when using multi-tool printer (i.e. when the 'Single Extruder Multimaterial' in Printer Settings is unchecked). When checked, a small amount of filament is rapidly extruded on the wipe tower just " -"before the tool change. This option is only used when the wipe tower is enabled." +msgid "Perform ramming when using multi-tool printer (i.e. when the 'Single Extruder Multimaterial' in Printer Settings is unchecked). When checked, a small amount of filament is rapidly extruded on the wipe tower just before the tool change. This option is only used when the wipe tower is enabled." msgstr "多色打印机执行尖端成型时(即,当打印机设置中的单挤出机多材料未选中时)。选中时,在换色之前,会迅速挤出少量耗材丝到擦拭塔上。此选项仅在启用擦拭塔时使用。" msgid "Multi-tool ramming volume" @@ -10195,9 +10087,7 @@ msgstr "使填充和表面填充方向遵循模型在打印板上的方向。启 msgid "Insert solid layers" msgstr "插入实心层" -msgid "" -"Insert solid infill at specific layers. Use N to insert every Nth layer, N#K to insert K consecutive solid layers every N layers (K is optional, e.g. '5#' equals '5#1'), or a comma-separated list (e.g. 1,7,9) to " -"insert at explicit layers. Layers are 1-based." +msgid "Insert solid infill at specific layers. Use N to insert every Nth layer, N#K to insert K consecutive solid layers every N layers (K is optional, e.g. '5#' equals '5#1'), or a comma-separated list (e.g. 1,7,9) to insert at explicit layers. Layers are 1-based." msgstr "在特定层插入实心填充。使用N表示每N层插入一次,N#K表示每N层插入K个连续的实心层(K是可选的,例如'5#'等于'5#1'),或使用逗号分隔的列表(例如1,7,9)在指定层插入。层数从1开始。" msgid "Fill Multiline" @@ -10291,13 +10181,9 @@ msgid "Sparse infill anchor length" msgstr "稀疏填充锚线长度" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Snapmaker Orca tries to " -"connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the " -"length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n" +"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Snapmaker Orca tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n" "Set this parameter to zero to disable anchoring perimeters connected to a single infill line." -msgstr "" -"用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。Snapmaker Orca 试图将两条紧密的填充线连接到一个短的周长段。如果找不到短于“填充”和“锚点”最大值的周长线段,则填充线仅在一" -"侧连接到周长线段,并且所取周长线段的长度仅限于此参数,但不超过“锚点长度”最大值。将此参数设置为零,以禁用连接到单个填充线的锚点周长。" +msgstr "用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。Snapmaker Orca 试图将两条紧密的填充线连接到一个短的周长段。如果找不到短于“填充”和“锚点”最大值的周长线段,则填充线仅在一侧连接到周长线段,并且所取周长线段的长度仅限于此参数,但不超过“锚点长度”最大值。将此参数设置为零,以禁用连接到单个填充线的锚点周长。" msgid "0 (no open anchors)" msgstr "0 (无锚线)" @@ -10309,13 +10195,9 @@ msgid "Maximum length of the infill anchor" msgstr "填充锚线的最大长度" msgid "" -"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Snapmaker Orca tries to " -"connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length " -"of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n" +"Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. Snapmaker Orca tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n" "If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0." -msgstr "" -"用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。Snapmaker Orca 试图将两条紧密的填充线连接到一个短的周长段。如果找不到比此参数短的周长线段,则填充线仅在一侧连接到周长线" -"段,并且所采用的周长线段的长度仅限于 infl_anchor,但不超过此参数。将此参数设置为零以禁用锚点。" +msgstr "用附加周长的一小段将填充线连接到内部周长。如果以百分比(例如:15%)表示,则计算填充拉伸宽度。Snapmaker Orca 试图将两条紧密的填充线连接到一个短的周长段。如果找不到比此参数短的周长线段,则填充线仅在一侧连接到周长线段,并且所采用的周长线段的长度仅限于 infl_anchor,但不超过此参数。将此参数设置为零以禁用锚点。" msgid "0 (Simple connect)" msgstr "0(简单连接)" @@ -10426,9 +10308,7 @@ msgstr "打印首层时的喷嘴温度" msgid "Full fan speed at layer" msgstr "满速风扇在" -msgid "" -"Fan speed will be ramped up linearly from zero at layer \"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than " -"\"close_fan_the_first_x_layers\", in which case the fan will be running at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." +msgid "Fan speed will be ramped up linearly from zero at layer \"close_fan_the_first_x_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"close_fan_the_first_x_layers\", in which case the fan will be running at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1." msgstr "风扇速度将从“禁用第一层”的零线性上升到“全风扇速度层”的最大。如果低于“禁用风扇第一层”,则“全风扇速度第一层”将被忽略,在这种情况下,风扇将在“禁用风扇第一层”+1层以最大允许速度运行。" msgid "layer" @@ -10438,8 +10318,7 @@ msgid "Support interface fan speed" msgstr "支撐接触面风扇" msgid "" -"This part cooling fan speed is applied when printing support interfaces. Setting this parameter to a higher than regular speed reduces the layer binding strength between supports and the supported part, making " -"them easier to separate.\n" +"This part cooling fan speed is applied when printing support interfaces. Setting this parameter to a higher than regular speed reduces the layer binding strength between supports and the supported part, making them easier to separate.\n" "Set to -1 to disable it.\n" "This setting is overridden by disable_fan_first_layers." msgstr "" @@ -10504,13 +10383,10 @@ msgstr "绒毛表面生成器模式" msgid "" "Fuzzy skin generation mode. Works only with Arachne!\n" "Displacement: Сlassic mode when the pattern is formed by shifting the nozzle sideways from the original path.\n" -"Extrusion: The mode when the pattern formed by the amount of extruded plastic. This is the fast and straight algorithm without unnecessary nozzle shake that gives a smooth pattern. But it is more useful for " -"forming loose walls in the entire they array.\n" +"Extrusion: The mode when the pattern formed by the amount of extruded plastic. This is the fast and straight algorithm without unnecessary nozzle shake that gives a smooth pattern. But it is more useful for forming loose walls in the entire they array.\n" "Combined: Joint mode [Displacement] + [Extrusion]. The appearance of the walls is similar to [Displacement] Mode, but it leaves no pores between the perimeters.\n" "\n" -"Attention! The [Extrusion] and [Combined] modes works only the fuzzy_skin_thickness parameter not more than the thickness of printed loop. At the same time, the width of the extrusion for a particular layer " -"should also not be below a certain level. It is usually equal 15-25%% of a layer height. Therefore, the maximum fuzzy skin thickness with a perimeter width of 0.4 mm and a layer height of 0.2 mm will be 0.4-" -"(0.2*0.25)=±0.35mm! If you enter a higher parameter than this, the error Flow::spacing() will displayed, and the model will not be sliced. You can choose this number until this error is repeated." +"Attention! The [Extrusion] and [Combined] modes works only the fuzzy_skin_thickness parameter not more than the thickness of printed loop. At the same time, the width of the extrusion for a particular layer should also not be below a certain level. It is usually equal 15-25%% of a layer height. Therefore, the maximum fuzzy skin thickness with a perimeter width of 0.4 mm and a layer height of 0.2 mm will be 0.4-(0.2*0.25)=±0.35mm! If you enter a higher parameter than this, the error Flow::spacing() will displayed, and the model will not be sliced. You can choose this number until this error is repeated." msgstr "" msgid "Displacement" @@ -10597,8 +10473,7 @@ msgstr "圆弧拟合" msgid "" "Enable this to get a G-code file which has G2 and G3 moves. The fitting tolerance is same as the resolution.\n" "\n" -"Note: For Klipper machines, this option is recommended to be disabled. Klipper does not benefit from arc commands as these are split again into line segments by the firmware. This results in a reduction in " -"surface quality as line segments are converted to arcs by the slicer and then back to line segments by the firmware." +"Note: For Klipper machines, this option is recommended to be disabled. Klipper does not benefit from arc commands as these are split again into line segments by the firmware. This results in a reduction in surface quality as line segments are converted to arcs by the slicer and then back to line segments by the firmware." msgstr "" "启用此设置,导出的G-code将包含G2 G3指令。圆弧拟合的容许值和精度相同。\n" "\n" @@ -10674,8 +10549,7 @@ msgid "Enable this option if machine has auxiliary part cooling fan. G-code comm msgstr "如果打印机有辅助风扇,可以开启此选项。G-code指令:M106 P2 S(0-255)" msgid "" -"Start the fan this number of seconds earlier than its target start time (you can use fractional seconds). It assumes infinite acceleration for this time estimation, and will only take into account G1 and G0 moves " -"(arc fitting is unsupported).\n" +"Start the fan this number of seconds earlier than its target start time (you can use fractional seconds). It assumes infinite acceleration for this time estimation, and will only take into account G1 and G0 moves (arc fitting is unsupported).\n" "It won't move fan commands from custom G-code (they act as a sort of 'barrier').\n" "It won't move fan commands into the start G-code if the 'only custom start G-code' is activated.\n" "Use 0 to deactivate." @@ -10749,9 +10623,7 @@ msgstr "如果要使用多种打印床类型,请启用此选项" msgid "Label objects" msgstr "标注模型" -msgid "" -"Enable this to add comments into the G-code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi " -"Material setup and Wipe into Object / Wipe into Infill." +msgid "Enable this to add comments into the G-code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill." msgstr "启用此选项,将在G-code中添加注释,标记打印移动属于哪个对象,这对Octoprint CancelObject插件非常有用。此设置与单挤出机多材料设置和擦拭到对象/擦拭到填充不兼容。" msgid "Exclude objects" @@ -10781,10 +10653,7 @@ msgstr "" msgid "Sparse infill rotation template" msgstr "稀疏填充旋转模板" -msgid "" -"Rotate the sparse infill direction per layer using a template of angles. Enter comma-separated degrees (e.g., '0,30,60,90'). Angles are applied in order by layer and repeat when the list ends. Advanced syntax is " -"supported: '+5' rotates +5° every layer; '+5#5' rotates +5° every 5 layers. See the Wiki for details. When a template is set, the standard infill direction setting is ignored. Note: some infill patterns (e.g., " -"Gyroid) control rotation themselves; use with care." +msgid "Rotate the sparse infill direction per layer using a template of angles. Enter comma-separated degrees (e.g., '0,30,60,90'). Angles are applied in order by layer and repeat when the list ends. Advanced syntax is supported: '+5' rotates +5° every layer; '+5#5' rotates +5° every 5 layers. See the Wiki for details. When a template is set, the standard infill direction setting is ignored. Note: some infill patterns (e.g., Gyroid) control rotation themselves; use with care." msgstr "" msgid "°" @@ -10793,25 +10662,19 @@ msgstr "°" msgid "Solid infill rotation template" msgstr "实心填充旋转模板" -msgid "" -"This parameter adds a rotation of solid infill direction to each layer according to the specified template. The template is a comma-separated list of angles in degrees, e.g. '0,90'. The first angle is applied to " -"the first layer, the second angle to the second layer, and so on. If there are more layers than angles, the angles will be repeated. Note that not all solid infill patterns support rotation." +msgid "This parameter adds a rotation of solid infill direction to each layer according to the specified template. The template is a comma-separated list of angles in degrees, e.g. '0,90'. The first angle is applied to the first layer, the second angle to the second layer, and so on. If there are more layers than angles, the angles will be repeated. Note that not all solid infill patterns support rotation." msgstr "" msgid "Skeleton infill density" msgstr "骨架填充密度" -msgid "" -"The remaining part of the model contour after removing a certain depth from the surface is called the skeleton. This parameter is used to adjust the density of this section. When two regions have the same sparse " -"infill settings but different skeleton densities, their skeleton areas will develop overlapping sections. Default is as same as infill density." +msgid "The remaining part of the model contour after removing a certain depth from the surface is called the skeleton. This parameter is used to adjust the density of this section. When two regions have the same sparse infill settings but different skeleton densities, their skeleton areas will develop overlapping sections. Default is as same as infill density." msgstr "" msgid "Skin infill density" msgstr "外壳填充密度" -msgid "" -"The portion of the model's outer surface within a certain depth range is called the skin. This parameter is used to adjust the density of this section. When two regions have the same sparse infill settings but " -"different skin densities, this area will not be split into two separate regions. Default is as same as infill density." +msgid "The portion of the model's outer surface within a certain depth range is called the skin. This parameter is used to adjust the density of this section. When two regions have the same sparse infill settings but different skin densities, this area will not be split into two separate regions. Default is as same as infill density." msgstr "" msgid "Skin infill depth" @@ -10867,18 +10730,14 @@ msgid "Infill/Wall overlap" msgstr "填充/墙 重叠" #, no-c-format, no-boost-format -msgid "" -"Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is relative to line width of sparse infill. Set this value to ~10-15% to minimize potential over extrusion and " -"accumulation of material resulting in rough top surfaces." +msgid "Infill area is enlarged slightly to overlap with wall for better bonding. The percentage value is relative to line width of sparse infill. Set this value to ~10-15% to minimize potential over extrusion and accumulation of material resulting in rough top surfaces." msgstr "填充区域略微扩大以与墙壁重叠,以获得更好的粘合。百分比值相对于稀疏填充的线宽。将此值设置为约10-15%,以最小化潜在的过挤出和材料积累,从而导致顶部表面粗糙。" msgid "Top/Bottom solid infill/wall overlap" msgstr "顶/底部实心填充/墙重叠率" #, no-c-format, no-boost-format -msgid "" -"Top solid infill area is enlarged slightly to overlap with wall for better bonding and to minimize the appearance of pinholes where the top infill meets the walls. A value of 25-30% is a good starting point, " -"minimizing the appearance of pinholes. The percentage value is relative to line width of sparse infill." +msgid "Top solid infill area is enlarged slightly to overlap with wall for better bonding and to minimize the appearance of pinholes where the top infill meets the walls. A value of 25-30% is a good starting point, minimizing the appearance of pinholes. The percentage value is relative to line width of sparse infill." msgstr "顶部实心填充区域略微扩大,以便与墙壁重叠,以获得更好的粘合,并减少顶部填充与墙壁相接处的小孔出现。25-30%的值是一个很好的起点,可以减少小孔的出现。百分比值相对于稀疏填充的线宽" msgid "Speed of internal sparse infill." @@ -10905,9 +10764,7 @@ msgstr "分段区域的最大宽度。将其设置为零会禁用此功能。" msgid "Interlocking depth of a segmented region" msgstr "分割区域的交错深度" -msgid "" -"Interlocking depth of a segmented region. It will be ignored if \"mmu_segmented_region_max_width\" is zero or if \"mmu_segmented_region_interlocking_depth\" is bigger than \"mmu_segmented_region_max_width\". Zero " -"disables this feature." +msgid "Interlocking depth of a segmented region. It will be ignored if \"mmu_segmented_region_max_width\" is zero or if \"mmu_segmented_region_interlocking_depth\" is bigger than \"mmu_segmented_region_max_width\". Zero disables this feature." msgstr "分割区域的交错深度。如果\"mmu_segmented_region_max_width\"为零或\"mmu_segmented_region_interlocking_depth\"大于\"mmu_segmented_region_max_width\",则将被忽略。零将禁用此功能。" msgid "Use beam interlocking" @@ -11037,9 +10894,7 @@ msgstr "启用小区域填充的流量补偿" msgid "Flow Compensation Model" msgstr "流量补偿模型" -msgid "" -"Flow Compensation Model, used to adjust the flow for small infill areas. The model is expressed as a comma separated pair of values for extrusion length and flow correction factor. Each pair is on a separate " -"line, followed by a semicolon, in the following format: \"1.234, 5.678;\"" +msgid "Flow Compensation Model, used to adjust the flow for small infill areas. The model is expressed as a comma separated pair of values for extrusion length and flow correction factor. Each pair is on a separate line, followed by a semicolon, in the following format: \"1.234, 5.678;\"" msgstr "流量补偿模型,用于调整小填充区域的流量。该模型表示为挤出长度和流量校正因子的逗号分隔值对。每对位于单独的行上,后跟分号,格式如下:\"1.234, 5.678;\"" msgid "Maximum speed X" @@ -11180,16 +11035,13 @@ msgid "Extrusion rate smoothing" msgstr "平滑挤出率" msgid "" -"This parameter smooths out sudden extrusion rate changes that happen when the printer transitions from printing a high flow (high speed/larger width) extrusion to a lower flow (lower speed/smaller width) " -"extrusion and vice versa.\n" +"This parameter smooths out sudden extrusion rate changes that happen when the printer transitions from printing a high flow (high speed/larger width) extrusion to a lower flow (lower speed/smaller width) extrusion and vice versa.\n" "\n" "It defines the maximum rate by which the extruded volumetric flow in mm³/s can change over time. Higher values mean higher extrusion rate changes are allowed, resulting in faster speed transitions.\n" "\n" "A value of 0 disables the feature.\n" "\n" -"For a high speed, high flow direct drive printer (like the Bambu lab or Voron) this value is usually not needed. However it can provide some marginal benefit in certain cases where feature speeds vary greatly. " -"For example, when there are aggressive slowdowns due to overhangs. In these cases a high value of around 300-350 mm³/s² is recommended as this allows for just enough smoothing to assist pressure advance achieve a " -"smoother flow transition.\n" +"For a high speed, high flow direct drive printer (like the Bambu lab or Voron) this value is usually not needed. However it can provide some marginal benefit in certain cases where feature speeds vary greatly. For example, when there are aggressive slowdowns due to overhangs. In these cases a high value of around 300-350 mm³/s² is recommended as this allows for just enough smoothing to assist pressure advance achieve a smoother flow transition.\n" "\n" "For slower printers without pressure advance, the value should be set much lower. A value of 10-15 mm³/s² is a good starting point for direct drive extruders and 5-10 mm³/s² for Bowden style.\n" "\n" @@ -11202,8 +11054,7 @@ msgstr "" "\n" "值为0将禁用该功能。\n" "\n" -"对于高速、高流量的近程挤出机(如Bambu或Voron)通常不需要该值。但是,在特征速度变化很大的某些情况下,它可以提供一些边际收益。例如,当由于悬垂而出现严重的减速时。在这些情况下,建议使用一个大的值大约300-350 mm³/s²" -"的,因为这刚好允许足够的平滑,以帮助压力提前实现更平滑的流量过渡。\n" +"对于高速、高流量的近程挤出机(如Bambu或Voron)通常不需要该值。但是,在特征速度变化很大的某些情况下,它可以提供一些边际收益。例如,当由于悬垂而出现严重的减速时。在这些情况下,建议使用一个大的值大约300-350 mm³/s²的,因为这刚好允许足够的平滑,以帮助压力提前实现更平滑的流量过渡。\n" "\n" "对于没有压力提前的较慢打印机,该值应该设置得非常低。对于近程挤出机来说10-15 mm³/s²是一个很好值的起点,而对于远程挤出机来说是5-10 mm³/s²。\n" "\n" @@ -11225,9 +11076,7 @@ msgstr "" msgid "Apply only on external features" msgstr "仅应用于外部特征" -msgid "" -"Applies extrusion rate smoothing only on external perimeters and overhangs. This can help reduce artefacts due to sharp speed transitions on externally visible overhangs without impacting the print speed of " -"features that will not be visible to the user." +msgid "Applies extrusion rate smoothing only on external perimeters and overhangs. This can help reduce artefacts due to sharp speed transitions on externally visible overhangs without impacting the print speed of features that will not be visible to the user." msgstr "" msgid "Minimum speed for part cooling fan." @@ -11285,8 +11134,7 @@ msgstr "喉管的长度,用于限制冷却内部移动的空间。" msgid "High extruder current on filament swap" msgstr "更换耗材挤出机大电流" -msgid "" -"It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." +msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip." msgstr "可能有益于换耗材过程中增加挤出机电流,克服加载耗材时的阻力以加快尖端成型进料速率从而避免产生难看形状的尖端。" msgid "Filament parking position" @@ -11298,9 +11146,7 @@ msgstr "卸载时,挤出机齿尖与耗材停放位置的距离。这应该与 msgid "Extra loading distance" msgstr "额外加载距离" -msgid "" -"When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is " -"shorter than unloading." +msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading." msgstr "当设置为零时,耗材的加载移动与卸载移动的距离相同。如果为正,加载比卸载长。如果为负,加载比卸载短。" msgid "Start end points" @@ -11312,9 +11158,7 @@ msgstr "从切割区域到垃圾桶的起始和结束点。" msgid "Reduce infill retraction" msgstr "减小填充回抽" -msgid "" -"Don't retract when the travel is in infill area absolutely. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code " -"generating slower." +msgid "Don't retract when the travel is in infill area absolutely. That means the oozing can't been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower." msgstr "当空驶完全在填充区域内时不触发回抽。这意味着即使漏料也是不可见的。对于复杂模型,该设置能够减少回抽次数以及打印时长,但是会造成G-code生成变慢" msgid "This option will drop the temperature of the inactive extruders to prevent oozing." @@ -11379,11 +11223,8 @@ msgstr "" "\n" "不建议将闪电填充与此选项一起使用,因为填充物有限,无法将额外的壁厚固定在填充物上。" -msgid "" -"If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the " -"first argument, and they can access the Snapmaker Orca config settings by reading environment variables." -msgstr "" -"如果您希望使用自定义脚本来处理输出的 G-code,只需要在此列出这些脚本的绝对路径,使用分号来分割多个脚本。脚本执行的第一个参数将会被设置为 G-code 文件的绝对路径,并支持脚本通过全局变量来读取 Snapmaker Orca 的设置。" +msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Snapmaker Orca config settings by reading environment variables." +msgstr "如果您希望使用自定义脚本来处理输出的 G-code,只需要在此列出这些脚本的绝对路径,使用分号来分割多个脚本。脚本执行的第一个参数将会被设置为 G-code 文件的绝对路径,并支持脚本通过全局变量来读取 Snapmaker Orca 的设置。" msgid "Printer type" msgstr "打印机类型" @@ -11460,9 +11301,7 @@ msgstr "" msgid "Long retraction when cut (beta)" msgstr "切料时回抽(实验)" -msgid "" -"Experimental feature: Retracting and cutting off the filament at a longer distance during changes to minimize purge. While this reduces flush significantly, it may also raise the risk of nozzle clogs or other " -"printing problems." +msgid "Experimental feature: Retracting and cutting off the filament at a longer distance during changes to minimize purge. While this reduces flush significantly, it may also raise the risk of nozzle clogs or other printing problems." msgstr "实验性选项。在更换耗材丝时,将耗材丝回抽一段距离后再切断以最小化冲刷。虽然这大大减少了冲刷,但也可能增加喷嘴堵塞或其他打印问题的风险。" msgid "Retraction distance when cut" @@ -11474,9 +11313,7 @@ msgstr "实验性选项。在更换耗材丝时,切断前的回抽长度" msgid "Z-hop height" msgstr "Z抬升高度" -msgid "" -"Whenever the retraction is done, the nozzle is lifted a little to create clearance between nozzle and the print. It prevents nozzle from hitting the print when travel move. Using spiral lines to lift Z can " -"prevent stringing." +msgid "Whenever the retraction is done, the nozzle is lifted a little to create clearance between nozzle and the print. It prevents nozzle from hitting the print when travel move. Using spiral lines to lift Z can prevent stringing." msgstr "回抽完成之后,喷嘴轻微抬升,和打印件之间产生一定间隙。这能够避免空驶时喷嘴和打印件剐蹭和碰撞。使用螺旋线抬升z能够减少拉丝。" msgid "Z-hop lower boundary" @@ -11636,21 +11473,14 @@ msgid "Conditional overhang threshold" msgstr "悬垂阈值" #, no-c-format, no-boost-format -msgid "" -"This option determines the overhang threshold for the application of scarf joint seams. If the unsupported portion of the perimeter is less than this threshold, scarf joint seams will be applied. The default " -"threshold is set at 40% of the external wall's width. Due to performance considerations, the degree of overhang is estimated." +msgid "This option determines the overhang threshold for the application of scarf joint seams. If the unsupported portion of the perimeter is less than this threshold, scarf joint seams will be applied. The default threshold is set at 40% of the external wall's width. Due to performance considerations, the degree of overhang is estimated." msgstr "此选项设置斜拼接缝应用的悬垂阈值。如果围墙的未支撑部分小于此阈值,则应用斜拼接缝接缝。默认阈值设置为外墙宽度的40%。由于性能考虑,悬垂程度是粗略估算。" msgid "Scarf joint speed" msgstr "斜拼接缝速度" -msgid "" -"This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies " -"significantly from the speed of the outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default to the slower of the two speeds. When specified " -"as a percentage (e.g., 80%), the speed is calculated based on the respective outer or inner wall speed. The default value is set to 100%." -msgstr "" -"这个选项设置斜拼接缝的打印速度。建议以较慢的速度(小于100mm/s)打印斜拼接缝。如果设置的速度与外墙或内墙的速度相差较大,建议启用“平滑挤出率”。如果此处指定的速度高于外墙或内墙的速度,则打印机将默认使用两者中较慢的速" -"度。当以百分比(例如80%)指定时,速度将基于外墙或内墙的速度进行计算。默认值为100%。" +msgid "This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies significantly from the speed of the outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default to the slower of the two speeds. When specified as a percentage (e.g., 80%), the speed is calculated based on the respective outer or inner wall speed. The default value is set to 100%." +msgstr "这个选项设置斜拼接缝的打印速度。建议以较慢的速度(小于100mm/s)打印斜拼接缝。如果设置的速度与外墙或内墙的速度相差较大,建议启用“平滑挤出率”。如果此处指定的速度高于外墙或内墙的速度,则打印机将默认使用两者中较慢的速度。当以百分比(例如80%)指定时,速度将基于外墙或内墙的速度进行计算。默认值为100%。" msgid "Scarf joint flow ratio" msgstr "斜拼接缝流量" @@ -11695,9 +11525,7 @@ msgstr "同时应用斜拼接缝于内墙" msgid "Role base wipe speed" msgstr "自动擦拭速度" -msgid "" -"The wipe speed is determined by the speed of the current extrusion role. e.g. if a wipe action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for " -"the wipe action." +msgid "The wipe speed is determined by the speed of the current extrusion role. e.g. if a wipe action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for the wipe action." msgstr "擦拭速度由当前挤出类型的速度决定。例如,如果擦拭动作紧随外墙,擦拭速度将使用外墙的速度。" msgid "Wipe on loops" @@ -11710,8 +11538,7 @@ msgid "Wipe before external loop" msgstr "额外的外墙打印前擦拭" msgid "" -"To minimize visibility of potential overextrusion at the start of an external perimeter when printing with Outer/Inner or Inner/Outer/Inner wall print order, the de-retraction is performed slightly on the inside " -"from the start of the external perimeter. That way any potential over extrusion is hidden from the outside surface.\n" +"To minimize visibility of potential overextrusion at the start of an external perimeter when printing with Outer/Inner or Inner/Outer/Inner wall print order, the de-retraction is performed slightly on the inside from the start of the external perimeter. That way any potential over extrusion is hidden from the outside surface.\n" "\n" "This is useful when printing with Outer/Inner or Inner/Outer/Inner wall print order as in these modes it is more likely an external perimeter is printed immediately after a de-retraction move." msgstr "" @@ -11722,9 +11549,7 @@ msgstr "" msgid "Wipe speed" msgstr "擦拭速度" -msgid "" -"The wipe speed is determined by the speed setting specified in this configuration. If the value is expressed as a percentage (e.g. 80%), it will be calculated based on the travel speed setting above. The default " -"value for this parameter is 80%." +msgid "The wipe speed is determined by the speed setting specified in this configuration. If the value is expressed as a percentage (e.g. 80%), it will be calculated based on the travel speed setting above. The default value for this parameter is 80%." msgstr "擦拭速度是根据此配置中指定的速度设置确定的。如果该值以百分比形式表示(例如80%),则将根据上方的移动速度设置进行计算。该参数的默认值为80%。" msgid "Skirt distance" @@ -11844,27 +11669,18 @@ msgid "Spiral starting flow ratio" msgstr "螺旋开始流量比" #, no-c-format, no-boost-format -msgid "" -"Sets the starting flow ratio while transitioning from the last bottom layer to the spiral. Normally the spiral transition scales the flow ratio from 0% to 100% during the first loop which can in some cases lead " -"to under extrusion at the start of the spiral." +msgid "Sets the starting flow ratio while transitioning from the last bottom layer to the spiral. Normally the spiral transition scales the flow ratio from 0% to 100% during the first loop which can in some cases lead to under extrusion at the start of the spiral." msgstr "" msgid "Spiral finishing flow ratio" msgstr "螺旋结束流量比" #, no-c-format, no-boost-format -msgid "" -"Sets the finishing flow ratio while ending the spiral. Normally the spiral transition scales the flow ratio from 100% to 0% during the last loop which can in some cases lead to under extrusion at the end of the " -"spiral." +msgid "Sets the finishing flow ratio while ending the spiral. Normally the spiral transition scales the flow ratio from 100% to 0% during the last loop which can in some cases lead to under extrusion at the end of the spiral." msgstr "" -msgid "" -"If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a " -"timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the " -"nozzle during the process of taking a snapshot, prime tower is required for smooth mode to wipe nozzle." -msgstr "" -"如果启用平滑模式或者传统模式,将在每次打印时生成延时摄影视频。打印完每层后,将用内置相机拍摄快照。打印完成后,所有这些快照会组合成一个延时视频。如果启用平滑模式,打印完每层后,工具头将移动到吐料槽,然后拍摄快照。" -"由于平滑模式在拍摄快照的过程中熔丝可能会从喷嘴中泄漏,因此需要使用擦拭塔进行喷嘴擦拭。" +msgid "If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the nozzle during the process of taking a snapshot, prime tower is required for smooth mode to wipe nozzle." +msgstr "如果启用平滑模式或者传统模式,将在每次打印时生成延时摄影视频。打印完每层后,将用内置相机拍摄快照。打印完成后,所有这些快照会组合成一个延时视频。如果启用平滑模式,打印完每层后,工具头将移动到吐料槽,然后拍摄快照。由于平滑模式在拍摄快照的过程中熔丝可能会从喷嘴中泄漏,因此需要使用擦拭塔进行喷嘴擦拭。" msgid "Traditional" msgstr "传统模式" @@ -11879,9 +11695,7 @@ msgstr "" msgid "Preheat time" msgstr "预热时间" -msgid "" -"To reduce the waiting time after tool change, Orca can preheat the next tool while the current tool is still in use. This setting specifies the time in seconds to preheat the next tool. Orca will insert a M104 " -"command to preheat the tool in advance." +msgid "To reduce the waiting time after tool change, Orca can preheat the next tool while the current tool is still in use. This setting specifies the time in seconds to preheat the next tool. Orca will insert a M104 command to preheat the tool in advance." msgstr "" msgid "Preheat steps" @@ -11908,9 +11722,7 @@ msgstr "使用单喷嘴打印多耗材" msgid "Manual Filament Change" msgstr "手动更换丝材" -msgid "" -"Enable this option to omit the custom Change filament G-code only at the beginning of the print. The tool change command (e.g., T0) will be skipped throughout the entire print. This is useful for manual multi-" -"material printing, where we use M600/PAUSE to trigger the manual filament change action." +msgid "Enable this option to omit the custom Change filament G-code only at the beginning of the print. The tool change command (e.g., T0) will be skipped throughout the entire print. This is useful for manual multi-material printing, where we use M600/PAUSE to trigger the manual filament change action." msgstr "启用该选项可以在打印开始时省略自定义更换耗材丝的 G-code。整个打印过程中的工具头指令(如 T0)将会被跳过。这对于手动多材料打印十分有用,其将会使用 M600/PAUSE 指令来使您可以进行手动对耗材丝进行更换。" msgid "Purge in prime tower" @@ -11925,9 +11737,7 @@ msgstr "启用耗材尖端成型" msgid "No sparse layers (beta)" msgstr "无稀疏层 (实验)" -msgid "" -"If enabled, the wipe tower will not be printed on layers with no tool changes. On layers with a tool change, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no " -"collision with the print." +msgid "If enabled, the wipe tower will not be printed on layers with no tool changes. On layers with a tool change, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print." msgstr "如果启用,将不会在没有换色的层打印擦拭塔。存在换色的层时,挤出机将降低高度打印擦拭塔。用户应该确保不会与打印内容发生冲突。" msgid "Prime all printing extruders" @@ -11939,9 +11749,7 @@ msgstr "如果启用,所有挤出机将在打印开始时在床前画线" msgid "Slice gap closing radius" msgstr "切片间隙闭合半径" -msgid "" -"Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably " -"low." +msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low." msgstr "在三角形网格切片过程中,小于2倍间隙闭合半径的裂纹将被填充。间隙闭合操作可能会降低最终打印分辨率,因此建议降值保持在合理的较低水平" msgid "Slicing Mode" @@ -11962,9 +11770,7 @@ msgstr "闭孔" msgid "Z offset" msgstr "Z偏移" -msgid "" -"This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm " -"far from the print bed, set this to -0.3 (or fix your endstop)." +msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)." msgstr "此值将从输出 G-Code 中的所有 Z 坐标中添加(或减去)。它用于补偿损坏的 Z 端限位器置:例如,如果限位器零实际离开喷嘴 0.3mm 远离构建板(打印床),将其设置为 -0.3(或调整限位器)。" msgid "Enable support" @@ -12132,10 +11938,8 @@ msgid "Speed of support." msgstr "支撑打印速度" msgid "" -"Style and shape of the support. For normal support, projecting the supports into a regular grid will create more stable supports (default), while snug support towers will save material and reduce object " -"scarring.\n" -"For tree support, slim and organic style will merge branches more aggressively and save a lot of material (default organic), while hybrid style will create similar structure to normal support under large flat " -"overhangs." +"Style and shape of the support. For normal support, projecting the supports into a regular grid will create more stable supports (default), while snug support towers will save material and reduce object scarring.\n" +"For tree support, slim and organic style will merge branches more aggressively and save a lot of material (default organic), while hybrid style will create similar structure to normal support under large flat overhangs." msgstr "" "支撑物的样式和形状。对于普通支撑,将支撑投射到一个规则的网格中,将创建更稳定的支撑(默认),而紧贴的支撑塔将节省材料并减少物体的瑕疵。\n" "对于树形支撑,苗条树将更激进地合并树枝,并节省大量的材料;粗壮树会产生更大更强壮的支撑结构,但用料更多;而混合树是苗条树和普通支撑的结合,它会在大的平面悬垂下创建与正常支撑类似的结构(默认)。" @@ -12179,8 +11983,7 @@ msgstr "" msgid "Tree support branch angle" msgstr "树状支撑分支角度" -msgid "" -"This setting determines the maximum overhang angle that the branches of tree support are allowed to make. If the angle is increased, the branches can be printed more horizontally, allowing them to reach farther." +msgid "This setting determines the maximum overhang angle that the branches of tree support are allowed to make. If the angle is increased, the branches can be printed more horizontally, allowing them to reach farther." msgstr "此设置确定了允许树状支撑的最大悬垂角度。如果角度增加,可以更水平地打印分支,使它们可以到达更远的地方。" msgid "Preferred Branch Angle" @@ -12200,9 +12003,7 @@ msgid "Branch Density" msgstr "分支密度" #. TRN PrintSettings: "Organic supports" > "Branch Density" -msgid "" -"Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs but the supports are harder to remove, thus it is recommended to enable top " -"support interfaces instead of a high branch density value if dense interfaces are needed." +msgid "Adjusts the density of the support structure used to generate the tips of the branches. A higher value results in better overhangs but the supports are harder to remove, thus it is recommended to enable top support interfaces instead of a high branch density value if dense interfaces are needed." msgstr "用于调整分支尖端所生成的支撑结构的密度。值越大悬垂越好,但更难拆支撑,因此,如果需要密集的接触面,建议启用顶部接触面相关参数,而不是较高的分支密度。" msgid "Adaptive layer height" @@ -12241,9 +12042,7 @@ msgid "Branch Diameter Angle" msgstr "分支直径的角度" #. TRN PrintSettings: "Organic supports" > "Branch Diameter Angle" -msgid "" -"The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability " -"of the organic support." +msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the organic support." msgstr "分支直径的角度,随着分支向底部逐渐变厚。如果角度为0,分支将在其长度上拥有均匀的厚度。一点角度可以增加organic的稳定性。" msgid "Support wall loops" @@ -12261,9 +12060,7 @@ msgstr "这个设置决定是否为树状支撑内部的空腔生成填充。" msgid "Ironing Support Interface" msgstr "支撑界面熨烫" -msgid "" -"Ironing is using small flow to print on same height of support interface again to make it more smooth. This setting controls whether support interface being ironed. When enabled, support interface will be " -"extruded as solid too." +msgid "Ironing is using small flow to print on same height of support interface again to make it more smooth. This setting controls whether support interface being ironed. When enabled, support interface will be extruded as solid too." msgstr "" msgid "Support Ironing Pattern" @@ -12292,15 +12089,11 @@ msgid "Chamber temperature" msgstr "机箱温度" msgid "" -"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a " -"higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n" +"For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help suppress or reduce warping and potentially lead to higher interlayer bonding strength. However, at the same time, a higher chamber temperature will reduce the efficiency of air filtration for ABS and ASA.\n" "\n" -"For PLA, PETG, TPU, PVA, and other low-temperature materials, this option should be disabled (set to 0) as the chamber temperature should be low to avoid extruder clogging caused by material softening at the heat " -"break.\n" +"For PLA, PETG, TPU, PVA, and other low-temperature materials, this option should be disabled (set to 0) as the chamber temperature should be low to avoid extruder clogging caused by material softening at the heat break.\n" "\n" -"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START " -"(other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber " -"heater is installed." +"If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be used to pass the desired chamber temperature to your print start macro, or a heat soak macro like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. This may be useful if your printer does not support M141/M191 commands, or if you desire to handle heat soaking in the print start macro if no active chamber heater is installed." msgstr "" msgid "Nozzle temperature for layers after the initial one." @@ -12336,17 +12129,13 @@ msgstr "顶部壳体层数" msgid "Top shell thickness" msgstr "顶部壳体厚度" -msgid "" -"The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that " -"this setting is disabled and thickness of top shell is absolutely determined by top shell layers." +msgid "The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is absolutely determined by top shell layers." msgstr "如果由顶部壳体层数算出的厚度小于这个数值,那么切片时将自动增加顶部壳体层数。这能够避免当层高很小时,顶部壳体过薄。0表示关闭这个设置,同时顶部壳体的厚度完全由顶部壳体层数决定" msgid "Top surface density" msgstr "顶面密度" -msgid "" -"Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result " -"in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion." +msgid "Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. Reducing this value results in a textured top surface, according to the chosen top surface pattern. A value of 0% will result in only the walls on the top layer being created. Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion." msgstr "" msgid "Bottom surface density" @@ -12422,8 +12211,7 @@ msgid "Maximum wipe tower print speed" msgstr "擦拭塔最大打印速度" msgid "" -"The maximum print speed when purging in the wipe tower and printing the wipe tower sparse layers. When purging, if the sparse infill speed or calculated speed from the filament max volumetric speed is lower, the " -"lowest will be used instead.\n" +"The maximum print speed when purging in the wipe tower and printing the wipe tower sparse layers. When purging, if the sparse infill speed or calculated speed from the filament max volumetric speed is lower, the lowest will be used instead.\n" "\n" "When printing the sparse layers, if the internal perimeter speed or calculated speed from the filament max volumetric speed is lower, the lowest will be used instead.\n" "\n" @@ -12484,17 +12272,13 @@ msgstr "清理量 - 加载/卸载量" msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below." msgstr "此矢量可保存所需的体积,用于更改每个擦拭塔上工具所使用的from/to体积 。这些值用于简化完全冲刷体积的创建。" -msgid "" -"Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will " -"be seen outside. It will not take effect, unless the prime tower is enabled." +msgid "Purging after filament change will be done inside objects' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be seen outside. It will not take effect, unless the prime tower is enabled." msgstr "换料后的过渡料会被用来打印对象的填充。这样可以减少材料浪费和缩短打印时间,但是如果对象的内外墙是采用透明材料打印的,则可以从模型外观上看到内部的混色过渡料。该功能只有在启用料塔的时候才生效。" msgid "Purging after filament change will be done inside objects' support. This may lower the amount of waste and decrease the print time. It will not take effect, unless the prime tower is enabled." msgstr "换料后的过渡料会被用来打印对象的支撑。这样可以减少材料浪费以及缩短打印时间。该功能只有在启用料塔的时候才生效。" -msgid "" -"This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower " -"is enabled." +msgid "This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. Colors of the objects will be mixed as a result. It will not take effect unless the prime tower is enabled." msgstr "换料后的过渡料会被用来打印这个对象。这样可以减少材料浪费和缩短打印时间,但是这个对象的外观会是混色的。该功能只有在启用料塔的时候才生效。" msgid "Maximal bridging distance" @@ -12524,17 +12308,13 @@ msgstr "在多工具设置中,当前未使用的工具的喷嘴温度。这仅 msgid "X-Y hole compensation" msgstr "X-Y 孔洞尺寸补偿" -msgid "" -"Holes in objects will expand or contract in the XY plane by the configured value. Positive values make holes bigger, negative values make holes smaller. This function is used to adjust sizes slightly when the " -"objects have assembling issues." +msgid "Holes in objects will expand or contract in the XY plane by the configured value. Positive values make holes bigger, negative values make holes smaller. This function is used to adjust sizes slightly when the objects have assembling issues." msgstr "物体中的孔洞将在XY平面内根据配置值进行扩展或收缩。正值使孔洞变大,负值使孔洞变小。此功能用于在物体出现装配问题时微调尺寸。" msgid "X-Y contour compensation" msgstr "X-Y 外轮廓尺寸补偿" -msgid "" -"Contours of objects will expand or contract in the XY plane by the configured value. Positive values make contours bigger, negative values make contours smaller. This function is used to adjust sizes slightly " -"when the objects have assembling issues." +msgid "Contours of objects will expand or contract in the XY plane by the configured value. Positive values make contours bigger, negative values make contours smaller. This function is used to adjust sizes slightly when the objects have assembling issues." msgstr "物体的外轮廓将在XY平面内根据配置值进行扩展或收缩。正值使轮廓变大,负值使轮廓变小。此功能用于在物体出现装配问题时微调尺寸。" msgid "Convert holes to polyholes" @@ -12582,9 +12362,7 @@ msgstr "G-Code 缩略图格式: PNG 质量最佳,JPG 尺寸最小,QOI 用于 msgid "Use relative E distances" msgstr "使用相对E距离" -msgid "" -"Relative extrusion is recommended when using \"label_objects\" option. Some extruders work better with this option unchecked (absolute extrusion mode). Wipe tower is only compatible with relative mode. It is " -"recommended on most printers. Default is checked." +msgid "Relative extrusion is recommended when using \"label_objects\" option. Some extruders work better with this option unchecked (absolute extrusion mode). Wipe tower is only compatible with relative mode. It is recommended on most printers. Default is checked." msgstr "相对挤出建议在使用\"label_objects\"选项时使用。某些挤出机在未选中此选项(绝对挤出模式)时工作得更好。擦拭塔仅与相对模式兼容。建议在大多数打印机上使用。默认为选中状态。" msgid "Classic wall generator produces walls with constant extrusion width and for very thin areas is used gap-fill. Arachne engine produces walls with variable extrusion width." @@ -12596,27 +12374,19 @@ msgstr "Arachne" msgid "Wall transition length" msgstr "墙过渡长度" -msgid "" -"When transitioning between different numbers of walls as the part becomes thinner, a certain amount of space is allotted to split or join the wall segments. It's expressed as a percentage over nozzle diameter." +msgid "When transitioning between different numbers of walls as the part becomes thinner, a certain amount of space is allotted to split or join the wall segments. It's expressed as a percentage over nozzle diameter." msgstr "当零件逐渐变薄导致墙的层数发生变化时,需要在过渡段分配一定的空间来分割和连接墙走线。参数值表示为相对于喷嘴直径的百分比" msgid "Wall transitioning filter margin" msgstr "墙过渡过滤间距" -msgid "" -"Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of extrusion widths which follow to [Minimum wall width - margin, 2 * Minimum wall width + margin]. " -"Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large extrusion width variation can lead to under- or overextrusion problems. " -"It's expressed as a percentage over nozzle diameter." -msgstr "" -"防止特定厚度变化规律的局部在多一层墙和少一层墙之间来回转换。这个参数将挤压宽度的范围扩大到[墙最小宽度-参数值, 2*墙最小宽度+参数值]。增大参数可以减少转换的次数,从而减少挤出开始/停止和空驶的时间。然而,大的挤出宽度" -"变化会导致过挤出或欠挤出的问题。参数值表示为相对于喷嘴直径的百分比" +msgid "Prevent transitioning back and forth between one extra wall and one less. This margin extends the range of extrusion widths which follow to [Minimum wall width - margin, 2 * Minimum wall width + margin]. Increasing this margin reduces the number of transitions, which reduces the number of extrusion starts/stops and travel time. However, large extrusion width variation can lead to under- or overextrusion problems. It's expressed as a percentage over nozzle diameter." +msgstr "防止特定厚度变化规律的局部在多一层墙和少一层墙之间来回转换。这个参数将挤压宽度的范围扩大到[墙最小宽度-参数值, 2*墙最小宽度+参数值]。增大参数可以减少转换的次数,从而减少挤出开始/停止和空驶的时间。然而,大的挤出宽度变化会导致过挤出或欠挤出的问题。参数值表示为相对于喷嘴直径的百分比" msgid "Wall transitioning threshold angle" msgstr "墙过渡阈值角度" -msgid "" -"When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater than this setting will not have transitions and no walls will be printed in the center to fill the remaining " -"space. Reducing this setting reduces the number and length of these center walls, but may leave gaps or overextrude." +msgid "When to create transitions between even and odd numbers of walls. A wedge shape with an angle greater than this setting will not have transitions and no walls will be printed in the center to fill the remaining space. Reducing this setting reduces the number and length of these center walls, but may leave gaps or overextrude." msgstr "何时在偶数和奇数墙层数之间创建过渡段。角度大于这个阈值的楔形将不创建过渡段,并且不会在楔形中心打印墙走线以填补剩余空间。减小这个数值能减少中心墙走线的数量和长度,但可能会导致间隙或者过挤出" msgid "Wall distribution count" @@ -12628,9 +12398,7 @@ msgstr "从中心开始计算的墙层数,线宽变化需要分布在这些墙 msgid "Minimum feature size" msgstr "最小特征尺寸" -msgid "" -"Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker than than this value will be widened to the minimum wall width. It's expressed as a " -"percentage over nozzle diameter." +msgid "Minimum thickness of thin features. Model features that are thinner than this value will not be printed, while features thicker than than this value will be widened to the minimum wall width. It's expressed as a percentage over nozzle diameter." msgstr "" msgid "Minimum wall length" @@ -12639,13 +12407,11 @@ msgstr "最小允许的墙长度" msgid "" "Adjust this value to prevent short, unclosed walls from being printed, which could increase print time. Higher values remove more and longer walls.\n" "\n" -"NOTE: Bottom and top surfaces will not be affected by this value to prevent visual gaps on the outside of the model. Adjust 'One wall threshold' in the Advanced settings below to adjust the sensitivity of what is " -"considered a top-surface. 'One wall threshold' is only visible if this setting is set above the default value of 0.5, or if single-wall top surfaces is enabled." +"NOTE: Bottom and top surfaces will not be affected by this value to prevent visual gaps on the outside of the model. Adjust 'One wall threshold' in the Advanced settings below to adjust the sensitivity of what is considered a top-surface. 'One wall threshold' is only visible if this setting is set above the default value of 0.5, or if single-wall top surfaces is enabled." msgstr "" "调整这个值以省略打印短的、未闭合的墙,这些可能会增加打印时间。设置较高的值将移除更多和更长的墙。\n" "\n" -"注意:底部和顶部表面不会受到这个值的影响,以防止模型外部出现肉眼可见间隙。调整下面的高级设置中的“单层墙阈值”来调整什么被认为是顶部表面的敏感度。只有当这个设置高于默认值0.5,或者启用了单层顶部表面时,“单层墙阈值”才" -"会显示。" +"注意:底部和顶部表面不会受到这个值的影响,以防止模型外部出现肉眼可见间隙。调整下面的高级设置中的“单层墙阈值”来调整什么被认为是顶部表面的敏感度。只有当这个设置高于默认值0.5,或者启用了单层顶部表面时,“单层墙阈值”才会显示。" msgid "First layer minimum wall width" msgstr "首层墙最小线宽" @@ -12656,9 +12422,7 @@ msgstr "应用于首层的墙最小线宽,建议设置与喷嘴尺寸相同。 msgid "Minimum wall width" msgstr "墙最小线宽" -msgid "" -"Width of the wall that will replace thin features (according to the Minimum feature size) of the model. If the Minimum wall width is thinner than the thickness of the feature, the wall will become as thick as the " -"feature itself. It's expressed as a percentage over nozzle diameter." +msgid "Width of the wall that will replace thin features (according to the Minimum feature size) of the model. If the Minimum wall width is thinner than the thickness of the feature, the wall will become as thick as the feature itself. It's expressed as a percentage over nozzle diameter." msgstr "用于替换模型细小特征(根据最小特征尺寸)的墙线宽。如果墙最小线宽小于最小特征的厚度,则墙将变得和特征本身一样厚。参数值表示为相对喷嘴直径的百分比" msgid "Detect narrow internal solid infill" @@ -12985,9 +12749,7 @@ msgstr "当前Z轴抬升" msgid "Contains Z-hop present at the beginning of the custom G-code block." msgstr "包含自定义G代码块开头的Z轴抬升。" -msgid "" -"Position of the extruder at the beginning of the custom G-code block. If the custom G-code travels somewhere else, it should write to this variable so Snapmaker Orca knows where it travels from when it gets " -"control back." +msgid "Position of the extruder at the beginning of the custom G-code block. If the custom G-code travels somewhere else, it should write to this variable so Snapmaker Orca knows where it travels from when it gets control back." msgstr "" msgid "Retraction state at the beginning of the custom G-code block. If the custom G-code moves the extruder axis, it should write to this variable so Snapmaker Orca de-retracts correctly when it gets control back." @@ -13418,8 +13180,7 @@ msgid "The input value size must be 3." msgstr "输入值大小必须为3。" msgid "" -"This machine type can only hold 16 history results per nozzle. You can delete the existing historical results and then start calibration. Or you can continue the calibration, but you cannot create new calibration " -"historical results.\n" +"This machine type can only hold 16 history results per nozzle. You can delete the existing historical results and then start calibration. Or you can continue the calibration, but you cannot create new calibration historical results.\n" "Do you still want to continue the calibration?" msgstr "该机型每个喷嘴最多只能保存16个历史结果。您可以删除先已有历史结果再开始校准。或者您可以直接开始校准,但是无法创建新的校准历史结果。您仍继续校准吗?" @@ -13456,8 +13217,7 @@ msgid "When do you need Flow Dynamics Calibration" msgstr "在什么情况下需要进行动态流量校准" msgid "" -"We now have added the auto-calibration for different filaments, which is fully automated and the result will be saved into the printer for future use. You only need to do the calibration in the following limited " -"cases:\n" +"We now have added the auto-calibration for different filaments, which is fully automated and the result will be saved into the printer for future use. You only need to do the calibration in the following limited cases:\n" "1. If you introduce a new filament of different brands/models or the filament is damp;\n" "2. If the nozzle is worn out or replaced with a new one;\n" "3. If the max volumetric speed or print temperature is changed in the filament setting." @@ -13469,19 +13229,15 @@ msgstr "关于此校准" msgid "" "Please find the details of Flow Dynamics Calibration from our wiki.\n" "\n" -"Usually the calibration is unnecessary. When you start a single color/material print, with the \"flow dynamics calibration\" option checked in the print start menu, the printer will follow the old way, calibrate " -"the filament before the print; When you start a multi color/material print, the printer will use the default compensation parameter for the filament during every filament switch which will have a good result in " -"most cases.\n" +"Usually the calibration is unnecessary. When you start a single color/material print, with the \"flow dynamics calibration\" option checked in the print start menu, the printer will follow the old way, calibrate the filament before the print; When you start a multi color/material print, the printer will use the default compensation parameter for the filament during every filament switch which will have a good result in most cases.\n" "\n" -"Please note that there are a few cases that can make the calibration results unreliable, such as insufficient adhesion on the build plate. Improving adhesion can be achieved by washing the build plate or applying " -"glue. For more information on this topic, please refer to our Wiki.\n" +"Please note that there are a few cases that can make the calibration results unreliable, such as insufficient adhesion on the build plate. Improving adhesion can be achieved by washing the build plate or applying glue. For more information on this topic, please refer to our Wiki.\n" "\n" "The calibration results have about 10 percent jitter in our test, which may cause the result not exactly the same in each calibration. We are still investigating the root cause to do improvements with new updates." msgstr "" "请从我们的wiki中找到动态流量校准的详细信息。\n" "\n" -"通常情况下,校准是不必要的。当您开始单色/单材料打印,并在打印开始菜单中勾选了“动态流量校准”选项时,打印机将按照旧的方式,在打印前校准丝料;当您开始多色/多材料打印时,打印机将在每次换丝料时使用默认的补偿参数,这在" -"大多数情况下会产生良好的效果。\n" +"通常情况下,校准是不必要的。当您开始单色/单材料打印,并在打印开始菜单中勾选了“动态流量校准”选项时,打印机将按照旧的方式,在打印前校准丝料;当您开始多色/多材料打印时,打印机将在每次换丝料时使用默认的补偿参数,这在大多数情况下会产生良好的效果。\n" "\n" "有几种情况可能导致校准结果不可靠,例如打印板的的附着力不足。清洗打印板或者使用胶水可以增强打印板附着力。您可以在我们的维基上找到更多相关信息。\n" "\n" @@ -13506,25 +13262,17 @@ msgstr "" msgid "In addition, Flow Rate Calibration is crucial for foaming materials like LW-PLA used in RC planes. These materials expand greatly when heated, and calibration provides a useful reference flow rate." msgstr "此外,对于像用于遥控飞机的轻质发泡PLA(LW-PLA)这样的发泡材料,流量率校准非常重要。这些材料在加热时会大幅膨胀,而校准提供了有用的流量率参考。" -msgid "" -"Flow Rate Calibration measures the ratio of expected to actual extrusion volumes. The default setting works well in Bambu Lab printers and official filaments as they were pre-calibrated and fine-tuned. For a " -"regular filament, you usually won't need to perform a Flow Rate Calibration unless you still see the listed defects after you have done other calibrations. For more details, please check out the wiki article." -msgstr "" -"流量率校准测量预期挤出体积与实际挤出体积之间的比率。默认设置在Bambu Lab打印机和官方材料上表现良好,因为它们已经进行了预先校准和微调。对于普通的材料,通常情况下,您不需要执行流量率校准,除非在完成其他校准后仍然看到" -"上述列出的缺陷。如需更多详细信息,请查阅wiki文章。" +msgid "Flow Rate Calibration measures the ratio of expected to actual extrusion volumes. The default setting works well in Bambu Lab printers and official filaments as they were pre-calibrated and fine-tuned. For a regular filament, you usually won't need to perform a Flow Rate Calibration unless you still see the listed defects after you have done other calibrations. For more details, please check out the wiki article." +msgstr "流量率校准测量预期挤出体积与实际挤出体积之间的比率。默认设置在Bambu Lab打印机和官方材料上表现良好,因为它们已经进行了预先校准和微调。对于普通的材料,通常情况下,您不需要执行流量率校准,除非在完成其他校准后仍然看到上述列出的缺陷。如需更多详细信息,请查阅wiki文章。" msgid "" -"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, directly measuring the calibration patterns. However, please be advised that the efficacy and accuracy of this method may be compromised " -"with specific types of materials. Particularly, filaments that are transparent or semi-transparent, sparkling-particled, or have a high-reflective finish may not be suitable for this calibration and can produce " -"less-than-desirable results.\n" +"Auto Flow Rate Calibration utilizes Bambu Lab's Micro-Lidar technology, directly measuring the calibration patterns. However, please be advised that the efficacy and accuracy of this method may be compromised with specific types of materials. Particularly, filaments that are transparent or semi-transparent, sparkling-particled, or have a high-reflective finish may not be suitable for this calibration and can produce less-than-desirable results.\n" "\n" "The calibration results may vary between each calibration or filament. We are still improving the accuracy and compatibility of this calibration through firmware updates over time.\n" "\n" -"Caution: Flow Rate Calibration is an advanced process, to be attempted only by those who fully understand its purpose and implications. Incorrect usage can lead to sub-par prints or printer damage. Please make " -"sure to carefully read and understand the process before doing it." +"Caution: Flow Rate Calibration is an advanced process, to be attempted only by those who fully understand its purpose and implications. Incorrect usage can lead to sub-par prints or printer damage. Please make sure to carefully read and understand the process before doing it." msgstr "" -"自动流量率校准采用Bambu Lab的微型激光雷达技术,直接测量校准图案。然而,请注意,这种方法的功效和准确性可能会因特定类型的材料而受影响。特别是透明或半透明、带有闪光颗粒或具有高反射表面的材料可能不适合这种校准,并可能" -"产生不理想的结果。\n" +"自动流量率校准采用Bambu Lab的微型激光雷达技术,直接测量校准图案。然而,请注意,这种方法的功效和准确性可能会因特定类型的材料而受影响。特别是透明或半透明、带有闪光颗粒或具有高反射表面的材料可能不适合这种校准,并可能产生不理想的结果。\n" "\n" "校准结果可能因每次校准或材料的不同而有所不同。我们仍在通过固件更新不断提高这种校准的准确性和兼容性。\n" "\n" @@ -14775,17 +14523,13 @@ msgstr "相比于此喷嘴的默认参数,层高较大,层纹稍显现,打 msgid "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer height. This results in almost invisible layer lines and higher print quality but longer print time." msgstr "" -msgid "" -"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. This results in almost invisible layer lines and much " -"higher print quality but much longer print time." +msgid "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. This results in almost invisible layer lines and much higher print quality but much longer print time." msgstr "此为高质量参数,相比于此喷嘴的默认参数,层高较小,打印速度、加速度较低,稀疏填充图案为螺旋体,几乎不显层纹,打印质量非常高,但打印耗时很长。" msgid "Compared with the default profile of a 0.2 mm nozzle, it has a smaller layer height. This results in minimal layer lines and higher print quality but longer print time." msgstr "" -msgid "" -"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. This results in minimal layer lines and much higher " -"print quality but much longer print time." +msgid "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. This results in minimal layer lines and much higher print quality but much longer print time." msgstr "此为高质量参数,相比于此喷嘴的默认参数,层高较小,打印速度、加速度较低,稀疏填充图案为螺旋体,几乎不显层纹,打印质量非常高,但打印耗时很长。" msgid "It has a normal layer height. This results in average layer lines and print quality. It is suitable for most printing cases." @@ -14803,17 +14547,13 @@ msgstr "相比于此喷嘴的默认参数,层高较大,层纹较明显,打 msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height. This results in less apparent layer lines and higher print quality but longer print time." msgstr "相比于此喷嘴的默认参数,层高较小,层纹较不明显,打印质量较高,但打印耗时较长。" -msgid "" -"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in less apparent layer lines and much " -"higher print quality but much longer print time." +msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in less apparent layer lines and much higher print quality but much longer print time." msgstr "此为高质量参数,相比于此喷嘴的默认参数,层高较小,打印速度、加速度较低,稀疏填充图案为螺旋体,层纹较不明显,打印质量较高,但打印耗时很长。" msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height. This results in almost negligible layer lines and higher print quality but longer print time." msgstr "相比于此喷嘴的默认参数,层高较小,层纹更不明显,打印质量较高,但打印耗时较长。" -msgid "" -"Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in almost negligible layer lines and much " -"higher print quality but much longer print time." +msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height, lower speeds and acceleration, and the sparse infill pattern is Gyroid. This results in almost negligible layer lines and much higher print quality but much longer print time." msgstr "此为高质量参数,相比于此喷嘴的默认参数,层高较小,打印速度、加速度较低,稀疏填充图案为螺旋体,层纹更不明显,打印质量很高,但打印耗时很长。" msgid "Compared with the default profile of a 0.4 mm nozzle, it has a smaller layer height. This results in almost negligible layer lines and longer print time." @@ -14843,13 +14583,10 @@ msgstr "" msgid "Compared with the default profile of a 0.8 mm nozzle, it has a bigger layer height. This results in very apparent layer lines and much lower print quality, but shorter print time in some cases." msgstr "" -msgid "" -"Compared with the default profile of a 0.8 mm nozzle, it has a much bigger layer height. This results in extremely apparent layer lines and much lower print quality, but much shorter print time in some cases." +msgid "Compared with the default profile of a 0.8 mm nozzle, it has a much bigger layer height. This results in extremely apparent layer lines and much lower print quality, but much shorter print time in some cases." msgstr "" -msgid "" -"Compared with the default profile of a 0.8 mm nozzle, it has a slightly smaller layer height. This results in slightly less but still apparent layer lines and slightly higher print quality but longer print time " -"in some cases." +msgid "Compared with the default profile of a 0.8 mm nozzle, it has a slightly smaller layer height. This results in slightly less but still apparent layer lines and slightly higher print quality but longer print time in some cases." msgstr "相比于此喷嘴的默认参数,层高较小,层纹较不明显,打印质量稍微较高,部分模型的打印耗时较长。" msgid "Compared with the default profile of a 0.8 mm nozzle, it has a smaller layer height. This results in less but still apparent layer lines and slightly higher print quality but longer print time in some cases." @@ -15306,10 +15043,56 @@ msgstr "检查Web资源新版本" msgid "Export Logs" msgstr "日志导出" +msgid "Set Nozzle Diameter" +msgstr "设置喷嘴直径" + +msgid "Note: Changing this will sync all other nozzles to the same diameter." +msgstr "提示:修改后,其余喷嘴将同步调整为相同尺寸。" + +msgid "Don't show this again" +msgstr "不再提醒" + +msgid "Synchronize nozzle information" +msgstr "同步喷嘴信息" + +msgid "Nozzle settings synchronized successfully" +msgstr "喷嘴信息同步成功" + +msgid "Note: Inconsistent nozzle diameters. Current version does not support mixed diameter printing. Please select one nozzle for this print." +msgstr "提示:检测到喷嘴直径不一致。当前版本暂不支持混合直径打印,请选择用于本次打印的喷嘴。" + +msgid "Note" +msgstr "提示" + +msgid "No nozzle information detected. Please go to the printer settings to configure the nozzle." +msgstr "未检测到喷嘴信息,请前往打印机配置喷嘴。" + +msgid "Printer not connected. Please go to the home page or the device page to connect the printer." +msgstr "未连接打印机,请前往首页或设备页连接打印机。" + +msgid "Smooth PEI Plate" +msgstr "光面 PEI 热床" + +msgid "Graphic Effect Plate" +msgstr "特效纹理热床" + +msgid "Note: Filament may not adhere well to the smooth PEI plate on the first layer. Apply glue before printing." +msgstr "提示:当前耗材在光面 PEI 热床上首层附着力可能不足,建议打印前涂抹胶水。" + +msgid "Note: Filament may stick too strongly to the smooth PEI plate. Apply glue to protect the plate and ease part removal." +msgstr "提示:当前耗材在光面 PEI 热床上存在过粘风险,建议打印前涂抹胶水,以保护热床表面并便于取件。" + +msgid "Note: Low adhesion to the graphic effect plate may cause failure. Use a different filament instead." +msgstr "提示:当前耗材与特效纹理热床的粘附力较低,打印失败风险较高,建议更换其他耗材。" + +msgid "Note: Using a %s mm %s nozzle for %s is not recommended. A %s mm or larger nozzle is advised." +msgstr "提示:不推荐使用 %s mm %s热端打印 %s,建议使用 %s mm 及以上热端。" + +msgid "Warning: Do not use a %s mm %s nozzle for %s . Please switch to a %s mm or larger nozzle to prevent nozzle clogging or damage." +msgstr "警告:请勿使用 %s mm %s 热端打印 %s。请更换为 %s mm 及以上规格,以免造成喷嘴堵塞或损坏。" + #~ msgid "Improve shell precision by adjusting outer wall spacing. This also improves layer consistency." #~ msgstr "优化外墙刀路以提高外墙精度。这个优化同时减少层纹" -#~ msgid "" -#~ "Infill patterns are typically designed to handle旋转 automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to " -#~ "insufficient support. Please proceed with caution and thoroughly check for any potential printing issues.Are you sure you want to enable this option?" +#~ msgid "Infill patterns are typically designed to handle旋转 automatically to ensure proper printing and achieve their intended effects (e.g., Gyroid, Cubic). Rotating the current sparse infill pattern may lead to insufficient support. Please proceed with caution and thoroughly check for any potential printing issues.Are you sure you want to enable this option?" #~ msgstr "填充图案通常被设计为自动处理旋转以确保正确打印并达到预期效果(例如,螺旋体、立方体)。旋转当前的稀疏填充图案可能导致支撑不足。请谨慎操作并彻底检查任何潜在的打印问题。您确定要启用此选项吗?" diff --git a/src/libslic3r/FilamentHotBedNozzleRules.cpp b/src/libslic3r/FilamentHotBedNozzleRules.cpp index e865cb5fddc..bca8e1f2b01 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.cpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.cpp @@ -19,6 +19,21 @@ namespace Slic3r { namespace pt = boost::property_tree; namespace { + +// Prefer user data dir (installed system profile) so rules can be patched without reinstalling the app. +static std::string filament_hot_bed_nozzles_json_path() +{ + namespace fs = boost::filesystem; + const fs::path user_path = (fs::path(Slic3r::data_dir()) / PRESET_SYSTEM_DIR / PresetBundle::SM_BUNDLE / "filament" / + "filament_hot_bed_nozzles.json") + .make_preferred(); + if (fs::exists(user_path)) + return user_path.string(); + return (fs::path(Slic3r::resources_dir()) / "profiles" / PresetBundle::SM_BUNDLE / "filament" / "filament_hot_bed_nozzles.json") + .make_preferred() + .string(); +} + std::string to_upper_ascii(std::string s) { for (char& c : s) { @@ -315,8 +330,7 @@ void FilamentHotBedNozzleRules::load() m_nozzle_forbidden_bands.clear(); m_loaded = false; - const auto file_path = - (boost::filesystem::path(Slic3r::resources_dir()) / "profiles" / "Snapmaker" / "filament" / "filament_hot_bed_nozzles.json").string(); + const std::string file_path = filament_hot_bed_nozzles_json_path(); if (!boost::filesystem::exists(file_path)) { BOOST_LOG_TRIVIAL(warning) << "filament_hot_bed_nozzles.json not found: " << file_path; return; @@ -479,7 +493,7 @@ std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const P if (stored.empty() && filament_settings_id != nullptr && fid < filament_settings_id->values.size()) stored = filament_settings_id->get_at(fid); boost::algorithm::trim(stored); - + std::string normalized = stored; if (preset_bundle != nullptr && !normalized.empty()) { const std::string trimmed = Preset::remove_suffix_modified(normalized); diff --git a/src/libslic3r/FilamentHotBedNozzleRules.hpp b/src/libslic3r/FilamentHotBedNozzleRules.hpp index ada1195a710..cf5017e85c5 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.hpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.hpp @@ -13,7 +13,7 @@ namespace Slic3r { class PresetBundle; -// JSON: resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json +// JSON: %AppData%/.../system/Snapmaker/filament/filament_hot_bed_nozzles.json (preferred), else bundled resources path. // Keys: bed ids (btPEI, btGESP), nozzle ids ("0.2mm" …) with support/warning. // 喷嘴规则(键名以 "mm" 结尾),任选其一: // 1) 单对象 { "type":"all"|材质, "forbidden":[...] } diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp index dd54b6920f1..1704fe742ff 100644 --- a/src/slic3r/GUI/GUI_App.cpp +++ b/src/slic3r/GUI/GUI_App.cpp @@ -2361,7 +2361,7 @@ bool GUI_App::on_init_inner() const wxString resources_dir = from_u8(Slic3r::resources_dir()); wxCHECK_MSG(wxDirExists(resources_dir), false, wxString::Format(_L("Resources path does not exist or is not a directory: %s"), resources_dir)); - load_filament_hot_bed_nozzle_relations(); + // filament_hot_bed_nozzles.json: editor copies via PresetUpdater below; rules reload in load_current_presets() after presets. G-code viewer loads in the non-editor branch. #ifdef __linux__ if (! check_old_linux_datadir(GetAppName())) { @@ -2544,6 +2544,7 @@ bool GUI_App::on_init_inner() #endif // __WXMSW__ preset_updater = new PresetUpdater(); + // filament_hot_bed_nozzles.json is copied here; FilamentHotBedNozzleRules reloads in load_current_presets() (startup, recreate_GUI, preset UI sync). Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent& evt) { if (this->plater_ != nullptr) { @@ -2642,6 +2643,8 @@ bool GUI_App::on_init_inner() if (app_config->get("associate_gcode") == "true") associate_files(L"gcode"); #endif // __WXMSW__ + // G-code viewer: no PresetUpdater; rules load from bundled resources path only. + load_filament_hot_bed_nozzle_relations(); } // Suppress the '- default -' presets. @@ -6290,6 +6293,8 @@ void GUI_App::load_current_presets(bool active_preset_combox/*= false*/, bool ch // Sidebar nozzle diameter combos depend on visible printer variants; rebuild after import / preset reload. if (plater() != nullptr) plater()->sidebar().update_nozzle_settings(); + + //load_filament_hot_bed_nozzle_relations(); } static std::mutex mutex_delete_cache_presets; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 86eba676afa..8664a067bac 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -257,7 +257,7 @@ class NozzleDiameterSelectDialog : public DPIDialog if (first >= (int)item_enabled.size()) first = 0; m_radio->SetSelection(first, false); sizer->Add(m_radio, 0, wxALL, FromDIP(10)); - auto* btns = new DialogButtons(this, {"OK", "Cancel"}); + auto* btns = new DialogButtons(this, {_L("Confirm"), _L("Cancel")}); btns->GetOK()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_OK); }); btns->GetCANCEL()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_CANCEL); }); sizer->Add(btns, 0, wxEXPAND); @@ -1056,7 +1056,8 @@ Sidebar::Sidebar(Plater *parent) // Use ams_fila_sync icon (sync_nozzle_info.svg does not exist in resources) p->m_printerinfo_syncbtn = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "nozzle_sync"); - p->m_printerinfo_syncbtn->SetToolTip(_L("sync nozzle info")); + p->m_printerinfo_syncbtn->SetCursor(wxCURSOR_HAND); + p->m_printerinfo_syncbtn->SetToolTip(_L("Synchronize nozzle information")); p->m_printerinfo_syncbtn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { bool hasConnectDevice = false; auto devices = wxGetApp().app_config->get_devices(); @@ -1070,8 +1071,8 @@ Sidebar::Sidebar(Plater *parent) // showdialog tips no connect device wxTheApp->CallAfter([this]() { MessageDialog dlg(wxGetApp().mainframe, - _L("No device connected. Please connect a printer in Home or Device page."), - _L("Unbound device"), wxOK); + _L("Printer not connected. Please go to the home page or the device page to connect the printer."), + _L("Note"), wxOK); dlg.ShowModal(); }); return; @@ -1088,8 +1089,8 @@ Sidebar::Sidebar(Plater *parent) { wxTheApp->CallAfter([this]() { MessageDialog dlgEx(wxGetApp().mainframe, - _L("No printer nozzle information detected. Please go to printer configuration nozzles."), - _L("Printer has no nozzle information"), wxOK); + _L("No nozzle information detected. Please go to the printer settings to configure the nozzle."), + _L("Note"), wxOK); dlgEx.ShowModal(); }); @@ -1114,9 +1115,8 @@ Sidebar::Sidebar(Plater *parent) wxTheApp->CallAfter([this, diameters_raw]() { NozzleDiameterSelectDialog dlg( wxGetApp().mainframe, - _L("Tip: The current version does not support multi-nozzle mixed diameter printing. " - "Inconsistent printer nozzle diameters detected; please select the nozzle to be used for this print."), - _L("Set nozzle diameter"), + _L("Note: Inconsistent nozzle diameters. Current version does not support mixed diameter printing. Please select one nozzle for this print."), + _L("Set Nozzle Diameter"), diameters_raw); if (dlg.ShowModal() == wxID_OK) { std::string sel = dlg.GetSelectedDiameter(); @@ -1148,7 +1148,7 @@ Sidebar::Sidebar(Plater *parent) } wxTheApp->CallAfter([this]() { - MessageDialog dlg_Ex(wxGetApp().mainframe, _L("Nozzle information synchronization successful"), + MessageDialog dlg_Ex(wxGetApp().mainframe, _L("Nozzle settings synchronized successfully"), _L("Nozzle information synchronization results"), wxOK); dlg_Ex.ShowModal(); }); @@ -2749,10 +2749,10 @@ void Sidebar::update_nozzle_settings(bool switch_machine) if (notShow != "true") { RichMessageDialog dlg(static_cast(wxGetApp().mainframe), - _L("Note: After modification, the dimensions of the other three nozzles will also be adjusted to the same size."), - _L("Set nozzle diameter"), - wxYES); - dlg.ShowCheckBox(_L("not note again"), false); + _L("Note: Changing this will sync all other nozzles to the same diameter."), + _L("Set Nozzle Diameter"), + wxOK); + dlg.ShowCheckBox(_L("Don't show this again"), false); auto res = dlg.ShowModal(); bool isCheckBox = dlg.IsCheckBoxChecked(); @@ -6327,10 +6327,13 @@ void Plater::priv::notify_filament_compatibility_after_apply() print->filament_rule_mismatch_flags(filamentNozzleMsg, isGraphicMatch, isPeiBedMatchNotPla, isPeiBedMatchTpu, wxGetApp().preset_bundle); - wxString filamentMismatchNozzleMsg = wxString(_L("The combination of hot end and consumables is not recommended. The message reads: Printing TPU 95A HF with 0.2mm hardened steel hot end is not recommended. We suggest using 0.4mm or larger.")); - wxString filamentMismatchPeiBedMsgNotPla = wxString(_L("The current PEI glossy filament may have insufficient adhesion on the first layer of the heated bed. It is recommended to apply glue before printing to enhance adhesion.")); - wxString filamentMismatchPeiBedMsgTpu = wxString(_L("Warning: There is a risk of excessive adhesion between the current filament and the smooth PEI heated bed. It is recommended to apply liquid or solid adhesive before printing to protect the heated bed surface and facilitate part removal.")); - wxString filamentMismatchGraphicBedMsg = wxString(_L("The current filament has low adhesion to the special effects texture heated bed, resulting in a higher risk of printing failure. It is recommended to use other filaments for printing.")); + wxString filamentMismatchNozzleTips = wxString::Format(_L("Note: Using a %s mm %s nozzle for %s is not recommended. A %s mm or larger nozzle is advised."), + from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str()); + wxString filamentMismatchNozzleWarning = wxString::Format(_L("Warning: Do not use a %s mm %s nozzle for %s . Please switch to a %s mm or larger nozzle to prevent nozzle clogging or damage."), + from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str()); + wxString filamentMismatchPeiBedMsgNotPla = wxString(_L("Note: Filament may not adhere well to the smooth PEI plate on the first layer. Apply glue before printing.")); + wxString filamentMismatchPeiBedMsgTpu = wxString(_L("Note: Filament may stick too strongly to the smooth PEI plate. Apply glue to protect the plate and ease part removal.")); + wxString filamentMismatchGraphicBedMsg = wxString(_L("Note: Low adhesion to the graphic effect plate may cause failure. Use a different filament instead.")); if (isGraphicMatch || isPeiBedMatchNotPla) { @@ -6344,11 +6347,11 @@ void Plater::priv::notify_filament_compatibility_after_apply() } if (!filamentNozzleMsg.empty()) - notification_manager->push_notification(filamentMismatchNozzleMsg.ToStdString(), 0); + notification_manager->push_notification(filamentMismatchNozzleWarning.ToStdString(), 0); if (isPeiBedMatchTpu) { - notification_manager->push_notification(filamentMismatchPeiBedMsgTpu.ToStdString(), 0); + notification_manager->push_notification(filamentMismatchPeiBedMsgTpu.ToStdString(), 0); } } diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 0b8459bf6e1..04a4dc433dc 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1299,6 +1299,16 @@ bool PresetUpdater::priv::install_bundles_rsrc(const std::vector& b return boost::iends_with(name, ".stl") || boost::iends_with(name, ".png") || boost::iends_with(name, ".svg") || boost::iends_with(name, ".jpeg") || boost::iends_with(name, ".jpg") || boost::iends_with(name, ".3mf"); }, false, true, true); + + // Rules file is not a slicer preset; ensure it is always deployed next to system filament JSON. + if (bundle == PresetBundle::SM_BUNDLE) { + fs::path rules_src = rsrc_path / bundle / "filament" / "filament_hot_bed_nozzles.json"; + fs::path rules_dst = vendor_path / bundle / "filament" / "filament_hot_bed_nozzles.json"; + if (fs::exists(rules_src)) { + fs::create_directories(rules_dst.parent_path()); + updates.updates.emplace_back(std::move(rules_src), std::move(rules_dst), Version(), bundle, "", "", false, false, true); + } + } } return perform_updates(std::move(updates), snapshot); From ad905cb8010d063c2026525b49b8fcfe4adb4cb9 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 2 Apr 2026 18:31:59 +0800 Subject: [PATCH 34/46] feature update the translation. --- src/slic3r/GUI/Plater.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 8664a067bac..ccf2b645824 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -6326,11 +6326,15 @@ void Plater::priv::notify_filament_compatibility_after_apply() print->filament_rule_mismatch_flags(filamentNozzleMsg, isGraphicMatch, isPeiBedMatchNotPla, isPeiBedMatchTpu, wxGetApp().preset_bundle); - + wxString currentNozzle = "0.2"; + wxString nozzleType = _L("Stainless Steel"); + wxString tipsNozzle = "0.4"; + wxString filament = "PLA"; + wxString filamentMismatchNozzleTips = wxString::Format(_L("Note: Using a %s mm %s nozzle for %s is not recommended. A %s mm or larger nozzle is advised."), - from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str()); + from_u8(currentNozzle.ToStdString()), from_u8(nozzleType.ToStdString()), from_u8(tipsNozzle.ToStdString()),from_u8(filament.ToStdString())); wxString filamentMismatchNozzleWarning = wxString::Format(_L("Warning: Do not use a %s mm %s nozzle for %s . Please switch to a %s mm or larger nozzle to prevent nozzle clogging or damage."), - from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str(), from_u8("0.2").c_str()); + from_u8(currentNozzle.ToStdString()), from_u8(nozzleType.ToStdString()),from_u8(tipsNozzle.ToStdString()), from_u8(filament.ToStdString())); wxString filamentMismatchPeiBedMsgNotPla = wxString(_L("Note: Filament may not adhere well to the smooth PEI plate on the first layer. Apply glue before printing.")); wxString filamentMismatchPeiBedMsgTpu = wxString(_L("Note: Filament may stick too strongly to the smooth PEI plate. Apply glue to protect the plate and ease part removal.")); wxString filamentMismatchGraphicBedMsg = wxString(_L("Note: Low adhesion to the graphic effect plate may cause failure. Use a different filament instead.")); From 1bde7c68f77e68576621ad7e29b06086a4e1bed6 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 3 Apr 2026 11:32:23 +0800 Subject: [PATCH 35/46] feature update translation,fix sync nozzle bug. --- .../i18n/zh_CN/Snapmaker_Orca_zh_CN.po | 9 ++-- src/libslic3r/PresetBundle.hpp | 9 ++++ src/slic3r/GUI/Plater.cpp | 48 ++++++++++++++----- src/slic3r/GUI/PresetComboBoxes.cpp | 30 ++++++++---- src/slic3r/GUI/SSWCP.cpp | 2 + 5 files changed, 70 insertions(+), 28 deletions(-) diff --git a/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po b/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po index cdc56eeb088..ba88e5d11b3 100644 --- a/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po +++ b/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-09-28 18:44+0800\n" -"PO-Revision-Date: 2026-04-02 18:16+0800\n" +"PO-Revision-Date: 2026-04-03 11:30+0800\n" "Last-Translator: Handle \n" "Language-Team: \n" "Language: zh_CN\n" @@ -15085,11 +15085,8 @@ msgstr "提示:当前耗材在光面 PEI 热床上存在过粘风险,建议 msgid "Note: Low adhesion to the graphic effect plate may cause failure. Use a different filament instead." msgstr "提示:当前耗材与特效纹理热床的粘附力较低,打印失败风险较高,建议更换其他耗材。" -msgid "Note: Using a %s mm %s nozzle for %s is not recommended. A %s mm or larger nozzle is advised." -msgstr "提示:不推荐使用 %s mm %s热端打印 %s,建议使用 %s mm 及以上热端。" - -msgid "Warning: Do not use a %s mm %s nozzle for %s . Please switch to a %s mm or larger nozzle to prevent nozzle clogging or damage." -msgstr "警告:请勿使用 %s mm %s 热端打印 %s。请更换为 %s mm 及以上规格,以免造成喷嘴堵塞或损坏。" +msgid "Note: Using a %s mm %s nozzle for %s is not recommended." +msgstr "提示:不推荐使用 %s mm %s热端打印 %s。" #~ msgid "Improve shell precision by adjusting outer wall spacing. This also improves layer consistency." #~ msgstr "优化外墙刀路以提高外墙精度。这个优化同时减少层纹" diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index 6973a82b781..f26a6cb1964 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -26,6 +26,14 @@ enum class VendorType { Marlin, Marlin_BBL }; + +struct ConnectMachineInfo +{ + std::string filament_info {""}; + std::string nozzle_info {""}; + int index {0}; +}; + namespace Slic3r { // Bundle of Print + Filament + Printer presets. @@ -155,6 +163,7 @@ class PresetBundle // Snapmaker std::map> machine_filaments; + std::vector m_connect_machine_info_list; // Calibrate Preset const * calibrate_printer = nullptr; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index ccf2b645824..379f3611b8f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -257,7 +257,7 @@ class NozzleDiameterSelectDialog : public DPIDialog if (first >= (int)item_enabled.size()) first = 0; m_radio->SetSelection(first, false); sizer->Add(m_radio, 0, wxALL, FromDIP(10)); - auto* btns = new DialogButtons(this, {_L("Confirm"), _L("Cancel")}); + auto* btns = new DialogButtons(this, {"OK", "Cancel"}); btns->GetOK()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_OK); }); btns->GetCANCEL()->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { EndModal(wxID_CANCEL); }); sizer->Add(btns, 0, wxEXPAND); @@ -1096,7 +1096,8 @@ Sidebar::Sidebar(Plater *parent) return; } - + wxGetApp().preset_bundle->m_connect_machine_info_list.clear(); + //wxGetApp().preset_bundle->m_machine_nozzles = nozzle_diameters; bool res = false; std::string headNozzleSize = nozzle_diameters[0]; for (int i = 1; i < nozzle_diameters.size(); i++) @@ -1146,12 +1147,36 @@ Sidebar::Sidebar(Plater *parent) }); return; } + else { + // All tool heads report the same diameter: apply it without opening the picker. + std::string diameter = headNozzleSize; + boost::algorithm::trim(diameter); + if (diameter.size() > 2 && boost::iends_with(diameter, "mm")) { + diameter.resize(diameter.size() - 2); + boost::algorithm::trim(diameter); + } + wxTheApp->CallAfter([this, diameter]() { + auto preset = wxGetApp().preset_bundle->get_similar_printer_preset({}, diameter); + if (preset == nullptr) { + BOOST_LOG_TRIVIAL(error) << "get the similar printer preset fail (uniform nozzle sync)"; + return; + } + preset->is_visible = true; - wxTheApp->CallAfter([this]() { - MessageDialog dlg_Ex(wxGetApp().mainframe, _L("Nozzle settings synchronized successfully"), - _L("Nozzle information synchronization results"), wxOK); - dlg_Ex.ShowModal(); - }); + for (size_t i = 0; i < p->m_nozzle_diameter_lists.size(); ++i) + p->m_nozzle_diameter_lists[i]->SetValue(diameter + "mm"); + + wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(preset->name); + wxGetApp().plater()->sidebar().update_all_preset_comboboxes(true); + wxGetApp().plater()->sidebar().update_nozzle_settings(true); + + wxTheApp->CallAfter([this]() { + MessageDialog dlg_Ex(wxGetApp().mainframe, _L("Nozzle settings synchronized successfully"), + _L("Nozzle information synchronization results"), wxOK); + dlg_Ex.ShowModal(); + }); + }); + } } }); @@ -6329,12 +6354,9 @@ void Plater::priv::notify_filament_compatibility_after_apply() wxString currentNozzle = "0.2"; wxString nozzleType = _L("Stainless Steel"); wxString tipsNozzle = "0.4"; - wxString filament = "PLA"; - - wxString filamentMismatchNozzleTips = wxString::Format(_L("Note: Using a %s mm %s nozzle for %s is not recommended. A %s mm or larger nozzle is advised."), - from_u8(currentNozzle.ToStdString()), from_u8(nozzleType.ToStdString()), from_u8(tipsNozzle.ToStdString()),from_u8(filament.ToStdString())); - wxString filamentMismatchNozzleWarning = wxString::Format(_L("Warning: Do not use a %s mm %s nozzle for %s . Please switch to a %s mm or larger nozzle to prevent nozzle clogging or damage."), - from_u8(currentNozzle.ToStdString()), from_u8(nozzleType.ToStdString()),from_u8(tipsNozzle.ToStdString()), from_u8(filament.ToStdString())); + + wxString filamentMismatchNozzleWarning = wxString::Format(_L("Note: Using a %s mm %s nozzle for %s is not recommended."), + from_u8(currentNozzle.ToStdString()), from_u8(nozzleType.ToStdString()),from_u8(tipsNozzle.ToStdString())); wxString filamentMismatchPeiBedMsgNotPla = wxString(_L("Note: Filament may not adhere well to the smooth PEI plate on the first layer. Apply glue before printing.")); wxString filamentMismatchPeiBedMsgTpu = wxString(_L("Note: Filament may stick too strongly to the smooth PEI plate. Apply glue to protect the plate and ease part removal.")); wxString filamentMismatchGraphicBedMsg = wxString(_L("Note: Low adhesion to the graphic effect plate may cause failure. Use a different filament instead.")); diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index c6066b2848d..2bde4e49963 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -1731,6 +1731,7 @@ void TabPresetComboBox::update() set_label_marker(Append(separator(L("Machine Filament")), wxNullBitmap)); auto& filaments = m_collection->get_presets(); auto& machine_filaments = wxGetApp().preset_bundle->machine_filaments; + auto& machine_nozzles = wxGetApp().preset_bundle->m_connect_machine_info_list; m_first_ams_filament = GetCount(); size_t count = 0; @@ -1738,15 +1739,26 @@ void TabPresetComboBox::update() for (auto iter = machine_filaments.begin(); iter != machine_filaments.end();) { std::string filament_name = iter->second.first; - // First match: exact name + compatibility check - auto item_iter = std::find_if(filaments.begin(), filaments.end(), - [&filament_name, this](auto& f) { return f.name == filament_name && f.is_compatible; }); - - // Second match: if first fails, try with @U1 suffix + compatibility check - if (item_iter == filaments.end()) { - item_iter = std::find_if(filaments.begin(), filaments.end(), - [&filament_name, this](auto& f) { return f.name == filament_name + " @U1" && f.is_compatible; }); - } + auto item_iter = std::find_if(filaments.begin(), filaments.end(), [&filament_name, &machine_nozzles,this](auto& f) { + + //for (const std::string& nz : machine_nozzles) { + // if (nz.empty()) + // continue; + // if (f.name == filament_name + " @U1 " + nz) + // if (f.is_compatible) + // return true; + //} + + if (f.name == filament_name + " @U1") + if (f.is_compatible) + return true; + + if (f.name == filament_name) + if (f.is_compatible) + return true; + + return false; + }); if (item_iter != filaments.end()) { const_cast(*item_iter).is_visible = true; diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index 0b3f359a63b..e256085428f 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -5632,6 +5632,8 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_set_engine() } } else { + wxGetApp().preset_bundle->m_connect_machine_info_list.clear(); + //wxGetApp().preset_bundle->m_connect_machine_info_list = nozzle_diameters; info.nozzle_sizes = nozzle_diameters; info.preset_name = machine_type + " (" + nozzle_diameters[0] + " nozzle)"; wxGetApp().app_config->save_device_info(info); From bb75a7e01738cd92ccfbfb9b0c36db7cc28d06ce Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 3 Apr 2026 14:16:11 +0800 Subject: [PATCH 36/46] feature update the translations. --- src/libslic3r/FilamentHotBedNozzleRules.cpp | 54 +++++++++++++++++---- src/libslic3r/FilamentHotBedNozzleRules.hpp | 12 +++++ src/libslic3r/Print.cpp | 5 +- src/libslic3r/Print.hpp | 3 +- src/slic3r/GUI/Plater.cpp | 54 +++++++++++++++------ src/slic3r/GUI/SSWCP.cpp | 11 ++++- 6 files changed, 111 insertions(+), 28 deletions(-) diff --git a/src/libslic3r/FilamentHotBedNozzleRules.cpp b/src/libslic3r/FilamentHotBedNozzleRules.cpp index bca8e1f2b01..45948099385 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.cpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.cpp @@ -465,22 +465,39 @@ bool FilamentHotBedNozzleRules::is_nozzle_filament_warning(const std::string& no return false; } -std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, - const std::vector& used_filament_indices, - const PresetBundle* preset_bundle) const +static std::string nozzle_diameter_mm_display(double nozzle_diameter_mm) +{ + std::ostringstream ss; + ss << std::fixed << std::setprecision(2) << nozzle_diameter_mm; + std::string out = ss.str(); + while (!out.empty() && out.back() == '0') + out.pop_back(); + if (!out.empty() && out.back() == '.') + out.pop_back(); + return out; +} + +bool FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch_detail(const PrintConfig& cfg, + const std::vector& used_filament_indices, + const PresetBundle* preset_bundle, + NozzleFilamentRuleMismatch& out) const { std::scoped_lock lock(m_mutex); + out = NozzleFilamentRuleMismatch{}; if (!m_loaded || used_filament_indices.empty()) - return ""; + return false; const ConfigOptionStrings* filament_settings_id = cfg.option("filament_settings_id"); const PresetCollection* filament_collection = preset_bundle != nullptr ? &preset_bundle->filaments : nullptr; for (unsigned int fid : used_filament_indices) { - std::string nozzle_key_fid; + std::string nozzle_key_fid; + unsigned int nd_idx = 0; + double cur_mm = 0.; if (!cfg.nozzle_diameter.empty()) { - const unsigned int nd_idx = std::min(fid, unsigned(cfg.nozzle_diameter.size() - 1)); - nozzle_key_fid = nozzle_diameter_to_filament_rule_key(cfg.nozzle_diameter.get_at(nd_idx)); + nd_idx = std::min(fid, unsigned(cfg.nozzle_diameter.size() - 1)); + cur_mm = cfg.nozzle_diameter.get_at(nd_idx); + nozzle_key_fid = nozzle_diameter_to_filament_rule_key(cur_mm); } if (nozzle_key_fid.empty()) continue; @@ -502,11 +519,28 @@ std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const P } const std::string preset_name = resolve_filament_preset_full_name(normalized, filament_collection); - if (is_nozzle_filament_forbidden(nozzle_key_fid, preset_name, cfg.nozzle_type.value)) - return preset_name.empty() ? "forbidden filament preset for current nozzle" : preset_name; + if (!is_nozzle_filament_forbidden(nozzle_key_fid, preset_name, cfg.nozzle_type.value)) + continue; + + out.has_mismatch = true; + out.nozzle_diameter_mm = nozzle_diameter_mm_display(cur_mm); + auto nit = NozzleTypeEumnToStr.find(cfg.nozzle_type.value); + out.nozzle_type_key = (nit != NozzleTypeEumnToStr.end()) ? nit->second : std::string("undefine"); + out.filament_preset_name = preset_name; + return true; } - return ""; + return false; +} + +std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const PrintConfig& cfg, + const std::vector& used_filament_indices, + const PresetBundle* preset_bundle) const +{ + NozzleFilamentRuleMismatch d; + if (!evaluate_nozzle_filament_mismatch_detail(cfg, used_filament_indices, preset_bundle, d) || !d.has_mismatch) + return ""; + return d.filament_preset_name.empty() ? "forbidden filament preset for current nozzle" : d.filament_preset_name; } bool FilamentHotBedNozzleRules::evaluate_graphic_effect_bed_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const diff --git a/src/libslic3r/FilamentHotBedNozzleRules.hpp b/src/libslic3r/FilamentHotBedNozzleRules.hpp index cf5017e85c5..b712a1bf53d 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.hpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.hpp @@ -13,6 +13,14 @@ namespace Slic3r { class PresetBundle; +/// Filled when filament_hot_bed_nozzles.json marks the current nozzle + type as forbidden for a filament preset. +struct NozzleFilamentRuleMismatch { + bool has_mismatch{ false }; + std::string nozzle_diameter_mm; // display digits, e.g. "0.2" (no "mm" suffix) + std::string nozzle_type_key; // NozzleTypeEumnToStr: undefine, hardened_steel, stainless_steel, brass + std::string filament_preset_name; // resolved preset display name (may be empty) +}; + // JSON: %AppData%/.../system/Snapmaker/filament/filament_hot_bed_nozzles.json (preferred), else bundled resources path. // Keys: bed ids (btPEI, btGESP), nozzle ids ("0.2mm" …) with support/warning. // 喷嘴规则(键名以 "mm" 结尾),任选其一: @@ -48,6 +56,10 @@ class FilamentHotBedNozzleRules const std::vector& used_filament_indices, const PresetBundle* preset_bundle = nullptr) const; + /// @return true if a forbidden nozzle+filament combination was found (fills @p out). + bool evaluate_nozzle_filament_mismatch_detail(const PrintConfig& cfg, const std::vector& used_filament_indices, + const PresetBundle* preset_bundle, NozzleFilamentRuleMismatch& out) const; + bool evaluate_graphic_effect_bed_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const; diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index a00639223b8..43df9b8f815 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -499,7 +499,7 @@ std::vector Print::extruders(bool conside_custom_gcode) const return extruders; } -void Print::filament_rule_mismatch_flags(std::string& out_nozzle, +void Print::filament_rule_mismatch_flags(NozzleFilamentRuleMismatch& out_nozzle_mismatch, bool& out_gesp, bool& out_pei_not_pla, bool& out_pei_tpu, @@ -508,7 +508,8 @@ void Print::filament_rule_mismatch_flags(std::string& out_nozzle, FilamentHotBedNozzleRules::singleton().ensure_loaded(); const std::vector used = extruders(true); FilamentHotBedNozzleRules& rules = FilamentHotBedNozzleRules::singleton(); - out_nozzle = rules.evaluate_nozzle_filament_mismatch(m_config, used, preset_bundle); + out_nozzle_mismatch = NozzleFilamentRuleMismatch{}; + rules.evaluate_nozzle_filament_mismatch_detail(m_config, used, preset_bundle, out_nozzle_mismatch); out_gesp = rules.evaluate_graphic_effect_bed_filament_mismatch(m_config, used); diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp index 9655414917d..9177858b92f 100644 --- a/src/libslic3r/Print.hpp +++ b/src/libslic3r/Print.hpp @@ -40,6 +40,7 @@ class TreeSupportData; class TreeSupport; class PresetCollection; class PresetBundle; +struct NozzleFilamentRuleMismatch; #define MAX_OUTER_NOZZLE_DIAMETER 4 // BBS: move from PrintObjectSlice.cpp @@ -892,7 +893,7 @@ class Print : public PrintBaseWithState std::vector support_material_extruders() const; std::vector extruders(bool conside_custom_gcode = false) const; // On-demand evaluation vs filament_hot_bed_nozzles.json (calls extruders(true) once internally). - void filament_rule_mismatch_flags(std::string& out_nozzle, + void filament_rule_mismatch_flags(NozzleFilamentRuleMismatch& out_nozzle_mismatch, bool& out_gesp, bool& out_pei_not_pla, bool& out_pei_tpu, diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 379f3611b8f..327bc53d753 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -64,6 +64,7 @@ #include "libslic3r/Utils.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/ClipperUtils.hpp" +#include "libslic3r/FilamentHotBedNozzleRules.hpp" // For stl export #include "libslic3r/CSGMesh/ModelToCSGMesh.hpp" @@ -999,6 +1000,19 @@ struct DynamicFilamentList1Based : DynamicFilamentList static DynamicFilamentList dynamic_filament_list; static DynamicFilamentList1Based dynamic_filament_list_1_based; +static wxString nozzle_type_key_to_label(const std::string& key) +{ + if (key == "hardened_steel") + return _L("Hardened Steel"); + if (key == "stainless_steel") + return _L("Stainless Steel"); + if (key == "brass") + return _L("Brass"); + if (key == "undefine") + return _L("Unknown"); + return wxString::FromUTF8(key); +} + Sidebar::Sidebar(Plater *parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(42 * wxGetApp().em_unit(), -1)), p(new priv(parent)) { @@ -1097,7 +1111,14 @@ Sidebar::Sidebar(Plater *parent) return; } wxGetApp().preset_bundle->m_connect_machine_info_list.clear(); - //wxGetApp().preset_bundle->m_machine_nozzles = nozzle_diameters; + for (int i = 0; i < nozzle_diameters.size(); i++) { + ConnectMachineInfo data; + data.filament_info = "data"; + data.nozzle_info = nozzle_diameters[i]; + data.index = i; + wxGetApp().preset_bundle->m_connect_machine_info_list.push_back(data); + } + bool res = false; std::string headNozzleSize = nozzle_diameters[0]; for (int i = 1; i < nozzle_diameters.size(); i++) @@ -1172,7 +1193,7 @@ Sidebar::Sidebar(Plater *parent) wxTheApp->CallAfter([this]() { MessageDialog dlg_Ex(wxGetApp().mainframe, _L("Nozzle settings synchronized successfully"), - _L("Nozzle information synchronization results"), wxOK); + _L("Note"), wxOK); dlg_Ex.ShowModal(); }); }); @@ -6346,17 +6367,22 @@ void Plater::priv::notify_filament_compatibility_after_apply() if (print == nullptr) return; - std::string filamentNozzleMsg(""); - bool isGraphicMatch(false), isPeiBedMatchNotPla(false), isPeiBedMatchTpu(false); - - print->filament_rule_mismatch_flags(filamentNozzleMsg, isGraphicMatch, isPeiBedMatchNotPla, isPeiBedMatchTpu, + Slic3r::NozzleFilamentRuleMismatch nozzle_mismatch; + bool isGraphicMatch(false), isPeiBedMatchNotPla(false), isPeiBedMatchTpu(false); + + print->filament_rule_mismatch_flags(nozzle_mismatch, isGraphicMatch, isPeiBedMatchNotPla, isPeiBedMatchTpu, wxGetApp().preset_bundle); - wxString currentNozzle = "0.2"; - wxString nozzleType = _L("Stainless Steel"); - wxString tipsNozzle = "0.4"; - - wxString filamentMismatchNozzleWarning = wxString::Format(_L("Note: Using a %s mm %s nozzle for %s is not recommended."), - from_u8(currentNozzle.ToStdString()), from_u8(nozzleType.ToStdString()),from_u8(tipsNozzle.ToStdString())); + + wxString filamentMismatchNozzleWarning; + if (nozzle_mismatch.has_mismatch) { + const wxString currentNozzle = wxString::FromUTF8(nozzle_mismatch.nozzle_diameter_mm); + const wxString nozzleType = nozzle_type_key_to_label(nozzle_mismatch.nozzle_type_key); + const wxString filamentdata = + nozzle_mismatch.filament_preset_name.empty() ? _L("(unknown)") + : wxString::FromUTF8(nozzle_mismatch.filament_preset_name); + filamentMismatchNozzleWarning = + wxString::Format(_L("Note: Using a %s mm %s nozzle for %s is not recommended."), currentNozzle, nozzleType, filamentdata); + } wxString filamentMismatchPeiBedMsgNotPla = wxString(_L("Note: Filament may not adhere well to the smooth PEI plate on the first layer. Apply glue before printing.")); wxString filamentMismatchPeiBedMsgTpu = wxString(_L("Note: Filament may stick too strongly to the smooth PEI plate. Apply glue to protect the plate and ease part removal.")); wxString filamentMismatchGraphicBedMsg = wxString(_L("Note: Low adhesion to the graphic effect plate may cause failure. Use a different filament instead.")); @@ -6372,8 +6398,8 @@ void Plater::priv::notify_filament_compatibility_after_apply() notification_manager->set_slicing_progress_hidden(); } - if (!filamentNozzleMsg.empty()) - notification_manager->push_notification(filamentMismatchNozzleWarning.ToStdString(), 0); + if (nozzle_mismatch.has_mismatch) + notification_manager->push_notification(into_u8(filamentMismatchNozzleWarning), 0); if (isPeiBedMatchTpu) { diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index e256085428f..a6fd6b80153 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -5633,7 +5633,16 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_set_engine() } else { wxGetApp().preset_bundle->m_connect_machine_info_list.clear(); - //wxGetApp().preset_bundle->m_connect_machine_info_list = nozzle_diameters; + + for (int i = 0; i < nozzle_diameters.size(); i++) + { + ConnectMachineInfo data; + data.filament_info = "data"; + data.nozzle_info = nozzle_diameters[i]; + data.index = i; + wxGetApp().preset_bundle->m_connect_machine_info_list.push_back(data); + } + info.nozzle_sizes = nozzle_diameters; info.preset_name = machine_type + " (" + nozzle_diameters[0] + " nozzle)"; wxGetApp().app_config->save_device_info(info); From 2177da1af85955eeb092150963263e7ba281b05e Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 3 Apr 2026 19:13:15 +0800 Subject: [PATCH 37/46] fix machine sync question . --- .../i18n/zh_CN/Snapmaker_Orca_zh_CN.po | 5 +- src/libslic3r/PresetBundle.hpp | 1 + src/slic3r/GUI/Plater.cpp | 8 - src/slic3r/GUI/PresetComboBoxes.cpp | 229 ++++++++---------- src/slic3r/GUI/SSWCP.cpp | 32 ++- src/slic3r/GUI/Tab.cpp | 4 +- 6 files changed, 122 insertions(+), 157 deletions(-) diff --git a/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po b/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po index ba88e5d11b3..a1995beea0e 100644 --- a/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po +++ b/localization/i18n/zh_CN/Snapmaker_Orca_zh_CN.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Slic3rPE\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-09-28 18:44+0800\n" -"PO-Revision-Date: 2026-04-03 11:30+0800\n" +"PO-Revision-Date: 2026-04-03 17:31+0800\n" "Last-Translator: Handle \n" "Language-Team: \n" "Language: zh_CN\n" @@ -15088,6 +15088,9 @@ msgstr "提示:当前耗材与特效纹理热床的粘附力较低,打印失 msgid "Note: Using a %s mm %s nozzle for %s is not recommended." msgstr "提示:不推荐使用 %s mm %s热端打印 %s。" +msgid "Bed temperature when the Graphic Effect Plate is installed. A value of 0 means the filament does not support printing on the Graphic Effect Plate." +msgstr "安装特效纹理热床时的热床温度。0值表示这个耗材丝不支持特效纹理热床" + #~ msgid "Improve shell precision by adjusting outer wall spacing. This also improves layer consistency." #~ msgstr "优化外墙刀路以提高外墙精度。这个优化同时减少层纹" diff --git a/src/libslic3r/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp index f26a6cb1964..b58fadcbd90 100644 --- a/src/libslic3r/PresetBundle.hpp +++ b/src/libslic3r/PresetBundle.hpp @@ -31,6 +31,7 @@ struct ConnectMachineInfo { std::string filament_info {""}; std::string nozzle_info {""}; + std::string color_info{""}; int index {0}; }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 327bc53d753..00dea2aa4d4 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1110,14 +1110,6 @@ Sidebar::Sidebar(Plater *parent) return; } - wxGetApp().preset_bundle->m_connect_machine_info_list.clear(); - for (int i = 0; i < nozzle_diameters.size(); i++) { - ConnectMachineInfo data; - data.filament_info = "data"; - data.nozzle_info = nozzle_diameters[i]; - data.index = i; - wxGetApp().preset_bundle->m_connect_machine_info_list.push_back(data); - } bool res = false; std::string headNozzleSize = nozzle_diameters[0]; diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp index 2bde4e49963..42b6c32ac53 100644 --- a/src/slic3r/GUI/PresetComboBoxes.cpp +++ b/src/slic3r/GUI/PresetComboBoxes.cpp @@ -22,6 +22,7 @@ #endif #include "libslic3r/libslic3r.h" +#include "libslic3r/LocalesUtils.hpp" #include "libslic3r/PrintConfig.hpp" #include "libslic3r/PresetBundle.hpp" #include "libslic3r/Color.hpp" @@ -846,15 +847,6 @@ static void run_wizard(ConfigWizard::StartPage sp) void PlaterPresetComboBox::OnSelect(wxCommandEvent &evt) { - // if (wxGetApp().plater()) { - // auto* pNotice = wxGetApp().plater()->get_notification_manager(); - // if (pNotice) { - // pNotice->close_notification_of_type(NotificationType::CustomNotification); - //pNotice->push_notification(_u8L("Note: Printing PLA Silk on the hot end of 0.6mm hardened steel is not recommended. 0.4mm or smaller specifications are suggested."), 0); - // pNotice->set_slicing_progress_hidden(); - // } - // } - auto selected_item = evt.GetSelection(); auto marker = reinterpret_cast(this->GetClientData(selected_item)); @@ -1146,47 +1138,74 @@ void PlaterPresetComboBox::update() tooltip = get_tooltip(preset); } } - //BBS: move system to the end - //if (i + 1 == m_collection->num_default_presets()) - // set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); } if (m_type == Preset::TYPE_FILAMENT && m_preset_bundle->is_bbl_vendor()) add_ams_filaments(into_u8(selected_user_preset), true); if (m_type == Preset::TYPE_FILAMENT && wxGetApp().preset_bundle->machine_filaments.size() > 0) { set_label_marker(Append(separator(L("Machine Filament")), wxNullBitmap)); - auto& filaments = m_collection->get_presets(); + auto& filaments = m_collection->get_presets(); auto& machine_filaments = wxGetApp().preset_bundle->machine_filaments; - m_first_ams_filament = GetCount(); - - size_t count = 0; + auto machine_nozzles_list = wxGetApp().preset_bundle->m_connect_machine_info_list; + m_first_ams_filament = GetCount(); - for (auto iter = machine_filaments.begin(); iter != machine_filaments.end();) { - std::string filament_name = iter->second.first; + std::string currentNozzleInfo; + if (const auto* nd_opt = m_preset_bundle->printers.get_edited_preset().config.option("nozzle_diameter"); + nd_opt && !nd_opt->values.empty()) { + currentNozzleInfo = float_to_string_decimal_point(nd_opt->values.front(), 2); + while (!currentNozzleInfo.empty() && currentNozzleInfo.back() == '0') + currentNozzleInfo.pop_back(); + if (!currentNozzleInfo.empty() && currentNozzleInfo.back() == '.') + currentNozzleInfo.pop_back(); + } + + for (int i = 0; i < machine_nozzles_list.size(); i++) { + std::string filament_name = machine_nozzles_list[i].filament_info; + std::string machine_nozzles = machine_nozzles_list[i].nozzle_info; + + if (currentNozzleInfo != machine_nozzles) { + for (auto iter = machine_filaments.begin(); iter != machine_filaments.end(); iter++) { + if (iter->second.first == filament_name) { + machine_filaments.erase(iter); + break; + } + } + continue; + } - // First match: exact name + compatibility check auto item_iter = std::find_if(filaments.begin(), filaments.end(), - [&filament_name, this](auto& f) { return f.name == filament_name && f.is_compatible; }); + [&filament_name, &machine_nozzles, ¤tNozzleInfo](auto& f) { + if (f.name == filament_name + " @U1 " + machine_nozzles) + if (f.is_compatible) + return true; - // Second match: if first fails, try with @U1 suffix + compatibility check - if (item_iter == filaments.end()) { - item_iter = std::find_if(filaments.begin(), filaments.end(), - [&filament_name, this](auto& f) { return f.name == filament_name + " @U1" && f.is_compatible; }); - } + if (f.name == filament_name + " @U1") + if (f.is_compatible) + return true; + + if (f.name == filament_name) + if (f.is_compatible) + return true; + + return false; + }); if (item_iter != filaments.end()) { const_cast(*item_iter).is_visible = true; - auto color = iter->second.second; - auto name = std::to_string(iter->first + 1); + auto color = machine_nozzles_list[i].color_info; + auto name = std::to_string(i + 1); wxBitmap bmp(*get_extruder_color_icon(color, name, 24, 16)); - int item_id = Append(get_preset_name(*item_iter), bmp.ConvertToImage(), &m_first_ams_filament + count); - ++count; - ++iter; + int item_id = Append(get_preset_name(*item_iter), bmp.ConvertToImage(), &m_first_ams_filament + i); + } else { - iter = machine_filaments.erase(iter); + for (auto iter = machine_filaments.begin(); iter != machine_filaments.end(); iter++) { + if (iter->second.first == filament_name) { + machine_filaments.erase(iter); + break; + } + } } } - m_last_ams_filament = GetCount(); } @@ -1220,30 +1239,6 @@ void PlaterPresetComboBox::update() } } - //BBS: remove unused pysical printer logic - /*if (m_type == Preset::TYPE_PRINTER) - { - // add Physical printers, if any exists - if (!m_preset_bundle->physical_printers.empty()) { - set_label_marker(Append(separator(L("Physical printers")), wxNullBitmap)); - const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; - - for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - for (const std::string& preset_name : it->get_preset_names()) { - Preset* preset = m_collection->find_preset(preset_name); - if (!preset || !preset->is_visible) - continue; - std::string main_icon_name, bitmap_key = main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - wxBitmap* bmp = get_bmp(main_icon_name, wide_icons, main_icon_name); - assert(bmp); - - set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); - validate_selection(ph_printers.is_selected(it, preset_name)); - } - } - } - }*/ - if (m_type == Preset::TYPE_PRINTER || m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL) { wxBitmap* bmp = get_bmp("edit_preset_list", wide_icons, "edit_uni"); assert(bmp); @@ -1719,9 +1714,6 @@ void TabPresetComboBox::update() if (i == idx_selected) selected = name; } - //BBS: move system to the end - //if (i + 1 == m_collection->num_default_presets()) - // set_label_marker(Append(separator(L("System presets")), wxNullBitmap)); } if (m_type == Preset::TYPE_FILAMENT && m_preset_bundle->is_bbl_vendor()) @@ -1731,24 +1723,41 @@ void TabPresetComboBox::update() set_label_marker(Append(separator(L("Machine Filament")), wxNullBitmap)); auto& filaments = m_collection->get_presets(); auto& machine_filaments = wxGetApp().preset_bundle->machine_filaments; - auto& machine_nozzles = wxGetApp().preset_bundle->m_connect_machine_info_list; + auto machine_nozzles_list = wxGetApp().preset_bundle->m_connect_machine_info_list; m_first_ams_filament = GetCount(); - size_t count = 0; + std::string currentNozzleInfo; + if (const auto* nd_opt = m_preset_bundle->printers.get_edited_preset().config.option("nozzle_diameter"); + nd_opt && !nd_opt->values.empty()) { + currentNozzleInfo = float_to_string_decimal_point(nd_opt->values.front(), 2); + while (!currentNozzleInfo.empty() && currentNozzleInfo.back() == '0') + currentNozzleInfo.pop_back(); + if (!currentNozzleInfo.empty() && currentNozzleInfo.back() == '.') + currentNozzleInfo.pop_back(); + } - for (auto iter = machine_filaments.begin(); iter != machine_filaments.end();) { - std::string filament_name = iter->second.first; + for (int i=0; i < machine_nozzles_list.size();i++) { - auto item_iter = std::find_if(filaments.begin(), filaments.end(), [&filament_name, &machine_nozzles,this](auto& f) { - - //for (const std::string& nz : machine_nozzles) { - // if (nz.empty()) - // continue; - // if (f.name == filament_name + " @U1 " + nz) - // if (f.is_compatible) - // return true; - //} + std::string filament_name = machine_nozzles_list[i].filament_info; + std::string machine_nozzles = machine_nozzles_list[i].nozzle_info; + + if (currentNozzleInfo != machine_nozzles) + { + for (auto iter = machine_filaments.begin(); iter != machine_filaments.end(); iter++) { + if (iter->second.first == filament_name) { + machine_filaments.erase(iter); + break; + } + } + continue; + } + auto item_iter = std::find_if(filaments.begin(), filaments.end(),[&filament_name, &machine_nozzles, ¤tNozzleInfo](auto& f) { + + if (f.name == filament_name + " @U1 " + machine_nozzles) + if (f.is_compatible) + return true; + if (f.name == filament_name + " @U1") if (f.is_compatible) return true; @@ -1762,34 +1771,28 @@ void TabPresetComboBox::update() if (item_iter != filaments.end()) { const_cast(*item_iter).is_visible = true; - auto color = iter->second.second; - auto name = std::to_string(iter->first + 1); + auto color = machine_nozzles_list[i].color_info; + auto name = std::to_string(i + 1); wxBitmap bmp(*get_extruder_color_icon(color, name, 24, 16)); - int item_id = Append(get_preset_name(*item_iter), bmp.ConvertToImage(), &m_first_ams_filament + count); - ++count; - ++iter; - } else { - iter = machine_filaments.erase(iter); + int item_id = Append(get_preset_name(*item_iter), bmp.ConvertToImage(), &m_first_ams_filament + i); + + } + else + { + for (auto iter = machine_filaments.begin(); iter!=machine_filaments.end();iter++) + { + if (iter->second.first == filament_name) + { + machine_filaments.erase(iter); + break; + } + } } } m_last_ams_filament = GetCount(); } - /*machine_filament_presets[presets[1].name] = {get_bmp(presets[15]), true}; - machine_filament_presets[presets[2].name] = {get_bmp(presets[16]), true}; - if (!machine_filament_presets.empty()) { - set_label_marker(Append(separator(L("Machine presets")), wxNullBitmap)); - for (auto it = machine_filament_presets.begin(); it != machine_filament_presets.end(); ++it) { - int item_id = Append(it->first, *it->second.first); - SetItemTooltip(item_id, preset_descriptions[it->first]); - bool is_enabled = it->second.second; - if (!is_enabled) - set_label_marker(item_id, LABEL_ITEM_DISABLED); - validate_selection(it->first == selected); - } - }*/ - //BBS: add project embedded preset logic if (!project_embedded_presets.empty()) { @@ -1829,46 +1832,6 @@ void TabPresetComboBox::update() } } - if (m_type == Preset::TYPE_PRINTER) - { - //BBS: remove unused pysical printer logic - /*// add Physical printers, if any exists - if (!m_preset_bundle->physical_printers.empty()) { - set_label_marker(Append(separator(L("Physical printers")), wxNullBitmap)); - const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers; - - for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { - for (const std::string& preset_name : it->get_preset_names()) { - Preset* preset = m_collection->find_preset(preset_name); - if (!preset || !preset->is_visible) - continue; - std::string main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name; - - wxBitmap* bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false); - assert(bmp); - - set_label_marker(Append(from_u8(it->get_full_name(preset_name) + suffix(preset)), *bmp), LABEL_ITEM_PHYSICAL_PRINTER); - validate_selection(ph_printers.is_selected(it, preset_name)); - } - } - }*/ - - // add "Add/Remove printers" item - //std::string icon_name = "edit_uni"; - //wxBitmap* bmp = get_bmp("edit_preset_list, tab,", icon_name, ""); - //assert(bmp); - - //set_label_marker(Append(separator(L("Add/Remove printers")), *bmp), LABEL_ITEM_WIZARD_PRINTERS); - } - - // BBS Add/Remove filaments select - //wxBitmap* bmp = get_bmp("edit_preset_list", false, "edit_uni"); - //assert(bmp); - //if (m_type == Preset::TYPE_FILAMENT) - // set_label_marker(Append(separator(L("Add/Remove filaments")), *bmp), LABEL_ITEM_WIZARD_FILAMENTS); - //else if (m_type == Preset::TYPE_SLA_MATERIAL) - // set_label_marker(Append(separator(L("Add/Remove materials")), *bmp), LABEL_ITEM_WIZARD_MATERIALS); - update_selection(); Thaw(); } diff --git a/src/slic3r/GUI/SSWCP.cpp b/src/slic3r/GUI/SSWCP.cpp index a6fd6b80153..61eeb8d3dd3 100644 --- a/src/slic3r/GUI/SSWCP.cpp +++ b/src/slic3r/GUI/SSWCP.cpp @@ -1488,7 +1488,8 @@ void SSWCP_Instance::update_filament_info(const json& objects, bool send_message return; } - if (!j_value.count("filament_vendor") || !j_value["filament_vendor"].is_array() || !j_value.count("filament_type") || + if (!j_value.count("nozzle_diameters") ||!j_value.count("filament_vendor") || !j_value["filament_vendor"].is_array() || + !j_value.count("filament_type") || !j_value["filament_type"].is_array() || !j_value.count("filament_sub_type") || !j_value["filament_sub_type"].is_array() || ((!j_value.count("filament_color") || !j_value["filament_color"].is_array()) && (!j_value.count("filament_color_rgba") || !j_value["filament_color_rgba"].is_array())) || @@ -1502,6 +1503,7 @@ void SSWCP_Instance::update_filament_info(const json& objects, bool send_message // 存储耗材,并触发更新 auto& filaments = wxGetApp().preset_bundle->machine_filaments; + auto& machine_nozzles = wxGetApp().preset_bundle->m_connect_machine_info_list; static auto tmp_filaments = filaments; if (m_first_connected) { @@ -1509,11 +1511,13 @@ void SSWCP_Instance::update_filament_info(const json& objects, bool send_message m_first_connected = false; } + machine_nozzles.clear(); filaments.clear(); size_t count = 0; for (size_t i = 0; i < j_value["filament_official"].size(); ++i) { bool is_official = j_value["filament_official"][i].get(); + ConnectMachineInfo machineData; if (/*is_official*/ true) { std::string vendor = j_value["filament_vendor"][i].get(); std::string type = j_value["filament_type"][i].get(); @@ -1539,7 +1543,10 @@ void SSWCP_Instance::update_filament_info(const json& objects, bool send_message if (j_value.count("filament_color_rgba") && j_value["filament_color_rgba"].is_array() && j_value["filament_color_rgba"].size() != 0) { std::string str_color = "#" + j_value["filament_color_rgba"][i].get(); - filaments.insert({int(i), {name, str_color}}); + filaments.insert({int(i), {name, str_color}}); + machineData.index = i; + machineData.color_info = str_color; + machineData.filament_info = name; } else { if (j_value["filament_color"][i].is_number()) { int color = j_value["filament_color"][i].get(); @@ -1549,11 +1556,20 @@ void SSWCP_Instance::update_filament_info(const json& objects, bool send_message std::string str_color = oss.str(); filaments.insert({int(i), {name, str_color}}); + machineData.index = i; + machineData.color_info = str_color; + machineData.filament_info = name; } else { std::string str_color = "#" + j_value["filament_color"][i].get(); filaments.insert({int(i), {name, str_color}}); + machineData.index = i; + machineData.color_info = str_color; + machineData.filament_info = name; } } + if (j_value["nozzle_diameters"].is_array() && !j_value["nozzle_diameters"].empty()) + machineData.nozzle_info = j_value["nozzle_diameters"][i].get(); + machine_nozzles.push_back(machineData); } } @@ -5632,17 +5648,7 @@ void SSWCP_MqttAgent_Instance::sw_mqtt_set_engine() } } else { - wxGetApp().preset_bundle->m_connect_machine_info_list.clear(); - - for (int i = 0; i < nozzle_diameters.size(); i++) - { - ConnectMachineInfo data; - data.filament_info = "data"; - data.nozzle_info = nozzle_diameters[i]; - data.index = i; - wxGetApp().preset_bundle->m_connect_machine_info_list.push_back(data); - } - + info.nozzle_sizes = nozzle_diameters; info.preset_name = machine_type + " (" + nozzle_diameters[0] + " nozzle)"; wxGetApp().app_config->save_device_info(info); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 38549898dc7..46f818466b6 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3668,8 +3668,8 @@ void TabFilament::build() line.append_option(optgroup->get_option("textured_plate_temp")); optgroup->append_line(line); - line = {L("Graphic Effect Steel Plate"), - L("Bed temperature when the Graphic Effect Steel Plate is installed. A value of 0 means the filament does not support printing on the Graphic Effect Steel Plate.")}; + line = {L("Graphic Effect Plate"), + L("Bed temperature when the Graphic Effect Plate is installed. A value of 0 means the filament does not support printing on the Graphic Effect Plate.")}; line.append_option(optgroup->get_option("graphic_effect_plate_temp_initial_layer")); line.append_option(optgroup->get_option("graphic_effect_plate_temp")); optgroup->append_line(line); From 2c0461875465748a202cf5a682e9e8798bb87c65 Mon Sep 17 00:00:00 2001 From: alves Date: Fri, 3 Apr 2026 20:02:25 +0800 Subject: [PATCH 38/46] feature update the hot bed tmp --- src/libslic3r/PrintConfig.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index ed386e6a4fe..69f5eed4005 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -784,8 +784,8 @@ void PrintConfigDef::init_fff_params() def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->full_label = L("Bed temperature"); def->min = 0; - def->max = 300; - def->set_default_value(new ConfigOptionInts{100}); + def->max = 100; + def->set_default_value(new ConfigOptionInts{45}); def = this->add("supertack_plate_temp_initial_layer", coInts); def->label = L("Initial layer"); @@ -853,8 +853,8 @@ void PrintConfigDef::init_fff_params() "A value of 0 means the filament does not support printing on the Graphic Effect Plate."); def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->min = 0; - def->max = 300; - def->set_default_value(new ConfigOptionInts{100}); + def->max = 100; + def->set_default_value(new ConfigOptionInts{45}); def = this->add("curr_bed_type", coEnum); def->label = L("Bed type"); From 74e384a7f904e35a37cc6fc8421b8c76815a06bf Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 7 Apr 2026 10:35:40 +0800 Subject: [PATCH 39/46] feature update the hot bed tmp --- src/libslic3r/PrintConfig.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 69f5eed4005..42f47c22c11 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -784,8 +784,8 @@ void PrintConfigDef::init_fff_params() def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->full_label = L("Bed temperature"); def->min = 0; - def->max = 100; - def->set_default_value(new ConfigOptionInts{45}); + def->max = 300; + def->set_default_value(new ConfigOptionInts{0}); def = this->add("supertack_plate_temp_initial_layer", coInts); def->label = L("Initial layer"); @@ -834,7 +834,7 @@ void PrintConfigDef::init_fff_params() "A value of 0 means the filament does not support printing on the High Temp Plate."); def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->max = 300; - def->set_default_value(new ConfigOptionInts{ 120 }); + def->set_default_value(new ConfigOptionInts{ 45 }); def = this->add("textured_plate_temp_initial_layer", coInts); def->label = L("Initial layer"); @@ -853,8 +853,8 @@ void PrintConfigDef::init_fff_params() "A value of 0 means the filament does not support printing on the Graphic Effect Plate."); def->sidetext = u8"\u2103" /* °C */; // degrees Celsius, don't need translation def->min = 0; - def->max = 100; - def->set_default_value(new ConfigOptionInts{45}); + def->max = 300; + def->set_default_value(new ConfigOptionInts{0}); def = this->add("curr_bed_type", coEnum); def->label = L("Bed type"); From a85a8d6f82369158524bdd64eb9d738f1aef150f Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 7 Apr 2026 14:10:34 +0800 Subject: [PATCH 40/46] fix warning rule not work question. --- .../filament/filament_hot_bed_nozzles.json | 55 ++++++++++++++++--- src/libslic3r/FilamentHotBedNozzleRules.cpp | 28 ++-------- src/slic3r/GUI/Tab.cpp | 4 +- 3 files changed, 55 insertions(+), 32 deletions(-) diff --git a/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json b/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json index 0156884a77f..5ebaae04280 100644 --- a/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json +++ b/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json @@ -1,15 +1,56 @@ { "btPEI": { - "support":["PLA"], - "warning":["TPU"] + "support": ["PLA"], + "warning": ["TPU"] }, "btGESP": { - "support": ["PLA","TPU"] + "support": ["PLA", "TPU"] + }, + "0.4mm": { + "brass": { + "warning": [ + "Snapmaker TPU 95A HF", + "Snapmaker TPU 90A", + "Snapmaker PLA Matte" + ] + }, + "hardened_steel": { + "warning": [ + "Snapmaker TPU 90A", + "Snapmaker PLA Matte" + ] + }, + "undefine": { + "warning": [ + "Snapmaker TPU 95A HF", + "Snapmaker PLA Basic" + ] + } + }, + "0.8mm": { + "brass": { + "warning": [ + "Generic TPU", + "Generic PLA", + "Snapmaker PETG HF" + ] + } }, "0.2mm": { - "forbidden": [ - "Snapmaker TPU 95A HF", - "Snapmaker TPU 95A" - ] + "all": { + "warning": [ + "Snapmaker PETG HF", + "Snapmaker PLA Matte" + ] + } + }, + "0.6mm": { + "undefine": { + "warning": [ + "Generic TPU", + "Generic PLA", + "Snapmaker PETG HF" + ] + } } } diff --git a/src/libslic3r/FilamentHotBedNozzleRules.cpp b/src/libslic3r/FilamentHotBedNozzleRules.cpp index 45948099385..91cd93e7cea 100644 --- a/src/libslic3r/FilamentHotBedNozzleRules.cpp +++ b/src/libslic3r/FilamentHotBedNozzleRules.cpp @@ -416,26 +416,10 @@ bool FilamentHotBedNozzleRules::is_bed_filament_warning(const std::string& bed_k bool FilamentHotBedNozzleRules::is_nozzle_filament_forbidden(const std::string& nozzle_key, const std::string& filament_preset_name, NozzleType nozzle_type) const { - std::scoped_lock lock(m_mutex); - auto it = m_nozzle_forbidden_bands.find(nozzle_key); - if (it == m_nozzle_forbidden_bands.end()) - return false; - - std::string cur_type = "undefine"; - auto nit = NozzleTypeEumnToStr.find(nozzle_type); - if (nit != NozzleTypeEumnToStr.end()) - cur_type = nit->second; - - for (const NozzleForbiddenBand& band : it->second) { - if (!band.applies_to_all_nozzle_types) { - if (band.nozzle_types.find(cur_type) == band.nozzle_types.end()) - continue; - } - for (const std::string& token : band.forbidden_substrings) { - if (!token.empty() && filament_preset_name.find(token) != std::string::npos) - return true; - } - } + (void)nozzle_key; + (void)filament_preset_name; + (void)nozzle_type; + // JSON "forbidden" for nozzle+filament is intentionally not applied; use warning lists only. return false; } @@ -519,7 +503,7 @@ bool FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch_detail(const P } const std::string preset_name = resolve_filament_preset_full_name(normalized, filament_collection); - if (!is_nozzle_filament_forbidden(nozzle_key_fid, preset_name, cfg.nozzle_type.value)) + if (!is_nozzle_filament_warning(nozzle_key_fid, preset_name, cfg.nozzle_type.value)) continue; out.has_mismatch = true; @@ -540,7 +524,7 @@ std::string FilamentHotBedNozzleRules::evaluate_nozzle_filament_mismatch(const P NozzleFilamentRuleMismatch d; if (!evaluate_nozzle_filament_mismatch_detail(cfg, used_filament_indices, preset_bundle, d) || !d.has_mismatch) return ""; - return d.filament_preset_name.empty() ? "forbidden filament preset for current nozzle" : d.filament_preset_name; + return d.filament_preset_name.empty() ? "nozzle filament preset warning" : d.filament_preset_name; } bool FilamentHotBedNozzleRules::evaluate_graphic_effect_bed_filament_mismatch(const PrintConfig& cfg, const std::vector& used_filament_indices) const diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 46f818466b6..6bcfdfc2bfa 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -124,9 +124,7 @@ static void validate_filament_hot_bed_nozzle_relation(wxWindow* parent) NozzleType nozzle_mat = NozzleType::ntUndefine; if (const auto* nto = printer_config.option>("nozzle_type")) nozzle_mat = nto->value; - const bool is_forbidden = app.is_nozzle_filament_forbidden(nozzle_key, filament_preset.name, nozzle_mat); - const bool is_noz_warn = app.is_nozzle_filament_warning(nozzle_key, filament_preset.name, nozzle_mat); - (void)is_forbidden; + const bool is_noz_warn = app.is_nozzle_filament_warning(nozzle_key, filament_preset.name, nozzle_mat); (void)is_noz_warn; } } From 0d3d069e05caf830fd000d3dc42731200f882964 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 7 Apr 2026 14:58:06 +0800 Subject: [PATCH 41/46] fix switch machine and the device show incorrect. --- src/slic3r/GUI/Plater.cpp | 4 +--- src/slic3r/GUI/PrinterWebView.cpp | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 00dea2aa4d4..7df5e1af72f 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1906,9 +1906,7 @@ void Sidebar::update_all_preset_comboboxes(bool reload_printer_view) } if(hasOnlineMachine) - p->combo_printer->set_show_machine_connecting_button(true); - } - else { + p->combo_printer->set_show_machine_connecting_button(true); wxString url = wxString::FromUTF8(LOCALHOST_URL + std::to_string(PAGE_HTTP_PORT) + "/web/flutter_web/index.html?path=2"); diff --git a/src/slic3r/GUI/PrinterWebView.cpp b/src/slic3r/GUI/PrinterWebView.cpp index 0599d42940b..5400eb53056 100644 --- a/src/slic3r/GUI/PrinterWebView.cpp +++ b/src/slic3r/GUI/PrinterWebView.cpp @@ -93,8 +93,11 @@ void PrinterWebView::reload() bool PrinterWebView::isSnapmakerPage() { + if (m_browser == nullptr) + return false; auto url = m_browser->GetCurrentURL(); - return (url.find("flutter_web") != std::string::npos); + // path=3 is still flutter_web but is the non-U1 connection UI; U1 device tab uses path=2. + return url.Contains("flutter_web") && url.Contains("path=2"); } void PrinterWebView::sendMessage(const std::string& msg) { From 6c9c33967ff756737979856680d41c49a6f52dd2 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 7 Apr 2026 15:20:15 +0800 Subject: [PATCH 42/46] feature update the config for tips hot bed and use the filament to slice module. --- .../filament/filament_hot_bed_nozzles.json | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json b/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json index 5ebaae04280..17016c45f0c 100644 --- a/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json +++ b/resources/profiles/Snapmaker/filament/filament_hot_bed_nozzles.json @@ -5,52 +5,5 @@ }, "btGESP": { "support": ["PLA", "TPU"] - }, - "0.4mm": { - "brass": { - "warning": [ - "Snapmaker TPU 95A HF", - "Snapmaker TPU 90A", - "Snapmaker PLA Matte" - ] - }, - "hardened_steel": { - "warning": [ - "Snapmaker TPU 90A", - "Snapmaker PLA Matte" - ] - }, - "undefine": { - "warning": [ - "Snapmaker TPU 95A HF", - "Snapmaker PLA Basic" - ] - } - }, - "0.8mm": { - "brass": { - "warning": [ - "Generic TPU", - "Generic PLA", - "Snapmaker PETG HF" - ] - } - }, - "0.2mm": { - "all": { - "warning": [ - "Snapmaker PETG HF", - "Snapmaker PLA Matte" - ] - } - }, - "0.6mm": { - "undefine": { - "warning": [ - "Generic TPU", - "Generic PLA", - "Snapmaker PETG HF" - ] - } } } From 037f5226d83fd02692fe0ad2fc1920b8a97b07e9 Mon Sep 17 00:00:00 2001 From: alves Date: Tue, 7 Apr 2026 17:49:38 +0800 Subject: [PATCH 43/46] feature fix upgrade lead to resource update fail question. --- src/libslic3r/utils.cpp | 7 ++- src/slic3r/Utils/PresetUpdater.cpp | 85 +++++++++++++++++++++++------- 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp index 79709062a87..67fc03bfeda 100644 --- a/src/libslic3r/utils.cpp +++ b/src/libslic3r/utils.cpp @@ -1517,9 +1517,14 @@ bool bbl_calc_md5(std::string &filename, std::string &md5_out) // SoftFever: copy directory recursively void copy_directory_recursively(const boost::filesystem::path &source, const boost::filesystem::path &target, std::function filter) { - BOOST_LOG_TRIVIAL(info) << Slic3r::format("copy_directory_recursively %1% -> %2%", source, target); + BOOST_LOG_TRIVIAL(debug) << Slic3r::format("copy_directory_recursively %1% -> %2%", source, target); std::string error_message; + if (!boost::filesystem::exists(source) || !boost::filesystem::is_directory(source)) { + BOOST_LOG_TRIVIAL(error) << Slic3r::format("copy_directory_recursively source is invalid: %1%", source); + throw Slic3r::CriticalException(Slic3r::format(("Copying directory %1% to %2% failed: source directory does not exist"),source, target)); + } + if (boost::filesystem::exists(target)) boost::filesystem::remove_all(target); boost::filesystem::create_directories(target); diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 04a4dc433dc..f5bd5426036 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -729,7 +729,7 @@ bool PresetUpdater::priv::download_file(const std::string& url, }) .timeout_max(timeout_sec) - .perform(); + .perform_sync(); if (fs::exists(tmp_path)) { fs::remove(tmp_path); @@ -817,7 +817,20 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) return; } - if (currentSoftVersion > maxSpVersion || currentSoftVersion < minSpVersion) { + bool maxRes = false; + bool minRes = false; + + if (!maxSupportPcVersion.empty()) + { + maxRes = currentSoftVersion > maxSpVersion; + } + + if (!minSupportPcVersion.empty()) + { + minRes = currentSoftVersion < minSpVersion; + } + + if (maxRes || minRes) { if (!isAuto_check) { wxCommandEvent* evt = new wxCommandEvent(EVT_NO_WEB_RESOURCE_UPDATE); GUI::wxGetApp().QueueEvent(evt); @@ -854,7 +867,7 @@ void PresetUpdater::priv::sync_update_flutter_resource(bool isAuto_check) BOOST_LOG_TRIVIAL(fatal) << "request server flutter update data error:" << errorMsg; } }) - .perform(); + .perform_sync(); } // Orca: sync config update for currect App version void PresetUpdater::priv::sync_config(bool isAuto_check) @@ -936,8 +949,18 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) return; } - if (currentSoftVersion > maxSpVersion || currentSoftVersion < minSpVersion) - { + bool maxRes = false; + bool minRes = false; + + if (!maxSupportPcVersion.empty()) { + maxRes = currentSoftVersion > maxSpVersion; + } + + if (!minSupportPcVersion.empty()) { + minRes = currentSoftVersion < minSpVersion; + } + + if (maxRes || minRes) { if (!isAuto_check) { wxCommandEvent* evt = new wxCommandEvent(EVT_NO_PRESET_UPDATE); GUI::wxGetApp().QueueEvent(evt); @@ -1290,17 +1313,29 @@ bool PresetUpdater::priv::install_bundles_rsrc(const std::vector& b //BBS: add directory support auto print_in_rsrc = this->rsrc_path / bundle; auto print_in_vendors = this->vendor_path / bundle; - fs::path print_folder(print_in_vendors); - if (fs::exists(print_folder)) - fs::remove_all(print_folder); - fs::create_directories(print_folder); - updates.updates.emplace_back(std::move(print_in_rsrc), std::move(print_in_vendors), Version(), bundle, "", "",[](const std::string name){ - // return false if name is end with .stl, case insensitive - return boost::iends_with(name, ".stl") || boost::iends_with(name, ".png") || boost::iends_with(name, ".svg") || - boost::iends_with(name, ".jpeg") || boost::iends_with(name, ".jpg") || boost::iends_with(name, ".3mf"); - }, false, true, true); - - // Rules file is not a slicer preset; ensure it is always deployed next to system filament JSON. + bool source_dir_valid = fs::exists(print_in_rsrc) && fs::is_directory(print_in_rsrc); + bool source_dir_has_entries = false; + if (source_dir_valid) { + source_dir_has_entries = (boost::filesystem::directory_iterator(print_in_rsrc) != boost::filesystem::directory_iterator()); + } + + // Guard against empty / missing source: never clear target unless we do have source content to copy. + if (source_dir_valid && source_dir_has_entries) { + fs::path print_folder(print_in_vendors); + if (fs::exists(print_folder)) + fs::remove_all(print_folder); + fs::create_directories(print_folder); + updates.updates.emplace_back(std::move(print_in_rsrc), std::move(print_in_vendors), Version(), bundle, "", "",[](const std::string name){ + // return false if name is end with .stl, case insensitive + return boost::iends_with(name, ".stl") || boost::iends_with(name, ".png") || boost::iends_with(name, ".svg") || + boost::iends_with(name, ".jpeg") || boost::iends_with(name, ".jpg") || boost::iends_with(name, ".3mf"); + }, false, true, true); + } else { + BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]: skip vendor directory replace, source missing or empty: " + << print_in_rsrc.string(); + } + + // Rules file is not a slicer preset; deploy even when full vendor dir sync was skipped above. if (bundle == PresetBundle::SM_BUNDLE) { fs::path rules_src = rsrc_path / bundle / "filament" / "filament_hot_bed_nozzles.json"; fs::path rules_dst = vendor_path / bundle / "filament" / "filament_hot_bed_nozzles.json"; @@ -1507,8 +1542,14 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version updates.updates.emplace_back(std::move(file_path), std::move(path_in_vendor.string()), std::move(version), vendor_name, changelog, "", force_update, false, legal); //BBS: add directory support - updates.updates.emplace_back(cache_path / "profiles" / vendor_name, vendor_path / vendor_name, Version(), vendor_name, "", "", - force_update, true, legal); + auto vendor_dir_in_cache = cache_profile_path / vendor_name; + if (fs::exists(vendor_dir_in_cache) && fs::is_directory(vendor_dir_in_cache)) { + updates.updates.emplace_back(vendor_dir_in_cache, vendor_path / vendor_name, Version(), vendor_name, "", "", + force_update, true, legal); + } else { + BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]: skip vendor directory update, source missing: " + << vendor_dir_in_cache.string(); + } } } } @@ -1831,7 +1872,10 @@ void PresetUpdater::load_flutter_web(const std::string& zip_file, bool serverUpd if (!p->extract_file(zip_file, temp_path.string())) { if (!serverUpdate) - GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); + { + BOOST_LOG_TRIVIAL(error) << "extract_file Failed "; + GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); + } return; } @@ -1840,6 +1884,7 @@ void PresetUpdater::load_flutter_web(const std::string& zip_file, bool serverUpd auto app = dynamic_cast(wxTheApp); if (!app) { + BOOST_LOG_TRIVIAL(error) << "update source on web fail "; GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); } @@ -2002,6 +2047,7 @@ void PresetUpdater::import_system_profile() // 3. 解压zip文件到临时目录 if (!p->extract_file(zip_file, temp_path.string())) { + BOOST_LOG_TRIVIAL(error) << "extract_file Failed "; GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); return; } @@ -2012,6 +2058,7 @@ void PresetUpdater::import_system_profile() auto app = dynamic_cast(wxTheApp); if (!app) { + BOOST_LOG_TRIVIAL(error) << "import profiles fail "; GUI::MessageDialog(nullptr, _L("Import Failed")).ShowModal(); } From 8d8d1ff5bdb6ffe1ebc715d2d0d24e6f44565141 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 9 Apr 2026 19:24:26 +0800 Subject: [PATCH 44/46] feature revert not work code. --- src/libslic3r/Format/bbs_3mf.cpp | 3 --- src/libslic3r/PrintConfig.cpp | 2 +- src/slic3r/GUI/MainFrame.cpp | 4 ++-- src/slic3r/GUI/PrinterWebView.cpp | 3 +-- src/slic3r/Utils/PresetUpdater.cpp | 5 +++-- 5 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/libslic3r/Format/bbs_3mf.cpp b/src/libslic3r/Format/bbs_3mf.cpp index 5fad697a005..938b72126ac 100644 --- a/src/libslic3r/Format/bbs_3mf.cpp +++ b/src/libslic3r/Format/bbs_3mf.cpp @@ -4159,9 +4159,6 @@ void PlateData::parse_filament_info(GCodeProcessorResult *result) } else if (key == BED_TYPE_ATTR) { - // Legacy 3MF used "Graphic Effect Steel Plate"; canonical key is "Graphic Effect Plate" (same btGESP). - if (value == "Graphic Effect Steel Plate") - value = "Graphic Effect Plate"; BedType bed_type = BedType::btPC; ConfigOptionEnum::from_string(value, bed_type); m_curr_plater->config.set_key_value("curr_bed_type", new ConfigOptionEnum(bed_type)); diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 24af351b0c5..122a49a2b76 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -764,7 +764,7 @@ void PrintConfigDef::init_fff_params() def->full_label = L("Bed temperature"); def->min = 0; def->max = 300; - def->set_default_value(new ConfigOptionInts{ 120 }); + def->set_default_value(new ConfigOptionInts{ 45 }); def = this->add("textured_plate_temp", coInts); def->label = L("Other layers"); diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 75bbb90cfc5..f3d6ba8f172 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -1733,8 +1733,8 @@ wxBoxSizer* MainFrame::create_side_tools() { SidePopup* p = new SidePopup(this); - //if (wxGetApp().preset_bundle && !wxGetApp().preset_bundle->is_bbl_vendor()) - if (0) + if (wxGetApp().preset_bundle && !wxGetApp().preset_bundle->is_bbl_vendor()) + //if (0) { // ThirdParty Buttons SideButton* export_gcode_btn = new SideButton(p, _L("Export G-code file"), ""); diff --git a/src/slic3r/GUI/PrinterWebView.cpp b/src/slic3r/GUI/PrinterWebView.cpp index 6d680c4be80..690b9b7b8d8 100644 --- a/src/slic3r/GUI/PrinterWebView.cpp +++ b/src/slic3r/GUI/PrinterWebView.cpp @@ -96,8 +96,7 @@ bool PrinterWebView::isSnapmakerPage() if (m_browser == nullptr) return false; auto url = m_browser->GetCurrentURL(); - // path=3 is still flutter_web but is the non-U1 connection UI; U1 device tab uses path=2. - return url.Contains("flutter_web") && url.Contains("path=2"); + return (url.find("flutter_web") != std::string::npos); } void PrinterWebView::sendMessage(const std::string& msg) { diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index facf3beee6c..c44136f3a67 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1556,12 +1556,13 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]: skip vendor directory update, source missing: " << vendor_dir_in_cache.string(); } - updates.updates.emplace_back(cache_path / "profiles" / vendor_name, vendor_path / vendor_name, Version(), vendor_name, "", "", + updates.updates.emplace_back(cache_profile_path / vendor_name, vendor_path / vendor_name, Version(), vendor_name, + "", "", should_skip_file, force_update, true, legal); // Rules file is not a slicer preset; ensure it is always deployed next to system filament JSON. if (vendor_name == PresetBundle::SM_BUNDLE) { - fs::path rules_src = cache_path / "profiles" / vendor_name / "filament" / "filament_hot_bed_nozzles.json"; + fs::path rules_src = cache_profile_path / vendor_name / "filament" / "filament_hot_bed_nozzles.json"; fs::path rules_dst = vendor_path / vendor_name / "filament" / "filament_hot_bed_nozzles.json"; if (fs::exists(rules_src)) { // Ensure target directory exists From c2872d08d150baf0c7c425d5bd202a8ad979cb07 Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 9 Apr 2026 19:36:58 +0800 Subject: [PATCH 45/46] feature update the request type. --- src/slic3r/Utils/PresetUpdater.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index c44136f3a67..1c571e4fcbd 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -729,7 +729,7 @@ bool PresetUpdater::priv::download_file(const std::string& url, }) .timeout_max(timeout_sec) - .perform_sync(); + .perform(); if (fs::exists(tmp_path)) { fs::remove(tmp_path); @@ -996,7 +996,7 @@ void PresetUpdater::priv::sync_config(bool isAuto_check) BOOST_LOG_TRIVIAL(fatal) << "request server preset update data error:" << errorMsg; } }) - .perform(); + .perform_sync(); } void PresetUpdater::priv::sync_tooltip(std::string http_url, std::string language) From ce38014566a5deeb4fded8aac59c90d8103144dd Mon Sep 17 00:00:00 2001 From: alves Date: Thu, 9 Apr 2026 20:21:54 +0800 Subject: [PATCH 46/46] fix build fail bug. --- src/slic3r/Utils/PresetUpdater.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp index 1c571e4fcbd..daaf234d56e 100644 --- a/src/slic3r/Utils/PresetUpdater.cpp +++ b/src/slic3r/Utils/PresetUpdater.cpp @@ -1545,13 +1545,15 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version version.config_version = cache_ver; version.comment = description; - updates.updates.emplace_back(std::move(file_path), std::move(path_in_vendor.string()), std::move(version), vendor_name, changelog, "", force_update, false, legal); + // Update expects fs::path (not std::string paths from file_path / .string()). + updates.updates.emplace_back(fs::path(path), fs::path(path_in_vendor), std::move(version), vendor_name, + std::move(changelog), "", force_update, false, legal); //BBS: add directory support auto vendor_dir_in_cache = cache_profile_path / vendor_name; if (fs::exists(vendor_dir_in_cache) && fs::is_directory(vendor_dir_in_cache)) { - updates.updates.emplace_back(vendor_dir_in_cache, vendor_path / vendor_name, Version(), vendor_name, "", "", - force_update, true, legal); + updates.updates.emplace_back(fs::path(vendor_dir_in_cache), fs::path(vendor_path / vendor_name), + Version(), vendor_name, "", "", force_update, true, legal); } else { BOOST_LOG_TRIVIAL(warning) << "[Orca Updater]: skip vendor directory update, source missing: " << vendor_dir_in_cache.string();