Fix setting AMS calib profile

ENH: calib support multi_extruder

1. backend support multi_extrude data structure
2. Compatible with third-party calibration

(cherry picked from commit bambulab/BambuStudio@21e6271e59)

Co-authored-by: zhimin.zeng <zhimin.zeng@bambulab.com>
This commit is contained in:
Noisyfox
2025-05-06 22:58:57 +08:00
parent 9b9c9ba569
commit dad7320f4b
9 changed files with 148 additions and 52 deletions

View File

@@ -317,6 +317,12 @@ enum ZHopType {
zhtCount zhtCount
}; };
enum NozzleVolumeType {
nvtNormal = 0,
nvtBigTraffic,
nvtMaxNozzleVolumeType = nvtBigTraffic
};
enum RetractLiftEnforceType { enum RetractLiftEnforceType {
rletAllSurfaces = 0, rletAllSurfaces = 0,
rletTopOnly, rletTopOnly,

View File

@@ -32,6 +32,7 @@ enum class CalibState { Start = 0, Preset, Calibration, CoarseSave, FineCalibrat
struct Calib_Params struct Calib_Params
{ {
Calib_Params() : mode(CalibMode::Calib_None){}; Calib_Params() : mode(CalibMode::Calib_None){};
int extruder_id = 0;
double start, end, step; double start, end, step;
bool print_numbers; bool print_numbers;
double freqStartX, freqEndX, freqStartY, freqEndY; double freqStartX, freqEndX, freqStartY, freqEndY;
@@ -52,8 +53,12 @@ class X1CCalibInfos
public: public:
struct X1CCalibInfo struct X1CCalibInfo
{ {
int extruder_id = -1;
int tray_id; int tray_id;
int ams_id = 0;
int slot_id = 0;
int bed_temp; int bed_temp;
NozzleVolumeType nozzle_volume_type = NozzleVolumeType::nvtNormal;
int nozzle_temp; int nozzle_temp;
float nozzle_diameter; float nozzle_diameter;
std::string filament_id; std::string filament_id;
@@ -102,7 +107,11 @@ public:
CALI_RESULT_PROBLEM = 1, CALI_RESULT_PROBLEM = 1,
CALI_RESULT_FAILED = 2, CALI_RESULT_FAILED = 2,
}; };
int tray_id; int extruder_id = -1;
NozzleVolumeType nozzle_volume_type;
int tray_id = 0;
int ams_id = 0;
int slot_id = 0;
int cali_idx = -1; int cali_idx = -1;
float nozzle_diameter; float nozzle_diameter;
std::string filament_id; std::string filament_id;
@@ -115,12 +124,31 @@ public:
struct PACalibIndexInfo struct PACalibIndexInfo
{ {
int tray_id; int extruder_id = -1;
NozzleVolumeType nozzle_volume_type;
int tray_id = 0;
int ams_id = 0;
int slot_id = 0;
int cali_idx; int cali_idx;
float nozzle_diameter; float nozzle_diameter;
std::string filament_id; std::string filament_id;
}; };
struct PACalibExtruderInfo
{
int extruder_id;
NozzleVolumeType nozzle_volume_type;
float nozzle_diameter;
std::string filament_id = "";
};
struct PACalibTabInfo
{
float pa_calib_tab_nozzle_dia;
int extruder_id;
NozzleVolumeType nozzle_volume_type;
};
class FlowRatioCalibResult class FlowRatioCalibResult
{ {
public: public:

View File

@@ -230,7 +230,9 @@ void HistoryWindow::reqeust_history_result(MachineObject* obj)
float nozzle_value = get_nozzle_value(); float nozzle_value = get_nozzle_value();
if (nozzle_value > 0) { if (nozzle_value > 0) {
CalibUtils::emit_get_PA_calib_infos(nozzle_value); PACalibExtruderInfo cali_info;
cali_info.nozzle_diameter = nozzle_value;
CalibUtils::emit_get_PA_calib_infos(cali_info);
m_tips->SetLabel(_L("Refreshing the historical Flow Dynamics Calibration records")); m_tips->SetLabel(_L("Refreshing the historical Flow Dynamics Calibration records"));
BOOST_LOG_TRIVIAL(info) << "request calib history"; BOOST_LOG_TRIVIAL(info) << "request calib history";
} }
@@ -303,7 +305,12 @@ void HistoryWindow::sync_history_data() {
gbSizer->SetEmptyCellSize({ 0,0 }); gbSizer->SetEmptyCellSize({ 0,0 });
m_history_data_panel->Layout(); m_history_data_panel->Layout();
m_history_data_panel->Fit(); m_history_data_panel->Fit();
CalibUtils::delete_PA_calib_result({ result.tray_id, result.cali_idx, result.nozzle_diameter, result.filament_id }); PACalibIndexInfo cali_info;
cali_info.tray_id = result.tray_id;
cali_info.cali_idx = result.cali_idx;
cali_info.nozzle_diameter = result.nozzle_diameter;
cali_info.filament_id = result.filament_id;
CalibUtils::delete_PA_calib_result(cali_info);
}); });
auto edit_button = new Button(m_history_data_panel, _L("Edit")); auto edit_button = new Button(m_history_data_panel, _L("Edit"));

View File

@@ -477,7 +477,9 @@ void PressureAdvanceWizard::update(MachineObject* obj)
if (!m_show_result_dialog) { if (!m_show_result_dialog) {
if (obj->cali_version != -1 && obj->cali_version != cali_version) { if (obj->cali_version != -1 && obj->cali_version != cali_version) {
cali_version = obj->cali_version; cali_version = obj->cali_version;
CalibUtils::emit_get_PA_calib_info(obj->nozzle_diameter, ""); PACalibExtruderInfo cali_info;
cali_info.nozzle_diameter = obj->nozzle_diameter;
CalibUtils::emit_get_PA_calib_info(cali_info);
} }
} }
} }

View File

@@ -2169,6 +2169,10 @@ int MachineObject::command_start_pa_calibration(const X1CCalibInfos &pa_data, in
j["print"]["filaments"][i]["filament_id"] = pa_data.calib_datas[i].filament_id; j["print"]["filaments"][i]["filament_id"] = pa_data.calib_datas[i].filament_id;
j["print"]["filaments"][i]["setting_id"] = pa_data.calib_datas[i].setting_id; j["print"]["filaments"][i]["setting_id"] = pa_data.calib_datas[i].setting_id;
j["print"]["filaments"][i]["nozzle_temp"] = pa_data.calib_datas[i].nozzle_temp; j["print"]["filaments"][i]["nozzle_temp"] = pa_data.calib_datas[i].nozzle_temp;
j["print"]["filaments"][i]["ams_id"] = pa_data.calib_datas[i].ams_id;
j["print"]["filaments"][i]["slot_id"] = pa_data.calib_datas[i].slot_id;
j["print"]["filaments"][i]["nozzle_volume_type"] = int(pa_data.calib_datas[i].nozzle_volume_type);
j["print"]["filaments"][i]["nozzle_diameter"] = pa_data.calib_datas[i].nozzle_diameter;
j["print"]["filaments"][i]["max_volumetric_speed"] = std::to_string(pa_data.calib_datas[i].max_volumetric_speed); j["print"]["filaments"][i]["max_volumetric_speed"] = std::to_string(pa_data.calib_datas[i].max_volumetric_speed);
if (i > 0) filament_ids += ","; if (i > 0) filament_ids += ",";
@@ -2206,6 +2210,10 @@ int MachineObject::command_set_pa_calibration(const std::vector<PACalibResult> &
if (pa_calib_values[i].cali_idx >= 0) if (pa_calib_values[i].cali_idx >= 0)
j["print"]["filaments"][i]["cali_idx"] = pa_calib_values[i].cali_idx; j["print"]["filaments"][i]["cali_idx"] = pa_calib_values[i].cali_idx;
j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id; j["print"]["filaments"][i]["tray_id"] = pa_calib_values[i].tray_id;
j["print"]["filaments"][i]["extruder_id"] = pa_calib_values[i].extruder_id;
j["print"]["filaments"][i]["nozzle_volume_type"] = int(pa_calib_values[i].nozzle_volume_type);
j["print"]["filaments"][i]["ams_id"] = pa_calib_values[i].ams_id;
j["print"]["filaments"][i]["slot_id"] = pa_calib_values[i].slot_id;
j["print"]["filaments"][i]["filament_id"] = pa_calib_values[i].filament_id; j["print"]["filaments"][i]["filament_id"] = pa_calib_values[i].filament_id;
j["print"]["filaments"][i]["setting_id"] = pa_calib_values[i].setting_id; j["print"]["filaments"][i]["setting_id"] = pa_calib_values[i].setting_id;
j["print"]["filaments"][i]["name"] = pa_calib_values[i].name; j["print"]["filaments"][i]["name"] = pa_calib_values[i].name;
@@ -2228,6 +2236,8 @@ int MachineObject::command_delete_pa_calibration(const PACalibIndexInfo& pa_cali
json j; json j;
j["print"]["command"] = "extrusion_cali_del"; j["print"]["command"] = "extrusion_cali_del";
j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++);
j["print"]["extruder_id"] = pa_calib.extruder_id;
j["print"]["nozzle_volume_type"] = int(pa_calib.nozzle_volume_type);
j["print"]["filament_id"] = pa_calib.filament_id; j["print"]["filament_id"] = pa_calib.filament_id;
j["print"]["cali_idx"] = pa_calib.cali_idx; j["print"]["cali_idx"] = pa_calib.cali_idx;
j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(pa_calib.nozzle_diameter); j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(pa_calib.nozzle_diameter);
@@ -2236,15 +2246,17 @@ int MachineObject::command_delete_pa_calibration(const PACalibIndexInfo& pa_cali
return this->publish_json(j.dump()); return this->publish_json(j.dump());
} }
int MachineObject::command_get_pa_calibration_tab(float nozzle_diameter, const std::string &filament_id) int MachineObject::command_get_pa_calibration_tab(const PACalibExtruderInfo &calib_info)
{ {
reset_pa_cali_history_result(); reset_pa_cali_history_result();
json j; json j;
j["print"]["command"] = "extrusion_cali_get"; j["print"]["command"] = "extrusion_cali_get";
j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++);
j["print"]["filament_id"] = filament_id; j["print"]["filament_id"] = calib_info.filament_id;
j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(nozzle_diameter); j["print"]["extruder_id"] = calib_info.extruder_id;
j["print"]["nozzle_volume_type"] = int(calib_info.nozzle_volume_type);
j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(calib_info.nozzle_diameter);
BOOST_LOG_TRIVIAL(trace) << "extrusion_cali_get: " << j.dump(); BOOST_LOG_TRIVIAL(trace) << "extrusion_cali_get: " << j.dump();
return this->publish_json(j.dump()); return this->publish_json(j.dump());
@@ -2267,6 +2279,8 @@ int MachineObject::commnad_select_pa_calibration(const PACalibIndexInfo& pa_cali
j["print"]["command"] = "extrusion_cali_sel"; j["print"]["command"] = "extrusion_cali_sel";
j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); j["print"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++);
j["print"]["tray_id"] = pa_calib_info.tray_id; j["print"]["tray_id"] = pa_calib_info.tray_id;
j["print"]["ams_id"] = pa_calib_info.ams_id;
j["print"]["slot_id"] = pa_calib_info.slot_id;
j["print"]["cali_idx"] = pa_calib_info.cali_idx; j["print"]["cali_idx"] = pa_calib_info.cali_idx;
j["print"]["filament_id"] = pa_calib_info.filament_id; j["print"]["filament_id"] = pa_calib_info.filament_id;
j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(pa_calib_info.nozzle_diameter); j["print"]["nozzle_diameter"] = to_string_nozzle_diameter(pa_calib_info.nozzle_diameter);
@@ -4640,10 +4654,10 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
if (jj.contains("nozzle_diameter")) { if (jj.contains("nozzle_diameter")) {
if (jj["nozzle_diameter"].is_number_float()) { if (jj["nozzle_diameter"].is_number_float()) {
pa_calib_tab_nozzle_dia = jj["nozzle_diameter"].get<float>(); pa_calib_tab_info.pa_calib_tab_nozzle_dia = jj["nozzle_diameter"].get<float>();
} }
else if (jj["nozzle_diameter"].is_string()) { else if (jj["nozzle_diameter"].is_string()) {
pa_calib_tab_nozzle_dia = string_to_float(jj["nozzle_diameter"].get<std::string>()); pa_calib_tab_info.pa_calib_tab_nozzle_dia = string_to_float(jj["nozzle_diameter"].get<std::string>());
} }
else { else {
assert(false); assert(false);
@@ -4653,6 +4667,14 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
assert(false); assert(false);
} }
if (jj.contains("extruder_id")) {
pa_calib_tab_info.extruder_id = jj["extruder_id"].get<int>();
}
if (jj.contains("nozzle_volume_type")) {
pa_calib_tab_info.nozzle_volume_type = NozzleVolumeType(jj["nozzle_volume_type"].get<int>());
}
if (jj.contains("filaments") && jj["filaments"].is_array()) { if (jj.contains("filaments") && jj["filaments"].is_array()) {
try { try {
#ifdef CALI_DEBUG #ifdef CALI_DEBUG
@@ -4727,6 +4749,30 @@ int MachineObject::parse_json(std::string payload, bool key_field_only)
pa_calib_result.nozzle_diameter = string_to_float(jj["nozzle_diameter"].get<std::string>()); pa_calib_result.nozzle_diameter = string_to_float(jj["nozzle_diameter"].get<std::string>());
} }
if (it->contains("ams_id")) {
pa_calib_result.ams_id = (*it)["ams_id"].get<int>();
} else {
pa_calib_result.ams_id = 0;
}
if (it->contains("slot_id")) {
pa_calib_result.slot_id = (*it)["slot_id"].get<int>();
} else {
pa_calib_result.slot_id = 0;
}
if (it->contains("extruder_id")) {
pa_calib_result.extruder_id = (*it)["extruder_id"].get<int>();
} else {
pa_calib_result.extruder_id = -1;
}
if (it->contains("nozzle_volume_type")) {
pa_calib_result.nozzle_volume_type = NozzleVolumeType((*it)["nozzle_volume_type"].get<int>());
} else {
pa_calib_result.nozzle_volume_type = NozzleVolumeType::nvtNormal;
}
if ((*it)["k_value"].is_number_float()) if ((*it)["k_value"].is_number_float())
pa_calib_result.k_value = (*it)["k_value"].get<float>(); pa_calib_result.k_value = (*it)["k_value"].get<float>();
else if ((*it)["k_value"].is_string()) else if ((*it)["k_value"].is_string())

View File

@@ -658,14 +658,16 @@ public:
ManualPaCaliMethod manual_pa_cali_method = ManualPaCaliMethod::PA_LINE; ManualPaCaliMethod manual_pa_cali_method = ManualPaCaliMethod::PA_LINE;
bool has_get_pa_calib_tab{ false }; bool has_get_pa_calib_tab{ false };
std::vector<PACalibResult> pa_calib_tab; std::vector<PACalibResult> pa_calib_tab;
float pa_calib_tab_nozzle_dia; PACalibTabInfo pa_calib_tab_info;
bool get_pa_calib_result { false }; bool get_pa_calib_result { false };
std::vector<PACalibResult> pa_calib_results; std::vector<PACalibResult> pa_calib_results;
bool get_flow_calib_result { false }; bool get_flow_calib_result { false };
std::vector<FlowRatioCalibResult> flow_ratio_results; std::vector<FlowRatioCalibResult> flow_ratio_results;
void reset_pa_cali_history_result() void reset_pa_cali_history_result()
{ {
pa_calib_tab_nozzle_dia = 0.4f; pa_calib_tab_info.pa_calib_tab_nozzle_dia = 0.4f;
pa_calib_tab_info.extruder_id = -1;
pa_calib_tab_info.nozzle_volume_type = NozzleVolumeType::nvtNormal;
has_get_pa_calib_tab = false; has_get_pa_calib_tab = false;
pa_calib_tab.clear(); pa_calib_tab.clear();
} }
@@ -928,7 +930,7 @@ public:
int command_start_pa_calibration(const X1CCalibInfos& pa_data, int mode = 0); // 0: automatic mode; 1: manual mode. default: automatic mode int command_start_pa_calibration(const X1CCalibInfos& pa_data, int mode = 0); // 0: automatic mode; 1: manual mode. default: automatic mode
int command_set_pa_calibration(const std::vector<PACalibResult>& pa_calib_values, bool is_auto_cali); int command_set_pa_calibration(const std::vector<PACalibResult>& pa_calib_values, bool is_auto_cali);
int command_delete_pa_calibration(const PACalibIndexInfo& pa_calib); int command_delete_pa_calibration(const PACalibIndexInfo& pa_calib);
int command_get_pa_calibration_tab(float nozzle_diameter, const std::string &filament_id = ""); int command_get_pa_calibration_tab(const PACalibExtruderInfo& calib_info);
int command_get_pa_calibration_result(float nozzle_diameter); int command_get_pa_calibration_result(float nozzle_diameter);
int commnad_select_pa_calibration(const PACalibIndexInfo& pa_calib_info); int commnad_select_pa_calibration(const PACalibIndexInfo& pa_calib_info);

View File

@@ -2583,7 +2583,9 @@ void StatusPanel::update_ams(MachineObject *obj)
if (obj->cali_version != -1 && last_cali_version != obj->cali_version) { if (obj->cali_version != -1 && last_cali_version != obj->cali_version) {
last_cali_version = obj->cali_version; last_cali_version = obj->cali_version;
CalibUtils::emit_get_PA_calib_info(obj->nozzle_diameter, ""); PACalibExtruderInfo cali_info;
cali_info.nozzle_diameter = obj->nozzle_diameter;
CalibUtils::emit_get_PA_calib_info(cali_info);
} }
bool is_support_virtual_tray = obj->ams_support_virtual_tray; bool is_support_virtual_tray = obj->ams_support_virtual_tray;

View File

@@ -373,7 +373,7 @@ bool CalibUtils::get_PA_calib_results(std::vector<PACalibResult>& pa_calib_resul
return pa_calib_results.size() > 0; return pa_calib_results.size() > 0;
} }
void CalibUtils::emit_get_PA_calib_infos(float nozzle_diameter) void CalibUtils::emit_get_PA_calib_infos(const PACalibExtruderInfo &cali_info)
{ {
DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!dev) if (!dev)
@@ -383,7 +383,7 @@ void CalibUtils::emit_get_PA_calib_infos(float nozzle_diameter)
if (obj_ == nullptr) if (obj_ == nullptr)
return; return;
obj_->command_get_pa_calibration_tab(nozzle_diameter); obj_->command_get_pa_calibration_tab(cali_info);
} }
bool CalibUtils::get_PA_calib_tab(std::vector<PACalibResult> &pa_calib_infos) bool CalibUtils::get_PA_calib_tab(std::vector<PACalibResult> &pa_calib_infos)
@@ -402,7 +402,7 @@ bool CalibUtils::get_PA_calib_tab(std::vector<PACalibResult> &pa_calib_infos)
return obj_->has_get_pa_calib_tab; return obj_->has_get_pa_calib_tab;
} }
void CalibUtils::emit_get_PA_calib_info(float nozzle_diameter, const std::string &filament_id) void CalibUtils::emit_get_PA_calib_info(const PACalibExtruderInfo &cali_info)
{ {
DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager(); DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
if (!dev) return; if (!dev) return;
@@ -410,7 +410,7 @@ void CalibUtils::emit_get_PA_calib_info(float nozzle_diameter, const std::string
MachineObject *obj_ = dev->get_selected_machine(); MachineObject *obj_ = dev->get_selected_machine();
if (obj_ == nullptr) return; if (obj_ == nullptr) return;
obj_->command_get_pa_calibration_tab(nozzle_diameter, filament_id); obj_->command_get_pa_calibration_tab(cali_info);
} }
bool CalibUtils::get_PA_calib_info(PACalibResult & pa_calib_info) { bool CalibUtils::get_PA_calib_info(PACalibResult & pa_calib_info) {

View File

@@ -16,6 +16,9 @@ extern const float MAX_PA_K_VALUE;
class CalibInfo class CalibInfo
{ {
public: public:
int extruder_id = 0;
int ams_id = 0;
int slot_id = 0;
Calib_Params params; Calib_Params params;
Preset* printer_prest; Preset* printer_prest;
Preset* filament_prest; Preset* filament_prest;
@@ -39,10 +42,10 @@ public:
static void emit_get_PA_calib_results(float nozzle_diameter); static void emit_get_PA_calib_results(float nozzle_diameter);
static bool get_PA_calib_results(std::vector<PACalibResult> &pa_calib_results); static bool get_PA_calib_results(std::vector<PACalibResult> &pa_calib_results);
static void emit_get_PA_calib_infos(float nozzle_diameter); static void emit_get_PA_calib_infos(const PACalibExtruderInfo &cali_info);
static bool get_PA_calib_tab(std::vector<PACalibResult> &pa_calib_infos); static bool get_PA_calib_tab(std::vector<PACalibResult> &pa_calib_infos);
static void emit_get_PA_calib_info(float nozzle_diameter, const std::string &filament_id); static void emit_get_PA_calib_info(const PACalibExtruderInfo& cali_info);
static bool get_PA_calib_info(PACalibResult &pa_calib_info); static bool get_PA_calib_info(PACalibResult &pa_calib_info);
static void set_PA_calib_result(const std::vector<PACalibResult>& pa_calib_values, bool is_auto_cali); static void set_PA_calib_result(const std::vector<PACalibResult>& pa_calib_values, bool is_auto_cali);