From b58713c06ff154b8d421343496a64d29ffb9b1db Mon Sep 17 00:00:00 2001
From: tamasmeszaros <meszaros.q@gmail.com>
Date: Tue, 20 Aug 2019 17:24:48 +0200
Subject: [PATCH] SLA exposure bounds to printer params.

---
 src/libslic3r/PrintConfig.cpp |  8 +--
 src/libslic3r/PrintConfig.hpp | 16 +++---
 src/libslic3r/SLAPrint.cpp    | 20 ++++----
 src/slic3r/GUI/Preset.cpp     |  6 ++-
 src/slic3r/GUI/Tab.cpp        | 94 +++++++++--------------------------
 5 files changed, 50 insertions(+), 94 deletions(-)

diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index 037b24800..8f56c1b83 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -2412,7 +2412,7 @@ void PrintConfigDef::init_sla_params()
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionInt(10));
 
-    def = this->add("exposure_time_min", coFloat);
+    def = this->add("min_exposure_time", coFloat);
     def->label = L("Minimum exposure time");
     def->tooltip = L("Minimum exposure time");
     def->sidetext = L("s");
@@ -2420,7 +2420,7 @@ void PrintConfigDef::init_sla_params()
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionFloat(0));
 
-    def = this->add("exposure_time_max", coFloat);
+    def = this->add("max_exposure_time", coFloat);
     def->label = L("Maximum exposure time");
     def->tooltip = L("Maximum exposure time");
     def->sidetext = L("s");
@@ -2435,7 +2435,7 @@ void PrintConfigDef::init_sla_params()
     def->min = 0;
     def->set_default_value(new ConfigOptionFloat(10));
 
-    def = this->add("initial_exposure_time_min", coFloat);
+    def = this->add("min_initial_exposure_time", coFloat);
     def->label = L("Minimum initial exposure time");
     def->tooltip = L("Minimum initial exposure time");
     def->sidetext = L("s");
@@ -2443,7 +2443,7 @@ void PrintConfigDef::init_sla_params()
     def->mode = comExpert;
     def->set_default_value(new ConfigOptionFloat(0));
 
-    def = this->add("initial_exposure_time_max", coFloat);
+    def = this->add("max_initial_exposure_time", coFloat);
     def->label = L("Maximum initial exposure time");
     def->tooltip = L("Maximum initial exposure time");
     def->sidetext = L("s");
diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp
index ca2a210f2..35025fcd1 100644
--- a/src/libslic3r/PrintConfig.hpp
+++ b/src/libslic3r/PrintConfig.hpp
@@ -1098,22 +1098,14 @@ 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);
     }
@@ -1139,6 +1131,10 @@ public:
     ConfigOptionFloat                       fast_tilt_time;
     ConfigOptionFloat                       slow_tilt_time;
     ConfigOptionFloat                       area_fill;
+    ConfigOptionFloat                       min_exposure_time;
+    ConfigOptionFloat                       max_exposure_time;
+    ConfigOptionFloat                       min_initial_exposure_time;
+    ConfigOptionFloat                       max_initial_exposure_time;
 protected:
     void initialize(StaticCacheBase &cache, const char *base_ptr)
     {
@@ -1158,6 +1154,10 @@ protected:
         OPT_PTR(fast_tilt_time);
         OPT_PTR(slow_tilt_time);
         OPT_PTR(area_fill);
+        OPT_PTR(min_exposure_time);
+        OPT_PTR(max_exposure_time);
+        OPT_PTR(min_initial_exposure_time);
+        OPT_PTR(max_initial_exposure_time);
     }
 };
 
diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp
index 8e99d6ddc..21aec8384 100644
--- a/src/libslic3r/SLAPrint.cpp
+++ b/src/libslic3r/SLAPrint.cpp
@@ -692,19 +692,19 @@ 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_max = m_printer_config.max_exposure_time.getFloat();
+    double expt_min = m_printer_config.min_exposure_time.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.");
+        return L("Exposition time is out of printer profile 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_max = m_printer_config.max_initial_exposure_time.getFloat();
+    double iexpt_min = m_printer_config.min_initial_exposure_time.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 L("Initial exposition time is out of printer profile bounds.");
 
     return "";
 }
