fixing sequential print settings not being loaded correctly

SPE-1827
This commit is contained in:
tamasmeszaros 2023-07-29 17:32:54 +02:00
parent 2224ce0ca7
commit c545400b0a
5 changed files with 86 additions and 83 deletions

View File

@ -2,31 +2,7 @@
namespace Slic3r { namespace Slic3r {
PrinterTechnology ArrangeSettingsDb_AppCfg::current_printer_technology() const ArrangeSettingsDb_AppCfg::ArrangeSettingsDb_AppCfg(AppConfig *appcfg) : m_appcfg{appcfg}
{
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<const DynamicPrintConfig *(void)> cfgfn,
std::function<PrinterTechnology(void)> printtech_fn)
: m_appcfg{appcfg}, m_config_getter{cfgfn}, m_printtech_getter{printtech_fn}
{ {
m_settings_fff.postfix = "_fff"; m_settings_fff.postfix = "_fff";
m_settings_fff_seq.postfix = "_fff_seq_print"; 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_sla.vals.arr_strategy = arr_strategy;
m_settings_fff.vals.arr_strategy = arr_strategy; m_settings_fff.vals.arr_strategy = arr_strategy;
m_settings_fff_seq.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, void ArrangeSettingsDb_AppCfg::distance_from_obj_range(float &min,
float &max) const float &max) const
{ {
min = 0.f; min = get_slot(this).dobj_range.minval;
if (config() && current_printer_technology() == ptFFF) { max = get_slot(this).dobj_range.maxval;
auto co_opt = config()->option<ConfigOptionBool>("complete_objects");
if (co_opt && co_opt->value) {
min = float(min_object_distance(*config()));
}
}
max = 100.f;
} }
void ArrangeSettingsDb_AppCfg::distance_from_bed_range(float &min, void ArrangeSettingsDb_AppCfg::distance_from_bed_range(float &min,
float &max) const float &max) const
{ {
min = 0.f; min = get_slot(this).dbed_range.minval;
max = 100.f; max = get_slot(this).dbed_range.maxval;
} }
arr2::ArrangeSettingsDb& ArrangeSettingsDb_AppCfg::set_distance_from_objects(float v) arr2::ArrangeSettingsDb& ArrangeSettingsDb_AppCfg::set_distance_from_objects(float v)

View File

@ -9,47 +9,47 @@ namespace Slic3r {
class ArrangeSettingsDb_AppCfg: public arr2::ArrangeSettingsDb class ArrangeSettingsDb_AppCfg: public arr2::ArrangeSettingsDb
{ {
AppConfig *m_appcfg; public:
std::function<const DynamicPrintConfig*(void)> m_config_getter; enum Slots { slotFFF, slotFFFSeqPrint, slotSLA };
std::function<PrinterTechnology(void)> m_printtech_getter;
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, // Settings and their defaults are stored separately for fff,
// sla and fff sequential mode // sla and fff sequential mode
Slot m_settings_fff, m_settings_fff_seq, m_settings_sla; Slot m_settings_fff, m_settings_fff_seq, m_settings_sla;
PrinterTechnology current_printer_technology() const;
const DynamicPrintConfig *config() const;
template<class Self> template<class Self>
static auto & get_slot(Self *self) { static auto & get_slot(Self *self, Slots slot) {
PrinterTechnology ptech = self->current_printer_technology(); switch(slot) {
case slotFFF: return self->m_settings_fff;
auto *ptr = &self->m_settings_fff; case slotFFFSeqPrint: return self->m_settings_fff_seq;
case slotSLA: return self->m_settings_sla;
if (ptech == ptSLA) {
ptr = &self->m_settings_sla;
} else if (ptech == ptFFF && self->config()) {
auto co_opt = self->config()->template option<ConfigOptionBool>(
"complete_objects");
if (co_opt && co_opt->value)
ptr = &self->m_settings_fff_seq;
else
ptr = &self->m_settings_fff;
} }
return *ptr; return self->m_settings_fff;
}
template<class Self> static auto &get_slot(Self *self)
{
return get_slot(self, self->m_current_slot);
} }
template<class Self> template<class Self>
static auto& get_ref(Self *self) { return get_slot(self).vals; } static auto& get_ref(Self *self) { return get_slot(self).vals; }
public: public:
explicit ArrangeSettingsDb_AppCfg( explicit ArrangeSettingsDb_AppCfg(AppConfig *appcfg);
AppConfig *appcfg,
std::function<const DynamicPrintConfig *(void)> cfgfn,
std::function<PrinterTechnology(void)> printtech_getter);
float get_distance_from_objects() const override { return get_ref(this).d_obj; } 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; } 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; ArrangeSettingsDb& set_arrange_strategy(ArrangeStrategy v) override;
Values get_defaults() const override { return get_slot(this).defaults; } 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 } // namespace Slic3r

View File

@ -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_obj_range(dobj_min, dobj_max);
m_db->distance_from_bed_range(dbed_min, dbed_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, if (m_imgui->slider_float(_L("Spacing"), &settings.d_obj, dobj_min,
dobj_max, "%5.2f") || dobj_max, "%5.2f")) {
dobj_min > settings.d_obj) {
settings.d_obj = std::max(dobj_min, settings.d_obj); settings.d_obj = std::max(dobj_min, settings.d_obj);
m_db->set_distance_from_objects(settings.d_obj); m_db->set_distance_from_objects(settings.d_obj);
} }
if (m_imgui->slider_float(_L("Spacing from bed"), &settings.d_bed, if (m_imgui->slider_float(_L("Spacing from bed"), &settings.d_bed,
dbed_min, dbed_max, "%5.2f") || dbed_min, dbed_max, "%5.2f")) {
dbed_min > settings.d_bed) {
settings.d_bed = std::max(dbed_min, settings.d_bed); settings.d_bed = std::max(dbed_min, settings.d_bed);
m_db->set_distance_from_bed(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); m_db->set_rotation_enabled(settings.rotations);
} }
// Points bed = m_config ? get_bed_shape(*m_config) : Points{}; if (m_show_xl_combo_predicate() &&
if (/*arrangement::is_box(bed) */ m_show_xl_combo_predicate() &&
settings.xl_align >= 0 && settings.xl_align >= 0 &&
m_imgui->combo(_L("Alignment"), m_imgui->combo(_L("Alignment"),
{_u8L("Center"), _u8L("Rear left"), _u8L("Front left"), {_u8L("Center"), _u8L("Rear left"), _u8L("Front left"),

View File

@ -35,7 +35,6 @@
#include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp" #include "slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp"
#include "slic3r/Utils/UndoRedo.hpp" #include "slic3r/Utils/UndoRedo.hpp"
#include "libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp"
#if ENABLE_RETINA_GL #if ENABLE_RETINA_GL
#include "slic3r/Utils/RetinaHelper.hpp" #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 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 bool GLCanvas3D::is_arrange_alignment_enabled() const
@ -1339,13 +1338,8 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas *canvas, Bed3D &bed)
m_labels(*this), m_labels(*this),
m_slope(m_volumes), m_slope(m_volumes),
m_sla_view(*this), m_sla_view(*this),
m_arrange_settings_dialog{wxGetApp().imgui(), m_arrange_settings_db{wxGetApp().app_config},
std::make_unique<ArrangeSettingsDb_AppCfg>( m_arrange_settings_dialog{wxGetApp().imgui(), &m_arrange_settings_db}
wxGetApp().app_config,
[this]() { return m_config; },
[this] {
return current_printer_technology();
})}
{ {
if (m_canvas != nullptr) { if (m_canvas != nullptr) {
m_timer.SetOwner(m_canvas); m_timer.SetOwner(m_canvas);
@ -1628,6 +1622,29 @@ void GLCanvas3D::set_config(const DynamicPrintConfig* config)
{ {
m_config = config; m_config = config;
m_layers_editing.set_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<ConfigOptionBool>("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) void GLCanvas3D::set_process(BackgroundSlicingProcess *process)

View File

@ -18,6 +18,8 @@
#include "Camera.hpp" #include "Camera.hpp"
#include "SceneRaycaster.hpp" #include "SceneRaycaster.hpp"
#include "GUI_Utils.hpp" #include "GUI_Utils.hpp"
#include "libslic3r/Arrange/ArrangeSettingsDb_AppCfg.hpp"
#include "ArrangeSettingsDialogImgui.hpp" #include "ArrangeSettingsDialogImgui.hpp"
#include "libslic3r/Slicing.hpp" #include "libslic3r/Slicing.hpp"
@ -586,6 +588,7 @@ private:
bool is_arrange_alignment_enabled() const; bool is_arrange_alignment_enabled() const;
ArrangeSettingsDb_AppCfg m_arrange_settings_db;
ArrangeSettingsDialogImgui m_arrange_settings_dialog; ArrangeSettingsDialogImgui m_arrange_settings_dialog;
public: public: