Skip to content

Commit b4f6960

Browse files
zhimin-zeng-bambulablanewei120
authored andcommitted
FIX: support calibration for multi-nozzles with different diameters
github: 7543 Change-Id: Ifa20d786836f1991af35b3b95e25f91431d752e0
1 parent b2d74a1 commit b4f6960

4 files changed

Lines changed: 46 additions & 30 deletions

File tree

src/slic3r/GUI/CalibrationWizardPresetPage.cpp

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -984,11 +984,17 @@ NozzleVolumeType CalibrationPresetPage::get_nozzle_volume_type(int extruder_id)
984984

985985
ExtruderType CalibrationPresetPage::get_extruder_type(int extruder_id) const
986986
{
987-
if (m_extrder_types.size() > extruder_id)
988-
return ExtruderType(m_extrder_types[extruder_id]);
989-
else {
990-
return ExtruderType::etDirectDrive;
987+
if (curr_obj) {
988+
int extruder_idx = 0;
989+
if (curr_obj->is_multi_extruders()) {
990+
if (extruder_id == RIGHT_EXTRUDER_ID) {
991+
extruder_idx = 1;
992+
}
993+
}
994+
if (m_extrder_types.size() > extruder_idx)
995+
return m_extrder_types[extruder_idx];
991996
}
997+
return ExtruderType::etDirectDrive;
992998
}
993999

9941000
void CalibrationPresetPage::create_multi_extruder_filament_list_panel(wxWindow *parent)
@@ -1815,17 +1821,17 @@ void CalibrationPresetPage::update_show_status()
18151821
return;
18161822
}
18171823

1818-
if (obj_->is_multi_extruders()) {
1819-
float diameter = obj_->m_extder_data.extders[0].current_nozzle_diameter;
1820-
bool is_same_diameter = std::all_of(obj_->m_extder_data.extders.begin(), obj_->m_extder_data.extders.end(),
1821-
[diameter](const Extder& extruder) {
1822-
return std::fabs(extruder.current_nozzle_diameter - diameter) < EPSILON;
1823-
});
1824-
if (!is_same_diameter) {
1825-
show_status(CaliPresetPageStatus::CaliPresetStatusDifferentNozzleDiameters);
1826-
return;
1827-
}
1828-
}
1824+
//if (obj_->is_multi_extruders()) {
1825+
// float diameter = obj_->m_extder_data.extders[0].current_nozzle_diameter;
1826+
// bool is_same_diameter = std::all_of(obj_->m_extder_data.extders.begin(), obj_->m_extder_data.extders.end(),
1827+
// [diameter](const Extder& extruder) {
1828+
// return std::fabs(extruder.current_nozzle_diameter - diameter) < EPSILON;
1829+
// });
1830+
// if (!is_same_diameter) {
1831+
// show_status(CaliPresetPageStatus::CaliPresetStatusDifferentNozzleDiameters);
1832+
// return;
1833+
// }
1834+
//}
18291835

18301836
// check sdcard when if lan mode printer
18311837
if (obj_->is_lan_mode_printer()) {

src/slic3r/GUI/Plater.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14353,7 +14353,7 @@ void Plater::export_core_3mf()
1435314353
export_3mf(path_u8, SaveStrategy::Silence);
1435414354
}
1435514355

