OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::CalibUtils Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/Utils/CalibUtils.hpp>

Collaboration diagram for Slic3r::GUI::CalibUtils:

Public Member Functions

 CalibUtils ()

Static Public Member Functions

static CalibMode get_calib_mode_by_name (const std::string name, int &cali_stage)
static void calib_PA (const X1CCalibInfos &calib_infos, int mode, wxString &error_message)
static void emit_get_PA_calib_results (float nozzle_diameter)
static bool get_PA_calib_results (std::vector< PACalibResult > &pa_calib_results)
static void emit_get_PA_calib_infos (const PACalibExtruderInfo &cali_info)
static bool get_PA_calib_tab (std::vector< PACalibResult > &pa_calib_infos)
static void set_PA_calib_result (const std::vector< PACalibResult > &pa_calib_values, bool is_auto_cali)
static void select_PA_calib_result (const PACalibIndexInfo &pa_calib_info)
static void delete_PA_calib_result (const PACalibIndexInfo &pa_calib_info)
static void calib_flowrate_X1C (const X1CCalibInfos &calib_infos, wxString &error_message)
static void emit_get_flow_ratio_calib_results (float nozzle_diameter)
static bool get_flow_ratio_calib_results (std::vector< FlowRatioCalibResult > &flow_ratio_calib_results)
static bool calib_flowrate (int pass, const CalibInfo &calib_info, wxString &error_message)
static void calib_pa_pattern (const CalibInfo &calib_info, Model &model)
static void set_for_auto_pa_model_and_config (const std::vector< CalibInfo > &calib_info, DynamicPrintConfig &full_config, Model &model)
static bool calib_generic_auto_pa_cali (const std::vector< CalibInfo > &calib_info, wxString &error_message)
static bool calib_generic_PA (const CalibInfo &calib_info, wxString &error_message)
static void calib_temptue (const CalibInfo &calib_info, wxString &error_message)
static void calib_max_vol_speed (const CalibInfo &calib_info, wxString &error_message)
static void calib_VFA (const CalibInfo &calib_info, wxString &error_message)
static void calib_retraction (const CalibInfo &calib_info, wxString &error_message)
static bool is_support_auto_pa_cali (std::string filament_id)
static int get_selected_calib_idx (const std::vector< PACalibResult > &pa_calib_values, int cali_idx)
static bool get_pa_k_n_value_by_cali_idx (const MachineObject *obj, int cali_idx, float &out_k, float &out_n)
static bool validate_input_name (wxString name)
static bool validate_input_k_value (wxString k_text, float *output_value)
static bool validate_input_flow_ratio (wxString flow_ratio, float *output_value)
static bool check_printable_status_before_cali (const MachineObject *obj, const X1CCalibInfos &cali_infos, wxString &error_message)
static bool check_printable_status_before_cali (const MachineObject *obj, const CalibInfo &cali_info, wxString &error_message)
static bool check_printable_status_before_cali (const MachineObject *obj, const std::vector< CalibInfo > &cali_infos, wxString &error_message)

Static Public Attributes

static std::unique_ptr< Worker > print_worker

Static Private Member Functions

static bool process_and_store_3mf (Model *model, const DynamicPrintConfig &full_config, const Calib_Params &params, wxString &error_message)
static void send_to_print (const CalibInfo &calib_info, wxString &error_message, int flow_ratio_mode=0)
static void send_to_print (const std::vector< CalibInfo > &calib_infos, wxString &error_message, int flow_ratio_mode=0)

Detailed Description

Constructor & Destructor Documentation

◆ CalibUtils()

Slic3r::GUI::CalibUtils::CalibUtils ( )
inline
45{};

Member Function Documentation

◆ calib_flowrate()

bool Slic3r::GUI::CalibUtils::calib_flowrate ( int pass,
const CalibInfo & calib_info,
wxString & error_message )
static

— scale —

