ENH: calib support multi_extruder(UI part)
jira: none Change-Id: I3009c2f8b601dc078cfed787dc3531fc1d4848d6
This commit is contained in:
parent
3119a84eb2
commit
11f61abefa
|
@ -56,6 +56,7 @@ public:
|
|||
int ams_id = 0;
|
||||
int slot_id = 0;
|
||||
int bed_temp;
|
||||
ExtruderType extruder_type{ExtruderType::etDirectDrive};
|
||||
NozzleVolumeType nozzle_volume_type = NozzleVolumeType::nvtNormal;
|
||||
int nozzle_temp;
|
||||
float nozzle_diameter;
|
||||
|
|
|
@ -44,4 +44,36 @@ void get_other_layers_print_sequence(const std::vector<LayerPrintSequence> &cust
|
|||
}
|
||||
}
|
||||
|
||||
int get_index_for_extruder_parameter(const DynamicPrintConfig &config, const std::string &opt_key, int cur_extruder_id, ExtruderType extruder_type, NozzleVolumeType nozzle_volume_type)
|
||||
{
|
||||
std::string id_name, variant_name;
|
||||
unsigned int stride = 1;
|
||||
if (printer_options_with_variant_1.count(opt_key) > 0) { // printer parameter
|
||||
id_name = "printer_extruder_id";
|
||||
variant_name = "printer_extruder_variant";
|
||||
} else if (printer_options_with_variant_2.count(opt_key) > 0) {
|
||||
id_name = "printer_extruder_id";
|
||||
variant_name = "printer_extruder_variant";
|
||||
stride = 2;
|
||||
} else if (filament_options_with_variant.count(opt_key) > 0) {
|
||||
// filament don't use id anymore
|
||||
// id_name = "filament_extruder_id";
|
||||
variant_name = "filament_extruder_variant";
|
||||
} else if (print_options_with_variant.count(opt_key) > 0) {
|
||||
id_name = "print_extruder_id";
|
||||
variant_name = "print_extruder_variant";
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// variant index
|
||||
int variant_index = config.get_index_for_extruder(cur_extruder_id + 1, id_name, extruder_type, nozzle_volume_type, variant_name, stride);
|
||||
if (variant_index < 0) {
|
||||
assert(false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return variant_index;
|
||||
}
|
||||
|
||||
}; // namespace Slic3r
|
||||
|
|
|
@ -3,12 +3,14 @@
|
|||
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include "PrintConfig.hpp"
|
||||
|
||||
namespace Slic3r {
|
||||
using LayerPrintSequence = std::pair<std::pair<int, int>, std::vector<int>>;
|
||||
std::vector<LayerPrintSequence> get_other_layers_print_sequence(int sequence_nums, const std::vector<int> &sequence);
|
||||
void get_other_layers_print_sequence(const std::vector<LayerPrintSequence> &customize_sequences, int &sequence_nums, std::vector<int> &sequence);
|
||||
|
||||
extern int get_index_for_extruder_parameter(const DynamicPrintConfig &config, const std::string &opt_key, int cur_extruder_id, ExtruderType extruder_type, NozzleVolumeType nozzle_volume_type);
|
||||
} // namespace Slic3r
|
||||
|
||||
#endif // slic3r_Parameter_Utils_hpp_
|
||||
|
|
|
@ -19,6 +19,12 @@ static const wxString NA_STR = _L("N/A");
|
|||
static const float MIN_PA_K_VALUE_STEP = 0.001;
|
||||
static const int MAX_PA_HISTORY_RESULTS_NUMS = 16;
|
||||
|
||||
void get_ams_id_and_slot_id(int tray_id, int& ams_id, int& slot_id)
|
||||
{
|
||||
ams_id = tray_id / 4;
|
||||
slot_id = tray_id % 4;
|
||||
}
|
||||
|
||||
std::map<int, Preset*> get_cached_selected_filament(MachineObject* obj) {
|
||||
std::map<int, Preset*> selected_filament_map;
|
||||
if (!obj) return selected_filament_map;
|
||||
|
@ -592,6 +598,10 @@ void PressureAdvanceWizard::on_cali_start()
|
|||
}
|
||||
|
||||
X1CCalibInfos::X1CCalibInfo calib_info;
|
||||
get_ams_id_and_slot_id(item.first, calib_info.ams_id, calib_info.slot_id);
|
||||
calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id);
|
||||
calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id);
|
||||
calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id);
|
||||
calib_info.tray_id = item.first;
|
||||
calib_info.nozzle_diameter = nozzle_dia;
|
||||
calib_info.filament_id = item.second->filament_id;
|
||||
|
@ -626,6 +636,10 @@ void PressureAdvanceWizard::on_cali_start()
|
|||
|
||||
CalibInfo calib_info;
|
||||
calib_info.dev_id = curr_obj->dev_id;
|
||||
get_ams_id_and_slot_id(selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id);
|
||||
calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id);
|
||||
calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id);
|
||||
calib_info.extruder_id = preset_page->get_nozzle_volume_type(calib_info.extruder_id);
|
||||
calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]";
|
||||
Preset *preset = selected_filaments.begin()->second;
|
||||
Preset * temp_filament_preset = new Preset(preset->type, preset->name + "_temp");
|
||||
|
@ -992,6 +1006,10 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow
|
|||
|
||||
X1CCalibInfos::X1CCalibInfo calib_info;
|
||||
calib_info.tray_id = item.first;
|
||||
get_ams_id_and_slot_id(item.first, calib_info.ams_id, calib_info.slot_id);
|
||||
calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id);
|
||||
calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id);
|
||||
calib_info.extruder_id = preset_page->get_nozzle_volume_type(calib_info.extruder_id);
|
||||
calib_info.nozzle_diameter = nozzle_dia;
|
||||
calib_info.filament_id = item.second->filament_id;
|
||||
calib_info.setting_id = item.second->setting_id;
|
||||
|
@ -1043,6 +1061,10 @@ void FlowRateWizard::on_cali_start(CaliPresetStage stage, float cali_value, Flow
|
|||
|
||||
if (!selected_filaments.empty()) {
|
||||
calib_info.select_ams = "[" + std::to_string(selected_filaments.begin()->first) + "]";
|
||||
get_ams_id_and_slot_id(selected_filaments.begin()->first, calib_info.ams_id, calib_info.slot_id);
|
||||
calib_info.extruder_id = preset_page->get_extruder_id(calib_info.ams_id);
|
||||
calib_info.extruder_type = preset_page->get_extruder_type(calib_info.extruder_id);
|
||||
calib_info.nozzle_volume_type = preset_page->get_nozzle_volume_type(calib_info.extruder_id);
|
||||
Preset* preset = selected_filaments.begin()->second;
|
||||
temp_filament_preset = new Preset(preset->type, preset->name + "_temp");
|
||||
temp_filament_preset->config = preset->config;
|
||||
|
|
|
@ -275,6 +275,18 @@ FilamentComboBox::FilamentComboBox(wxWindow* parent, const wxPoint& pos, const w
|
|||
main_sizer->Fit(this);
|
||||
}
|
||||
|
||||
void FilamentComboBox::ShowPanel()
|
||||
{
|
||||
this->Show();
|
||||
m_radioBox->Show();
|
||||
}
|
||||
|
||||
void FilamentComboBox::HidePanel()
|
||||
{
|
||||
this->Hide();
|
||||
m_radioBox->Hide();
|
||||
}
|
||||
|
||||
void FilamentComboBox::set_select_mode(CalibrationFilamentMode mode)
|
||||
{
|
||||
m_mode = mode;
|
||||
|
|
|
@ -98,6 +98,9 @@ public:
|
|||
virtual void SetValue(bool value, bool send_event = true);
|
||||
void msw_rescale();
|
||||
|
||||
void ShowPanel();
|
||||
void HidePanel();
|
||||
|
||||
protected:
|
||||
int m_tray_id { -1 };
|
||||
std::string m_tray_name;
|
||||
|
@ -160,7 +163,7 @@ protected:
|
|||
std::vector<Label*> m_text_steps;
|
||||
};
|
||||
|
||||
class CaliPagePicture : public wxPanel
|
||||
class CaliPagePicture : public wxPanel
|
||||
{
|
||||
public:
|
||||
CaliPagePicture(wxWindow* parent,
|
||||
|
@ -232,7 +235,7 @@ private:
|
|||
CaliPageActionType m_action_type;
|
||||
};
|
||||
|
||||
class CaliPageSendingPanel : public wxPanel
|
||||
class CaliPageSendingPanel : public wxPanel
|
||||
{
|
||||
public:
|
||||
CaliPageSendingPanel(wxWindow* parent,
|
||||
|
@ -277,7 +280,7 @@ protected:
|
|||
std::vector<CaliPageButton*> m_action_btns;
|
||||
};
|
||||
|
||||
class CalibrationWizardPage : public wxPanel
|
||||
class CalibrationWizardPage : public wxPanel
|
||||
{
|
||||
public:
|
||||
CalibrationWizardPage(wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxTAB_TRAVERSAL);
|
||||
|
|
|
@ -489,6 +489,8 @@ CalibrationPresetPage::CalibrationPresetPage(
|
|||
m_page_type = CaliPageType::CALI_PAGE_PRESET;
|
||||
m_cali_filament_mode = CalibrationFilamentMode::CALI_MODEL_SINGLE;
|
||||
m_top_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
m_extrder_types.resize(2, ExtruderType::etDirectDrive);
|
||||
m_extruder_nozzle_types.resize(2, NozzleVolumeType::nvtBigTraffic);
|
||||
|
||||
create_page(this);
|
||||
|
||||
|
@ -512,6 +514,16 @@ void CalibrationPresetPage::on_sys_color_changed()
|
|||
m_ams_sync_button->msw_rescale();
|
||||
}
|
||||
|
||||
int CalibrationPresetPage::get_extruder_id(int ams_id)
|
||||
{
|
||||
if (m_ams_id_to_extruder_id_map.find(ams_id) != m_ams_id_to_extruder_id_map.end()) {
|
||||
return m_ams_id_to_extruder_id_map[ams_id];
|
||||
}
|
||||
else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::create_selection_panel(wxWindow* parent)
|
||||
{
|
||||
auto panel_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
@ -533,6 +545,48 @@ void CalibrationPresetPage::create_selection_panel(wxWindow* parent)
|
|||
|
||||
panel_sizer->AddSpacer(PRESET_GAP);
|
||||
|
||||
// nozzle_volume_type (multi_extruder)
|
||||
{
|
||||
m_nozzle_volume_type_panel = new wxPanel(parent);
|
||||
|
||||
auto nozzle_volume_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
auto nozzle_volume_type_text = new Label(m_nozzle_volume_type_panel, _L("Nozzle Volume Type"));
|
||||
nozzle_volume_type_text->SetFont(Label::Head_14);
|
||||
nozzle_volume_type_text->Wrap(-1);
|
||||
nozzle_volume_sizer->Add(nozzle_volume_type_text, 0, wxALL, 0);
|
||||
nozzle_volume_sizer->AddSpacer(FromDIP(10));
|
||||
|
||||
wxBoxSizer * type_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
m_left_nozzle_volume_type_sizer = new wxStaticBoxSizer(wxVERTICAL, m_nozzle_volume_type_panel, "Left");
|
||||
m_right_nozzle_volume_type_sizer = new wxStaticBoxSizer(wxVERTICAL, m_nozzle_volume_type_panel, "Right");
|
||||
|
||||
m_comboBox_nozzle_volume_types.clear();
|
||||
|
||||
ComboBox *nozzle_volume_type_cbx = new ComboBox(m_nozzle_volume_type_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr, wxCB_READONLY);
|
||||
m_comboBox_nozzle_volume_types.emplace_back(nozzle_volume_type_cbx);
|
||||
m_left_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types.back(), 0, wxEXPAND | wxALL, 5);
|
||||
|
||||
nozzle_volume_type_cbx = new ComboBox(m_nozzle_volume_type_panel, wxID_ANY, "", wxDefaultPosition, CALIBRATION_FILAMENT_COMBOX_SIZE, 0, nullptr,wxCB_READONLY);
|
||||
m_comboBox_nozzle_volume_types.emplace_back(nozzle_volume_type_cbx);
|
||||
m_right_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types.back(), 0, wxEXPAND | wxALL, 5);
|
||||
|
||||
type_sizer->Add(m_left_nozzle_volume_type_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
type_sizer->Add(m_right_nozzle_volume_type_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
|
||||
nozzle_volume_sizer->Add(type_sizer);
|
||||
nozzle_volume_sizer->AddSpacer(PRESET_GAP);
|
||||
|
||||
for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) {
|
||||
m_comboBox_nozzle_volume_types[i]->Bind(wxEVT_COMBOBOX, std::bind(&CalibrationPresetPage::on_select_nozzle_volume_type, this, std::placeholders::_1, i));
|
||||
m_comboBox_nozzle_volume_types[i]->Hide();
|
||||
}
|
||||
|
||||
m_nozzle_volume_type_panel->SetSizer(nozzle_volume_sizer);
|
||||
panel_sizer->Add(m_nozzle_volume_type_panel);
|
||||
|
||||
m_nozzle_volume_type_panel->Hide();
|
||||
}
|
||||
|
||||
auto plate_type_combo_text = new Label(parent, _L("Plate Type"));
|
||||
plate_type_combo_text->SetFont(Label::Head_14);
|
||||
plate_type_combo_text->Wrap(-1);
|
||||
|
@ -607,6 +661,22 @@ void CalibrationPresetPage::init_selection_values()
|
|||
}
|
||||
m_comboBox_bed_type->SetSelection(curr_selection);
|
||||
}
|
||||
|
||||
// init nozzle_volume_type for multi_extruder
|
||||
{
|
||||
const ConfigOptionDef *nozzle_volume_type_def = print_config_def.get("nozzle_volume_type");
|
||||
if (nozzle_volume_type_def && nozzle_volume_type_def->enum_keys_map) {
|
||||
for (auto item : nozzle_volume_type_def->enum_labels) {
|
||||
for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) {
|
||||
m_comboBox_nozzle_volume_types[i]->AppendString(_L(item));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) {
|
||||
m_comboBox_nozzle_volume_types[i]->SetSelection(int(NozzleVolumeType::nvtBigTraffic));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent)
|
||||
|
@ -680,6 +750,164 @@ void CalibrationPresetPage::create_filament_list_panel(wxWindow* parent)
|
|||
panel_sizer->Fit(parent);
|
||||
}
|
||||
|
||||
NozzleVolumeType CalibrationPresetPage::get_nozzle_volume_type(int extruder_id) const
|
||||
{
|
||||
return NozzleVolumeType(m_comboBox_nozzle_volume_types[extruder_id]->GetSelection());
|
||||
}
|
||||
|
||||
ExtruderType CalibrationPresetPage::get_extruder_type(int extruder_id) const
|
||||
{
|
||||
return ExtruderType(m_extrder_types[extruder_id]);
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow *parent)
|
||||
{
|
||||
m_multi_extruder_ams_panel_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
|
||||
m_filament_list_tips = new Label(
|
||||
parent,
|
||||
_L("Tips for calibration material: \n- Materials that can share same hot bed temperature\n- Different filament brand and family(Brand = Bambu, Family = Basic, Matte)"));
|
||||
m_filament_list_tips->Hide();
|
||||
m_filament_list_tips->SetFont(Label::Body_13);
|
||||
m_filament_list_tips->SetForegroundColour(wxColour(145, 145, 145));
|
||||
m_filament_list_tips->Wrap(CALIBRATION_TEXT_MAX_LENGTH);
|
||||
m_multi_extruder_ams_panel_sizer->Add(m_filament_list_tips, 0, wxBOTTOM, FromDIP(10));
|
||||
|
||||
{
|
||||
// 1. Preview item
|
||||
m_main_sizer = new wxStaticBoxSizer(wxVERTICAL, parent, "Main");
|
||||
m_main_ams_preview_panel = new wxPanel(parent);
|
||||
auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
for (int i = 0; i < 5; i++) { // most connect 4 ams(multi + single)
|
||||
AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector<Caninfo>{}};
|
||||
if (i == 4)
|
||||
temp_info.ams_type = AMSModel::EXT_AMS;
|
||||
auto preview_ams_item = new AMSPreview(m_main_ams_preview_panel, wxID_ANY, temp_info);
|
||||
m_main_ams_preview_list.push_back(preview_ams_item);
|
||||
size_t index = m_main_ams_preview_list.size() - 1;
|
||||
preview_ams_item->Bind(wxEVT_LEFT_DOWN, [this, index](wxMouseEvent &e) {
|
||||
update_multi_extruder_filament_combobox(m_main_ams_preview_list[index]->m_amsinfo.ams_id, 0);
|
||||
e.Skip();
|
||||
});
|
||||
ams_items_sizer->Add(preview_ams_item, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6));
|
||||
}
|
||||
m_main_ams_preview_panel->SetSizer(ams_items_sizer);
|
||||
m_main_sizer->Add(m_main_ams_preview_panel);
|
||||
|
||||
// 2. AMS item
|
||||
m_main_ams_items_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
for (int i = 0; i < 4; i++) { // 4 slots
|
||||
auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
wxRadioButton *radio_btn = new wxRadioButton(m_multi_exutrder_filament_list_panel, wxID_ANY, "");
|
||||
CheckBox * check_box = new CheckBox(m_multi_exutrder_filament_list_panel);
|
||||
check_box->SetBackgroundColour(*wxWHITE);
|
||||
FilamentComboBox *fcb = new FilamentComboBox(m_multi_exutrder_filament_list_panel);
|
||||
fcb->SetRadioBox(radio_btn);
|
||||
fcb->SetCheckBox(check_box);
|
||||
fcb->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE);
|
||||
filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER);
|
||||
filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
|
||||
filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER);
|
||||
m_main_ams_items_sizer->Add(filament_comboBox_sizer, 0);
|
||||
|
||||
fcb->Bind(EVT_CALI_TRAY_CHANGED, &CalibrationPresetPage::on_select_tray, this);
|
||||
m_main_filament_comboBox_list.emplace_back(fcb);
|
||||
|
||||
radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent &evt) {
|
||||
wxCommandEvent event(EVT_CALI_TRAY_CHANGED);
|
||||
event.SetEventObject(this);
|
||||
wxPostEvent(this, event);
|
||||
});
|
||||
check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &evt) {
|
||||
wxCommandEvent event(EVT_CALI_TRAY_CHANGED);
|
||||
event.SetEventObject(this);
|
||||
wxPostEvent(this, event);
|
||||
evt.Skip();
|
||||
});
|
||||
|
||||
if (i == 0)
|
||||
radio_btn->SetValue(true);
|
||||
}
|
||||
|
||||
m_main_sizer->Add(m_main_ams_items_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
}
|
||||
|
||||
{
|
||||
// 1. Preview item
|
||||
m_deputy_sizer = new wxStaticBoxSizer(wxVERTICAL, parent, "Deputy");
|
||||
m_deputy_ams_preview_panel = new wxPanel(parent);
|
||||
auto ams_items_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
for (int i = 0; i < 5; i++) { // most connect 4 ams(multi + single) + 1 vt_slot
|
||||
AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector<Caninfo>{}};
|
||||
if (i == 4)
|
||||
temp_info.ams_type = AMSModel::EXT_AMS;
|
||||
auto preview_ams_item = new AMSPreview(m_deputy_ams_preview_panel, wxID_ANY, temp_info);
|
||||
m_deputy_ams_preview_list.push_back(preview_ams_item);
|
||||
size_t index = m_deputy_ams_preview_list.size() - 1;
|
||||
preview_ams_item->Bind(wxEVT_LEFT_DOWN, [this, index](wxMouseEvent &e) {
|
||||
update_multi_extruder_filament_combobox(m_deputy_ams_preview_list[index]->m_amsinfo.ams_id, 1);
|
||||
e.Skip();
|
||||
});
|
||||
ams_items_sizer->Add(preview_ams_item, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(6));
|
||||
}
|
||||
|
||||
m_deputy_ams_preview_panel->SetSizer(ams_items_sizer);
|
||||
m_deputy_sizer->Add(m_deputy_ams_preview_panel);
|
||||
|
||||
// 2. AMS item
|
||||
m_deputy_ams_items_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
for (int i = 0; i < 4; ++i) { // 4 slots
|
||||
auto filament_comboBox_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
wxRadioButton *radio_btn = new wxRadioButton(m_multi_exutrder_filament_list_panel, wxID_ANY, "");
|
||||
CheckBox * check_box = new CheckBox(m_multi_exutrder_filament_list_panel);
|
||||
check_box->SetBackgroundColour(*wxWHITE);
|
||||
FilamentComboBox *fcb = new FilamentComboBox(m_multi_exutrder_filament_list_panel);
|
||||
fcb->SetRadioBox(radio_btn);
|
||||
fcb->SetCheckBox(check_box);
|
||||
fcb->set_select_mode(CalibrationFilamentMode::CALI_MODEL_SINGLE);
|
||||
filament_comboBox_sizer->Add(radio_btn, 0, wxALIGN_CENTER);
|
||||
filament_comboBox_sizer->Add(check_box, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(8));
|
||||
filament_comboBox_sizer->Add(fcb, 0, wxALIGN_CENTER);
|
||||
m_deputy_ams_items_sizer->Add(filament_comboBox_sizer, 0);
|
||||
|
||||
fcb->Bind(EVT_CALI_TRAY_CHANGED, &CalibrationPresetPage::on_select_tray, this);
|
||||
m_deputy_filament_comboBox_list.emplace_back(fcb);
|
||||
|
||||
radio_btn->Bind(wxEVT_RADIOBUTTON, [this](wxCommandEvent &evt) {
|
||||
wxCommandEvent event(EVT_CALI_TRAY_CHANGED);
|
||||
event.SetEventObject(this);
|
||||
wxPostEvent(this, event);
|
||||
});
|
||||
check_box->Bind(wxEVT_TOGGLEBUTTON, [this](wxCommandEvent &evt) {
|
||||
wxCommandEvent event(EVT_CALI_TRAY_CHANGED);
|
||||
event.SetEventObject(this);
|
||||
wxPostEvent(this, event);
|
||||
evt.Skip();
|
||||
});
|
||||
}
|
||||
|
||||
m_deputy_sizer->Add(m_deputy_ams_items_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
}
|
||||
|
||||
m_multi_exturder_ams_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
if (m_main_extruder_on_left) {
|
||||
m_main_sizer->GetStaticBox()->SetLabel("Left");
|
||||
m_deputy_sizer->GetStaticBox()->SetLabel("Right");
|
||||
m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
}
|
||||
else {
|
||||
m_main_sizer->GetStaticBox()->SetLabel("Right");
|
||||
m_deputy_sizer->GetStaticBox()->SetLabel("Left");
|
||||
m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL, 10);
|
||||
}
|
||||
m_multi_extruder_ams_panel_sizer->Add(m_multi_exturder_ams_sizer);
|
||||
|
||||
parent->SetSizer(m_multi_extruder_ams_panel_sizer);
|
||||
m_multi_extruder_ams_panel_sizer->Fit(parent);
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::create_ext_spool_panel(wxWindow* parent)
|
||||
{
|
||||
auto panel_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
@ -746,6 +974,10 @@ void CalibrationPresetPage::create_page(wxWindow* parent)
|
|||
m_filament_list_panel->SetBackgroundColour(*wxWHITE);
|
||||
create_filament_list_panel(m_filament_list_panel);
|
||||
|
||||
m_multi_exutrder_filament_list_panel = new wxPanel(parent);
|
||||
m_multi_exutrder_filament_list_panel->SetBackgroundColour(*wxWHITE);
|
||||
create_multi_extruder_filament_list_panel(m_multi_exutrder_filament_list_panel);
|
||||
|
||||
if (m_cali_mode == CalibMode::Calib_PA_Line || m_cali_mode == CalibMode::Calib_PA_Pattern) {
|
||||
wxArrayString pa_cali_modes;
|
||||
pa_cali_modes.push_back(_L("Line"));
|
||||
|
@ -781,6 +1013,7 @@ void CalibrationPresetPage::create_page(wxWindow* parent)
|
|||
|
||||
m_top_sizer->Add(m_selection_panel, 0);
|
||||
m_top_sizer->Add(m_filament_list_panel, 0);
|
||||
m_top_sizer->Add(m_multi_exutrder_filament_list_panel, 0);
|
||||
m_top_sizer->Add(m_ext_spool_panel, 0);
|
||||
m_top_sizer->Add(m_pa_cali_method_combox, 0);
|
||||
m_top_sizer->Add(m_custom_range_panel, 0);
|
||||
|
@ -881,6 +1114,10 @@ void CalibrationPresetPage::on_select_nozzle(wxCommandEvent& evt)
|
|||
update_combobox_filaments(curr_obj);
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::on_select_nozzle_volume_type(wxCommandEvent &evt, size_t extruder_id)
|
||||
{
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::on_select_plate_type(wxCommandEvent& evt)
|
||||
{
|
||||
select_default_compatible_filament();
|
||||
|
@ -1196,6 +1433,14 @@ void CalibrationPresetPage::update_combobox_filaments(MachineObject* obj)
|
|||
|
||||
Preset* printer_preset = get_printer_preset(obj, nozzle_value);
|
||||
|
||||
auto opt_extruder_type = printer_preset->config.option<ConfigOptionEnumsGeneric>("extruder_type");
|
||||
if (opt_extruder_type) {
|
||||
assert(opt_extruder_type->values.size() <= 2);
|
||||
for (size_t i = 0; i < opt_extruder_type->values.size(); ++i) {
|
||||
m_extrder_types[i] = (ExtruderType)(opt_extruder_type->values[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// sync ams filaments list info
|
||||
PresetBundle* preset_bundle = wxGetApp().preset_bundle;
|
||||
if (preset_bundle && printer_preset) {
|
||||
|
@ -1292,7 +1537,7 @@ void CalibrationPresetPage::update_show_status()
|
|||
show_status(CaliPresetPageStatus::CaliPresetStatusInPrinting);
|
||||
return;
|
||||
}
|
||||
else if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) {
|
||||
else if (!obj_->is_multi_extruders() && !obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) {
|
||||
show_status(CaliPresetPageStatus::CaliPresetStatusNoSdcard);
|
||||
return;
|
||||
}
|
||||
|
@ -1625,13 +1870,71 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj)
|
|||
m_comboBox_nozzle_dia->SetSelection(NOZZLE_LIST_DEFAULT);
|
||||
}
|
||||
|
||||
if (obj->is_multi_extruders()) {
|
||||
for (int i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) {
|
||||
m_comboBox_nozzle_volume_types[i]->Show();
|
||||
m_comboBox_nozzle_volume_types[i]->SetSelection(obj->m_nozzle_data.nozzles[i].flow_type);
|
||||
}
|
||||
|
||||
if (obj->printer_type.find("O1D") != std::string::npos && m_main_extruder_on_left) {
|
||||
m_multi_exturder_ams_sizer->Detach(m_main_sizer);
|
||||
m_multi_exturder_ams_sizer->Detach(m_deputy_sizer);
|
||||
m_left_nozzle_volume_type_sizer->Detach(0);
|
||||
m_right_nozzle_volume_type_sizer->Detach(0);
|
||||
|
||||
m_main_sizer->GetStaticBox()->SetLabel("Right");
|
||||
m_deputy_sizer->GetStaticBox()->SetLabel("Left");
|
||||
m_multi_exturder_ams_sizer->Add(m_deputy_sizer);
|
||||
m_multi_exturder_ams_sizer->Add(m_main_sizer);
|
||||
|
||||
m_left_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[0]);
|
||||
m_right_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[1]);
|
||||
|
||||
m_main_extruder_on_left = false;
|
||||
}
|
||||
else if (obj->printer_type.find("O1D") == std::string::npos && !m_main_extruder_on_left) {
|
||||
m_multi_exturder_ams_sizer->Detach(m_main_sizer);
|
||||
m_multi_exturder_ams_sizer->Detach(m_deputy_sizer);
|
||||
|
||||
m_left_nozzle_volume_type_sizer->Detach(0);
|
||||
m_right_nozzle_volume_type_sizer->Detach(0);
|
||||
|
||||
m_main_sizer->GetStaticBox()->SetLabel("Left");
|
||||
m_deputy_sizer->GetStaticBox()->SetLabel("Right");
|
||||
m_multi_exturder_ams_sizer->Add(m_main_sizer);
|
||||
m_multi_exturder_ams_sizer->Add(m_deputy_sizer);
|
||||
|
||||
m_left_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[1]);
|
||||
m_right_nozzle_volume_type_sizer->Add(m_comboBox_nozzle_volume_types[0]);
|
||||
|
||||
m_main_extruder_on_left = true;
|
||||
}
|
||||
|
||||
m_nozzle_volume_type_panel->Show();
|
||||
m_multi_exutrder_filament_list_panel->Show();
|
||||
m_filament_list_panel->Hide();
|
||||
m_ext_spool_panel->Hide();
|
||||
}
|
||||
else {
|
||||
for (int i = 0; i < m_comboBox_nozzle_volume_types.size(); ++i) {
|
||||
m_comboBox_nozzle_volume_types[i]->Hide();
|
||||
}
|
||||
|
||||
m_nozzle_volume_type_panel->Hide();
|
||||
m_multi_exutrder_filament_list_panel->Hide();
|
||||
}
|
||||
|
||||
// set bed type collection from machine
|
||||
//if (m_cali_mode == CalibMode::Calib_PA_Line)
|
||||
// update_plate_type_collection(m_cali_method);
|
||||
|
||||
// init default for filament source
|
||||
// TODO if user change ams/ext, need to update
|
||||
if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) )
|
||||
if (obj->is_multi_extruders()) {
|
||||
m_ext_spool_radiobox->SetValue(false);
|
||||
m_ams_radiobox->SetValue(false);
|
||||
}
|
||||
else if ( !obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) )
|
||||
{
|
||||
m_ext_spool_radiobox->SetValue(true);
|
||||
m_ams_radiobox->SetValue(false);
|
||||
|
@ -1660,6 +1963,9 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj)
|
|||
std::map<int, DynamicPrintConfig> full_filament_ams_list;
|
||||
for (auto ams_item : old_full_filament_ams_list) {
|
||||
int key = ams_item.first & 0x0FFFF;
|
||||
if (key == VIRTUAL_TRAY_MAIN_ID || key == VIRTUAL_TRAY_DEPUTY_ID) {
|
||||
ams_item.second.set_key_value("filament_exist", new ConfigOptionBools{true});
|
||||
}
|
||||
full_filament_ams_list[key] = std::move(ams_item.second);
|
||||
}
|
||||
|
||||
|
@ -1688,6 +1994,9 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj)
|
|||
filament_ams_list[VIRTUAL_TRAY_MAIN_ID] = full_filament_ams_list[VIRTUAL_TRAY_MAIN_ID];
|
||||
}
|
||||
|
||||
if (full_filament_ams_list.find(VIRTUAL_TRAY_DEPUTY_ID) != full_filament_ams_list.end()) {
|
||||
filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID] = full_filament_ams_list[VIRTUAL_TRAY_DEPUTY_ID];
|
||||
}
|
||||
|
||||
// update filament from panel, display only obj has ams
|
||||
// update multi ams panel, display only obj has multi ams
|
||||
|
@ -1700,19 +2009,104 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj)
|
|||
if (!obj->amsList.empty())
|
||||
update_filament_combobox(obj->amsList.begin()->first);
|
||||
}
|
||||
|
||||
if (obj->is_multi_extruders()) {
|
||||
bool main_done = false;
|
||||
bool deputy_done = false;
|
||||
for (auto &ams_item : obj->amsList) {
|
||||
if (ams_item.second->nozzle == 0 && !main_done) {
|
||||
update_multi_extruder_filament_combobox(ams_item.second->id, ams_item.second->nozzle);
|
||||
main_done = true;
|
||||
} else if (ams_item.second->nozzle == 1 && !deputy_done) {
|
||||
update_multi_extruder_filament_combobox(ams_item.second->id, ams_item.second->nozzle);
|
||||
deputy_done = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (obj->is_multi_extruders()) {
|
||||
update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_MAIN_ID), 0);
|
||||
update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_DEPUTY_ID), 1);
|
||||
}
|
||||
|
||||
update_filament_combobox();
|
||||
m_multi_ams_panel->Hide();
|
||||
}
|
||||
|
||||
m_ams_id_to_extruder_id_map.clear();
|
||||
std::vector<AMSinfo> ams_info;
|
||||
std::vector<AMSinfo> main_ams_info;
|
||||
std::vector<AMSinfo> deputy_ams_info;
|
||||
for (auto ams = obj->amsList.begin(); ams != obj->amsList.end(); ams++) {
|
||||
AMSinfo info;
|
||||
info.ams_id = ams->first;
|
||||
if (ams->second->is_exists
|
||||
&& info.parse_ams_info(obj, ams->second, obj->ams_calibrate_remain_flag, obj->is_support_ams_humidity)) {
|
||||
ams_info.push_back(info);
|
||||
if (info.nozzle_id == 0) {
|
||||
main_ams_info.push_back(info);
|
||||
} else {
|
||||
deputy_ams_info.push_back(info);
|
||||
}
|
||||
}
|
||||
m_ams_id_to_extruder_id_map[stoi(info.ams_id)] = info.nozzle_id;
|
||||
}
|
||||
|
||||
// update for multi_exturder preview
|
||||
for (auto i = 0; i < 4; i++) {
|
||||
AMSPreview *main_item = m_main_ams_preview_list[i];
|
||||
if (main_ams_info.size() > 0) {
|
||||
if (i < main_ams_info.size()) {
|
||||
main_item->Update(main_ams_info[i]);
|
||||
main_item->Open();
|
||||
} else {
|
||||
main_item->Close();
|
||||
}
|
||||
}
|
||||
else {
|
||||
main_item->Close();
|
||||
}
|
||||
|
||||
AMSPreview *deputy_item = m_deputy_ams_preview_list[i];
|
||||
if (deputy_ams_info.size() > 0) {
|
||||
if (i < deputy_ams_info.size()) {
|
||||
deputy_item->Update(deputy_ams_info[i]);
|
||||
deputy_item->Open();
|
||||
} else {
|
||||
deputy_item->Close();
|
||||
}
|
||||
} else {
|
||||
deputy_item->Close();
|
||||
}
|
||||
}
|
||||
|
||||
// update vt slot preview list
|
||||
{
|
||||
for (const AmsTray& vt_tray : obj->vt_slot) {
|
||||
if (vt_tray.id == std::to_string(VIRTUAL_TRAY_MAIN_ID)) {
|
||||
AMSinfo info;
|
||||
info.ReadExtInfo(vt_tray);
|
||||
info.ams_type = AMSModel::EXT_AMS;
|
||||
|
||||
assert(m_main_ams_preview_list.size() == 4);
|
||||
AMSPreview *vt_item = m_main_ams_preview_list[4];
|
||||
vt_item->Update(info);
|
||||
vt_item->Open();
|
||||
}
|
||||
else if (vt_tray.id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) {
|
||||
AMSinfo info;
|
||||
info.ReadExtInfo(vt_tray);
|
||||
info.ams_type = AMSModel::EXT_AMS;
|
||||
|
||||
assert(m_deputy_ams_preview_list.size() == 4);
|
||||
AMSPreview *vt_item = m_deputy_ams_preview_list[4];
|
||||
vt_item->Update(info);
|
||||
vt_item->Open();
|
||||
}
|
||||
else {
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1798,28 +2192,54 @@ std::vector<FilamentComboBox*> CalibrationPresetPage::get_selected_filament_comb
|
|||
{
|
||||
std::vector<FilamentComboBox*> fcb_list;
|
||||
|
||||
if (m_ext_spool_radiobox->GetValue()) {
|
||||
if (m_ext_spool_panel) {
|
||||
if (m_virtual_tray_comboBox->GetRadioBox()->GetValue())
|
||||
fcb_list.push_back(m_virtual_tray_comboBox);
|
||||
}
|
||||
} else if (m_ams_radiobox->GetValue()) {
|
||||
if (curr_obj && curr_obj->is_multi_extruders()) {
|
||||
if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) {
|
||||
for (auto& fcb : m_filament_comboBox_list) {
|
||||
for (auto &fcb : m_main_filament_comboBox_list) {
|
||||
if (fcb->GetCheckBox()->GetValue()) {
|
||||
fcb_list.push_back(fcb);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) {
|
||||
for (auto& fcb : m_filament_comboBox_list) {
|
||||
for (auto &fcb : m_deputy_filament_comboBox_list) {
|
||||
if (fcb->GetCheckBox()->GetValue()) {
|
||||
fcb_list.push_back(fcb);
|
||||
}
|
||||
}
|
||||
} else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) {
|
||||
for (auto &fcb : m_main_filament_comboBox_list) {
|
||||
if (fcb->GetRadioBox()->GetValue()) {
|
||||
fcb_list.push_back(fcb);
|
||||
}
|
||||
}
|
||||
for (auto &fcb : m_deputy_filament_comboBox_list) {
|
||||
if (fcb->GetRadioBox()->GetValue()) {
|
||||
fcb_list.push_back(fcb);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
assert(false);
|
||||
}
|
||||
else {
|
||||
if (m_ext_spool_radiobox->GetValue()) {
|
||||
if (m_ext_spool_panel) {
|
||||
if (m_virtual_tray_comboBox->GetRadioBox()->GetValue())
|
||||
fcb_list.push_back(m_virtual_tray_comboBox);
|
||||
}
|
||||
} else if (m_ams_radiobox->GetValue()) {
|
||||
if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_MULITI) {
|
||||
for (auto &fcb : m_filament_comboBox_list) {
|
||||
if (fcb->GetCheckBox()->GetValue()) {
|
||||
fcb_list.push_back(fcb);
|
||||
}
|
||||
}
|
||||
} else if (m_cali_filament_mode == CalibrationFilamentMode::CALI_MODEL_SINGLE) {
|
||||
for (auto &fcb : m_filament_comboBox_list) {
|
||||
if (fcb->GetRadioBox()->GetValue()) {
|
||||
fcb_list.push_back(fcb);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
return fcb_list;
|
||||
|
@ -1870,6 +2290,88 @@ void CalibrationPresetPage::get_cali_stage(CaliPresetStage& stage, float& value)
|
|||
}
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::update_multi_extruder_filament_combobox(const std::string &ams_id, int nozzle_id)
|
||||
{
|
||||
if (nozzle_id == 0) {
|
||||
for (auto &fcb : m_main_filament_comboBox_list) {
|
||||
fcb->update_from_preset();
|
||||
fcb->set_select_mode(m_cali_filament_mode);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (auto &fcb : m_deputy_filament_comboBox_list) {
|
||||
fcb->update_from_preset();
|
||||
fcb->set_select_mode(m_cali_filament_mode);
|
||||
}
|
||||
}
|
||||
|
||||
DynamicPrintConfig empty_config;
|
||||
empty_config.set_key_value("filament_id", new ConfigOptionStrings{""});
|
||||
empty_config.set_key_value("tag_uid", new ConfigOptionStrings{""});
|
||||
empty_config.set_key_value("filament_type", new ConfigOptionStrings{""});
|
||||
empty_config.set_key_value("tray_name", new ConfigOptionStrings{""});
|
||||
empty_config.set_key_value("filament_colour", new ConfigOptionStrings{""});
|
||||
empty_config.set_key_value("filament_exist", new ConfigOptionBools{false});
|
||||
|
||||
if (filament_ams_list.empty()) return;
|
||||
|
||||
int ams_id_int = 0;
|
||||
try {
|
||||
if (!ams_id.empty())
|
||||
ams_id_int = stoi(ams_id.c_str());
|
||||
|
||||
} catch (...) {}
|
||||
|
||||
int item_size = 4;
|
||||
if (ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) {
|
||||
item_size = 1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
if (i < item_size) {
|
||||
if (nozzle_id == 0)
|
||||
m_main_filament_comboBox_list[i]->ShowPanel();
|
||||
else
|
||||
m_deputy_filament_comboBox_list[i]->ShowPanel();
|
||||
}
|
||||
else {
|
||||
if (nozzle_id == 0)
|
||||
m_main_filament_comboBox_list[i]->HidePanel();
|
||||
else
|
||||
m_deputy_filament_comboBox_list[i]->HidePanel();
|
||||
}
|
||||
|
||||
int tray_index = ams_id_int * 4 + i;
|
||||
if (ams_id == std::to_string(VIRTUAL_TRAY_MAIN_ID) || ams_id == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)) {
|
||||
tray_index = stoi(ams_id);
|
||||
}
|
||||
|
||||
auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [tray_index](auto &entry) {
|
||||
return entry.first == tray_index;
|
||||
});
|
||||
|
||||
if (nozzle_id == 0) {
|
||||
if (m_main_filament_comboBox_list.empty())
|
||||
continue;
|
||||
if (it != filament_ams_list.end()) {
|
||||
m_main_filament_comboBox_list[i]->load_tray_from_ams(tray_index, it->second);
|
||||
} else {
|
||||
m_main_filament_comboBox_list[i]->load_tray_from_ams(tray_index, empty_config);
|
||||
}
|
||||
}
|
||||
else{
|
||||
if (m_deputy_filament_comboBox_list.empty())
|
||||
continue;
|
||||
if (it != filament_ams_list.end()) {
|
||||
m_deputy_filament_comboBox_list[i]->load_tray_from_ams(tray_index, it->second);
|
||||
} else {
|
||||
m_deputy_filament_comboBox_list[i]->load_tray_from_ams(tray_index, empty_config);
|
||||
}
|
||||
}
|
||||
}
|
||||
Layout();
|
||||
}
|
||||
|
||||
void CalibrationPresetPage::update_filament_combobox(std::string ams_id)
|
||||
{
|
||||
for (auto& fcb : m_filament_comboBox_list) {
|
||||
|
@ -1888,14 +2390,14 @@ void CalibrationPresetPage::update_filament_combobox(std::string ams_id)
|
|||
/* update virtual tray combo box*/
|
||||
m_virtual_tray_comboBox->update_from_preset();
|
||||
auto it = std::find_if(filament_ams_list.begin(), filament_ams_list.end(), [](auto& entry) {
|
||||
return entry.first == VIRTUAL_TRAY_MAIN_ID;
|
||||
return entry.first == VIRTUAL_TRAY_DEPUTY_ID;
|
||||
});
|
||||
|
||||
if (it != filament_ams_list.end()) {
|
||||
m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_MAIN_ID, it->second);
|
||||
m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_DEPUTY_ID, it->second);
|
||||
}
|
||||
else {
|
||||
m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_MAIN_ID, empty_config);
|
||||
m_virtual_tray_comboBox->load_tray_from_ams(VIRTUAL_TRAY_DEPUTY_ID, empty_config);
|
||||
}
|
||||
|
||||
if (filament_ams_list.empty())
|
||||
|
@ -1935,9 +2437,9 @@ Preset* CalibrationPresetPage::get_printer_preset(MachineObject* obj, float nozz
|
|||
if (!printer_it->is_system) continue;
|
||||
|
||||
ConfigOption* printer_nozzle_opt = printer_it->config.option("nozzle_diameter");
|
||||
ConfigOptionFloats* printer_nozzle_vals = nullptr;
|
||||
ConfigOptionFloatsNullable *printer_nozzle_vals = nullptr;
|
||||
if (printer_nozzle_opt)
|
||||
printer_nozzle_vals = dynamic_cast<ConfigOptionFloats*>(printer_nozzle_opt);
|
||||
printer_nozzle_vals = dynamic_cast<ConfigOptionFloatsNullable*>(printer_nozzle_opt);
|
||||
std::string model_id = printer_it->get_current_printer_type(preset_bundle);
|
||||
|
||||
std::string printer_type = obj->printer_type;
|
||||
|
|
|
@ -219,6 +219,10 @@ public:
|
|||
void msw_rescale() override;
|
||||
void on_sys_color_changed() override;
|
||||
|
||||
int get_extruder_id(int ams_id);
|
||||
NozzleVolumeType get_nozzle_volume_type(int extruder_id) const;
|
||||
ExtruderType get_extruder_type(int extruder_id) const;
|
||||
|
||||
protected:
|
||||
void create_selection_panel(wxWindow* parent);
|
||||
void create_filament_list_panel(wxWindow* parent);
|
||||
|
@ -285,6 +289,39 @@ protected:
|
|||
ComboBox* m_comboBox_process;
|
||||
Label* m_nozzle_diameter_tips{nullptr};
|
||||
|
||||
// multi_extruder
|
||||
void update_multi_extruder_filament_combobox(const std::string &ams_id, int nozzle_id);
|
||||
void create_multi_extruder_filament_list_panel(wxWindow *parent);
|
||||
void on_select_nozzle_volume_type(wxCommandEvent &evt, size_t extruder_id);
|
||||
|
||||
std::vector<ComboBox*> m_comboBox_nozzle_volume_types;
|
||||
wxPanel* m_nozzle_volume_type_panel{nullptr};
|
||||
wxPanel* m_multi_exutrder_filament_list_panel{nullptr};
|
||||
|
||||
wxPanel* m_main_ams_preview_panel{nullptr};
|
||||
wxPanel* m_deputy_ams_preview_panel{nullptr};
|
||||
wxBoxSizer* m_main_ams_items_sizer{nullptr};
|
||||
wxBoxSizer* m_deputy_ams_items_sizer{nullptr};
|
||||
|
||||
std::vector<AMSPreview *> m_main_ams_preview_list;
|
||||
std::vector<AMSPreview *> m_deputy_ams_preview_list;
|
||||
FilamentComboBoxList m_main_filament_comboBox_list;
|
||||
FilamentComboBoxList m_deputy_filament_comboBox_list;
|
||||
|
||||
std::unordered_map<int, int> m_ams_id_to_extruder_id_map;
|
||||
std::vector<ExtruderType> m_extrder_types;
|
||||
std::vector<NozzleVolumeType> m_extruder_nozzle_types;
|
||||
bool m_main_extruder_on_left{true};
|
||||
|
||||
wxBoxSizer* m_multi_extruder_ams_panel_sizer;
|
||||
wxBoxSizer * m_multi_exturder_ams_sizer;
|
||||
wxStaticBoxSizer * m_main_sizer;
|
||||
wxStaticBoxSizer * m_deputy_sizer;
|
||||
wxStaticBoxSizer * m_left_nozzle_volume_type_sizer;
|
||||
wxStaticBoxSizer * m_right_nozzle_volume_type_sizer;
|
||||
|
||||
|
||||
|
||||
wxRadioButton* m_ams_radiobox;
|
||||
wxRadioButton* m_ext_spool_radiobox;
|
||||
|
||||
|
|
|
@ -23,58 +23,6 @@ namespace Slic3r { namespace GUI {
|
|||
// BBS: new layout
|
||||
constexpr int titleWidth = 20;
|
||||
|
||||
// get the param index of cur_exturder
|
||||
int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type)
|
||||
{
|
||||
if (printer_extruder_options.find(opt_key) != printer_extruder_options.end()) {
|
||||
return cur_extruder_id;
|
||||
}
|
||||
|
||||
int extruder_count = wxGetApp().preset_bundle->get_printer_extruder_count();
|
||||
if (extruder_count == 1 || cur_extruder_id == -1)
|
||||
return 0;
|
||||
|
||||
assert(cur_extruder_id < extruder_count);
|
||||
const DynamicPrintConfig& cur_printer_config = wxGetApp().preset_bundle->printers.get_selected_preset().config;
|
||||
auto opt_extruder_type = dynamic_cast<const ConfigOptionEnumsGeneric *>(cur_printer_config.option("extruder_type"));
|
||||
//auto opt_nozzle_volume_type = dynamic_cast<const ConfigOptionEnumsGeneric *>(cur_printer_config.option("default_nozzle_volume_type"));
|
||||
|
||||
if (!opt_extruder_type)
|
||||
return 0;
|
||||
|
||||
ExtruderType extruder_type = (ExtruderType) (opt_extruder_type->get_at(cur_extruder_id));
|
||||
//NozzleVolumeType nozzle_volume_type = (NozzleVolumeType) (opt_nozzle_volume_type->get_at(cur_extruder_id));
|
||||
|
||||
std::string id_name, variant_name;
|
||||
unsigned int stride = 1;
|
||||
if (printer_options_with_variant_1.count(opt_key) > 0) { // printer parameter
|
||||
id_name = "printer_extruder_id";
|
||||
variant_name = "printer_extruder_variant";
|
||||
} else if (printer_options_with_variant_2.count(opt_key) > 0) {
|
||||
id_name = "printer_extruder_id";
|
||||
variant_name = "printer_extruder_variant";
|
||||
stride = 2;
|
||||
} else if (filament_options_with_variant.count(opt_key) > 0) {
|
||||
//filament don't use id anymore
|
||||
//id_name = "filament_extruder_id";
|
||||
variant_name = "filament_extruder_variant";
|
||||
} else if (print_options_with_variant.count(opt_key) > 0) {
|
||||
id_name = "print_extruder_id";
|
||||
variant_name = "print_extruder_variant";
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// variant index
|
||||
int variant_index = config.get_index_for_extruder(cur_extruder_id + 1, id_name, extruder_type, nozzle_volume_type, variant_name, stride);
|
||||
if (variant_index < 0) {
|
||||
assert(false);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return variant_index;
|
||||
}
|
||||
|
||||
const t_field& OptionsGroup::build_field(const Option& opt) {
|
||||
return build_field(opt.opt_id, opt.opt);
|
||||
}
|
||||
|
|
|
@ -24,8 +24,6 @@
|
|||
|
||||
namespace Slic3r { namespace GUI {
|
||||
|
||||
extern int get_extruder_idx(const DynamicPrintConfig& config, const std::string &opt_key, int cur_extruder_id, NozzleVolumeType nozzle_volume_type);
|
||||
|
||||
// Thrown if the building of a parameter page is canceled.
|
||||
class UIBuildCanceled : public std::exception {};
|
||||
class OG_CustomCtrl;
|
||||
|
|
|
@ -1982,7 +1982,7 @@ std::map<int, DynamicPrintConfig> Sidebar::build_filament_ams_list(MachineObject
|
|||
if (obj->ams_support_virtual_tray) {
|
||||
int extruder = 0x10000; // Main (first) extruder at right
|
||||
for (auto & vt_tray : obj->vt_slot) {
|
||||
filament_ams_list.emplace(extruder + VIRTUAL_TRAY_MAIN_ID, build_tray_config(vt_tray, "Ext"));
|
||||
filament_ams_list.emplace(extruder + stoi(vt_tray.id), build_tray_config(vt_tray, "Ext"));
|
||||
extruder = 0;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -530,9 +530,9 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString
|
|||
|
||||
read_model_from_file(input_file, model);
|
||||
|
||||
DynamicConfig print_config = calib_info.print_prest->config;
|
||||
DynamicConfig filament_config = calib_info.filament_prest->config;
|
||||
DynamicConfig printer_config = calib_info.printer_prest->config;
|
||||
DynamicPrintConfig print_config = calib_info.print_prest->config;
|
||||
DynamicPrintConfig filament_config = calib_info.filament_prest->config;
|
||||
DynamicPrintConfig printer_config = calib_info.printer_prest->config;
|
||||
|
||||
/// --- scale ---
|
||||
// model is created for a 0.4 nozzle, scale z with nozzle size.
|
||||
|
@ -555,10 +555,22 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString
|
|||
//}
|
||||
|
||||
Flow infill_flow = Flow(nozzle_diameter * 1.2f, layer_height, nozzle_diameter);
|
||||
double filament_max_volumetric_speed = filament_config.option<ConfigOptionFloatsNullable>("filament_max_volumetric_speed")->get_at(0);
|
||||
|
||||
int index = get_index_for_extruder_parameter(filament_config, "filament_max_volumetric_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type);
|
||||
double filament_max_volumetric_speed = filament_config.option<ConfigOptionFloatsNullable>("filament_max_volumetric_speed")->get_at(index);
|
||||
double max_infill_speed = filament_max_volumetric_speed / (infill_flow.mm3_per_mm() * (pass == 1 ? 1.2 : 1));
|
||||
double internal_solid_speed = std::floor(std::min(print_config.opt_float_nullable("internal_solid_infill_speed", calib_info.extruder_id), max_infill_speed));
|
||||
double top_surface_speed = std::floor(std::min(print_config.opt_float_nullable("top_surface_speed", calib_info.extruder_id), max_infill_speed));
|
||||
|
||||
index = get_index_for_extruder_parameter(print_config, "internal_solid_infill_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type);
|
||||
double internal_solid_speed = std::floor(std::min(print_config.opt_float_nullable("internal_solid_infill_speed", index), max_infill_speed));
|
||||
ConfigOptionFloatsNullable* internal_solid_speed_opt = print_config.option<ConfigOptionFloatsNullable>("internal_solid_infill_speed");
|
||||
auto & new_internal_solid_speed = internal_solid_speed_opt->values;
|
||||
new_internal_solid_speed[index] = internal_solid_speed;
|
||||
|
||||
index = get_index_for_extruder_parameter(print_config, "top_surface_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type);
|
||||
double top_surface_speed = std::floor(std::min(print_config.opt_float_nullable("top_surface_speed", index), max_infill_speed));
|
||||
ConfigOptionFloatsNullable *top_surface_speed_opt = print_config.option<ConfigOptionFloatsNullable>("top_surface_speed");
|
||||
auto & new_top_surface_speed = top_surface_speed_opt->values;
|
||||
new_top_surface_speed[index] = top_surface_speed;
|
||||
|
||||
// adjust parameters
|
||||
filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
|
||||
|
@ -580,8 +592,8 @@ bool CalibUtils::calib_flowrate(int pass, const CalibInfo &calib_info, wxString
|
|||
_obj->config.set_key_value("top_solid_infill_flow_ratio", new ConfigOptionFloat(1.0f));
|
||||
_obj->config.set_key_value("infill_direction", new ConfigOptionFloat(45));
|
||||
_obj->config.set_key_value("ironing_type", new ConfigOptionEnum<IroningType>(IroningType::NoIroning));
|
||||
_obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloat(internal_solid_speed));
|
||||
_obj->config.set_key_value("top_surface_speed", new ConfigOptionFloat(top_surface_speed));
|
||||
_obj->config.set_key_value("internal_solid_infill_speed", internal_solid_speed_opt);
|
||||
_obj->config.set_key_value("top_surface_speed", top_surface_speed_opt);
|
||||
|
||||
// extract flowrate from name, filename format: flowrate_xxx
|
||||
std::string obj_name = _obj->name;
|
||||
|
|
|
@ -18,6 +18,8 @@ public:
|
|||
int extruder_id = 0;
|
||||
int ams_id = 0;
|
||||
int slot_id = 0;
|
||||
ExtruderType extruder_type{ExtruderType::etDirectDrive};
|
||||
NozzleVolumeType nozzle_volume_type;
|
||||
Calib_Params params;
|
||||
Preset* printer_prest;
|
||||
Preset* filament_prest;
|
||||
|
|
Loading…
Reference in New Issue