Added selection of custom bed model to bed shape dialog
This commit is contained in:
parent
1e796b82e1
commit
de383b1809
@ -56,6 +56,11 @@ void PrintConfigDef::init_common_params()
|
|||||||
def->mode = comAdvanced;
|
def->mode = comAdvanced;
|
||||||
def->set_default_value(new ConfigOptionString(""));
|
def->set_default_value(new ConfigOptionString(""));
|
||||||
|
|
||||||
|
def = this->add("bed_custom_model", coString);
|
||||||
|
def->label = L("Bed custom model");
|
||||||
|
def->mode = comAdvanced;
|
||||||
|
def->set_default_value(new ConfigOptionString(""));
|
||||||
|
|
||||||
def = this->add("layer_height", coFloat);
|
def = this->add("layer_height", coFloat);
|
||||||
def->label = L("Layer height");
|
def->label = L("Layer height");
|
||||||
def->category = L("Layers and Perimeters");
|
def->category = L("Layers and Perimeters");
|
||||||
|
@ -17,11 +17,11 @@
|
|||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
void BedShapeDialog::build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture)
|
void BedShapeDialog::build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model)
|
||||||
{
|
{
|
||||||
SetFont(wxGetApp().normal_font());
|
SetFont(wxGetApp().normal_font());
|
||||||
m_panel = new BedShapePanel(this);
|
m_panel = new BedShapePanel(this);
|
||||||
m_panel->build_panel(default_pt, custom_texture);
|
m_panel->build_panel(default_pt, custom_texture, custom_model);
|
||||||
|
|
||||||
auto main_sizer = new wxBoxSizer(wxVERTICAL);
|
auto main_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
main_sizer->Add(m_panel, 1, wxEXPAND);
|
main_sizer->Add(m_panel, 1, wxEXPAND);
|
||||||
@ -55,10 +55,11 @@ void BedShapeDialog::on_dpi_changed(const wxRect &suggested_rect)
|
|||||||
const std::string BedShapePanel::NONE = "None";
|
const std::string BedShapePanel::NONE = "None";
|
||||||
const std::string BedShapePanel::EMPTY_STRING = "";
|
const std::string BedShapePanel::EMPTY_STRING = "";
|
||||||
|
|
||||||
void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture)
|
void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model)
|
||||||
{
|
{
|
||||||
m_shape = default_pt.values;
|
m_shape = default_pt.values;
|
||||||
m_custom_texture = custom_texture.value.empty() ? NONE : custom_texture.value;
|
m_custom_texture = custom_texture.value.empty() ? NONE : custom_texture.value;
|
||||||
|
m_custom_model = custom_model.value.empty() ? NONE : custom_model.value;
|
||||||
|
|
||||||
auto sbsizer = new wxStaticBoxSizer(wxVERTICAL, this, _(L("Shape")));
|
auto sbsizer = new wxStaticBoxSizer(wxVERTICAL, this, _(L("Shape")));
|
||||||
sbsizer->GetStaticBox()->SetFont(wxGetApp().bold_font());
|
sbsizer->GetStaticBox()->SetFont(wxGetApp().bold_font());
|
||||||
@ -113,6 +114,7 @@ void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const Conf
|
|||||||
optgroup->append_line(line);
|
optgroup->append_line(line);
|
||||||
|
|
||||||
wxPanel* texture_panel = init_texture_panel();
|
wxPanel* texture_panel = init_texture_panel();
|
||||||
|
wxPanel* model_panel = init_model_panel();
|
||||||
|
|
||||||
Bind(wxEVT_CHOICEBOOK_PAGE_CHANGED, ([this](wxCommandEvent& e)
|
Bind(wxEVT_CHOICEBOOK_PAGE_CHANGED, ([this](wxCommandEvent& e)
|
||||||
{
|
{
|
||||||
@ -121,16 +123,13 @@ void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const Conf
|
|||||||
|
|
||||||
// right pane with preview canvas
|
// right pane with preview canvas
|
||||||
m_canvas = new Bed_2D(this);
|
m_canvas = new Bed_2D(this);
|
||||||
|
m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent& e) { m_canvas->repaint(m_shape); });
|
||||||
if (m_canvas != nullptr)
|
m_canvas->Bind(wxEVT_SIZE, [this](wxSizeEvent& e) { m_canvas->Refresh(); });
|
||||||
{
|
|
||||||
m_canvas->Bind(wxEVT_PAINT, [this](wxPaintEvent& e) { m_canvas->repaint(m_shape); });
|
|
||||||
m_canvas->Bind(wxEVT_SIZE, [this](wxSizeEvent& e) { m_canvas->Refresh(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
wxSizer* left_sizer = new wxBoxSizer(wxVERTICAL);
|
wxSizer* left_sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
left_sizer->Add(sbsizer, 0, wxEXPAND);
|
left_sizer->Add(sbsizer, 0, wxEXPAND);
|
||||||
left_sizer->Add(texture_panel, 1, wxEXPAND);
|
left_sizer->Add(texture_panel, 1, wxEXPAND);
|
||||||
|
left_sizer->Add(model_panel, 1, wxEXPAND);
|
||||||
|
|
||||||
wxSizer* top_sizer = new wxBoxSizer(wxHORIZONTAL);
|
wxSizer* top_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
top_sizer->Add(left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 10);
|
top_sizer->Add(left_sizer, 0, wxEXPAND | wxLEFT | wxTOP | wxBOTTOM, 10);
|
||||||
@ -225,6 +224,66 @@ wxPanel* BedShapePanel::init_texture_panel()
|
|||||||
return panel;
|
return panel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wxPanel* BedShapePanel::init_model_panel()
|
||||||
|
{
|
||||||
|
wxPanel* panel = new wxPanel(this);
|
||||||
|
ConfigOptionsGroupShp optgroup = std::make_shared<ConfigOptionsGroup>(panel, _(L("Model")));
|
||||||
|
|
||||||
|
optgroup->label_width = 10;
|
||||||
|
optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
|
||||||
|
update_shape();
|
||||||
|
};
|
||||||
|
|
||||||
|
Line line{ "", "" };
|
||||||
|
line.full_width = 1;
|
||||||
|
line.widget = [this](wxWindow* parent) {
|
||||||
|
wxButton* load_btn = new wxButton(parent, wxID_ANY, _(L("Load...")));
|
||||||
|
wxSizer* load_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
load_sizer->Add(load_btn, 1, wxEXPAND);
|
||||||
|
|
||||||
|
wxStaticText* filename_lbl = new wxStaticText(parent, wxID_ANY, _(NONE));
|
||||||
|
wxSizer* filename_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
filename_sizer->Add(filename_lbl, 1, wxEXPAND);
|
||||||
|
|
||||||
|
wxButton* remove_btn = new wxButton(parent, wxID_ANY, _(L("Remove")));
|
||||||
|
wxSizer* remove_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||||
|
remove_sizer->Add(remove_btn, 1, wxEXPAND);
|
||||||
|
|
||||||
|
wxSizer* sizer = new wxBoxSizer(wxVERTICAL);
|
||||||
|
sizer->Add(filename_sizer, 1, wxEXPAND);
|
||||||
|
sizer->Add(load_sizer, 1, wxEXPAND);
|
||||||
|
sizer->Add(remove_sizer, 1, wxEXPAND);
|
||||||
|
|
||||||
|
load_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e)
|
||||||
|
{
|
||||||
|
load_model();
|
||||||
|
}));
|
||||||
|
|
||||||
|
remove_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e)
|
||||||
|
{
|
||||||
|
m_custom_model = NONE;
|
||||||
|
update_shape();
|
||||||
|
}));
|
||||||
|
|
||||||
|
filename_lbl->Bind(wxEVT_UPDATE_UI, ([this](wxUpdateUIEvent& e)
|
||||||
|
{
|
||||||
|
e.SetText(_(boost::filesystem::path(m_custom_model).filename().string()));
|
||||||
|
}));
|
||||||
|
|
||||||
|
remove_btn->Bind(wxEVT_UPDATE_UI, ([this](wxUpdateUIEvent& e)
|
||||||
|
{
|
||||||
|
e.Enable(m_custom_model != NONE);
|
||||||
|
}));
|
||||||
|
|
||||||
|
return sizer;
|
||||||
|
};
|
||||||
|
optgroup->append_line(line);
|
||||||
|
|
||||||
|
panel->SetSizerAndFit(optgroup->sizer);
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
// Called from the constructor.
|
// Called from the constructor.
|
||||||
// Set the initial bed shape from a list of points.
|
// Set the initial bed shape from a list of points.
|
||||||
// Deduce the bed shape type(rect, circle, custom)
|
// Deduce the bed shape type(rect, circle, custom)
|
||||||
@ -390,7 +449,6 @@ void BedShapePanel::load_stl()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
std::string file_name = dialog.GetPath().ToUTF8().data();
|
std::string file_name = dialog.GetPath().ToUTF8().data();
|
||||||
|
|
||||||
if (!boost::iequals(boost::filesystem::path(file_name).extension().string().c_str(), ".stl"))
|
if (!boost::iequals(boost::filesystem::path(file_name).extension().string().c_str(), ".stl"))
|
||||||
{
|
{
|
||||||
show_error(this, _(L("Invalid file format.")));
|
show_error(this, _(L("Invalid file format.")));
|
||||||
@ -454,5 +512,28 @@ void BedShapePanel::load_texture()
|
|||||||
update_shape();
|
update_shape();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BedShapePanel::load_model()
|
||||||
|
{
|
||||||
|
wxFileDialog dialog(this, _(L("Choose an STL file to import bed model from:")), "", "",
|
||||||
|
file_wildcards(FT_STL), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
|
||||||
|
|
||||||
|
if (dialog.ShowModal() != wxID_OK)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_custom_model = NONE;
|
||||||
|
|
||||||
|
std::string file_name = dialog.GetPath().ToUTF8().data();
|
||||||
|
if (!boost::iequals(boost::filesystem::path(file_name).extension().string().c_str(), ".stl"))
|
||||||
|
{
|
||||||
|
show_error(this, _(L("Invalid file format.")));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
wxBusyCursor wait;
|
||||||
|
|
||||||
|
m_custom_model = file_name;
|
||||||
|
update_shape();
|
||||||
|
}
|
||||||
|
|
||||||
} // GUI
|
} // GUI
|
||||||
} // Slic3r
|
} // Slic3r
|
||||||
|
@ -23,24 +23,28 @@ class BedShapePanel : public wxPanel
|
|||||||
std::vector<Vec2d> m_shape;
|
std::vector<Vec2d> m_shape;
|
||||||
std::vector<Vec2d> m_loaded_shape;
|
std::vector<Vec2d> m_loaded_shape;
|
||||||
std::string m_custom_texture;
|
std::string m_custom_texture;
|
||||||
|
std::string m_custom_model;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BedShapePanel(wxWindow* parent) : wxPanel(parent, wxID_ANY), m_custom_texture(NONE) {}
|
BedShapePanel(wxWindow* parent) : wxPanel(parent, wxID_ANY), m_custom_texture(NONE), m_custom_model(NONE) {}
|
||||||
~BedShapePanel() {}
|
|
||||||
|
void build_panel(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model);
|
||||||
|
|
||||||
void build_panel(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture);
|
|
||||||
// Returns the resulting bed shape polygon. This value will be stored to the ini file.
|
// Returns the resulting bed shape polygon. This value will be stored to the ini file.
|
||||||
const std::vector<Vec2d>& get_shape() const { return m_shape; }
|
const std::vector<Vec2d>& get_shape() const { return m_shape; }
|
||||||
const std::string& get_custom_texture() const { return (m_custom_texture != NONE) ? m_custom_texture : EMPTY_STRING; }
|
const std::string& get_custom_texture() const { return (m_custom_texture != NONE) ? m_custom_texture : EMPTY_STRING; }
|
||||||
|
const std::string& get_custom_model() const { return (m_custom_model != NONE) ? m_custom_model : EMPTY_STRING; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ConfigOptionsGroupShp init_shape_options_page(const wxString& title);
|
ConfigOptionsGroupShp init_shape_options_page(const wxString& title);
|
||||||
wxPanel* init_texture_panel();
|
wxPanel* init_texture_panel();
|
||||||
|
wxPanel* init_model_panel();
|
||||||
void set_shape(const ConfigOptionPoints& points);
|
void set_shape(const ConfigOptionPoints& points);
|
||||||
void update_preview();
|
void update_preview();
|
||||||
void update_shape();
|
void update_shape();
|
||||||
void load_stl();
|
void load_stl();
|
||||||
void load_texture();
|
void load_texture();
|
||||||
|
void load_model();
|
||||||
|
|
||||||
wxChoicebook* m_shape_options_book;
|
wxChoicebook* m_shape_options_book;
|
||||||
std::vector <ConfigOptionsGroupShp> m_optgroups;
|
std::vector <ConfigOptionsGroupShp> m_optgroups;
|
||||||
@ -54,11 +58,12 @@ class BedShapeDialog : public DPIDialog
|
|||||||
public:
|
public:
|
||||||
BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")),
|
BedShapeDialog(wxWindow* parent) : DPIDialog(parent, wxID_ANY, _(L("Bed Shape")),
|
||||||
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {}
|
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) {}
|
||||||
~BedShapeDialog() {}
|
|
||||||
|
|
||||||
void build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture);
|
void build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model);
|
||||||
|
|
||||||
const std::vector<Vec2d>& get_shape() const { return m_panel->get_shape(); }
|
const std::vector<Vec2d>& get_shape() const { return m_panel->get_shape(); }
|
||||||
const std::string& get_custom_texture() const { return m_panel->get_custom_texture(); }
|
const std::string& get_custom_texture() const { return m_panel->get_custom_texture(); }
|
||||||
|
const std::string& get_custom_model() const { return m_panel->get_custom_model(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void on_dpi_changed(const wxRect &suggested_rect) override;
|
void on_dpi_changed(const wxRect &suggested_rect) override;
|
||||||
|
@ -533,7 +533,8 @@ PageBedShape::PageBedShape(ConfigWizard *parent)
|
|||||||
append_text(_(L("Set the shape of your printer's bed.")));
|
append_text(_(L("Set the shape of your printer's bed.")));
|
||||||
|
|
||||||
shape_panel->build_panel(*wizard_p()->custom_config->option<ConfigOptionPoints>("bed_shape"),
|
shape_panel->build_panel(*wizard_p()->custom_config->option<ConfigOptionPoints>("bed_shape"),
|
||||||
*wizard_p()->custom_config->option<ConfigOptionString>("bed_custom_texture"));
|
*wizard_p()->custom_config->option<ConfigOptionString>("bed_custom_texture"),
|
||||||
|
*wizard_p()->custom_config->option<ConfigOptionString>("bed_custom_model"));
|
||||||
|
|
||||||
append(shape_panel);
|
append(shape_panel);
|
||||||
}
|
}
|
||||||
@ -542,8 +543,10 @@ void PageBedShape::apply_custom_config(DynamicPrintConfig &config)
|
|||||||
{
|
{
|
||||||
const std::vector<Vec2d>& points = shape_panel->get_shape();
|
const std::vector<Vec2d>& points = shape_panel->get_shape();
|
||||||
const std::string& custom_texture = shape_panel->get_custom_texture();
|
const std::string& custom_texture = shape_panel->get_custom_texture();
|
||||||
|
const std::string& custom_model = shape_panel->get_custom_model();
|
||||||
config.set_key_value("bed_shape", new ConfigOptionPoints(points));
|
config.set_key_value("bed_shape", new ConfigOptionPoints(points));
|
||||||
config.set_key_value("bed_custom_texture", new ConfigOptionString(custom_texture));
|
config.set_key_value("bed_custom_texture", new ConfigOptionString(custom_texture));
|
||||||
|
config.set_key_value("bed_custom_model", new ConfigOptionString(custom_model));
|
||||||
}
|
}
|
||||||
|
|
||||||
PageDiameters::PageDiameters(ConfigWizard *parent)
|
PageDiameters::PageDiameters(ConfigWizard *parent)
|
||||||
@ -1089,7 +1092,7 @@ ConfigWizard::ConfigWizard(wxWindow *parent, RunReason reason)
|
|||||||
|
|
||||||
p->load_vendors();
|
p->load_vendors();
|
||||||
p->custom_config.reset(DynamicPrintConfig::new_from_defaults_keys({
|
p->custom_config.reset(DynamicPrintConfig::new_from_defaults_keys({
|
||||||
"gcode_flavor", "bed_shape", "bed_custom_texture", "nozzle_diameter", "filament_diameter", "temperature", "bed_temperature",
|
"gcode_flavor", "bed_shape", "bed_custom_texture", "bed_custom_model", "nozzle_diameter", "filament_diameter", "temperature", "bed_temperature",
|
||||||
}));
|
}));
|
||||||
|
|
||||||
p->index = new ConfigWizardIndex(this);
|
p->index = new ConfigWizardIndex(this);
|
||||||
|
@ -411,7 +411,7 @@ const std::vector<std::string>& Preset::printer_options()
|
|||||||
if (s_opts.empty()) {
|
if (s_opts.empty()) {
|
||||||
s_opts = {
|
s_opts = {
|
||||||
"printer_technology",
|
"printer_technology",
|
||||||
"bed_shape", "bed_custom_texture", "z_offset", "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed",
|
"bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed",
|
||||||
"use_firmware_retraction", "use_volumetric_e", "variable_layer_height",
|
"use_firmware_retraction", "use_volumetric_e", "variable_layer_height",
|
||||||
"host_type", "print_host", "printhost_apikey", "printhost_cafile",
|
"host_type", "print_host", "printhost_apikey", "printhost_cafile",
|
||||||
"single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode",
|
"single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode",
|
||||||
|
@ -1857,14 +1857,17 @@ void TabPrinter::build_fff()
|
|||||||
{
|
{
|
||||||
BedShapeDialog dlg(this);
|
BedShapeDialog dlg(this);
|
||||||
dlg.build_dialog(*m_config->option<ConfigOptionPoints>("bed_shape"),
|
dlg.build_dialog(*m_config->option<ConfigOptionPoints>("bed_shape"),
|
||||||
*m_config->option<ConfigOptionString>("bed_custom_texture"));
|
*m_config->option<ConfigOptionString>("bed_custom_texture"),
|
||||||
|
*m_config->option<ConfigOptionString>("bed_custom_model"));
|
||||||
if (dlg.ShowModal() == wxID_OK) {
|
if (dlg.ShowModal() == wxID_OK) {
|
||||||
const std::vector<Vec2d>& shape = dlg.get_shape();
|
const std::vector<Vec2d>& shape = dlg.get_shape();
|
||||||
const std::string& custom_texture = dlg.get_custom_texture();
|
const std::string& custom_texture = dlg.get_custom_texture();
|
||||||
|
const std::string& custom_model = dlg.get_custom_model();
|
||||||
if (!shape.empty())
|
if (!shape.empty())
|
||||||
{
|
{
|
||||||
load_key_value("bed_shape", shape);
|
load_key_value("bed_shape", shape);
|
||||||
load_key_value("bed_custom_texture", custom_texture);
|
load_key_value("bed_custom_texture", custom_texture);
|
||||||
|
load_key_value("bed_custom_model", custom_model);
|
||||||
update_changed_ui();
|
update_changed_ui();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2066,14 +2069,17 @@ void TabPrinter::build_sla()
|
|||||||
{
|
{
|
||||||
BedShapeDialog dlg(this);
|
BedShapeDialog dlg(this);
|
||||||
dlg.build_dialog(*m_config->option<ConfigOptionPoints>("bed_shape"),
|
dlg.build_dialog(*m_config->option<ConfigOptionPoints>("bed_shape"),
|
||||||
*m_config->option<ConfigOptionString>("bed_custom_texture"));
|
*m_config->option<ConfigOptionString>("bed_custom_texture"),
|
||||||
|
*m_config->option<ConfigOptionString>("bed_custom_model"));
|
||||||
if (dlg.ShowModal() == wxID_OK) {
|
if (dlg.ShowModal() == wxID_OK) {
|
||||||
const std::vector<Vec2d>& shape = dlg.get_shape();
|
const std::vector<Vec2d>& shape = dlg.get_shape();
|
||||||
const std::string& custom_texture = dlg.get_custom_texture();
|
const std::string& custom_texture = dlg.get_custom_texture();
|
||||||
|
const std::string& custom_model = dlg.get_custom_model();
|
||||||
if (!shape.empty())
|
if (!shape.empty())
|
||||||
{
|
{
|
||||||
load_key_value("bed_shape", shape);
|
load_key_value("bed_shape", shape);
|
||||||
load_key_value("bed_custom_texture", custom_texture);
|
load_key_value("bed_custom_texture", custom_texture);
|
||||||
|
load_key_value("bed_custom_model", custom_model);
|
||||||
update_changed_ui();
|
update_changed_ui();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user