721{
722 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
723 if (!dev) {
724 error_message = _L("Need select printer");
725 return false;
726 }
727
728 MachineObject *obj_ = dev->get_selected_machine();
729 if (obj_ == nullptr) {
730 error_message = _L("Need select printer");
731 return false;
732 }
733
734 if (!check_printable_status_before_cali(obj_, calib_info, error_message))
735 return false;
736
737 if (pass != 1 && pass != 2)
738 return false;
739
740 Model model;
741 std::string input_file;
742 if (pass == 1)
743 input_file = Slic3r::resources_dir() + "/calib/filament_flow/flowrate-test-pass1.3mf";
744 else
745 input_file = Slic3r::resources_dir() + "/calib/filament_flow/flowrate-test-pass2.3mf";
746
747 read_model_from_file(input_file, model);
748
749 DynamicPrintConfig print_config = calib_info.print_prest->config;
750 DynamicPrintConfig filament_config = calib_info.filament_prest->config;
751 DynamicPrintConfig printer_config = calib_info.printer_prest->config;
752
754 // model is created for a 0.4 nozzle, scale z with nozzle size.
755 const ConfigOptionFloats *nozzle_diameter_config = printer_config.option<ConfigOptionFloats>("nozzle_diameter");
756 assert(nozzle_diameter_config->values.size() > 0);
757 float nozzle_diameter = nozzle_diameter_config->values[0];
758 float xyScale = nozzle_diameter / 0.6;
759 // scale z to have 7 layers
760 double first_layer_height = print_config.option<ConfigOptionFloat>("initial_layer_print_height")->value;
761 double layer_height = nozzle_diameter / 2.0; // prefer 0.2 layer height for 0.4 nozzle
762 first_layer_height = std::max(first_layer_height, layer_height);
763
764 float zscale = (first_layer_height + 6 * layer_height) / 1.4;
765 for (auto _obj : model.objects) _obj->scale(1, 1, zscale);
766 // only enlarge
767 //if (xyScale > 1.2) {
768 // for (auto _obj : model.objects) _obj->scale(xyScale, xyScale, zscale);
769 //} else {
770 // for (auto _obj : model.objects) _obj->scale(1, 1, zscale);
771 //}
772
773 Flow infill_flow = Flow(nozzle_diameter * 1.2f, layer_height, nozzle_diameter);
774
775 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);
776 double filament_max_volumetric_speed = filament_config.option<ConfigOptionFloats>("filament_max_volumetric_speed")->get_at(index);
777 double max_infill_speed = filament_max_volumetric_speed / (infill_flow.mm3_per_mm() * (pass == 1 ? 1.2 : 1));
778 double internal_solid_speed = std::floor(std::min(print_config.opt_float_nullable("internal_solid_infill_speed", 0), max_infill_speed));
779 double top_surface_speed = std::floor(std::min(print_config.opt_float_nullable("top_surface_speed", 0), max_infill_speed));
780
781 // adjust parameters
782 filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
783
784 for (auto _obj : model.objects) {
785 _obj->ensure_on_bed();
786 _obj->config.set_key_value("wall_loops", new ConfigOptionInt(3));
787 _obj->config.set_key_value("only_one_wall_top", new ConfigOptionBool(true));
788 _obj->config.set_key_value("sparse_infill_density", new ConfigOptionPercent(35));
789 _obj->config.set_key_value("bottom_shell_layers", new ConfigOptionInt(1));
790 _obj->config.set_key_value("top_shell_layers", new ConfigOptionInt(5));
791 _obj->config.set_key_value("detect_thin_wall", new ConfigOptionBool(true));
792 _obj->config.set_key_value("filter_out_gap_fill", new ConfigOptionFloat(0)); // OrcaSlicer parameter
793 _obj->config.set_key_value("sparse_infill_pattern", new ConfigOptionEnum<InfillPattern>(ipRectilinear));
794 _obj->config.set_key_value("top_surface_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false));
795 _obj->config.set_key_value("internal_solid_infill_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false));
796 _obj->config.set_key_value("top_surface_pattern", new ConfigOptionEnum<InfillPattern>(ipMonotonic));
797 const auto *top_solid_flow = dynamic_cast<const ConfigOptionFloatsNullable *>(_obj->config.option("top_solid_infill_flow_ratio"));
798 _obj->config.set_key_value("top_solid_infill_flow_ratio",
799 new ConfigOptionFloatsNullable(top_solid_flow ? top_solid_flow->size() : 1, 1.0f));
800 _obj->config.set_key_value("infill_direction", new ConfigOptionFloat(45));
801 _obj->config.set_key_value("ironing_type", new ConfigOptionEnum<IroningType>(IroningType::NoIroning));
802 _obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloatsNullable({internal_solid_speed}));
803 _obj->config.set_key_value("top_surface_speed", new ConfigOptionFloatsNullable({top_surface_speed}));
804
805 // extract flowrate from name, filename format: flowrate_xxx
806 std::string obj_name = _obj->name;
807 assert(obj_name.length() > 9);
808 obj_name = obj_name.substr(9);
809 if (obj_name[0] == 'm') obj_name[0] = '-';
810 auto modifier = stof(obj_name);
811 _obj->config.set_key_value("print_flow_ratio", new ConfigOptionFloat(1.0f + modifier / 100.f));
812 }
813 print_config.set_key_value("alternate_extra_wall", new ConfigOptionBool(false));
814 print_config.set_key_value("layer_height", new ConfigOptionFloat(layer_height));
815 print_config.set_key_value("initial_layer_print_height", new ConfigOptionFloat(first_layer_height));
816 print_config.set_key_value("reduce_crossing_wall", new ConfigOptionBool(true));
817
818 // apply preset
819 DynamicPrintConfig full_config;
820 full_config.apply(FullPrintConfig::defaults());
821 full_config.apply(print_config);
822 full_config.apply(filament_config);
823 full_config.apply(printer_config);
824
825 full_config.set_key_value("filament_ids", new ConfigOptionStrings({calib_info.filament_prest->filament_id}));
826 full_config.set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
827
828 init_multi_extruder_params_for_cali(full_config, calib_info);
829
830 Calib_Params params;
831 params.mode = CalibMode::Calib_Flow_Rate;
832 if (!process_and_store_3mf(&model, full_config, params, error_message))
833 return false;
834
835 send_to_print(calib_info, error_message, pass);
836 return true;
837}
#define _L(s)
Definition OBJ.cpp:34
ConfigOption * option(const t_config_option_key &opt_key, bool create=false)
Definition Config.hpp:2768
static bool check_printable_status_before_cali(const MachineObject *obj, const X1CCalibInfos &cali_infos, wxString &error_message)
Definition CalibUtils.cpp:1481
static bool process_and_store_3mf(Model *model, const DynamicPrintConfig &full_config, const Calib_Params &params, wxString &error_message)
Definition CalibUtils.cpp:1623
static void send_to_print(const CalibInfo &calib_info, wxString &error_message, int flow_ratio_mode=0)
Definition CalibUtils.cpp:1806
static std::string layer_height
Definition Tab.cpp:4294
static void init_multi_extruder_params_for_cali(DynamicPrintConfig &config, const CalibInfo &calib_info)
Definition CalibUtils.cpp:359
static DynamicPrintConfig & printer_config()
Definition GUI_ObjectList.cpp:131
static void read_model_from_file(const std::string &input_file, Model &model)
Definition CalibUtils.cpp:525
zaa_minimize_perimeter_height ConfigOptionFloat
Definition PrintConfig.hpp:1954
@ ipMonotonic
Definition PrintConfig.hpp:127
@ ipRectilinear
Definition PrintConfig.hpp:128
zaa_minimize_perimeter_height nozzle_diameter((ConfigOptionBool, reduce_infill_retraction))((ConfigOptionBool
@ Calib_Flow_Rate
Definition calib.hpp:29
ConfigOptionFloatsTempl< true > ConfigOptionFloatsNullable
Definition Config.hpp:1016
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)
Definition ParameterUtils.cpp:51
const std::string & resources_dir()
Definition utils.cpp:296
@ NoIroning
Definition PrintConfig.hpp:203
ConfigOptionFloatsTempl< false > ConfigOptionFloats
Definition Config.hpp:1015

References _L, Slic3r::ConfigBase::apply(), Slic3r::GUI::CalibInfo::bed_type, Slic3r::Calib_Flow_Rate, check_printable_status_before_cali(), Slic3r::Preset::config, Slic3r::ConfigOptionFloat, Slic3r::GUI::CalibInfo::extruder_id, Slic3r::GUI::CalibInfo::extruder_type, Slic3r::Preset::filament_id, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::get_index_for_extruder_parameter(), Slic3r::DeviceManager::get_selected_machine(), Slic3r::GUI::init_multi_extruder_params_for_cali(), Slic3r::ipMonotonic, Slic3r::ipRectilinear, Slic3r::GUI::layer_height, Slic3r::Flow::mm3_per_mm(), Slic3r::Calib_Params::mode, Slic3r::NoIroning, Slic3r::nozzle_diameter(), Slic3r::GUI::CalibInfo::nozzle_volume_type, Slic3r::Model::objects, Slic3r::DynamicConfig::opt_float_nullable(), Slic3r::ConfigBase::option(), Slic3r::GUI::CalibInfo::print_prest, Slic3r::GUI::printer_config(), Slic3r::GUI::CalibInfo::printer_prest, process_and_store_3mf(), Slic3r::GUI::read_model_from_file(), Slic3r::resources_dir(), send_to_print(), Slic3r::DynamicConfig::set_key_value(), and Slic3r::ConfigOptionVector< double >::values.

Referenced by Slic3r::GUI::FlowRateWizard::on_cali_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calib_flowrate_X1C()

void Slic3r::GUI::CalibUtils::calib_flowrate_X1C ( const X1CCalibInfos & calib_infos,
wxString & error_message )
static
674{
675 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
676 if (!dev)
677 return;
678
679 MachineObject *obj_ = dev->get_selected_machine();
680 if (obj_ == nullptr)
681 return;
682
683 if (calib_infos.calib_datas.size() > 0) {
684 if (!check_printable_status_before_cali(obj_, calib_infos, error_message))
685 return;
686 obj_->command_start_flow_ratio_calibration(calib_infos);
687 }
688 else {
689 BOOST_LOG_TRIVIAL(info) << "flow_rate_cali: auto | send info | cali_datas is empty.";
690 }
691}

References Slic3r::X1CCalibInfos::calib_datas, check_printable_status_before_cali(), Slic3r::MachineObject::command_start_flow_ratio_calibration(), and Slic3r::DeviceManager::get_selected_machine().

Referenced by Slic3r::GUI::FlowRateWizard::on_cali_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calib_generic_auto_pa_cali()

bool Slic3r::GUI::CalibUtils::calib_generic_auto_pa_cali ( const std::vector< CalibInfo > & calib_info,
wxString & error_message )
static
1020{
1021 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
1022 if (!dev) {
1023 error_message = _L("Need select printer");
1024 return false;
1025 }
1026
1027 MachineObject *obj_ = dev->get_selected_machine();
1028 if (obj_ == nullptr) {
1029 error_message = _L("Need select printer");
1030 return false;
1031 }
1032
1033 if (!check_printable_status_before_cali(obj_, calib_infos, error_message))
1034 return false;
1035
1036 const Calib_Params &params = calib_infos[0].params;
1037 if (params.mode != CalibMode::Calib_Auto_PA_Line)
1038 return false;
1039
1040 Model model;
1041 std::string input_file;
1042 if (obj_->is_multi_extruders())
1043 input_file = Slic3r::resources_dir() + "/calib/pressure_advance/auto_pa_line_dual.3mf";
1044 else
1045 input_file = Slic3r::resources_dir() + "/calib/pressure_advance/auto_pa_line_single.3mf";
1046
1047 read_model_from_file(input_file, model);
1048
1049 DynamicPrintConfig print_config = calib_infos[0].print_prest->config;
1050 DynamicPrintConfig filament_config = calib_infos[0].filament_prest->config;
1051 DynamicPrintConfig printer_config = calib_infos[0].printer_prest->config;
1052
1053 Preset printer_preset = *calib_infos[0].printer_prest;
1054 Preset print_preset = *calib_infos[0].print_prest;
1055 std::vector<Preset> filament_presets;
1056 std::vector<int> filament_map;
1057 filament_map.resize(calib_infos.size());
1058 std::vector<int> physical_extruder_maps = dynamic_cast<ConfigOptionInts *>(printer_config.option("physical_extruder_map", true))->values;
1059 for (size_t i = 0; i < calib_infos.size(); ++i) {
1060 CalibInfo calib_info = calib_infos[i];
1061 calib_info.filament_prest->config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
1062 filament_presets.emplace_back(*calib_info.filament_prest);
1063 for (size_t index = 0; index < physical_extruder_maps.size(); ++index) {
1064 if (physical_extruder_maps[index] == calib_info.extruder_id) {
1065 filament_map[i] = index;
1066 break;
1067 }
1068 }
1069 }
1070
1071 PresetBundle *preset_bundle = wxGetApp().preset_bundle;
1072 DynamicPrintConfig full_config = PresetBundle::construct_full_config(printer_preset, print_preset, preset_bundle->project_config, filament_presets, false, filament_map);
1073
1074 set_for_auto_pa_model_and_config(calib_infos, full_config, model);
1075 if (!process_and_store_3mf(&model, full_config, params, error_message))
1076 return false;
1077
1078 try {
1079 json js;
1080 if (params.mode == CalibMode::Calib_PA_Line)
1081 js["cali_type"] = "cali_pa_line";
1082 else if (params.mode == CalibMode::Calib_PA_Pattern)
1083 js["cali_type"] = "cali_pa_pattern";
1084 else if (params.mode == CalibMode::Calib_Auto_PA_Line)
1085 js["cali_type"] = "cali_auto_pa_line";
1086
1087 const ConfigOptionFloats *nozzle_diameter_config = printer_config.option<ConfigOptionFloats>("nozzle_diameter");
1088 assert(nozzle_diameter_config->values.size() > 0);
1089 float nozzle_diameter = nozzle_diameter_config->values[0];
1090
1091 js["nozzle_diameter"] = nozzle_diameter;
1092 std::string filament_ids;
1093 for (const auto& calib_info : calib_infos) {
1094 filament_ids += calib_info.filament_prest->filament_id;
1095 filament_ids += " ";
1096 }
1097 js["filament_id"] = filament_ids;
1098 js["printer_type"] = obj_->printer_type;
1099 NetworkAgent* agent = GUI::wxGetApp().getAgent();
1100 if (agent)
1101 agent->track_event("cali", js.dump());
1102 } catch (...) {}
1103
1104 send_to_print(calib_infos, error_message);
1105 return true;
1106}
std::vector< int > values
Definition Config.hpp:418
static void set_for_auto_pa_model_and_config(const std::vector< CalibInfo > &calib_info, DynamicPrintConfig &full_config, Model &model)
Definition CalibUtils.cpp:895
static DynamicPrintConfig construct_full_config(Preset &in_printer_preset, Preset &in_print_preset, const DynamicPrintConfig &project_config, std::vector< Preset > &in_filament_presets, bool apply_extruder, std::optional< std::vector< int > > filament_maps_new, std::optional< std::vector< int > > filament_volume_maps_new=std::nullopt)
Definition PresetBundle.cpp:194
@ Calib_PA_Line
Definition calib.hpp:25
@ Calib_PA_Pattern
Definition calib.hpp:26
@ Calib_Auto_PA_Line
Definition calib.hpp:28
nlohmann::json json
Definition AssembleList.cpp:42
@ Preset
Definition calib.hpp:39
zaa_minimize_perimeter_height filament_map((ConfigOptionInts, filament_volume_map))((ConfigOptionInts
ConfigOptionIntsTempl< false > ConfigOptionInts
Definition Config.hpp:1154
zaa_minimize_perimeter_height filament_ids((ConfigOptionStrings, filament_colour))((ConfigOptionStrings

References _L, Slic3r::GUI::CalibInfo::bed_type, Slic3r::Calib_Auto_PA_Line, Slic3r::Calib_PA_Line, Slic3r::Calib_PA_Pattern, check_printable_status_before_cali(), Slic3r::Preset::config, Slic3r::PresetBundle::construct_full_config(), Slic3r::GUI::CalibInfo::extruder_id, Slic3r::filament_ids(), Slic3r::filament_map(), Slic3r::GUI::CalibInfo::filament_prest, Slic3r::DeviceManager::get_selected_machine(), Slic3r::MachineObject::is_multi_extruders(), Slic3r::Calib_Params::mode, Slic3r::nozzle_diameter(), Slic3r::GUI::printer_config(), Slic3r::MachineObject::printer_type, process_and_store_3mf(), Slic3r::PresetBundle::project_config, Slic3r::GUI::read_model_from_file(), Slic3r::resources_dir(), send_to_print(), set_for_auto_pa_model_and_config(), Slic3r::DynamicConfig::set_key_value(), Slic3r::NetworkAgent::track_event(), and Slic3r::ConfigOptionVector< double >::values.

Referenced by Slic3r::GUI::PressureAdvanceWizard::on_cali_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calib_generic_PA()

bool Slic3r::GUI::CalibUtils::calib_generic_PA ( const CalibInfo & calib_info,
wxString & error_message )
static
1109{
1110 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
1111 if (!dev) {
1112 error_message = _L("Need select printer");
1113 return false;
1114 }
1115
1116 MachineObject *obj_ = dev->get_selected_machine();
1117 if (obj_ == nullptr) {
1118 error_message = _L("Need select printer");
1119 return false;
1120 }
1121
1122 if (!check_printable_status_before_cali(obj_, calib_info, error_message))
1123 return false;
1124
1125 const Calib_Params &params = calib_info.params;
1126 if (params.mode != CalibMode::Calib_PA_Line && params.mode != CalibMode::Calib_PA_Pattern)
1127 return false;
1128
1129 Model model;
1130 std::string input_file;
1131 if (params.mode == CalibMode::Calib_PA_Line)
1132 input_file = Slic3r::resources_dir() + "/calib/pressure_advance/pressure_advance_test.drc";
1133 else if (params.mode == CalibMode::Calib_PA_Pattern)
1134 input_file = Slic3r::resources_dir() + "/calib/pressure_advance/pa_pattern.3mf";
1135
1136 read_model_from_file(input_file, model);
1137
1138 if (params.mode == CalibMode::Calib_PA_Pattern)
1139 calib_pa_pattern(calib_info, model);
1140
1141 DynamicPrintConfig print_config = calib_info.print_prest->config;
1142 print_config.set_key_value("wipe_inward", new ConfigOptionBool(false));
1143 DynamicPrintConfig filament_config = calib_info.filament_prest->config;
1144 DynamicPrintConfig printer_config = calib_info.printer_prest->config;
1145
1146 filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
1147
1148 DynamicPrintConfig full_config;
1149 full_config.apply(FullPrintConfig::defaults());
1150 full_config.apply(print_config);
1151 full_config.apply(filament_config);
1152 full_config.apply(printer_config);
1153
1154 full_config.set_key_value("filament_ids", new ConfigOptionStrings({calib_info.filament_prest->filament_id}));
1155 full_config.set_key_value("enable_wrapping_detection", new ConfigOptionBool(false));
1156
1157 init_multi_extruder_params_for_cali(full_config, calib_info);
1158
1159 if (!process_and_store_3mf(&model, full_config, params, error_message))
1160 return false;
1161
1162 send_to_print(calib_info, error_message);
1163 return true;
1164}
bool set_key_value(const std::string &opt_key, ConfigOption *opt)
Definition Config.hpp:3022
static void calib_pa_pattern(const CalibInfo &calib_info, Model &model)
Definition CalibUtils.cpp:839

References _L, Slic3r::ConfigBase::apply(), Slic3r::GUI::CalibInfo::bed_type, Slic3r::Calib_PA_Line, Slic3r::Calib_PA_Pattern, calib_pa_pattern(), check_printable_status_before_cali(), Slic3r::Preset::config, Slic3r::Preset::filament_id, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::DeviceManager::get_selected_machine(), Slic3r::GUI::init_multi_extruder_params_for_cali(), Slic3r::Calib_Params::mode, Slic3r::GUI::CalibInfo::params, Slic3r::GUI::CalibInfo::print_prest, Slic3r::GUI::printer_config(), Slic3r::GUI::CalibInfo::printer_prest, process_and_store_3mf(), Slic3r::GUI::read_model_from_file(), Slic3r::resources_dir(), send_to_print(), and Slic3r::DynamicConfig::set_key_value().

Referenced by Slic3r::GUI::PressureAdvanceWizard::on_cali_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calib_max_vol_speed()

void Slic3r::GUI::CalibUtils::calib_max_vol_speed ( const CalibInfo & calib_info,
wxString & error_message )
static
1229{
1230 const Calib_Params &params = calib_info.params;
1231 if (params.mode != CalibMode::Calib_Vol_speed_Tower)
1232 return;
1233
1234 Model model;
1235 std::string input_file = Slic3r::resources_dir() + "/calib/volumetric_speed/SpeedTestStructure.drc";
1236 read_model_from_file(input_file, model);
1237
1238 DynamicPrintConfig print_config = calib_info.print_prest->config;
1239 DynamicPrintConfig filament_config = calib_info.filament_prest->config;
1240 DynamicPrintConfig printer_config = calib_info.printer_prest->config;
1241
1242 auto obj = model.objects[0];
1243 auto bed_shape = printer_config.option<ConfigOptionPoints>("printable_area")->values;
1244 BoundingBoxf bed_ext = get_extents(bed_shape);
1245 auto scale_obj = (bed_ext.size().x() - 10) / obj->bounding_box_exact().size().x();
1246 if (scale_obj < 1.0)
1247 obj->scale(scale_obj, 1, 1);
1248
1249 const ConfigOptionFloats *nozzle_diameter_config = printer_config.option<ConfigOptionFloats>("nozzle_diameter");
1250 assert(nozzle_diameter_config->values.size() > 0);
1251 double nozzle_diameter = nozzle_diameter_config->values[0];
1252 double line_width = nozzle_diameter * 1.75;
1253 double layer_height = nozzle_diameter * 0.8;
1254
1255 auto max_lh = printer_config.option<ConfigOptionFloats>("max_layer_height");
1256 if (max_lh->values[0] < layer_height) max_lh->values[0] = {layer_height};
1257
1258 filament_config.set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats{50});
1259 filament_config.set_key_value("slow_down_layer_time", new ConfigOptionInts{0});
1260 filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
1261
1262 print_config.set_key_value("enable_overhang_speed", new ConfigOptionBoolsNullable({false}));
1263 print_config.set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
1264 print_config.set_key_value("wall_loops", new ConfigOptionInt(1));
1265 print_config.set_key_value("alternate_extra_wall", new ConfigOptionBool(false));
1266 print_config.set_key_value("top_shell_layers", new ConfigOptionInt(0));
1267 print_config.set_key_value("bottom_shell_layers", new ConfigOptionInt(1));
1268 print_config.set_key_value("sparse_infill_density", new ConfigOptionPercent(0));
1269 print_config.set_key_value("overhang_reverse", new ConfigOptionBool(false));
1270 print_config.set_key_value("spiral_mode", new ConfigOptionBool(true));
1271 print_config.set_key_value("outer_wall_line_width", new ConfigOptionFloat(line_width));
1272 print_config.set_key_value("initial_layer_print_height", new ConfigOptionFloat(layer_height));
1273 print_config.set_key_value("layer_height", new ConfigOptionFloat(layer_height));
1274 obj->config.set_key_value("brim_type", new ConfigOptionEnum<BrimType>(btOuterAndInner));
1275 obj->config.set_key_value("brim_width", new ConfigOptionFloat(3.0));
1276 obj->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0));
1277
1278 // cut upper
1279 auto obj_bb = obj->bounding_box_exact();
1280 double height = (params.end - params.start + 1) / params.step;
1281 if (height < obj_bb.size().z()) {
1283 }
1284
1285 auto new_params = params;
1286 auto mm3_per_mm = Flow(line_width, layer_height, nozzle_diameter).mm3_per_mm() * filament_config.option<ConfigOptionFloatsNullable>("filament_flow_ratio")->get_at(0);
1287 new_params.end = params.end / mm3_per_mm;
1288 new_params.start = params.start / mm3_per_mm;
1289 new_params.step = params.step / mm3_per_mm;
1290
1291 DynamicPrintConfig full_config;
1292 full_config.apply(FullPrintConfig::defaults());
1293 full_config.apply(print_config);
1294 full_config.apply(filament_config);
1295 full_config.apply(printer_config);
1296
1297 init_multi_extruder_params_for_cali(full_config, calib_info);
1298
1299 process_and_store_3mf(&model, full_config, new_params, error_message);
1300 if (!error_message.empty())
1301 return;
1302
1303 send_to_print(calib_info, error_message);
1304}
static void cut_model(Model &model, double z, ModelObjectCutAttributes attributes)
Definition CalibUtils.cpp:503
coord_t height(const BoundingBox &box)
Definition Arrange.cpp:1185
@ btOuterAndInner
Definition PrintConfig.hpp:460
ConfigOptionBoolsTempl< true > ConfigOptionBoolsNullable
Definition Config.hpp:2067
@ Calib_Vol_speed_Tower
Definition calib.hpp:31
BoundingBox get_extents(const ExPolygonsWithIds &e)
Definition Emboss.cpp:1374
@ tlTraditional
Definition PrintConfig.hpp:469
@ KeepLower
Definition CutUtils.hpp:15

References Slic3r::ConfigBase::apply(), Slic3r::GUI::CalibInfo::bed_type, Slic3r::btOuterAndInner, Slic3r::Calib_Vol_speed_Tower, Slic3r::Preset::config, Slic3r::ConfigOptionFloat, Slic3r::GUI::cut_model(), Slic3r::Calib_Params::end, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::get_extents(), Slic3r::GUI::init_multi_extruder_params_for_cali(), Slic3r::KeepLower, Slic3r::GUI::layer_height, Slic3r::Flow::mm3_per_mm(), Slic3r::Calib_Params::mode, Slic3r::nozzle_diameter(), Slic3r::Model::objects, Slic3r::ConfigBase::option(), Slic3r::GUI::CalibInfo::params, Slic3r::GUI::CalibInfo::print_prest, Slic3r::GUI::printer_config(), Slic3r::GUI::CalibInfo::printer_prest, process_and_store_3mf(), Slic3r::GUI::read_model_from_file(), Slic3r::resources_dir(), send_to_print(), Slic3r::DynamicConfig::set_key_value(), Slic3r::Calib_Params::start, Slic3r::Calib_Params::step, Slic3r::tlTraditional, and Slic3r::ConfigOptionVector< double >::values.

Referenced by Slic3r::GUI::MaxVolumetricSpeedWizard::on_cali_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calib_PA()

void Slic3r::GUI::CalibUtils::calib_PA ( const X1CCalibInfos & calib_infos,
int mode,
wxString & error_message )
static
562{
563 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
564 if (!dev)
565 return;
566
567 MachineObject *obj_ = dev->get_selected_machine();
568 if (obj_ == nullptr)
569 return;
570
571 if (calib_infos.calib_datas.size() > 0) {
572 if (!check_printable_status_before_cali(obj_, calib_infos, error_message))
573 return;
574 obj_->command_start_pa_calibration(calib_infos, mode);
575 }
576}

References Slic3r::X1CCalibInfos::calib_datas, check_printable_status_before_cali(), Slic3r::MachineObject::command_start_pa_calibration(), and Slic3r::DeviceManager::get_selected_machine().

Referenced by Slic3r::GUI::PressureAdvanceWizard::on_cali_start().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calib_pa_pattern()

void Slic3r::GUI::CalibUtils::calib_pa_pattern ( const CalibInfo & calib_info,
Model & model )
static
840{
841 DynamicPrintConfig& print_config = calib_info.print_prest->config;
842 DynamicPrintConfig& filament_config = calib_info.filament_prest->config;
843 DynamicPrintConfig& printer_config = calib_info.printer_prest->config;
844
845 DynamicPrintConfig full_config;
846 full_config.apply(FullPrintConfig::defaults());
847 full_config.apply(print_config);
848 full_config.apply(filament_config);
849 full_config.apply(printer_config);
850 const auto& config_pattern = SuggestedConfigCalibPAPattern();
851
852 float nozzle_diameter = printer_config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0);
853
854 for (const auto& opt : config_pattern.floats_pairs) {
855 print_config.set_key_value(opt.first, new ConfigOptionFloatsNullable(opt.second));
856 }
857
858 int index = get_index_for_extruder_parameter(print_config, "outer_wall_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type);
859 float wall_speed = CalibPressureAdvance::find_optimal_PA_speed(full_config, print_config.get_abs_value("line_width"), print_config.get_abs_value("layer_height"), calib_info.extruder_id, 0);
860 ConfigOptionFloatsNullable *wall_speed_speed_opt = print_config.option<ConfigOptionFloatsNullable>("outer_wall_speed");
861 wall_speed_speed_opt->values[index] = wall_speed;
862
863 for (const auto& opt : config_pattern.nozzle_ratio_pairs) {
864 print_config.set_key_value(opt.first, new ConfigOptionFloatOrPercent(nozzle_diameter * opt.second / 100, false));
865 }
866
867 for (const auto& opt : config_pattern.int_pairs) {
868 print_config.set_key_value(opt.first, new ConfigOptionInt(opt.second));
869 }
870
871 print_config.set_key_value(config_pattern.brim_pair.first,
872 new ConfigOptionEnum<BrimType>(config_pattern.brim_pair.second));
873
874 //DynamicPrintConfig full_config;
875 full_config.apply(FullPrintConfig::defaults());
876 full_config.apply(print_config);
877 full_config.apply(filament_config);
878 full_config.apply(printer_config);
879
880 Vec3d plate_origin(0, 0, 0);
881 auto *object = model.objects[0];
882 CalibPressureAdvancePattern pa_pattern(calib_info.params, full_config, true, *object, plate_origin);
883
884 Pointfs bedfs = full_config.opt<ConfigOptionPoints>("printable_area")->values;
885 double current_width = bedfs[2].x() - bedfs[0].x();
886 double current_depth = bedfs[2].y() - bedfs[0].y();
887 Vec3d half_pattern_size = Vec3d(pa_pattern.print_size_x() / 2, pa_pattern.print_size_y() / 2, 0);
888 Vec3d offset = Vec3d(current_width / 2, current_depth / 2, 0) - half_pattern_size;
889 pa_pattern.set_start_offset(offset);
890
891 model.plates_custom_gcodes[0] = pa_pattern.generate_custom_gcodes(full_config, true, *object, plate_origin);
892 model.calib_pa_pattern = std::make_unique<CalibPressureAdvancePattern>(pa_pattern);
893}
static float find_optimal_PA_speed(const DynamicPrintConfig &config, double line_width, double layer_height, int extruder_id=0, int filament_idx=0)
Definition calib.cpp:29
void apply(const ConfigBase &other, bool ignore_nonexistent=false)
Definition Config.hpp:2802
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vec3d
Definition Point.hpp:68
std::vector< Vec2d > Pointfs
Definition Point.hpp:77
Slic3r::Polygons offset(const Slic3r::Polygon &polygon, const float delta, JoinType joinType, double miterLimit)
Definition ClipperUtils.cpp:582

References Slic3r::ConfigBase::apply(), Slic3r::Model::calib_pa_pattern, Slic3r::Preset::config, Slic3r::GUI::CalibInfo::extruder_id, Slic3r::GUI::CalibInfo::extruder_type, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::CalibPressureAdvance::find_optimal_PA_speed(), Slic3r::CalibPressureAdvancePattern::generate_custom_gcodes(), Slic3r::ConfigBase::get_abs_value(), Slic3r::get_index_for_extruder_parameter(), Slic3r::nozzle_diameter(), Slic3r::GUI::CalibInfo::nozzle_volume_type, Slic3r::Model::objects, Slic3r::offset(), Slic3r::DynamicConfig::opt(), Slic3r::ConfigBase::option(), Slic3r::GUI::CalibInfo::params, Slic3r::Model::plates_custom_gcodes, Slic3r::GUI::CalibInfo::print_prest, Slic3r::CalibPressureAdvancePattern::print_size_x(), Slic3r::CalibPressureAdvancePattern::print_size_y(), Slic3r::GUI::printer_config(), Slic3r::GUI::CalibInfo::printer_prest, Slic3r::DynamicConfig::set_key_value(), Slic3r::CalibPressureAdvancePattern::set_start_offset(), and Slic3r::ConfigOptionVector< double >::values.

Referenced by calib_generic_PA().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ calib_retraction()

void Slic3r::GUI::CalibUtils::calib_retraction ( const CalibInfo & calib_info,
wxString & error_message )
static
1394{
1395 const Calib_Params &params = calib_info.params;
1396 if (params.mode != CalibMode::Calib_Retraction_tower)
1397 return;
1398
1399 Model model;
1400 std::string input_file = Slic3r::resources_dir() + "/calib/retraction/retraction_tower.drc";
1401 read_model_from_file(input_file, model);
1402
1403 DynamicPrintConfig print_config = calib_info.print_prest->config;
1404 print_config.set_key_value("wipe_inward", new ConfigOptionBool(false));
1405 DynamicPrintConfig filament_config = calib_info.filament_prest->config;
1406 DynamicPrintConfig printer_config = calib_info.printer_prest->config;
1407
1408 auto obj = model.objects[0];
1409
1410 double layer_height = 0.2;
1411
1412 auto max_lh = printer_config.option<ConfigOptionFloats>("max_layer_height");
1413 if (max_lh->values[0] < layer_height) max_lh->values[0] = {layer_height};
1414
1415 filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
1416
1417 obj->config.set_key_value("wall_loops", new ConfigOptionInt(2));
1418 obj->config.set_key_value("alternate_extra_wall", new ConfigOptionBool(false));
1419 obj->config.set_key_value("top_shell_layers", new ConfigOptionInt(0));
1420 obj->config.set_key_value("bottom_shell_layers", new ConfigOptionInt(3));
1421 obj->config.set_key_value("sparse_infill_density", new ConfigOptionPercent(0));
1422 obj->config.set_key_value("initial_layer_print_height", new ConfigOptionFloat(layer_height));
1423 obj->config.set_key_value("layer_height", new ConfigOptionFloat(layer_height));
1424
1425 // cut upper
1426 auto obj_bb = obj->bounding_box_exact();
1427 auto height = 1.0 + 0.4 + ((params.end - params.start)) / params.step;
1428 if (height < obj_bb.size().z()) {
1430 }
1431
1432 DynamicPrintConfig full_config;
1433 full_config.apply(FullPrintConfig::defaults());
1434 full_config.apply(print_config);
1435 full_config.apply(filament_config);
1436 full_config.apply(printer_config);
1437
1438 init_multi_extruder_params_for_cali(full_config, calib_info);
1439
1440 process_and_store_3mf(&model, full_config, params, error_message);
1441 if (!error_message.empty())
1442 return;
1443
1444 send_to_print(calib_info, error_message);
1445}
@ Calib_Retraction_tower
Definition calib.hpp:33

References Slic3r::ConfigBase::apply(), Slic3r::GUI::CalibInfo::bed_type, Slic3r::Calib_Retraction_tower, Slic3r::Preset::config, Slic3r::ConfigOptionFloat, Slic3r::GUI::cut_model(), Slic3r::Calib_Params::end, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::GUI::init_multi_extruder_params_for_cali(), Slic3r::KeepLower, Slic3r::GUI::layer_height, Slic3r::Calib_Params::mode, Slic3r::Model::objects, Slic3r::GUI::CalibInfo::params, Slic3r::GUI::CalibInfo::print_prest, Slic3r::GUI::printer_config(), Slic3r::GUI::CalibInfo::printer_prest, process_and_store_3mf(), Slic3r::GUI::read_model_from_file(), Slic3r::resources_dir(), send_to_print(), Slic3r::DynamicConfig::set_key_value(), Slic3r::Calib_Params::start, and Slic3r::Calib_Params::step.

Here is the call graph for this function:

◆ calib_temptue()

void Slic3r::GUI::CalibUtils::calib_temptue ( const CalibInfo & calib_info,
wxString & error_message )
static
1167{
1168 const Calib_Params &params = calib_info.params;
1169 if (params.mode != CalibMode::Calib_Temp_Tower)
1170 return;
1171
1172 Model model;
1173 std::string input_file = Slic3r::resources_dir() + "/calib/temperature_tower/temperature_tower.stl";
1174 read_model_from_file(input_file, model);
1175
1176 // cut upper
1177 auto obj_bb = model.objects[0]->bounding_box_exact();
1178 auto block_count = lround((350 - params.start) / 5 + 1);
1179 if (block_count > 0) {
1180 // add EPSILON offset to avoid cutting at the exact location where the flat surface is
1181 auto new_height = block_count * 10.0 + EPSILON;
1182 if (new_height < obj_bb.size().z()) {
1184 }
1185 }
1186
1187 // cut bottom
1188 obj_bb = model.objects[0]->bounding_box_exact();
1189 block_count = lround((350 - params.end) / 5);
1190 if (block_count > 0) {
1191 auto new_height = block_count * 10.0 + EPSILON;
1192 if (new_height < obj_bb.size().z()) {
1194 }
1195 }
1196
1197 // edit preset
1198 DynamicPrintConfig print_config = calib_info.print_prest->config;
1199 DynamicPrintConfig filament_config = calib_info.filament_prest->config;
1200 DynamicPrintConfig printer_config = calib_info.printer_prest->config;
1201
1202 auto start_temp = lround(params.start);
1203 filament_config.set_key_value("nozzle_temperature_initial_layer", new ConfigOptionInts(1, (int) start_temp));
1204 filament_config.set_key_value("nozzle_temperature", new ConfigOptionInts(1, (int) start_temp));
1205 filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
1206
1207 model.objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum<BrimType>(btOuterOnly));
1208 model.objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(5.0));
1209 model.objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0));
1210 model.objects[0]->config.set_key_value("enable_support", new ConfigOptionBool(false));
1211
1212 // apply preset
1213 DynamicPrintConfig full_config;
1214 full_config.apply(FullPrintConfig::defaults());
1215 full_config.apply(print_config);
1216 full_config.apply(filament_config);
1217 full_config.apply(printer_config);
1218
1219 init_multi_extruder_params_for_cali(full_config, calib_info);
1220
1221 process_and_store_3mf(&model, full_config, params, error_message);
1222 if (!error_message.empty())
1223 return;
1224
1225 send_to_print(calib_info, error_message);
1226}
#define EPSILON
Definition ColorUtils.cpp:64
@ btOuterOnly
Definition PrintConfig.hpp:458
@ Calib_Temp_Tower
Definition calib.hpp:30
@ KeepUpper
Definition CutUtils.hpp:15

