ENH: flow_ratio cali support multi_extuder

jira: none
Change-Id: I03399040a772043d3d20116b0588fd04e0725be1
This commit is contained in:
zhimin.zeng 2024-09-04 15:20:35 +08:00 committed by lane.wei
parent c1bf153a19
commit 38b3c32b6a
8 changed files with 203 additions and 36 deletions

View File

@ -576,6 +576,8 @@ std::string AppConfig::load()
for (auto cali_it = calis_j["presets"].begin(); cali_it != calis_j["presets"].end(); cali_it++) {
CaliPresetInfo preset_info;
preset_info.tray_id = cali_it.value()["tray_id"].get<int>();
preset_info.extruder_id = cali_it.value()["extruder_id"].get<int>();
preset_info.nozzle_volume_type = NozzleVolumeType(cali_it.value()["nozzle_volume_type"].get<int>());
preset_info.nozzle_diameter = cali_it.value()["nozzle_diameter"].get<float>();
preset_info.filament_id = cali_it.value()["filament_id"].get<std::string>();
preset_info.setting_id = cali_it.value()["setting_id"].get<std::string>();
@ -693,6 +695,8 @@ void AppConfig::save()
for (auto filament_preset : cali_info.selected_presets) {
json preset_json;
preset_json["tray_id"] = filament_preset.tray_id;
preset_json["extruder_id"] = filament_preset.extruder_id;
preset_json["nozzle_volume_type"] = int(filament_preset.nozzle_volume_type);
preset_json["nozzle_diameter"] = filament_preset.nozzle_diameter;
preset_json["filament_id"] = filament_preset.filament_id;
preset_json["setting_id"] = filament_preset.setting_id;

View File

@ -73,6 +73,8 @@ class CaliPresetInfo
{
public:
int tray_id;
int extruder_id;
NozzleVolumeType nozzle_volume_type;
float nozzle_diameter;
std::string filament_id;
std::string setting_id;
@ -81,6 +83,8 @@ public:
CaliPresetInfo &operator=(const CaliPresetInfo &other)
{
this->tray_id = other.tray_id;
this->extruder_id = other.extruder_id;
this->nozzle_volume_type = other.nozzle_volume_type;
this->nozzle_diameter = other.nozzle_diameter;
this->filament_id = other.filament_id;
this->setting_id = other.setting_id;

View File

@ -34,6 +34,32 @@ std::map<int, Preset*> get_cached_selected_filament(MachineObject* obj) {
return selected_filament_map;
}
struct TrayInfo
{
int extruder_id;
NozzleVolumeType nozzle_volume_type;
Preset *preset;
};
std::map<int, TrayInfo> get_cached_selected_filament_for_multi_extruder(MachineObject *obj)
{
std::map<int, TrayInfo> selected_filament_map;
if (!obj)
return selected_filament_map;
PresetCollection *filament_presets = &wxGetApp().preset_bundle->filaments;
for (auto selected_prest : obj->selected_cali_preset) {
TrayInfo tray_info;
tray_info.preset = filament_presets->find_preset(selected_prest.name);
if (!tray_info.preset)
continue;
tray_info.extruder_id = selected_prest.extruder_id;
tray_info.nozzle_volume_type = selected_prest.nozzle_volume_type;
selected_filament_map.emplace(std::make_pair(selected_prest.tray_id, tray_info));
}
return selected_filament_map;
}
bool is_pa_params_valid(const Calib_Params& params)
{
if (params.start < MIN_PA_K_VALUE || params.end > MAX_PA_K_VALUE || params.step < EPSILON || params.end < params.start + params.step) {
@ -288,6 +314,85 @@ bool CalibrationWizard::save_preset(const std::string &old_preset_name, const st
return true;
}
bool CalibrationWizard::save_preset_with_index(const std::string &old_preset_name, const std::string &new_preset_name, const std::map<std::string, ConfigIndexValue> &key_values, wxString &message)
{
if (new_preset_name.empty()) {
message = _L("The name cannot be empty.");
return false;
}
PresetCollection *filament_presets = &wxGetApp().preset_bundle->filaments;
Preset *preset = filament_presets->find_preset(old_preset_name);
if (!preset) {
message = wxString::Format(_L("The selected preset: %s is not found."), old_preset_name);
return false;
}
Preset temp_preset = *preset;
std::string new_name = filament_presets->get_preset_name_by_alias(new_preset_name);
bool exist_preset = false;
// If name is current, get the editing preset
Preset *new_preset = filament_presets->find_preset(new_name);
if (new_preset) {
if (new_preset->is_system) {
message = _L("The name cannot be the same as the system preset name.");
return false;
}
if (new_preset != preset) {
message = _L("The name is the same as another existing preset name");
return false;
}
if (new_preset != &filament_presets->get_edited_preset())
new_preset = &temp_preset;
exist_preset = true;
} else {
new_preset = &temp_preset;
}
for (auto item : key_values) {
auto config_opt = new_preset->config.option<ConfigOptionFloatsNullable>(item.first);
if (!config_opt) {
auto& config_value = config_opt->values;
config_value[item.second.index] = item.second.value;
}
}
// Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
filament_presets->save_current_preset(new_name, false, false, new_preset);
// BBS create new settings
new_preset = filament_presets->find_preset(new_name, false, true);
// Preset* preset = &m_presets.preset(it - m_presets.begin(), true);
if (!new_preset) {
BOOST_LOG_TRIVIAL(info) << "create new preset failed";
message = _L("create new preset failed.");
return false;
}
// set sync_info for sync service
if (exist_preset) {
new_preset->sync_info = "update";
BOOST_LOG_TRIVIAL(info) << "sync_preset: update preset = " << new_preset->name;
} else {
new_preset->sync_info = "create";
if (wxGetApp().is_user_login()) new_preset->user_id = wxGetApp().getAgent()->get_user_id();
BOOST_LOG_TRIVIAL(info) << "sync_preset: create preset = " << new_preset->name;
}
new_preset->save_info();
// Mark the print & filament enabled if they are compatible with the currently selected preset.
// If saving the preset changes compatibility with other presets, keep the now incompatible dependent presets selected, however with a "red flag" icon showing that they are
// no more compatible.
wxGetApp().preset_bundle->update_compatible(PresetSelectCompatibleType::Never);
// BBS if create a new prset name, preset changed from preset name to new preset name
if (!exist_preset) { wxGetApp().plater()->sidebar().update_presets_from_to(Preset::Type::TYPE_FILAMENT, old_preset_name, new_preset->name); }
return true;
}
void CalibrationWizard::cache_preset_info(MachineObject* obj, float nozzle_dia)
{
if (!obj) return;
@ -304,6 +409,14 @@ void CalibrationWizard::cache_preset_info(MachineObject* obj, float nozzle_dia)
result.filament_id = item.second->filament_id;
result.setting_id = item.second->setting_id;
result.name = item.second->name;
if (obj->is_multi_extruders()) {
int ams_id, slot_id, tray_id;
get_tray_ams_and_slot_id(result.extruder_id, ams_id, slot_id, tray_id);
result.extruder_id = preset_page->get_extruder_id(ams_id);
result.nozzle_volume_type = preset_page->get_nozzle_volume_type(ams_id);
}
obj->selected_cali_preset.push_back(result);
}
@ -1214,15 +1327,26 @@ void FlowRateWizard::on_cali_save()
std::string old_preset_name;
CalibrationPresetPage* preset_page = (static_cast<CalibrationPresetPage*>(preset_step->page));
std::map<int, Preset*> selected_filaments = get_cached_selected_filament(curr_obj);
std::map<int, TrayInfo> selected_filaments = get_cached_selected_filament_for_multi_extruder(curr_obj);
std::map<std::string, ConfigIndexValue> key_value_map;
int index = 0;
if (!selected_filaments.empty()) {
old_preset_name = selected_filaments.begin()->second->name;
TrayInfo tray_info = selected_filaments.begin()->second;
old_preset_name = tray_info.preset->name;
// todo multi_extruder: get_extruder_type from obj
ExtruderType extruder_type = ExtruderType::etDirectDrive;
index = get_index_for_extruder_parameter(tray_info.preset->config, "filament_flow_ratio", tray_info.extruder_id, extruder_type, tray_info.nozzle_volume_type);
ConfigIndexValue config_value;
config_value.index = index;
config_value.value = new_flow_ratio;
key_value_map.insert(std::make_pair("filament_flow_ratio", config_value));
}
std::map<std::string, ConfigOption*> key_value_map;
key_value_map.insert(std::make_pair("filament_flow_ratio", new ConfigOptionFloats{ new_flow_ratio }));
wxString message;
if (!save_preset(old_preset_name, into_u8(new_preset_name), key_value_map, message)) {
if (!save_preset_with_index(old_preset_name, into_u8(new_preset_name), key_value_map, message)) {
MessageDialog error_msg_dlg(nullptr, message, wxEmptyString, wxICON_WARNING | wxOK);
error_msg_dlg.ShowModal();
return;

View File

@ -30,6 +30,12 @@ public:
}
};
struct ConfigIndexValue
{
float value{0};
int index{0};
};
class CalibrationWizard : public wxPanel {
public:
CalibrationWizard(wxWindow* parent, CalibMode mode,
@ -61,6 +67,7 @@ public:
CalibMode get_calibration_mode() { return m_mode; }
bool save_preset(const std::string &old_preset_name, const std::string &new_preset_name, const std::map<std::string, ConfigOption *> &key_values, wxString& message);
bool save_preset_with_index(const std::string &old_preset_name, const std::string &new_preset_name, const std::map<std::string, ConfigIndexValue> &key_values, wxString &message);
virtual void cache_preset_info(MachineObject* obj, float nozzle_dia);
virtual void recover_preset_info(MachineObject *obj);

View File

@ -787,10 +787,13 @@ void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow *
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)
AMSModel ams_type = AMSModel::GENERIC_AMS;
AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector<Caninfo>{}};
if (i == 4)
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);
ams_type = AMSModel::EXT_AMS;
}
auto preview_ams_item = new AMSPreview(m_main_ams_preview_panel, wxID_ANY, temp_info, ams_type);
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) {
@ -846,10 +849,13 @@ void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow *
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
AMSModel ams_type = AMSModel::GENERIC_AMS;
AMSinfo temp_info = AMSinfo{std::to_string(i), std::vector<Caninfo>{}};
if (i == 4)
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);
ams_type = AMSModel::EXT_AMS;
}
auto preview_ams_item = new AMSPreview(m_deputy_ams_preview_panel, wxID_ANY, temp_info, ams_type);
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) {
@ -901,14 +907,14 @@ void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow *
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);
m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10);
m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 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_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10);
m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10);
}
m_multi_extruder_ams_panel_sizer->Add(m_multi_exturder_ams_sizer);
@ -1545,17 +1551,20 @@ void CalibrationPresetPage::update_show_status()
show_status(CaliPresetPageStatus::CaliPresetStatusInPrinting);
return;
}
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;
}
// check sdcard when if lan mode printer
if (obj_->is_lan_mode_printer()) {
if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) {
show_status(CaliPresetPageStatus::CaliPresetStatusLanModeNoSdcard);
if (obj_->need_SD_card()) {
if (!obj_->is_support_print_without_sd && (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD)) {
show_status(CaliPresetPageStatus::CaliPresetStatusNoSdcard);
return;
}
// check sdcard when if lan mode printer
if (obj_->is_lan_mode_printer()) {
if (obj_->get_sdcard_state() == MachineObject::SdcardState::NO_SDCARD) {
show_status(CaliPresetPageStatus::CaliPresetStatusLanModeNoSdcard);
return;
}
}
}
if (m_has_filament_incompatible) {
@ -1884,7 +1893,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj)
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) {
if (!obj->is_main_extruder_on_left() && 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);
@ -1892,15 +1901,15 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj)
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_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10);
m_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10);
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) {
else if (obj->is_main_extruder_on_left() && !m_main_extruder_on_left) {
m_multi_exturder_ams_sizer->Detach(m_main_sizer);
m_multi_exturder_ams_sizer->Detach(m_deputy_sizer);
@ -1909,8 +1918,8 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj)
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_multi_exturder_ams_sizer->Add(m_main_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10);
m_multi_exturder_ams_sizer->Add(m_deputy_sizer, 1, wxEXPAND | wxALL | wxALIGN_BOTTOM, 10);
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]);
@ -1942,7 +1951,7 @@ void CalibrationPresetPage::init_with_machine(MachineObject* obj)
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)) )
else if (!obj->has_ams() || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_MAIN_ID)) || (obj->m_tray_now == std::to_string(VIRTUAL_TRAY_DEPUTY_ID)))
{
m_ext_spool_radiobox->SetValue(true);
m_ams_radiobox->SetValue(false);
@ -2030,6 +2039,12 @@ void CalibrationPresetPage::sync_ams_info(MachineObject* obj)
deputy_done = true;
}
}
if (!main_done)
update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_MAIN_ID), 0);
if (!deputy_done)
update_multi_extruder_filament_combobox(std::to_string(VIRTUAL_TRAY_DEPUTY_ID), 1);
}
}
else {

View File

@ -323,7 +323,14 @@ void CalibrationFlowRateStartPage::update(MachineObject *obj)
m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
m_action_panel->enable_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
if (obj->get_printer_series() == PrinterSeries::SERIES_X1) {
if (obj->is_multi_extruders() || obj->get_printer_series() == PrinterSeries::SERIES_P1P) {
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false);
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
}
else if (obj->get_printer_series() == PrinterSeries::SERIES_X1) {
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, true);
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
@ -336,13 +343,6 @@ void CalibrationFlowRateStartPage::update(MachineObject *obj)
m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
}
}
else if (obj->get_printer_series() == PrinterSeries::SERIES_P1P) {
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANAGE_RESULT, false);
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_AUTO_CALI, false);
m_action_panel->show_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, true);
m_action_panel->bind_button(CaliPageActionType::CALI_ACTION_MANUAL_CALI, false);
}
//is support auto cali
if (!obj->is_support_flow_calibration) {

View File

@ -1128,11 +1128,22 @@ void MachineObject::reset_mapping_result(std::vector<FilamentInfo>& result)
}
}
bool MachineObject::is_main_extruder_on_left() const
{
return printer_type.find("O1D") == std::string::npos; // not O1D
}
bool MachineObject::is_multi_extruders() const
{
return m_nozzle_data.total_nozzle_count > 1;
}
bool MachineObject::need_SD_card() const
{
// todo: check whether need SD card
return !is_multi_extruders();
}
bool MachineObject::is_bbl_filament(std::string tag_uid)
{
if (tag_uid.empty())

View File

@ -577,7 +577,9 @@ public:
// exceed index start with 0
bool is_mapping_exceed_filament(std::vector<FilamentInfo>& result, int &exceed_index);
void reset_mapping_result(std::vector<FilamentInfo>& result);
bool is_main_extruder_on_left() const;
bool is_multi_extruders() const;
bool need_SD_card() const;
/*online*/
bool online_rfid;