From 7c94db063488092607877a54ed3e4f0cdac02745 Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Tue, 20 Aug 2019 15:49:32 +0200 Subject: [PATCH] Adding new sla material parameters: (initial) exposition min/max --- src/libslic3r/PrintConfig.cpp | 32 ++++++++++++++++++++++ src/libslic3r/PrintConfig.hpp | 8 ++++++ src/libslic3r/SLAPrint.cpp | 18 +++++++++++++ src/slic3r/GUI/Preset.cpp | 3 ++- src/slic3r/GUI/Tab.cpp | 51 +++++++++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 1 deletion(-) diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index 31de80e8b..037b24800 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -2412,6 +2412,22 @@ void PrintConfigDef::init_sla_params() def->mode = comExpert; def->set_default_value(new ConfigOptionInt(10)); + def = this->add("exposure_time_min", coFloat); + def->label = L("Minimum exposure time"); + def->tooltip = L("Minimum exposure time"); + def->sidetext = L("s"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0)); + + def = this->add("exposure_time_max", coFloat); + def->label = L("Maximum exposure time"); + def->tooltip = L("Maximum exposure time"); + def->sidetext = L("s"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(100)); + def = this->add("exposure_time", coFloat); def->label = L("Exposure time"); def->tooltip = L("Exposure time"); @@ -2419,6 +2435,22 @@ void PrintConfigDef::init_sla_params() def->min = 0; def->set_default_value(new ConfigOptionFloat(10)); + def = this->add("initial_exposure_time_min", coFloat); + def->label = L("Minimum initial exposure time"); + def->tooltip = L("Minimum initial exposure time"); + def->sidetext = L("s"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(0)); + + def = this->add("initial_exposure_time_max", coFloat); + def->label = L("Maximum initial exposure time"); + def->tooltip = L("Maximum initial exposure time"); + def->sidetext = L("s"); + def->min = 0; + def->mode = comExpert; + def->set_default_value(new ConfigOptionFloat(150)); + def = this->add("initial_exposure_time", coFloat); def->label = L("Initial exposure time"); def->tooltip = L("Initial exposure time"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 081f670e1..ca2a210f2 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -1098,14 +1098,22 @@ class SLAMaterialConfig : public StaticPrintConfig STATIC_PRINT_CONFIG_CACHE(SLAMaterialConfig) public: ConfigOptionFloat initial_layer_height; + ConfigOptionFloat exposure_time_min; + ConfigOptionFloat exposure_time_max; ConfigOptionFloat exposure_time; + ConfigOptionFloat initial_exposure_time_min; + ConfigOptionFloat initial_exposure_time_max; ConfigOptionFloat initial_exposure_time; ConfigOptionFloats material_correction; protected: void initialize(StaticCacheBase &cache, const char *base_ptr) { OPT_PTR(initial_layer_height); + OPT_PTR(exposure_time_min); + OPT_PTR(exposure_time_max); OPT_PTR(exposure_time); + OPT_PTR(initial_exposure_time_min); + OPT_PTR(initial_exposure_time_max); OPT_PTR(initial_exposure_time); OPT_PTR(material_correction); } diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index 1529f4baf..8e99d6ddc 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -692,6 +692,20 @@ std::string SLAPrint::validate() const } } + double expt_max = m_material_config.exposure_time_max.getFloat(); + double expt_min = m_material_config.exposure_time_min.getFloat(); + double expt_cur = m_material_config.exposure_time.getFloat(); + + if (expt_cur < expt_min || expt_cur > expt_max) + return L("Exposition time is out of predefined bounds."); + + double iexpt_max = m_material_config.initial_exposure_time_max.getFloat(); + double iexpt_min = m_material_config.initial_exposure_time_min.getFloat(); + double iexpt_cur = m_material_config.initial_exposure_time.getFloat(); + + if (iexpt_cur < iexpt_min || iexpt_cur > iexpt_max) + return L("Initial exposition time is out of predefined bounds."); + return ""; } @@ -1586,7 +1600,11 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector steps_rasterize = { + "exposure_time_min", + "exposure_time_max", "exposure_time", + "initial_exposure_time_min", + "initial_exposure_time_max", "initial_exposure_time", "display_width", "display_height", diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp index 833da238a..82124761a 100644 --- a/src/slic3r/GUI/Preset.cpp +++ b/src/slic3r/GUI/Preset.cpp @@ -500,7 +500,8 @@ const std::vector& Preset::sla_material_options() if (s_opts.empty()) { s_opts = { "initial_layer_height", - "exposure_time", "initial_exposure_time", + "exposure_time_min", "exposure_time_max", "exposure_time", + "initial_exposure_time_min", "initial_exposure_time_max", "initial_exposure_time", "material_correction", "material_notes", "default_sla_material_profile", diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 4afd3a116..188bb50cf 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -3614,7 +3614,11 @@ void TabSLAMaterial::build() optgroup->append_single_option_line("initial_layer_height"); optgroup = page->new_optgroup(_(L("Exposure"))); + optgroup->append_single_option_line("exposure_time_min"); + optgroup->append_single_option_line("exposure_time_max"); optgroup->append_single_option_line("exposure_time"); + optgroup->append_single_option_line("initial_exposure_time_min"); + optgroup->append_single_option_line("initial_exposure_time_max"); optgroup->append_single_option_line("initial_exposure_time"); optgroup = page->new_optgroup(_(L("Corrections"))); @@ -3679,11 +3683,58 @@ void TabSLAMaterial::reload_config() Tab::reload_config(); } + +namespace { + +enum e_cmp {EQUAL = 1, SMALLER = 2, GREATER = 4, SMALLER_EQ = 3, GREATER_EQ = 5}; + +void bound_check(Tab &tb, e_cmp cmp, const char *id, const char *boundid) +{ + double bound = tb.m_config->opt_float(boundid); + double value = tb.m_config->opt_float(id); + + auto boundlabel = tb.m_config->def()->get(boundid)->label; + auto valuelabel = tb.m_config->def()->get(id)->label; + + double ddiff = value - bound; + int diff = ddiff < 0 ? SMALLER : (std::abs(ddiff) < EPSILON ? EQUAL : GREATER); + + wxString fmt; + switch (cmp) { + case EQUAL: fmt = _(L("%s should be equal to %s")); break; + case SMALLER: fmt = _(L("%s should be smaller than %s")); break; + case GREATER: fmt = _(L("%s should be greater than %s")); break; + case SMALLER_EQ: fmt = _(L("%s should be smaller or equal to %s")); break; + case GREATER_EQ: fmt = _(L("%s should be greater or equal to %s")); break; + } + + if ((cmp | diff) != cmp) { + wxString msg_text = wxString::Format(fmt, valuelabel, boundlabel); + + wxMessageDialog dialog(tb.parent(), msg_text, + _(L("Value outside bounds")), + wxICON_WARNING | wxOK); + + DynamicPrintConfig new_conf = *tb.m_config; + if (dialog.ShowModal() == wxID_OK) + new_conf.set_key_value(id, new ConfigOptionFloat(bound)); + + tb.load_config(new_conf); + } +}; + +} + void TabSLAMaterial::update() { if (m_preset_bundle->printers.get_selected_preset().printer_technology() == ptFFF) return; + bound_check(*this, e_cmp::GREATER_EQ, "exposure_time", "exposure_time_min"); + bound_check(*this, e_cmp::SMALLER_EQ, "exposure_time", "exposure_time_max"); + bound_check(*this, e_cmp::GREATER_EQ, "initial_exposure_time", "initial_exposure_time_min"); + bound_check(*this, e_cmp::SMALLER_EQ, "initial_exposure_time", "initial_exposure_time_max"); + // #ys_FIXME. Just a template for this function // m_update_cnt++; // ! something to update