References Slic3r::ConfigBase::apply(), Slic3r::GUI::CalibInfo::bed_type, Slic3r::btOuterOnly, Slic3r::Calib_Temp_Tower, Slic3r::Preset::config, Slic3r::ConfigOptionFloat, Slic3r::GUI::cut_model(), Slic3r::Calib_Params::end, EPSILON, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::GUI::init_multi_extruder_params_for_cali(), Slic3r::KeepLower, Slic3r::KeepUpper, Slic3r::Calib_Params::mode, Slic3r::Model::objects, Slic3r::GUI::CalibInfo::params, Slic3r::GUI::CalibInfo::print_prest, Slic3r::GUI::printer_config(), Slic3r::GUI::CalibInfo::printer_prest, process_and_store_3mf(), Slic3r::GUI::read_model_from_file(), Slic3r::resources_dir(), send_to_print(), Slic3r::DynamicConfig::set_key_value(), and Slic3r::Calib_Params::start.

Here is the call graph for this function:

◆ calib_VFA()

void Slic3r::GUI::CalibUtils::calib_VFA ( const CalibInfo & calib_info,
wxString & error_message )
static
1307{
1308 const Calib_Params &params = calib_info.params;
1309 if (params.mode != CalibMode::Calib_VFA_Tower)
1310 return;
1311
1312 Model model;
1313 std::string input_file = Slic3r::resources_dir() + "/calib/vfa/vfa.drc";
1314 read_model_from_file(input_file, model);
1315
1316 DynamicPrintConfig print_config = calib_info.print_prest->config;
1317 DynamicPrintConfig filament_config = calib_info.filament_prest->config;
1318 DynamicPrintConfig printer_config = calib_info.printer_prest->config;
1319
1320 const ConfigOptionFloats* nozzle_diameter_config = printer_config.option<ConfigOptionFloats>("nozzle_diameter");
1321 size_t nozzle_id = static_cast<size_t>(std::max(params.extruder_id, 0));
1323 if (nozzle_diameter_config && !nozzle_diameter_config->values.empty()) {
1324 nozzle_id = std::min(nozzle_id, nozzle_diameter_config->values.size() - 1);
1325 nozzle_diameter = nozzle_diameter_config->values[nozzle_id];
1326 }
1327 if (nozzle_diameter <= 0.0)
1329
1330 // Resolved layer height: use the (possibly auto-adjusted) value if provided, else default to nozzle/2.
1331 double layer_height = params.vfa_layer_height > 0.0 ? params.vfa_layer_height : nozzle_diameter / 2.0;
1332
1333 filament_config.set_key_value("slow_down_layer_time", new ConfigOptionInts{0});
1334 filament_config.set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats{200});
1335 filament_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(calib_info.bed_type));
1336
1337 print_config.set_key_value("enable_overhang_speed", new ConfigOptionBoolsNullable({false}));
1338 print_config.set_key_value("timelapse_type", new ConfigOptionEnum<TimelapseType>(tlTraditional));
1339 print_config.set_key_value("wall_loops", new ConfigOptionInt(1));
1340 print_config.set_key_value("detect_thin_wall", new ConfigOptionBool(false));
1341 print_config.set_key_value("alternate_extra_wall", new ConfigOptionBool(false));
1342 print_config.set_key_value("detect_thin_wall", new ConfigOptionBool(false));
1343 print_config.set_key_value("top_shell_layers", new ConfigOptionInt(0));
1344 print_config.set_key_value("bottom_shell_layers", new ConfigOptionInt(1));
1345 print_config.set_key_value("sparse_infill_density", new ConfigOptionPercent(0));
1346 print_config.set_key_value("overhang_reverse", new ConfigOptionBool(false));
1347 print_config.set_key_value("spiral_mode", new ConfigOptionBool(true));
1348 print_config.set_key_value("initial_layer_print_height", new ConfigOptionFloat(layer_height));
1349 model.objects[0]->config.set_key_value("layer_height", new ConfigOptionFloat(layer_height));
1350 model.objects[0]->config.set_key_value("brim_type", new ConfigOptionEnum<BrimType>(btOuterOnly));
1351 model.objects[0]->config.set_key_value("brim_width", new ConfigOptionFloat(3.0));
1352 model.objects[0]->config.set_key_value("brim_object_gap", new ConfigOptionFloat(0.0));
1353
1354 // cut upper (on the unscaled model, using the base block height); the scaling below keeps the physical
1355 // block height (vfa_layers_per_block * layer_height) in sync with the speed stepping in GCode::process_layer.
1356 // Subtract EPSILON (as the temperature tower does) so the cut lands just below the flat block surface instead
1357 // of exactly on it, which would otherwise add a degenerate extra layer.
1358 auto obj_bb = model.objects[0]->bounding_box_exact();
1359 auto height = vfa_base_block_height * ((params.end - params.start) / params.step + 1) - EPSILON;
1360 if (height < obj_bb.size().z()) {
1362 }
1363 else {
1364 error_message = _L("The start, end or step is not valid value.");
1365 return;
1366 }
1367
1368 // XY scales with the nozzle; Z scales so each base block becomes vfa_layers_per_block layers of layer_height.
1369 const double xy_scale = nozzle_diameter / vfa_base_nozzle_diameter;
1370 const double z_scale = (vfa_layers_per_block * layer_height) / vfa_base_block_height;
1371 if (std::abs(xy_scale - 1.0) > EPSILON || std::abs(z_scale - 1.0) > EPSILON)
1372 model.objects[0]->scale(xy_scale, xy_scale, z_scale);
1373 model.objects[0]->ensure_on_bed();
1374
1375 DynamicPrintConfig full_config;
1376 full_config.apply(FullPrintConfig::defaults());
1377 full_config.apply(print_config);
1378 full_config.apply(filament_config);
1379 full_config.apply(printer_config);
1380
1381 init_multi_extruder_params_for_cali(full_config, calib_info);
1382
1383 // Pass the resolved layer height on so the GCode speed stepping matches the geometry.
1384 Calib_Params store_params = params;
1385 store_params.vfa_layer_height = layer_height;
1386 process_and_store_3mf(&model, full_config, store_params, error_message);
1387 if (!error_message.empty())
1388 return;
1389
1390 send_to_print(calib_info, error_message);
1391}
@ Calib_VFA_Tower
Definition calib.hpp:32
static constexpr double vfa_base_nozzle_diameter
Definition calib.hpp:66
static constexpr int vfa_layers_per_block
Definition calib.hpp:64
static constexpr double vfa_base_block_height
Definition calib.hpp:65

