diff --git a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp index a1bd76a454..e73d636c3b 100644 --- a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp +++ b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp @@ -52,8 +52,7 @@ bool SampleConfigFactory::verify(SampleConfig &cfg) { return res; } -SampleConfig SampleConfigFactory::create(float support_head_diameter_in_mm) -{ +SampleConfig SampleConfigFactory::create(float support_head_diameter_in_mm) { SampleConfig result; result.head_radius = static_cast(scale_(support_head_diameter_in_mm/2)); @@ -99,6 +98,30 @@ SampleConfig SampleConfigFactory::create(float support_head_diameter_in_mm) return result; } +SampleConfig SampleConfigFactory::apply_density(const SampleConfig ¤t, float density) { + if (is_approx(density, 1.f)) + return current; + if (density < .1f) + density = .1f; // minimal 10% + + SampleConfig result = current; // copy + result.thin_max_distance = static_cast(current.thin_max_distance / density); // linear + result.thick_inner_max_distance = static_cast( // controll radius - quadratic + std::sqrt(sqr((double) current.thick_inner_max_distance) / density) + ); + result.thick_outline_max_distance = static_cast( + current.thick_outline_max_distance / density + ); // linear + // result.head_radius .. no change + // result.minimal_distance_from_outline .. no change + // result.maximal_distance_from_outline .. no change + // result.max_length_for_one_support_point .. no change + // result.max_length_for_two_support_points .. no change + verify(result); + return result; +} + +#ifdef USE_ISLAND_GUI_FOR_SETTINGS std::optional SampleConfigFactory::gui_sample_config_opt; SampleConfig &SampleConfigFactory::get_sample_config() { // init config @@ -109,22 +132,6 @@ SampleConfig &SampleConfigFactory::get_sample_config() { } SampleConfig SampleConfigFactory::get_sample_config(float density) { - const SampleConfig ¤t = get_sample_config(); - if (is_approx(density, 1.f)) - return current; - if (density < .1f) - density = .1f; // minimal 10% - - SampleConfig result = current; // copy - result.thin_max_distance = static_cast(current.thin_max_distance / density); // linear - result.thick_inner_max_distance = static_cast( // controll radius - quadratic - std::sqrt(sqr((double)current.thick_inner_max_distance) / density)); - result.thick_outline_max_distance = static_cast(current.thick_outline_max_distance / density); // linear - // result.head_radius .. no change - // result.minimal_distance_from_outline .. no change - // result.maximal_distance_from_outline .. no change - // result.max_length_for_one_support_point .. no change - // result.max_length_for_two_support_points .. no change - verify(result); - return result; + return apply_density(get_sample_config(), density); } +#endif // USE_ISLAND_GUI_FOR_SETTINGS \ No newline at end of file diff --git a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp index d29e931e0c..16286f4baf 100644 --- a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp +++ b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp @@ -5,6 +5,8 @@ #include "SampleConfig.hpp" #include "libslic3r/PrintConfig.hpp" +//#define USE_ISLAND_GUI_FOR_SETTINGS + namespace Slic3r::sla { /// @@ -17,7 +19,8 @@ public: static bool verify(SampleConfig &cfg); static SampleConfig create(float support_head_diameter_in_mm); - + static SampleConfig apply_density(const SampleConfig& cfg, float density); +#ifdef USE_ISLAND_GUI_FOR_SETTINGS private: // TODO: REMOVE IT. Do not use in production // Global variable to temporary set configuration from GUI into SLA print steps @@ -34,6 +37,7 @@ public: /// 1.1f.. extend count of supports (approx to 110%) /// Scaled configuration static SampleConfig get_sample_config(float density); +#endif // USE_ISLAND_GUI_FOR_SETTINGS }; } // namespace Slic3r::sla #endif // slic3r_SLA_SuppotstIslands_SampleConfigFactory_hpp_ diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 5331e643b3..0458eb0e7c 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -543,7 +543,11 @@ void SLAPrint::Steps::prepare_for_generate_supports(SLAPrintObject &po) { using namespace sla; std::vector slices = po.get_model_slices(); // copy const std::vector &heights = po.m_model_height_levels; - const PrepareSupportConfig &prepare_cfg = SampleConfigFactory::get_sample_config().prepare_config; +#ifdef USE_ISLAND_GUI_FOR_SETTINGS + const PrepareSupportConfig &prepare_cfg = SampleConfigFactory::get_sample_config(po.config().support_head_front_diameter).prepare_config; // use configuration edited by GUI +#else // USE_ISLAND_GUI_FOR_SETTINGS + const PrepareSupportConfig prepare_cfg; // use Default values of the configuration +#endif // USE_ISLAND_GUI_FOR_SETTINGS ThrowOnCancel cancel = [this]() { throw_if_canceled(); }; // scaling for the sub operations @@ -750,8 +754,14 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) } // copy current configuration for sampling islands +#ifdef USE_ISLAND_GUI_FOR_SETTINGS + // use static variable to propagate data from GUI config.island_configuration = SampleConfigFactory::get_sample_config(config.density_relative); - +#else // USE_ISLAND_GUI_FOR_SETTINGS + config.island_configuration = SampleConfigFactory::apply_density( + SampleConfigFactory::create(config.head_diameter), config.density_relative); +#endif // USE_ISLAND_GUI_FOR_SETTINGS + // scaling for the sub operations double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportPoints] / 100.0; double init = current_status(); diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 622f32b99c..4a74f655da 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -785,18 +785,20 @@ RENDER_AGAIN: ImVec4 light_gray{0.4f, 0.4f, 0.4f, 1.0f}; ImGui::TextColored(light_gray, "%s", stats.c_str()); - //ImGui::Separator(); // START temporary debug - //ImGui::Text("Between delimiters is temporary GUI"); - //sla::SampleConfig &sample_config = sla::SampleConfigFactory::get_sample_config(); - //if (float overhang_sample_distance = sample_config.prepare_config.discretize_overhang_step; - // m_imgui->slider_float("overhang discretization", &overhang_sample_distance, 2e-5f, 10.f, "%.2f mm")){ - // sample_config.prepare_config.discretize_overhang_step = overhang_sample_distance; - //} else if (ImGui::IsItemHovered()) - // ImGui::SetTooltip("Smaller will slow down. Step for discretization overhang outline for test of support need"); - // - //draw_island_config(); - //ImGui::Text("Distribution depends on './resources/data/sla_support.svg'\ninstruction for edit are in file"); - //ImGui::Separator(); +#ifdef USE_ISLAND_GUI_FOR_SETTINGS + ImGui::Separator(); + ImGui::Text("Between delimiters is temporary GUI"); + sla::SampleConfig &sample_config = sla::SampleConfigFactory::get_sample_config(); + if (float overhang_sample_distance = sample_config.prepare_config.discretize_overhang_step; + m_imgui->slider_float("overhang discretization", &overhang_sample_distance, 2e-5f, 10.f, "%.2f mm")){ + sample_config.prepare_config.discretize_overhang_step = overhang_sample_distance; + } else if (ImGui::IsItemHovered()) + ImGui::SetTooltip("Smaller will slow down. Step for discretization overhang outline for test of support need"); + + draw_island_config(); + ImGui::Text("Distribution depends on './resources/data/sla_support.svg'\ninstruction for edit are in file"); + ImGui::Separator(); +#endif // USE_ISLAND_GUI_FOR_SETTINGS if (ImGuiPureWrap::button(m_desc.at("auto_generate"))) auto_generate(); @@ -884,6 +886,7 @@ RENDER_AGAIN: m_parent.set_as_dirty(); } +#ifdef USE_ISLAND_GUI_FOR_SETTINGS void GLGizmoSlaSupports::draw_island_config() { if (!ImGui::TreeNode("Support islands:")) return; // no need to draw configuration for islands @@ -1014,6 +1017,7 @@ void GLGizmoSlaSupports::draw_island_config() { // end of tree node ImGui::TreePop(); } +#endif // USE_ISLAND_GUI_FOR_SETTINGS bool GLGizmoSlaSupports::on_is_activable() const { diff --git a/tests/sla_print/sla_supptgen_tests.cpp b/tests/sla_print/sla_supptgen_tests.cpp index e5125ce022..962a71a177 100644 --- a/tests/sla_print/sla_supptgen_tests.cpp +++ b/tests/sla_print/sla_supptgen_tests.cpp @@ -596,6 +596,9 @@ TEST_CASE("Disable visualization", "[hide]") #ifdef STORE_ISLAND_ISSUES CHECK(false); #endif // STORE_ISLAND_ISSUES +#ifdef USE_ISLAND_GUI_FOR_SETTINGS + CHECK(false); +#endif // USE_ISLAND_GUI_FOR_SETTINGS CHECK(is_uniform_support_island_visualization_disabled()); }