From 7b207aaf5c988c4b7a70f805d660178f1a9eb8eb Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Mon, 12 Dec 2022 16:23:33 +0100 Subject: [PATCH] Add "Enforcers only" option into support combo box And also make it work --- src/libslic3r/Preset.cpp | 1 + src/libslic3r/PrintConfig.cpp | 7 +++++ src/libslic3r/PrintConfig.hpp | 3 ++ src/libslic3r/SLAPrint.cpp | 5 +-- src/libslic3r/SLAPrintSteps.cpp | 44 +++++++++++++++++---------- src/slic3r/GUI/ConfigManipulation.cpp | 1 + src/slic3r/GUI/Plater.cpp | 7 +++-- src/slic3r/GUI/Tab.cpp | 1 + 8 files changed, 49 insertions(+), 20 deletions(-) diff --git a/src/libslic3r/Preset.cpp b/src/libslic3r/Preset.cpp index bd70ee739..49b8c99a2 100644 --- a/src/libslic3r/Preset.cpp +++ b/src/libslic3r/Preset.cpp @@ -502,6 +502,7 @@ static std::vector s_Preset_sla_print_options { "support_max_bridges_on_pillar", "support_pillar_connection_mode", "support_buildplate_only", + "support_enforcers_only", "support_pillar_widening_factor", "support_base_diameter", "support_base_height", diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp index fe35161b0..b1a98d5ad 100644 --- a/src/libslic3r/PrintConfig.cpp +++ b/src/libslic3r/PrintConfig.cpp @@ -3661,6 +3661,13 @@ void PrintConfigDef::init_sla_params() def->mode = comSimple; def->set_default_value(new ConfigOptionBool(false)); + def = this->add("support_enforcers_only", coBool); + def->label = L("Support only in enforced regions"); + def->category = L("Supports"); + def->tooltip = L("Only create support if it lies in a support enforcer."); + def->mode = comSimple; + def->set_default_value(new ConfigOptionBool(false)); + def = this->add("support_pillar_widening_factor", coFloat); def->label = L("Pillar widening factor"); def->category = L("Supports"); diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp index 3258de005..d67296646 100644 --- a/src/libslic3r/PrintConfig.hpp +++ b/src/libslic3r/PrintConfig.hpp @@ -858,6 +858,9 @@ PRINT_CONFIG_CLASS_DEFINE( // Generate only ground facing supports ((ConfigOptionBool, support_buildplate_only)) + // Generate only ground facing supports + ((ConfigOptionBool, support_enforcers_only)) + // TODO: unimplemented at the moment. This coefficient will have an impact // when bridges and pillars are merged. The resulting pillar should be a bit // thicker than the ones merging into it. How much thicker? I don't know diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp index fdb264b5e..89c881ebf 100644 --- a/src/libslic3r/SLAPrint.cpp +++ b/src/libslic3r/SLAPrint.cpp @@ -35,7 +35,7 @@ bool is_zero_elevation(const SLAPrintObjectConfig &c) sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c) { sla::SupportTreeConfig scfg; - + scfg.enabled = c.supports_enable.getBool(); scfg.tree_type = c.support_tree_type.value; scfg.head_front_radius_mm = 0.5*c.support_head_front_diameter.getFloat(); @@ -58,7 +58,7 @@ sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c) scfg.pillar_base_safety_distance_mm = c.support_base_safety_distance.getFloat() < EPSILON ? scfg.safety_distance_mm : c.support_base_safety_distance.getFloat(); - + scfg.max_bridges_on_pillar = unsigned(c.support_max_bridges_on_pillar.getInt()); return scfg; @@ -827,6 +827,7 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector &blockers, - const std::vector &enforcers, - const std::vector &slice_grid) + +struct SuppPtMask { + const std::vector &blockers; + const std::vector &enforcers; + bool enforcers_only = false; +}; + +static void filter_support_points_by_modifiers(sla::SupportPoints &pts, + const SuppPtMask &mask, + const std::vector &slice_grid) { assert((blockers.empty() || blockers.size() == slice_grid.size()) && (enforcers.empty() || enforcers.size() == slice_grid.size())); @@ -423,24 +428,30 @@ static void filter_support_points_by_modifiers( if (it != slice_grid.end()) { size_t idx = std::distance(slice_grid.begin(), it); bool is_enforced = false; - if (idx < enforcers.size()) { + if (idx < mask.enforcers.size()) { for (size_t enf_idx = 0; - !is_enforced && enf_idx < enforcers[idx].size(); + !is_enforced && enf_idx < mask.enforcers[idx].size(); ++enf_idx) { - if (enforcers[idx][enf_idx].contains(sp2d)) + if (mask.enforcers[idx][enf_idx].contains(sp2d)) is_enforced = true; } } bool is_blocked = false; - if (!is_enforced && idx < blockers.size()) { - for (size_t blk_idx = 0; - !is_blocked && blk_idx < blockers[idx].size(); - ++blk_idx) - { - if (blockers[idx][blk_idx].contains(sp2d)) - is_blocked = true; + if (!is_enforced) { + if (!mask.enforcers_only) { + if (idx < mask.blockers.size()) { + for (size_t blk_idx = 0; + !is_blocked && blk_idx < mask.blockers[idx].size(); + ++blk_idx) + { + if (mask.blockers[idx][blk_idx].contains(sp2d)) + is_blocked = true; + } + } + } else { + is_blocked = true; } } @@ -527,7 +538,8 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) return vol->is_support_enforcer(); }); - filter_support_points_by_modifiers(points, blockers, enforcers, po.m_model_height_levels); + SuppPtMask mask{blockers, enforcers, po.config().support_enforcers_only.getBool()}; + filter_support_points_by_modifiers(points, mask, po.m_model_height_levels); po.m_supportdata->input.pts = points; diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp index 50dd4e743..876228bd9 100644 --- a/src/slic3r/GUI/ConfigManipulation.cpp +++ b/src/slic3r/GUI/ConfigManipulation.cpp @@ -374,6 +374,7 @@ void ConfigManipulation::toggle_print_sla_options(DynamicPrintConfig* config) toggle_field("support_pillar_connection_mode", supports_en && is_default_tree); toggle_field("support_tree_type", supports_en); toggle_field("support_buildplate_only", supports_en); + toggle_field("support_enforcers_only", supports_en); toggle_field("support_base_diameter", supports_en); toggle_field("support_base_height", supports_en); toggle_field("support_base_safety_distance", supports_en); diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 85a781e5c..7d197e1e3 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -545,10 +545,15 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) : const bool supports_enable = selection == _("None") ? false : true; new_conf.set_key_value("supports_enable", new ConfigOptionBool(supports_enable)); + new_conf.set_key_value("support_enforcers_only", new ConfigOptionBool(false)); + if (selection == _("Everywhere")) new_conf.set_key_value("support_buildplate_only", new ConfigOptionBool(false)); else if (selection == _("Support on build plate only")) new_conf.set_key_value("support_buildplate_only", new ConfigOptionBool(true)); + else if (selection == _("For support enforcers only")) { + new_conf.set_key_value("support_enforcers_only", new ConfigOptionBool(true)); + } } tab->load_config(new_conf); @@ -559,8 +564,6 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) : ConfigOptionDef support_def_sla = support_def; support_def_sla.set_default_value(new ConfigOptionStrings{ "None" }); - assert(support_def_sla.enum_labels[2] == L("For support enforcers only")); - support_def_sla.enum_labels.erase(support_def_sla.enum_labels.begin() + 2); option = Option(support_def_sla, "support"); option.opt.full_width = true; line.append_option(option); diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp index 9515fa2b6..d36c25d39 100644 --- a/src/slic3r/GUI/Tab.cpp +++ b/src/slic3r/GUI/Tab.cpp @@ -4777,6 +4777,7 @@ void TabSLAPrint::build() optgroup->append_single_option_line("support_pillar_connection_mode"); optgroup->append_single_option_line("support_buildplate_only"); + optgroup->append_single_option_line("support_enforcers_only"); optgroup->append_single_option_line("support_pillar_widening_factor"); optgroup->append_single_option_line("support_base_diameter"); optgroup->append_single_option_line("support_base_height");