References _L, Slic3r::ConfigBase::apply(), Slic3r::GUI::CalibInfo::bed_type, Slic3r::btOuterOnly, Slic3r::Calib_VFA_Tower, Slic3r::Preset::config, Slic3r::ConfigOptionFloat, Slic3r::GUI::cut_model(), Slic3r::Calib_Params::end, EPSILON, Slic3r::Calib_Params::extruder_id, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::GUI::init_multi_extruder_params_for_cali(), Slic3r::KeepLower, Slic3r::GUI::layer_height, Slic3r::Calib_Params::mode, Slic3r::nozzle_diameter(), Slic3r::Model::objects, Slic3r::GUI::CalibInfo::params, Slic3r::GUI::CalibInfo::print_prest, Slic3r::GUI::printer_config(), Slic3r::GUI::CalibInfo::printer_prest, process_and_store_3mf(), Slic3r::GUI::read_model_from_file(), Slic3r::resources_dir(), send_to_print(), Slic3r::DynamicConfig::set_key_value(), Slic3r::Calib_Params::start, Slic3r::Calib_Params::step, Slic3r::tlTraditional, Slic3r::ConfigOptionVector< double >::values, Slic3r::vfa_base_block_height, Slic3r::vfa_base_nozzle_diameter, Slic3r::Calib_Params::vfa_layer_height, and Slic3r::vfa_layers_per_block.

Here is the call graph for this function:

◆ check_printable_status_before_cali() [1/3]

bool Slic3r::GUI::CalibUtils::check_printable_status_before_cali ( const MachineObject * obj,
const CalibInfo & cali_info,
wxString & error_message )
static
1619{
1620 return check_printable_status_before_cali(obj, std::vector<CalibInfo>{cali_info}, error_message);
1621}

References check_printable_status_before_cali().

Here is the call graph for this function:

◆ check_printable_status_before_cali() [2/3]

