diff --git a/resources/calib/filament_flow/Orca-LinearFlow.3mf b/resources/calib/filament_flow/Orca-LinearFlow.3mf index 2c8a10dca0..94f8e62fbf 100644 Binary files a/resources/calib/filament_flow/Orca-LinearFlow.3mf and b/resources/calib/filament_flow/Orca-LinearFlow.3mf differ diff --git a/resources/calib/filament_flow/flowrate-test-pass1.3mf b/resources/calib/filament_flow/flowrate-test-pass1.3mf index 56affe4f1c..20c997da02 100644 Binary files a/resources/calib/filament_flow/flowrate-test-pass1.3mf and b/resources/calib/filament_flow/flowrate-test-pass1.3mf differ diff --git a/resources/calib/filament_flow/flowrate-test-pass2.3mf b/resources/calib/filament_flow/flowrate-test-pass2.3mf index 4328e66304..9797849405 100644 Binary files a/resources/calib/filament_flow/flowrate-test-pass2.3mf and b/resources/calib/filament_flow/flowrate-test-pass2.3mf differ diff --git a/resources/calib/filament_flow/pass1.3mf b/resources/calib/filament_flow/pass1.3mf new file mode 100644 index 0000000000..794e534492 Binary files /dev/null and b/resources/calib/filament_flow/pass1.3mf differ diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 0fae5355b6..bb01635f65 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -2813,16 +2813,17 @@ void MainFrame::init_menubar_as_editor() }, "", nullptr, [this]() {return m_plater->is_view3D_shown();; }, this); auto flowrate_menu = new wxMenu(); - append_menu_item(flowrate_menu, wxID_ANY, _L("YOLO flowrate calibration"), _L("Orca YOLO flowrate calibration"), - [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate_linear(); }, "", nullptr, - [this]() {return m_plater->is_view3D_shown();; }, this); append_menu_item( - flowrate_menu, wxID_ANY, _L("Pass 1(deprecated)"), _L("Flow rate test - Pass 1(deprecated)"), + flowrate_menu, wxID_ANY, _L("Pass 1"), _L("Flow rate test - Pass 1"), [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate(1); }, "", nullptr, [this]() {return m_plater->is_view3D_shown();; }, this); - append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 2(deprecated)"), _L("Flow rate test - Pass 2(deprecated)"), + append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 2"), _L("Flow rate test - Pass 2"), [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate(2); }, "", nullptr, [this]() {return m_plater->is_view3D_shown();; }, this); + flowrate_menu->AppendSeparator(); + append_menu_item(flowrate_menu, wxID_ANY, _L("YOLO flowrate calibration"), _L("Orca YOLO flowrate calibration"), + [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate_linear(); }, "", nullptr, + [this]() {return m_plater->is_view3D_shown();; }, this); m_topbar->GetCalibMenu()->AppendSubMenu(flowrate_menu, _L("Flow rate")); append_menu_item(m_topbar->GetCalibMenu(), wxID_ANY, _L("Pressure advance"), _L("Pressure advance"), @@ -2905,18 +2906,19 @@ void MainFrame::init_menubar_as_editor() // Flowrate auto flowrate_menu = new wxMenu(); - append_menu_item(flowrate_menu, wxID_ANY, _L("YOLO flowrate calibration"), _L("Orca YOLO flowrate calibration"), - [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate_linear(); }, "", nullptr, - [this]() {return m_plater->is_view3D_shown();; }, this); - append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 1(deprecated)"), _L("Flow rate test - Pass 1(deprecated)"), + append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 1"), _L("Flow rate test - Pass 1"), [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate(1); }, "", nullptr, [this]() {return m_plater->is_view3D_shown();; }, this); - append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 2(deprecated)"), _L("Flow rate test - Pass 2(deprecated)"), + append_menu_item(flowrate_menu, wxID_ANY, _L("Pass 2"), _L("Flow rate test - Pass 2"), [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate(2); }, "", nullptr, [this]() {return m_plater->is_view3D_shown();; }, this); append_submenu(calib_menu,flowrate_menu,wxID_ANY,_L("Flow rate"),_L("Flow rate"),"", [this]() {return m_plater->is_view3D_shown();; }); - + flowrate_menu->AppendSeparator(); + append_menu_item(flowrate_menu, wxID_ANY, _L("YOLO flowrate calibration"), _L("Orca YOLO flowrate calibration"), + [this](wxCommandEvent&) { if (m_plater) m_plater->calib_flowrate_linear(); }, "", nullptr, + [this]() {return m_plater->is_view3D_shown();; }, this); + // PA append_menu_item(calib_menu, wxID_ANY, _L("Pressure advance"), _L("Pressure advance"), [this](wxCommandEvent&) { diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 175698f23e..778d4132f4 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -9631,6 +9631,104 @@ void Plater::_calib_pa_select_added_objects() { } } +// Adjust settings for flowrate calibration +// Parameter pass's value should be [0,1,2], while 0 means the new YOLO flowrate calibration +void adjust_settings_for_flowrate_calib(ModelObjectPtrs& objects, int pass) +{ +auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; + auto printerConfig = &wxGetApp().preset_bundle->printers.get_edited_preset().config; + auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; + + /// --- scale --- + // model is created for a 0.4 nozzle, scale z with nozzle size. + const ConfigOptionFloats* nozzle_diameter_config = printerConfig->option("nozzle_diameter"); + assert(nozzle_diameter_config->values.size() > 0); + float nozzle_diameter = nozzle_diameter_config->values[0]; + float xyScale = nozzle_diameter / 0.6; + //scale z to have 10 layers + // 2 bottom, 5 top, 3 sparse infill + double first_layer_height = print_config->option("initial_layer_print_height")->value; + double layer_height = nozzle_diameter / 2.0; // prefer 0.2 layer height for 0.4 nozzle + first_layer_height = std::max(first_layer_height, layer_height); + + float zscale = (first_layer_height + 9 * layer_height) / 2; + // only enlarge + if (xyScale > 1.2) { + for (auto _obj : objects) + _obj->scale(xyScale, xyScale, zscale); + } + else { + for (auto _obj : objects) + _obj->scale(1, 1, zscale); + } + + auto cur_flowrate = filament_config->option("filament_flow_ratio")->get_at(0); + Flow infill_flow = Flow(nozzle_diameter * 1.2f, layer_height, nozzle_diameter); + double filament_max_volumetric_speed = filament_config->option("filament_max_volumetric_speed")->get_at(0); + double max_infill_speed; + if(pass == 0) + max_infill_speed = filament_max_volumetric_speed / (infill_flow.mm3_per_mm() * (cur_flowrate+0.35)/cur_flowrate); + else + max_infill_speed = filament_max_volumetric_speed / (infill_flow.mm3_per_mm() * (pass == 1 ? 1.2 : 1)); + double internal_solid_speed = std::floor(std::min(print_config->opt_float("internal_solid_infill_speed"), max_infill_speed)); + double top_surface_speed = std::floor(std::min(print_config->opt_float("top_surface_speed"), max_infill_speed)); + + // adjust parameters + for (auto _obj : objects) { + _obj->ensure_on_bed(); + _obj->config.set_key_value("wall_loops", new ConfigOptionInt(1)); + _obj->config.set_key_value("only_one_wall_top", new ConfigOptionBool(true)); + _obj->config.set_key_value("thick_internal_bridges", new ConfigOptionBool(false)); + _obj->config.set_key_value("sparse_infill_density", new ConfigOptionPercent(35)); + _obj->config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(100,true)); + _obj->config.set_key_value("bottom_shell_layers", new ConfigOptionInt(2)); + _obj->config.set_key_value("top_shell_layers", new ConfigOptionInt(5)); + _obj->config.set_key_value("top_shell_thickness", new ConfigOptionFloat(0)); + _obj->config.set_key_value("bottom_shell_thickness", new ConfigOptionFloat(0)); + _obj->config.set_key_value("detect_thin_wall", new ConfigOptionBool(true)); + _obj->config.set_key_value("filter_out_gap_fill", new ConfigOptionFloat(0)); + _obj->config.set_key_value("sparse_infill_pattern", new ConfigOptionEnum(ipRectilinear)); + _obj->config.set_key_value("top_surface_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); + _obj->config.set_key_value("internal_solid_infill_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); + _obj->config.set_key_value("top_surface_pattern", new ConfigOptionEnum(ipMonotonic)); + _obj->config.set_key_value("top_solid_infill_flow_ratio", new ConfigOptionFloat(1.0f)); + _obj->config.set_key_value("infill_direction", new ConfigOptionFloat(45)); + _obj->config.set_key_value("solid_infill_direction", new ConfigOptionFloat(135)); + _obj->config.set_key_value("rotate_solid_infill_direction", new ConfigOptionBool(true)); + _obj->config.set_key_value("ironing_type", new ConfigOptionEnum(IroningType::NoIroning)); + _obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloat(internal_solid_speed)); + _obj->config.set_key_value("top_surface_speed", new ConfigOptionFloat(top_surface_speed)); + _obj->config.set_key_value("seam_slope_type", new ConfigOptionEnum(SeamScarfType::None)); + print_config->set_key_value("max_volumetric_extrusion_rate_slope", new ConfigOptionFloat(0)); + + // extract flowrate from name, filename format: flowrate_xxx + std::string obj_name = _obj->name; + assert(obj_name.length() > 9); + obj_name = obj_name.substr(9); + if (obj_name[0] == 'm') + obj_name[0] = '-'; + auto modifier = stof(obj_name); + if(pass == 0) + _obj->config.set_key_value("print_flow_ratio", new ConfigOptionFloat(1.0f + modifier/cur_flowrate)); + else + _obj->config.set_key_value("print_flow_ratio", new ConfigOptionFloat(1.0f + modifier/100.f)); + + } + + print_config->set_key_value("layer_height", new ConfigOptionFloat(layer_height)); + print_config->set_key_value("alternate_extra_wall", new ConfigOptionBool(false)); + print_config->set_key_value("initial_layer_print_height", new ConfigOptionFloat(first_layer_height)); + print_config->set_key_value("reduce_crossing_wall", new ConfigOptionBool(true)); + + + wxGetApp().get_tab(Preset::TYPE_PRINT)->update_dirty(); + wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_dirty(); + wxGetApp().get_tab(Preset::TYPE_PRINTER)->update_dirty(); + wxGetApp().get_tab(Preset::TYPE_PRINT)->reload_config(); + wxGetApp().get_tab(Preset::TYPE_FILAMENT)->reload_config(); + wxGetApp().get_tab(Preset::TYPE_PRINTER)->reload_config(); +} + void Plater::calib_flowrate(int pass) { if (pass != 1 && pass != 2) return; @@ -9645,87 +9743,7 @@ void Plater::calib_flowrate(int pass) { else add_model(false, (boost::filesystem::path(Slic3r::resources_dir()) / "calib" / "filament_flow" / "flowrate-test-pass2.3mf").string()); - auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; - auto printerConfig = &wxGetApp().preset_bundle->printers.get_edited_preset().config; - auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; - - /// --- scale --- - // model is created for a 0.4 nozzle, scale z with nozzle size. - const ConfigOptionFloats* nozzle_diameter_config = printerConfig->option("nozzle_diameter"); - assert(nozzle_diameter_config->values.size() > 0); - float nozzle_diameter = nozzle_diameter_config->values[0]; - float xyScale = nozzle_diameter / 0.6; - //scale z to have 8 layers - double first_layer_height = print_config->option("initial_layer_print_height")->value; - double layer_height = nozzle_diameter / 2.0; // prefer 0.2 layer height for 0.4 nozzle - first_layer_height = std::max(first_layer_height, layer_height); - - float zscale = (first_layer_height + 7 * layer_height) / 1.6; - // only enlarge - if (xyScale > 1.2) { - for (auto _obj : model().objects) - _obj->scale(xyScale, xyScale, zscale); - } - else { - for (auto _obj : model().objects) - _obj->scale(1, 1, zscale); - } - - Flow infill_flow = Flow(nozzle_diameter * 1.2f, layer_height, nozzle_diameter); - double filament_max_volumetric_speed = filament_config->option("filament_max_volumetric_speed")->get_at(0); - double max_infill_speed = filament_max_volumetric_speed / (infill_flow.mm3_per_mm() * (pass == 1 ? 1.2 : 1)); - double internal_solid_speed = std::floor(std::min(print_config->opt_float("internal_solid_infill_speed"), max_infill_speed)); - double top_surface_speed = std::floor(std::min(print_config->opt_float("top_surface_speed"), max_infill_speed)); - - // adjust parameters - for (auto _obj : model().objects) { - _obj->ensure_on_bed(); - _obj->config.set_key_value("wall_loops", new ConfigOptionInt(1)); - _obj->config.set_key_value("only_one_wall_top", new ConfigOptionBool(true)); - _obj->config.set_key_value("thick_internal_bridges", new ConfigOptionBool(false)); - _obj->config.set_key_value("sparse_infill_density", new ConfigOptionPercent(35)); - _obj->config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(100,true)); - _obj->config.set_key_value("bottom_shell_layers", new ConfigOptionInt(1)); - _obj->config.set_key_value("top_shell_layers", new ConfigOptionInt(4)); - _obj->config.set_key_value("top_shell_thickness", new ConfigOptionFloat(0)); - _obj->config.set_key_value("bottom_shell_thickness", new ConfigOptionFloat(0)); - _obj->config.set_key_value("detect_thin_wall", new ConfigOptionBool(true)); - _obj->config.set_key_value("filter_out_gap_fill", new ConfigOptionFloat(0)); - _obj->config.set_key_value("sparse_infill_pattern", new ConfigOptionEnum(ipRectilinear)); - _obj->config.set_key_value("top_surface_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); - _obj->config.set_key_value("internal_solid_infill_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); - _obj->config.set_key_value("top_surface_pattern", new ConfigOptionEnum(ipMonotonic)); - _obj->config.set_key_value("top_solid_infill_flow_ratio", new ConfigOptionFloat(1.0f)); - _obj->config.set_key_value("infill_direction", new ConfigOptionFloat(45)); - _obj->config.set_key_value("solid_infill_direction", new ConfigOptionFloat(135)); - _obj->config.set_key_value("rotate_solid_infill_direction", new ConfigOptionBool(true)); - _obj->config.set_key_value("ironing_type", new ConfigOptionEnum(IroningType::NoIroning)); - _obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloat(internal_solid_speed)); - _obj->config.set_key_value("top_surface_speed", new ConfigOptionFloat(top_surface_speed)); - _obj->config.set_key_value("seam_slope_type", new ConfigOptionEnum(SeamScarfType::None)); - print_config->set_key_value("max_volumetric_extrusion_rate_slope", new ConfigOptionFloat(0)); - - // extract flowrate from name, filename format: flowrate_xxx - std::string obj_name = _obj->name; - assert(obj_name.length() > 9); - obj_name = obj_name.substr(9); - if (obj_name[0] == 'm') - obj_name[0] = '-'; - auto modifier = stof(obj_name); - _obj->config.set_key_value("print_flow_ratio", new ConfigOptionFloat(1.0f + modifier/100.f)); - } - - print_config->set_key_value("layer_height", new ConfigOptionFloat(layer_height)); - print_config->set_key_value("alternate_extra_wall", new ConfigOptionBool(false)); - print_config->set_key_value("initial_layer_print_height", new ConfigOptionFloat(first_layer_height)); - print_config->set_key_value("reduce_crossing_wall", new ConfigOptionBool(true)); - //filament_config->set_key_value("filament_max_volumetric_speed", new ConfigOptionFloats{ 9. }); - - wxGetApp().get_tab(Preset::TYPE_PRINT)->update_dirty(); - wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_dirty(); - wxGetApp().get_tab(Preset::TYPE_PRINTER)->update_dirty(); - wxGetApp().get_tab(Preset::TYPE_PRINT)->reload_config(); - wxGetApp().get_tab(Preset::TYPE_FILAMENT)->reload_config(); + adjust_settings_for_flowrate_calib(model().objects, pass); wxGetApp().get_tab(Preset::TYPE_PRINTER)->reload_config(); } @@ -9739,89 +9757,7 @@ void Plater::calib_flowrate_linear() { add_model(false, (boost::filesystem::path(Slic3r::resources_dir()) / "calib" / "filament_flow" / "Orca-LinearFlow.3mf").string()); - auto print_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config; - auto printerConfig = &wxGetApp().preset_bundle->printers.get_edited_preset().config; - auto filament_config = &wxGetApp().preset_bundle->filaments.get_edited_preset().config; - - /// --- scale --- - // model is created for a 0.4 nozzle, scale z with nozzle size. - const ConfigOptionFloats* nozzle_diameter_config = printerConfig->option("nozzle_diameter"); - assert(nozzle_diameter_config->values.size() > 0); - float nozzle_diameter = nozzle_diameter_config->values[0]; - float xyScale = nozzle_diameter / 0.6; - //scale z to have 8 layers - double first_layer_height = print_config->option("initial_layer_print_height")->value; - double layer_height = nozzle_diameter / 2.0; // prefer 0.2 layer height for 0.4 nozzle - first_layer_height = std::max(first_layer_height, layer_height); - - float zscale = (first_layer_height + 7 * layer_height) / 1.6; - // only enlarge - if (xyScale > 1.2) { - for (auto _obj : model().objects) - _obj->scale(xyScale, xyScale, zscale); - } - else { - for (auto _obj : model().objects) - _obj->scale(1, 1, zscale); - } - - auto cur_flowrate = filament_config->option("filament_flow_ratio")->get_at(0); - Flow infill_flow = Flow(nozzle_diameter * 1.2f, layer_height, nozzle_diameter); - double filament_max_volumetric_speed = filament_config->option("filament_max_volumetric_speed")->get_at(0); - double max_infill_speed = filament_max_volumetric_speed / (infill_flow.mm3_per_mm() * (cur_flowrate+0.35)/cur_flowrate); - double internal_solid_speed = std::floor(std::min(print_config->opt_float("internal_solid_infill_speed"), max_infill_speed)); - double top_surface_speed = std::floor(std::min(print_config->opt_float("top_surface_speed"), max_infill_speed)); - - // adjust parameters - for (auto _obj : model().objects) { - _obj->ensure_on_bed(); - _obj->config.set_key_value("wall_loops", new ConfigOptionInt(1)); - _obj->config.set_key_value("only_one_wall_top", new ConfigOptionBool(true)); - _obj->config.set_key_value("thick_internal_bridges", new ConfigOptionBool(false)); - _obj->config.set_key_value("sparse_infill_density", new ConfigOptionPercent(35)); - _obj->config.set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(100,true)); - _obj->config.set_key_value("bottom_shell_layers", new ConfigOptionInt(1)); - _obj->config.set_key_value("top_shell_layers", new ConfigOptionInt(4)); - _obj->config.set_key_value("top_shell_thickness", new ConfigOptionFloat(0)); - _obj->config.set_key_value("bottom_shell_thickness", new ConfigOptionFloat(0)); - _obj->config.set_key_value("detect_thin_wall", new ConfigOptionBool(true)); - _obj->config.set_key_value("filter_out_gap_fill", new ConfigOptionFloat(0)); - _obj->config.set_key_value("sparse_infill_pattern", new ConfigOptionEnum(ipRectilinear)); - _obj->config.set_key_value("top_surface_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); - _obj->config.set_key_value("internal_solid_infill_line_width", new ConfigOptionFloatOrPercent(nozzle_diameter * 1.2f, false)); - _obj->config.set_key_value("top_surface_pattern", new ConfigOptionEnum(ipMonotonic)); - _obj->config.set_key_value("top_solid_infill_flow_ratio", new ConfigOptionFloat(1.0f)); - _obj->config.set_key_value("infill_direction", new ConfigOptionFloat(45)); - _obj->config.set_key_value("solid_infill_direction", new ConfigOptionFloat(135)); - _obj->config.set_key_value("rotate_solid_infill_direction", new ConfigOptionBool(true)); - _obj->config.set_key_value("ironing_type", new ConfigOptionEnum(IroningType::NoIroning)); - _obj->config.set_key_value("internal_solid_infill_speed", new ConfigOptionFloat(internal_solid_speed)); - _obj->config.set_key_value("top_surface_speed", new ConfigOptionFloat(top_surface_speed)); - _obj->config.set_key_value("seam_slope_type", new ConfigOptionEnum(SeamScarfType::None)); - print_config->set_key_value("max_volumetric_extrusion_rate_slope", new ConfigOptionFloat(0)); - - // extract flowrate from name, filename format: flowrate_xxx - std::string obj_name = _obj->name; - assert(obj_name.length() > 9); - obj_name = obj_name.substr(9); - if (obj_name[0] == 'm') - obj_name[0] = '-'; - auto modifier = stof(obj_name); - _obj->config.set_key_value("print_flow_ratio", new ConfigOptionFloat(1.0f + modifier/cur_flowrate)); - } - - print_config->set_key_value("layer_height", new ConfigOptionFloat(layer_height)); - print_config->set_key_value("alternate_extra_wall", new ConfigOptionBool(false)); - print_config->set_key_value("initial_layer_print_height", new ConfigOptionFloat(first_layer_height)); - print_config->set_key_value("reduce_crossing_wall", new ConfigOptionBool(true)); - - wxGetApp().get_tab(Preset::TYPE_PRINT)->update_dirty(); - wxGetApp().get_tab(Preset::TYPE_FILAMENT)->update_dirty(); - wxGetApp().get_tab(Preset::TYPE_PRINTER)->update_dirty(); - wxGetApp().get_tab(Preset::TYPE_PRINT)->reload_config(); - wxGetApp().get_tab(Preset::TYPE_FILAMENT)->reload_config(); - wxGetApp().get_tab(Preset::TYPE_PRINTER)->reload_config(); - + adjust_settings_for_flowrate_calib(model().objects, 0); } void Plater::calib_temp(const Calib_Params& params) {