mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-14 04:15:52 +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 {
|
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)
|
||||||
|
@ -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
|
||||||
|
@ -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"),
|
||||||
|
@ -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)
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user