bool Slic3r::GUI::CalibUtils::check_printable_status_before_cali ( const MachineObject * obj,
const std::vector< CalibInfo > & cali_infos,
wxString & error_message )
static
1551{
1552 if (!obj) {
1553 error_message = _L("Need select printer");
1554 return false;
1555 }
1556
1557 if (cali_infos.empty())
1558 return true;
1559
1560 bool is_multi_extruder = obj->is_multi_extruders();
1561
1562 for (const auto &cali_info : cali_infos) {
1563 wxString name = "";
1564 if (is_multi_extruder) { name = cali_info.extruder_id == MAIN_EXTRUDER_ID ? _L("right") : _L("left"); }
1565
1566 if (cali_info.params.mode == CalibMode::Calib_Auto_PA_Line && !is_support_auto_pa_cali(cali_info.filament_prest->filament_id)) {
1567 error_message = _L("TPU 90A/TPU 85A is too soft and does not support automatic Flow Dynamics calibration.");
1568 return false;
1569 }
1570
1571
1572 if (is_approx(double(cali_info.nozzle_diameter), 0.2) && !obj->is_series_x()) {
1573 error_message = wxString::Format(_L("The nozzle diameter of %s extruder is 0.2mm which does not support automatic Flow Dynamics calibration."), name);
1574 return false;
1575 }
1576
1577 float cali_diameter = cali_info.nozzle_diameter;
1578 int extruder_id = cali_info.extruder_id;
1579 if (extruder_id >= obj->GetExtderSystem()->GetTotalExtderSize()) {
1580 error_message = _L("The number of printer extruders and the printer selected for calibration does not match.");
1581 return false;
1582 }
1583
1584 if (!obj->GetExtderSystem()->NozzleDiameterMatchesOrUnknown(extruder_id, cali_info.nozzle_diameter)) {
1585 if (is_multi_extruder)
1586 error_message = wxString::Format(_L("The currently selected nozzle diameter of %s extruder does not match the actual nozzle diameter.\n"
1587 "Please click the Sync button above and restart the calibration."), name);
1588 else
1589 error_message = _L("The nozzle diameter does not match the actual printer nozzle diameter.\n"
1590 "Please click the Sync button above and restart the calibration.");
1591 return false;
1592 }
1593
1594
1595 NozzleFlowType nozzle_volume_type = obj->GetExtderSystem()->GetNozzleFlowType(extruder_id);
1596
1598 if (is_multi_extruder)
1599 error_message = wxString::Format(_L("Printer %s nozzle information has not been set. Please configure it before proceeding with the calibration."), name);
1600 else
1601 error_message = nozzle_not_set_text;
1602 return false;
1603 }
1604
1605 if (NozzleVolumeType(nozzle_volume_type - 1) != cali_info.nozzle_volume_type) {
1606 if (is_multi_extruder)
1607 error_message = wxString::Format(_L("The currently selected nozzle type of %s extruder does not match the actual printer nozzle type.\n"
1608 "Please click the Sync button above and restart the calibration."), name);
1609 else
1610 error_message = nozzle_volume_type_not_match_text;
1611 return false;
1612 }
1613 }
1614
1615 return true;
1616}
#define MAIN_EXTRUDER_ID
Definition DevDefs.h:101
static bool is_support_auto_pa_cali(std::string filament_id)
Definition CalibUtils.cpp:1447
static wxString nozzle_volume_type_not_match_text
Definition CalibUtils.cpp:96
static wxString nozzle_not_set_text
Definition CalibUtils.cpp:95
NozzleVolumeType
Definition PrintConfig.hpp:618
NozzleFlowType
Definition DevDefs.h:116
@ NONE_FLOWTYPE
Definition DevDefs.h:117
constexpr bool is_approx(Number value, Number test_value, Number precision=EPSILON)
Definition libslic3r.h:320
zaa_minimize_perimeter_height nozzle_volume_type((ConfigOptionStrings, extruder_ams_count))((ConfigOptionStrings

References _L, Slic3r::Calib_Auto_PA_Line, Slic3r::MachineObject::GetExtderSystem(), Slic3r::DevExtderSystem::GetNozzleFlowType(), Slic3r::DevExtderSystem::GetTotalExtderSize(), Slic3r::is_approx(), Slic3r::MachineObject::is_multi_extruders(), Slic3r::MachineObject::is_series_x(), is_support_auto_pa_cali(), MAIN_EXTRUDER_ID, Slic3r::NONE_FLOWTYPE, Slic3r::GUI::nozzle_not_set_text, Slic3r::nozzle_volume_type(), Slic3r::GUI::nozzle_volume_type_not_match_text, and Slic3r::DevExtderSystem::NozzleDiameterMatchesOrUnknown().

Here is the call graph for this function:

◆ check_printable_status_before_cali() [3/3]

bool Slic3r::GUI::CalibUtils::check_printable_status_before_cali ( const MachineObject * obj,
const X1CCalibInfos & cali_infos,
wxString & error_message )
static
1482{
1483 if (!obj) {
1484 error_message = _L("Need select printer");
1485 return false;
1486 }
1487
1488 for (const auto& cali_info : cali_infos.calib_datas) {
1489 if (cali_infos.cali_mode == CalibMode::Calib_PA_Line && !is_support_auto_pa_cali(cali_info.filament_id)) {
1490 error_message = _L("TPU 90A/TPU 85A is too soft and does not support automatic Flow Dynamics calibration.");
1491 return false;
1492 }
1493 }
1494
1495 bool is_multi_extruder = obj->is_multi_extruders();
1496
1497 for (const auto &cali_info : cali_infos.calib_datas) {
1498 wxString name = "";
1499 if (is_multi_extruder) { name = cali_info.extruder_id == MAIN_EXTRUDER_ID ? _L("right") : _L("left"); }
1500
1501 float cali_diameter = cali_info.nozzle_diameter;
1502 int extruder_id = cali_info.extruder_id;
1503 if (extruder_id >= obj->GetExtderSystem()->GetTotalExtderSize()) {
1504 error_message = _L("The number of printer extruders and the printer selected for calibration does not match.");
1505 return false;
1506 }
1507
1508
1509 if (is_approx(double(cali_info.nozzle_diameter), 0.2) && !obj->is_series_x()) {
1510 // TRN %s is "left" or "right".
1511 error_message = wxString::Format(_L("The nozzle diameter of %s extruder is 0.2mm which does not support automatic Flow Dynamics calibration."), name);
1512 return false;
1513 }
1514
1515
1516 NozzleFlowType nozzle_volume_type = obj->GetExtderSystem()->GetNozzleFlowType(extruder_id);
1517 if (!obj->GetExtderSystem()->NozzleDiameterMatchesOrUnknown(extruder_id, cali_info.nozzle_diameter)) {
1518 if (is_multi_extruder)
1519 // TRN %s is "left" or "right".
1520 error_message = wxString::Format(_L("The currently selected nozzle diameter of %s extruder does not match the actual nozzle diameter.\n"
1521 "Please click the Sync button above and restart the calibration."), name);
1522 else
1523 error_message = _L("The nozzle diameter does not match the actual printer nozzle diameter.\n"
1524 "Please click the Sync button above and restart the calibration.");
1525 return false;
1526 }
1527
1529 if (is_multi_extruder)
1530 // TRN %s is "left" or "right".
1531 error_message = wxString::Format(_L("Printer %s nozzle information has not been set. Please configure it before proceeding with the calibration."), name);
1532 else
1533 error_message = nozzle_not_set_text;
1534 return false;
1535 }
1536
1537 if (NozzleVolumeType(nozzle_volume_type - 1) != cali_info.nozzle_volume_type) {
1538 if (is_multi_extruder)
1539 // TRN %s is "left" or "right".
1540 error_message = wxString::Format(_L("The currently selected nozzle type of %s extruder does not match the actual printer nozzle type.\n"
1541 "Please click the Sync button above and restart the calibration."), name);
1542 else
1543 error_message = nozzle_volume_type_not_match_text;
1544 return false;
1545 }
1546 }
1547 return true;
1548}

References _L, Slic3r::X1CCalibInfos::cali_mode, Slic3r::X1CCalibInfos::calib_datas, Slic3r::Calib_PA_Line, Slic3r::MachineObject::GetExtderSystem(), Slic3r::DevExtderSystem::GetNozzleFlowType(), Slic3r::DevExtderSystem::GetTotalExtderSize(), Slic3r::is_approx(), Slic3r::MachineObject::is_multi_extruders(), Slic3r::MachineObject::is_series_x(), is_support_auto_pa_cali(), MAIN_EXTRUDER_ID, Slic3r::NONE_FLOWTYPE, Slic3r::GUI::nozzle_not_set_text, Slic3r::nozzle_volume_type(), Slic3r::GUI::nozzle_volume_type_not_match_text, and Slic3r::DevExtderSystem::NozzleDiameterMatchesOrUnknown().

Referenced by calib_flowrate(), calib_flowrate_X1C(), calib_generic_auto_pa_cali(), calib_generic_PA(), calib_PA(), and check_printable_status_before_cali().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ delete_PA_calib_result()

void Slic3r::GUI::CalibUtils::delete_PA_calib_result ( const PACalibIndexInfo & pa_calib_info)
static
661{
662 DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
663 if (!dev)
664 return;
665
666 MachineObject* obj_ = dev->get_selected_machine();
667 if (obj_ == nullptr)
668 return;
669
670 obj_->command_delete_pa_calibration(pa_calib_info);
671}

References Slic3r::MachineObject::command_delete_pa_calibration(), and Slic3r::DeviceManager::get_selected_machine().

Referenced by Slic3r::GUI::HistoryWindow::sync_history_data().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ emit_get_flow_ratio_calib_results()

void Slic3r::GUI::CalibUtils::emit_get_flow_ratio_calib_results ( float nozzle_diameter)
static
694{
695 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
696 if (!dev)
697 return;
698
699 MachineObject *obj_ = dev->get_selected_machine();
700 if (obj_ == nullptr)
701 return;
702
703 obj_->command_get_flow_ratio_calibration_result(nozzle_diameter);
704}

References Slic3r::MachineObject::command_get_flow_ratio_calibration_result(), Slic3r::DeviceManager::get_selected_machine(), and Slic3r::nozzle_diameter().

Referenced by Slic3r::GUI::CalibrationCaliPage::update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ emit_get_PA_calib_infos()

void Slic3r::GUI::CalibUtils::emit_get_PA_calib_infos ( const PACalibExtruderInfo & cali_info)
static
606{
607 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
608 if (!dev)
609 return;
610
611 MachineObject *obj_ = dev->get_selected_machine();
612 if (obj_ == nullptr)
613 return;
614
615 obj_->command_get_pa_calibration_tab(cali_info);
616}

References Slic3r::MachineObject::command_get_pa_calibration_tab(), and Slic3r::DeviceManager::get_selected_machine().

Referenced by Slic3r::GUI::HistoryWindow::reqeust_history_result(), Slic3r::GUI::PressureAdvanceWizard::update(), and Slic3r::GUI::StatusPanel::update_ams().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ emit_get_PA_calib_results()

void Slic3r::GUI::CalibUtils::emit_get_PA_calib_results ( float nozzle_diameter)
static
579{
580 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
581 if (!dev)
582 return;
583
584 MachineObject *obj_ = dev->get_selected_machine();
585 if (obj_ == nullptr)
586 return;
587
588 obj_->command_get_pa_calibration_result(nozzle_diameter);
589}

References Slic3r::MachineObject::command_get_pa_calibration_result(), Slic3r::DeviceManager::get_selected_machine(), and Slic3r::nozzle_diameter().

Referenced by Slic3r::GUI::CalibrationCaliPage::update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_calib_mode_by_name()

CalibMode Slic3r::GUI::CalibUtils::get_calib_mode_by_name ( const std::string name,
int & cali_stage )
static
396{
397 if (name == "pa_line_calib_mode") {
398 cali_stage = 0;
400 }
401 else if (name == "pa_pattern_calib_mode") {
402 cali_stage = 1;
404 }
405 else if (name == "auto_pa_line_calib_mode") {
406 cali_stage = 2;
408 }
409 else if (name == "flow_rate_coarse_calib_mode") {
410 cali_stage = 1;
412 }
413 else if (name == "flow_rate_fine_calib_mode") {
414 cali_stage = 2;
416 }
417 else if (name == "temp_tower_calib_mode")
419 else if (name == "vol_speed_tower_calib_mode")
421 else if (name == "vfa_tower_calib_mode")
423 else if (name == "retration_tower_calib_mode")
425 else if (name == "input_shaping_freq_calib_mode")
427 else if (name == "input_shaping_damp_calib_mode")
429 else if (name == "cornering_calib_mode")
432}
@ Calib_Input_shaping_freq
Definition calib.hpp:34
@ Calib_Cornering
Definition calib.hpp:36
@ Calib_Input_shaping_damp
Definition calib.hpp:35
@ Calib_None
Definition calib.hpp:24

References Slic3r::Calib_Cornering, Slic3r::Calib_Flow_Rate, Slic3r::Calib_Input_shaping_damp, Slic3r::Calib_Input_shaping_freq, Slic3r::Calib_None, Slic3r::Calib_PA_Line, Slic3r::Calib_Retraction_tower, Slic3r::Calib_Temp_Tower, Slic3r::Calib_VFA_Tower, and Slic3r::Calib_Vol_speed_Tower.

Referenced by Slic3r::GUI::PrintingTaskPanel::enable_partskip_button(), Slic3r::GUI::get_obj_calibration_mode(), Slic3r::GUI::FlowRateWizard::on_cali_job_finished(), Slic3r::GUI::MaxVolumetricSpeedWizard::on_cali_job_finished(), and Slic3r::GUI::PressureAdvanceWizard::on_cali_job_finished().

Here is the caller graph for this function:

◆ get_flow_ratio_calib_results()

bool Slic3r::GUI::CalibUtils::get_flow_ratio_calib_results ( std::vector< FlowRatioCalibResult > & flow_ratio_calib_results)
static
707{
708 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
709 if (!dev)
710 return false;
711
712 MachineObject *obj_ = dev->get_selected_machine();
713 if (obj_ == nullptr)
714 return false;
715
716 flow_ratio_calib_results = obj_->flow_ratio_results;
717 return flow_ratio_calib_results.size() > 0;
718}

References Slic3r::MachineObject::flow_ratio_results, and Slic3r::DeviceManager::get_selected_machine().

Here is the call graph for this function:

◆ get_PA_calib_results()

bool Slic3r::GUI::CalibUtils::get_PA_calib_results ( std::vector< PACalibResult > & pa_calib_results)
static
592{
593 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
594 if (!dev)
595 return false;
596
597 MachineObject *obj_ = dev->get_selected_machine();
598 if (obj_ == nullptr)
599 return false;
600
601 pa_calib_results = obj_->pa_calib_results;
602 return pa_calib_results.size() > 0;
603}

References Slic3r::DeviceManager::get_selected_machine(), and Slic3r::MachineObject::pa_calib_results.

Here is the call graph for this function:

◆ get_PA_calib_tab()

bool Slic3r::GUI::CalibUtils::get_PA_calib_tab ( std::vector< PACalibResult > & pa_calib_infos)
static
619{
620 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
621 if (!dev)
622 return false;
623
624 MachineObject *obj_ = dev->get_selected_machine();
625 if (obj_ == nullptr)
626 return false;
627
628 if (obj_->has_get_pa_calib_tab) {
629 pa_calib_infos.assign(obj_->pa_calib_tab.begin(), obj_->pa_calib_tab.end());
630 }
631 return obj_->has_get_pa_calib_tab;
632}

References Slic3r::DeviceManager::get_selected_machine(), Slic3r::MachineObject::has_get_pa_calib_tab, and Slic3r::MachineObject::pa_calib_tab.

Here is the call graph for this function:

◆ get_pa_k_n_value_by_cali_idx()

bool Slic3r::GUI::CalibUtils::get_pa_k_n_value_by_cali_idx ( const MachineObject * obj,
int cali_idx,
float & out_k,
float & out_n )
static
1467 {
1468 if (!obj)
1469 return false;
1470
1471 for (auto pa_calib_info : obj->pa_calib_tab) {
1472 if (pa_calib_info.cali_idx == cali_idx) {
1473 out_k = pa_calib_info.k_value;
1474 out_n = pa_calib_info.n_coef;
1475 return true;
1476 }
1477 }
1478 return false;
1479}

References Slic3r::MachineObject::pa_calib_tab.

Referenced by Slic3r::GUI::AMSinfo::parse_ams_info(), and Slic3r::GUI::AMSinfo::parse_ext_info().

Here is the caller graph for this function:

◆ get_selected_calib_idx()

int Slic3r::GUI::CalibUtils::get_selected_calib_idx ( const std::vector< PACalibResult > & pa_calib_values,
int cali_idx )
static
1459 {
1460 for (int i = 0; i < pa_calib_values.size(); ++i) {
1461 if(pa_calib_values[i].cali_idx == cali_idx)
1462 return i;
1463 }
1464 return -1;
1465}

Referenced by Slic3r::GUI::AMSMaterialsSetting::on_select_filament(), and Slic3r::GUI::AMSLib::render_generic_text().

Here is the caller graph for this function:

◆ is_support_auto_pa_cali()

bool Slic3r::GUI::CalibUtils::is_support_auto_pa_cali ( std::string filament_id)
static
1448{
1449 // filament_id is our OF id; not_support_auto_pa_cali_filaments holds the printer's own ids.
1450 auto* agent = wxGetApp().getAgent();
1451 const std::string printer_filament_id = agent ? agent->from_orca_filament_id(filament_id) : filament_id;
1452 auto iter = std::find(not_support_auto_pa_cali_filaments.begin(), not_support_auto_pa_cali_filaments.end(), printer_filament_id);
1453 if (iter != not_support_auto_pa_cali_filaments.end()) {
1454 return false;
1455 }
1456 return true;
1457}
std::vector< std::string > not_support_auto_pa_cali_filaments
Definition CalibUtils.cpp:98

References Slic3r::GUI::not_support_auto_pa_cali_filaments.

Referenced by check_printable_status_before_cali(), and check_printable_status_before_cali().

Here is the caller graph for this function:

◆ process_and_store_3mf()

bool Slic3r::GUI::CalibUtils::process_and_store_3mf ( Model * model,
const DynamicPrintConfig & full_config,
const Calib_Params & params,
wxString & error_message )
staticprivate
1624{
1625 Pointfs bedfs = make_counter_clockwise(full_config.opt<ConfigOptionPoints>("printable_area")->values);
1626 std::vector<Pointfs> extruder_areas = full_config.option<ConfigOptionPointsGroups>("extruder_printable_area")->values;
1627 std::vector<double> extruder_heights = full_config.option<ConfigOptionFloatsNullable>("extruder_printable_height")->values;
1628 double print_height = full_config.opt_float("printable_height");
1629 double current_width = bedfs[2].x() - bedfs[0].x();
1630 double current_depth = bedfs[2].y() - bedfs[0].y();
1631 Vec3i32 plate_size;
1632 plate_size[0] = bedfs[2].x() - bedfs[0].x();
1633 plate_size[1] = bedfs[2].y() - bedfs[0].y();
1634 plate_size[2] = print_height;
1635
1636 if (params.mode == CalibMode::Calib_PA_Line) {
1637 double space_y = 3.5;
1638 int max_line_nums = int(plate_size[1] - 10) / space_y;
1639 int count = std::llround(std::ceil((params.end - params.start) / params.step)) + 1;
1640 if (count > max_line_nums) {
1641 error_message = _L("Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small");
1642 return false;
1643 }
1644 }
1645
1646 if (params.mode == CalibMode::Calib_PA_Pattern) {
1647 ModelInstance *instance = model->objects[0]->instances[0];
1648 Vec3d offset = model->calib_pa_pattern->get_start_offset() +
1649 Vec3d(model->calib_pa_pattern->handle_xy_size() / 2, -model->calib_pa_pattern->handle_xy_size() / 2 - model->calib_pa_pattern->handle_spacing(), 0);
1650 instance->set_offset(offset);
1651 }
1652 else if (model->objects.size() == 1) {
1653 ModelInstance *instance = model->objects[0]->instances[0];
1654 instance->set_offset(instance->get_offset() + Vec3d(current_width / 2, current_depth / 2, 0));
1655 } else {
1656 BoundingBoxf3 bbox = model->bounding_box_exact();
1657 Vec3d bbox_center = bbox.center();
1658 for (auto object : model->objects) {
1659 ModelInstance *instance = object->instances[0];
1660 instance->set_offset(instance->get_offset() + Vec3d(current_width / 2 - bbox_center.x(), current_depth / 2 - bbox_center.y(), 0));
1661 }
1662 }
1663
1664 Slic3r::GUI::PartPlateList partplate_list(nullptr, model, PrinterTechnology::ptFFF);
1665 partplate_list.reset_size(plate_size.x(), plate_size.y(), plate_size.z(), false);
1666
1667 Slic3r::GUI::PartPlate *part_plate = partplate_list.get_plate(0);
1668
1669 PrintBase * print = NULL;
1670 Slic3r::GUI::GCodeResult *gcode_result = NULL;
1671 int print_index;
1672 part_plate->get_print(&print, &gcode_result, &print_index);
1673
1674 BuildVolume build_volume(bedfs, print_height, extruder_areas, extruder_heights);
1675 unsigned int count = model->update_print_volume_state(build_volume);
1676 if (count == 0 && params.mode != CalibMode::Calib_Auto_PA_Line) {
1677 error_message = _L("Unable to calibrate: maybe because the set calibration value range is too large, or the step is too small");
1678 return false;
1679 }
1680
1681 // apply the new print config
1682 DynamicPrintConfig new_print_config = full_config;
1683 print->apply(*model, new_print_config);
1684
1685 Print *fff_print = dynamic_cast<Print *>(print);
1686 fff_print->set_calib_params(params);
1687 fff_print->is_BBL_printer() = true;
1688
1689 //StringObjectException warning;
1690 //auto err = print->validate(&warning);
1691 //if (!err.string.empty()) {
1692 // error_message = "slice validate: " + err.string;
1693 // return;
1694 //}
1695
1696 if (!check_nozzle_diameter_and_type(full_config, error_message))
1697 return false;
1698
1699 fff_print->process();
1700 part_plate->update_slice_result_valid_state(true);
1701
1702 gcode_result->reset();
1703 fff_print->export_gcode(calib_temp_file(gcode_filename), gcode_result, nullptr);
1704
1705 std::vector<ThumbnailData*> thumbnails;
1706 PlateDataPtrs plate_data_list;
1707 partplate_list.store_to_3mf_structure(plate_data_list, true, 0);
1708
1709 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
1710 if (!dev) {
1711 error_message = _L("Need select printer");
1712 return false;
1713 }
1714
1715 MachineObject *obj_ = dev->get_selected_machine();
1716 if (obj_ == nullptr) {
1717 error_message = _L("Need select printer");
1718 return false;
1719 }
1720
1721 for (auto plate_data : plate_data_list) {
1722 plate_data->gcode_file = calib_temp_file(gcode_filename);
1723 plate_data->is_sliced_valid = true;
1724 plate_data->printer_model_id = obj_->printer_type;
1725 FilamentInfo& filament_info = plate_data->slice_filaments_info.front();
1726 filament_info.type = full_config.opt_string("filament_type", 0);
1727 }
1728
1729 //draw thumbnails
1730 {
1731 GLVolumeCollection glvolume_collection;
1732 std::vector<ColorRGBA> colors_out(1);
1733 unsigned char rgb_color[4] = {255, 255, 255, 255};
1734 ColorRGBA new_color {1.0f, 1.0f, 1.0f, 1.0f};
1735 colors_out.push_back(new_color);
1736
1737 ThumbnailData* thumbnail_data = &plate_data_list[0]->plate_thumbnail;
1738 unsigned int thumbnail_width = 512, thumbnail_height = 512;
1739 const ThumbnailsParams thumbnail_params = {{}, false, true, true, true, 0};
1740 GLShaderProgram* shader = wxGetApp().get_shader("thumbnail");
1741
1742 for (unsigned int obj_idx = 0; obj_idx < (unsigned int)model->objects.size(); ++ obj_idx) {
1743 const ModelObject &model_object = *model->objects[obj_idx];
1744
1745 for (int volume_idx = 0; volume_idx < (int)model_object.volumes.size(); ++ volume_idx) {
1746 const ModelVolume &model_volume = *model_object.volumes[volume_idx];
1747 for (int instance_idx = 0; instance_idx < (int)model_object.instances.size(); ++ instance_idx) {
1748 const ModelInstance &model_instance = *model_object.instances[instance_idx];
1749 glvolume_collection.load_object_volume(&model_object, obj_idx, volume_idx, instance_idx, "volume", true, false, true);
1750 glvolume_collection.volumes.back()->set_render_color(new_color);
1751 glvolume_collection.volumes.back()->set_color(new_color);
1752 //glvolume_collection.volumes.back()->printable = model_instance.printable;
1753 }
1754 }
1755 }
1756
1758 {
1760 {
1761 BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": framebuffer_type: ARB");
1763 thumbnail_width, thumbnail_height, thumbnail_params,
1764 partplate_list, model->objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho);
1765 break;
1766 }
1768 {
1769 BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": framebuffer_type: EXT");
1771 thumbnail_width, thumbnail_height, thumbnail_params,
1772 partplate_list, model->objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho);
1773 break;
1774 }
1775 default:{
1776 BOOST_LOG_TRIVIAL(info) << __FUNCTION__<< boost::format(": framebuffer_type: others");
1777 Slic3r::GUI::GLCanvas3D::render_thumbnail_legacy(*thumbnail_data, thumbnail_width, thumbnail_height, thumbnail_params, partplate_list, model->objects, glvolume_collection, colors_out, shader, Slic3r::GUI::Camera::EType::Ortho);
1778 break;
1779 }
1780 }
1781 thumbnails.push_back(thumbnail_data);
1782 }
1783
1784 StoreParams store_params;
1785 store_params.path = calib_temp_file(model_filename);
1786 store_params.model = model;
1787 store_params.plate_data_list = plate_data_list;
1788 store_params.config = &new_print_config;
1789
1790 store_params.export_plate_idx = 0;
1791 store_params.thumbnail_data = thumbnails;
1792
1793
1795
1796 bool success = Slic3r::store_bbs_3mf(store_params);
1797
1799 store_params.path = calib_temp_file(config_filename);
1800 success = Slic3r::store_bbs_3mf(store_params);
1801
1802 release_PlateData_list(plate_data_list);
1803 return true;
1804}
static unsigned int count
Definition AuxiliaryDataViewModel.cpp:246
static void render_thumbnail_framebuffer_ext(ThumbnailData &thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams &thumbnail_params, PartPlateList &partplate_list, ModelObjectPtrs &model_objects, const GLVolumeCollection &volumes, std::vector< ColorRGBA > &extruder_colors, GLShaderProgram *shader, Camera::EType camera_type, Camera::ViewAngleType camera_view_angle_type=Camera::ViewAngleType::Iso, bool for_picking=false, bool ban_light=false)
Definition GLCanvas3D.cpp:7250
static void render_thumbnail_framebuffer(ThumbnailData &thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams &thumbnail_params, PartPlateList &partplate_list, ModelObjectPtrs &model_objects, const GLVolumeCollection &volumes, std::vector< ColorRGBA > &extruder_colors, GLShaderProgram *shader, Camera::EType camera_type, Camera::ViewAngleType camera_view_angle_type=Camera::ViewAngleType::Iso, bool for_picking=false, bool ban_light=false)
Definition GLCanvas3D.cpp:7137
static void render_thumbnail_legacy(ThumbnailData &thumbnail_data, unsigned int w, unsigned int h, const ThumbnailsParams &thumbnail_params, PartPlateList &partplate_list, ModelObjectPtrs &model_objects, const GLVolumeCollection &volumes, std::vector< ColorRGBA > &extruder_colors, GLShaderProgram *shader, Camera::EType camera_type, Camera::ViewAngleType camera_view_angle_type=Camera::ViewAngleType::Iso, bool for_picking=false, bool ban_light=false)
Definition GLCanvas3D.cpp:7359
static EFramebufferType get_framebuffers_type()
Definition OpenGLManager.hpp:102
@ Arb
Definition OpenGLManager.hpp:23
@ Ext
Definition OpenGLManager.hpp:24
void get_print(PrintBase **print, GCodeResult **result, int *index)
Definition PartPlate.cpp:4361
void update_slice_result_valid_state(bool valid=false)
Definition PartPlate.cpp:5423
static const std::string model_filename
Definition CalibUtils.cpp:82
static const std::string gcode_filename
Definition CalibUtils.cpp:81
static std::string calib_temp_file(const std::string &name)
Definition CalibUtils.cpp:79
static const std::string config_filename
Definition CalibUtils.cpp:83
static bool check_nozzle_diameter_and_type(const DynamicPrintConfig &full_config, wxString &error_msg)
Definition CalibUtils.cpp:332
GCodeProcessorResult GCodeResult
Definition PartPlate.hpp:98
std::vector< PlateData * > PlateDataPtrs
Definition bbs_3mf.hpp:278
void release_PlateData_list(PlateDataPtrs &plate_data_list)
Definition bbs_3mf.cpp:9740
bool store_bbs_3mf(StoreParams &store_params)
Definition bbs_3mf.cpp:9723
@ ptFFF
Definition Config.hpp:231
@ WithGcode
Definition bbs_3mf.hpp:169
@ SkipAuxiliary
Definition bbs_3mf.hpp:174
@ Silence
Definition bbs_3mf.hpp:170
@ WithSliceInfo
Definition bbs_3mf.hpp:173
@ SkipModel
Definition bbs_3mf.hpp:172
@ SplitModel
Definition bbs_3mf.hpp:183
Pointfs make_counter_clockwise(const Pointfs &pointfs)
Definition ClipperUtils.cpp:1568
Eigen::Matrix< int32_t, 3, 1, Eigen::DontAlign > Vec3i32
Definition Point.hpp:59
void reset()
Definition GCodeProcessor.cpp:2677
@ Ortho
Definition Camera.hpp:39

