From 4f7f08d0de11e2c54e37451c7f18e2082c0fed2f Mon Sep 17 00:00:00 2001 From: tamasmeszaros <meszaros.q@gmail.com> Date: Wed, 2 Dec 2020 14:04:39 +0100 Subject: [PATCH] Further improvement on arrange settings handling --- src/slic3r/GUI/GLCanvas3D.cpp | 93 +++++++++++++++++------------- src/slic3r/GUI/GLCanvas3D.hpp | 46 +++++++++++++-- src/slic3r/GUI/Jobs/ArrangeJob.cpp | 8 +-- src/slic3r/GUI/Jobs/FillBedJob.cpp | 8 +-- 4 files changed, 100 insertions(+), 55 deletions(-) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index aec9c40ad..e634404a0 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1095,35 +1095,48 @@ wxDEFINE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent); const double GLCanvas3D::DefaultCameraZoomToBoxMarginFactor = 1.25; -static GLCanvas3D::ArrangeSettings load_arrange_settings() +void GLCanvas3D::load_arrange_settings() { - GLCanvas3D::ArrangeSettings settings; + std::string dist_fff_str = + wxGetApp().app_config->get("arrange", "min_object_distance_fff"); - std::string dist_str = - wxGetApp().app_config->get("arrange", "min_object_distance"); - - std::string dist_seq_print_str = - wxGetApp().app_config->get("arrange", "min_object_distance_seq_print"); + std::string dist_fff_seq_print_str = + wxGetApp().app_config->get("arrange", "min_object_distance_fff_seq_print"); std::string dist_sla_str = wxGetApp().app_config->get("arrange", "min_object_distance_sla"); - std::string en_rot_str = - wxGetApp().app_config->get("arrange", "enable_rotation"); + std::string en_rot_fff_str = + wxGetApp().app_config->get("arrange", "enable_rotation_fff"); - if (!dist_str.empty()) - settings.distance = std::stof(dist_str); + std::string en_rot_fff_seqp_str = + wxGetApp().app_config->get("arrange", "enable_rotation_fff_seq_print"); - if (!dist_seq_print_str.empty()) - settings.distance_seq_print = std::stof(dist_seq_print_str); + std::string en_rot_sla_str = + wxGetApp().app_config->get("arrange", "enable_rotation_sla"); + + if (!dist_fff_str.empty()) + m_arrange_settings_fff.distance = std::stof(dist_fff_str); + + if (!dist_fff_seq_print_str.empty()) + m_arrange_settings_fff_seq_print.distance = std::stof(dist_fff_seq_print_str); if (!dist_sla_str.empty()) - settings.distance_sla = std::stof(dist_sla_str); + m_arrange_settings_sla.distance = std::stof(dist_sla_str); - if (!en_rot_str.empty()) - settings.enable_rotation = (en_rot_str == "1" || en_rot_str == "yes"); + if (!en_rot_fff_str.empty()) + m_arrange_settings_fff.enable_rotation = (en_rot_fff_str == "1" || en_rot_fff_str == "yes"); - return settings; + if (!en_rot_fff_seqp_str.empty()) + m_arrange_settings_fff_seq_print.enable_rotation = (en_rot_fff_seqp_str == "1" || en_rot_fff_seqp_str == "yes"); + + if (!en_rot_sla_str.empty()) + m_arrange_settings_sla.enable_rotation = (en_rot_sla_str == "1" || en_rot_sla_str == "yes"); +} + +PrinterTechnology GLCanvas3D::current_printer_technology() const +{ + return m_process->current_printer_technology(); } GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) @@ -1168,7 +1181,7 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas) #endif // ENABLE_RETINA_GL } - m_arrange_settings = load_arrange_settings(); + load_arrange_settings(); m_selection.set_volumes(&m_volumes.volumes); } @@ -3914,59 +3927,57 @@ bool GLCanvas3D::_render_arrange_menu(float pos_x) imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f); imgui->begin(_L("Arrange options"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse); - ArrangeSettings settings = m_arrange_settings; + + ArrangeSettings settings = get_arrange_settings(); + ArrangeSettings &settings_out = get_arrange_settings(); auto &appcfg = wxGetApp().app_config; PrinterTechnology ptech = m_process->current_printer_technology(); bool settings_changed = false; - float *dist_val = nullptr; - float *dist_val_out = nullptr; float dist_min = 0.f; - std::string dist_key; + std::string dist_key = "min_object_distance", rot_key = "enable_rotation"; + std::string postfix; if (ptech == ptSLA) { - dist_val = &settings.distance_sla; - dist_val_out = &m_arrange_settings.distance_sla; dist_min = 0.f; - dist_key = "min_object_distance_sla"; + postfix = "_sla"; } else if (ptech == ptFFF) { auto co_opt = m_config->option<ConfigOptionBool>("complete_objects"); if (co_opt && co_opt->value) { - dist_val = &settings.distance_seq_print; - dist_val_out = &m_arrange_settings.distance_seq_print; dist_min = float(min_object_distance(*m_config)); - dist_key = "min_object_distance_seq_print"; + postfix = "_fff_seq_print"; } else { - dist_val = &settings.distance; - dist_val_out = &m_arrange_settings.distance; dist_min = 0.f; - dist_key = "min_object_distance"; + postfix = "_fff"; } } + dist_key += postfix; + rot_key += postfix; + imgui->text(_L("Use CTRL+left mouse key to enter text edit mode:")); - *dist_val = std::max(dist_min, *dist_val); - - if (imgui->slider_float(_L("Clearance size"), dist_val, dist_min, 100.0f, "%5.2f")) { - *dist_val_out = *dist_val; - appcfg->set("arrange", dist_key.c_str(), std::to_string(*dist_val_out)); + if (imgui->slider_float(_L("Clearance size"), &settings.distance, dist_min, 100.0f, "%5.2f") || dist_min > settings.distance) { + settings.distance = std::max(dist_min, settings.distance); + settings_out.distance = settings.distance; + appcfg->set("arrange", dist_key.c_str(), std::to_string(settings_out.distance)); settings_changed = true; } if (imgui->checkbox(_L("Enable rotations (slow)"), settings.enable_rotation)) { - m_arrange_settings.enable_rotation = settings.enable_rotation; - appcfg->set("arrange", "enable_rotation", m_arrange_settings.enable_rotation? "1" : "0"); + settings_out.enable_rotation = settings.enable_rotation; + appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); settings_changed = true; } ImGui::Separator(); if (imgui->button(_L("Reset"))) { - m_arrange_settings = ArrangeSettings{}; - appcfg->set("arrange", dist_key.c_str(), std::to_string(*dist_val_out)); - appcfg->set("arrange", "enable_rotation", m_arrange_settings.enable_rotation? "1" : "0"); + settings_out = ArrangeSettings{}; + settings_out.distance = std::max(dist_min, settings_out.distance); + appcfg->set("arrange", dist_key.c_str(), std::to_string(settings_out.distance)); + appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0"); settings_changed = true; } diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index 72022fec0..1329a8744 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -388,8 +388,8 @@ public: struct ArrangeSettings { float distance = 6.; - float distance_seq_print = 6.; // Used when sequential print is ON - float distance_sla = 6.; +// float distance_seq_print = 6.; // Used when sequential print is ON +// float distance_sla = 6.; float accuracy = 0.65f; // Unused currently bool enable_rotation = false; }; @@ -465,7 +465,35 @@ private: mutable bool m_tooltip_enabled{ true }; Slope m_slope; - ArrangeSettings m_arrange_settings; + ArrangeSettings m_arrange_settings_fff, m_arrange_settings_sla, + m_arrange_settings_fff_seq_print; + + PrinterTechnology current_printer_technology() const; + + template<class Self> + static auto & get_arrange_settings(Self *self) + { + PrinterTechnology ptech = self->current_printer_technology(); + + auto *ptr = &self->m_arrange_settings_fff; + + if (ptech == ptSLA) { + ptr = &self->m_arrange_settings_sla; + } else if (ptech == ptFFF) { + auto co_opt = self->m_config->template option<ConfigOptionBool>("complete_objects"); + if (co_opt && co_opt->value) { + ptr = &self->m_arrange_settings_fff_seq_print; + } else { + ptr = &self->m_arrange_settings_fff; + } + } + + return *ptr; + } + + ArrangeSettings &get_arrange_settings() { return get_arrange_settings(this); } + + void load_arrange_settings(); public: explicit GLCanvas3D(wxGLCanvas* canvas); @@ -686,7 +714,17 @@ public: void use_slope(bool use) { m_slope.use(use); } void set_slope_normal_angle(float angle_in_deg) { m_slope.set_normal_angle(angle_in_deg); } - const ArrangeSettings& get_arrange_settings() const { return m_arrange_settings; } + ArrangeSettings get_arrange_settings() const + { + const ArrangeSettings &settings = get_arrange_settings(this); + ArrangeSettings ret = settings; + if (&settings == &m_arrange_settings_fff_seq_print) { + ret.distance = std::max(ret.distance, + float(min_object_distance(*m_config))); + } + + return ret; + } private: bool _is_shown_on_screen() const; diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp index 8d28d0a7c..ebe6515cb 100644 --- a/src/slic3r/GUI/Jobs/ArrangeJob.cpp +++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp @@ -145,14 +145,12 @@ void ArrangeJob::process() { static const auto arrangestr = _(L("Arranging")); - GLCanvas3D::ArrangeSettings settings = - m_plater->canvas3D()->get_arrange_settings(); + const GLCanvas3D::ArrangeSettings &settings = + static_cast<const GLCanvas3D*>(m_plater->canvas3D())->get_arrange_settings(); arrangement::ArrangeParams params; params.allow_rotations = settings.enable_rotation; - params.min_obj_distance = m_plater->config()->opt_bool("complete_objects") ? - scaled(settings.distance_seq_print) : - scaled(settings.distance); + params.min_obj_distance = scaled(settings.distance); auto count = unsigned(m_selected.size() + m_unprintable.size()); diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp index 533fe64da..5bc9cbb36 100644 --- a/src/slic3r/GUI/Jobs/FillBedJob.cpp +++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp @@ -83,14 +83,12 @@ void FillBedJob::process() { if (m_object_idx == -1 || m_selected.empty()) return; - GLCanvas3D::ArrangeSettings settings = - m_plater->canvas3D()->get_arrange_settings(); + const GLCanvas3D::ArrangeSettings &settings = + static_cast<const GLCanvas3D*>(m_plater->canvas3D())->get_arrange_settings(); arrangement::ArrangeParams params; params.allow_rotations = settings.enable_rotation; - params.min_obj_distance = m_plater->config()->opt_bool("complete_objects") ? - scaled(settings.distance_seq_print) : - scaled(settings.distance); + params.min_obj_distance = scaled(settings.distance); bool do_stop = false; params.stopcondition = [this, &do_stop]() {