diff --git a/src/libslic3r/Format/SL1.cpp b/src/libslic3r/Format/SL1.cpp index 3a0283a350..baf4665bdf 100644 --- a/src/libslic3r/Format/SL1.cpp +++ b/src/libslic3r/Format/SL1.cpp @@ -107,16 +107,15 @@ std::string to_json(const SLAPrint& print, const ConfMap &m) switch (opt->type()) { case coFloats: { auto values = static_cast(opt); - // those options have to be exported in ms instead of s - below_node.put(get_key(opt_key), int(1000 * values->get_at(0))); - above_node.put(get_key(opt_key), int(1000 * values->get_at(1))); + double koef = opt_key == "tower_hop_height" ? 1000000. : 1000.; // export in nm (instead of mm), resp. in ms (instead of s) + below_node.put(get_key(opt_key), int(koef * values->get_at(0))); + above_node.put(get_key(opt_key), int(koef * values->get_at(1))); } break; case coInts: { auto values = static_cast(opt); - int koef = opt_key == "tower_hop_height" ? 1000000 : 1; - below_node.put(get_key(opt_key), koef * values->get_at(0)); - above_node.put(get_key(opt_key), koef * values->get_at(1)); + below_node.put(get_key(opt_key), values->get_at(0)); + above_node.put(get_key(opt_key), values->get_at(1)); } break; case coBools: { diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index 3ffcce1269..79a7524c53 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -334,7 +334,7 @@ void Preset::normalize(DynamicPrintConfig &config) first_layer_height->percent = false; } - // handle_legacy_sla(config); // it looks like the best place for call it, is handle_legacy_composite + handle_legacy_sla(config); } std::string Preset::remove_invalid_keys(DynamicPrintConfig &config, const DynamicPrintConfig &default_config) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index bfed37095d..f4a7625609 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -4758,14 +4758,14 @@ void PrintConfigDef::init_sla_tilt_params() def->mode = comAdvanced; def->set_default_value(new ConfigOptionFloats({ 0., 0.})); - def = this->add("tower_hop_height", coInts); + def = this->add("tower_hop_height", coFloats); def->full_label = L("Tower hop height"); def->tooltip = L("The height of the tower raise."); def->sidetext = L("mm"); def->min = 0; def->max = 100; def->mode = comExpert; - def->set_default_value(new ConfigOptionInts({ 0, 0})); + def->set_default_value(new ConfigOptionFloats({ 0., 0.})); def = this->add("tower_speed", coEnums); def->full_label = L("Tower speed"); @@ -5086,8 +5086,6 @@ void PrintConfigDef::handle_legacy_composite(DynamicPrintConfig &config) } config.set_key_value("wiping_volumes_use_custom_matrix", new ConfigOptionBool(custom)); } - - handle_legacy_sla(config); } const PrintConfigDef print_config_def; @@ -5199,14 +5197,14 @@ const std::map tilt_options_floats_defs = {"delay_before_exposure", ConfigOptionFloats({ 3., 3., 0., 1., 3.5, 3.5, 0., 0. }) } , {"delay_after_exposure", ConfigOptionFloats({ 0., 0., 0., 0., 0., 0., 0., 0. }) } , {"tilt_down_offset_delay", ConfigOptionFloats({ 0., 0., 0., 0., 0., 0., 0., 0. }) } , - {"tilt_down_delay", ConfigOptionFloats({ 0., 0., 0., 0.5, 0., 0., 0., 0. }) } , + {"tilt_down_delay", ConfigOptionFloats({ 0., 0., 0., 0., 0., 0., 0., 0. }) } , {"tilt_up_offset_delay", ConfigOptionFloats({ 0., 0., 0., 0., 0., 0., 0., 0. }) } , {"tilt_up_delay", ConfigOptionFloats({ 0., 0., 0., 0., 0., 0., 0., 0. }) } , + {"tower_hop_height", ConfigOptionFloats({ 0., 0., 0., 0., 5., 5., 0., 0. }) } , }; const std::map tilt_options_ints_defs = { - {"tower_hop_height", ConfigOptionInts({ 0, 0, 0, 0, 5, 5, 0, 0 }) } , {"tilt_down_offset_steps", ConfigOptionInts({ 0, 0, 0, 0, 2200, 2200, 0, 0 }) } , {"tilt_down_cycles", ConfigOptionInts({ 1, 1, 1, 1, 1, 1, 0, 0 }) } , {"tilt_up_offset_steps", ConfigOptionInts({ 1200, 1200, 600, 600, 2200, 2200, 0, 0 }) } , @@ -5242,11 +5240,11 @@ const std::map tilt_options_floats_sl1_defs = {"tilt_down_delay", ConfigOptionFloats({ 0., 0., 0., 0., 0., 0., 0., 0. }) } , {"tilt_up_offset_delay", ConfigOptionFloats({ 0., 0., 0., 0., 1., 1., 0., 0. }) } , {"tilt_up_delay", ConfigOptionFloats({ 0., 0., 0., 0., 0., 0., 0., 0. }) } , + {"tower_hop_height", ConfigOptionFloats({ 0., 0., 0., 0., 5., 5., 0., 0. }) } , }; const std::map tilt_options_ints_sl1_defs = { - {"tower_hop_height", ConfigOptionInts({ 0, 0, 0, 0, 5, 5, 0, 0 }) } , {"tilt_down_offset_steps", ConfigOptionInts({ 650, 650, 0, 0, 2200, 2200, 0, 0 }) } , {"tilt_down_cycles", ConfigOptionInts({ 1, 1, 1, 1, 1, 1, 0, 0 }) } , {"tilt_up_offset_steps", ConfigOptionInts({ 400, 400, 400, 400, 2200, 2200, 0, 0 }) } , @@ -5299,57 +5297,60 @@ void handle_legacy_sla(DynamicPrintConfig &config) !config.has("tilt_down_offset_delay") // Config from old PS doesn't contain any of tilt options, so check it ) { int tilt_mode = config.option("material_print_speed")->getInt(); - const bool is_sl1_model = config.opt_string("printer_model") == "SL1"; + update_tilts_by_mode(config, tilt_mode, is_sl1_model); + } +} - const std::map floats_defs = is_sl1_model ? tilt_options_floats_sl1_defs : tilt_options_floats_defs; - const std::map ints_defs = is_sl1_model ? tilt_options_ints_sl1_defs : tilt_options_ints_defs; - const std::map bools_defs = is_sl1_model ? tilt_options_bools_sl1_defs : tilt_options_bools_defs; - const std::map> tower_enums_defs = is_sl1_model ? tower_tilt_options_enums_sl1_defs : tower_tilt_options_enums_defs; - const std::map> tilt_enums_defs = is_sl1_model ? tilt_options_enums_sl1_defs : tilt_options_enums_defs; +void update_tilts_by_mode(DynamicPrintConfig& config, int tilt_mode, bool is_sl1_model) +{ + const std::map floats_defs = is_sl1_model ? tilt_options_floats_sl1_defs : tilt_options_floats_defs; + const std::map ints_defs = is_sl1_model ? tilt_options_ints_sl1_defs : tilt_options_ints_defs; + const std::map bools_defs = is_sl1_model ? tilt_options_bools_sl1_defs : tilt_options_bools_defs; + const std::map> tower_enums_defs = is_sl1_model ? tower_tilt_options_enums_sl1_defs : tower_tilt_options_enums_defs; + const std::map> tilt_enums_defs = is_sl1_model ? tilt_options_enums_sl1_defs : tilt_options_enums_defs; - for (const std::string& opt_key : tilt_options()) { - switch (config.def()->get(opt_key)->type) { - case coFloats: { - ConfigOptionFloats values = floats_defs.at(opt_key); - double val1 = values.get_at(2 * tilt_mode); - double val2 = values.get_at(2 * tilt_mode + 1); - config.set_key_value(opt_key, new ConfigOptionFloats({ val1, val2 })); + for (const std::string& opt_key : tilt_options()) { + switch (config.def()->get(opt_key)->type) { + case coFloats: { + ConfigOptionFloats values = floats_defs.at(opt_key); + double val1 = values.get_at(2 * tilt_mode); + double val2 = values.get_at(2 * tilt_mode + 1); + config.set_key_value(opt_key, new ConfigOptionFloats({ val1, val2 })); + } + break; + case coInts: { + auto values = ints_defs.at(opt_key); + int val1 = values.get_at(2 * tilt_mode); + int val2 = values.get_at(2 * tilt_mode + 1); + config.set_key_value(opt_key, new ConfigOptionInts({ val1, val2 })); + } + break; + case coBools: { + auto values = bools_defs.at(opt_key); + bool val1 = values.get_at(2 * tilt_mode); + bool val2 = values.get_at(2 * tilt_mode + 1); + config.set_key_value(opt_key, new ConfigOptionBools({ val1, val2 })); + } + break; + case coEnums: { + int val1, val2; + if (opt_key == "tower_speed") { + auto values = tower_enums_defs.at(opt_key); + val1 = values.get_at(2 * tilt_mode); + val2 = values.get_at(2 * tilt_mode + 1); } - break; - case coInts: { - auto values = ints_defs.at(opt_key); - int val1 = values.get_at(2 * tilt_mode); - int val2 = values.get_at(2 * tilt_mode + 1); - config.set_key_value(opt_key, new ConfigOptionInts({ val1, val2 })); - } - break; - case coBools: { - auto values = bools_defs.at(opt_key); - bool val1 = values.get_at(2 * tilt_mode); - bool val2 = values.get_at(2 * tilt_mode + 1); - config.set_key_value(opt_key, new ConfigOptionBools({ val1, val2 })); - } - break; - case coEnums: { - int val1, val2; - if (opt_key == "tower_speed") { - auto values = tower_enums_defs.at(opt_key); - val1 = values.get_at(2 * tilt_mode); - val2 = values.get_at(2 * tilt_mode + 1); - } - else { - auto values = tilt_enums_defs.at(opt_key); - val1 = values.get_at(2 * tilt_mode); - val2 = values.get_at(2 * tilt_mode + 1); - } - config.set_key_value(opt_key, new ConfigOptionEnumsGeneric({ val1, val2 })); - } - break; - case coNone: - default: - break; + else { + auto values = tilt_enums_defs.at(opt_key); + val1 = values.get_at(2 * tilt_mode); + val2 = values.get_at(2 * tilt_mode + 1); } + config.set_key_value(opt_key, new ConfigOptionEnumsGeneric({ val1, val2 })); + } + break; + case coNone: + default: + break; } } } diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index dad9d2a6f4..5f21c786c6 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -378,6 +378,7 @@ public: // This vector containes list of parameters for preview of tilt profiles const std::vector& tilt_options(); +void update_tilts_by_mode(DynamicPrintConfig& config, int tilt_mode, bool is_sl1_model); void handle_legacy_sla(DynamicPrintConfig &config); class StaticPrintConfig : public StaticConfig @@ -1247,7 +1248,7 @@ PRINT_CONFIG_CLASS_DEFINE( //tilt params ((ConfigOptionFloats, delay_before_exposure)) ((ConfigOptionFloats, delay_after_exposure)) - ((ConfigOptionInts, tower_hop_height)) + ((ConfigOptionFloats, tower_hop_height)) ((ConfigOptionEnums, tower_speed)) ((ConfigOptionBools, use_tilt)) ((ConfigOptionEnums, tilt_down_initial_speed)) diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index a5efef3a33..9182cb7932 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -695,8 +695,8 @@ std::string SLAPrint::validate(std::vector*) const } } - if ((!m_material_config.use_tilt.get_at(0) && m_material_config.tower_hop_height.get_at(0) == 0) - || (!m_material_config.use_tilt.get_at(1) && m_material_config.tower_hop_height.get_at(1) == 0)) + if ((!m_material_config.use_tilt.get_at(0) && is_approx(m_material_config.tower_hop_height.get_at(0), 0.)) + || (!m_material_config.use_tilt.get_at(1) && is_approx(m_material_config.tower_hop_height.get_at(1), 0.))) return _u8L("Disabling the 'Use tilt' function causes the object to separate away from the film in the " "vertical direction only. Therefore, it is necessary to set the 'Tower hop height' parameter " "to reasonable value. The recommended value is 5 mm."); diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 0b7fbaef0e..3b92cd861c 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -1041,7 +1041,7 @@ struct ExposureProfile { tilt_down_delay_ms = int(1000 * config.tilt_down_delay.get_at(opt_id)); tilt_up_offset_delay_ms = int(1000 * config.tilt_up_offset_delay.get_at(opt_id)); tilt_up_delay_ms = int(1000 * config.tilt_up_delay.get_at(opt_id)); - tower_hop_height_nm = config.tower_hop_height.get_at(opt_id) * 1000000; + tower_hop_height_nm = int(config.tower_hop_height.get_at(opt_id) * 1000000); tilt_down_offset_steps = config.tilt_down_offset_steps.get_at(opt_id); tilt_down_cycles = config.tilt_down_cycles.get_at(opt_id); tilt_up_offset_steps = config.tilt_up_offset_steps.get_at(opt_id); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 4e9d3297b8..d5c268be42 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -38,6 +38,7 @@ #include "Search.hpp" #include "OG_CustomCtrl.hpp" +#include #include #include #include @@ -3674,13 +3675,6 @@ void TabPrinter::update_fff() toggle_options(); } -bool Tab::is_prusa_printer() const -{ - const Preset& edited_preset = m_preset_bundle->printers.get_edited_preset(); - std::string printer_model = edited_preset.trim_vendor_repo_prefix(edited_preset.config.opt_string("printer_model")); - return SLAPrint::is_prusa_print(printer_model); -} - void TabPrinter::update_sla() { } @@ -5493,10 +5487,10 @@ static void append_tilt_options_line(ConfigOptionsGroupShp optgroup, const std:: optgroup->append_line(line); } -void TabSLAMaterial::build_tilt_group(Slic3r::GUI::PageShp page) +static void create_tilt_legend(ConfigOptionsGroupShp optgroup) { // Legend - std::vector> legend_columns = { + std::vector> columns = { // TRN: This is a label of a column of parameters in settings to be used when the area is below certain threshold. {L("Below"), L("Values in this column are applied when layer area is smaller than area_fill.")}, @@ -5504,8 +5498,27 @@ void TabSLAMaterial::build_tilt_group(Slic3r::GUI::PageShp page) {L("Above"), L("Values in this column are applied when layer area is larger than area_fill.")}, }; - create_legend(page, legend_columns, comExpert/*, true*/); + auto legend = [columns](wxWindow* parent) { + auto legend_sizer = new wxBoxSizer(wxHORIZONTAL); + legend_sizer->Add(new wxStaticText(parent, wxID_ANY, "", wxDefaultPosition, wxSize(25*em_unit(parent), -1))); + for (auto& [name, tooltip] : columns) { + auto legend_item = new wxStaticText(parent, wxID_ANY, _(name), wxDefaultPosition, wxSize(20*em_unit(parent), -1)); + legend_item->SetToolTip(_(tooltip)); + legend_sizer->Add(legend_item); + } + + return legend_sizer; + }; + + Line line = Line{ "", "" }; + line.full_width = 1; + line.append_widget(legend); + optgroup->append_line(line); +} + +void TabSLAMaterial::build_tilt_group(Slic3r::GUI::PageShp page) +{ // TRN: 'Profile' in this context denotes a group of parameters used to configure // layer separation procedure for SLA printers. auto optgroup = page->new_optgroup(L("Profile settings")); @@ -5518,10 +5531,50 @@ void TabSLAMaterial::build_tilt_group(Slic3r::GUI::PageShp page) update(); }; + create_line_with_tilt_defaults(optgroup); + create_tilt_legend(optgroup); + for (const std::string& opt_key : tilt_options()) append_tilt_options_line(optgroup, opt_key); } +std::vector> default_tilt_buttons = { + { _L("Fast"), _L("Set default values for fast print speed"), SLAMaterialSpeed::slamsFast }, + { _L("Slow"), _L("Set default values for slow print speed"), SLAMaterialSpeed::slamsSlow }, + { _L("High viscosity"), _L("Set default values for high viscosity print speed"), SLAMaterialSpeed::slamsHighViscosity } +}; + +void TabSLAMaterial::create_line_with_tilt_defaults(ConfigOptionsGroupShp optgroup) +{ + auto print_speed_btns = [this](wxWindow* parent) { + m_tilt_defaults_sizer = new wxBoxSizer(wxHORIZONTAL); + + auto grid_sizer = new wxGridSizer(3, 0, 0); + for (const auto& [label, tooltip, material_speed] : default_tilt_buttons) { + ScalableButton* btn; + add_scaled_button(parent, &btn, "cog", label + " ", wxBU_EXACTFIT); + btn->SetToolTip(tooltip); + btn->SetFont(Slic3r::GUI::wxGetApp().normal_font()); + + int tilt_mode = int(material_speed); + btn->Bind(wxEVT_BUTTON, [this, tilt_mode](wxCommandEvent&) { + DynamicPrintConfig new_conf = *m_config; + update_tilts_by_mode(new_conf, tilt_mode, false); + load_config(new_conf); + }); + grid_sizer->Add(btn, 1, wxEXPAND | wxRIGHT, 5); + } + + m_tilt_defaults_sizer->Add(grid_sizer, 0, wxALIGN_CENTRE_VERTICAL); + return m_tilt_defaults_sizer; + }; + + Line line = Line{ "", "" }; + line.full_width = 1; + line.append_widget(print_speed_btns); + optgroup->append_line(line); +} + std::vector disable_tilt_options = { "tilt_down_initial_speed" ,"tilt_down_offset_steps" @@ -5589,14 +5642,28 @@ void TabSLAMaterial::update_description_lines() Tab::update_description_lines(); } +std::string Tab::printer_model() const +{ + const Preset& edited_preset = m_preset_bundle->printers.get_edited_preset(); + return edited_preset.trim_vendor_repo_prefix(edited_preset.config.opt_string("printer_model")); +} + +bool Tab::is_prusa_printer() const +{ + return SLAPrint::is_prusa_print(printer_model()); +} + void TabSLAMaterial::update_sla_prusa_specific_visibility() { if (m_active_page && m_active_page->title() == "Material printing profile") { for (auto& title : { "", "Profile settings" }) { auto og_it = std::find_if(m_active_page->m_optgroups.begin(), m_active_page->m_optgroups.end(), [title](const ConfigOptionsGroupShp og) { return og->title == title; }); - if (og_it != m_active_page->m_optgroups.end()) + if (og_it != m_active_page->m_optgroups.end()) { og_it->get()->Show(m_mode >= comAdvanced && is_prusa_printer()); + const std::string pr_model = printer_model(); + m_tilt_defaults_sizer->Show(pr_model == "SL1S" || pr_model == "M1"); + } } auto og_it = std::find_if(m_active_page->m_optgroups.begin(), m_active_page->m_optgroups.end(), @@ -5616,6 +5683,7 @@ void TabSLAMaterial::clear_pages() over_opt.second = nullptr; m_z_correction_to_mm_description = nullptr; + m_tilt_defaults_sizer = nullptr; } void TabSLAMaterial::msw_rescale() diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp index d6f536a8f1..71c80d7ad6 100644 --- a/src/slic3r/GUI/Tab.hpp +++ b/src/slic3r/GUI/Tab.hpp @@ -426,6 +426,7 @@ protected: void update_frequently_changed_parameters(); void fill_icon_descriptions(); void set_tooltips_text(); + std::string printer_model() const; virtual bool select_preset_by_name(const std::string& name_w_suffix, bool force); virtual bool save_current_preset(const std::string& new_name, bool detach); @@ -569,9 +570,11 @@ class TabSLAMaterial : public Tab void update_line_with_near_label_widget(ConfigOptionsGroupShp optgroup, const std::string& opt_key, bool is_checked = true); void add_material_overrides_page(); void update_material_overrides_page(); + void create_line_with_tilt_defaults(ConfigOptionsGroupShp optgroup); std::map m_overrides_options; ogStaticText* m_z_correction_to_mm_description = nullptr; + wxSizer* m_tilt_defaults_sizer { nullptr }; public: TabSLAMaterial(wxBookCtrlBase* parent) :