References _L, Slic3r::PrintBase::apply(), Slic3r::GUI::OpenGLManager::Arb, Slic3r::Model::bounding_box_exact(), Slic3r::Calib_Auto_PA_Line, Slic3r::Calib_PA_Line, Slic3r::Calib_PA_Pattern, Slic3r::Model::calib_pa_pattern, Slic3r::GUI::calib_temp_file(), Slic3r::BoundingBox3Base< PointType >::center(), Slic3r::GUI::check_nozzle_diameter_and_type(), Slic3r::StoreParams::config, Slic3r::GUI::config_filename, count, Slic3r::Calib_Params::end, Slic3r::Print::export_gcode(), Slic3r::StoreParams::export_plate_idx, Slic3r::GUI::OpenGLManager::Ext, Slic3r::GUI::gcode_filename, Slic3r::GUI::OpenGLManager::get_framebuffers_type(), Slic3r::ModelInstance::get_offset(), Slic3r::GUI::PartPlateList::get_plate(), Slic3r::GUI::PartPlate::get_print(), Slic3r::DeviceManager::get_selected_machine(), Slic3r::ModelObject::instances, Slic3r::Print::is_BBL_printer(), Slic3r::GLVolumeCollection::load_object_volume(), Slic3r::make_counter_clockwise(), Slic3r::Calib_Params::mode, Slic3r::StoreParams::model, Slic3r::GUI::model_filename, Slic3r::Model::objects, Slic3r::offset(), Slic3r::DynamicConfig::opt(), Slic3r::DynamicConfig::opt_float(), Slic3r::DynamicConfig::opt_string(), Slic3r::ConfigBase::option(), Slic3r::GUI::Camera::Ortho, Slic3r::StoreParams::path, Slic3r::StoreParams::plate_data_list, Slic3r::MachineObject::printer_type, Slic3r::Print::process(), Slic3r::ptFFF, Slic3r::release_PlateData_list(), Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer(), Slic3r::GUI::GLCanvas3D::render_thumbnail_framebuffer_ext(), Slic3r::GUI::GLCanvas3D::render_thumbnail_legacy(), Slic3r::GCodeProcessorResult::reset(), Slic3r::GUI::PartPlateList::reset_size(), Slic3r::Print::set_calib_params(), Slic3r::ModelInstance::set_offset(), Slic3r::Silence, Slic3r::SkipAuxiliary, Slic3r::SkipModel, Slic3r::SplitModel, Slic3r::Calib_Params::start, Slic3r::Calib_Params::step, Slic3r::store_bbs_3mf(), Slic3r::GUI::PartPlateList::store_to_3mf_structure(), Slic3r::StoreParams::strategy, Slic3r::StoreParams::thumbnail_data, Slic3r::FilamentGroupUtils::FilamentInfo::type, Slic3r::Model::update_print_volume_state(), Slic3r::GUI::PartPlate::update_slice_result_valid_state(), Slic3r::ConfigOptionVector< T >::values, Slic3r::GLVolumeCollection::volumes, Slic3r::ModelObject::volumes, Slic3r::WithGcode, and Slic3r::WithSliceInfo.

Referenced by calib_flowrate(), calib_generic_auto_pa_cali(), calib_generic_PA(), calib_max_vol_speed(), calib_retraction(), calib_temptue(), and calib_VFA().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ select_PA_calib_result()

void Slic3r::GUI::CalibUtils::select_PA_calib_result ( const PACalibIndexInfo & pa_calib_info)
static
648{
649 DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
650 if (!dev)
651 return;
652
653 MachineObject* obj_ = dev->get_selected_machine();
654 if (obj_ == nullptr)
655 return;
656
657 obj_->commnad_select_pa_calibration(pa_calib_info);
658}

References Slic3r::MachineObject::commnad_select_pa_calibration(), and Slic3r::DeviceManager::get_selected_machine().

Referenced by Slic3r::GUI::AMSMaterialsSetting::on_select_ok(), and Slic3r::GUI::AMSMaterialsSetting::on_select_reset().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_to_print() [1/2]

