diff --git a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp index 057236b263..40e9e3178e 100644 --- a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp +++ b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.cpp @@ -97,3 +97,24 @@ SampleConfig &SampleConfigFactory::get_sample_config() { gui_sample_config_opt = sla::SampleConfigFactory::create(.4f); return *gui_sample_config_opt; } + +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; +} diff --git a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp index 762798a0b6..d29e931e0c 100644 --- a/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp +++ b/src/libslic3r/SLA/SupportIslands/SampleConfigFactory.hpp @@ -24,6 +24,16 @@ private: static std::optional gui_sample_config_opt; public: static SampleConfig &get_sample_config(); + + /// + /// Create scaled copy of sample config + /// + /// Scale for config values(minimal value is .1f) + /// 1.f .. no scale + /// .9f .. less support points (approx 90%) + /// 1.1f.. extend count of supports (approx to 110%) + /// Scaled configuration + static SampleConfig get_sample_config(float density); }; } // namespace Slic3r::sla #endif // slic3r_SLA_SuppotstIslands_SampleConfigFactory_hpp_ diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp index 24b65135e5..0af1799779 100644 --- a/src/libslic3r/SLAPrintSteps.cpp +++ b/src/libslic3r/SLAPrintSteps.cpp @@ -680,7 +680,7 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po) } // copy current configuration for sampling islands - config.island_configuration = SampleConfigFactory::get_sample_config(); // copy + config.island_configuration = SampleConfigFactory::get_sample_config(config.density_relative); // scaling for the sub operations double d = objectstep_scale * OBJ_STEP_LEVELS[slaposSupportPoints] / 100.0; diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp index 85409fcd23..f83529e3bd 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp @@ -742,19 +742,23 @@ RENDER_AGAIN: } const char *support_points_density = "support_points_density_relative"; - float density = static_cast(get_config_options({support_points_density})[0])->value; - if (m_imgui->slider_float("##density", &density, 0.f, 200.f, "%.f %%")){ + float density = static_cast(get_config_options({support_points_density})[0])->value; + + wxString tooltip = _L( + "Divider for the supported radius\n" + "Smaller value means less point, supported radius is enlarged.\n" + "Larger value means more points, supported radius is reduced.\n" + "-- density percent ----- radisu change from 100 --\n" + "| 50 | 200 |\n" + "| 75 | 133 |\n" + "| 125 | 80 |\n" + "| 150 | 66 |\n" + "| 200 | 50 |\n"); + if (m_imgui->slider_float("##density", &density, 50.f, 200.f, "%.f %%", 1.f, false, tooltip)){ + if (density < 10.f) // not neccessary, but lower value seems pointless. Zero cause issues inside algorithms. + density = 10.f; mo->config.set(support_points_density, (int) density); - } else if (ImGui::IsItemHovered()) - ImGui::SetTooltip("Divider for the supported radius\n" - "Smaller value means less point, supported radius is enlarged.\n" - "Larger value means more points, supported radius is reduced.\n" - "-- density percent ----- radisu change from 100 --\n" - "| 50 | 200 |\n" - "| 75 | 133 |\n" - "| 125 | 80 |\n" - "| 150 | 66 |\n" - "| 200 | 50 |\n"); + } const ImGuiWrapper::LastSliderStatus &density_status = m_imgui->get_last_slider_status(); static std::optional density_stash; // Value for undo/redo stack is written on stop dragging