14356-
Preset *get_printer_preset(MachineObject *obj)
14356+
Preset *get_printer_preset(const MachineObject *obj)
1435714357
{
1435814358
if (!obj)
1435914359
return nullptr;

src/slic3r/GUI/Plater.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -943,7 +943,7 @@ class SuppressBackgroundProcessingUpdate
943943
std::vector<int> get_min_flush_volumes(const DynamicPrintConfig &full_config, size_t nozzle_id);
944944
std::string check_boolean_possible(const std::vector<const ModelVolume *> &volumes, csg::BooleanFailReason& fail_reason);
945945

946-
Preset *get_printer_preset(MachineObject *obj);
946+
Preset *get_printer_preset(const MachineObject *obj);
947947
wxArrayString get_all_camera_view_type();
948948

949949

src/slic3r/Utils/CalibUtils.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "libslic3r/Model.hpp"
1010
#include "../GUI/MsgDialog.hpp"
1111
#include "BBLUtil.hpp"
12+
#include "../GUI/Plater.hpp"
1213

1314

1415
namespace Slic3r {
@@ -76,6 +77,16 @@ wxString get_nozzle_volume_type_name(NozzleVolumeType type)
7677
return wxString();
7778
}
7879

80+
static int get_physical_extruder_idx(std::vector<int> physical_extruder_maps, int extruder_id)
81+
{
82+
for (size_t index = 0; index < physical_extruder_maps.size(); ++index) {
83+
if (physical_extruder_maps[index] == extruder_id) {
84+
return index;
85+
}
86+
}
87+
return extruder_id;
88+
}
89+
7990
bool is_pa_params_valid(const Calib_Params &params)
8091
{
8192
if (params.start < MIN_PA_K_VALUE || params.end > MAX_PA_K_VALUE || params.step < MIN_PA_K_VALUE_STEP || params.end < params.start + params.step) {
@@ -1174,26 +1185,13 @@ bool CalibUtils::check_printable_status_before_cali(const MachineObject *obj, co
11741185
return false;
11751186
}
11761187

1177-
float cali_diameter = cali_infos.calib_datas[0].nozzle_diameter;
1178-
int extruder_id = cali_infos.calib_datas[0].extruder_id;
11791188
for (const auto& cali_info : cali_infos.calib_datas) {
11801189
if (cali_infos.cali_mode == CalibMode::Calib_PA_Line && !is_support_auto_pa_cali(cali_info.filament_id)) {
11811190
error_message = _L("TPU 90A/TPU 85A is too soft and does not support automatic Flow Dynamics calibration.");
11821191
return false;
11831192
}
1184-
1185-
if (!is_approx(cali_diameter, cali_info.nozzle_diameter)) {
1186-
error_message = _L("Automatic calibration only supports cases where the left and right nozzle diameters are identical.");
1187-
return false;
1188-
}
11891193
}
11901194

1191-
if (extruder_id >= obj->m_extder_data.extders.size()) {
1192-
error_message = _L("The number of printer extruders and the printer selected for calibration does not match.");
1193-
return false;
1194-
}
1195-
1196-
float diameter = obj->m_extder_data.extders[extruder_id].current_nozzle_diameter;
11971195
bool is_multi_extruder = obj->is_multi_extruders();
11981196
std::vector<NozzleFlowType> nozzle_volume_types;
11991197
if (is_multi_extruder) {
@@ -1202,12 +1200,24 @@ bool CalibUtils::check_printable_status_before_cali(const MachineObject *obj, co
12021200
}
12031201
}
12041202

1203+
Preset *printer_preset = get_printer_preset(obj);
1204+
12051205
for (const auto &cali_info : cali_infos.calib_datas) {
12061206
wxString name = _L("left");
12071207
if (cali_info.extruder_id == 0) {
12081208
name = _L("right");
12091209
}
12101210

1211+
float cali_diameter = cali_info.nozzle_diameter;
1212+
int extruder_id = cali_info.extruder_id;
1213+
1214+
if (extruder_id >= obj->m_extder_data.extders.size()) {
1215+
error_message = _L("The number of printer extruders and the printer selected for calibration does not match.");
1216+
return false;
1217+
}
1218+
1219+
float diameter = obj->m_extder_data.extders[extruder_id].current_nozzle_diameter;
1220+
12111221
if (!is_approx(cali_info.nozzle_diameter, diameter)) {
12121222
if (is_multi_extruder)
12131223
error_message = wxString::Format(_L("The currently selected nozzle diameter of %s extruder does not match the actual nozzle diameter.\n"

0 commit comments

Comments
 (0)