void Slic3r::GUI::CalibUtils::send_to_print ( const CalibInfo & calib_info,
wxString & error_message,
int flow_ratio_mode = 0 )
staticprivate
1807{
1808 { // before send
1809 json j;
1810 j["print"]["cali_mode"] = calib_info.params.mode;
1811 j["print"]["start"] = calib_info.params.start;
1812 j["print"]["end"] = calib_info.params.end;
1813 j["print"]["step"] = calib_info.params.step;
1814 j["print"]["print_numbers"] = calib_info.params.print_numbers;
1815 j["print"]["flow_ratio_mode"] = flow_ratio_mode;
1816 j["print"]["tray_id"] = calib_info.select_ams;
1817 j["print"]["dev_id"] = calib_info.dev_id;
1818 j["print"]["bed_type"] = calib_info.bed_type;
1819 j["print"]["printer_prest"] = calib_info.printer_prest ? calib_info.printer_prest->name : "";
1820 j["print"]["filament_prest"] = calib_info.filament_prest ? calib_info.filament_prest->name : "";
1821 j["print"]["print_prest"] = calib_info.print_prest ? calib_info.print_prest->name : "";
1822 BOOST_LOG_TRIVIAL(info) << "send_cali_job - before send: " << j.dump();
1823 }
1824
1825 std::string dev_id = calib_info.dev_id;
1826 std::string select_ams = calib_info.select_ams;
1827 std::shared_ptr<ProgressIndicator> process_bar = calib_info.process_bar;
1828 BedType bed_type = calib_info.bed_type;
1829
1830 DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
1831 if (!dev) {
1832 error_message = _L("Need select printer");
1833 return;
1834 }
1835
1836 MachineObject* obj_ = dev->get_selected_machine();
1837 if (obj_ == nullptr) {
1838 error_message = _L("Need select printer");
1839 return;
1840 }
1841
1842 if (obj_->is_in_upgrading()) {
1843 error_message = _L("Cannot send a print job while the printer is updating firmware.");
1844 return;
1845 }
1846 else if (obj_->is_system_printing()) {
1847 error_message = _L("The printer is executing instructions. Please restart printing after it ends.");
1848 return;
1849 }
1850 else if (obj_->is_in_printing()) {
1851 error_message = _L("The printer is busy with another print job.");
1852 return;
1853 }
1854
1855 else if (!obj_->GetConfig()->SupportPrintWithoutSD() && (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD)) {
1856 error_message = _L("Storage needs to be inserted before printing.");
1857 return;
1858 }
1859 if (obj_->is_lan_mode_printer()) {
1860 if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) {
1861 error_message = _L("Storage needs to be inserted before printing via LAN.");
1862 return;
1863 }
1864 }
1865
1866 print_worker = std::make_unique<PlaterWorker<BoostThreadWorker>>(wxGetApp().plater(), std::move(process_bar), "calib_worker");
1867
1868 auto print_job = std::make_unique<PrintJob>(dev_id);
1869 print_job->m_dev_ip = obj_->get_dev_ip();
1870 print_job->m_ftp_folder = obj_->get_ftp_folder();
1871 print_job->m_access_code = obj_->get_access_code();
1872
1873
1874#if !BBL_RELEASE_TO_PUBLIC
1875 print_job->m_local_use_ssl_for_ftp = wxGetApp().app_config->get("enable_ssl_for_ftp") == "true" ? true : false;
1876 print_job->m_local_use_ssl = wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false;
1877#else
1878 print_job->m_local_use_ssl_for_ftp = obj_->local_use_ssl_for_ftp;
1879 print_job->m_local_use_ssl = obj_->local_use_ssl;
1880#endif
1881
1882 print_job->connection_type = obj_->connection_type();
1883 print_job->cloud_print_only = obj_->is_support_cloud_print_only;
1884
1885 PrintPrepareData job_data;
1886 job_data.is_from_plater = false;
1887 job_data.plate_idx = 0;
1888 job_data._3mf_config_path = calib_temp_file(config_filename);
1889 job_data._3mf_path = calib_temp_file(model_filename);
1890 job_data._temp_path = calib_temp_dir();
1891
1892 PlateListData plate_data;
1893 plate_data.is_valid = true;
1894 plate_data.plate_count = 1;
1895 plate_data.cur_plate_index = 0;
1896 plate_data.bed_type = bed_type;
1897
1898 print_job->job_data = job_data;
1899 print_job->plate_data = plate_data;
1900 print_job->m_print_type = "from_normal";
1901
1902 print_job->task_ams_mapping = "[" + select_ams + "]";
1903 print_job->task_ams_mapping_info = "";
1904 print_job->task_use_ams = !devPrinterUtil::IsVirtualSlot(select_ams);
1905
1906 std::string new_ams_mapping = "[{\"ams_id\":" + std::to_string(calib_info.ams_id) + ", \"slot_id\":" + std::to_string(calib_info.slot_id) + "}]";
1907 print_job->task_ams_mapping2 = new_ams_mapping;
1908
1909 CalibMode cali_mode = calib_info.params.mode;
1910 print_job->m_project_name = get_calib_mode_name(cali_mode, flow_ratio_mode);
1911 print_job->set_calibration_task(true);
1912
1913 print_job->sdcard_state = obj_->GetStorage()->get_sdcard_state();
1914 print_job->has_sdcard = wxGetApp().app_config->get("allow_abnormal_storage") == "true"
1915 ? (print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_NORMAL
1916 || print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL)
1917 : print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_NORMAL;
1918 print_job->could_emmc_print = obj_->can_use_emmc_print();
1919 print_job->set_print_config(MachineBedTypeString[bed_type], true, false, false, false, true, false, 0, 0, 0);
1920 print_job->set_print_job_finished_event(wxGetApp().plater()->get_send_calibration_finished_event(), print_job->m_project_name);
1921
1922 { // after send: record the print job
1923 json j;
1924 j["print"]["project_name"] = print_job->m_project_name;
1925 j["print"]["is_cali_task"] = print_job->m_is_calibration_task;
1926 BOOST_LOG_TRIVIAL(info) << "send_cali_job - after send: " << j.dump();
1927 }
1928
1929 replace_job(*print_worker, std::move(print_job));
1930}
@ HAS_SDCARD_NORMAL
Definition DevStorage.h:19
@ HAS_SDCARD_ABNORMAL
Definition DevStorage.h:20
@ NO_SDCARD
Definition DevStorage.h:18
static std::unique_ptr< Worker > print_worker
Definition CalibUtils.hpp:46
static bool IsVirtualSlot(int ams_id)
Definition DevDefs.h:165
static const std::string & calib_temp_dir()
Definition CalibUtils.cpp:74
static Plater * plater()
Definition GUI_Factories.cpp:400
std::string get_calib_mode_name(CalibMode cali_mode, int stage)
Definition CalibUtils.cpp:250
static std::string MachineBedTypeString[7]
Definition CalibUtils.cpp:85
bool replace_job(Worker &w, Args &&...args)
Definition Worker.hpp:99
CalibMode
Definition calib.hpp:23
BedType
Definition PrintConfig.hpp:507

References Slic3r::GUI::PrintPrepareData::_3mf_config_path, Slic3r::GUI::PrintPrepareData::_3mf_path, _L, Slic3r::GUI::PrintPrepareData::_temp_path, Slic3r::GUI::CalibInfo::ams_id, Slic3r::GUI::CalibInfo::bed_type, Slic3r::GUI::PlateListData::bed_type, Slic3r::GUI::calib_temp_dir(), Slic3r::GUI::calib_temp_file(), Slic3r::MachineObject::can_use_emmc_print(), Slic3r::GUI::config_filename, Slic3r::MachineObject::connection_type(), Slic3r::GUI::PlateListData::cur_plate_index, Slic3r::GUI::CalibInfo::dev_id, Slic3r::Calib_Params::end, Slic3r::GUI::CalibInfo::filament_prest, Slic3r::MachineObject::get_access_code(), Slic3r::GUI::get_calib_mode_name(), Slic3r::MachineObject::get_dev_ip(), Slic3r::MachineObject::get_ftp_folder(), Slic3r::DevStorage::get_sdcard_state(), Slic3r::DeviceManager::get_selected_machine(), Slic3r::MachineObject::GetConfig(), Slic3r::MachineObject::GetStorage(), Slic3r::DevStorage::HAS_SDCARD_ABNORMAL, Slic3r::DevStorage::HAS_SDCARD_NORMAL, Slic3r::GUI::PrintPrepareData::is_from_plater, Slic3r::MachineObject::is_in_printing(), Slic3r::MachineObject::is_in_upgrading(), Slic3r::MachineObject::is_lan_mode_printer(), Slic3r::MachineObject::is_support_cloud_print_only, Slic3r::MachineObject::is_system_printing(), Slic3r::GUI::PlateListData::is_valid, Slic3r::devPrinterUtil::IsVirtualSlot(), Slic3r::MachineObject::local_use_ssl, Slic3r::MachineObject::local_use_ssl_for_ftp, Slic3r::GUI::MachineBedTypeString, Slic3r::Calib_Params::mode, Slic3r::GUI::model_filename, Slic3r::Preset::name, Slic3r::DevStorage::NO_SDCARD, Slic3r::GUI::CalibInfo::params, Slic3r::GUI::PlateListData::plate_count, Slic3r::GUI::PrintPrepareData::plate_idx, Slic3r::GUI::plater(), Slic3r::Calib_Params::print_numbers, Slic3r::GUI::CalibInfo::print_prest, print_worker, Slic3r::GUI::CalibInfo::printer_prest, Slic3r::GUI::CalibInfo::process_bar, Slic3r::GUI::replace_job(), Slic3r::GUI::CalibInfo::select_ams, Slic3r::GUI::CalibInfo::slot_id, Slic3r::Calib_Params::start, Slic3r::Calib_Params::step, and Slic3r::DevConfig::SupportPrintWithoutSD().

Referenced by calib_flowrate(), calib_generic_auto_pa_cali(), calib_generic_PA(), calib_max_vol_speed(), calib_retraction(), calib_temptue(), and calib_VFA().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_to_print() [2/2]

void Slic3r::GUI::CalibUtils::send_to_print ( const std::vector< CalibInfo > & calib_infos,
wxString & error_message,
int flow_ratio_mode = 0 )
staticprivate
1933{
1934 std::string dev_id = calib_infos[0].dev_id;
1935 std::shared_ptr<ProgressIndicator> process_bar = calib_infos[0].process_bar;
1936 BedType bed_type = calib_infos[0].bed_type;
1937
1938 DeviceManager *dev = Slic3r::GUI::wxGetApp().getDeviceManager();
1939 if (!dev) {
1940 error_message = _L("Need select printer");
1941 return;
1942 }
1943
1944 MachineObject *obj_ = dev->get_selected_machine();
1945 if (obj_ == nullptr) {
1946 error_message = _L("Need select printer");
1947 return;
1948 }
1949
1950 if (obj_->is_in_upgrading()) {
1951 error_message = _L("Cannot send a print job while the printer is updating firmware.");
1952 return;
1953 } else if (obj_->is_system_printing()) {
1954 error_message = _L("The printer is executing instructions. Please restart printing after it ends.");
1955 return;
1956 } else if (obj_->is_in_printing()) {
1957 error_message = _L("The printer is busy with another print job.");
1958 return;
1959 }
1960
1961 else if (!obj_->GetConfig()->SupportPrintWithoutSD() && (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD)) {
1962 error_message = _L("Storage needs to be inserted before printing.");
1963 return;
1964 }
1965 if (obj_->is_lan_mode_printer()) {
1966 if (obj_->GetStorage()->get_sdcard_state() == DevStorage::SdcardState::NO_SDCARD) {
1967 error_message = _L("Storage needs to be inserted before printing via LAN.");
1968 return;
1969 }
1970 }
1971
1972 print_worker = std::make_unique<PlaterWorker<BoostThreadWorker>>(wxGetApp().plater(), std::move(process_bar), "calib_worker");
1973
1974 auto print_job = std::make_shared<PrintJob>(dev_id);
1975 print_job->m_dev_ip = obj_->get_dev_ip();
1976 print_job->m_ftp_folder = obj_->get_ftp_folder();
1977 print_job->m_access_code = obj_->get_access_code();
1978
1979#if !BBL_RELEASE_TO_PUBLIC
1980 print_job->m_local_use_ssl_for_ftp = wxGetApp().app_config->get("enable_ssl_for_ftp") == "true" ? true : false;
1981 print_job->m_local_use_ssl = wxGetApp().app_config->get("enable_ssl_for_mqtt") == "true" ? true : false;
1982#else
1983 print_job->m_local_use_ssl_for_ftp = obj_->local_use_ssl_for_ftp;
1984 print_job->m_local_use_ssl = obj_->local_use_ssl;
1985#endif
1986
1987 print_job->connection_type = obj_->connection_type();
1988 print_job->cloud_print_only = obj_->is_support_cloud_print_only;
1989
1990 PrintPrepareData job_data;
1991 job_data.is_from_plater = false;
1992 job_data.plate_idx = 0;
1993 job_data._3mf_config_path = calib_temp_file(config_filename);
1994 job_data._3mf_path = calib_temp_file(model_filename);
1995 job_data._temp_path = calib_temp_dir();
1996
1997 PlateListData plate_data;
1998 plate_data.is_valid = true;
1999 plate_data.plate_count = 1;
2000 plate_data.cur_plate_index = 0;
2001 plate_data.bed_type = bed_type;
2002
2003 print_job->job_data = job_data;
2004 print_job->plate_data = plate_data;
2005 print_job->m_print_type = "from_normal";
2006
2007 // set AMS mapping
2008 std::string select_ams = "[";
2009 std::string new_select_ams = "[";
2010 for (size_t i = 0; i < calib_infos.size(); ++i) {
2011 select_ams += calib_infos[i].select_ams;
2012 new_select_ams += "{\"ams_id\":" + std::to_string(calib_infos[i].ams_id) + ", \"slot_id\":" + std::to_string(calib_infos[i].slot_id) + "}";
2013 if (i != calib_infos.size() - 1) {
2014 select_ams += ",";
2015 new_select_ams += ",";
2016 }
2017 }
2018 select_ams += "]";
2019 new_select_ams += "]";
2020 print_job->task_ams_mapping = select_ams;
2021 print_job->task_ams_mapping_info = "";
2022 print_job->task_ams_mapping2 = new_select_ams;
2023
2024 print_job->task_use_ams = false;
2025 for (const CalibInfo& calib_info : calib_infos) {
2026 if (calib_info.select_ams != VIRTUAL_AMS_MAIN_ID_STR && calib_info.select_ams != VIRTUAL_AMS_DEPUTY_ID_STR) {
2027 print_job->task_use_ams = true;
2028 break;
2029 }
2030 }
2031
2032 CalibMode cali_mode = calib_infos[0].params.mode;
2033 print_job->m_project_name = get_calib_mode_name(cali_mode, flow_ratio_mode);
2034 print_job->set_calibration_task(true);
2035
2036 print_job->sdcard_state = obj_->GetStorage()->get_sdcard_state();
2037 print_job->has_sdcard = wxGetApp().app_config->get("allow_abnormal_storage") == "true"
2038 ? (print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_NORMAL
2039 || print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_ABNORMAL)
2040 : print_job->sdcard_state == DevStorage::SdcardState::HAS_SDCARD_NORMAL;
2041 print_job->could_emmc_print = obj_->can_use_emmc_print();
2042 print_job->set_print_config(MachineBedTypeString[bed_type], true, true, false, false, true, false, 0, 1, 0);
2043 print_job->set_print_job_finished_event(wxGetApp().plater()->get_send_calibration_finished_event(), print_job->m_project_name);
2044
2045 { // after send: record the print job
2046 json j;
2047 j["print"]["ams_mapping"] = print_job->task_ams_mapping;
2048 j["print"]["ams_mapping_2"] = print_job->task_ams_mapping2;
2049 j["print"]["project_name"] = print_job->m_project_name;
2050 j["print"]["is_cali_task"] = print_job->m_is_calibration_task;
2051 BOOST_LOG_TRIVIAL(info) << "send_cali_job - after send: " << j.dump();
2052 }
2053
2054 replace_job(*print_worker, std::move(print_job));
2055}
#define VIRTUAL_AMS_DEPUTY_ID_STR
Definition DevDefs.h:93
#define VIRTUAL_AMS_MAIN_ID_STR
Definition DevDefs.h:92

