mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-13 03:49:00 +08:00
fixing sequential print settings not being loaded correctly
SPE-1827
This commit is contained in:
parent
2224ce0ca7
commit
c545400b0a
@ -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<const DynamicPrintConfig *(void)> cfgfn,
|
||||
std::function<PrinterTechnology(void)> 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<ConfigOptionBool>("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)
|
||||
|
@ -9,47 +9,47 @@ namespace Slic3r {
|
||||
|
||||
class ArrangeSettingsDb_AppCfg: public arr2::ArrangeSettingsDb
|
||||
{
|
||||
AppConfig *m_appcfg;
|
||||
std::function<const DynamicPrintConfig*(void)> m_config_getter;
|
||||
std::function<PrinterTechnology(void)> 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<class Self>
|
||||
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<ConfigOptionBool>(
|
||||
"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<class Self> static auto &get_slot(Self *self)
|
||||
{
|
||||
return get_slot(self, self->m_current_slot);
|
||||
}
|
||||
|
||||
template<class Self>
|
||||
static auto& get_ref(Self *self) { return get_slot(self).vals; }
|
||||
|
||||
public:
|
||||
explicit ArrangeSettingsDb_AppCfg(
|
||||
AppConfig *appcfg,
|
||||
std::function<const DynamicPrintConfig *(void)> cfgfn,
|
||||
std::function<PrinterTechnology(void)> 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
|
||||
|
@ -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"),
|
||||
|
@ -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<ArrangeSettingsDb_AppCfg>(
|
||||
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<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)
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user