@@ -1600,11 +1600,11 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector<t_config_opt
     // Cache the plenty of parameters, which influence the final rasterization only,
     // or they are only notes not influencing the rasterization step.
     static std::unordered_set<std::string> steps_rasterize = {
-        "exposure_time_min",
-        "exposure_time_max",
+        "min_exposure_time",
+        "max_exposure_time",
         "exposure_time",
-        "initial_exposure_time_min",
-        "initial_exposure_time_max",
+        "min_initial_exposure_time",
+        "max_initial_exposure_time",
         "initial_exposure_time",
         "display_width",
         "display_height",
diff --git a/src/slic3r/GUI/Preset.cpp b/src/slic3r/GUI/Preset.cpp
index 82124761a..64793630c 100644
--- a/src/slic3r/GUI/Preset.cpp
+++ b/src/slic3r/GUI/Preset.cpp
@@ -500,8 +500,8 @@ const std::vector<std::string>& Preset::sla_material_options()
     if (s_opts.empty()) {
         s_opts = {
             "initial_layer_height",
-            "exposure_time_min", "exposure_time_max", "exposure_time",
-            "initial_exposure_time_min", "initial_exposure_time_max", "initial_exposure_time",
+            "exposure_time",
+            "initial_exposure_time",
             "material_correction",
             "material_notes",
             "default_sla_material_profile",
@@ -527,6 +527,8 @@ const std::vector<std::string>& Preset::sla_printer_options()
             "relative_correction",
             "absolute_correction",
             "gamma_correction",
+            "min_exposure_time", "max_exposure_time",
+            "min_initial_exposure_time", "max_initial_exposure_time",
             "print_host", "printhost_apikey", "printhost_cafile",
             "printer_notes",
             "inherits"
diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp
index 030165337..368854222 100644
--- a/src/slic3r/GUI/Tab.cpp
+++ b/src/slic3r/GUI/Tab.cpp
@@ -838,7 +838,7 @@ static wxString support_combo_value_for_config(const DynamicPrintConfig &config,
 
 static wxString pad_combo_value_for_config(const DynamicPrintConfig &config)
 {
-	return config.opt_bool("pad_enable") ? (config.opt_bool("pad_zero_elevation") ? _("Around object") : _("Below object")) : _("None");
+    return config.opt_bool("pad_enable") ? (config.opt_bool("pad_zero_elevation") ? _("Around object") : _("Below object")) : _("None");
 }
 
 void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
@@ -860,8 +860,8 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
             (opt_key == "supports_enable"  || opt_key == "support_buildplate_only"))
         og_freq_chng_params->set_value("support", support_combo_value_for_config(*m_config, is_fff));
 
-	if (! is_fff && (opt_key == "pad_enable" || opt_key == "pad_zero_elevation"))
-		og_freq_chng_params->set_value("pad", pad_combo_value_for_config(*m_config));
+    if (! is_fff && (opt_key == "pad_enable" || opt_key == "pad_zero_elevation"))
+        og_freq_chng_params->set_value("pad", pad_combo_value_for_config(*m_config));
 
     if (opt_key == "brim_width")
     {
@@ -998,7 +998,7 @@ void Tab::update_frequently_changed_parameters()
 
     og_freq_chng_params->set_value("support", support_combo_value_for_config(*m_config, is_fff));
     if (! is_fff)
-    	og_freq_chng_params->set_value("pad", pad_combo_value_for_config(*m_config));
+        og_freq_chng_params->set_value("pad", pad_combo_value_for_config(*m_config));
 
     const std::string updated_value_key = is_fff ? "fill_density" : "pad_enable";
 
@@ -1772,13 +1772,13 @@ void TabFilament::reload_config()
 
 void TabFilament::update_volumetric_flow_preset_hints()
 {
-	wxString text;
-	try {
-		text = from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle));
-	} catch (std::exception &ex) {
-		text = _(L("Volumetric flow hints not available\n\n")) + from_u8(ex.what());
-	}
-	m_volumetric_speed_description_line->SetText(text);
+    wxString text;
+    try {
+        text = from_u8(PresetHints::maximum_volumetric_flow_description(*m_preset_bundle));
+    } catch (std::exception &ex) {
+        text = _(L("Volumetric flow hints not available\n\n")) + from_u8(ex.what());
+    }
+    m_volumetric_speed_description_line->SetText(text);
 }
 
 void TabFilament::update()
@@ -1788,9 +1788,9 @@ void TabFilament::update()
 
     m_update_cnt++;
 
-	wxString text = from_u8(PresetHints::cooling_description(m_presets->get_edited_preset()));
-	m_cooling_description_line->SetText(text);
-	this->update_volumetric_flow_preset_hints();
+    wxString text = from_u8(PresetHints::cooling_description(m_presets->get_edited_preset()));
+    m_cooling_description_line->SetText(text);
+    this->update_volumetric_flow_preset_hints();
     Layout();
 
     bool cooling = m_config->opt_bool("cooling", 0);
@@ -1812,8 +1812,8 @@ void TabFilament::update()
 
 void TabFilament::OnActivate()
 {
-	this->update_volumetric_flow_preset_hints();
-	Tab::OnActivate();
+    this->update_volumetric_flow_preset_hints();
+    Tab::OnActivate();
 }
 
 wxSizer* Tab::description_line_widget(wxWindow* parent, ogStaticText* *StaticText)
@@ -2290,6 +2290,12 @@ void TabPrinter::build_sla()
     optgroup->append_single_option_line("absolute_correction");
     optgroup->append_single_option_line("gamma_correction");
 
+    optgroup = page->new_optgroup(_(L("Exposure")));
+    optgroup->append_single_option_line("min_exposure_time");
+    optgroup->append_single_option_line("max_exposure_time");
+    optgroup->append_single_option_line("min_initial_exposure_time");
+    optgroup->append_single_option_line("max_initial_exposure_time");
+
     optgroup = page->new_optgroup(_(L("Print Host upload")));
     build_printhost(optgroup.get());
 
@@ -2560,7 +2566,7 @@ void TabPrinter::build_unregular_pages()
             optgroup = page->new_optgroup(_(L("Preview")));
 
             auto reset_to_filament_color = [this, extruder_idx](wxWindow* parent) {
-                add_scaled_button(parent, &m_reset_to_filament_color, "undo", 
+                add_scaled_button(parent, &m_reset_to_filament_color, "undo",
                                   _(L("Reset to Filament Color")), wxBU_LEFT | wxBU_EXACTFIT);
                 ScalableButton* btn = m_reset_to_filament_color;
                 btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
@@ -2571,7 +2577,7 @@ void TabPrinter::build_unregular_pages()
                 {
                     std::vector<std::string> colors = static_cast<const ConfigOptionStrings*>(m_config->option("extruder_colour"))->values;
                     colors[extruder_idx] = "";
-                        
+
                     DynamicPrintConfig new_conf = *m_config;
                     new_conf.set_key_value("extruder_colour", new ConfigOptionStrings(colors));
                     load_config(new_conf);
@@ -3614,11 +3620,7 @@ 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")));
@@ -3683,59 +3685,11 @@ 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);
-
-    if ((cmp | diff) != cmp) {
-        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;
-        }
-        
-        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