References Slic3r::GUI::PrintPrepareData::_3mf_config_path, Slic3r::GUI::PrintPrepareData::_3mf_path, _L, Slic3r::GUI::PrintPrepareData::_temp_path, Slic3r::GUI::PlateListData::bed_type, Slic3r::GUI::calib_temp_dir(), Slic3r::GUI::calib_temp_file(), Slic3r::MachineObject::can_use_emmc_print(), Slic3r::GUI::config_filename, Slic3r::MachineObject::connection_type(), Slic3r::GUI::PlateListData::cur_plate_index, Slic3r::MachineObject::get_access_code(), Slic3r::GUI::get_calib_mode_name(), Slic3r::MachineObject::get_dev_ip(), Slic3r::MachineObject::get_ftp_folder(), Slic3r::DevStorage::get_sdcard_state(), Slic3r::DeviceManager::get_selected_machine(), Slic3r::MachineObject::GetConfig(), Slic3r::MachineObject::GetStorage(), Slic3r::DevStorage::HAS_SDCARD_ABNORMAL, Slic3r::DevStorage::HAS_SDCARD_NORMAL, Slic3r::GUI::PrintPrepareData::is_from_plater, Slic3r::MachineObject::is_in_printing(), Slic3r::MachineObject::is_in_upgrading(), Slic3r::MachineObject::is_lan_mode_printer(), Slic3r::MachineObject::is_support_cloud_print_only, Slic3r::MachineObject::is_system_printing(), Slic3r::GUI::PlateListData::is_valid, Slic3r::MachineObject::local_use_ssl, Slic3r::MachineObject::local_use_ssl_for_ftp, Slic3r::GUI::MachineBedTypeString, Slic3r::GUI::model_filename, Slic3r::DevStorage::NO_SDCARD, Slic3r::GUI::PlateListData::plate_count, Slic3r::GUI::PrintPrepareData::plate_idx, Slic3r::GUI::plater(), print_worker, Slic3r::GUI::replace_job(), Slic3r::DevConfig::SupportPrintWithoutSD(), VIRTUAL_AMS_DEPUTY_ID_STR, and VIRTUAL_AMS_MAIN_ID_STR.

Here is the call graph for this function:

◆ set_for_auto_pa_model_and_config()

void Slic3r::GUI::CalibUtils::set_for_auto_pa_model_and_config ( const std::vector< CalibInfo > & calib_info,
DynamicPrintConfig & full_config,
Model & model )
static
896{
897 DynamicPrintConfig print_config = calib_infos[0].print_prest->config;
898
899 float nozzle_diameter = full_config.option<ConfigOptionFloats>("nozzle_diameter")->get_at(0);
900 int extruder_count = full_config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
901
902 const auto& config_pattern = SuggestedConfigCalibPAPattern();
903
904 for (const auto& opt : config_pattern.floats_pairs) { print_config.set_key_value(opt.first, new ConfigOptionFloatsNullable(opt.second)); }
905
906 std::vector<CalibInfo> sorted_calib_infos = calib_infos;
907 std::sort(sorted_calib_infos.begin(), sorted_calib_infos.end(), [](const CalibInfo &left_item, const CalibInfo &right_item) {
908 return left_item.index < right_item.index;
909 });
910
911 for (const CalibInfo &calib_info : calib_infos) {
912 int index = get_index_for_extruder_parameter(print_config, "outer_wall_speed", calib_info.extruder_id, calib_info.extruder_type, calib_info.nozzle_volume_type);
913 float wall_speed = CalibPressureAdvance::find_optimal_PA_speed(full_config, print_config.get_abs_value("line_width"), print_config.get_abs_value("layer_height"),
914 calib_info.extruder_id, 0);
915
916 ConfigOptionFloatsNullable *wall_speed_speed_opt = print_config.option<ConfigOptionFloatsNullable>("outer_wall_speed");
917 std::vector<double> new_speeds = wall_speed_speed_opt->values;
918 new_speeds[index] = wall_speed;
919 ModelObject* object = model.objects[calib_info.index];
920 object->config.set_key_value("outer_wall_speed", new ConfigOptionFloatsNullable(new_speeds));
921 }
922
923 for (const auto& opt : config_pattern.nozzle_ratio_pairs) {
924 print_config.set_key_value(opt.first, new ConfigOptionFloatOrPercent(nozzle_diameter * opt.second / 100, false));
925 }
926
927 for (const auto& opt : config_pattern.int_pairs) { print_config.set_key_value(opt.first, new ConfigOptionInt(opt.second)); }
928
929 print_config.set_key_value(config_pattern.brim_pair.first, new ConfigOptionEnum<BrimType>(config_pattern.brim_pair.second));
930
931 auto* _wall_generator = print_config.option<ConfigOptionEnum<PerimeterGeneratorType>>("wall_generator");
932 _wall_generator->value = PerimeterGeneratorType::Arachne;
933
934 print_config.option<ConfigOptionBool>("enable_prime_tower")->value = false;
935 print_config.option<ConfigOptionBool>("enable_wrapping_detection")->value = false;
936
937 auto get_new_filament_id = [&sorted_calib_infos](int index) -> int {
938 for (size_t i = 0; i < sorted_calib_infos.size(); ++i) {
939 if (index == sorted_calib_infos[i].index) {
940 return (int) (i + 1); // 1 base filament_id
941 }
942 }
943 return 0;
944 };
945
946 // set printable and reset filament_id
947 for (size_t i = 0; i < model.objects.size(); ++i) {
948 auto iter = std::find_if(calib_infos.begin(), calib_infos.end(), [i](const CalibInfo &item) { return item.index == i; });
949
950 if (iter == calib_infos.end()) {
951 model.objects[i]->printable = false;
952 } else {
953 ModelObject *object = model.objects[i];
954 object->config.set_key_value("extruder", new ConfigOptionInt(get_new_filament_id(iter->index)));
955 for (auto *volume : object->volumes) {
956 if (volume->config.has("extruder")) volume->config.erase("extruder");
957 }
958 }
959 }
960
961 // DynamicPrintConfig full_config;
962 full_config.apply(print_config);
963 full_config.option<ConfigOptionEnum<FilamentMapMode>>("filament_map_mode", true)->value = FilamentMapMode::fmmManual;
964
965 // nozzle volume type
966 std::vector<int>& nozzle_volume_types = full_config.option<ConfigOptionEnumsGeneric>("nozzle_volume_type", true)->values;
967 nozzle_volume_types.resize(extruder_count, NozzleVolumeType::nvtStandard);
968 auto nozzle_flush_dataset = full_config.option<ConfigOptionIntsNullable>("nozzle_flush_dataset", true)->values;
969 nozzle_flush_dataset.resize(extruder_count, 0);
970
971 int filament_nums = calib_infos.size();
972 std::vector<int> physical_extruder_maps = dynamic_cast<ConfigOptionInts *>(full_config.option("physical_extruder_map", true))->values;
973 for (size_t filament_index = 0; filament_index < calib_infos.size(); ++filament_index) {
974 CalibInfo calib_info = calib_infos[filament_index];
975 int extruder_id = calib_info.extruder_id;
976 for (size_t index = 0; index < extruder_count; ++index) {
977 if (physical_extruder_maps[index] == extruder_id) {
978 extruder_id = index;
979 break;
980 }
981 }
982 nozzle_volume_types[extruder_id] = (int)calib_info.nozzle_volume_type;
983 }
984
985 // filament map transform to 1 base
986 std::vector<int> &filament_maps = full_config.option<ConfigOptionInts>("filament_map", true)->values;
987 std::transform(filament_maps.begin(), filament_maps.end(), filament_maps.begin(), [](int value) { return value + 1; });
988
989 std::vector<std::string> &filament_colors = full_config.option<ConfigOptionStrings>("filament_colour")->values;
990 filament_colors.resize(sorted_calib_infos.size(), "#000000");
991 for (size_t i = 0; i < sorted_calib_infos.size(); ++i) {
992 filament_colors[i] = sorted_calib_infos[i].filament_color;
993 }
994
995 // Add flush volume matrix
996 std::vector<double> flush_matrix_vec;
997 for (int e_idx = 0; e_idx < extruder_count; ++e_idx) {
998 const std::vector<int> &min_flush_volumes = get_min_flush_volumes(full_config, e_idx);
999 for (size_t from_idx = 0; from_idx < filament_nums; ++from_idx) {
1000 for (size_t to_idx = 0; to_idx < filament_nums; ++to_idx) {
1001 if (from_idx == to_idx) {
1002 flush_matrix_vec.emplace_back(0);
1003 }
1004 else {
1005 Slic3r::FlushVolCalculator calculator(min_flush_volumes[from_idx], Slic3r::g_max_flush_volume, nozzle_flush_dataset[e_idx]);
1006 wxColour from = wxColour(filament_colors[from_idx]);
1007 wxColour to = wxColour(filament_colors[to_idx]);
1008 int volume = calculator.calc_flush_vol(from.Alpha(), from.Red(), from.Green(), from.Blue(), to.Alpha(), to.Red(), to.Green(), to.Blue());
1009 flush_matrix_vec.emplace_back(double(volume));
1010 }
1011 }
1012 }
1013
1014 }
1015 std::vector<double> &config_matrix = full_config.option<ConfigOptionFloats>("flush_volumes_matrix")->values;
1016 set_flush_volumes_matrix(config_matrix, flush_matrix_vec, -1, extruder_count);
1017}
size_t size() const override
Definition Config.hpp:722
void resize(size_t n, const ConfigOption *opt_default=nullptr) override
Definition Config.hpp:687
std::vector< int > get_min_flush_volumes(const DynamicPrintConfig &full_config, size_t nozzle_id)
Definition Plater.cpp:1246
const int g_max_flush_volume
Definition FlushVolCalc.cpp:15
@ nvtStandard
Definition PrintConfig.hpp:619
ConfigOptionEnumsGenericTempl< false > ConfigOptionEnumsGeneric
Definition Config.hpp:2311
ConfigOptionIntsTempl< true > ConfigOptionIntsNullable
Definition Config.hpp:1155
static void set_flush_volumes_matrix(std::vector< T > &out_matrix, const std::vector< T > &fv_matrix, size_t extruder_id=-1, size_t nozzle_nums=1)
Definition PrintConfig.hpp:2698
@ fmmManual
Definition PrintConfig.hpp:635
@ Arachne
Definition PrintConfig.hpp:487

References Slic3r::ConfigBase::apply(), Slic3r::Arachne, Slic3r::FlushVolCalculator::calc_flush_vol(), Slic3r::GUI::CalibInfo::extruder_id, Slic3r::CalibPressureAdvance::find_optimal_PA_speed(), Slic3r::fmmManual, Slic3r::g_max_flush_volume, Slic3r::ConfigBase::get_abs_value(), Slic3r::get_index_for_extruder_parameter(), Slic3r::GUI::get_min_flush_volumes(), Slic3r::nozzle_diameter(), Slic3r::GUI::CalibInfo::nozzle_volume_type, Slic3r::nvtStandard, Slic3r::Model::objects, Slic3r::ConfigBase::option(), Slic3r::set_flush_volumes_matrix(), Slic3r::DynamicConfig::set_key_value(), Slic3r::ConfigOptionSingle< T >::value, Slic3r::ConfigOptionVector< double >::values, and Slic3r::ModelObject::volumes.

Referenced by calib_generic_auto_pa_cali().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_PA_calib_result()

void Slic3r::GUI::CalibUtils::set_PA_calib_result ( const std::vector< PACalibResult > & pa_calib_values,
bool is_auto_cali )
static
635{
636 DeviceManager* dev = Slic3r::GUI::wxGetApp().getDeviceManager();
637 if (!dev)
638 return;
639
640 MachineObject* obj_ = dev->get_selected_machine();
641 if (obj_ == nullptr)
642 return;
643
644 obj_->command_set_pa_calibration(pa_calib_values, is_auto_cali);
645}

References Slic3r::MachineObject::command_set_pa_calibration(), and Slic3r::DeviceManager::get_selected_machine().

Referenced by Slic3r::GUI::PressureAdvanceWizard::on_cali_save(), and Slic3r::GUI::HistoryWindow::sync_history_data().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ validate_input_flow_ratio()

bool Slic3r::GUI::CalibUtils::validate_input_flow_ratio ( wxString flow_ratio,
float * output_value )
static
478 {
479 float default_flow_ratio = 1.0f;
480
481 if (flow_ratio.IsEmpty()) {
482 *output_value = default_flow_ratio;
483 return false;
484 }
485
486 double flow_ratio_value = 0.0;
487 try {
488 flow_ratio.ToDouble(&flow_ratio_value);
489 }
490 catch (...) {
491 ;
492 }
493
494 if (flow_ratio_value <= 0.0 || flow_ratio_value >= 2.0) {
495 *output_value = default_flow_ratio;
496 return false;
497 }
498
499 *output_value = flow_ratio_value;
500 return true;
501}

Referenced by Slic3r::GUI::CaliPresetCaliStagePanel::create_panel(), and Slic3r::GUI::CalibrationFlowX1SavePage::save_to_result_from_widgets().

Here is the caller graph for this function:

◆ validate_input_k_value()

bool Slic3r::GUI::CalibUtils::validate_input_k_value ( wxString k_text,
float * output_value )
static
453{
454 float default_k = 0.0f;
455 if (k_text.IsEmpty()) {
456 *output_value = default_k;
457 return false;
458 }
459
460 double k_value = 0.0;
461 try {
462 if(!k_text.ToDouble(&k_value))
463 return false;
464 }
465 catch (...) {
466 ;
467 }
468
469 if (k_value <= MIN_PA_K_VALUE || k_value >= MAX_PA_K_VALUE) {
470 *output_value = default_k;
471 return false;
472 }
473
474 *output_value = k_value;
475 return true;
476};
const double MAX_PA_K_VALUE
Definition CalibUtils.cpp:68

References Slic3r::GUI::MAX_PA_K_VALUE.

Referenced by Slic3r::GUI::CaliPASaveManualPanel::get_result(), Slic3r::GUI::CaliPASaveP1PPanel::get_result(), Slic3r::GUI::NewCalibrationHistoryDialog::on_ok(), Slic3r::GUI::EditCalibrationHistoryDialog::on_save(), and Slic3r::GUI::CaliPASaveAutoPanel::save_to_result_from_widgets().

Here is the caller graph for this function:

◆ validate_input_name()

bool Slic3r::GUI::CalibUtils::validate_input_name ( wxString name)
static
435{
436 if (name.Length() > 40) {
437 MessageDialog msg_dlg(nullptr, _L("The name cannot exceed 40 characters."), wxEmptyString, wxICON_WARNING | wxOK);
438 msg_dlg.ShowModal();
439 return false;
440 }
441
442 name.erase(std::remove(name.begin(), name.end(), L' '), name.end());
443 if (name.IsEmpty()) {
444 MessageDialog msg_dlg(nullptr, _L("The name cannot be empty."), wxEmptyString, wxICON_WARNING | wxOK);
445 msg_dlg.ShowModal();
446 return false;
447 }
448
449 return true;
450}
#define L(s)
Definition ExtrusionEntity.cpp:25

References _L, L, and Slic3r::GUI::DPIAware< P >::ShowModal().

Referenced by Slic3r::GUI::CaliPASaveManualPanel::get_result(), Slic3r::GUI::FlowRateWizard::on_cali_save(), Slic3r::GUI::MaxVolumetricSpeedWizard::on_cali_save(), Slic3r::GUI::NewCalibrationHistoryDialog::on_ok(), and Slic3r::GUI::EditCalibrationHistoryDialog::on_save().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ print_worker


The documentation for this class was generated from the following files:
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/Utils/CalibUtils.hpp
  • /home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/Utils/CalibUtils.cpp