diff --git a/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.cpp b/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.cpp index 9353d4aac2..66ef53ec29 100644 --- a/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.cpp +++ b/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.cpp @@ -2,31 +2,7 @@ namespace Slic3r { -PrinterTechnology ArrangeSettingsDb_AppCfg::current_printer_technology() const -{ - PrinterTechnology pt = ptFFF; - - if (m_printtech_getter) - pt = m_printtech_getter(); - - return pt; -} - -const DynamicPrintConfig *ArrangeSettingsDb_AppCfg::config() const -{ - const DynamicPrintConfig *ret = nullptr; - - if (m_config_getter) - ret = m_config_getter(); - - return ret; -} - -ArrangeSettingsDb_AppCfg::ArrangeSettingsDb_AppCfg( - AppConfig *appcfg, - std::function cfgfn, - std::function printtech_fn) - : m_appcfg{appcfg}, m_config_getter{cfgfn}, m_printtech_getter{printtech_fn} +ArrangeSettingsDb_AppCfg::ArrangeSettingsDb_AppCfg(AppConfig *appcfg) : m_appcfg{appcfg} { m_settings_fff.postfix = "_fff"; m_settings_fff_seq.postfix = "_fff_seq_print"; @@ -149,33 +125,20 @@ ArrangeSettingsDb_AppCfg::ArrangeSettingsDb_AppCfg( m_settings_sla.vals.arr_strategy = arr_strategy; m_settings_fff.vals.arr_strategy = arr_strategy; m_settings_fff_seq.vals.arr_strategy = arr_strategy; - - if (config()) { - // Set default obj distance for fff sequential print mode - m_settings_fff_seq.defaults.d_obj = - std::max(m_settings_fff_seq.defaults.d_obj, - float(min_object_distance(*config()))); - } } void ArrangeSettingsDb_AppCfg::distance_from_obj_range(float &min, float &max) const { - min = 0.f; - if (config() && current_printer_technology() == ptFFF) { - auto co_opt = config()->option("complete_objects"); - if (co_opt && co_opt->value) { - min = float(min_object_distance(*config())); - } - } - max = 100.f; + min = get_slot(this).dobj_range.minval; + max = get_slot(this).dobj_range.maxval; } void ArrangeSettingsDb_AppCfg::distance_from_bed_range(float &min, float &max) const { - min = 0.f; - max = 100.f; + min = get_slot(this).dbed_range.minval; + max = get_slot(this).dbed_range.maxval; } arr2::ArrangeSettingsDb& ArrangeSettingsDb_AppCfg::set_distance_from_objects(float v) diff --git a/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp b/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp index 908deb73bc..1815fffbe6 100644 --- a/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp +++ b/src/libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp @@ -9,47 +9,47 @@ namespace Slic3r { class ArrangeSettingsDb_AppCfg: public arr2::ArrangeSettingsDb { - AppConfig *m_appcfg; - std::function m_config_getter; - std::function m_printtech_getter; +public: + enum Slots { slotFFF, slotFFFSeqPrint, slotSLA }; - struct Slot { Values vals; Values defaults; std::string postfix; }; +private: + AppConfig *m_appcfg; + Slots m_current_slot = slotFFF; + + struct FloatRange { float minval = 0.f, maxval = 100.f; }; + struct Slot + { + Values vals; + Values defaults; + FloatRange dobj_range, dbed_range; + std::string postfix; + }; // Settings and their defaults are stored separately for fff, // sla and fff sequential mode Slot m_settings_fff, m_settings_fff_seq, m_settings_sla; - PrinterTechnology current_printer_technology() const; - const DynamicPrintConfig *config() const; - template - static auto & get_slot(Self *self) { - PrinterTechnology ptech = self->current_printer_technology(); - - auto *ptr = &self->m_settings_fff; - - if (ptech == ptSLA) { - ptr = &self->m_settings_sla; - } else if (ptech == ptFFF && self->config()) { - auto co_opt = self->config()->template option( - "complete_objects"); - if (co_opt && co_opt->value) - ptr = &self->m_settings_fff_seq; - else - ptr = &self->m_settings_fff; + static auto & get_slot(Self *self, Slots slot) { + switch(slot) { + case slotFFF: return self->m_settings_fff; + case slotFFFSeqPrint: return self->m_settings_fff_seq; + case slotSLA: return self->m_settings_sla; } - return *ptr; + return self->m_settings_fff; + } + + template static auto &get_slot(Self *self) + { + return get_slot(self, self->m_current_slot); } template static auto& get_ref(Self *self) { return get_slot(self).vals; } public: - explicit ArrangeSettingsDb_AppCfg( - AppConfig *appcfg, - std::function cfgfn, - std::function printtech_getter); + explicit ArrangeSettingsDb_AppCfg(AppConfig *appcfg); float get_distance_from_objects() const override { return get_ref(this).d_obj; } float get_distance_from_bed() const override { return get_ref(this).d_bed; } @@ -71,6 +71,19 @@ public: ArrangeSettingsDb& set_arrange_strategy(ArrangeStrategy v) override; Values get_defaults() const override { return get_slot(this).defaults; } + + void set_active_slot(Slots slot) noexcept { m_current_slot = slot; } + void set_distance_from_obj_range(Slots slot, float min, float max) + { + get_slot(this, slot).dobj_range = FloatRange{min, max}; + } + + void set_distance_from_bed_range(Slots slot, float min, float max) + { + get_slot(this, slot).dbed_range = FloatRange{min, max}; + } + + Values &get_defaults(Slots slot) { return get_slot(this, slot).defaults; } }; } // namespace Slic3r diff --git a/src/slic3r/GUI/ArrangeSettingsDialogImgui.cpp b/src/slic3r/GUI/ArrangeSettingsDialogImgui.cpp index 9c75ce1cfa..b03ef6efd4 100644 --- a/src/slic3r/GUI/ArrangeSettingsDialogImgui.cpp +++ b/src/slic3r/GUI/ArrangeSettingsDialogImgui.cpp @@ -53,16 +53,24 @@ void ArrangeSettingsDialogImgui::render(float pos_x, float pos_y) m_db->distance_from_obj_range(dobj_min, dobj_max); m_db->distance_from_bed_range(dbed_min, dbed_max); + if(dobj_min > settings.d_obj) { + settings.d_obj = std::max(dobj_min, settings.d_obj); + m_db->set_distance_from_objects(settings.d_obj); + } + + if (dbed_min > settings.d_bed) { + settings.d_bed = std::max(dbed_min, settings.d_bed); + m_db->set_distance_from_bed(settings.d_bed); + } + if (m_imgui->slider_float(_L("Spacing"), &settings.d_obj, dobj_min, - dobj_max, "%5.2f") || - dobj_min > settings.d_obj) { + dobj_max, "%5.2f")) { settings.d_obj = std::max(dobj_min, settings.d_obj); m_db->set_distance_from_objects(settings.d_obj); } if (m_imgui->slider_float(_L("Spacing from bed"), &settings.d_bed, - dbed_min, dbed_max, "%5.2f") || - dbed_min > settings.d_bed) { + dbed_min, dbed_max, "%5.2f")) { settings.d_bed = std::max(dbed_min, settings.d_bed); m_db->set_distance_from_bed(settings.d_bed); } @@ -71,8 +79,7 @@ void ArrangeSettingsDialogImgui::render(float pos_x, float pos_y) m_db->set_rotation_enabled(settings.rotations); } -// Points bed = m_config ? get_bed_shape(*m_config) : Points{}; - if (/*arrangement::is_box(bed) */ m_show_xl_combo_predicate() && + if (m_show_xl_combo_predicate() && settings.xl_align >= 0 && m_imgui->combo(_L("Alignment"), {_u8L("Center"), _u8L("Rear left"), _u8L("Front left"), diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index fb2be672df..d9afc10346 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -35,7 +35,6 @@ #include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" #include "slic3r/Utils/UndoRedo.hpp" -#include "libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp" #if ENABLE_RETINA_GL #include "slic3r/Utils/RetinaHelper.hpp" @@ -1297,7 +1296,7 @@ void GLCanvas3D::SLAView::select_full_instance(const GLVolume::CompositeID& id) PrinterTechnology GLCanvas3D::current_printer_technology() const { - return m_process->current_printer_technology(); + return m_process ? m_process->current_printer_technology() : ptFFF; } bool GLCanvas3D::is_arrange_alignment_enabled() const @@ -1339,13 +1338,8 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas *canvas, Bed3D &bed) m_labels(*this), m_slope(m_volumes), m_sla_view(*this), - m_arrange_settings_dialog{wxGetApp().imgui(), - std::make_unique( - wxGetApp().app_config, - [this]() { return m_config; }, - [this] { - return current_printer_technology(); - })} + m_arrange_settings_db{wxGetApp().app_config}, + m_arrange_settings_dialog{wxGetApp().imgui(), &m_arrange_settings_db} { if (m_canvas != nullptr) { m_timer.SetOwner(m_canvas); @@ -1628,6 +1622,29 @@ void GLCanvas3D::set_config(const DynamicPrintConfig* config) { m_config = config; m_layers_editing.set_config(config); + + + if (config) { + PrinterTechnology ptech = current_printer_technology(); + + auto slot = ArrangeSettingsDb_AppCfg::slotFFF; + + if (ptech == ptSLA) { + slot = ArrangeSettingsDb_AppCfg::slotSLA; + } else if (ptech == ptFFF) { + auto co_opt = config->option("complete_objects"); + if (co_opt && co_opt->value) + slot = ArrangeSettingsDb_AppCfg::slotFFFSeqPrint; + else + slot = ArrangeSettingsDb_AppCfg::slotFFF; + } + + m_arrange_settings_db.set_active_slot(slot); + + double objdst = min_object_distance(*config); + m_arrange_settings_db.set_distance_from_obj_range(slot, min_object_distance(*config), 100.); + m_arrange_settings_db.get_defaults(slot).d_obj = objdst; + } } void GLCanvas3D::set_process(BackgroundSlicingProcess *process) diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp index a25fddaa67..8ec2260467 100644 --- a/src/slic3r/GUI/GLCanvas3D.hpp +++ b/src/slic3r/GUI/GLCanvas3D.hpp @@ -18,6 +18,8 @@ #include "Camera.hpp" #include "SceneRaycaster.hpp" #include "GUI_Utils.hpp" + +#include "libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp" #include "ArrangeSettingsDialogImgui.hpp" #include "libslic3r/Slicing.hpp" @@ -586,6 +588,7 @@ private: bool is_arrange_alignment_enabled() const; + ArrangeSettingsDb_AppCfg m_arrange_settings_db; ArrangeSettingsDialogImgui m_arrange_settings_dialog; public: