OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::PrintConfigDef Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/libslic3r/PrintConfig.hpp>

Inheritance diagram for Slic3r::PrintConfigDef:
Collaboration diagram for Slic3r::PrintConfigDef:

Public Member Functions

 PrintConfigDef ()
const std::vector< std::string > & extruder_option_keys () const
const std::vector< std::string > & extruder_retract_keys () const
const std::vector< std::string > & filament_option_keys () const
const std::vector< std::string > & filament_retract_keys () const
bool has (const t_config_option_key &opt_key) const
const ConfigOptionDef * get (const t_config_option_key &opt_key) const
std::vector< std::string > keys () const
bool empty ()
std::ostream & print_cli_help (std::ostream &out, bool show_defaults, std::function< bool(const ConfigOptionDef &)> filter=[](const ConfigOptionDef &){ return true;}) const

Static Public Member Functions

static void handle_legacy (t_config_option_key &opt_key, std::string &value)
static void handle_legacy_composite (DynamicPrintConfig &config)

Public Attributes

t_optiondef_map options
std::map< size_t, const ConfigOptionDef * > by_serialization_key_ordinal

Protected Member Functions

ConfigOptionDef * add (const t_config_option_key &opt_key, ConfigOptionType type)
ConfigOptionDef * add_nullable (const t_config_option_key &opt_key, ConfigOptionType type)

Private Member Functions

void init_common_params ()
void init_fff_params ()
void init_extruder_option_keys ()
void init_sla_params ()
void init_filament_option_keys ()

Private Attributes

std::vector< std::string > m_extruder_option_keys
std::vector< std::string > m_extruder_retract_keys
std::vector< std::string > m_filament_option_keys
std::vector< std::string > m_filament_retract_keys

Detailed Description

Constructor & Destructor Documentation

◆ PrintConfigDef()

Slic3r::PrintConfigDef::PrintConfigDef ( )
999{
1000 this->init_common_params();
1002 this->init_fff_params();
1005 this->init_sla_params();
1007}
t_optiondef_map options
Definition Config.hpp:2658
void init_common_params()
Definition PrintConfig.cpp:1009
void init_fff_params()
Definition PrintConfig.cpp:1317
void init_extruder_option_keys()
Definition PrintConfig.cpp:8989
void init_sla_params()
Definition PrintConfig.cpp:9107
@ ptSLA
Definition Config.hpp:233
@ ptAny
Definition Config.hpp:237
@ ptFFF
Definition Config.hpp:231
static void assign_printer_technology_to_unknown(t_optiondef_map &options, PrinterTechnology printer_technology)
Definition PrintConfig.cpp:991

References Slic3r::assign_printer_technology_to_unknown(), init_common_params(), init_extruder_option_keys(), init_fff_params(), init_sla_params(), Slic3r::ConfigDef::options, Slic3r::ptAny, Slic3r::ptFFF, and Slic3r::ptSLA.

Here is the call graph for this function:

Member Function Documentation

◆ add()

ConfigOptionDef * Slic3r::ConfigDef::add ( const t_config_option_key & opt_key,
ConfigOptionType type )
protectedinherited
364{
365 static size_t serialization_key_ordinal_last = 0;
366 ConfigOptionDef *opt = &this->options[opt_key];
367 opt->opt_key = opt_key;
368 opt->type = type;
369 opt->serialization_key_ordinal = ++ serialization_key_ordinal_last;
370 this->by_serialization_key_ordinal[opt->serialization_key_ordinal] = opt;
371 return opt;
372}
std::map< size_t, const ConfigOptionDef * > by_serialization_key_ordinal
Definition Config.hpp:2659

References by_serialization_key_ordinal, and options.

Referenced by Slic3r::CLIMiscConfigDef::CLIMiscConfigDef(), Slic3r::CLITransformConfigDef::CLITransformConfigDef(), Slic3r::CustomGcodeSpecificConfigDef::CustomGcodeSpecificConfigDef(), Slic3r::DimensionsConfigDef::DimensionsConfigDef(), Slic3r::ObjectsInfoConfigDef::ObjectsInfoConfigDef(), Slic3r::OtherPresetsConfigDef::OtherPresetsConfigDef(), Slic3r::OtherSlicingStatesConfigDef::OtherSlicingStatesConfigDef(), Slic3r::PrintStatisticsConfigDef::PrintStatisticsConfigDef(), Slic3r::ReadOnlySlicingStatesConfigDef::ReadOnlySlicingStatesConfigDef(), Slic3r::ReadWriteSlicingStatesConfigDef::ReadWriteSlicingStatesConfigDef(), Slic3r::TimestampsConfigDef::TimestampsConfigDef(), add_nullable(), Slic3r::PrintConfigDef::init_common_params(), Slic3r::PrintConfigDef::init_fff_params(), and Slic3r::PrintConfigDef::init_sla_params().

Here is the caller graph for this function:

◆ add_nullable()

ConfigOptionDef * Slic3r::ConfigDef::add_nullable ( const t_config_option_key & opt_key,
ConfigOptionType type )
protectedinherited
375{
376 ConfigOptionDef *def = this->add(opt_key, type);
377 def->nullable = true;
378 return def;
379}
ConfigOptionDef * add(const t_config_option_key &opt_key, ConfigOptionType type)
Definition Config.cpp:363

References add(), and Slic3r::ConfigOptionDef::nullable.

Referenced by Slic3r::PrintConfigDef::init_fff_params().

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

◆ empty()

bool Slic3r::ConfigDef::empty ( )
inlineinherited
2673{ return options.empty(); }

References options.

◆ extruder_option_keys()

const std::vector< std::string > & Slic3r::PrintConfigDef::extruder_option_keys ( ) const
inline
851{ return m_extruder_option_keys; }
std::vector< std::string > m_extruder_option_keys
Definition PrintConfig.hpp:867

References m_extruder_option_keys.

◆ extruder_retract_keys()

const std::vector< std::string > & Slic3r::PrintConfigDef::extruder_retract_keys ( ) const
inline
855{ return m_extruder_retract_keys; }
std::vector< std::string > m_extruder_retract_keys
Definition PrintConfig.hpp:868

References m_extruder_retract_keys.

◆ filament_option_keys()

const std::vector< std::string > & Slic3r::PrintConfigDef::filament_option_keys ( ) const
inline
858{ return m_filament_option_keys; }
std::vector< std::string > m_filament_option_keys
Definition PrintConfig.hpp:873

References m_filament_option_keys.

◆ filament_retract_keys()

const std::vector< std::string > & Slic3r::PrintConfigDef::filament_retract_keys ( ) const
inline
859{ return m_filament_retract_keys; }
std::vector< std::string > m_filament_retract_keys
Definition PrintConfig.hpp:874

References m_filament_retract_keys.

◆ get()

const ConfigOptionDef * Slic3r::ConfigDef::get ( const t_config_option_key & opt_key) const
inlineinherited

◆ handle_legacy()

void Slic3r::PrintConfigDef::handle_legacy ( t_config_option_key & opt_key,
std::string & value )
static
9746{
9747 //BBS: handle legacy options
9748 if (opt_key == "curr_bed_type" && value == "SuperTack Plate") {
9749 value = "Supertack Plate";
9750 } else if (opt_key == "enable_wipe_tower") {
9751 opt_key = "enable_prime_tower";
9752 } else if (opt_key == "wipe_tower_width") {
9753 opt_key = "prime_tower_width";
9754 } else if (opt_key == "wiping_volume") {
9755 opt_key = "prime_volume";
9756 } else if (opt_key == "wipe_tower_brim_width") {
9757 opt_key = "prime_tower_brim_width";
9758 } else if (opt_key == "tool_change_gcode") {
9759 opt_key = "change_filament_gcode";
9760 } else if (opt_key == "bridge_fan_speed") {
9761 opt_key = "overhang_fan_speed";
9762 } else if (opt_key == "tpms_adaptive") {
9763 opt_key = "adaptive_infill_mode";
9764 } else if (opt_key == "tpms_interior_density") {
9765 opt_key = "adaptive_infill_interior_density";
9766 } else if (opt_key == "tpms_adaptive_gradient") {
9767 opt_key = "adaptive_infill_gradient";
9768 } else if (opt_key == "infill_extruder" || opt_key == "sparse_infill_filament") {
9769 // ORCA: legacy feature-filament selector. Pre-2.4.0-dev these keys were 1-based and the
9770 // default value "1" meant "the first/active filament". The current scheme uses a dedicated
9771 // key where 0 = "Default" (inherit the object/part filament) and 1..N = explicit filament.
9772 // Renaming to the new *_id key here means every config (process presets, 3mf project
9773 // settings, imported gcode) is translated uniformly on load - not just the version-gated
9774 // 3mf paths the old bespoke migration covered - and a brand-new key can never be misread as
9775 // a legacy default. Map the legacy default "1" to "0" (inherit); keep explicit values >1.
9776 opt_key = "sparse_infill_filament_id";
9777 if (value == "1") value = "0";
9778 } else if (opt_key == "solid_infill_extruder" || opt_key == "solid_infill_filament") {
9779 opt_key = "internal_solid_filament_id";
9780 if (value == "1") value = "0";
9781 } else if (opt_key == "top_solid_infill_filament") {
9782 opt_key = "top_surface_filament_id";
9783 if (value == "1") value = "0";
9784 } else if (opt_key == "bottom_solid_infill_filament") {
9785 opt_key = "bottom_surface_filament_id";
9786 if (value == "1") value = "0";
9787 } else if (opt_key == "perimeter_extruder" || opt_key == "wall_filament" || opt_key == "wall_filament_id") {
9788 opt_key = "outer_wall_filament_id";
9789 if (value == "1") value = "0";
9790 } else if (opt_key == "inner_wall_filament") {
9791 opt_key = "inner_wall_filament_id";
9792 if (value == "1") value = "0";
9793 } else if (opt_key == "outer_wall_filament") {
9794 opt_key = "outer_wall_filament_id";
9795 if (value == "1") value = "0";
9796 }else if(opt_key == "wipe_tower_extruder") {
9797 opt_key = "wipe_tower_filament";
9798 }else if (opt_key == "support_material_extruder") {
9799 opt_key = "support_filament";
9800 } else if (opt_key == "support_material_interface_extruder") {
9801 opt_key = "support_interface_filament";
9802 } else if (opt_key == "support_material_angle") {
9803 opt_key = "support_angle";
9804 } else if (opt_key == "support_material_enforce_layers") {
9805 opt_key = "enforce_support_layers";
9806 } else if ((opt_key == "initial_layer_print_height" ||
9807 opt_key == "initial_layer_speed" ||
9808 opt_key == "internal_solid_infill_speed" ||
9809 opt_key == "top_surface_speed" ||
9810 opt_key == "support_interface_speed" ||
9811 opt_key == "outer_wall_speed" ||
9812 opt_key == "support_object_xy_distance") && value.find("%") != std::string::npos) {
9813 //BBS: this is old profile in which value is expressed as percentage.
9814 //But now these key-value must be absolute value.
9815 //Reset to default value by erasing these key to avoid parsing error.
9816 opt_key = "";
9817 } else if (opt_key == "inherits_cummulative") {
9818 opt_key = "inherits_group";
9819 } else if (opt_key == "compatible_printers_condition_cummulative") {
9820 opt_key = "compatible_machine_expression_group";
9821 } else if (opt_key == "compatible_prints_condition_cummulative") {
9822 opt_key = "compatible_process_expression_group";
9823 } else if (opt_key == "cooling") {
9824 opt_key = "slow_down_for_layer_cooling";
9825 } else if (opt_key == "timelapse_no_toolhead") {
9826 opt_key = "timelapse_type";
9827 } else if (opt_key == "timelapse_type" && value == "2") {
9828 // old file "0" is None, "2" is Traditional
9829 // new file "0" is Traditional, erase "2"
9830 value = "0";
9831 } else if (opt_key == "support_type" && value == "normal") {
9832 value = "normal(manual)";
9833 } else if (opt_key == "support_type" && value == "tree") {
9834 value = "tree(manual)";
9835 } else if (opt_key == "support_type" && value == "hybrid(auto)") {
9836 value = "tree(auto)";
9837 } else if (opt_key == "support_base_pattern" && value == "none") {
9838 value = "hollow";
9839 } else if (opt_key == "tree_support_wall_count" && value == "-1") {
9840 value = "0";
9841 } else if (opt_key == "different_settings_to_system") {
9842 std::string copy_value = value;
9843 copy_value.erase(std::remove(copy_value.begin(), copy_value.end(), '\"'), copy_value.end()); // remove '"' in string
9844 std::set<std::string> split_keys = SplitStringAndRemoveDuplicateElement(copy_value, ";");
9845 for (std::string split_key : split_keys) {
9846 std::string copy_key = split_key, copy_value = "";
9847 handle_legacy(copy_key, copy_value);
9848 if (copy_key != split_key) {
9849 ReplaceString(value, split_key, copy_key);
9850 }
9851 }
9852 } else if (opt_key == "overhang_fan_threshold" && value == "5%") {
9853 value = "10%";
9854 } else if( opt_key == "wall_infill_order" ) {
9855 if (value == "inner wall/outer wall/infill" || value == "infill/inner wall/outer wall") {
9856 opt_key = "wall_sequence";
9857 value = "inner wall/outer wall";
9858 } else if (value == "outer wall/inner wall/infill" || value == "infill/outer wall/inner wall") {
9859 opt_key = "wall_sequence";
9860 value = "outer wall/inner wall";
9861 } else if (value == "inner-outer-inner wall/infill") {
9862 opt_key = "wall_sequence";
9863 value = "inner-outer-inner wall";
9864 } else {
9865 opt_key = "wall_sequence";
9866 }
9867 } else if (opt_key == "nozzle_volume_type"
9868 || opt_key == "default_nozzle_volume_type"
9869 || opt_key == "printer_extruder_variant"
9870 || opt_key == "print_extruder_variant"
9871 || opt_key == "filament_extruder_variant"
9872 || opt_key == "extruder_variant_list") {
9873 ReplaceString(value, "Normal", "Standard");
9874 ReplaceString(value, "Big Traffic", "High Flow");
9875 }
9876 else if (opt_key == "extruder_type") {
9877 ReplaceString(value, "DirectDrive", "Direct Drive");
9878 }
9879 else if (opt_key == "enable_power_loss_recovery") {
9880 if (value == "1" || boost::iequals(value, "true")) {
9881 value = "enable";
9882 } else if (value == "0" || boost::iequals(value, "false")) {
9883 value = "disable";
9884 }
9885 }
9886 else if (opt_key == "enable_arc_fitting") {
9887 if (value == "1" || boost::iequals(value, "true")) {
9888 value = "enabled";
9889 } else if (value == "0" || boost::iequals(value, "false")) {
9890 value = "disabled";
9891 }
9892 }
9893 else if(opt_key == "ensure_vertical_shell_thickness") {
9894 if(value == "1") {
9895 value = "ensure_all";
9896 }
9897 else if (value == "0"){
9898 value = "ensure_moderate";
9899 }
9900 } else if (opt_key == "rotate_solid_infill_direction") {
9901 opt_key = "solid_infill_rotate_template";
9902 if (value == "1") {
9903 value = "0,90";
9904 } else if (value == "0") {
9905 value = "0";
9906 }
9907 } else if (opt_key == "sparse_infill_anchor") {
9908 opt_key = "infill_anchor";
9909 } else if (opt_key == "sparse_infill_anchor_max") {
9910 opt_key = "infill_anchor_max";
9911 } else if (opt_key == "chamber_temperatures") {
9912 opt_key = "chamber_temperature";
9913 } else if (opt_key == "thumbnail_size") {
9914 opt_key = "thumbnails";
9915 } else if (opt_key == "top_one_wall_type" && value != "none") {
9916 opt_key = "only_one_wall_top";
9917 value = "1";
9918 } else if (opt_key == "initial_layer_flow_ratio") {
9919 opt_key = "bottom_solid_infill_flow_ratio";
9920 } else if (opt_key == "ironing_direction") {
9921 opt_key = "ironing_angle";
9922 } else if (opt_key == "ironing_angle" && boost::starts_with(value, "-")) {
9923 value = "0";
9924 } else if (opt_key == "counterbole_hole_bridging") {
9925 opt_key = "counterbore_hole_bridging";
9926 } else if (opt_key == "draft_shield" && value == "limited") {
9927 value = "disabled";
9928 } else if ((opt_key == "sparse_infill_pattern" ||
9929 opt_key == "top_surface_pattern" ||
9930 opt_key == "bottom_surface_pattern" ||
9931 opt_key == "internal_solid_infill_pattern" ||
9932 opt_key == "ironing_pattern" ||
9933 opt_key == "support_ironing_pattern") && value == "zig-zag") {
9934 value = "rectilinear";
9935 } else if (opt_key == "filament_map_mode") {
9936 if (value == "Auto") value = "Auto For Flush";
9937 }
9938 else if (opt_key == "filament_type"){
9939 std::vector<std::string> type_list;
9940 std::stringstream ss(value);
9941 std::string token;
9942 bool rebuild_value = false;
9943 while (std::getline(ss, token, ';')) {
9944 if (token.size() >= 2 && token.front() == '"' && token.back() == '"')
9945 token = token.substr(1, token.size() - 2);
9946 if (token == "ASA-Aero") {
9947 token = "ASA-AERO";
9948 rebuild_value = true;
9949 }
9950 type_list.emplace_back(token);
9951 }
9952 if (rebuild_value) {
9953 value.clear();
9954 for (size_t idx = 0; idx < type_list.size(); ++idx) {
9955 if (idx != 0)
9956 value += ';';
9957 value += "\"" + type_list[idx] + "\"";
9958 }
9959 }
9960 }
9961 // Orca: Rename wipe tower ribs related options
9962 else if (opt_key == "prime_tower_rib_wall") {
9963 if (value == "1") {
9964 opt_key = "wipe_tower_wall_type";
9965 value = "rib";
9966 } else {
9967 opt_key = "";
9968 }
9969 } else if (opt_key == "prime_tower_extra_rib_length") {
9970 opt_key = "wipe_tower_extra_rib_length";
9971 } else if (opt_key == "prime_tower_rib_width") {
9972 opt_key = "wipe_tower_rib_width";
9973 } else if (opt_key == "prime_tower_fillet_wall") {
9974 opt_key = "wipe_tower_fillet_wall";
9975 } else if (opt_key == "extruder_clearance_max_radius") {
9976 opt_key = "extruder_clearance_radius";
9977 } else if (opt_key == "machine_switch_extruder_time") {
9978 opt_key = "machine_tool_change_time";
9979 }
9980 else if (opt_key == "wall_direction" && value == "auto") {
9981 value = "ccw";
9982 }
9983 // Orca: the IDEX/IQEX parallel printing keys shipped to testers as ixex_* before the feature
9984 // was renamed IMEX, and the two clearance keys were renamed again to say what they measure:
9985 // nozzle to carriage edge on the collision side, not the carriage's full width. Without this
9986 // an existing printer profile loses every one of these values silently.
9987 // is_ixex is the master gate: without it every other key below migrates into a feature that
9988 // stays switched off, which is worse than losing them all, because the settings then look
9989 // configured. ixex_primary_col/_row are the only era-1 keys with no modern counterpart (the
9990 // primary is a role in the mode's tools string now); they were never in an option list, so no
9991 // saved file carries them, and the has() check at the end of this function drops them anyway.
9992 else if (opt_key == "is_ixex") {
9993 opt_key = "is_imex";
9994 } else if (opt_key.compare(0, 5, "ixex_") == 0) {
9995 opt_key = "imex_" + opt_key.substr(5);
9996 if (opt_key == "imex_carriage_width_x")
9997 opt_key = "imex_nozzle_clearance_x";
9998 else if (opt_key == "imex_carriage_width_y")
9999 opt_key = "imex_nozzle_clearance_y";
10000 }
10001
10002 // Ignore the following obsolete configuration keys:
10003 static std::set<std::string> ignore = {
10004 "acceleration", "scale", "rotate", "duplicate", "duplicate_grid",
10005 "bed_size",
10006 "print_center", "g0", "wipe_tower_per_color_wipe",
10007 "support_sharp_tails","support_remove_small_overhangs", "support_with_sheath",
10008 "tree_support_collision_resolution", "tree_support_with_infill",
10009 "max_volumetric_speed", "max_print_speed",
10010 "support_closing_radius",
10011 "remove_freq_sweep", "remove_bed_leveling", "remove_extrusion_calibration",
10012 "support_transition_line_width", "support_transition_speed", "bed_temperature", "bed_temperature_initial_layer",
10013 "can_switch_nozzle_type", "can_add_auxiliary_fan", "extra_flush_volume", "spaghetti_detector", "adaptive_layer_height",
10014 "z_hop_type", "z_lift_type", "bed_temperature_difference","long_retraction_when_cut",
10015 "retraction_distance_when_cut",
10016 "internal_bridge_support_thickness", "top_area_threshold", "reduce_wall_solid_infill","filament_load_time","filament_unload_time",
10017 "smooth_coefficient", "overhang_totally_speed", "silent_mode",
10018 "overhang_speed_classic",
10019 "anisotropic_surfaces", // superseded by top_surface_fill_order / bottom_surface_fill_order
10020 // Belt printer keys retired before the first release: the global-mode and
10021 // back-transform switches are presumed on, and the pre-slice axis remap, the
10022 // support Z offset mode, the support floor mode (always on) and the first-layer
10023 // plane evaluator were removed.
10024 "belt_slice_rotation_global", "preslice_remap_x", "preslice_remap_y", "preslice_remap_z", "preslice_remap_global",
10025 "belt_support_z_offset_mode", "first_layer_plane", "first_layer_plane_offset",
10026 "belt_preslice_global", "gcode_back_transform", "belt_support_floor_mode", "first_layer_plane_thickness",
10027 };
10028
10029 if (ignore.find(opt_key) != ignore.end()) {
10030 opt_key = "";
10031 return;
10032 }
10033
10034 if (! print_config_def.has(opt_key)) {
10035 opt_key = "";
10036 return;
10037 }
10038}
bool has(const t_config_option_key &opt_key) const
Definition Config.hpp:2661
static void handle_legacy(t_config_option_key &opt_key, std::string &value)
Definition PrintConfig.cpp:9745
const PrintConfigDef print_config_def
Definition PrintConfig.cpp:10099
void ReplaceString(std::string &resource_str, const std::string &old_str, const std::string &new_str)
Definition PrintConfig.cpp:77
std::set< std::string > SplitStringAndRemoveDuplicateElement(const std::string &str, const std::string &separator)
Definition PrintConfig.cpp:56

References handle_legacy(), and Slic3r::print_config_def.

Referenced by Slic3r::DynamicPrintAndCLIConfig::handle_legacy(), Slic3r::DynamicPrintConfig::handle_legacy(), handle_legacy(), and Slic3r::StaticPrintConfig::handle_legacy().

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

◆ handle_legacy_composite()

void Slic3r::PrintConfigDef::handle_legacy_composite ( DynamicPrintConfig & config)
static
10044{
10045 if (config.has("thumbnails")) {
10046 std::string extention;
10047 if (config.has("thumbnails_format")) {
10048 if (const ConfigOptionDef* opt = config.def()->get("thumbnails_format")) {
10049 extention = opt->enum_values.at(config.option("thumbnails_format")->getInt());
10050 }
10051 }
10052
10053 std::string thumbnails_str = config.opt_string("thumbnails");
10054 auto [thumbnails_list, errors] = GCodeThumbnails::make_and_check_thumbnail_list(thumbnails_str, extention);
10055
10056 if (errors != enum_bitmask<ThumbnailError>()) {
10057 // TRN %1% is a parameter name, %2% its value.
10058 std::string error_str = "\n" + Slic3r::format(_u8L("Invalid value provided for parameter %1%: %2%"), "thumbnails", thumbnails_str);
10059 error_str += GCodeThumbnails::get_error_string(errors);
10060 throw BadOptionValueException(error_str);
10061 }
10062
10063 if (!thumbnails_list.empty()) {
10065 thumbnails_str.clear();
10066 for (const auto& [ext, size] : thumbnails_list)
10067 thumbnails_str += Slic3r::format("%1%x%2%/%3%, ", size.x(), size.y(), extentions[int(ext)]);
10068 thumbnails_str.resize(thumbnails_str.length() - 2);
10069
10070 config.set_key_value("thumbnails", new ConfigOptionString(thumbnails_str));
10071 }
10072 }
10073
10074 if (config.has("wiping_volumes_matrix") && !config.has("wiping_volumes_use_custom_matrix")) {
10075 // This is apparently some pre-2.7.3 config, where the wiping_volumes_matrix was always used.
10076 // The 2.7.3 introduced an option to use defaults derived from config. In case the matrix
10077 // contains only default values, switch it to default behaviour. The default values
10078 // were zeros on the diagonal and 140 otherwise.
10079 std::vector<double> matrix = config.opt<ConfigOptionFloats>("wiping_volumes_matrix")->values;
10080 int num_of_extruders = int(std::sqrt(matrix.size()) + 0.5);
10081 int i = -1;
10082 bool custom = false;
10083 for (int j = 0; j < int(matrix.size()); ++j) {
10084 if (j % num_of_extruders == 0)
10085 ++i;
10086 if (i != j % num_of_extruders && !is_approx(matrix[j], 140.)) {
10087 custom = true;
10088 break;
10089 }
10090 }
10091 config.set_key_value("wiping_volumes_use_custom_matrix", new ConfigOptionBool(custom));
10092 }
10093
10094 // Orca: a config saved before a key joined filament_options_with_variant stores it once per filament
10095 // rather than once per filament variant, and one exported by an older CLI may store a single value.
10097}
static const t_config_enum_names & get_enum_names()
std::pair< GCodeThumbnailDefinitionsList, ThumbnailErrors > make_and_check_thumbnail_list(const std::string &thumbnails_string, const std::string_view def_ext)
Definition Thumbnails.cpp:546
std::string get_error_string(const ThumbnailErrors &errors)
Definition Thumbnails.cpp:609
void normalize_filament_values_to_variants(DynamicPrintConfig &config)
Definition PrintConfig.cpp:11431
constexpr bool is_approx(Number value, Number test_value, Number precision=EPSILON)
Definition libslic3r.h:320
zaa_minimize_perimeter_height ConfigOptionString
Definition PrintConfig.hpp:1702
std::string format(const char *fmt, TArgs &&... args)
Definition format.hpp:45
ConfigOptionFloatsTempl< false > ConfigOptionFloats
Definition Config.hpp:1015
#define _u8L(s)
Definition I18N.hpp:11

References _u8L, Slic3r::ConfigOptionString, Slic3r::DynamicPrintConfig::def(), Slic3r::format(), Slic3r::ConfigDef::get(), Slic3r::ConfigOptionEnum< T >::get_enum_names(), Slic3r::GCodeThumbnails::get_error_string(), Slic3r::ConfigOption::getInt(), Slic3r::ConfigOptionResolver::has(), Slic3r::is_approx(), Slic3r::GCodeThumbnails::make_and_check_thumbnail_list(), Slic3r::normalize_filament_values_to_variants(), Slic3r::DynamicConfig::opt(), Slic3r::DynamicConfig::opt_string(), Slic3r::ConfigBase::option(), and Slic3r::DynamicConfig::set_key_value().

Referenced by Slic3r::DynamicPrintConfig::handle_legacy_composite().

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

◆ has()

bool Slic3r::ConfigDef::has ( const t_config_option_key & opt_key) const
inlineinherited
2661{ return this->options.count(opt_key) > 0; }

Referenced by Slic3r::GUI::EditGCodeDialog::selection_changed().

Here is the caller graph for this function:

◆ init_common_params()

void Slic3r::PrintConfigDef::init_common_params ( )
private
1010{
1011 ConfigOptionDef* def;
1012
1013 def = this->add("printer_technology", coEnum);
1014 def->label = L("Printer technology");
1015 //def->tooltip = L("Printer technology.");
1017 def->enum_values.push_back("FFF");
1018 def->enum_values.push_back("SLA");
1019 def->set_default_value(new ConfigOptionEnum<PrinterTechnology>(ptFFF));
1020
1021 def = this->add("printable_area", coPoints);
1022 def->label = L("Printable area");
1023 //BBS
1024 def->mode = comAdvanced;
1025 def->set_default_value(new ConfigOptionPoints{ Vec2d(0, 0), Vec2d(200, 0), Vec2d(200, 200), Vec2d(0, 200) });
1026
1027 def = this->add("extruder_printable_area", coPointsGroups);
1028 def->label = L("Extruder printable area");
1029 def->mode = comAdvanced;
1031 def->set_default_value(new ConfigOptionPointsGroups{});
1032
1033 def = this->add("support_parallel_printheads", coBool);
1034 def->label = L("Support parallel printheads");
1035 def->tooltip = L("Enable printer settings for machines that can use multiple printheads in parallel.");
1036 def->mode = comAdvanced;
1037 def->set_default_value(new ConfigOptionBool{false});
1038
1039 def = this->add("parallel_printheads_count", coInt);
1040 def->label = L("Parallel printheads count");
1041 def->tooltip = L("Set the number of parallel printheads for machines like OrangeStorm Giga printer.");
1042 def->mode = comAdvanced;
1043 def->min = 1;
1044 def->max = 4;
1045 def->set_default_value(new ConfigOptionInt{1});
1046
1047 def = this->add("parallel_printheads_bed_exclude_areas", coStrings);
1048 def->label = L("Parallel printheads bed exclude areas");
1049 def->tooltip = L("Ordered list of bed exclude areas by parallel printhead count. Item 1 applies to one printhead, item 2 to two printheads, and so on. Leave an item empty for no excluded area.");
1050 def->mode = comAdvanced;
1051 def->set_default_value(new ConfigOptionStrings());
1052
1053 //BBS: add "bed_exclude_area"
1054 def = this->add("bed_exclude_area", coPoints);
1055 def->label = L("Excluded bed area");
1056 def->tooltip = L("Unprintable area in XY plane. For example, X1 Series printers use the front left corner to cut filament during filament change. "
1057 "The area is expressed as a polygon in the format \"XxY, XxY, ...\". It constrains material and model placement, "
1058 "but allows machine travel. Configure toolhead collision volumes separately for G-code checking and travel avoidance.");
1059 def->mode = comAdvanced;
1061 def->set_default_value(new ConfigOptionPoints{ Vec2d(0, 0) });
1062
1063 def = this->add("bed_exclude_volumes", coString);
1064 def->label = L("Toolhead collision volumes");
1065 def->tooltip = L("Collision volumes used for model and generated-material exclusion, G-code checking, and travel avoidance. "
1066 "Use \"XxY, XxY, ...\" for a full-height polygon or \"ZMIN..ZMAX;XxY, XxY, ...\" for a Z-limited volume. "
1067 "Separate multiple volumes with \"|\". These volumes are additional to the excluded bed area. "
1068 "Automatic arrangement conservatively uses the bounding box of a non-convex volume.");
1069 def->mode = comAdvanced;
1071 def->set_default_value(new ConfigOptionString());
1072
1073 def = this->add("bed_exclude_volume_mode", coEnum);
1074 def->label = L("Collision volume behavior");
1075 def->tooltip = L("Choose whether all nozzles use the same collision volumes, derive toolhead-relative volumes from each nozzle's XY offset, or configure independent volumes for every extruder. In individual mode, select each extruder on the Extruder page to configure its volumes.");
1077 def->enum_values = { "shared", "toolhead_offset", "per_extruder" };
1078 // TRN Collision volume modes: one set for all nozzles, one set moved by each nozzle's XY offset, or one set per extruder.
1079 def->enum_labels = { L("Shared by all nozzles"), L("Toolhead-relative (nozzle offsets)"), L("Individual per extruder") };
1080 def->mode = comAdvanced;
1081 def->set_default_value(new ConfigOptionEnum<BedExcludeVolumeMode>(BedExcludeVolumeMode::Shared));
1082
1083 def = this->add("extruder_bed_exclude_volumes", coStrings);
1084 def->label = L("Extruder collision volumes");
1085 def->tooltip = L("Collision volumes used only by this extruder in individual mode. Use the same polygon and optional Z-range format as the shared collision volumes. Leave empty for no collision volumes on this extruder. Automatic arrangement conservatively uses the bounding box of a non-convex volume.");
1086 def->mode = comAdvanced;
1088 def->set_default_value(new ConfigOptionStrings{ "" });
1089
1090 def = this->add("bed_custom_texture", coString);
1091 def->label = L("Bed custom texture");
1092 def->mode = comAdvanced;
1094 def->set_default_value(new ConfigOptionString());
1095
1096 def = this->add("bed_custom_model", coString);
1097 def->label = L("Bed custom model");
1098 def->mode = comAdvanced;
1100 def->set_default_value(new ConfigOptionString());
1101
1102 def = this->add("elefant_foot_compensation", coFloat);
1103 def->label = L("Elephant foot compensation");
1104 def->category = L("Quality");
1105 def->tooltip = L("This shrinks the first layer on the build plate to compensate for elephant foot effect.");
1106 def->sidetext = L("mm"); // millimeters, CIS languages need translation
1107 def->min = 0;
1108 def->mode = comAdvanced;
1109 def->set_default_value(new ConfigOptionFloat(0.));
1110
1111 def = this->add("elefant_foot_compensation_layers", coInt);
1112 def->label = L("Elephant foot compensation layers");
1113 def->category = L("Quality");
1114 def->tooltip = L("The number of layers on which the elephant foot compensation will be active. "
1115 "The first layer will be shrunk by the elephant foot compensation value, then "
1116 "the next layers will be linearly shrunk less, up to the layer indicated by this value.");
1117 def->sidetext = L("layers");
1118 def->min = 1;
1119 def->mode = comAdvanced;
1120 def->set_default_value(new ConfigOptionInt(1));
1121
1122 def = this->add("elefant_foot_layers_density", coPercent);
1123 def->label = L("Elephant foot layers density");
1124 def->category = L("Quality");
1125 def->tooltip = L("Density of internal solid infill for Elephant foot layers compensation.\n"
1126 "The initial value for the second layer is set.\n"
1127 "Subsequent layers become linearly denser by the height specified in elefant_foot_compensation_layers.");
1128 def->sidetext = "%";
1129 def->min = 50;
1130 def->max = 100;
1131 def->mode = comExpert;
1132 def->set_default_value(new ConfigOptionPercent(100));
1133
1134 def = this->add("layer_height", coFloat);
1135 def->label = L("Layer height");
1136 def->category = L("Quality");
1137 def->tooltip = L("This is the height for each layer. Smaller layer heights give greater accuracy but longer printing time.");
1138 def->sidetext = L("mm"); // millimeters, CIS languages need translation
1139 def->min = 0;
1140 def->set_default_value(new ConfigOptionFloat(INITIAL_LAYER_HEIGHT));
1141
1142 def = this->add("printable_height", coFloat);
1143 def->label = L("Printable height");
1144 def->tooltip = L("This is the maximum printable height which is limited by the height of the build area.");
1145 def->sidetext = L("mm"); // millimeters, CIS languages need translation
1146 def->min = 0;
1147 def->max = 214700;
1148 def->mode = comSimple;
1149 def->set_default_value(new ConfigOptionFloat(100.0));
1150
1151 def = this->add("extruder_printable_height", coFloats);
1152 def->label = L("Extruder printable height");
1153 def->tooltip = L("Maximum printable height of this extruder which is limited by mechanism of printer.");
1154 def->sidetext = L("mm"); // millimeters, CIS languages need translation
1155 def->min = 0;
1156 def->max = 1000;
1157 def->mode = comAdvanced;
1158 def->set_default_value(new ConfigOptionFloatsNullable{0});
1159
1160 def = this->add("preferred_orientation", coFloat);
1161 def->label = L("Preferred orientation");
1162 def->tooltip = L("Automatically orient STL files on the Z axis upon initial import.");
1163 def->sidetext = u8"°"; // degrees, don't need translation
1164 def->max = 360;
1165 def->min = -360;
1166 def->mode = comAdvanced;
1167 def->set_default_value(new ConfigOptionFloat(0.0));
1168
1169 // Options used by physical printers
1170
1171 def = this->add("preset_names", coStrings);
1172 def->label = L("Printer preset names");
1173 //def->tooltip = L("Names of presets related to the physical printer.");
1174 def->mode = comDevelop;
1175 def->set_default_value(new ConfigOptionStrings());
1176
1177 def = this->add("bbl_use_printhost", coBool);
1178 def->label = L("Use 3rd-party print host");
1179 def->tooltip = L("Allow controlling BambuLab's printer through 3rd party print hosts.");
1180 def->mode = comAdvanced;
1181 def->cli = ConfigOptionDef::nocli;
1182 def->set_default_value(new ConfigOptionBool(false));
1183
1184 def = this->add("use_3mf", coBool);
1185 def->label = L("Use 3MF instead of G-code");
1186 def->tooltip = L("Enable this if the printer accepts a 3MF file as the print job. When enabled, Orca Slicer "
1187 "sends the sliced file as a .gcode.3mf, instead of a plain .gcode file.");
1188 def->mode = comAdvanced;
1189 def->cli = ConfigOptionDef::nocli;
1190 def->set_default_value(new ConfigOptionBool(false));
1191
1192 def = this->add("printer_agent", coString);
1193 def->label = L("Printer Agent");
1194 def->tooltip = L("Select the network agent implementation for printer communication.");
1195 def->mode = comAdvanced;
1196 def->cli = ConfigOptionDef::nocli;
1197 // Plugin-backed (see ConfigOptionDef::is_plugin_backed), but edited through the Choice widget above
1198 // rather than a plugin_picker field.
1199 def->plugin_type = "printer-connection";
1200 def->set_default_value(new ConfigOptionString(""));
1201
1202 def = this->add("print_host", coString);
1203 def->label = L("Hostname, IP or URL");
1204 // The URL is an example of the format to type, not a link, so it stays in the text.
1205 // xgettext:no-url-check
1206 def->tooltip = L("Orca Slicer can upload G-code files to a printer host. This field should contain "
1207 "the hostname, IP address or URL of the printer host instance. "
1208 "Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL "
1209 "in the following format: https://username:password@your-octopi-address/");
1210 def->mode = comAdvanced;
1211 def->cli = ConfigOptionDef::nocli;
1212 def->set_default_value(new ConfigOptionString());
1213
1214 def = this->add("print_host_webui", coString);
1215 def->label = L("Device UI");
1216 def->tooltip = L("Specify the URL of your device user interface if it's not same as print_host.");
1217 def->mode = comAdvanced;
1218 def->cli = ConfigOptionDef::nocli;
1219 def->set_default_value(new ConfigOptionString());
1220
1221 def = this->add("printhost_apikey", coString);
1222 def->label = L("API Key / Password");
1223 def->tooltip = L("Orca Slicer can upload G-code files to a printer host. This field should contain "
1224 "the API Key or the password required for authentication.");
1225 def->mode = comAdvanced;
1226 def->cli = ConfigOptionDef::nocli;
1227 def->set_default_value(new ConfigOptionString());
1228
1229 def = this->add("flashforge_serial_number", coString);
1230 def->label = L("Serial Number");
1231 def->tooltip = L("Flashforge local API requires the printer serial number.");
1232 def->mode = comAdvanced;
1233 def->cli = ConfigOptionDef::nocli;
1234 def->set_default_value(new ConfigOptionString());
1235
1236 def = this->add("printhost_port", coString);
1237 def->label = L("Printer");
1238 def->tooltip = L("Name of the printer.");
1240 def->mode = comAdvanced;
1241 def->cli = ConfigOptionDef::nocli;
1242 def->set_default_value(new ConfigOptionString());
1243
1244 def = this->add("printhost_cafile", coString);
1245 def->label = L("HTTPS CA File");
1246 def->tooltip = L("Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. "
1247 "If left blank, the default OS CA certificate repository is used.");
1248 def->mode = comAdvanced;
1249 def->cli = ConfigOptionDef::nocli;
1250 def->set_default_value(new ConfigOptionString());
1251
1252 // Options used by physical printers
1253
1254 def = this->add("printhost_user", coString);
1255 def->label = L("User");
1256 //def->tooltip = L("");
1257 def->mode = comAdvanced;
1258 def->cli = ConfigOptionDef::nocli;
1259 def->set_default_value(new ConfigOptionString());
1260
1261 def = this->add("printhost_password", coString);
1262 def->label = L("Password");
1263 //def->tooltip = L("");
1264 def->mode = comAdvanced;
1265 def->cli = ConfigOptionDef::nocli;
1266 def->set_default_value(new ConfigOptionString());
1267
1268 // Only available on Windows.
1269 def = this->add("printhost_ssl_ignore_revoke", coBool);
1270 def->label = L("Ignore HTTPS certificate revocation checks");
1271 def->tooltip = L("Ignore HTTPS certificate revocation checks in the case of missing or offline distribution points. One may want to enable this option for self signed certificates if connection fails.");
1272 def->mode = comAdvanced;
1273 def->cli = ConfigOptionDef::nocli;
1274 def->set_default_value(new ConfigOptionBool(false));
1275
1276 def = this->add("preset_names", coStrings);
1277 def->label = L("Printer preset names");
1278 def->tooltip = L("Names of presets related to the physical printer.");
1279 def->mode = comAdvanced;
1280 def->set_default_value(new ConfigOptionStrings());
1281
1282 def = this->add("printhost_authorization_type", coEnum);
1283 def->label = L("Authorization Type");
1284 //def->tooltip = L("");
1286 def->enum_values.push_back("key");
1287 def->enum_values.push_back("user");
1288 def->enum_labels.push_back(L("API key"));
1289 def->enum_labels.push_back(L("HTTP digest"));
1290 def->mode = comAdvanced;
1291 def->cli = ConfigOptionDef::nocli;
1292 def->set_default_value(new ConfigOptionEnum<AuthorizationType>(atKeyPassword));
1293
1294 // temporary workaround for compatibility with older Slicer
1295 {
1296 def = this->add("preset_name", coString);
1297 def->set_default_value(new ConfigOptionString());
1298 }
1299
1300 // One key per preset type (Preset::plugin_overrides_key), so the print, printer and filament
1301 // overrides don't clobber each other when the presets merge into one full config. No handle_legacy
1302 // migration from the shared "plugin_config_overrides" they replace: it only ever shipped in
1303 // nightlies. Never a text field — GUIType::plugin_config renders a button opening PluginsConfigDialog.
1304 for (const char* key : {"print_plugin_config_overrides", "printer_plugin_config_overrides", "filament_plugin_config_overrides"}) {
1305 def = this->add(key, coString);
1306 def->label = L("Capabilities");
1307 def->tooltip = L("Configuration for the plugin capabilities this preset uses, overriding the global "
1308 "Capabilities configuration. Stored as a raw JSON array and edited through the dialog "
1309 "behind the button, never typed in directly.");
1311 def->mode = comAdvanced;
1312 def->cli = ConfigOptionDef::nocli;
1313 def->set_default_value(new ConfigOptionString(""));
1314 }
1315}
#define L(s)
Definition ExtrusionEntity.cpp:25
#define INITIAL_LAYER_HEIGHT
Definition PrintConfigConstants.hpp:5
static const constexpr char * nocli
Definition Config.hpp:2636
@ plugin_config
Definition Config.hpp:2336
@ one_string
Definition Config.hpp:2333
@ select_open
Definition Config.hpp:2327
static const t_config_enum_values & get_enum_values()
zaa_minimize_perimeter_height ConfigOptionFloat
Definition PrintConfig.hpp:1954
@ comSimple
Definition Config.hpp:222
@ comDevelop
Definition Config.hpp:225
@ comAdvanced
Definition Config.hpp:223
@ comExpert
Definition Config.hpp:224
@ atKeyPassword
Definition PrintConfig.hpp:123
ConfigOptionFloatsTempl< true > ConfigOptionFloatsNullable
Definition Config.hpp:1016
ConfigOptionEnum< PrinterTechnology >
Definition PrintConfig.hpp:2358
@ coString
Definition Config.hpp:192
@ coEnum
Definition Config.hpp:214
@ coPointsGroups
Definition Config.hpp:217
@ coPoints
Definition Config.hpp:206
@ coInt
Definition Config.hpp:188
@ coBool
Definition Config.hpp:210
@ coFloat
Definition Config.hpp:184
@ coStrings
Definition Config.hpp:194
@ coFloats
Definition Config.hpp:186
@ coPercent
Definition Config.hpp:196
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:67
@ Shared
Definition PrintConfig.hpp:643

References Slic3r::ConfigDef::add(), Slic3r::atKeyPassword, Slic3r::ConfigOptionDef::category, Slic3r::ConfigOptionDef::cli, Slic3r::coBool, Slic3r::coEnum, Slic3r::coFloat, Slic3r::coFloats, Slic3r::coInt, Slic3r::comAdvanced, Slic3r::comDevelop, Slic3r::comExpert, Slic3r::comSimple, Slic3r::ConfigOptionFloat, Slic3r::ConfigOptionString, Slic3r::coPercent, Slic3r::coPoints, Slic3r::coPointsGroups, Slic3r::coString, Slic3r::coStrings, Slic3r::ConfigOptionDef::enum_keys_map, Slic3r::ConfigOptionDef::enum_labels, Slic3r::ConfigOptionDef::enum_values, Slic3r::ConfigOptionEnum< T >::get_enum_values(), Slic3r::ConfigOptionDef::gui_type, INITIAL_LAYER_HEIGHT, L, Slic3r::ConfigOptionDef::label, Slic3r::ConfigOptionDef::max, Slic3r::ConfigOptionDef::min, Slic3r::ConfigOptionDef::mode, Slic3r::ConfigOptionDef::nocli, Slic3r::ConfigOptionDef::one_string, Slic3r::ConfigOptionDef::plugin_config, Slic3r::ConfigOptionDef::plugin_type, Slic3r::ptFFF, Slic3r::ConfigOptionDef::select_open, Slic3r::ConfigOptionDef::set_default_value(), Slic3r::Shared, Slic3r::ConfigOptionDef::sidetext, and Slic3r::ConfigOptionDef::tooltip.

Referenced by PrintConfigDef().

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

◆ init_extruder_option_keys()

void Slic3r::PrintConfigDef::init_extruder_option_keys ( )
private
8990{
8991 // ConfigOptionFloats, ConfigOptionPercents, ConfigOptionBools, ConfigOptionStrings
8993 "default_filament_profile",
8994 "default_nozzle_volume_type",
8995 "deretraction_speed",
8996 "extruder_colour",
8997 "extruder_offset",
8998 "extruder_printable_height",
8999 "extruder_type",
9000 "long_retractions_when_cut",
9001 "max_layer_height",
9002 "min_layer_height",
9003 "nozzle_diameter",
9004 "nozzle_flush_dataset",
9005 "nozzle_type",
9006 "nozzle_volume",
9007 "retract_after_wipe",
9008 "retract_before_wipe",
9009 "retract_length_toolchange",
9010 "retract_lift_above",
9011 "retract_lift_below",
9012 "retract_lift_enforce",
9013 "retract_restart_extra",
9014 "retract_restart_extra_toolchange",
9015 "retract_when_changing_layer",
9016 "retraction_distances_when_cut",
9017 "retraction_length",
9018 "retraction_minimum_travel",
9019 "retraction_speed",
9020 "travel_slope",
9021 "wipe",
9022 "wipe_distance",
9023 "z_hop",
9024 "z_hop_types"
9025 };
9026
9028 "deretraction_speed",
9029 "long_retractions_when_cut",
9030 "retract_after_wipe",
9031 "retract_before_wipe",
9032 "retract_length_toolchange",
9033 "retract_lift_above",
9034 "retract_lift_below",
9035 "retract_lift_enforce",
9036 "retract_restart_extra",
9037 "retract_restart_extra_toolchange",
9038 "retract_when_changing_layer",
9039 "retraction_distances_when_cut",
9040 "retraction_length",
9041 "retraction_minimum_travel",
9042 "retraction_speed",
9043 "travel_slope",
9044 "wipe",
9045 "wipe_distance",
9046 "z_hop",
9047 "z_hop_types"
9048 };
9049 assert(std::is_sorted(m_extruder_retract_keys.begin(), m_extruder_retract_keys.end()));
9050}

References m_extruder_option_keys, and m_extruder_retract_keys.

Referenced by PrintConfigDef().

Here is the caller graph for this function:

◆ init_fff_params()

void Slic3r::PrintConfigDef::init_fff_params ( )
private
1318{
1319 ConfigOptionDef* def;
1320
1321 // Maximum extruder temperature, bumped to 1500 to support printing of glass.
1322 const int max_temp = 1500;
1323
1324 def = this->add("reduce_crossing_wall", coBool);
1325 def->label = L("Avoid crossing walls");
1326 def->category = L("Quality");
1327 def->tooltip = L("This detours to avoid traveling across walls, which may cause blobs on the surface.");
1328 def->mode = comAdvanced;
1329 def->set_default_value(new ConfigOptionBool(INITIAL_REDUCE_CROSSING_WALL));
1330
1331 def = this->add("max_travel_detour_distance", coFloatOrPercent);
1332 def->label = L("Avoid crossing walls - Max detour length");
1333 def->category = L("Quality");
1334 def->tooltip = L("Maximum detour distance for avoiding crossing wall: The printer won\'t detour if the detour distance is larger than this value. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path. A value of 0 will disable this.");
1335 def->sidetext = L("mm or %");
1336 def->min = 0;
1337 def->max_literal = 1000;
1338 def->mode = comAdvanced;
1339 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
1340
1341 // BBS
1342 def = this->add("supertack_plate_temp", coInts);
1343 def->label = L("Other layers");
1344 def->tooltip = L("This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate SuperTack.");
1345 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1346 def->full_label = L("Bed temperature");
1347 def->min = 0;
1348 def->max = 120;
1349 def->set_default_value(new ConfigOptionInts{35});
1350
1351 def = this->add("cool_plate_temp", coInts);
1352 def->label = L("Other layers");
1353 def->tooltip = L("This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Cool Plate.");
1354 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1355 def->full_label = L("Bed temperature");
1356 def->min = 0;
1357 def->max = 300;
1358 def->set_default_value(new ConfigOptionInts{ 35 });
1359
1360 def = this->add("textured_cool_plate_temp", coInts);
1361 def->label = L("Other layers");
1362 def->tooltip = L("This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Textured Cool Plate.");
1363 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1364 def->full_label = L("Bed temperature");
1365 def->min = 0;
1366 def->max = 300;
1367 def->set_default_value(new ConfigOptionInts{ 40 });
1368
1369 def = this->add("eng_plate_temp", coInts);
1370 def->label = L("Other layers");
1371 def->tooltip = L("This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Engineering Plate.");
1372 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1373 def->full_label = L("Bed temperature");
1374 def->min = 0;
1375 def->max = 300;
1376 def->set_default_value(new ConfigOptionInts{ 45 });
1377
1378 def = this->add("hot_plate_temp", coInts);
1379 def->label = L("Other layers");
1380 def->tooltip = L("This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the High Temp Plate.");
1381 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1382 def->full_label = L("Bed temperature");
1383 def->min = 0;
1384 def->max = 300;
1385 def->set_default_value(new ConfigOptionInts{ 45 });
1386
1387 def = this->add("textured_plate_temp", coInts);
1388 def->label = L("Other layers");
1389 def->tooltip = L("This is the bed temperature for layers except for the first one. A value of 0 means the filament does not support printing on the Textured PEI Plate.");
1390 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1391 def->full_label = L("Bed temperature");
1392 def->min = 0;
1393 def->max = 300;
1394 def->set_default_value(new ConfigOptionInts{45});
1395
1396 def = this->add("supertack_plate_temp_initial_layer", coInts);
1397 def->label = L("First layer");
1398 def->full_label = L("First layer bed temperature");
1399 def->tooltip = L("This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Cool Plate SuperTack.");
1400 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1401 def->min = 0;
1402 def->max = 120;
1403 def->set_default_value(new ConfigOptionInts{ 35 });
1404
1405 def = this->add("cool_plate_temp_initial_layer", coInts);
1406 def->label = L("First layer");
1407 def->full_label = L("First layer bed temperature");
1408 def->tooltip = L("This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Cool Plate.");
1409 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1410 def->min = 0;
1411 def->max = 120;
1412 def->set_default_value(new ConfigOptionInts{ 35 });
1413
1414 def = this->add("textured_cool_plate_temp_initial_layer", coInts);
1415 def->label = L("First layer");
1416 def->full_label = L("First layer bed temperature");
1417 def->tooltip = L("This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Textured Cool Plate.");
1418 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1419 def->min = 0;
1420 def->max = 120;
1421 def->set_default_value(new ConfigOptionInts{ 40 });
1422
1423 def = this->add("eng_plate_temp_initial_layer", coInts);
1424 def->label = L("First layer");
1425 def->full_label = L("First layer bed temperature");
1426 def->tooltip = L("This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Engineering Plate.");
1427 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1428 def->min = 0;
1429 def->max = 300;
1430 def->set_default_value(new ConfigOptionInts{ 45 });
1431
1432 def = this->add("hot_plate_temp_initial_layer", coInts);
1433 def->label = L("First layer");
1434 def->full_label = L("First layer bed temperature");
1435 def->tooltip = L("This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the High Temp Plate.");
1436 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1437 def->max = 300;
1438 def->set_default_value(new ConfigOptionInts{ 45 });
1439
1440 def = this->add("textured_plate_temp_initial_layer", coInts);
1441 def->label = L("First layer");
1442 def->full_label = L("First layer bed temperature");
1443 def->tooltip = L("This is the bed temperature of the first layer. A value of 0 means the filament does not support printing on the Textured PEI Plate.");
1444 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
1445 def->min = 0;
1446 def->max = 300;
1447 def->set_default_value(new ConfigOptionInts{45});
1448
1449 def = this->add("curr_bed_type", coEnum);
1450 def->label = L("Bed type");
1451 def->tooltip = L("Plate types supported by the printer");
1452 def->mode = comSimple;
1453 def->enum_keys_map = &s_keys_map_BedType;
1454 // Orca: make sure the order of the values is the same as the BedType enum
1455 def->enum_values.emplace_back("Cool Plate");
1456 def->enum_values.emplace_back("Engineering Plate");
1457 def->enum_values.emplace_back("High Temp Plate");
1458 def->enum_values.emplace_back("Textured PEI Plate");
1459 def->enum_values.emplace_back("Textured Cool Plate");
1460 def->enum_values.emplace_back("Supertack Plate");
1461 def->enum_labels.emplace_back(L("Smooth Cool Plate"));
1462 def->enum_labels.emplace_back(L("Engineering Plate"));
1463 def->enum_labels.emplace_back(L("Smooth High Temp Plate"));
1464 def->enum_labels.emplace_back(L("Textured PEI Plate"));
1465 def->enum_labels.emplace_back(L("Textured Cool Plate"));
1466 def->enum_labels.emplace_back(L("Cool Plate (SuperTack)"));
1467 def->set_default_value(new ConfigOptionEnum<BedType>(btPC));
1468
1469 // Orca: allow profile maker to set default bed type in machine profile
1470 // This option won't be shown in the UI
1471 def = this->add("default_bed_type", coString);
1472 def->label = L("Default bed type");
1473 def->tooltip = L("Default bed type for the printer (supports both numeric and string format).");
1474 def->mode = comAdvanced;
1475 def->set_default_value(new ConfigOptionString());
1476
1477 // BBS
1478 def = this->add("first_layer_print_sequence", coInts);
1479 def->label = L("First layer print sequence");
1480 def->min = 0;
1481 def->max = 16;
1482 def->set_default_value(new ConfigOptionInts{0});
1483
1484 def = this->add("other_layers_print_sequence", coInts);
1485 def->label = L("Other layers print sequence");
1486 def->min = 0;
1487 def->max = 16;
1488 def->set_default_value(new ConfigOptionInts{0});
1489
1490 def = this->add("other_layers_print_sequence_nums", coInt);
1491 def->label = L("The number of other layers print sequence");
1492 def->set_default_value(new ConfigOptionInt{0});
1493
1494 def = this->add("first_layer_sequence_choice", coEnum);
1495 def->category = L("Quality");
1496 def->label = L("First layer filament sequence");
1497 def->enum_keys_map = &ConfigOptionEnum<LayerSeq>::get_enum_values();
1498 def->enum_values.push_back("Auto");
1499 def->enum_values.push_back("Customize");
1500 def->enum_labels.push_back(L("Auto"));
1501 def->enum_labels.push_back(L("Customize"));
1502 def->mode = comSimple;
1503 def->set_default_value(new ConfigOptionEnum<LayerSeq>(flsAuto));
1504
1505 def = this->add("other_layers_sequence_choice", coEnum);
1506 def->category = L("Quality");
1507 def->label = L("Other layers filament sequence");
1508 def->enum_keys_map = &ConfigOptionEnum<LayerSeq>::get_enum_values();
1509 def->enum_values.push_back("Auto");
1510 def->enum_values.push_back("Customize");
1511 def->enum_labels.push_back(L("Auto"));
1512 def->enum_labels.push_back(L("Customize"));
1513 def->mode = comSimple;
1514 def->set_default_value(new ConfigOptionEnum<LayerSeq>(flsAuto));
1515
1516 def = this->add("before_layer_change_gcode", coString);
1517 def->label = L("Before layer change G-code");
1518 def->tooltip = L("This G-code is inserted at every layer change before the Z lift.");
1519 def->multiline = true;
1520 def->full_width = true;
1521 def->height = 5;
1522 def->mode = comAdvanced;
1523 def->set_default_value(new ConfigOptionString());
1524
1525 def = this->add("bottom_shell_layers", coInt);
1526 def->label = L("Bottom shell layers");
1527 def->category = L("Strength");
1528 def->sidetext = L("layers"); // ORCA add side text
1529 def->tooltip = L("This is the number of solid layers of bottom shell, including the bottom "
1530 "surface layer. When the thickness calculated by this value is thinner "
1531 "than bottom shell thickness, the bottom shell layers will be increased.");
1532 def->full_label = L("Bottom shell layers");
1533 def->min = 0;
1534 def->set_default_value(new ConfigOptionInt(3));
1535
1536 def = this->add("bottom_shell_thickness", coFloat);
1537 def->label = L("Bottom shell thickness");
1538 def->category = L("Strength");
1539 def->tooltip = L("The number of bottom solid layers is increased when slicing if the thickness calculated by bottom shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and the thickness of the bottom shell is determined simply by the number of bottom shell layers.");
1540 def->full_label = L("Bottom shell thickness");
1541 def->sidetext = L("mm"); // millimeters, CIS languages need translation
1542 def->min = 0;
1543 def->set_default_value(new ConfigOptionFloat(0.));
1544
1545 def = this->add("bottom_color_penetration_layers", coInt);
1546 def->label = L("Bottom paint penetration layers");
1547 def->category = L("Strength");
1548 def->sidetext = L("layers");
1549 def->tooltip = L("The number of layers, including the bottom surface layer, that take the color painted on a bottom surface. "
1550 "Set to 0 to use the bottom shell layers. A value larger than the bottom shell also colors the sparse "
1551 "infill above the painted area.");
1552 def->min = 0;
1553 def->mode = comAdvanced;
1554 def->set_default_value(new ConfigOptionInt(0));
1555
1556 def = this->add("gap_fill_target", coEnum);
1557 def->label = L("Apply gap fill");
1558 def->category = L("Strength");
1559 def->tooltip = L("Enables gap fill for the selected solid surfaces. The minimum gap length that will be filled can be controlled "
1560 "from the filter out tiny gaps option below.\n\n"
1561 "Options:\n"
1562 "1. Everywhere: Applies gap fill to top, bottom and internal solid surfaces for maximum strength\n"
1563 "2. Top and Bottom surfaces: Applies gap fill to top and bottom surfaces only, balancing print speed, "
1564 "reducing potential over extrusion in the solid infill and making sure the top and bottom surfaces have "
1565 "no pinhole gaps\n"
1566 "3. Nowhere: Disables gap fill for all solid infill areas\n\n"
1567 "Note that if using the classic perimeter generator, gap fill may also be generated between perimeters, "
1568 "if a full width line cannot fit between them. That perimeter gap fill is not controlled by this setting.\n\n"
1569 "If you would like all gap fill, including the classic perimeter generated one, removed, "
1570 "set the filter out tiny gaps value to a large number, like 999999.\n\n"
1571 "However this is not advised, as gap fill between perimeters is contributing to the model's strength. "
1572 "For models where excessive gap fill is generated between perimeters, a better option would be to "
1573 "switch to the arachne wall generator and use this option to control whether the cosmetic top and "
1574 "bottom surface gap fill is generated.");
1576 def->enum_values.push_back("everywhere");
1577 def->enum_values.push_back("topbottom");
1578 def->enum_values.push_back("nowhere");
1579 def->enum_labels.push_back(L("Everywhere"));
1580 def->enum_labels.push_back(L("Top and bottom surfaces"));
1581 def->enum_labels.push_back(L("Nowhere"));
1582 def->mode = comAdvanced;
1583 def->set_default_value(new ConfigOptionEnum<GapFillTarget>(gftNowhere));
1584
1585 def = this->add("enable_overhang_bridge_fan", coBools);
1586 def->label = L("Force cooling for overhangs and bridges");
1587 def->tooltip = L("Enable this option to allow adjustment of the part cooling fan speed for specifically for overhangs, internal and external "
1588 "bridges. Setting the fan speed specifically for these features can improve overall print quality and reduce warping.");
1589 def->mode = comSimple;
1590 def->set_default_value(new ConfigOptionBools{ true });
1591
1592 def = this->add("overhang_fan_speed", coInts);
1593 def->label = L("Overhangs and external bridges fan speed");
1594 def->tooltip = L("Use this part cooling fan speed when printing bridges or overhang walls with an overhang threshold that exceeds "
1595 "the value set in the 'Overhangs cooling threshold' parameter above. Increasing the cooling specifically for overhangs "
1596 "and bridges can improve the overall print quality of these features.\n\n"
1597 "Please note, this fan speed is clamped on the lower end by the minimum fan speed threshold set above. It is also adjusted "
1598 "upwards up to the maximum fan speed threshold when the minimum layer time threshold is not met.");
1599 def->sidetext = "%";
1600 def->min = 0;
1601 def->max = 100;
1602 def->mode = comAdvanced;
1603 def->set_default_value(new ConfigOptionInts { 100 });
1604
1605 def = this->add("overhang_fan_threshold", coEnums);
1606 def->label = L("Overhang cooling activation threshold");
1607 // xgettext:no-c-format, no-boost-format
1608 def->tooltip = L("When the overhang exceeds this specified threshold, force the cooling fan to run at the 'Overhang Fan Speed' set below. "
1609 "This threshold is expressed as a percentage, indicating the portion of each line's width that is unsupported by the layer "
1610 "beneath it. Setting this value to 0% forces the cooling fan to run for all outer walls, regardless of the overhang degree.");
1611 //def->sidetext = "";
1613 def->mode = comAdvanced;
1614 def->enum_values.emplace_back("0%");
1615 def->enum_values.emplace_back("10%");
1616 def->enum_values.emplace_back("25%");
1617 def->enum_values.emplace_back("50%");
1618 def->enum_values.emplace_back("75%");
1619 def->enum_values.emplace_back("95%");
1620 def->enum_labels.emplace_back("0%");
1621 def->enum_labels.emplace_back("10%");
1622 def->enum_labels.emplace_back("25%");
1623 def->enum_labels.emplace_back("50%");
1624 def->enum_labels.emplace_back("75%");
1625 def->enum_labels.emplace_back("95%");
1626 def->set_default_value(new ConfigOptionEnumsGeneric{ (int)Overhang_threshold_bridge });
1627
1628 def = this->add("bridge_angle", coFloat);
1629 def->label = L("External bridge infill direction");
1630 def->category = L("Strength");
1631 // xgettext:no-c-format, no-boost-format
1632 def->tooltip = L("External Bridging angle override.\n"
1633 "If left to zero, the bridging angle will be calculated automatically for each specific bridge.\n"
1634 "Otherwise the provided angle will be used according to:\n"
1635 " - The absolute coordinates\n"
1636 " - The absolute coordinates + Model rotation: If Align directions to model is enabled\n"
1637 " - The optimal automatic angle + this value: If 'Relative Bridge Angle' is enabled\n\n"
1638 "Use 180° for zero absolute angle.");
1639 def->sidetext = u8"°"; // degrees, don't need translation
1640 def->min = 0;
1641 def->max = 180;
1642 def->mode = comAdvanced;
1643 def->set_default_value(new ConfigOptionFloat(0.));
1644
1645 // ORCA: Internal bridge angle override
1646 def = this->add("internal_bridge_angle", coFloat);
1647 def->label = L("Internal bridge infill direction");
1648 def->category = L("Strength");
1649 def->tooltip = L("Internal Bridging angle override.\n"
1650 "If left to zero, the bridging angle will be calculated automatically for each specific bridge.\n"
1651 "Otherwise the provided angle will be used according to:\n"
1652 " - The absolute coordinates\n"
1653 " - The absolute coordinates + Model rotation: If Align directions to model is enabled\n"
1654 " - The optimal automatic angle + this value: If 'Relative Bridge Angle' is enabled\n\n"
1655 "Use 180° for zero absolute angle.");
1656 def->sidetext = u8"°"; // degrees, don't need translation
1657 def->min = 0;
1658 def->max = 180;
1659 def->mode = comAdvanced;
1660 def->set_default_value(new ConfigOptionFloat(0.));
1661
1662 // ORCA: Relative bridge angle
1663 def = this->add("relative_bridge_angle", coBool);
1664 def->label = L("Relative bridge angle");
1665 def->category = L("Strength");
1666 def->tooltip = L("When enabled, the bridge angle values are added to the automatically calculated bridge direction instead of overriding it.");
1667 def->mode = comAdvanced;
1668 def->set_default_value(new ConfigOptionBool(false));
1669
1670 def = this->add("bridge_density", coPercent);
1671 def->label = L("External bridge density");
1672 def->category = L("Strength");
1673 def->tooltip = L("Controls the density (spacing) of external bridge lines.\n"
1674 "Theoretically, 100% means a solid bridge, but due to the tendency of bridge extrusions to sag, 100% may not be sufficient.\n\n"
1675 "- Higher than 100% density (Recommended Max 125%):\n"
1676 " - Pros: Produces smoother bridge surfaces, as overlapping lines provide additional support during printing.\n"
1677 " - Cons: Can cause overextrusion, which may reduce lower and upper surface quality and increase the risk of warping.\n\n"
1678 "- Lower than 100% density (Min 10%):\n"
1679 " - Pros: Can create a string-like first layer. Faster and with better cooling because there is more space for air to circulate around the extruded bridge.\n"
1680 " - Cons: May lead to sagging and poorer surface finish.");
1681 def->sidetext = "%";
1682 def->min = 10;
1683 def->max = 125;
1684 def->mode = comAdvanced;
1685 def->set_default_value(new ConfigOptionPercent(100));
1686
1687 def = this->add("internal_bridge_density", coPercent);
1688 def->label = L("Internal bridge density");
1689 def->category = L("Strength");
1690 def->tooltip = L("Controls the density (spacing) of internal bridge lines.\n"
1691 "Internal bridges act as intermediate support between sparse infill and top solid infill and can strongly affect top surface quality.\n\n"
1692 "- Higher than 100% density (Recommended Max 125%):\n"
1693 " - Pros: Improves internal bridge strength and support under top layers, reducing sagging and improving top-surface finish.\n"
1694 " - Cons: Increases material use and print time; excessive density may cause overextrusion and internal stresses.\n\n"
1695 "- Lower than 100% density (Min 10%):\n"
1696 " - Pros: Can reduce pillowing and improve cooling (more airflow through the bridge), and may speed up printing.\n"
1697 " - Cons: May reduce internal support, increasing the risk of sagging and top surface defects.\n\n"
1698 "This option works particularly well when combined with the second internal bridge over infill option to improve bridging further before solid infill is extruded.");
1699 def->sidetext = "%";
1700 def->min = 10;
1701 def->max = 125;
1702 def->mode = comAdvanced;
1703 def->set_default_value(new ConfigOptionPercent(100));
1704
1705 def = this->add("bridge_flow", coFloat);
1706 def->label = L("Bridge flow ratio");
1707 def->category = L("Quality");
1708 def->tooltip = L("This value governs the thickness of the external (visible) bridge layer.\n"
1709 "Values above 1.0: Increase the amount of material while maintaining line spacing. This can improve line contact and strength.\n"
1710 "Values below 1.0: Reduce the amount of material while adjusting line spacing to maintain contact. This can improve sagging.\n\n"
1711 "The actual bridge flow used is calculated by multiplying this value with the filament flow ratio, and if set, the object's flow ratio.");
1712 def->min = 0;
1713 def->max = 2.0;
1714 def->mode = comAdvanced;
1715 def->set_default_value(new ConfigOptionFloat(1));
1716
1717 def = this->add("bridge_line_width", coFloatOrPercent);
1718 def->label = L("Bridge");
1719 def->category = L("Quality");
1720 def->tooltip = L("Line width of the Bridge. If expressed as a %, it will be computed over the nozzle diameter.\n"
1721 "Recommended to use with a higher Bridge density or Bridge flow ratio.\n\n"
1722 "The maximum value is 100% or the nozzle diameter.\n"
1723 "If set to 0, the line width will match the Internal solid infill width, or the nozzle diameter for thick bridges.");
1724 def->sidetext = L("mm or %");
1725 def->ratio_over = "nozzle_diameter";
1726 def->min = 0;
1727 def->max = 100;
1728 def->max_literal = 10;
1729 def->mode = comAdvanced;
1730 def->set_default_value(new ConfigOptionFloatOrPercent(100., true));
1731
1732 def = this->add("internal_bridge_flow", coFloat);
1733 def->label = L("Internal bridge flow ratio");
1734 def->category = L("Quality");
1735 def->tooltip = L("This value governs the thickness of the internal bridge layer. This is the first layer over sparse infill so increasing it may increase strength and upper layer quality.\n"
1736 "Values above 1.0: Increase the amount of material while maintaining line spacing. This can improve line contact and strength.\n"
1737 "Values below 1.0: Reduce the amount of material while adjusting line spacing to maintain contact. This can improve sagging.\n\n"
1738 "The actual bridge flow used is calculated by multiplying this value with the filament flow ratio, and if set, the object's flow ratio.");
1739 def->min = 0;
1740 def->max = 2.0;
1741 def->mode = comAdvanced;
1742 def->set_default_value(new ConfigOptionFloat(1));
1743
1744 def = this->add("top_solid_infill_flow_ratio", coFloats);
1745 def->label = L("Top surface flow ratio");
1746 def->category = L("Advanced");
1747 def->tooltip = L("This factor affects the amount of material for top solid infill. "
1748 "You can decrease it slightly to have smooth surface finish.\n\n"
1749 "The actual top surface flow used is calculated by multiplying this value with the filament flow ratio, and if set, the object's flow ratio.");
1750 def->min = 0;
1751 def->max = 2;
1752 def->mode = comAdvanced;
1753 def->nullable = true;
1754 def->set_default_value(new ConfigOptionFloatsNullable{1});
1755
1756 def = this->add("bottom_solid_infill_flow_ratio", coFloat);
1757 def->label = L("Bottom surface flow ratio");
1758 def->category = L("Advanced");
1759 def->tooltip = L("This factor affects the amount of material for bottom solid infill.\n\n"
1760 "The actual bottom solid infill flow used is calculated by multiplying this value with the filament flow ratio, and if set, the object's flow ratio.");
1761 def->min = 0;
1762 def->max = 2;
1763 def->mode = comAdvanced;
1764 def->set_default_value(new ConfigOptionFloat(1));
1765
1766 def = this->add("set_other_flow_ratios", coBool);
1767 def->label = L("Set other flow ratios");
1768 def->category = L("Advanced");
1769 def->tooltip = L("Change flow ratios for other extrusion path types.");
1770 def->mode = comAdvanced;
1771 def->set_default_value(new ConfigOptionBool(false));
1772
1773 def = this->add("first_layer_flow_ratio", coFloat);
1774 def->label = L("First layer flow ratio");
1775 def->category = L("Advanced");
1776 def->tooltip = L("This factor affects the amount of material on the first layer for the extrusion path roles listed in this section.\n\n"
1777 "For the first layer, the actual flow ratio for each path role (does not affect brims and skirts) will be multiplied by this value.");
1778 def->min = 0;
1779 def->max = 2;
1780 def->mode = comAdvanced;
1781 def->set_default_value(new ConfigOptionFloat(1));
1782
1783 def = this->add("outer_wall_flow_ratio", coFloat);
1784 def->label = L("Outer wall flow ratio");
1785 def->category = L("Advanced");
1786 def->tooltip = L("This factor affects the amount of material for outer walls.\n\n"
1787 "The actual outer wall flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1788 def->min = 0;
1789 def->max = 2;
1790 def->mode = comAdvanced;
1791 def->set_default_value(new ConfigOptionFloat(1));
1792
1793 def = this->add("inner_wall_flow_ratio", coFloat);
1794 def->label = L("Inner wall flow ratio");
1795 def->category = L("Advanced");
1796 def->tooltip = L("This factor affects the amount of material for inner walls.\n\n"
1797 "The actual inner wall flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1798 def->min = 0;
1799 def->max = 2;
1800 def->mode = comAdvanced;
1801 def->set_default_value(new ConfigOptionFloat(1));
1802
1803 def = this->add("overhang_flow_ratio", coFloat);
1804 def->label = L("Overhang flow ratio");
1805 def->category = L("Advanced");
1806 def->tooltip = L("This factor affects the amount of material for overhangs.\n\n"
1807 "The actual overhang flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1808 def->min = 0;
1809 def->max = 2;
1810 def->mode = comAdvanced;
1811 def->set_default_value(new ConfigOptionFloat(1));
1812
1813 def = this->add("sparse_infill_flow_ratio", coFloat);
1814 def->label = L("Sparse infill flow ratio");
1815 def->category = L("Advanced");
1816 def->tooltip = L("This factor affects the amount of material for sparse infill.\n\n"
1817 "The actual sparse infill flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1818 def->min = 0;
1819 def->max = 2;
1820 def->mode = comAdvanced;
1821 def->set_default_value(new ConfigOptionFloat(1));
1822
1823 def = this->add("internal_solid_infill_flow_ratio", coFloat);
1824 def->label = L("Internal solid infill flow ratio");
1825 def->category = L("Advanced");
1826 def->tooltip = L("This factor affects the amount of material for internal solid infill.\n\n"
1827 "The actual internal solid infill flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1828 def->min = 0;
1829 def->max = 2;
1830 def->mode = comAdvanced;
1831 def->set_default_value(new ConfigOptionFloat(1));
1832
1833 def = this->add("gap_fill_flow_ratio", coFloat);
1834 def->label = L("Gap fill flow ratio");
1835 def->category = L("Advanced");
1836 def->tooltip = L("This factor affects the amount of material for filling the gaps.\n\n"
1837 "The actual gap filling flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1838 def->min = 0;
1839 def->max = 2;
1840 def->mode = comAdvanced;
1841 def->set_default_value(new ConfigOptionFloat(1));
1842
1843 def = this->add("support_flow_ratio", coFloat);
1844 def->label = L("Support flow ratio");
1845 def->category = L("Advanced");
1846 def->tooltip = L("This factor affects the amount of material for support.\n\n"
1847 "The actual support flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1848 def->min = 0;
1849 def->max = 2;
1850 def->mode = comAdvanced;
1851 def->set_default_value(new ConfigOptionFloat(1));
1852
1853 def = this->add("support_interface_flow_ratio", coFloat);
1854 def->label = L("Support interface flow ratio");
1855 def->category = L("Advanced");
1856 def->tooltip = L("This factor affects the amount of material for the support interface.\n\n"
1857 "The actual support interface flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.");
1858 def->min = 0;
1859 def->max = 2;
1860 def->mode = comAdvanced;
1861 def->set_default_value(new ConfigOptionFloat(1));
1862
1863 def = this->add("precise_outer_wall",coBool);
1864 def->label = L("Precise wall");
1865 def->category = L("Quality");
1866 def->tooltip = L("Improve shell precision by adjusting outer wall spacing. This also improves layer consistency. NOTE: This option "
1867 "will be ignored for outer-inner or inner-outer-inner wall sequences.");
1868 def->set_default_value(new ConfigOptionBool{true});
1869
1870 def = this->add("only_one_wall_top", coBool);
1871 def->label = L("Only one wall on top surfaces");
1872 def->category = L("Quality");
1873 def->tooltip = L("Use only one wall on flat top surfaces, to give more space to the top infill pattern.");
1874 def->set_default_value(new ConfigOptionBool(false));
1875
1876 // the tooltip is copied from SuperStudio
1877 def = this->add("min_width_top_surface", coFloatOrPercent);
1878 def->label = L("One wall threshold");
1879 def->category = L("Quality");
1880 // xgettext:no-c-format, no-boost-format
1881 def->tooltip = L("If a top surface has to be printed and it's partially covered by another layer, it won't be considered at a top layer where its width is below this value."
1882 " This can be useful to not let the 'one perimeter on top' trigger on surface that should be covered only by perimeters."
1883 " This value can be a mm or a % of the perimeter extrusion width."
1884 "\nWarning: If enabled, artifacts can be created if you have some thin features on the next layer, like letters. Set this setting to 0 to remove these artifacts.");
1885 def->sidetext = L("mm or %");
1886 def->ratio_over = "inner_wall_line_width";
1887 def->min = 0;
1888 def->max_literal = 15;
1889 def->mode = comAdvanced;
1890 def->set_default_value(new ConfigOptionFloatOrPercent(300, true));
1891
1892 def = this->add("only_one_wall_first_layer", coBool);
1893 def->label = L("Only one wall on first layer");
1894 def->category = L("Quality");
1895 def->tooltip = L("Use only one wall on first layer, to give more space to the bottom infill pattern.");
1896 def->set_default_value(new ConfigOptionBool(false));
1897
1898 def = this->add("extra_perimeters_on_overhangs", coBool);
1899 def->label = L("Extra perimeters on overhangs");
1900 def->category = L("Quality");
1901 def->tooltip = L("Create additional perimeter paths over steep overhangs and areas where bridges cannot be anchored.");
1902 def->mode = comAdvanced;
1903 def->set_default_value(new ConfigOptionBool(false));
1904
1905 def = this->add("overhang_reverse", coBool);
1906 def->label = L("Reverse on even");
1907 def->full_label = L("Overhang reversal");
1908 def->category = L("Quality");
1909 def->tooltip = L("Extrude perimeters that have a part over an overhang in the reverse direction on even layers. This alternating pattern can drastically improve steep overhangs.\n\nThis setting can also help reduce part warping due to the reduction of stresses in the part walls.");
1910 def->mode = comAdvanced;
1911 def->set_default_value(new ConfigOptionBool(false));
1912
1913 def = this->add("overhang_reverse_internal_only", coBool);
1914 def->label = L("Reverse only internal perimeters");
1915 def->full_label = L("Reverse only internal perimeters");
1916 def->category = L("Quality");
1917 def->tooltip = L("Apply the reverse perimeters logic only on internal perimeters.\n\n"
1918 "This setting greatly reduces part stresses as they are now distributed in alternating directions. "
1919 "This should reduce part warping while also maintaining external wall quality. "
1920 "This feature can be very useful for warp prone material, like ABS/ASA, and also for elastic filaments, like TPU and Silk PLA. "
1921 "It can also help reduce warping on floating regions over supports.\n\nFor this setting to be the most effective, "
1922 "it is recommended to set the Reverse Threshold to 0 so that all internal walls print in alternating directions on even layers irrespective of their overhang degree.");
1923 def->mode = comAdvanced;
1924 def->set_default_value(new ConfigOptionBool(false));
1925
1926 def = this->add("counterbore_hole_bridging", coEnum);
1927 def->label = L("Bridge counterbore holes");
1928 def->category = L("Quality");
1929 def->tooltip = L(
1930 "This option creates bridges for counterbore holes, allowing them to be printed without support. Available modes include:\n"
1931 "1. None: No bridge is created\n"
1932 "2. Partially Bridged: Only a part of the unsupported area will be bridged\n"
1933 "3. Sacrificial Layer: A full sacrificial bridge layer is created");
1934 def->mode = comAdvanced;
1936 def->enum_values.emplace_back("none");
1937 def->enum_values.emplace_back("partiallybridge");
1938 def->enum_values.emplace_back("sacrificiallayer");
1939 def->enum_labels.emplace_back(L("None"));
1940 def->enum_labels.emplace_back(L("Partially bridged"));
1941 def->enum_labels.emplace_back(L("Sacrificial layer"));
1942 def->set_default_value(new ConfigOptionEnum<CounterboreHoleBridgingOption>(chbNone));
1943
1944 def = this->add("overhang_reverse_threshold", coFloatOrPercent);
1945 def->label = L("Reverse threshold");
1946 def->full_label = L("Overhang reversal threshold");
1947 def->category = L("Quality");
1948 // xgettext:no-c-format, no-boost-format
1949 def->tooltip = L("Number of mm the overhang need to be for the reversal to be considered useful. Can be a % of the perimeter width."
1950 "\nValue 0 enables reversal on every even layers regardless."
1951 "\nWhen Detect overhang wall is not enabled, this option is ignored and reversal happens on every even layers regardless.");
1952 def->sidetext = L("mm or %");
1953 def->ratio_over = "line_width";
1954 def->min = 0;
1955 def->max_literal = 20;
1956 def->mode = comAdvanced;
1957 def->set_default_value(new ConfigOptionFloatOrPercent(50, true));
1958
1959 def = this->add("enable_overhang_speed", coBools);
1960 def->label = L("Slow down for overhangs");
1961 def->category = L("Speed");
1962 def->tooltip = L("Enable this option to slow down when printing overhangs. The speeds for different overhang percentages are set below.");
1963 def->mode = comAdvanced;
1964 def->nullable = true;
1965 def->set_default_value(new ConfigOptionBoolsNullable{ true });
1966
1967 def = this->add("slowdown_for_curled_perimeters", coBools);
1968 def->label = L("Slow down for curled perimeters");
1969 def->category = L("Speed");
1970 // xgettext:no-c-format, no-boost-format
1971 def->tooltip = L("Enable this option to slow down printing in areas where perimeters may have curled upwards.\n"
1972 "For example, additional slowdown will be applied when printing overhangs on sharp corners like the "
1973 "front of the Benchy hull, reducing curling which compounds over multiple layers.\n\n"
1974 "It is generally recommended to have this option switched on unless your printer cooling is powerful enough or the "
1975 "print speed is slow enough that perimeter curling does not happen. \n"
1976 "If printing with a high external perimeter speed, this parameter may introduce wall artifacts when slowing down, "
1977 "due to the potentially large variance in print speeds causing the extruder to be unable to keep up with the requested flow change.\n"
1978 "Root cause of these artifacts is most likely PA tuning being slightly off, especially when combined "
1979 "with a high PA smooth time.\n\n"
1980 "Recommendations when enabling this option:\n"
1981 "1. Reduce Pressure Advance smooth time to 0.015 - 0.02 so the extruder reacts quickly to the speed changes.\n"
1982 "2. Increase the minimum print speeds to limit the magnitude of the slowdown and reduce the variance between fast and slow segments.\n"
1983 "3. If artifacts still appear, enable Extrusion Rate Smoothing (ERS) to further smooth the flow transitions.\n\n"
1984 "Note: When this option is enabled, overhang perimeters are treated like overhangs, meaning the overhang speed is "
1985 "applied even if the overhanging perimeter is part of a bridge.\n"
1986 "For example, when the perimeters are 100% overhanging, with no wall supporting them from underneath, the 75% overhang speed will be applied, limited by the bridge speed.");
1987 def->mode = comAdvanced;
1988 def->nullable = true;
1989 def->set_default_value(new ConfigOptionBoolsNullable{ false });
1990
1991 def = this->add("overhang_1_4_speed", coFloatsOrPercents);
1992 def->label = "10%";
1993 def->category = L("Speed");
1994 def->full_label = "10%";
1995 //def->tooltip = L("Speed for line of wall which has degree of overhang between 10% and 25% line width. "
1996 // "0 means using original wall speed.");
1997 def->sidetext = L("mm/s or %");
1998 def->ratio_over = "outer_wall_speed";
1999 def->min = 0;
2000 def->mode = comAdvanced;
2001 def->nullable = true;
2002 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(0, false)});
2003
2004 def = this->add("overhang_2_4_speed", coFloatsOrPercents);
2005 def->label = "25%";
2006 def->category = L("Speed");
2007 def->full_label = "25%";
2008 //def->tooltip = L("Speed for line of wall which has degree of overhang between 25% and 50% line width. "
2009 // "0 means using original wall speed.");
2010 def->sidetext = L("mm/s or %");
2011 def->ratio_over = "outer_wall_speed";
2012 def->min = 0;
2013 def->mode = comAdvanced;
2014 def->nullable = true;
2015 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(0, false)});
2016
2017 def = this->add("overhang_3_4_speed", coFloatsOrPercents);
2018 def->label = "50%";
2019 def->category = L("Speed");
2020 def->full_label = "50%";
2021 //def->tooltip = L("Speed for line of wall which has degree of overhang between 50% and 75% line width. "
2022 // "0 means using original wall speed.");
2023 def->sidetext = L("mm/s or %");
2024 def->ratio_over = "outer_wall_speed";
2025 def->min = 0;
2026 def->mode = comAdvanced;
2027 def->nullable = true;
2028 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(0, false)});
2029
2030 def = this->add("overhang_4_4_speed", coFloatsOrPercents);
2031 def->label = "75%";
2032 def->category = L("Speed");
2033 def->full_label = "75%";
2034 //def->tooltip = L("Speed for line of wall which has degree of overhang between 75% and 100% line width. "
2035 // "0 means using original wall speed.");
2036 def->sidetext = L("mm/s or %");
2037 def->ratio_over = "outer_wall_speed";
2038 def->min = 0;
2039 def->mode = comAdvanced;
2040 def->nullable = true;
2041 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(0, false)});
2042
2043 def = this->add("bridge_speed", coFloats);
2044 def->label = L("External");
2045 def->category = L("Speed");
2046 def->tooltip = L("Speed of the externally visible bridge extrusions.\n\n"
2047 "In addition, if Slow down for curled perimeters is disabled, "
2048 "it will be the print speed of overhang walls that are supported by less than 13%, "
2049 "whether they are part of a bridge or an overhang.");
2050 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
2051 def->min = 1;
2052 def->mode = comAdvanced;
2053 def->nullable = true;
2054 def->set_default_value(new ConfigOptionFloatsNullable{25});
2055
2056 def = this->add("internal_bridge_speed", coFloatsOrPercents);
2057 def->label = L("Internal");
2058 def->category = L("Speed");
2059 def->tooltip = L("Speed of internal bridges. If the value is expressed as a percentage, it will be calculated based on the bridge_speed. Default value is 150%.");
2060 def->sidetext = L("mm/s or %");
2061 def->ratio_over = "bridge_speed";
2062 def->min = 1;
2063 def->mode = comAdvanced;
2064 def->nullable = true;
2065 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(150, true)});
2066
2067 def = this->add("brim_width", coFloat);
2068 def->label = L("Brim width");
2069 def->category = L("Support");
2070 def->tooltip = L("This is the distance from the model to the outermost brim line.");
2071 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2072 def->min = 0;
2073 def->max = 100;
2074 def->mode = comSimple;
2075 def->set_default_value(new ConfigOptionFloat(0.));
2076
2077 def = this->add("leading_brim_length", coFloat);
2078 def->label = L("Leading brim length");
2079 def->category = L("Support");
2080 def->tooltip = L("Belt printers only. Extends the brim AHEAD of the object along the belt, on "
2081 "every downhill-facing edge of its contact area - both the object's first "
2082 "contact with the belt and any island that lands later. This apron is laid "
2083 "onto the belt before the object reaches it, so the leading edge has "
2084 "something already stuck down to hold on to.\n\n"
2085 "Measured on the belt surface, and added on top of Brim width: the brim "
2086 "reaches Brim-object gap + Leading brim length + Brim width ahead of the "
2087 "object. Set Brim-object gap to 0, or the apron will not touch the object it "
2088 "is meant to anchor.\n\n"
2089 "On a tilted belt each layer lays one strip of the brim, so the thickness of "
2090 "the resulting brim sheet is set by flow rather than by layer height. Use "
2091 "Brim flow ratio to tune it.\n\n"
2092 "Set to 0 to disable.");
2093 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2094 def->min = 0;
2095 def->max = 100;
2096 def->mode = comAdvanced;
2097 def->set_default_value(new ConfigOptionFloat(0.));
2098
2099 def = this->add("extra_brim_width", coFloat);
2100 def->label = L("Extra brim width");
2101 def->category = L("Support");
2102 def->tooltip = L("Belt printers only. Widens the brim SIDEWAYS, across the belt, without "
2103 "extending it further ahead of or behind the object. Use it when a part needs "
2104 "more grip along its length than Brim width alone gives.\n\n"
2105 "Measured on the belt surface, and added on top of Brim width: the brim "
2106 "reaches Brim-object gap + Brim width + Extra brim width to either side of "
2107 "the object. To extend the brim ahead of the object instead, use Leading brim "
2108 "length.\n\n"
2109 "Set to 0 to disable.");
2110 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2111 def->min = 0;
2112 def->max = 100;
2113 def->mode = comAdvanced;
2114 def->set_default_value(new ConfigOptionFloat(0.));
2115
2116 def = this->add("brim_type", coEnum);
2117 def->label = L("Brim type");
2118 def->category = L("Support");
2119 def->tooltip = L("This controls the generation of the brim at outer and/or inner side of models. "
2120 "Auto means the brim width is analyzed and calculated automatically.");
2121 def->enum_keys_map = &ConfigOptionEnum<BrimType>::get_enum_values();
2122 def->enum_values.emplace_back("auto_brim");
2123 def->enum_values.emplace_back("brim_ears");
2124 def->enum_values.emplace_back("painted");
2125 def->enum_values.emplace_back("outer_only");
2126 def->enum_values.emplace_back("inner_only");
2127 def->enum_values.emplace_back("outer_and_inner");
2128 def->enum_values.emplace_back("no_brim");
2129 def->enum_values.emplace_back("leading_edge_only");
2130 def->enum_labels.emplace_back(L("Auto"));
2131 def->enum_labels.emplace_back(L("Mouse ear"));
2132 def->enum_labels.emplace_back(L("Painted"));
2133 def->enum_labels.emplace_back(L("Outer brim only"));
2134 def->enum_labels.emplace_back(L("Inner brim only"));
2135 def->enum_labels.emplace_back(L("Outer and inner brim"));
2136 def->enum_labels.emplace_back(L("No-brim"));
2137 def->enum_labels.emplace_back(L("Leading edge only"));
2138 def->mode = comSimple;
2139 def->set_default_value(new ConfigOptionEnum<BrimType>(btAutoBrim));
2140
2141 def = this->add("brim_object_gap", coFloat);
2142 def->label = L("Brim-object gap");
2143 def->category = L("Support");
2144 def->tooltip = L("This creates a gap between the innermost brim line and the object and can make the brim easier to remove.");
2145 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2146 def->min = 0;
2147 def->max = 2;
2148 def->mode = comAdvanced;
2149 def->set_default_value(new ConfigOptionFloat(0.));
2150
2151 def = this->add("brim_flow_ratio", coFloat);
2152 def->label = L("Brim flow ratio");
2153 def->category = L("Support");
2154 def->tooltip = L("This factor affects the amount of material for brims.\n\n"
2155 "The actual brim flow used is calculated by multiplying this value by the filament flow ratio, and if set, the object's flow ratio.\n\n"
2156 "Note: The resulting value will not be affected by the first-layer flow ratio.");
2157 def->min = 0;
2158 def->max = 2;
2159 def->mode = comAdvanced;
2160 def->set_default_value(new ConfigOptionFloat(1));
2161
2162 def = this->add("brim_use_efc_outline", coBool);
2163 def->label = L("Brim follows compensated outline");
2164 def->category = L("Support");
2165 def->tooltip = L("When enabled, the brim is aligned with the first-layer perimeter geometry after Elephant Foot Compensation is applied.\nThis option is intended for cases where Elephant Foot Compensation significantly alters the first-layer footprint.\n\nIf your current setup already works well, enabling it may be unnecessary and can cause the brim to fuse with upper layers.");
2166 def->mode = comAdvanced;
2167 def->set_default_value(new ConfigOptionBool(false));
2168
2169 def = this->add("combine_brims", coBool);
2170 def->label = L("Combine brims");
2171 def->category = L("Support");
2172 def->tooltip = L("Combine multiple brims into one when they are close to each other. This can improve brim adhesion.");
2173 def->mode = comAdvanced;
2174 def->set_default_value(new ConfigOptionBool(false));
2175
2176 def = this->add("brim_ears", coBool);
2177 def->label = L("Brim ears");
2178 def->category = L("Support");
2179 def->tooltip = L("Only draw brim over the sharp edges of the model.");
2180 def->mode = comAdvanced;
2181 def->set_default_value(new ConfigOptionBool(false));
2182
2183 def = this->add("brim_ears_max_angle", coFloat);
2184 def->label = L("Brim ear max angle");
2185 def->category = L("Support");
2186 def->tooltip = L("Maximum angle to let a brim ear appear.\n"
2187 "If set to 0, no brim will be created.\n"
2188 "If set to ~180, brim will be created on everything but straight sections.");
2189 def->sidetext = u8"°"; // degrees, don't need translation
2190 def->min = 0;
2191 def->max = 180;
2192 def->mode = comAdvanced;
2193 def->set_default_value(new ConfigOptionFloat(125));
2194
2195 def = this->add("brim_ears_detection_length", coFloat);
2196 def->label = L("Brim ear detection radius");
2197 def->category = L("Support");
2198 def->tooltip = L("The geometry will be decimated before detecting sharp angles. "
2199 "This parameter indicates the minimum length of the deviation for the decimation.\n"
2200 "0 to deactivate.");
2201 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2202 def->min = 0;
2203 def->mode = comAdvanced;
2204 def->set_default_value(new ConfigOptionFloat(1));
2205
2206 def = this->add("brim_ears_outer_only", coBool);
2207 def->label = L("Brim ears outer only");
2208 def->category = L("Support");
2209 def->tooltip = L("Generate mouse ears only on the outer contour of the model, excluding holes and enclosed sections.");
2210 def->mode = comAdvanced;
2211 def->set_default_value(new ConfigOptionBool(false));
2212
2213 def = this->add("compatible_printers", coStrings);
2214 def->label = L("Select printers");
2215 def->mode = comAdvanced;
2216 def->set_default_value(new ConfigOptionStrings());
2217 def->cli = ConfigOptionDef::nocli;
2218
2219 //BBS.
2220 def = this->add("upward_compatible_machine", coStrings);
2221 def->label = L("upward compatible machine");
2222 def->mode = comAdvanced;
2223 def->set_default_value(new ConfigOptionStrings());
2224 def->cli = ConfigOptionDef::nocli;
2225
2226 def = this->add("compatible_printers_condition", coString);
2227 def->label = L("Condition");
2228 def->tooltip = L("A Boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile.");
2229 def->mode = comAdvanced;
2230 def->set_default_value(new ConfigOptionString());
2231 def->cli = ConfigOptionDef::nocli;
2232
2233 def = this->add("compatible_prints", coStrings);
2234 def->label = L("Select profiles");
2235 def->mode = comAdvanced;
2236 def->set_default_value(new ConfigOptionStrings());
2237 def->cli = ConfigOptionDef::nocli;
2238
2239 def = this->add("compatible_prints_condition", coString);
2240 def->label = L("Condition");
2241 def->tooltip = L("A Boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile.");
2242 def->mode = comAdvanced;
2243 def->set_default_value(new ConfigOptionString());
2244 def->cli = ConfigOptionDef::nocli;
2245
2246 // The following value is to be stored into the project file (AMF, 3MF, Config ...)
2247 // and it contains a sum of "compatible_printers_condition" values over the print and filament profiles.
2248 def = this->add("compatible_machine_expression_group", coStrings);
2249 def->set_default_value(new ConfigOptionStrings());
2250 def->cli = ConfigOptionDef::nocli;
2251 def = this->add("compatible_process_expression_group", coStrings);
2252 def->set_default_value(new ConfigOptionStrings());
2253 def->cli = ConfigOptionDef::nocli;
2254
2255 //BBS: add logic for checking between different system presets
2256 def = this->add("different_settings_to_system", coStrings);
2257 def->set_default_value(new ConfigOptionStrings());
2258 def->cli = ConfigOptionDef::nocli;
2259
2260 def = this->add("print_compatible_printers", coStrings);
2261 def->set_default_value(new ConfigOptionStrings());
2262 def->cli = ConfigOptionDef::nocli;
2263
2264 def = this->add("print_sequence", coEnum);
2265 def->label = L("Print sequence");
2266 def->tooltip = L("This determines the print sequence, allowing you to print layer-by-layer or object-by-object.");
2268 def->enum_values.push_back("by layer");
2269 def->enum_values.push_back("by object");
2270 def->enum_labels.push_back(L("By layer"));
2271 def->enum_labels.push_back(L("By object"));
2272 def->mode = comSimple;
2273 def->set_default_value(new ConfigOptionEnum<PrintSequence>(PrintSequence::ByLayer));
2274
2275 def = this->add("print_order", coEnum);
2276 def->label = L("Intra-layer order");
2277 def->tooltip = L("Order in which object instances are visited within a single layer, which controls how much "
2278 "travel is spent moving between them.\n\n"
2279 "Default: nearest-neighbor chaining, refined with 2-opt and crossing removal. A good general "
2280 "choice.\n"
2281 "As object list: instances are printed in the same order as the object list, without any path "
2282 "optimization. Use it when you need a predictable, manually controlled order.\n"
2283 "Best of all (shortest path): every strategy is evaluated and the shortest one is used. The "
2284 "object instance order is decided once for the whole print, while the ordering of individual "
2285 "islands is decided per layer, so different layers may end up using different strategies. "
2286 "Slightly slower to slice.\n"
2287 "Snake: serpentine row-by-row traversal, refined with 2-opt. Well suited to regular grids of "
2288 "many small parts.\n\n"
2289 "With multiple filaments or tools in the same layer, minimizing tool changes takes priority: "
2290 "objects are grouped by filament first and this setting only orders the instances within each "
2291 "filament group, so the overall sequence may not look like the shortest path across the plate.");
2292 def->enum_keys_map = &ConfigOptionEnum<PrintOrder>::get_enum_values();
2293 def->enum_values.push_back("default");
2294 def->enum_values.push_back("as_obj_list");
2295 def->enum_values.push_back("best_of");
2296 def->enum_values.push_back("snake");
2297 def->enum_labels.push_back(L("Default"));
2298 def->enum_labels.push_back(L("As object list"));
2299 def->enum_labels.push_back(L("Best of all (shortest path)"));
2300 def->enum_labels.push_back(L("Snake"));
2301 def->mode = comAdvanced;
2302 def->set_default_value(new ConfigOptionEnum<PrintOrder>(PrintOrder::Default));
2303
2304 def = this->add("slow_down_for_layer_cooling", coBools);
2305 def->label = L("Slow printing down for better layer cooling");
2306 def->tooltip = L("Enable this option to slow printing speed down to ensure that the final layer time is not shorter than the layer time threshold in \"Max fan speed threshold\", so that the layer can be cooled for a longer time. This can improve the quality for small details.");
2307 def->set_default_value(new ConfigOptionBools { true });
2308
2309 def = this->add("default_acceleration", coFloats);
2310 def->label = L("Normal printing");
2311 def->category = L("Speed");
2312 def->tooltip = L("This is the default acceleration for both normal printing and travel after the first layer.");
2313 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
2314 def->min = 0;
2315 def->mode = comAdvanced;
2316 def->nullable = true;
2317 def->set_default_value(new ConfigOptionFloatsNullable{500.0});
2318
2319 def = this->add("travel_acceleration", coFloats);
2320 def->label = L("Travel");
2321 def->category = L("Speed");
2322 def->tooltip = L("Acceleration of travel moves.");
2323 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
2324 def->min = 0;
2325 def->mode = comAdvanced;
2326 def->nullable = true;
2327 def->set_default_value(new ConfigOptionFloatsNullable{10000.0});
2328
2329 def = this->add("initial_layer_travel_acceleration", coFloatsOrPercents);
2330 def->label = L("First layer travel");
2331 def->tooltip = L("Travel acceleration of first layer.\nThe percentage value is relative to Travel Acceleration.");
2332 def->sidetext = L(u8"mm/s² or %");
2333 def->min = 0;
2334 def->mode = comAdvanced;
2335 def->ratio_over = "travel_acceleration";
2336 def->nullable = true;
2337 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(100, true)});
2338
2339 def = this->add("bridge_acceleration", coFloatsOrPercents);
2340 def->label = L("Bridge");
2341 def->category = L("Speed");
2342 def->tooltip = L("Acceleration of bridges. If the value is expressed as a percentage (e.g. 50%), it will be calculated based on the outer wall acceleration.");
2343 def->sidetext = L(u8"mm/s² or %");
2344 def->min = 0;
2345 def->mode = comAdvanced;
2346 def->ratio_over = "outer_wall_acceleration";
2347 def->nullable = true;
2348 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(50,true)});
2349
2350 def = this->add("default_filament_profile", coStrings);
2351 def->label = L("Default filament profile");
2352 def->tooltip = L("Default filament profile when switching to this machine profile.");
2353 def->set_default_value(new ConfigOptionStrings());
2354 def->cli = ConfigOptionDef::nocli;
2355
2356 def = this->add("default_print_profile", coString);
2357 def->label = L("Default process profile");
2358 def->tooltip = L("Default process profile when switching to this machine profile.");
2359 def->set_default_value(new ConfigOptionString());
2360 def->cli = ConfigOptionDef::nocli;
2361
2362 def = this->add("activate_air_filtration",coBools);
2363 def->label = L("Activate air filtration");
2364 def->tooltip = L("Activate for better air filtration. G-code command: M106 P3 S(0-255)");
2365 def->mode = comSimple;
2366 def->set_default_value(new ConfigOptionBools{false});
2367
2368
2369 def = this->add("activate_air_filtration_during_print", coBools);
2370 def->full_label = L("During print");
2371 def->tooltip=L("Enable this to override the fan speed set in custom G-code during print.");
2372 def->mode = comSimple;
2373 def->set_default_value(new ConfigOptionBools{true});
2374
2375 def = this->add("activate_air_filtration_on_completion", coBools);
2376 def->full_label = L("On completion");
2377 def->tooltip=L("Enable this to override the fan speed set in custom G-code after print completion.");
2378 def->mode = comSimple;
2379 def->set_default_value(new ConfigOptionBools{true});
2380
2381 def = this->add("during_print_exhaust_fan_speed", coInts);
2382 def->label = L("Fan speed");
2383 def->tooltip=L("Speed of exhaust fan during printing. This speed will override the speed in filament custom G-code.");
2384 def->sidetext = "%";
2385 def->min=0;
2386 def->max=100;
2387 def->mode = comSimple;
2388 def->set_default_value(new ConfigOptionInts{60});
2389
2390 def = this->add("complete_print_exhaust_fan_speed", coInts);
2391 def->label = L("Fan speed");
2392 def->tooltip=L("Speed of exhaust fan after printing completes.");
2393 def->sidetext = "%";
2394 def->min=0;
2395 def->max=100;
2396 def->mode = comSimple;
2397 def->set_default_value(new ConfigOptionInts{80});
2398
2399 def = this->add("close_fan_the_first_x_layers", coInts);
2400 def->label = L("No cooling for the first");
2401 def->tooltip = L("Turn off all cooling fans for the first few layers. "
2402 "This can be used to improve build plate adhesion.");
2403 def->sidetext = L("layers");
2404 def->min = 0;
2405 def->max = 1000;
2406 def->mode = comSimple;
2407 def->set_default_value(new ConfigOptionInts { 1 });
2408
2409 def = this->add("bridge_no_support", coBool);
2410 def->label = L("Don't support bridges");
2411 def->category = L("Support");
2412 def->tooltip = L("This disables supporting bridges, which decreases the amount of support required. Bridges can usually be printed directly without support over a reasonable distance.");
2413 def->mode = comAdvanced;
2414 def->set_default_value(new ConfigOptionBool(false));
2415
2416 def = this->add("thick_bridges", coBool);
2417 def->label = L("Thick external bridges");
2418 def->category = L("Quality");
2419 def->tooltip = L("If enabled, bridge extrusion uses a line height equal to the nozzle diameter.\n"
2420 "This increases bridge strength and reliability, allowing longer spans, but may worsen appearance.\n"
2421 "If disabled, bridges may look better but are generally reliable only for shorter spans.");
2422 def->mode = comAdvanced;
2423 def->set_default_value(new ConfigOptionBool(false));
2424
2425 def = this->add("thick_internal_bridges", coBool);
2426 def->label = L("Thick internal bridges");
2427 def->category = L("Quality");
2428 def->tooltip = L("If enabled, internal bridge extrusion uses a line height equal to the nozzle diameter.\n"
2429 "This increases internal bridge strength and reliability when printed over sparse infill, but may worsen appearance.\n"
2430 "If disabled, internal bridges may look better but can be less reliable over sparse infill.");
2431 def->mode = comAdvanced;
2432 def->set_default_value(new ConfigOptionBool(true));
2433
2434 def = this->add("enable_extra_bridge_layer", coEnum);
2435 def->label = L("Extra bridge layers (beta)");
2436 def->category = L("Quality");
2437 def->tooltip = L("This option enables the generation of an extra bridge layer over internal and/or external bridges.\n\n"
2438 "Extra bridge layers help improve bridge appearance and reliability, as the solid infill is better supported. "
2439 "This is especially useful in fast printers, where the bridge and solid infill speeds vary greatly. "
2440 "The extra bridge layer results in reduced pillowing on top surfaces, as well as reduced separation of the external bridge layer from its surrounding perimeters.\n\n"
2441 "It is generally recommended to set this to at least 'External bridge only', unless specific issues with the sliced model are found.\n\n"
2442 "Options:\n"
2443 "1. Disabled - does not generate second bridge layers. This is the default and is set for compatibility purposes\n"
2444 "2. External bridge only - generates second bridge layers for external-facing bridges only. Please note that small bridges that are shorter "
2445 "or narrower than the set number of perimeters will be skipped as they would not benefit from a second bridge layer. If generated, "
2446 "the second bridge layer will be extruded parallel to the first bridge layer to reinforce the bridge strength\n"
2447 "3. Internal bridge only - generates second bridge layers for internal bridges over sparse infill only. "
2448 "Please note that the internal bridges count towards the top shell layer count of your model. "
2449 "The second internal bridge layer will be extruded as close to perpendicular to the first as possible. "
2450 "If multiple regions in the same island, with varying bridge angles are present, the last region of that island will be selected as the angle reference\n"
2451 "4. Apply to all - generates second bridge layers for both internal and external-facing bridges\n");
2452
2454 def->enum_values.push_back("disabled");
2455 def->enum_values.push_back("external_bridge_only");
2456 def->enum_values.push_back("internal_bridge_only");
2457 def->enum_values.push_back("apply_to_all");
2458 def->enum_labels.push_back(L("Disabled"));
2459 def->enum_labels.push_back(L("External bridge only"));
2460 def->enum_labels.push_back(L("Internal bridge only"));
2461 def->enum_labels.push_back(L("Apply to all"));
2462 def->mode = comAdvanced;
2463 def->set_default_value(new ConfigOptionEnum<EnableExtraBridgeLayer>(eblDisabled));
2464
2465 def = this->add("dont_filter_internal_bridges", coEnum);
2466 def->label = L("Filter out small internal bridges");
2467 def->category = L("Quality");
2468 def->tooltip = L("This option can help reduce pillowing on top surfaces in heavily slanted or curved models.\n"
2469 "By default, small internal bridges are filtered out and the internal solid infill is printed "
2470 "directly over the sparse infill. This works well in most cases, speeding up printing without "
2471 "too much compromise on top surface quality.\n"
2472 "However, in heavily slanted or curved models, especially where too low a sparse infill density "
2473 "is used, this may result in curling of the unsupported solid infill, causing pillowing.\n"
2474 "Enabling limited filtering or no filtering will print internal bridge layer over slightly "
2475 "unsupported internal solid infill. The options below control the sensitivity of the filtering, "
2476 "i.e. they control where internal bridges are created:\n"
2477 "1. Filter - enables this option. This is the default behavior and works well in most cases\n"
2478 "2. Limited filtering - creates internal bridges on heavily slanted surfaces while avoiding "
2479 "unnecessary bridges. This works well for most difficult models\n"
2480 "3. No filtering - creates internal bridges on every potential internal overhang. This option is "
2481 "useful for heavily slanted top surface models; however, in most cases, it creates too many "
2482 "unnecessary bridges.");
2484 def->enum_values.push_back("disabled");
2485 def->enum_values.push_back("limited");
2486 def->enum_values.push_back("nofilter");
2487 def->enum_labels.push_back(L("Filter"));
2488 def->enum_labels.push_back(L("Limited filtering"));
2489 def->enum_labels.push_back(L("No filtering"));
2490 def->mode = comAdvanced;
2491 def->set_default_value(new ConfigOptionEnum<InternalBridgeFilter>(ibfDisabled));
2492
2493
2494 def = this->add("max_bridge_length", coFloat);
2495 def->label = L("Max bridge length");
2496 def->category = L("Support");
2497 def->tooltip = L("This is the maximum length of bridges that don\'t need support. Set it to 0 if you want all bridges to be supported, and set it to a very large value if you don\'t want any bridges to be supported.");
2498 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2499 def->min = 0;
2500 def->mode = comAdvanced;
2501 def->set_default_value(new ConfigOptionFloat(10));
2502
2503 def = this->add("machine_end_gcode", coString);
2504 def->label = L("End G-code");
2505 def->tooltip = L("Add end G-code when finishing the entire print.");
2506 def->multiline = true;
2507 def->full_width = true;
2508 def->height = 12;
2509 def->mode = comAdvanced;
2510 def->set_default_value(new ConfigOptionString("M104 S0 ; turn off temperature\nG28 X0 ; home X axis\nM84 ; disable motors\n"));
2511
2512 def = this->add("printing_by_object_gcode", coString);
2513 def->label = L("Between Object G-code");
2514 def->tooltip = L("Insert G-code between objects. This parameter will only come into effect when you print your models object by object.");
2515 def->multiline = true;
2516 def->full_width = true;
2517 def->height = 12;
2518 def->mode = comAdvanced;
2519 def->set_default_value(new ConfigOptionString());
2520
2521 def = this->add("filament_end_gcode", coStrings);
2522 def->label = L("End G-code");
2523 def->tooltip = L("Add end G-code when finishing the printing of this filament.");
2524 def->multiline = true;
2525 def->full_width = true;
2526 def->height = 120;
2527 def->mode = comAdvanced;
2528 def->set_default_value(new ConfigOptionStrings { " " });
2529
2530 def = this->add("ensure_vertical_shell_thickness", coEnum);
2531 def->label = L("Ensure vertical shell thickness");
2532 def->category = L("Strength");
2533 def->tooltip = L(
2534 "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)\nNone: No solid infill "
2535 "will be added anywhere. Caution: Use this option carefully if your model has sloped surfaces\nCritical Only: Avoid adding solid infill for walls\nModerate: Add solid infill for heavily "
2536 "sloping surfaces only\nAll: Add solid infill for all suitable sloping surfaces\nDefault value is All.");
2538 def->enum_values.push_back("none");
2539 def->enum_values.push_back("ensure_critical_only");
2540 def->enum_values.push_back("ensure_moderate");
2541 def->enum_values.push_back("ensure_all");
2542 def->enum_labels.push_back(L("None"));
2543 def->enum_labels.push_back(L("Critical Only"));
2544 def->enum_labels.push_back(L("Moderate"));
2545 def->enum_labels.push_back(L("All"));
2546 def->mode = comAdvanced;
2547 def->set_default_value(new ConfigOptionEnum<EnsureVerticalShellThickness>(EnsureVerticalShellThickness::evstAll));
2548
2549 auto def_top_fill_pattern = def = this->add("top_surface_pattern", coEnum);
2550 def->label = L("Top surface pattern");
2551 def->category = L("Strength");
2552 def->tooltip = L("This is the line pattern for top surface infill.");
2554 def->enum_values.push_back("monotonic");
2555 def->enum_values.push_back("monotonicline");
2556 def->enum_values.push_back("rectilinear");
2557 def->enum_values.push_back("alignedrectilinear");
2558 def->enum_values.push_back("concentric");
2559 def->enum_values.push_back("spiralinset");
2560 def->enum_values.push_back("hilbertcurve");
2561 def->enum_values.push_back("archimedeanchords");
2562 def->enum_values.push_back("octagramspiral");
2563 def->enum_labels.push_back(L("Monotonic"));
2564 def->enum_labels.push_back(L("Monotonic line"));
2565 def->enum_labels.push_back(L("Rectilinear"));
2566 def->enum_labels.push_back(L("Aligned Rectilinear"));
2567 def->enum_labels.push_back(L("Concentric"));
2568 def->enum_labels.push_back(L("Spiral Inset"));
2569 def->enum_labels.push_back(L("Hilbert Curve"));
2570 def->enum_labels.push_back(L("Archimedean Chords"));
2571 def->enum_labels.push_back(L("Octagram Spiral"));
2572 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonicLine));
2573
2574 def = this->add("top_surface_density", coPercent);
2575 def->label = L("Top surface density");
2576 def->category = L("Strength");
2577 def->tooltip = L("Density of top surface layer. A value of 100% creates a fully solid, smooth top layer. "
2578 "Reducing this value results in a textured top surface, according to the chosen top surface pattern. "
2579 "A value of 0% will result in only the walls on the top layer being created. "
2580 "Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.");
2581 def->sidetext = ("%");
2582 def->min = 0;
2583 def->max = 100;
2584 def->set_default_value(new ConfigOptionPercent(100));
2585
2586 def = this->add("top_surface_expansion", coFloat);
2587 def->label = L("Top surface expansion");
2588 def->category = L("Strength");
2589 def->tooltip = L("Expands the top surfaces by this distance to connect distinct top surfaces and fill gaps.\n"
2590 "Useful for cases where the top surface is interrupted by a raised feature, such as text on a plane. "
2591 "Expanding it removes the holes beneath these features and creates a continuous path with a better finish for printing on top. "
2592 "The expansion is applied to the original top surface, before any other processing such as bridging or overhang detection.");
2593 def->sidetext = L("mm");
2594 def->min = 0;
2595 def->mode = comAdvanced;
2596 def->set_default_value(new ConfigOptionFloat(0));
2597
2598 def = this->add("top_surface_expansion_margin", coFloat);
2599 def->label = L("Top expansion wall margin");
2600 def->category = L("Strength");
2601 def->tooltip = L("Using “Top surface expansion” may cause a surface that did not previously touch the model's outer walls to now do so.\n"
2602 "This can cause contraction marks (such as the hull line) on the outer walls.\n"
2603 "By adding a small margin, this contraction will not occur directly on the walls, thereby preventing a visible mark.");
2604 def->sidetext = L("mm");
2605 def->min = 0;
2606 def->max = 10;
2607 def->mode = comAdvanced;
2608 def->set_default_value(new ConfigOptionFloat(0));
2609
2610 def = this->add("top_surface_expansion_direction", coEnum);
2611 def->label = L("Top expansion direction");
2612 def->category = L("Strength");
2613 def->tooltip = L("Direction in which the top surface expansion grows.\n"
2614 " - Inward grows into the holes and gaps left by features rising from the middle of a top surface.\n"
2615 " - Outward grows the outer edge of the surface, connecting surfaces separated by features that can divide a surface, such as a lattice pattern.\n"
2616 " - Inward and Outward does both.");
2618 def->enum_values.push_back("inward_and_outward");
2619 def->enum_values.push_back("inward");
2620 def->enum_values.push_back("outward");
2621 def->enum_labels.push_back(L("Inward and Outward"));
2622 def->enum_labels.push_back(L("Inward"));
2623 def->enum_labels.push_back(L("Outward"));
2624 def->mode = comAdvanced;
2625 def->set_default_value(new ConfigOptionEnum<TopSurfaceExpansionDirection>(TopSurfaceExpansionDirection::InwardAndOutward));
2626
2627 def = this->add("bottom_surface_pattern", coEnum);
2628 def->label = L("Bottom surface pattern");
2629 def->category = L("Strength");
2630 def->tooltip = L("This is the line pattern of bottom surface infill, not including bridge infill.");
2632 def->enum_values = def_top_fill_pattern->enum_values;
2633 def->enum_labels = def_top_fill_pattern->enum_labels;
2634 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic));
2635
2636 def = this->add("bottom_surface_density", coPercent);
2637 def->label = L("Bottom surface density");
2638 def->category = L("Strength");
2639 def->tooltip = L("Density of the bottom surface layer. "
2640 "Intended for aesthetic or functional purposes, not to fix issues such as over-extrusion.\n"
2641 "WARNING: Lowering this value may negatively affect bed adhesion.");
2642 def->sidetext = ("%");
2643 def->min = 10;
2644 def->max = 100;
2645 def->set_default_value(new ConfigOptionPercent(100));
2646
2647 auto def_top_fill_order = def = this->add("top_surface_fill_order", coEnum);
2648 def->label = L("Top surface fill order");
2649 def->category = L("Strength");
2650 def->tooltip = L("Direction in which top surfaces are filled when using a center-based pattern "
2651 "(Concentric, Spiral Inset, Archimedean Chords, Octagram Spiral).\n"
2652 "Outward starts at the center of the surface, so any excess material is pushed "
2653 "towards the edge where it is least visible. Inward starts at the edge and ends "
2654 "with the tight curves at the center.\n"
2655 "Default uses shortest-path ordering, which may run in either direction.");
2657 def->enum_values.push_back("default");
2658 def->enum_values.push_back("outward");
2659 def->enum_values.push_back("inward");
2660 def->enum_labels.push_back(L("Default"));
2661 def->enum_labels.push_back(L("Outward"));
2662 def->enum_labels.push_back(L("Inward"));
2663 def->mode = comAdvanced;
2664 def->set_default_value(new ConfigOptionEnum<SurfaceFillOrder>(SurfaceFillOrder::Default));
2665
2666 def = this->add("bottom_surface_fill_order", coEnum);
2667 def->label = L("Bottom surface fill order");
2668 def->category = L("Strength");
2669 def->tooltip = L("Direction in which bottom surfaces are filled when using a center-based pattern "
2670 "(Concentric, Spiral Inset, Archimedean Chords, Octagram Spiral).\n"
2671 "Inward starts each surface with the wider outer curves, which improves first layer "
2672 "adhesion on build plates where the tight curves at the center may not stick. "
2673 "Outward starts at the center, pushing any excess material towards the edge.\n"
2674 "Default uses shortest-path ordering, which may run in either direction.");
2676 def->enum_values = def_top_fill_order->enum_values;
2677 def->enum_labels = def_top_fill_order->enum_labels;
2678 def->mode = comAdvanced;
2679 def->set_default_value(new ConfigOptionEnum<SurfaceFillOrder>(SurfaceFillOrder::Default));
2680
2681 def = this->add("internal_solid_infill_pattern", coEnum);
2682 def->label = L("Internal solid infill pattern");
2683 def->category = L("Strength");
2684 def->tooltip = L("Line pattern of internal solid infill. if the detect narrow internal solid infill be enabled, the concentric pattern will be used for the small area.");
2686 def->enum_values = def_top_fill_pattern->enum_values;
2687 def->enum_labels = def_top_fill_pattern->enum_labels;
2688 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic));
2689
2690 def = this->add("outer_wall_line_width", coFloatOrPercent);
2691 def->label = L("Outer wall");
2692 def->category = L("Quality");
2693 def->tooltip = L("Line width of outer wall. If expressed as a %, it will be computed over the nozzle diameter.");
2694 def->sidetext = L("mm or %");
2695 def->ratio_over = "nozzle_diameter";
2696 def->min = 0;
2697 def->max = 1000;
2698 def->max_literal = 10;
2699 def->mode = comAdvanced;
2700 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
2701
2702 def = this->add("outer_wall_speed", coFloats);
2703 def->label = L("Outer wall");
2704 def->category = L("Speed");
2705 def->tooltip = L("This is the printing speed for the outer walls of parts. These are generally printed slower than inner walls for higher quality.");
2706 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
2707 def->min = 1;
2708 def->mode = comAdvanced;
2709 def->nullable = true;
2710 def->set_default_value(new ConfigOptionFloatsNullable{60});
2711
2712 def = this->add("small_perimeter_speed", coFloatsOrPercents);
2713 def->label = L("Small perimeters");
2714 def->category = L("Speed");
2715 def->tooltip = L("This separate setting will affect the speed of perimeters having radius <= small_perimeter_threshold "
2716 "(usually holes). If expressed as percentage (for example: 80%) it will be calculated "
2717 "on the outer wall speed setting above.");
2718 def->sidetext = L("mm/s or %");
2719 def->ratio_over = "outer_wall_speed";
2720 def->min = 1;
2721 def->mode = comAdvanced;
2722 def->nullable = true;
2723 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(50, true)});
2724
2725 def = this->add("small_perimeter_threshold", coFloats);
2726 def->label = L("Small perimeters threshold");
2727 def->category = L("Speed");
2728 def->tooltip = L("This sets the threshold for small perimeter length. Default threshold is 0mm.");
2729 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2730 def->min = 0;
2731 def->mode = comAdvanced;
2732 def->nullable = true;
2733 def->set_default_value(new ConfigOptionFloatsNullable{0});
2734
2735 def = this->add("small_support_perimeter_speed", coFloatsOrPercents);
2736 def->label = L("Small support perimeters");
2737 def->category = L("Speed");
2738 def->tooltip = L("Same as \"Small perimeters\", but for supports. "
2739 "This separate setting will affect the speed of support for areas <= `small_support_perimeter_threshold`. "
2740 "If expressed as a percentage (for example: 80%), it will be calculated on the support or support interface speed setting above.");
2741 def->sidetext = L("mm/s or %");
2742 def->ratio_over = "support_speed";
2743 def->min = 1;
2744 def->mode = comAdvanced;
2745 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(50, true)});
2746
2747 def = this->add("small_support_perimeter_threshold", coFloats);
2748 def->label = L("Small support perimeters threshold");
2749 def->category = L("Speed");
2750 def->tooltip = L("This sets the threshold for small support perimeter length. The default threshold is 0mm.");
2751 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2752 def->min = 0;
2753 def->mode = comAdvanced;
2754 def->set_default_value(new ConfigOptionFloatsNullable{0});
2755
2756 def = this->add("wall_sequence", coEnum);
2757 def->label = L("Walls printing order");
2758 def->category = L("Quality");
2759 def->tooltip = L("Print sequence of the internal (inner) and external (outer) walls.\n\n"
2760 "Use Inner/Outer for best overhangs. This is because the overhanging walls can adhere to a neighbouring perimeter while printing. "
2761 "However, this option results in slightly reduced surface quality as the external perimeter is deformed by being squashed to the internal perimeter.\n\n"
2762 "Use Inner/Outer/Inner for the best external surface finish and dimensional accuracy as the external wall is printed undisturbed from an internal perimeter. "
2763 "However, overhang performance will reduce as there is no internal perimeter to print the external wall against. "
2764 "This option requires a minimum of 3 walls to be effective as it prints the internal walls from the 3rd perimeter onwards first, "
2765 "then the external perimeter and, finally, the first internal perimeter. "
2766 "This option is recommended over the Outer/Inner option in most cases.\n\n"
2767 "Use Outer/Inner for the same external wall quality and dimensional accuracy benefits of Inner/Outer/Inner option. "
2768 "However, the Z seams will appear less consistent as the first extrusion of a new layer starts on a visible surface.");
2770 def->enum_values.push_back("inner wall/outer wall");
2771 def->enum_values.push_back("outer wall/inner wall");
2772 def->enum_values.push_back("inner-outer-inner wall");
2773 def->enum_labels.push_back(L("Inner/Outer"));
2774 def->enum_labels.push_back(L("Outer/Inner"));
2775 def->enum_labels.push_back(L("Inner/Outer/Inner"));
2776 def->mode = comAdvanced;
2777 def->set_default_value(new ConfigOptionEnum<WallSequence>(WallSequence::InnerOuter));
2778
2779 def = this->add("is_infill_first",coBool);
2780 def->label = L("Print infill first");
2781 def->tooltip = L("Order of wall/infill. When the tickbox is unchecked the walls are printed first, which works best in most cases.\n\nPrinting infill first may help with extreme overhangs as the walls have the neighbouring infill to adhere to. However, the infill will slightly push out the printed walls where it is attached to them, resulting in a worse external surface finish. It can also cause the infill to shine through the external surfaces of the part.");
2782 def->category = L("Quality");
2783 def->mode = comAdvanced;
2784 def->set_default_value(new ConfigOptionBool{false});
2785
2786 def = this->add("wall_direction", coEnum);
2787 def->label = L("Wall loop direction");
2788 def->category = L("Quality");
2789 def->tooltip = L("The direction which the contour wall loops are extruded when looking down from the top.\nHoles are printed in the opposite direction to the contour to maintain alignment with layers whose contour polygons are incomplete and change direction, also partially forming the contour of a hole.\n\nThis option will be disabled if spiral vase mode is enabled.");
2791 def->enum_values.push_back("ccw");
2792 def->enum_values.push_back("cw");
2793 def->enum_labels.push_back(L("Counter clockwise"));
2794 def->enum_labels.push_back(L("Clockwise"));
2795 def->mode = comAdvanced;
2796 def->set_default_value(new ConfigOptionEnum<WallDirection>(WallDirection::CounterClockwise));
2797
2798 def = this->add("extruder", coInt);
2800 def->label = L("Extruder");
2801 def->category = L("Extruders");
2802 //def->tooltip = L("The extruder to use (unless more specific extruder settings are specified). "
2803 // "This value overrides perimeter and infill extruders, but not the support extruders.");
2804 def->min = 0; // 0 = inherit defaults
2805 def->enum_labels.push_back(L("default")); // override label for item 0
2806 def->enum_labels.push_back("1");
2807 def->enum_labels.push_back("2");
2808 def->enum_labels.push_back("3");
2809 def->enum_labels.push_back("4");
2810 def->enum_labels.push_back("5");
2811 def->mode = comAdvanced;
2812
2813 // Orca: already carried by the BBL/Qidi/Geeetech/Eryone machine profiles, which inherited it from
2814 // the BambuStudio import; without a definition here it was parsed as an unknown key and dropped.
2815 def = this->add("extruder_clearance_dist_to_rod", coFloat);
2816 def->label = L("Distance to rod");
2817 def->tooltip = L("Horizontal distance of the nozzle tip to the rod's farther edge. Used for collision avoidance in by-object printing.");
2818 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2819 def->min = 0;
2820 def->mode = comAdvanced;
2821 def->set_default_value(new ConfigOptionFloat(40));
2822
2823 def = this->add("extruder_clearance_height_to_rod", coFloat);
2824 def->label = L("Height to rod");
2825 def->tooltip = L("Distance from the nozzle tip to the lower rod. Used for collision avoidance in by-object printing.");
2826 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2827 def->min = 0;
2828 def->mode = comAdvanced;
2829 def->set_default_value(new ConfigOptionFloat(40));
2830
2831 // BBS
2832 def = this->add("extruder_clearance_height_to_lid", coFloat);
2833 def->label = L("Height to lid");
2834 def->tooltip = L("Distance from the nozzle tip to the lid. Used for collision avoidance in by-object printing.");
2835 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2836 def->min = 0;
2837 def->mode = comAdvanced;
2838 def->set_default_value(new ConfigOptionFloat(120));
2839
2840 def = this->add("extruder_clearance_radius", coFloat);
2841 def->label = L("Radius");
2842 def->tooltip = L("Clearance radius around extruder: used for collision avoidance in by-object printing.");
2843 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2844 def->min = 0;
2845 def->mode = comAdvanced;
2846 def->set_default_value(new ConfigOptionFloat(40));
2847
2848 def = this->add("nozzle_height", coFloat);
2849 def->label = L("Nozzle height");
2850 def->tooltip = L("The height of nozzle tip.");
2851 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2852 def->min = 0;
2853 def->mode = comDevelop;
2854 def->set_default_value(new ConfigOptionFloat(2.5));
2855
2856 def = this->add("bed_mesh_min", coPoint);
2857 def->label = L("Bed mesh min");
2858 def->tooltip = L(
2859 "This option sets the min point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the "
2860 "entire bed. To ensure the probe point does not go outside the bed area, the minimum and maximum points of the bed mesh should be "
2861 "set appropriately. OrcaSlicer ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max "
2862 "points. This information can usually be obtained from your printer manufacturer. The default setting is (-99999, -99999), which "
2863 "means there are no limits, thus allowing probing across the entire bed.");
2864 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2865 def->mode = comAdvanced;
2866 def->set_default_value(new ConfigOptionPoint(Vec2d(-99999, -99999)));
2867
2868 def = this->add("bed_mesh_max", coPoint);
2869 def->label = L("Bed mesh max");
2870 def->tooltip = L(
2871 "This option sets the max point for the allowed bed mesh area. Due to the probe's XY offset, most printers are unable to probe the "
2872 "entire bed. To ensure the probe point does not go outside the bed area, the minimum and maximum points of the bed mesh should be "
2873 "set appropriately. OrcaSlicer ensures that adaptive_bed_mesh_min/adaptive_bed_mesh_max values do not exceed these min/max "
2874 "points. This information can usually be obtained from your printer manufacturer. The default setting is (99999, 99999), which "
2875 "means there are no limits, thus allowing probing across the entire bed.");
2876 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2877 def->mode = comAdvanced;
2878 def->set_default_value(new ConfigOptionPoint(Vec2d(99999, 99999)));
2879
2880 def = this->add("bed_mesh_probe_distance", coPoint);
2881 def->label = L("Probe point distance");
2882 def->tooltip = L("This option sets the preferred distance between probe points (grid size) for the X and Y directions, with the "
2883 "default being 50mm for both X and Y.");
2884 def->min = 0;
2885 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2886 def->mode = comAdvanced;
2887 def->set_default_value(new ConfigOptionPoint(Vec2d(50, 50)));
2888
2889 def = this->add("adaptive_bed_mesh_margin", coFloat);
2890 def->label = L("Mesh margin");
2891 def->tooltip = L("This option determines the additional distance by which the adaptive bed mesh area should be expanded in the XY directions.");
2892 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2893 def->mode = comAdvanced;
2894 def->set_default_value(new ConfigOptionFloat(0));
2895
2896 def = this->add("grab_length",coFloats);
2897 def->label = L("Grab length");
2898 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2899 def->min = 0;
2900 def->mode = comDevelop;
2901 def->set_default_value(new ConfigOptionFloats({0}));
2902
2903 def = this->add("extruder_colour", coStrings);
2904 def->label = L("Extruder Color");
2905 def->tooltip = L("Only used as a visual help on UI.");
2906 def->gui_type = ConfigOptionDef::GUIType::color;
2907 // Empty string means no color assigned yet.
2908 def->mode = comAdvanced;
2909 def->set_default_value(new ConfigOptionStrings { "" });
2910
2911 def = this->add("extruder_offset", coPoints);
2912 def->label = L("Extruder offset");
2913 //def->tooltip = L("If your firmware doesn't handle the extruder displacement you need the G-code "
2914 // "to take it into account. This option lets you specify the displacement of each extruder "
2915 // "with respect to the first one. It expects positive coordinates (they will be subtracted "
2916 // "from the XY coordinate).");
2917 def->sidetext = L("mm"); // millimeters, CIS languages need translation
2918 def->mode = comAdvanced;
2919 def->set_default_value(new ConfigOptionPoints { Vec2d(0,0) });
2920
2921 def = this->add("filament_flow_ratio", coFloats);
2922 def->label = L("Flow ratio");
2923 def->tooltip = L("The material may have volumetric change after switching between molten and crystalline states. "
2924 "This setting changes all extrusion flow of this filament in G-code proportionally. "
2925 "The recommended value range is between 0.95 and 1.05. "
2926 "You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow.");
2927 def->min = 0;
2928 def->max = 2;
2929 def->mode = comAdvanced;
2930 def->nullable = true;
2931 def->set_default_value(new ConfigOptionFloatsNullable { 1. });
2932
2933 def = this->add("print_flow_ratio", coFloat);
2934 def->label = L("Flow ratio");
2935 def->category = L("Quality");
2936 def->tooltip = L("The material may have volumetric change after switching between molten and crystalline states. "
2937 "This setting changes all extrusion flow of this filament in G-code proportionally. "
2938 "The recommended value range is between 0.95 and 1.05. "
2939 "You may be able to tune this value to get a nice flat surface if there is slight overflow or underflow."
2940 "\n\nThe final object flow ratio is this value multiplied by the filament flow ratio.");
2941 def->mode = comAdvanced;
2942 def->max = 2.f;
2943 def->min = 0.01f;
2944 def->set_default_value(new ConfigOptionFloat(1.f));
2945
2946 def = this->add("enable_pressure_advance", coBools);
2947 def->label = L("Enable pressure advance");
2948 def->tooltip = L("Enable pressure advance, auto calibration result will be overwritten once enabled.");
2949 def->set_default_value(new ConfigOptionBools{ false });
2950
2951 def = this->add("pressure_advance", coFloats);
2952 def->label = L("Pressure advance");
2953 def->tooltip = L("Pressure advance (Klipper) AKA Linear advance factor (Marlin).");
2954 def->max = 2;
2955 def->mode = comAdvanced;
2956 def->set_default_value(new ConfigOptionFloats { 0.02 });
2957
2958 // Orca: Adaptive pressure advance option and calibration values
2959 def = this->add("adaptive_pressure_advance", coBools);
2960 def->label = L("Enable adaptive pressure advance (beta)");
2961 // xgettext:no-c-format, no-boost-format
2962 def->tooltip = L("With increasing print speeds (and hence increasing volumetric flow through the nozzle) and increasing accelerations, "
2963 "it has been observed that the effective PA value typically decreases. "
2964 "This means that a single PA value is not always 100% optimal for all features and a compromise value is usually used "
2965 "that does not cause too much bulging on features with lower flow speed and accelerations while also not causing gaps on faster features.\n\n"
2966 "This feature aims to address this limitation by modeling the response of your printer's extrusion system depending "
2967 "on the volumetric flow speed and acceleration it is printing at. Internally, it generates a fitted model that can extrapolate the needed pressure "
2968 "advance for any given volumetric flow speed and acceleration, which is then emitted to the printer depending on the current print conditions.\n\n"
2969 "When enabled, the pressure advance value above is overridden. However, a reasonable default value above is "
2970 "strongly recommended to act as a fallback and for when tool changing.\n\n");
2971 def->mode = comAdvanced;
2972 def->set_default_value(new ConfigOptionBools{ false });
2973
2974 // Orca: Adaptive pressure advance option and calibration values
2975 def = this->add("adaptive_pressure_advance_model", coStrings);
2976 def->label = L("Adaptive pressure advance measurements (beta)");
2977 // xgettext:no-c-format, no-boost-format
2978 def->tooltip = L("Add sets of pressure advance (PA) values, the volumetric flow speeds and accelerations they were measured at, separated by a comma. "
2979 "One set of values per line. For example\n"
2980 "0.04,3.96,3000\n0.033,3.96,10000\n0.029,7.91,3000\n0.026,7.91,10000\n\n"
2981 "How to calibrate:\n"
2982 "1. Run the pressure advance test for at least 3 speeds per acceleration value. It is recommended that the test is run "
2983 "for at least the speed of the external perimeters, the speed of the internal perimeters and the fastest feature "
2984 "print speed in your profile (usually its the sparse or solid infill). Then run them for the same speeds for the slowest and fastest print accelerations, "
2985 "and no faster than the recommended maximum acceleration as given by the Klipper input shaper\n"
2986 "2. Take note of the optimal PA value for each volumetric flow speed and acceleration. You can find the flow number by selecting "
2987 "flow from the color scheme drop down and move the horizontal slider over the PA pattern lines. The number should be visible "
2988 "at the bottom of the page. The ideal PA value should be decreasing the higher the volumetric flow is. "
2989 "If it is not, confirm that your extruder is functioning correctly. The slower and with less acceleration you print, "
2990 "the larger the range of acceptable PA values. If no difference is visible, use the PA value from the faster test\n"
2991 "3. Enter the triplets of PA values, Flow and Accelerations in the text box here and save your filament profile.");
2992 def->mode = comAdvanced;
2993 //def->gui_flags = "serialized";
2994 def->multiline = true;
2995 def->full_width = true;
2996 def->height = 15;
2997 def->set_default_value(new ConfigOptionStrings{"0,0,0\n0,0,0"});
2998
2999 // xgettext:no-c-format, no-boost-format
3000 def = this->add("adaptive_pressure_advance_overhangs", coBools);
3001 def->label = L("Enable adaptive pressure advance within features (beta)");
3002 def->tooltip = L("Enable adaptive PA whenever there are flow changes in a feature, such as line width changes in a corner or overhangs.\n\n"
3003 "Not compatible with Prusa printers as they pause to process PA changes, which causes delays and defects.\n\n"
3004 "This is an experimental option, as if the PA profile is not set accurately, it will cause uniformity issues.");
3005 def->mode = comAdvanced;
3006 def->set_default_value(new ConfigOptionBools{ false });
3007
3008 def = this->add("adaptive_pressure_advance_bridges", coFloats);
3009 def->label = L("Static pressure advance for bridges");
3010 def->tooltip = L("Static pressure advance value for bridges. Set to 0 to apply the same pressure advance as \n"
3011 "equivalent walls (using adaptive settings if enabled).\n\n"
3012 "A lower PA value when printing bridges helps reduce the appearance of slight under-extrusion immediately after bridges. "
3013 "This is caused by the pressure drop in the nozzle when printing in the air and a lower PA helps counteract this.");
3014 def->max = 2;
3015 def->mode = comAdvanced;
3016 def->set_default_value(new ConfigOptionFloats { 0.0 });
3017
3018 def = this->add("line_width", coFloatOrPercent);
3019 def->label = L("Default");
3020 def->category = L("Quality");
3021 def->tooltip = L("Default line width if other line widths are set to 0. If expressed as a %, it will be computed over the nozzle diameter.");
3022 def->sidetext = L("mm or %");
3023 def->ratio_over = "nozzle_diameter";
3024 def->min = 0;
3025 def->max = 1000;
3026 def->max_literal = 10;
3027 def->mode = comAdvanced;
3028 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
3029
3030 def = this->add("reduce_fan_stop_start_freq", coBools);
3031 def->label = L("Keep fan always on");
3032 def->tooltip = L("Enabling this setting means that part cooling fan will never stop entirely and will instead run at least at minimum speed to reduce the frequency of starting and stopping.");
3033 def->set_default_value(new ConfigOptionBools { false });
3034
3035 def = this->add("dont_slow_down_outer_wall", coBools);
3036 def->label = L("Don't slow down outer walls");
3037 def->tooltip = L("If enabled, this setting will ensure external perimeters are not slowed down to meet the minimum layer time. "
3038 "This is particularly helpful in the below scenarios:\n"
3039 "1. To avoid changes in shine when printing glossy filaments\n"
3040 "2. To avoid changes in external wall speed which may create slight wall artifacts that appear like Z banding\n"
3041 "3. To avoid printing at speeds which cause VFAs (fine artifacts) on the external walls");
3042 def->set_default_value(new ConfigOptionBools { false });
3043
3044 def = this->add("fan_cooling_layer_time", coFloats);
3045 def->label = L("Layer time");
3046 def->tooltip = L("The part cooling fan will be enabled for layers where the estimated time is shorter than this value. Fan speed is interpolated between the minimum and maximum fan speeds according to layer printing time.");
3047 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
3048 def->min = 0;
3049 def->max = 1000;
3050 def->mode = comSimple;
3051 def->set_default_value(new ConfigOptionFloats{ 60.0f });
3052
3053 def = this->add("default_filament_colour", coStrings);
3054 def->label = L("Default color");
3055 def->tooltip = L("Default filament color.\n"
3056 "Right click to reset value to system default.");
3057 def->gui_type = ConfigOptionDef::GUIType::color;
3058 def->mode = comAdvanced;
3059 def->set_default_value(new ConfigOptionStrings{""});
3060
3061 def = this->add("filament_colour", coStrings);
3062 def->label = L("Color");
3063 def->tooltip = L("Only used as a visual help on UI.");
3064 def->gui_type = ConfigOptionDef::GUIType::color;
3065 def->mode = comAdvanced;
3066 def->set_default_value(new ConfigOptionStrings{ "#F2754E" });
3067
3068 // PS
3069 def = this->add("filament_notes", coStrings);
3070 def->label = L("Filament notes");
3071 def->tooltip = L("You can put your notes regarding the filament here.");
3072 def->multiline = true;
3073 def->full_width = true;
3074 def->height = 13;
3075 def->mode = comAdvanced;
3076 def->set_default_value(new ConfigOptionStrings { "" });
3077
3078
3079 def = this->add("filament_multi_colour", coStrings);
3080 def->set_default_value(new ConfigOptionStrings{""});
3081
3082 // 0: gradient color, 1: default color(single or multi color)
3083 def = this->add("filament_colour_type", coStrings);
3084 def->set_default_value(new ConfigOptionStrings{"1"}); // Init as default color
3085
3086 //bbs
3087 def = this->add("required_nozzle_HRC", coInts);
3088 def->label = L("Required nozzle HRC");
3089 def->tooltip = L("Minimum HRC of nozzle required to print the filament. A value of 0 means no checking of the nozzle\'s HRC.");
3090 def->min = 0;
3091 def->max = 500;
3092 def->mode = comDevelop;
3093 def->set_default_value(new ConfigOptionInts{0});
3094
3095 def = this->add("filament_map", coInts);
3096 def->label = L("Filament map to extruder");
3097 def->tooltip = L("Filament map to extruder.");
3098 def->mode = comDevelop;
3099 def->set_default_value(new ConfigOptionInts{1});
3100
3101 // Multi-nozzle: per-filament map to the config slot identified by (extruder, nozzle_volume_type).
3102 // Engine-internal per-filament slot map: recomputed at apply time from filament_map (plus the
3103 // per-filament volume map when an extruder exposes several volume types) and used to key the
3104 // retract-override fallback; never a user input and never part of the exported full config.
3105 // Internal use only, no translation.
3106 def = this->add("filament_map_2", coInts);
3107 def->label = "Filament map plus for multi nozzle";
3108 def->tooltip = "Filament map to the index identified by extruder and nozzle_volume_type";
3109 def->mode = comDevelop;
3110 def->set_default_value(new ConfigOptionInts{1});
3111
3112 // Per-filament nozzle-volume-type override (multi-volume/Hybrid). Round-trips through .3mf
3113 // plate metadata (filament_volume_maps) and steers per-filament slot resolution when an
3114 // extruder exposes several volume types. Producers: the GUI full-config composition injects
3115 // a filament-count-sized map (plate map, else per-extruder defaults) and the project config
3116 // keeps it sized; expansion trusts the map only when its size matches the filament count
3117 // (CLI runs may still carry the 1-element default).
3118 def = this->add("filament_volume_map", coInts);
3119 def->mode = comDevelop;
3120 def->set_default_value(new ConfigOptionInts{(int)(NozzleVolumeType::nvtStandard)});
3121
3122 def = this->add("physical_extruder_map",coInts);
3123 // internal use only, don't need translation
3124 def->label = "Map the logical extruder to physical extruder";
3125 def->tooltip = "Map the logical extruder to physical extruder.";
3126 def->mode = comDevelop;
3127 def->set_default_value(new ConfigOptionInts{0});
3128
3129 def = this->add("filament_map_mode", coEnum);
3130 // internal use only, don't need translation
3131 def->label = "filament mapping mode";
3132 def->tooltip = "Filament mapping mode used as plate param.";
3134 def->enum_values.push_back("Auto For Flush");
3135 def->enum_values.push_back("Auto For Match");
3136 def->enum_values.push_back("Manual");
3137 def->enum_values.push_back("Nozzle Manual");
3138 def->enum_values.push_back("Default");
3139 def->enum_labels.push_back(L("Auto For Flush"));
3140 def->enum_labels.push_back(L("Auto For Match"));
3141 def->enum_labels.push_back(L("Manual"));
3142 def->enum_labels.push_back(L("Nozzle Manual"));
3143 def->enum_labels.push_back(L("Default"));
3144 def->mode = comAdvanced;
3145 def->set_default_value(new ConfigOptionEnum<FilamentMapMode>(fmmAutoForFlush));
3146
3147 // Per-filament -> physical-nozzle assignment. Written back by the grouping engine after
3148 // slicing (all non-sequential modes) and read back to the plate config; a user input only
3149 // in fully-manual mode (fmmNozzleManual). Dumped in the g-code header for diagnostics.
3150 // Internal use only, no translation.
3151 def = this->add("filament_nozzle_map", coInts);
3152 def->mode = comDevelop;
3153 def->set_default_value(new ConfigOptionInts{1});
3154
3155 def = this->add("filament_flush_temp", coInts);
3156 def->label = L("Flush temperature");
3157 def->tooltip = L("Temperature when flushing filament. 0 indicates the upper bound of the recommended nozzle temperature range.");
3158 def->mode = comAdvanced;
3159 def->nullable = true;
3160 def->min = 0;
3161 def->max = max_temp;
3162 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
3163 def->set_default_value(new ConfigOptionIntsNullable{0});
3164
3165 // Fast-purge flush temperature: used only when prime_volume_mode==Fast.
3166 // Default 0 (fall back to the recommended-range upper bound, identical to filament_flush_temp),
3167 // so the key is inert for the shipping fleet. Kept out of the g-code config block (banned_keys).
3168 def = this->add("filament_flush_temp_fast", coInts);
3169 def->label = L("Flush temperature");
3170 def->tooltip = L("Flush temperature used in fast purge mode.");
3171 def->mode = comAdvanced;
3172 def->nullable = true;
3173 def->min = 0;
3174 def->max = max_temp;
3175 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
3176 def->set_default_value(new ConfigOptionIntsNullable{0});
3177
3178 def = this->add("filament_flush_volumetric_speed", coFloats);
3179 def->label = L("Flush volumetric speed");
3180 def->tooltip = L("Volumetric speed when flushing filament. 0 indicates the max volumetric speed.");
3181 def->mode = comAdvanced;
3182 def->nullable = true;
3183 def->min = 0;
3184 def->max = 200;
3185 def->sidetext = L(u8"mm³/s"); // cubic millimeters per second, CIS languages need translation
3186 def->set_default_value(new ConfigOptionFloatsNullable{ 0 });
3187
3188 def = this->add("filament_max_volumetric_speed", coFloats);
3189 def->label = L("Max volumetric speed");
3190 def->tooltip = L("This setting is the volume of filament that can be melted and extruded per second. Printing speed is limited by max volumetric speed, in case of too high and unreasonable speed setting. This value cannot be zero.");
3191 def->sidetext = L(u8"mm³/s"); // cubic millimeters per second, CIS languages need translation
3192 def->min = 0;
3193 def->mode = comAdvanced;
3194 def->set_default_value(new ConfigOptionFloats { 2. });
3195
3196 def = this->add("machine_load_filament_time", coFloat);
3197 def->label = L("Filament load time");
3198 def->tooltip = L("Time to load new filament when switch filament. It's usually applicable for single-extruder multi-material machines. "
3199 "For tool changers or multi-tool machines, it's typically 0. For statistics only.");
3200 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
3201 def->min = 0;
3202 def->mode = comAdvanced;
3203 def->set_default_value(new ConfigOptionFloat(0.0));
3204
3205 def = this->add("machine_unload_filament_time", coFloat);
3206 def->label = L("Filament unload time");
3207 def->tooltip = L("Time to unload old filament when switch filament. It's usually applicable for single-extruder multi-material machines. "
3208 "For tool changers or multi-tool machines, it's typically 0. For statistics only.");
3209 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
3210 def->min = 0;
3211 def->mode = comAdvanced;
3212 def->set_default_value(new ConfigOptionFloat(0.0));
3213
3214 def = this->add("machine_tool_change_time", coFloat);
3215 def->label = L("Tool change time");
3216 def->tooltip = L("Time taken to switch tools. It's usually applicable for tool changers or multi-tool machines. "
3217 "For single-extruder multi-material machines, it's typically 0. For statistics only.");
3218 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
3219 def->min = 0;
3220 def->mode = comAdvanced;
3221 def->set_default_value(new ConfigOptionFloat { 0. });
3222
3223
3224 def = this->add("support_object_skip_flush", coBool);
3225 def->set_default_value(new ConfigOptionBool(false));
3226
3227 def = this->add("bed_temperature_formula", coEnum);
3228 def->label = L("Bed temperature type");
3229 def->tooltip = L("This option determines how the bed temperature is set during slicing: based on the temperature of the first filament or the highest temperature of the printed filaments.");
3230 def->mode = comAdvanced;
3232 def->enum_values.push_back("by_first_filament");
3233 def->enum_values.push_back("by_highest_temp");
3234 def->enum_labels.push_back(L("By First filament"));
3235 def->enum_labels.push_back(L("By Highest Temp"));
3236 def->set_default_value(new ConfigOptionEnum<BedTempFormula>(BedTempFormula::btfHighestTemp));
3237
3238 def = this->add("nozzle_flush_dataset", coInts);
3239 def->nullable = true;
3240 def->set_default_value(new ConfigOptionIntsNullable{0});
3241
3242 def = this->add("filament_diameter", coFloats);
3243 def->label = L("Diameter");
3244 def->tooltip = L("Filament diameter is used to calculate extrusion variables in G-code, so it is important that this is accurate and precise.");
3245 def->sidetext = L("mm"); // millimeters, CIS languages need translation
3246 def->min = 0;
3247 def->set_default_value(new ConfigOptionFloats { 1.75 });
3248
3249 /*
3250 Large format printers with print volumes in the order of 1m^3 generally use pellets for printing.
3251 The overall tech is very similar to FDM printing.
3252 It is FDM printing, but instead of filaments, it uses pellets.
3253
3254 The difference here is that where filaments have a filament_diameter that is used to calculate
3255 the volume of filament ingested, pellets have a particular flow_coefficient that is empirically
3256 devised for that particular pellet.
3257
3258 pellet_flow_coefficient is basically a measure of the packing density of a particular pellet.
3259 Shape, material and density of an individual pellet will determine the packing density and
3260 the only thing that matters for 3d printing is how much of that pellet material is extruded by
3261 one turn of whatever feeding mehcanism/gear your printer uses. You can emperically derive that
3262 for your own pellets for a particular printer model.
3263
3264 We are translating the pellet_flow_coefficient into filament_diameter so that everything works just like it
3265 does already with very minor adjustments.
3266
3267 filament_diameter = sqrt( (4 * pellet_flow_coefficient) / PI )
3268
3269 sqrt just makes the relationship between flow_coefficient and volume linear.
3270
3271 higher packing density -> more material extruded by single turn -> higher pellet_flow_coefficient -> treated as if a filament of larger diameter is being used
3272 All other calculations remain the same for slicing.
3273 */
3274
3275 def = this->add("pellet_flow_coefficient", coFloats);
3276 def->label = L("Pellet flow coefficient");
3277 def->tooltip = L("Pellet flow coefficient is empirically derived and allows for volume calculation for pellet printers.\n\nInternally it is converted to filament_diameter. All other volume calculations remain the same.\n\nfilament_diameter = sqrt( (4 * pellet_flow_coefficient) / PI )");
3278 def->min = 0;
3279 def->set_default_value(new ConfigOptionFloats{ 0.4157 });
3280
3281 def = this->add("filament_adaptive_volumetric_speed", coBools);
3282 def->label = L("Adaptive volumetric speed");
3283 def->tooltip = L("When enabled, the extrusion flow is limited by the smaller of "
3284 "the fitted value (calculated from line width and layer height) and the user-defined maximum flow."
3285 " When disabled, only the user-defined maximum flow is applied.\n\n"
3286 "Note: Experimental and incomplete feature imported from BBS. Functional for some profiles that already have the variable saved.");
3287 def->mode = comDevelop;
3288 def->nullable = true;
3289 def->set_default_value(new ConfigOptionBoolsNullable {false});
3290
3291 def = this->add("volumetric_speed_coefficients", coStrings);
3292 def->label = L("Max volumetric speed multinomial coefficients");
3293 def->set_default_value(new ConfigOptionStrings{""});
3294
3295 def = this->add("filament_shrink", coPercents);
3296 def->label = L("Shrinkage (XY)");
3297 // xgettext:no-c-format, no-boost-format
3298 def->tooltip = L("Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm). "
3299 "The part will be scaled in XY to compensate. For multi-material prints, ensure filament shrinkage matches across all used filaments.\n"
3300 "Be sure to allow enough space between objects, as this compensation is done after the checks.");
3301 def->sidetext = "%";
3302 def->ratio_over = "";
3303 def->min = 50;
3304 def->max = 150;
3305 def->mode = comAdvanced;
3306 def->set_default_value(new ConfigOptionPercents{ 100 });
3307
3308 def = this->add("filament_shrinkage_compensation_z", coPercents);
3309 def->label = L("Shrinkage (Z)");
3310 // xgettext:no-c-format, no-boost-format
3311 def->tooltip = L("Enter the shrinkage percentage that the filament will get after cooling (94% if you measure 94mm instead of 100mm)."
3312 " The part will be scaled in Z to compensate.");
3313 def->sidetext = "%";
3314 def->ratio_over = "";
3315 def->min = 50;
3316 def->max = 150;
3317 def->mode = comAdvanced;
3318 def->set_default_value(new ConfigOptionPercents{ 100 });
3319
3320 def = this->add("filament_adhesiveness_category", coInts);
3321 def->label = L("Adhesiveness Category");
3322 def->tooltip = L("Filament category.");
3323 def->min = 0;
3324 def->mode = comDevelop;
3325 def->set_default_value(new ConfigOptionInts{0});
3326
3327 def = this->add("filament_loading_speed", coFloats);
3328 def->label = L("Loading speed");
3329 def->tooltip = L("Speed used for loading the filament on the wipe tower.");
3330 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3331 def->min = 0;
3332 def->mode = comAdvanced;
3333 def->set_default_value(new ConfigOptionFloats { 28. });
3334
3335 def = this->add("filament_loading_speed_start", coFloats);
3336 def->label = L("Loading speed at the start");
3337 def->tooltip = L("Speed used at the very beginning of loading phase.");
3338 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3339 def->min = 0;
3340 def->mode = comAdvanced;
3341 def->set_default_value(new ConfigOptionFloats { 3. });
3342
3343 def = this->add("filament_unloading_speed", coFloats);
3344 def->label = L("Unloading speed");
3345 def->tooltip = L("Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming).");
3346 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3347 def->min = 0;
3348 def->mode = comAdvanced;
3349 def->set_default_value(new ConfigOptionFloats { 90. });
3350
3351 def = this->add("filament_unloading_speed_start", coFloats);
3352 def->label = L("Unloading speed at the start");
3353 def->tooltip = L("Speed used for unloading the tip of the filament immediately after ramming.");
3354 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3355 def->min = 0;
3356 def->mode = comAdvanced;
3357 def->set_default_value(new ConfigOptionFloats { 100. });
3358
3359 def = this->add("filament_toolchange_delay", coFloats);
3360 def->label = L("Delay after unloading");
3361 def->tooltip = L("Time to wait after the filament is unloaded. "
3362 "May help to get reliable tool changes with flexible materials "
3363 "that may need more time to shrink to original dimensions.");
3364 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
3365 def->min = 0;
3366 def->mode = comAdvanced;
3367 def->set_default_value(new ConfigOptionFloats { 0. });
3368
3369 def = this->add("filament_cooling_moves", coInts);
3370 def->label = L("Number of cooling moves");
3371 def->tooltip = L("Filament is cooled by being moved back and forth in the "
3372 "cooling tubes. Specify desired number of these moves.");
3373 def->min = 0;
3374 def->max = 20;
3375 def->mode = comAdvanced;
3376 def->set_default_value(new ConfigOptionInts { 4 });
3377
3378 def = this->add("filament_stamping_loading_speed", coFloats);
3379 def->label = L("Stamping loading speed");
3380 def->tooltip = L("Speed used for stamping.");
3381 def->min = 0;
3382 def->mode = comAdvanced;
3383 def->set_default_value(new ConfigOptionFloats { 0. });
3384
3385 def = this->add("filament_stamping_distance", coFloats);
3386 def->label = L("Stamping distance measured from the center of the cooling tube");
3387 def->tooltip = L("If set to non-zero value, filament is moved toward the nozzle between the individual cooling moves (\"stamping\"). "
3388 "This option configures how long this movement should be before the filament is retracted again.");
3389 def->min = 0;
3390 def->mode = comAdvanced;
3391 def->set_default_value(new ConfigOptionFloats { 0. });
3392
3393 def = this->add("filament_cooling_initial_speed", coFloats);
3394 def->label = L("Speed of the first cooling move");
3395 def->tooltip = L("Cooling moves are gradually accelerating beginning at this speed.");
3396 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3397 def->min = 0;
3398 def->mode = comAdvanced;
3399 def->set_default_value(new ConfigOptionFloats { 2.2 });
3400
3401 def = this->add("filament_minimal_purge_on_wipe_tower", coFloats);
3402 def->label = L("Minimal purge on wipe tower");
3403 def->tooltip = L("After a tool change, the exact position of the newly loaded filament inside "
3404 "the nozzle may not be known, and the filament pressure is likely not yet stable. "
3405 "Before purging the print head into an infill or a sacrificial object, Orca Slicer will always prime "
3406 "this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably.");
3407 def->sidetext = L(u8"mm³"); // cubic millimeters, CIS languages need translation
3408 def->min = 0;
3409 def->mode = comAdvanced;
3410 def->set_default_value(new ConfigOptionFloats { 15. });
3411
3412 def = this->add("filament_cooling_before_tower", coFloats);
3413 def->label = L("Wipe tower cooling");
3414 def->tooltip = L("Temperature drop before entering the wipe tower.");
3415 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
3416 def->mode = comDevelop;
3417 def->nullable = true;
3418 def->set_default_value(new ConfigOptionFloatsNullable { 10. });
3419
3420 def = this->add("filament_tower_interface_pre_extrusion_dist", coFloats);
3421 def->label = L("Interface layer pre-extrusion distance");
3422 def->tooltip = L("Pre-extrusion distance for prime tower interface layer (where different materials meet).");
3423 def->sidetext = L("mm"); // millimeters, CIS languages need translation
3424 def->min = 0;
3425 def->mode = comAdvanced;
3426 def->set_default_value(new ConfigOptionFloats { 10. });
3427
3428 def = this->add("filament_tower_interface_pre_extrusion_length", coFloats);
3429 def->label = L("Interface layer pre-extrusion length");
3430 def->tooltip = L("Pre-extrusion length for prime tower interface layer (where different materials meet).");
3431 def->sidetext = L("mm"); // millimeters, CIS languages need translation
3432 def->min = 0;
3433 def->mode = comAdvanced;
3434 def->set_default_value(new ConfigOptionFloats { 0. });
3435
3436 def = this->add("filament_tower_ironing_area", coFloats);
3437 def->label = L("Tower ironing area");
3438 def->tooltip = L("Ironing area for prime tower interface layer (where different materials meet).");
3439 def->sidetext = L(u8"mm²"); // square millimeters, CIS languages need translation
3440 def->min = 0;
3441 def->mode = comAdvanced;
3442 def->set_default_value(new ConfigOptionFloats { 4. });
3443
3444 def = this->add("filament_tower_interface_purge_volume", coFloats);
3445 def->label = L("Interface layer purge length");
3446 def->tooltip = L("Purge length for prime tower interface layer (where different materials meet).");
3447 def->sidetext = L("mm"); // millimeters, CIS languages need translation
3448 def->min = 0;
3449 def->mode = comAdvanced;
3450 def->set_default_value(new ConfigOptionFloats { 20. });
3451
3452 def = this->add("filament_tower_interface_print_temp", coInts);
3453 def->label = L("Interface layer print temperature");
3454 def->tooltip = L("Print temperature for prime tower interface layer (where different materials meet). If set to -1, use max recommended nozzle temperature.");
3455 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
3456 def->min = -1;
3457 def->mode = comAdvanced;
3458 def->set_default_value(new ConfigOptionInts { -1 });
3459
3460 def = this->add("filament_cooling_final_speed", coFloats);
3461 def->label = L("Speed of the last cooling move");
3462 def->tooltip = L("Cooling moves are gradually accelerating towards this speed.");
3463 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3464 def->min = 0;
3465 def->mode = comAdvanced;
3466 def->set_default_value(new ConfigOptionFloats { 3.4 });
3467
3468 def = this->add("filament_ramming_parameters", coStrings);
3469 def->label = L("Ramming parameters");
3470 def->tooltip = L("This string is edited by RammingDialog and contains ramming specific parameters.");
3471 def->mode = comAdvanced;
3472 def->set_default_value(new ConfigOptionStrings { "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0|"
3473 " 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6" });
3474
3475 def = this->add("filament_multitool_ramming", coBools);
3476 def->label = L("Enable ramming for multi-tool setups");
3477 def->tooltip = L("Perform ramming when using multi-tool printer (i.e. when the 'Single Extruder Multimaterial' in Printer Settings is unchecked). "
3478 "When checked, a small amount of filament is rapidly extruded on the wipe tower just before the tool change. "
3479 "This option is only used when the wipe tower is enabled.");
3480 def->mode = comAdvanced;
3481 def->set_default_value(new ConfigOptionBools { false });
3482
3483 def = this->add("filament_multitool_ramming_volume", coFloats);
3484 def->label = L("Multi-tool ramming volume");
3485 def->tooltip = L("The volume to be rammed before the tool change.");
3486 def->sidetext = L(u8"mm³"); // cubic millimeters, CIS languages need translation
3487 def->min = 0;
3488 def->mode = comAdvanced;
3489 def->set_default_value(new ConfigOptionFloats { 10. });
3490
3491 def = this->add("filament_multitool_ramming_flow", coFloats);
3492 def->label = L("Multi-tool ramming flow");
3493 def->tooltip = L("Flow used for ramming the filament before the tool change.");
3494 def->sidetext = L(u8"mm³/s"); // cubic millimeters per second, CIS languages need translation
3495 def->min = 0;
3496 def->mode = comAdvanced;
3497 def->set_default_value(new ConfigOptionFloats { 10. });
3498
3499 def = this->add("filament_density", coFloats);
3500 def->label = L("Density");
3501 def->tooltip = L("Filament density, for statistical purposes only.");
3502 def->sidetext = L(u8"g/cm³"); // grams per cubic centimeter, CIS languages need translation
3503 def->min = 0;
3504 def->mode = comAdvanced;
3505 def->set_default_value(new ConfigOptionFloats { 0. });
3506
3507 def = this->add("filament_type", coStrings);
3508 def->label = L("Type");
3509 def->tooltip = L("Filament material type");
3511 def->gui_flags = "show_value";
3512
3513 // Populate the enum values using the shared material type database
3514 for (const auto& filament : MaterialType::all()) {
3515 def->enum_values.push_back(filament.name);
3516 }
3517
3518 def->mode = comSimple;
3519 def->set_default_value(new ConfigOptionStrings { "PLA" });
3520
3521 def = this->add("filament_soluble", coBools);
3522 def->label = L("Soluble material");
3523 def->tooltip = L("Soluble material is commonly used to print supports and support interfaces.");
3524 def->mode = comAdvanced;
3525 def->set_default_value(new ConfigOptionBools { false });
3526
3527 def = this->add("filament_change_length", coFloats);
3528 def->label = L("Filament ramming length");
3529 def->tooltip = L("When changing the extruder, it is recommended to extrude a certain length of filament from the original extruder. This helps minimize nozzle oozing.");
3530 def->sidetext = L("mm"); // millimeters, CIS languages need translation
3531 def->min = 0;
3532 def->mode = comAdvanced;
3533 def->set_default_value(new ConfigOptionFloats{10});
3534
3535 def = this->add("filament_is_support", coBools);
3536 def->label = L("Support material");
3537 def->tooltip = L("Support material is commonly used to print supports and support interfaces.");
3538 def->mode = comAdvanced;
3539 def->set_default_value(new ConfigOptionBools { false });
3540
3541 // Mixed-color filament. A slot flagged here is virtual: it is not loaded into any
3542 // physical extruder, but resolved at slicing time into the physical filaments listed
3543 // in filament_mixed_components, blended either by splitting each layer into
3544 // sub-layers or by alternating whole layers (see enable_mixed_color_sublayer).
3545 def = this->add("filament_is_mixed", coBools);
3546 def->label = L("Is mixed filament");
3547 def->tooltip = L("Whether this filament slot is a mixed filament composed of multiple physical filaments");
3548 def->mode = comDevelop;
3549 def->set_default_value(new ConfigOptionBools{false});
3550
3551 def = this->add("filament_mixed_components", coStrings);
3552 def->label = L("Mixed filament components");
3553 def->tooltip = L("Comma-separated 1-based indices of component filaments, e.g. \"1,3\"");
3554 def->mode = comDevelop;
3555 def->set_default_value(new ConfigOptionStrings{""});
3556
3557 def = this->add("filament_mixed_sublayer_ratios", coStrings);
3558 def->label = L("Mixed filament sublayer ratios");
3559 def->tooltip = L("Comma-separated ratio values summing to 1.0, e.g. \"0.7,0.3\"");
3560 def->mode = comDevelop;
3561 def->set_default_value(new ConfigOptionStrings{""});
3562
3563 def = this->add("filament_mixed_gradient", coBools);
3564 def->label = L("Mixed filament gradient");
3565 def->tooltip = L("Enable Z-direction gradient mode for mixed filament sub-layers. "
3566 "When enabled, the sub-layer ratios vary linearly across layers.");
3567 def->mode = comDevelop;
3568 def->set_default_value(new ConfigOptionBools{false});
3569
3570 def = this->add("filament_mixed_gradient_range", coStrings);
3571 def->label = L("Mixed filament gradient range");
3572 def->tooltip = L("Start and end ratios for the first component in gradient mode. "
3573 "Comma-separated pair, e.g. \"0.10,0.90\" means 10% to 90%.");
3574 def->mode = comDevelop;
3575 def->set_default_value(new ConfigOptionStrings{""});
3576
3577 def = this->add("filament_mixed_gradient_curve", coStrings);
3578 def->label = L("Mixed filament gradient curve");
3579 def->tooltip = L("Optional Photoshop-style custom curve mapping Z progress to the first "
3580 "component ratio. Encoded as pipe-separated control points, "
3581 "either \"x,y\" (legacy) or \"x,y,m_in,m_out\" when a tangent override "
3582 "is needed (empty token or \"nan\" means use PCHIP default). "
3583 "x in [0,1]; y is clamped to the configured ratio range, "
3584 "e.g. \"0,0.15|0.5,0.50|1,0.85\". When empty, the linear "
3585 "gradient_range is used instead.");
3586 def->mode = comDevelop;
3587 def->set_default_value(new ConfigOptionStrings{""});
3588
3589 def = this->add("filament_mixed_gradient_per_part", coBools);
3590 def->label = L("Mixed filament per-part gradient");
3591 def->tooltip = L("When gradient mode is enabled, apply the gradient to each part of an "
3592 "assembly independently rather than treating the whole assembly as one "
3593 "Z range.");
3594 def->mode = comDevelop;
3595 def->set_default_value(new ConfigOptionBools{false});
3596
3597 // defined in bits
3598 // 0 means cannot support, 1 means support
3599 // 0 bit: can support in left extruder
3600 // 1 bit: can support in right extruder
3601 def = this->add("filament_printable", coInts);
3602 def->label = L("Filament printable");
3603 def->tooltip = L("The filament is printable in extruder.");
3604 def->mode = comDevelop;
3605 def->set_default_value(new ConfigOptionInts{3});
3606
3607 // A single 32-bit int encodes the compatibility level of a filament across all extruders (up to 10).
3608 // Every 3 bits represent one extruder: bits [3*i, 3*i+2] -> extruder i.
3609 // Compatibility levels: 0 = printable, 1 = error, 2 = critical warning, 3 = warning (4-7 reserved).
3610 // Default 0 (printable) keeps the key inert for filaments/printers that do not declare it.
3611 def = this->add("filament_extruder_compatibility", coInts);
3612 def->label = L("Filament-extruder compatibility");
3613 def->tooltip = L("A single 32-bit int encoding the compatibility level of a filament across all extruders (up to 10). "
3614 "Every 3 bits represent one extruder (bits [3*i, 3*i+2] for extruder i). "
3615 "0: printable, 1: error, 2: critical warning, 3: warning, 4-7: reserved.");
3616 def->mode = comDevelop;
3617 def->set_default_value(new ConfigOptionInts{0});
3618
3619 // BBS
3620 def = this->add("temperature_vitrification", coInts);
3621 def->label = L("Softening temperature");
3622 def->tooltip = L("The material softens at this temperature, so when the bed temperature is equal to or greater than this, it\'s highly recommended to open the front door and/or remove the upper glass to avoid clogs.");
3623 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
3624 def->mode = comSimple;
3625 def->set_default_value(new ConfigOptionInts{ 100 });
3626
3627 def = this->add("filament_cost", coFloats);
3628 def->label = L("Price");
3629 def->tooltip = L("Filament price, for statistical purposes only.");
3630 def->sidetext = L("money/kg");
3631 def->min = 0;
3632 def->mode = comAdvanced;
3633 def->set_default_value(new ConfigOptionFloats { 0. });
3634
3635 def = this->add("filament_settings_id", coStrings);
3636 def->set_default_value(new ConfigOptionStrings { "" });
3637 //BBS: open this option to command line
3638 //def->cli = ConfigOptionDef::nocli;
3639
3640 def = this->add("filament_ids", coStrings);
3641 def->set_default_value(new ConfigOptionStrings());
3642 def->cli = ConfigOptionDef::nocli;
3643
3644 def = this->add("filament_vendor", coStrings);
3645 def->label = L("Vendor");
3646 def->tooltip = L("Vendor of filament. For show only.");
3647 def->mode = comAdvanced;
3648 def->set_default_value(new ConfigOptionStrings{L("(Undefined)")});
3649 def->cli = ConfigOptionDef::nocli;
3650
3651 def = this->add("infill_direction", coFloat);
3652 def->label = L("Sparse infill direction");
3653 def->category = L("Strength");
3654 def->tooltip = L("This is the angle for sparse infill pattern, which controls the start or main direction of lines.");
3655 def->sidetext = u8"°"; // degrees, don't need translation
3656 def->min = 0;
3657 def->max = 360;
3658 def->mode = comAdvanced;
3659 def->set_default_value(new ConfigOptionFloat(45));
3660
3661 def = this->add("solid_infill_direction", coFloat);
3662 def->label = L("Solid infill direction");
3663 def->category = L("Strength");
3664 def->tooltip = L("Angle for solid infill pattern, which controls the start or main direction of line.");
3665 def->sidetext = u8"°"; // degrees, don't need translation
3666 def->min = 0;
3667 def->max = 360;
3668 def->mode = comAdvanced;
3669 def->set_default_value(new ConfigOptionFloat(45));
3670
3671 def = this->add("top_layer_direction", coFloat);
3672 def->label = L("Top layer direction");
3673 def->category = L("Strength");
3674 def->tooltip = L("Fixed angle for the top solid infill and ironing lines.\nSet to -1 to follow the default solid infill direction.");
3675 def->sidetext = u8"°"; // degrees, don't need translation
3676 def->min = -1;
3677 def->max = 360;
3678 def->mode = comSimple;
3679 def->set_default_value(new ConfigOptionFloat(-1));
3680
3681 def = this->add("bottom_layer_direction", coFloat);
3682 def->label = L("Bottom layer direction");
3683 def->category = L("Strength");
3684 def->tooltip = L("Fixed angle for the bottom solid infill lines.\nSet to -1 to follow the default solid infill direction.");
3685 def->sidetext = u8"°"; // degrees, don't need translation
3686 def->min = -1;
3687 def->max = 360;
3688 def->mode = comSimple;
3689 def->set_default_value(new ConfigOptionFloat(-1));
3690
3691 def = this->add("sparse_infill_density", coPercent);
3692 def->label = L("Sparse infill density");
3693 def->category = L("Strength");
3694 // xgettext:no-c-format, no-boost-format
3695 def->tooltip = L("Density of internal sparse infill, 100% turns all sparse infill into solid infill and internal solid infill pattern will be used.");
3696 def->sidetext = "%";
3697 def->min = 0;
3698 def->max = 100;
3699 def->set_default_value(new ConfigOptionPercent(20));
3700
3701 def = this->add("align_infill_direction_to_model", coBool);
3702 def->label = L("Align directions to model");
3703 def->category = L("Strength");
3704 def->tooltip = L("Aligns infill, bridge, ironing, and top/bottom surface directions to follow the model's orientation on the build plate.\n"
3705 "When enabled, these directions rotate together with the model so the printed features keep their intended orientation "
3706 "relative to the part, preserving optimal strength and surface characteristics regardless of how the model is placed.");
3707 def->mode = comAdvanced;
3708 def->set_default_value(new ConfigOptionBool(false));
3709
3710 def = this->add("extra_solid_infills", coString);
3711 def->label = L("Insert solid layers");
3712 def->category = L("Strength");
3713 def->tooltip = L("Insert solid infill at specific layers. Use N to insert every Nth layer, N#K to insert K consecutive solid layers every N layers (K is optional, e.g. '5#' equals '5#1'), or a comma-separated list (e.g. 1,7,9) to insert at explicit layers. Layers are 1-based.");
3714 def->mode = comAdvanced;
3715 def->set_default_value(new ConfigOptionString());
3716
3717
3718 // Infill multiline
3719 def = this->add("fill_multiline", coInt);
3720 def->label = L("Fill Multiline");
3721 def->category = L("Strength");
3722 def->tooltip = L("Using multiple lines for the infill pattern, if supported by infill pattern.");
3723 def->min = 1;
3724 def->max = 10; // Maximum number of lines for infill pattern
3725 def->set_default_value(new ConfigOptionInt(1));
3726
3727 def = this->add("adaptive_infill_mode", coEnum);
3728 def->label = L("Adaptive density (experimental)");
3729 def->category = L("Strength");
3730 def->tooltip = L("Grades the Gyroid and TPMS infill inside the object: its cells grow from the surface of the "
3731 "object towards its center. The sparse infill density is used at the surface and the interior "
3732 "density at the center.\n"
3733 "Distance warp, Smooth blend and Stepped shells follow the distance to the nearest surface, "
3734 "including the top and bottom, with the interior density at the point farthest from it:\n"
3735 " - Distance warp: one continuous pattern, stretched and sheared where the distance changes "
3736 "across directions, as in plates and long parts.\n"
3737 " - Smooth blend: the patterns of neighbouring densities blended into each other, with small "
3738 "loops where they meet.\n"
3739 " - Stepped shells: shells of the regular pattern at densities about 1.5 times apart, their "
3740 "lines joined along the shell boundaries.\n"
3741 " - Lobes: follows the 3D shape of the object, including its top and bottom. Every lobe, a part "
3742 "joined to the rest by a narrower neck, is graded towards its own center.\n"
3743 " - Normal Z, Y or X: follows the sections of the object normal to that axis, so the density "
3744 "does not change along it.");
3746 def->enum_values.push_back("disabled");
3747 def->enum_values.push_back("distance_warp");
3748 def->enum_values.push_back("smooth_blend");
3749 def->enum_values.push_back("stepped_shells");
3750 def->enum_values.push_back("lobes");
3751 def->enum_values.push_back("normal_z");
3752 def->enum_values.push_back("normal_y");
3753 def->enum_values.push_back("normal_x");
3754 def->enum_labels.push_back(L("Disabled"));
3755 def->enum_labels.push_back(L("Distance warp"));
3756 def->enum_labels.push_back(L("Smooth blend"));
3757 def->enum_labels.push_back(L("Stepped shells"));
3758 def->enum_labels.push_back(L("Lobes"));
3759 def->enum_labels.push_back(L("Normal Z"));
3760 def->enum_labels.push_back(L("Normal Y"));
3761 def->enum_labels.push_back(L("Normal X"));
3762 def->mode = comAdvanced;
3763 def->set_default_value(new ConfigOptionEnum<AdaptiveInfillMode>(AdaptiveInfillMode::Disabled));
3764
3765 def = this->add("adaptive_infill_interior_density", coPercent);
3766 def->label = L("Interior density");
3767 def->category = L("Strength");
3768 def->tooltip = L("Density of the adaptive infill at the center of the object.");
3769 def->sidetext = "%";
3770 def->min = 1;
3771 def->max = 100;
3772 def->mode = comAdvanced;
3773 def->set_default_value(new ConfigOptionPercent(5));
3774
3775 def = this->add("adaptive_infill_gradient", coEnum);
3776 def->label = L("Adaptive gradient");
3777 def->category = L("Strength");
3778 def->tooltip = L("How the density changes from the surface to the center of the object.\n"
3779 "Linear: the density changes at a constant rate.\n"
3780 "Quadratic: the density stays close to the sparse infill density near the surface and "
3781 "changes faster towards the center.\n"
3782 "Exponential: the density changes quickly just below the surface and levels off towards "
3783 "the center.");
3785 def->enum_values.push_back("linear");
3786 def->enum_values.push_back("quadratic");
3787 def->enum_values.push_back("exponential");
3788 def->enum_labels.push_back(L("Linear"));
3789 def->enum_labels.push_back(L("Quadratic"));
3790 def->enum_labels.push_back(L("Exponential"));
3791 def->mode = comAdvanced;
3792 def->set_default_value(new ConfigOptionEnum<AdaptiveInfillGradient>(AdaptiveInfillGradient::Linear));
3793
3794 // Z-buckling bias optimization (experimental). Tightens the gyroid wave along the Z
3795 // (vertical) axis at low infill density to shorten the effective column length under
3796 // Z-axis compression. Filament use at the same `sparse_infill_density` setting is
3797 // preserved. No effect above ~30% density (formula clamps to no-op).
3798 def = this->add("gyroid_optimized", coBool);
3799 def->label = L("Z-buckling bias optimization (experimental)");
3800 def->category = L("Strength");
3801 // xgettext:no-c-format, no-boost-format
3802 def->tooltip = L("Tightens the gyroid wave along the Z (vertical) axis at low infill density "
3803 "to shorten the effective vertical column length and improve Z-axis compression "
3804 "buckling resistance. Filament use is preserved. No effect at ~30% sparse infill "
3805 "density and above. Only applies when Sparse infill pattern is set to Gyroid.");
3806 def->set_default_value(new ConfigOptionBool(false));
3807
3808 def = this->add("sparse_infill_pattern", coEnum);
3809 def->label = L("Sparse infill pattern");
3810 def->category = L("Strength");
3811 def->tooltip = L("This is the line pattern for internal sparse infill.");
3813 def->enum_values.push_back("rectilinear");
3814 def->enum_values.push_back("alignedrectilinear");
3815 def->enum_values.push_back("zigzag");
3816 def->enum_values.push_back("crosszag");
3817 def->enum_values.push_back("lockedzag");
3818 def->enum_values.push_back("line");
3819 def->enum_values.push_back("grid");
3820 def->enum_values.push_back("triangles");
3821 def->enum_values.push_back("tri-hexagon");
3822 def->enum_values.push_back("cubic");
3823 def->enum_values.push_back("adaptivecubic");
3824 def->enum_values.push_back("quartercubic");
3825 def->enum_values.push_back("supportcubic");
3826 def->enum_values.push_back("lightning");
3827 def->enum_values.push_back("honeycomb");
3828 def->enum_values.push_back("3dhoneycomb");
3829 def->enum_values.push_back("lateral-honeycomb");
3830 def->enum_values.push_back("lateral-lattice");
3831 def->enum_values.push_back("crosshatch");
3832 def->enum_values.push_back("tpmsd");
3833 def->enum_values.push_back("tpmsfk");
3834 def->enum_values.push_back("gyroid");
3835 def->enum_values.push_back("concentric");
3836 def->enum_values.push_back("hilbertcurve");
3837 def->enum_values.push_back("archimedeanchords");
3838 def->enum_values.push_back("octagramspiral");
3839 def->enum_labels.push_back(L("Rectilinear"));
3840 def->enum_labels.push_back(L("Aligned Rectilinear"));
3841 def->enum_labels.push_back(L("Zig Zag"));
3842 def->enum_labels.push_back(L("Cross Zag"));
3843 def->enum_labels.push_back(L("Locked Zag"));
3844 def->enum_labels.push_back(L("Line"));
3845 def->enum_labels.push_back(L("Grid"));
3846 def->enum_labels.push_back(L("Triangles"));
3847 def->enum_labels.push_back(L("Tri-hexagon"));
3848 def->enum_labels.push_back(L("Cubic"));
3849 def->enum_labels.push_back(L("Adaptive Cubic"));
3850 def->enum_labels.push_back(L("Quarter Cubic"));
3851 def->enum_labels.push_back(L("Support Cubic"));
3852 def->enum_labels.push_back(L("Lightning"));
3853 def->enum_labels.push_back(L("Honeycomb"));
3854 def->enum_labels.push_back(L("3D Honeycomb"));
3855 def->enum_labels.push_back(L("Lateral Honeycomb"));
3856 def->enum_labels.push_back(L("Lateral Lattice"));
3857 def->enum_labels.push_back(L("Cross Hatch"));
3858 def->enum_labels.push_back(L("TPMS-D"));
3859 def->enum_labels.push_back(L("TPMS-FK"));
3860 def->enum_labels.push_back(L("Gyroid"));
3861 def->enum_labels.push_back(L("Concentric"));
3862 def->enum_labels.push_back(L("Hilbert Curve"));
3863 def->enum_labels.push_back(L("Archimedean Chords"));
3864 def->enum_labels.push_back(L("Octagram Spiral"));
3865 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipCrossHatch));
3866
3867 def = this->add("sparse_infill_smooth_factor", coPercent);
3868 def->label = L("Sparse infill smooth factor");
3869 def->category = L("Strength");
3870 def->tooltip = L("Controls how strongly sparse infill corners are rounded. 0% keeps the original sharp path, "
3871 "while 100% produces the largest possible curves between adjacent infill lines.");
3872 def->sidetext = "%";
3873 def->min = 0;
3874 def->max = 100;
3875 def->mode = comAdvanced;
3876 def->set_default_value(new ConfigOptionPercent(0));
3877
3878 def = this->add("top_surface_acceleration", coFloats);
3879 def->label = L("Top surface");
3880 def->category = L("Speed");
3881 def->tooltip = L("This is the acceleration of top surface infill. Using a lower value may improve top surface quality.");
3882 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
3883 def->min = 0;
3884 def->mode = comAdvanced;
3885 def->nullable = true;
3886 def->set_default_value(new ConfigOptionFloatsNullable{500});
3887
3888 def = this->add("outer_wall_acceleration", coFloats);
3889 def->label = L("Outer wall");
3890 def->category = L("Speed");
3891 def->tooltip = L("Acceleration of outer wall: using a lower value can improve quality.");
3892 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
3893 def->min = 0;
3894 def->mode = comAdvanced;
3895 def->nullable = true;
3896 def->set_default_value(new ConfigOptionFloatsNullable{500});
3897
3898 def = this->add("inner_wall_acceleration", coFloats);
3899 def->label = L("Inner wall");
3900 def->category = L("Speed");
3901 def->tooltip = L("Acceleration of inner walls.");
3902 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
3903 def->min = 0;
3904 def->mode = comAdvanced;
3905 def->nullable = true;
3906 def->set_default_value(new ConfigOptionFloatsNullable{10000});
3907
3908 def = this->add("sparse_infill_acceleration", coFloatsOrPercents);
3909 def->label = L("Sparse infill");
3910 def->category = L("Speed");
3911 def->tooltip = L("Acceleration of sparse infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration.");
3912 def->sidetext = L(u8"mm/s² or %");
3913 def->min = 0;
3914 def->mode = comAdvanced;
3915 def->ratio_over = "default_acceleration";
3916 def->nullable = true;
3917 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(100, true)});
3918
3919 def = this->add("internal_solid_infill_acceleration", coFloatsOrPercents);
3920 def->label = L("Internal solid infill");
3921 def->category = L("Speed");
3922 def->tooltip = L("Acceleration of internal solid infill. If the value is expressed as a percentage (e.g. 100%), it will be calculated based on the default acceleration.");
3923 def->sidetext = L(u8"mm/s² or %");
3924 def->min = 0;
3925 def->mode = comAdvanced;
3926 def->ratio_over = "default_acceleration";
3927 def->nullable = true;
3928 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(100, true)});
3929
3930 def = this->add("initial_layer_acceleration", coFloats);
3931 def->label = L("First layer");
3932 def->category = L("Speed");
3933 def->tooltip = L("This is the printing acceleration for the first layer. Using limited acceleration can improve build plate adhesion.");
3934 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
3935 def->min = 0;
3936 def->mode = comAdvanced;
3937 def->nullable = true;
3938 def->set_default_value(new ConfigOptionFloatsNullable{300});
3939
3940 def = this->add("accel_to_decel_enable", coBool);
3941 def->label = L("Enable accel_to_decel");
3942 def->category = L("Speed");
3943 def->tooltip = L("Klipper's max_accel_to_decel will be adjusted automatically.");
3944 def->mode = comAdvanced;
3945 def->set_default_value(new ConfigOptionBool(true));
3946
3947 def = this->add("accel_to_decel_factor", coPercent);
3948 def->label = L("accel_to_decel");
3949 def->category = L("Speed");
3950 // xgettext:no-c-format, no-boost-format
3951 def->tooltip = L("Klipper's max_accel_to_decel will be adjusted to this % of acceleration.");
3952 def->sidetext = "%";
3953 def->min = 1;
3954 def->max = 100;
3955 def->mode = comAdvanced;
3956 def->set_default_value(new ConfigOptionPercent(50));
3957
3958 def = this->add("default_jerk", coFloats);
3959 def->label = L("Default");
3960 def->category = L("Speed");
3961 def->tooltip = L("Default jerk.");
3962 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3963 def->min = 0;
3964 def->mode = comAdvanced;
3965 def->nullable = true;
3966 def->set_default_value(new ConfigOptionFloatsNullable{0});
3967
3968 def = this->add("default_junction_deviation", coFloats);
3969 def->label = L("Junction Deviation");
3970 def->category = L("Speed");
3971 def->tooltip = L("Marlin Firmware Junction Deviation (replaces the traditional XY Jerk setting).");
3972 def->sidetext = L("mm"); // millimeters, CIS languages need translation
3973 def->min = 0.f;
3974 def->max = 0.3f;
3975 def->mode = comAdvanced;
3976 def->nullable = true;
3977 def->set_default_value(new ConfigOptionFloatsNullable{0.f});
3978
3979 def = this->add("outer_wall_jerk", coFloats);
3980 def->label = L("Outer wall");
3981 def->category = L("Speed");
3982 def->tooltip = L("Jerk of outer walls.");
3983 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3984 def->min = 0;
3985 def->mode = comAdvanced;
3986 def->nullable = true;
3987 def->set_default_value(new ConfigOptionFloatsNullable{9});
3988
3989 def = this->add("inner_wall_jerk", coFloats);
3990 def->label = L("Inner wall");
3991 def->category = L("Speed");
3992 def->tooltip = L("Jerk of inner walls.");
3993 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
3994 def->min = 0;
3995 def->mode = comAdvanced;
3996 def->nullable = true;
3997 def->set_default_value(new ConfigOptionFloatsNullable{9});
3998
3999 def = this->add("top_surface_jerk", coFloats);
4000 def->label = L("Top surface");
4001 def->category = L("Speed");
4002 def->nullable = true;
4003 def->tooltip = L("Jerk for top surface.");
4004 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4005 def->min = 0;
4006 def->mode = comAdvanced;
4007 def->set_default_value(new ConfigOptionFloatsNullable{9});
4008
4009 def = this->add("infill_jerk", coFloats);
4010 def->label = L("Infill");
4011 def->category = L("Speed");
4012 def->tooltip = L("Jerk for infill.");
4013 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4014 def->min = 0;
4015 def->mode = comAdvanced;
4016 def->nullable = true;
4017 def->set_default_value(new ConfigOptionFloatsNullable{9});
4018
4019 def = this->add("initial_layer_jerk", coFloats);
4020 def->label = L("First layer");
4021 def->category = L("Speed");
4022 def->tooltip = L("Jerk for the first layer.");
4023 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4024 def->min = 0;
4025 def->mode = comAdvanced;
4026 def->nullable = true;
4027 def->set_default_value(new ConfigOptionFloatsNullable{9});
4028
4029 def = this->add("travel_jerk", coFloats);
4030 def->label = L("Travel");
4031 def->category = L("Speed");
4032 def->tooltip = L("Jerk for travel.");
4033 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4034 def->min = 0;
4035 def->mode = comAdvanced;
4036 def->nullable = true;
4037 def->set_default_value(new ConfigOptionFloatsNullable{12});
4038
4039 def = this->add("initial_layer_travel_jerk", coFloatsOrPercents);
4040 def->label = L("First layer travel");
4041 def->tooltip = L("Travel jerk of first layer.\nThe percentage value is relative to Travel Jerk.");
4042 def->sidetext = L("mm/s or %");
4043 def->min = 0;
4044 def->mode = comAdvanced;
4045 def->ratio_over = "travel_jerk";
4046 def->nullable = true;
4047 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(100, true)});
4048
4049 def = this->add("initial_layer_line_width", coFloatOrPercent);
4050 def->label = L("First layer");
4051 def->category = L("Quality");
4052 def->tooltip = L("Line width of the first layer. If expressed as a %, it will be computed over the nozzle diameter.");
4053 def->sidetext = L("mm or %");
4054 def->ratio_over = "nozzle_diameter";
4055 def->min = 0;
4056 def->max = 1000;
4057 def->max_literal = 10;
4058 def->mode = comAdvanced;
4059 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
4060
4061 def = this->add("initial_layer_print_height", coFloat);
4062 def->label = L("First layer height");
4063 def->category = L("Quality");
4064 def->tooltip = L("Height of the first layer. Making the first layer height thicker can improve build plate adhesion.");
4065 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4066 def->min = 0;
4067 def->set_default_value(new ConfigOptionFloat(0.2));
4068
4069 //def = this->add("adaptive_layer_height", coBool);
4070 //def->label = L("Adaptive layer height");
4071 //def->category = L("Quality");
4072 //def->tooltip = L("Enabling this option means the height of every layer except the first will be automatically calculated "
4073 // "during slicing according to the slope of the model’s surface.\n"
4074 // "Note that this option only takes effect if no prime tower is generated in current plate.");
4075 //def->set_default_value(new ConfigOptionBool(0));
4076
4077 def = this->add("initial_layer_speed", coFloats);
4078 def->label = L("First layer");
4079 def->tooltip = L("This is the speed for the walls and brim of the first layer.");
4080 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4081 def->min = 1;
4082 def->mode = comAdvanced;
4083 def->nullable = true;
4084 def->set_default_value(new ConfigOptionFloatsNullable{30});
4085
4086 def = this->add("initial_layer_infill_speed", coFloats);
4087 def->label = L("First layer infill");
4088 def->tooltip = L("This is the speed for the first layer except for walls and brim, such as infill, gap fill and support.");
4089 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4090 def->min = 1;
4091 def->mode = comAdvanced;
4092 def->nullable = true;
4093 def->set_default_value(new ConfigOptionFloatsNullable{60.0});
4094
4095 def = this->add("initial_layer_travel_speed", coFloatsOrPercents);
4096 def->label = L("First layer travel speed");
4097 def->tooltip = L("Travel speed of the first layer.");
4098 def->category = L("Speed");
4099 def->sidetext = L("mm/s or %");
4100 def->ratio_over = "travel_speed";
4101 def->min = 1;
4102 def->mode = comAdvanced;
4103 def->nullable = true;
4104 def->set_default_value(new ConfigOptionFloatsOrPercentsNullable{FloatOrPercent(100, true)});
4105
4106 def = this->add("slow_down_layers", coInt);
4107 def->label = L("Number of slow layers");
4108 def->tooltip = L("The first few layers are printed slower than normal. "
4109 "The speed is gradually increased in a linear fashion over the specified number of layers.");
4110 def->category = L("Speed");
4111 def->sidetext = L("layers"); // ORCA add side text
4112 def->min = 0;
4113 def->mode = comAdvanced;
4114 def->set_default_value(new ConfigOptionInt(0));
4115
4116 def = this->add("nozzle_temperature_initial_layer", coInts);
4117 def->label = L("First layer");
4118 def->full_label = L("First layer nozzle temperature");
4119 def->tooltip = L("Nozzle temperature for printing the first layer with this filament");
4120 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
4121 def->min = 0;
4122 def->max = max_temp;
4123 def->set_default_value(new ConfigOptionInts { 200 });
4124
4125 def = this->add("full_fan_speed_layer", coInts);
4126 def->label = L("Full fan speed at layer");
4127 def->tooltip = L("Fan speed will be ramped up linearly from zero at layer \"close_fan_the_first_x_layers\" "
4128 "to maximum at layer \"full_fan_speed_layer\". "
4129 "\"full_fan_speed_layer\" will be ignored if lower than \"close_fan_the_first_x_layers\", in which case "
4130 "the fan will be running at maximum allowed speed at layer \"close_fan_the_first_x_layers\" + 1.");
4131 def->sidetext = L("layer"); // ORCA add side text
4132 def->min = 0;
4133 def->max = 1000;
4134 def->mode = comAdvanced;
4135 def->set_default_value(new ConfigOptionInts { 0 });
4136
4137 // ORCA: explicit override for the part cooling fan speed on the first printed layer.
4138 def = this->add("initial_layer_fan_speed", coInts);
4139 def->label = L("First layer fan speed");
4140 def->tooltip = L("Sets an exact fan speed for the first layer, overriding all other cooling settings. "
4141 "Useful for protecting 3D-printed toolhead parts (e.g. Voron-style ABS/ASA ducts) from "
4142 "a hot bed. A small amount of airflow cools the ducts down, without using full cooling that "
4143 "may in certain conditions hurt first-layer adhesion."
4144 "\nFrom the second layer onwards, normal cooling resumes."
4145 "\nIf \"Full fan speed at layer\" is also set, the fan ramps smoothly from this value "
4146 "on the first layer up to your target by the chosen layer."
4147 "\nOnly available when \"No cooling for the first\" is 0."
4148 "\nSet to -1 to disable it.");
4149 def->sidetext = "%";
4150 def->min = -1;
4151 def->max = 100;
4152 def->mode = comAdvanced;
4153 def->set_default_value(new ConfigOptionInts { -1 });
4154
4155 def = this->add("support_material_interface_fan_speed", coInts);
4156 def->label = L("Support interface fan speed");
4157 def->tooltip = L("This part cooling fan speed is applied when printing support interfaces. Setting this parameter to a higher than regular speed "
4158 "reduces the layer binding strength between supports and the supported part, making them easier to separate."
4159 "\nSet to -1 to disable it."
4160 "\nThis setting is overridden by disable_fan_first_layers.");
4161 def->sidetext = "%";
4162 def->min = -1;
4163 def->max = 100;
4164 def->mode = comAdvanced;
4165 def->set_default_value(new ConfigOptionInts{ -1 });
4166
4167 // ORCA: Add support for separate internal bridge fan speed control
4168 def = this->add("internal_bridge_fan_speed", coInts);
4169 def->label = L("Internal bridges fan speed");
4170 def->tooltip = L("The part cooling fan speed used for all internal bridges. Set to -1 to use the overhang fan speed settings instead.\n\n"
4171 "Reducing the internal bridges fan speed, compared to your regular fan speed, can help reduce part warping due to excessive "
4172 "cooling applied over a large surface for a prolonged period of time.");
4173 def->sidetext = "%";
4174 def->min = -1;
4175 def->max = 100;
4176 def->mode = comAdvanced;
4177 def->set_default_value(new ConfigOptionInts{ -1 });
4178
4179 def = this->add("ironing_fan_speed", coInts);
4180 def->label = L("Ironing fan speed");
4181 def->tooltip = L("This part cooling fan speed is applied when ironing. Setting this parameter to a lower than regular speed "
4182 "reduces possible nozzle clogging due to the low volumetric flow rate, making the interface smoother."
4183 "\nSet to -1 to disable it.");
4184 def->sidetext = "%";
4185 def->min = -1;
4186 def->max = 100;
4187 def->mode = comAdvanced;
4188 def->set_default_value(new ConfigOptionInts{ -1 });
4189
4190 // Filament ironing overrides
4191 def = this->add("filament_ironing_flow", coPercents);
4192 def->label = L("Ironing flow");
4193 def->category = L("Quality");
4194 def->tooltip = L("Filament-specific override for ironing flow. This allows you to customize the ironing flow "
4195 "for each filament type. Too high value results in overextrusion on the surface.");
4196 def->sidetext = "%";
4197 def->min = 0;
4198 def->max = 100;
4199 def->mode = comAdvanced;
4200 def->nullable = true;
4202
4203 def = this->add("filament_ironing_spacing", coFloats);
4204 def->label = L("Ironing line spacing");
4205 def->category = L("Quality");
4206 def->tooltip = L("Filament-specific override for ironing line spacing. This allows you to customize the spacing "
4207 "between ironing lines for each filament type.");
4208 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4209 def->min = 0;
4210 def->max = 1;
4211 def->mode = comAdvanced;
4212 def->nullable = true;
4214
4215 def = this->add("filament_ironing_inset", coFloats);
4216 def->label = L("Ironing inset");
4217 def->category = L("Quality");
4218 def->tooltip = L("Filament-specific override for ironing inset. This allows you to customize the distance to keep "
4219 "from the edges when ironing for each filament type.");
4220 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4221 def->min = 0;
4222 def->max = 100;
4223 def->mode = comAdvanced;
4224 def->nullable = true;
4226
4227 def = this->add("filament_ironing_speed", coFloats);
4228 def->label = L("Ironing speed");
4229 def->category = L("Speed");
4230 def->tooltip = L("Filament-specific override for ironing speed. This allows you to customize the print speed "
4231 "of ironing lines for each filament type.");
4232 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4233 def->min = 1;
4234 def->mode = comAdvanced;
4235 def->nullable = true;
4237
4238 def = this->add("fuzzy_skin", coEnum);
4239 def->label = L("Fuzzy skin");
4240 def->category = L("Others");
4241 def->tooltip = L("This setting makes the toolhead randomly jitter while printing walls so that the surface has a rough textured look. This setting controls the fuzzy position.");
4243 def->enum_values.push_back("none");
4244 def->enum_values.push_back("external");
4245 def->enum_values.push_back("hole");
4246 def->enum_values.push_back("all");
4247 def->enum_values.push_back("allwalls");
4248 def->enum_values.push_back("disabled_fuzzy");
4249 def->enum_labels.push_back(L("Painted only"));
4250 def->enum_labels.push_back(L("Contour"));
4251 def->enum_labels.push_back(L("Hole"));
4252 def->enum_labels.push_back(L("Contour and hole"));
4253 def->enum_labels.push_back(L("All walls"));
4254 def->enum_labels.push_back(L("Disabled"));
4255 def->mode = comSimple;
4256 def->set_default_value(new ConfigOptionEnum<FuzzySkinType>(FuzzySkinType::Disabled_fuzzy));
4257
4258 def = this->add("fuzzy_skin_thickness", coFloat);
4259 def->label = L("Fuzzy skin thickness");
4260 def->category = L("Others");
4261 def->tooltip = L("The width of jittering: it\u2019s recommended to keep this lower than the outer wall line width.");
4262 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4263 def->min = 0;
4264 def->max = 2;
4265 def->mode = comSimple;
4266 def->set_default_value(new ConfigOptionFloat(0.2));
4267
4268 def = this->add("fuzzy_skin_point_distance", coFloat);
4269 def->label = L("Fuzzy skin point distance");
4270 def->category = L("Others");
4271 def->tooltip = L("The average distance between the random points introduced on each line segment.");
4272 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4273 def->min = 0.01f; // point distance cannot be 0! Otherwise we get infinite loop + OOM due to infinite line division.
4274 def->max = 5.f;
4275 def->mode = comSimple;
4276 def->set_default_value(new ConfigOptionFloat(0.3f));
4277
4278 def = this->add("fuzzy_skin_first_layer", coBool);
4279 def->label = L("Apply fuzzy skin to first layer");
4280 def->category = L("Others");
4281 def->tooltip = L("Whether to apply fuzzy skin on the first layer.");
4282 def->mode = comSimple;
4283 def->set_default_value(new ConfigOptionBool(0));
4284
4285 def = this->add("fuzzy_skin_mode", coEnum);
4286 def->label = L("Fuzzy skin generator mode");
4287 def->category = L("Others");
4288 // xgettext:no-c-format, no-boost-format
4289 def->tooltip = L("Fuzzy skin generation mode. Works only with Arachne!\n"
4290 "Displacement: Сlassic mode when the pattern is formed by shifting the nozzle sideways from the original path.\n"
4291 "Extrusion: The mode when the pattern formed by the amount of extruded plastic. "
4292 "This is the fast and straight algorithm without unnecessary nozzle shake that gives a smooth pattern. "
4293 "But it is more useful for forming loose walls in the entire they array.\n"
4294 "Combined: Joint mode [Displacement] + [Extrusion]. The appearance of the walls is similar to [Displacement] Mode, but it leaves no pores between the perimeters.\n\n"
4295 "Attention! The [Extrusion] and [Combined] modes works only the fuzzy_skin_thickness parameter not more than the thickness of printed loop. "
4296 "At the same time, the width of the extrusion for a particular layer should also not be below a certain level. "
4297 "It is usually equal 15-25% of a layer height. Therefore, the maximum fuzzy skin thickness with a perimeter width of 0.4 mm and a layer height of 0.2 mm will be 0.4-(0.2*0.25)=±0.35mm! "
4298 "If you enter a higher parameter than this, the error Flow::spacing() will displayed, and the model will not be sliced. You can choose this number until this error is repeated." );
4300 def->enum_values.push_back("displacement");
4301 def->enum_values.push_back("extrusion");
4302 def->enum_values.push_back("combined");
4303 def->enum_labels.push_back(L("Displacement"));
4304 def->enum_labels.push_back(L("Extrusion"));
4305 def->enum_labels.push_back(L("Combined"));
4306 def->mode = comSimple;
4307 def->set_default_value(new ConfigOptionEnum<FuzzySkinMode>(FuzzySkinMode::Displacement));
4308
4309 def = this->add("fuzzy_skin_noise_type", coEnum);
4310 def->label = L("Fuzzy skin noise type");
4311 def->category = L("Others");
4312 def->tooltip = L("Noise type to use for fuzzy skin generation:\n"
4313 "Classic: Classic uniform random noise.\n"
4314 "Perlin: Perlin noise, which gives a more consistent texture.\n"
4315 "Billow: Similar to perlin noise, but clumpier.\n"
4316 "Ridged Multifractal: Ridged noise with sharp, jagged features. Creates marble-like textures.\n"
4317 "Voronoi: Divides the surface into voronoi cells, and displaces each one by a random amount. Creates a patchwork texture.\n"
4318 "Ripple: Uniform ripple pattern that ripples left and right of the original path. Repeating pattern, woven appearance.");
4319 def->enum_keys_map = &ConfigOptionEnum<NoiseType>::get_enum_values();
4320 def->enum_values.push_back("classic");
4321 def->enum_values.push_back("perlin");
4322 def->enum_values.push_back("billow");
4323 def->enum_values.push_back("ridgedmulti");
4324 def->enum_values.push_back("voronoi");
4325 def->enum_values.push_back("ripple");
4326 def->enum_labels.push_back(L("Classic"));
4327 def->enum_labels.push_back(L("Perlin"));
4328 def->enum_labels.push_back(L("Billow"));
4329 def->enum_labels.push_back(L("Ridged Multifractal"));
4330 def->enum_labels.push_back(L("Voronoi"));
4331 def->enum_labels.push_back(L("Ripple"));
4332 def->mode = comSimple;
4333 def->set_default_value(new ConfigOptionEnum<NoiseType>(NoiseType::Classic));
4334
4335 def = this->add("fuzzy_skin_scale", coFloat);
4336 def->label = L("Fuzzy skin feature size");
4337 def->category = L("Others");
4338 def->tooltip = L("The base size of the coherent noise features, in mm. Higher values will result in larger features.");
4339 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4340 def->min = 0.1f;
4341 def->max = 500;
4342 def->mode = comAdvanced;
4343 def->set_default_value(new ConfigOptionFloat(1.0));
4344
4345 def = this->add("fuzzy_skin_octaves", coInt);
4346 def->label = L("Fuzzy Skin Noise Octaves");
4347 def->category = L("Others");
4348 def->tooltip = L("The number of octaves of coherent noise to use. Higher values increase the detail of the noise, but also increase computation time.");
4349 def->min = 1;
4350 def->max = 10;
4351 def->mode = comAdvanced;
4352 def->set_default_value(new ConfigOptionInt(4));
4353
4354 def = this->add("fuzzy_skin_persistence", coFloat);
4355 def->label = L("Fuzzy skin noise persistence");
4356 def->category = L("Others");
4357 def->tooltip = L("The decay rate for higher octaves of the coherent noise. Lower values will result in smoother noise.");
4358 def->min = 0.01f;
4359 def->max = 1;
4360 def->mode = comAdvanced;
4361 def->set_default_value(new ConfigOptionFloat(0.5));
4362
4363 def = this->add("fuzzy_skin_ripples_per_layer", coInt);
4364 def->label = L("Number of ripples per layer");
4365 def->category = L("Others");
4366 def->tooltip = L("Controls how many full cycles of ripples will be added per layer.");
4367 def->min = 1;
4368 def->mode = comAdvanced;
4369 def->set_default_value(new ConfigOptionInt(15));
4370
4371 def = this->add("fuzzy_skin_ripple_offset", coPercent);
4372 def->label = L("Ripple offset");
4373 def->category = L("Others");
4374 def->tooltip = L("Shifts the ripple phase forward along the print path by the specified percentage of a wavelength each layer period.\n"
4375 "- 0% keeps every layer identical.\n"
4376 "- 50% shifts the pattern by half a wavelength, effectively inverting the phase.\n"
4377 "- 100% shifts the pattern by a full wavelength, returning to the original phase.\n\n"
4378 "The shift is applied once every number of layers set by Layers between ripple offset, so layers within the same group are printed identically.");
4379 def->min = 0;
4380 def->max = 100;
4381 def->sidetext = "%";
4382 def->mode = comAdvanced;
4383 def->set_default_value(new ConfigOptionPercent(50));
4384
4385 def = this->add("fuzzy_skin_layers_between_ripple_offset", coInt);
4386 def->label = L("Layers between ripple offset");
4387 def->category = L("Others");
4388 def->tooltip = L("Specifies how many consecutive layers share the same ripple phase before the offset is applied.\n"
4389 "For example:\n"
4390 "- 1 = Layer 1 is printed with the base ripple pattern, then layer 2 is shifted by the configured offset, then layer 3 returns to the base pattern, and so on.\n"
4391 "- 3 = Layers 1 to 3 are printed with the base ripple pattern, then layers 4 to 6 are shifted by the configured offset, then layers 7 to 9 return to the base pattern, etc.");
4392 def->min = 1;
4393 def->mode = comAdvanced;
4394 def->set_default_value(new ConfigOptionInt(1));
4395
4396 def = this->add("filter_out_gap_fill", coFloat);
4397 def->label = L("Filter out tiny gaps");
4398 def->category = L("Layers and Perimeters");
4399 def->tooltip = L("Don't print gap fill with a length is smaller than the threshold specified (in mm). This setting applies to top, "
4400 "bottom and solid infill and, if using the classic perimeter generator, to wall gap fill.");
4401 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4402 def->mode = comAdvanced;
4403 def->set_default_value(new ConfigOptionFloat(0));
4404
4405 def = this->add("gap_infill_speed", coFloats);
4406 def->label = L("Gap infill");
4407 def->category = L("Speed");
4408 def->tooltip = L("This is the speed for gap infill. Gaps usually have irregular line width and should be printed more slowly.");
4409 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
4410 def->min = 1;
4411 def->mode = comAdvanced;
4412 def->nullable = true;
4413 def->set_default_value(new ConfigOptionFloatsNullable{30});
4414
4415 // BBS
4416 def = this->add("precise_z_height", coBool);
4417 def->label = L("Precise Z height");
4418 def->category = L("Quality");
4419 def->tooltip = L("Enable this to get precise Z height of object after slicing. "
4420 "It will get the precise object height by fine-tuning the layer heights of the last few layers. "
4421 "Note that this is an experimental parameter.");
4422 def->mode = comAdvanced;
4423 def->set_default_value(new ConfigOptionBool(0));
4424
4425 // BBS
4426 def = this->add("enable_arc_fitting", coEnum);
4427 def->label = L("Arc fitting");
4428 def->tooltip = L("Fit G2 and G3 arc moves to the toolpaths. Walls and surfaces are fitted within the resolution, while "
4429 "sparse infill, supports and the wipe tower use fixed tolerances.\n"
4430 " - Disabled: only straight G1 moves are used.\n"
4431 " - Enabled: arcs are fitted to all toolpaths.\n"
4432 " - Sparse infill only: arcs are fitted to the sparse infill only, which shortens the G-code of "
4433 "curved infill patterns without affecting the walls and surfaces.\n\n"
4434 "Note: For Klipper machines, Disabled is recommended. Klipper splits arcs back into line segments, "
4435 "which lowers the surface quality and can increase the print time.");
4437 def->enum_values.push_back("disabled");
4438 def->enum_values.push_back("enabled");
4439 def->enum_values.push_back("sparse_infill");
4440 def->enum_labels.push_back(L("Disabled"));
4441 def->enum_labels.push_back(L("Enabled"));
4442 def->enum_labels.push_back(L("Sparse infill only"));
4443 def->mode = comAdvanced;
4444 def->set_default_value(new ConfigOptionEnum<ArcFittingMode>(ArcFittingMode::Disabled));
4445 // BBS
4446 def = this->add("gcode_add_line_number", coBool);
4447 def->label = L("Add line number");
4448 def->tooltip = L("Enable this to add line number(Nx) at the beginning of each G-code line.");
4449 def->mode = comDevelop;
4450 def->set_default_value(new ConfigOptionBool(0));
4451
4452 // BBS
4453 def = this->add("scan_first_layer", coBool);
4454 def->label = L("Scan first layer");
4455 def->tooltip = L("Enable this to allow the camera on the printer to check the quality of the first layer.");
4456 def->mode = comAdvanced;
4457 def->set_default_value(new ConfigOptionBool(false));
4458
4459 // Orca
4460 def = this->add("enable_power_loss_recovery", coEnum);
4461 def->label = L("Power Loss Recovery");
4462 def->tooltip = L("Choose how to control power loss recovery. When set to Printer configuration, the slicer will not emit power loss recovery G-code and will leave the printer's configuration unchanged. Applicable to Bambu Lab or Marlin 2 firmware based printers.");
4463 def->mode = comAdvanced;
4465 def->enum_values.push_back("printer_configuration");
4466 def->enum_values.push_back("enable");
4467 def->enum_values.push_back("disable");
4468 def->enum_labels.push_back(L("Printer configuration"));
4469 def->enum_labels.push_back(L("Enable"));
4470 def->enum_labels.push_back(L("Disable"));
4471 def->set_default_value(new ConfigOptionEnum<PowerLossRecoveryMode>(PowerLossRecoveryMode::PrinterConfiguration));
4472
4473 //BBS
4474 // def = this->add("spaghetti_detector", coBool);
4475 // def->label = L("Enable spaghetti detector");
4476 // def->tooltip = L("Enable the camera on printer to check spaghetti.");
4477 // def->mode = comSimple;
4478 // def->set_default_value(new ConfigOptionBool(false));
4479
4480 def = this->add("nozzle_type", coEnums);
4481 def->label = L("Nozzle type");
4482 def->tooltip = L("The metallic material of the nozzle: This determines the abrasive resistance of the nozzle and what kind of filament can be printed.");
4483 def->enum_keys_map = &ConfigOptionEnum<NozzleType>::get_enum_values();
4484 def->enum_values.push_back("undefine");
4485 def->enum_values.push_back("hardened_steel");
4486 def->enum_values.push_back("stainless_steel");
4487 def->enum_values.push_back("tungsten_carbide");
4488 def->enum_values.push_back("brass");
4489 def->enum_labels.push_back(L("Undefined"));
4490 def->enum_labels.push_back(L("Hardened steel"));
4491 def->enum_labels.push_back(L("Stainless steel"));
4492 def->enum_labels.push_back(L("Tungsten carbide"));
4493 def->enum_labels.push_back(L("Brass"));
4494 def->mode = comAdvanced;
4495 def->nullable = true;
4496 def->set_default_value(new ConfigOptionEnumsGenericNullable({ ntUndefine }));
4497
4498
4499 def = this->add("nozzle_hrc", coInt);
4500 def->label = L("Nozzle HRC");
4501 def->tooltip = L("The nozzle\'s hardness. Zero means no checking for nozzle hardness during slicing.");
4502 def->sidetext = L("HRC");
4503 def->min = 0;
4504 def->max = 500;
4505 def->mode = comDevelop;
4506 def->set_default_value(new ConfigOptionInt{0});
4507
4508 def = this->add("printer_structure", coEnum);
4509 def->label = L("Printer structure");
4510 def->tooltip = L("The physical arrangement and components of a printing device.");
4512 def->enum_values.push_back("undefine");
4513 def->enum_values.push_back("corexy");
4514 def->enum_values.push_back("i3");
4515 def->enum_values.push_back("hbot");
4516 def->enum_values.push_back("delta");
4517 def->enum_labels.push_back(L("Undefined"));
4518 def->enum_labels.push_back(L("CoreXY"));
4519 def->enum_labels.push_back(L("I3"));
4520 def->enum_labels.push_back(L("Hbot"));
4521 def->enum_labels.push_back(L("Delta"));
4522 def->mode = comDevelop;
4523 def->set_default_value(new ConfigOptionEnum<PrinterStructure>(psUndefine));
4524
4525 def = this->add("best_object_pos", coPoint);
4526 def->label = L("Best object position");
4527 def->tooltip = L("Best auto arranging position in range [0,1] w.r.t. bed shape.");
4528 def->mode = comAdvanced;
4529 def->set_default_value(new ConfigOptionPoint(Vec2d(0.5, 0.5)));
4530
4531 def = this->add("auxiliary_fan", coBool);
4532 def->label = L("Auxiliary part cooling fan");
4533 def->tooltip = L("Enable this option if machine has auxiliary part cooling fan. G-code command: M106 P2 S(0-255).");
4534 def->mode = comAdvanced;
4535 def->set_default_value(new ConfigOptionBool(false));
4536
4537 def = this->add("fan_direction", coEnum);
4538 def->label = L("Fan direction");
4539 def->tooltip = L("Cooling fan direction of the printer");
4541 def->enum_values.push_back("undefine");
4542 def->enum_values.push_back("left");
4543 def->enum_values.push_back("right");
4544 def->enum_values.push_back("both");
4545 def->enum_labels.push_back(L("Undefined"));
4546 def->enum_labels.push_back(L("Left"));
4547 def->enum_labels.push_back(L("Right"));
4548 def->enum_labels.push_back(L("Both"));
4549 def->mode = comDevelop;
4550 def->set_default_value(new ConfigOptionEnum<FanDirection>(fdUndefine));
4551
4552 def = this->add("fan_speedup_time", coFloat);
4553 // Label is set in Tab.cpp in the Line object.
4554 //def->label = L("Fan speed-up time");
4555 def->tooltip = L("Start the fan this number of seconds earlier than its target start time (you can use fractional seconds)."
4556 " It assumes infinite acceleration for this time estimation, and will only take into account G1 and G0 moves (arc fitting"
4557 " is unsupported)."
4558 "\nIt won't move fan commands from custom G-code (they act as a sort of 'barrier')."
4559 "\nIt won't move fan commands into the start G-code if the 'only custom start G-code' is activated."
4560 "\nUse 0 to deactivate.");
4561 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
4562 def->mode = comAdvanced;
4563 def->set_default_value(new ConfigOptionFloat(0));
4564
4565 def = this->add("fan_speedup_overhangs", coBool);
4566 def->label = L("Only overhangs");
4567 def->tooltip = L("Will only take into account the delay for the cooling of overhangs.");
4568 def->mode = comAdvanced;
4569 def->set_default_value(new ConfigOptionBool(true));
4570
4571 def = this->add("fan_kickstart", coFloat);
4572 def->label = L("Fan kick-start time");
4573 def->tooltip = L("Emit a max fan speed command for this amount of seconds before reducing to target speed to kick-start the cooling fan."
4574 "\nThis is useful for fans where a low PWM/power may be insufficient to get the fan started spinning from a stop, or to "
4575 "get the fan up to speed faster."
4576 "\nSet to 0 to deactivate.");
4577 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
4578 def->min = 0;
4579 def->mode = comAdvanced;
4580 def->set_default_value(new ConfigOptionFloat(0));
4581
4582 // ORCA: minimum non-zero part cooling fan speed.
4583 def = this->add("part_cooling_fan_min_pwm", coInt);
4584 def->label = L("Minimum non-zero part cooling fan speed");
4585 def->tooltip = L("Some part-cooling fans cannot start spinning when commanded below a certain PWM duty cycle. "
4586 "When set above 0, any non-zero part-cooling fan command will be raised to at least this percentage "
4587 "so the fan reliably starts. A fan command of 0 (fan off) is always honoured exactly. "
4588 "This clamp is applied after every other fan calculation (first-layer ramp, layer-time interpolation, "
4589 "overhang/bridge/support-interface/ironing overrides), so scaling still operates within the range "
4590 "[this value, 100%]."
4591 "\nIf your firmware already disables the fan below a threshold (for example Klipper's "
4592 "[fan] off_below: 0.10 shuts the fan off whenever the commanded duty cycle is below 10%), "
4593 "this option and the firmware threshold should ideally be set to the same value. Matching them "
4594 "(e.g. off_below: 0.10 in Klipper and 10% here) guarantees the slicer never emits a non-zero "
4595 "value that the firmware would silently drop, and the fan never receives a value below the one "
4596 "you know it can actually spool at."
4597 "\nSet to 0 to deactivate.");
4598 def->sidetext = "%";
4599 def->min = 0;
4600 def->max = 100;
4601 def->mode = comAdvanced;
4602 def->set_default_value(new ConfigOptionInt(0));
4603
4604
4605 def = this->add("time_cost", coFloat);
4606 def->label = L("Time cost");
4607 def->tooltip = L("The printer cost per hour.");
4608 def->sidetext = L("money/h");
4609 def->min = 0;
4610 def->mode = comAdvanced;
4611 def->set_default_value(new ConfigOptionFloat(0));
4612
4613 // Orca: may remove this option later
4614 def =this->add("support_chamber_temp_control",coBool);
4615 def->label=L("Support controlling chamber temperature");
4616 def->tooltip=L("This option is enabled if the machine supports controlling the chamber temperature\nG-code command: M141 S(0-255)");
4617 def->mode=comAdvanced;
4618 def->set_default_value(new ConfigOptionBool(true));
4619 def->readonly=false;
4620
4621 def =this->add("support_air_filtration",coBool);
4622 def->label=L("Support air filtration");
4623 def->tooltip=L("Enable this if the printer supports air filtration\nG-code command: M106 P3 S(0-255)");
4624 def->mode=comDevelop;
4625 def->set_default_value(new ConfigOptionBool(true));
4626
4627 // Printer capability flag: switches the accessory UI between air filtration and the cooling filter.
4628 def = this->add("support_cooling_filter", coBool);
4629 def->mode = comAdvanced;
4630 def->set_default_value(new ConfigOptionBool(false));
4631
4632 def = this->add("cooling_filter_enabled", coBool);
4633 def->label = L("Use cooling filter");
4634 def->tooltip = L("Enable this if the printer supports a cooling filter");
4635 def->mode = comAdvanced;
4636 def->set_default_value(new ConfigOptionBool(false));
4637
4638 def = this->add("gcode_flavor", coEnum);
4639 def->label = L("G-code flavor");
4640 def->tooltip = L("What kind of G-code the printer is compatible with.");
4641 def->enum_keys_map = &ConfigOptionEnum<GCodeFlavor>::get_enum_values();
4642 def->enum_values.push_back("marlin");
4643 def->enum_values.push_back("klipper");
4644 def->enum_values.push_back("reprapfirmware");
4645 def->enum_values.push_back("repetier");
4646 def->enum_values.push_back("marlin2");
4647 //def->enum_values.push_back("reprap");
4648 //def->enum_values.push_back("teacup");
4649 //def->enum_values.push_back("makerware");
4650 //def->enum_values.push_back("sailfish");
4651 //def->enum_values.push_back("mach3");
4652 //def->enum_values.push_back("machinekit");
4653 //def->enum_values.push_back("smoothie");
4654 //def->enum_values.push_back("no-extrusion");
4655 def->enum_labels.push_back(L("Marlin (legacy)"));
4656 def->enum_labels.push_back(L("Klipper"));
4657 def->enum_labels.push_back("RepRapFirmware");
4658 def->enum_labels.push_back("Repetier");
4659 def->enum_labels.push_back("Marlin 2");
4660 //def->enum_labels.push_back("RepRap/Sprinter");
4661 //def->enum_labels.push_back("Teacup");
4662 //def->enum_labels.push_back("MakerWare (MakerBot)");
4663 //def->enum_labels.push_back("Sailfish (MakerBot)");
4664 //def->enum_labels.push_back("Mach3/LinuxCNC");
4665 //def->enum_labels.push_back("Machinekit");
4666 //def->enum_labels.push_back("Smoothie");
4667 //def->enum_labels.push_back(L("No extrusion"));
4668 def->mode = comAdvanced;
4669 def->readonly = false;
4670 def->set_default_value(new ConfigOptionEnum<GCodeFlavor>(gcfMarlinLegacy));
4671
4672 def = this->add("gcode_skip_config_block", coBool);
4673 def->label = L("Skip G-code config block");
4674 def->tooltip = L("Do not write the CONFIG_BLOCK (slicer configuration key/value pairs) into the G-code file. "
4675 "This can help with printers whose firmware crashes when parsing these comment lines "
4676 "(e.g. Anycubic go-klipper). Note: the G-code file will no longer contain slicer settings, "
4677 "so importing it back into OrcaSlicer will not restore the configuration.");
4678 def->mode = comAdvanced;
4679 def->set_default_value(new ConfigOptionBool(false));
4680
4681 def = this->add("pellet_modded_printer", coBool);
4682 def->label = L("Pellet Modded Printer");
4683 def->tooltip = L("Enable this option if your printer uses pellets instead of filaments.");
4684 def->mode = comSimple;
4685 def->set_default_value(new ConfigOptionBool(false));
4686
4687 def = this->add("support_multi_bed_types", coBool);
4688 def->label = L("Support multi bed types");
4689 def->tooltip = L("Enable this option if you want to use multiple bed types.");
4690 def->mode = comSimple;
4691 def->set_default_value(new ConfigOptionBool(false));
4692
4693 def = this->add("gcode_label_objects", coBool);
4694 def->label = L("Label objects");
4695 def->tooltip = L("Enable this to add comments into the G-code labeling print moves with what object they belong to,"
4696 " which is useful for the Octoprint CancelObject plug-in. This setting is NOT compatible with "
4697 "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill.");
4698 def->mode = comAdvanced;
4699 def->set_default_value(new ConfigOptionBool(1));
4700
4701 def = this->add("exclude_object", coBool);
4702 def->label = L("Exclude objects");
4703 def->tooltip = L("Enable this option to add EXCLUDE OBJECT command in G-code.");
4704 def->mode = comAdvanced;
4705 def->set_default_value(new ConfigOptionBool(false));
4706
4707 def = this->add("exclude_object_tolerance", coFloat);
4708 def->label = L("Outline tolerance");
4709 def->tooltip = L("Maximum deviation of the object outline written to EXCLUDE_OBJECT_DEFINE from the "
4710 "original outline. Larger values give fewer points, which helps firmware that stalls "
4711 "while parsing G-code with many objects. 0 keeps every point.");
4712 def->sidetext = L("mm");
4713 def->min = 0;
4714 def->max = 5;
4715 def->mode = comExpert;
4716 def->set_default_value(new ConfigOptionFloat(0.1));
4717
4718 def = this->add("gcode_comments", coBool);
4719 def->label = L("Verbose G-code");
4720 def->tooltip = L("Enable this to get a commented G-code file, with each line explained by a descriptive text. "
4721 "If you print from SD card, the additional weight of the file could make your firmware "
4722 "slow down.");
4723 def->mode = comAdvanced;
4724 def->set_default_value(new ConfigOptionBool(0));
4725
4726 def = this->add("high_precision_gcode", coBool);
4727 def->label = L("High precision G-code (experimental)");
4728 def->tooltip = L("Write X, Y, Z, I and J with 4 decimal places instead of 3, and E with 6 instead of 5, to reduce "
4729 "rounding errors in the G-code. With relative E distances, the rounding error of each move is also "
4730 "carried over to the next one. Supports are removed after printing, so they keep the standard "
4731 "precision. This may help stabilize extrusion with small nozzles (e.g. 0.2 mm) and "
4732 "thin layers (e.g. 0.08 mm or less), where each move extrudes so little material that rounding errors "
4733 "matter most. The effect depends strongly on how well the rest of the settings are tuned and may be hard "
4734 "to notice unless the print profile is well calibrated. The G-code file becomes about 10 percent larger, "
4735 "which may slow down printers that parse G-code slowly.");
4736 def->mode = comExpert;
4737 def->set_default_value(new ConfigOptionBool(false));
4738
4739 //BBS
4740 def = this->add("infill_combination", coBool);
4741 def->label = L("Infill combination");
4742 def->category = L("Strength");
4743 def->tooltip = L("Automatically combine sparse infill of several layers to print together in order to reduce time. Walls are still printed with original layer height.");
4744 def->mode = comAdvanced;
4745 def->set_default_value(new ConfigOptionBool(false));
4746
4747 def = this->add("infill_shift_step", coFloat);
4748 def->label = L("Infill shift step");
4749 def->category = L("Strength");
4750 def->tooltip = L("This parameter adds a slight displacement to each layer of infill to create a cross texture.");
4751 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4752 def->min = 0;
4753 def->max = 10;
4754 def->mode = comAdvanced;
4755 def->set_default_value(new ConfigOptionFloat(0.4));
4756
4757 //Orca
4758 def = this->add("sparse_infill_rotate_template", coString);
4759 def->label = L("Sparse infill rotation template");
4760 def->category = L("Strength");
4761 def->tooltip = L("Rotate the sparse infill direction per layer using a template of angles. "
4762 "Enter comma-separated degrees (e.g., '0,30,60,90'). "
4763 "Angles are applied in order by layer and repeat when the list ends. "
4764 "Advanced syntax is supported: '+5' rotates +5° every layer; '+5#5' rotates +5° every 5 layers. See the Wiki for details. "
4765 "When a template is set, the standard infill direction setting is ignored. "
4766 "Note: some infill patterns (e.g., Gyroid) control rotation themselves; use with care.");
4767 def->sidetext = u8"°"; // degrees, don't need translation
4768 def->mode = comAdvanced;
4769 def->set_default_value(new ConfigOptionString(""));
4770
4771 //Orca
4772 def = this->add("solid_infill_rotate_template", coString);
4773 def->label = L("Solid infill rotation template");
4774 def->category = L("Strength");
4775 def->tooltip = L("This parameter adds a rotation of solid infill direction to each layer according to the specified template. "
4776 "The template is a comma-separated list of angles in degrees, e.g. '0,90'. "
4777 "The first angle is applied to the first layer, the second angle to the second layer, and so on. "
4778 "If there are more layers than angles, the angles will be repeated. Note that not all solid infill patterns support rotation.");
4779 def->sidetext = u8"°"; // degrees, don't need translation
4780 def->mode = comAdvanced;
4781 def->set_default_value(new ConfigOptionString(""));
4782
4783 def = this->add("skeleton_infill_density", coPercent);
4784 def->label = L("Skeleton infill density");
4785 def->category = L("Strength");
4786 def->tooltip = L("The remaining part of the model contour after removing a certain depth from the surface is called the skeleton. "
4787 "This parameter is used to adjust the density of this section. "
4788 "When two regions have the same sparse infill settings but different skeleton densities, their skeleton areas will develop overlapping sections. "
4789 "Default is as same as infill density.");
4790 def->sidetext = "%";
4791 def->min = 0;
4792 def->max = 100;
4793 def->mode = comAdvanced;
4794 def->set_default_value(new ConfigOptionPercent(25));
4795
4796 def = this->add("skin_infill_density", coPercent);
4797 def->label = L("Skin infill density");
4798 def->category = L("Strength");
4799 def->tooltip = L("The portion of the model's outer surface within a certain depth range is called the skin. "
4800 "This parameter is used to adjust the density of this section. "
4801 "When two regions have the same sparse infill settings but different skin densities, this area will not be split into two separate regions. "
4802 "Default is as same as infill density.");
4803 def->sidetext = "%";
4804 def->min = 0;
4805 def->max = 100;
4806 def->mode = comAdvanced;
4807 def->set_default_value(new ConfigOptionPercent(25));
4808
4809 def = this->add("skin_infill_depth", coFloat);
4810 def->label = L("Skin infill depth");
4811 def->category = L("Strength");
4812 def->tooltip = L("The parameter sets the depth of skin.");
4813 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4814 def->min = 0;
4815 def->max = 100;
4816 def->mode = comAdvanced;
4817 def->set_default_value(new ConfigOptionFloat(2.0));
4818
4819 def = this->add("infill_lock_depth", coFloat);
4820 def->label = L("Infill lock depth");
4821 def->category = L("Strength");
4822 def->tooltip = L("The parameter sets the overlapping depth between the interior and skin.");
4823 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4824 def->min = 0;
4825 def->max = 100;
4826 def->mode = comAdvanced;
4827 def->set_default_value(new ConfigOptionFloat(1.0));
4828
4829 def = this->add("skin_infill_line_width", coFloatOrPercent);
4830 def->label = L("Skin line width");
4831 def->category = L("Strength");
4832 def->tooltip = L("Adjust the line width of the selected skin paths.");
4833 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4834 def->ratio_over = "nozzle_diameter";
4835 def->min = 0;
4836 def->mode = comAdvanced;
4837 def->set_default_value(new ConfigOptionFloatOrPercent(100, true));
4838
4839 def = this->add("skeleton_infill_line_width", coFloatOrPercent);
4840 def->label = L("Skeleton line width");
4841 def->category = L("Strength");
4842 def->tooltip = L("Adjust the line width of the selected skeleton paths.");
4843 def->sidetext = L("mm"); // millimeters, CIS languages need translation
4844 def->ratio_over = "nozzle_diameter";
4845 def->min = 0;
4846 def->mode = comAdvanced;
4847 def->set_default_value(new ConfigOptionFloatOrPercent(100, true));
4848
4849 def = this->add("symmetric_infill_y_axis", coBool);
4850 def->label = L("Symmetric infill Y axis");
4851 def->category = L("Strength");
4852 def->tooltip = L("If the model has two parts that are symmetric about the Y axis,"
4853 " and you want these parts to have symmetric textures, please click this option on one of the parts.");
4854 def->mode = comAdvanced;
4855 def->set_default_value(new ConfigOptionBool(false));
4856
4857 def = this->add("infill_complete_top", coBool);
4858 def->label = L("Fill pattern tops");
4859 def->category = L("Strength");
4860 def->tooltip = L("Choose this option if you want to completely fill in the tops of the infill pattern");
4861 def->mode = comAdvanced;
4862 def->set_default_value(new ConfigOptionBool(false));
4863
4864 // Orca: max layer height for combined infill
4865 def = this->add("infill_combination_max_layer_height", coFloatOrPercent);
4866 def->label = L("Infill combination - Max layer height");
4867 def->category = L("Strength");
4868 def->tooltip = L("Maximum layer height for the combined sparse infill.\n\n"
4869 "Set it to 0 or 100% to use the nozzle diameter (for maximum reduction in print time) or a value of ~80% to maximize sparse infill strength.\n\n"
4870 "The number of layers over which infill is combined is derived by dividing this value with the layer height and rounded down to the nearest decimal.\n\n"
4871 "Use either absolute mm values (eg. 0.32mm for a 0.4mm nozzle) or % values (eg 80%). This value must not be larger "
4872 "than the nozzle diameter.");
4873 def->sidetext = L("mm or %");
4874 def->min = 0;
4875 def->mode = comAdvanced;
4876 def->set_default_value(new ConfigOptionFloatOrPercent(100., true));
4877
4878 // BBS
4879 def = this->add("enable_wrapping_detection", coBool);
4880 def->label = L("Enable clumping detection");
4881 def->tooltip = L("Enable clumping detection");
4882 def->mode = comAdvanced;
4883 def->set_default_value(new ConfigOptionBool(false));
4884
4885 def = this->add("wrapping_detection_layers", coInt);
4886 def->label = L("Clumping detection layers");
4887 def->tooltip = L("Clumping detection layers.");
4888 def->min = 0;
4889 def->mode = comDevelop;
4890 def->set_default_value(new ConfigOptionInt(20));
4891
4892 def = this->add("wrapping_exclude_area", coPoints);
4893 def->label = L("Probing exclude area of clumping");
4894 def->tooltip = L("Probing exclude area of clumping.");
4895 def->mode = comAdvanced;
4897 def->set_default_value(new ConfigOptionPoints());
4898
4899 def = this->add("lateral_lattice_angle_1", coFloat);
4900 def->label = L("Lateral lattice angle 1");
4901 def->category = L("Strength");
4902 def->tooltip = L("The angle of the first set of Lateral lattice elements in the Z direction. Zero is vertical.");
4903 def->sidetext = u8"°"; // degrees, don't need translation
4904 def->min = -75;
4905 def->max = 75;
4906 def->mode = comAdvanced;
4907 def->set_default_value(new ConfigOptionFloat(-45));
4908
4909 def = this->add("lateral_lattice_angle_2", coFloat);
4910 def->label = L("Lateral lattice angle 2");
4911 def->category = L("Strength");
4912 def->tooltip = L("The angle of the second set of Lateral lattice elements in the Z direction. Zero is vertical.");
4913 def->sidetext = u8"°"; // degrees, don't need translation
4914 def->min = -75;
4915 def->max = 75;
4916 def->mode = comAdvanced;
4917 def->set_default_value(new ConfigOptionFloat(45));
4918
4919 def = this->add("infill_overhang_angle", coFloat);
4920 def->label = L("Infill overhang angle");
4921 def->category = L("Strength");
4922 def->tooltip = L("The angle of the infill angled lines. 60° will result in a pure honeycomb.");
4923 def->sidetext = u8"°"; // degrees, don't need translation
4924 def->min = 15;
4925 def->max = 75;
4926 def->mode = comAdvanced;
4927 def->set_default_value(new ConfigOptionFloat(60));
4928
4929 def = this->add("lightning_overhang_angle", coFloat);
4930 def->label = L("Lightning overhang angle");
4931 def->category = L("Strength");
4932 def->tooltip = L("Maximum overhang angle for Lightning infill support propagation.");
4933 def->sidetext = u8"°"; // degrees, don't need translation
4934 def->min = 5;
4935 def->max = 85;
4936 def->mode = comExpert;
4937 def->set_default_value(new ConfigOptionFloat(45));
4938
4939 def = this->add("lightning_prune_angle", coFloat);
4940 def->label = L("Prune angle");
4941 def->category = L("Strength");
4942 def->tooltip = L("Controls how aggressively short or unsupported Lightning branches are pruned.\n"
4943 "This angle is converted internally to a per-layer distance.");
4944 def->sidetext = u8"°"; // degrees, don't need translation
4945 def->min = 5;
4946 def->max = 85;
4947 def->mode = comExpert;
4948 def->set_default_value(new ConfigOptionFloat(45));
4949
4950 def = this->add("lightning_straightening_angle", coFloat);
4951 def->label = L("Straightening angle");
4952 def->category = L("Strength");
4953 def->tooltip = L("Maximum straightening angle used to simplify Lightning branches.");
4954 def->sidetext = u8"°"; // degrees, don't need translation
4955 def->min = 5;
4956 def->max = 85;
4957 def->mode = comExpert;
4958 def->set_default_value(new ConfigOptionFloat(45));
4959
4960 auto def_infill_anchor_min = def = this->add("infill_anchor", coFloatOrPercent);
4961 def->label = L("Sparse infill anchor length");
4962 def->category = L("Strength");
4963 def->tooltip = L("Connect an infill line to an internal perimeter with a short segment of an additional perimeter. "
4964 "If expressed as percentage (example: 15%) it is calculated over infill extrusion width. "
4965 "Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment "
4966 "shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side "
4967 "and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max.\n"
4968 "Set this parameter to zero to disable anchoring perimeters connected to a single infill line.");
4969 def->sidetext = L("mm or %");
4970 def->ratio_over = "sparse_infill_line_width";
4971 def->max_literal = 1000;
4973 def->enum_values.push_back("0");
4974 def->enum_values.push_back("1");
4975 def->enum_values.push_back("2");
4976 def->enum_values.push_back("5");
4977 def->enum_values.push_back("10");
4978 def->enum_values.push_back("1000");
4979 def->enum_labels.push_back(L("0 (no open anchors)"));
4980 def->enum_labels.push_back("1 mm");
4981 def->enum_labels.push_back("2 mm");
4982 def->enum_labels.push_back("5 mm");
4983 def->enum_labels.push_back("10 mm");
4984 def->enum_labels.push_back(L("1000 (unlimited)"));
4985 def->mode = comAdvanced;
4986 def->set_default_value(new ConfigOptionFloatOrPercent(400, true));
4987
4988 def = this->add("infill_anchor_max", coFloatOrPercent);
4989 def->label = L("Maximum length of the infill anchor");
4990 def->category = L("Strength");
4991 def->tooltip = L("Connect an infill line to an internal perimeter with a short segment of an additional perimeter. "
4992 "If expressed as percentage (example: 15%) it is calculated over infill extrusion width. "
4993 "Orca Slicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment "
4994 "shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side "
4995 "and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter.\n"
4996 "If set to 0, the old algorithm for infill connection will be used, it should create the same result as with 1000 & 0.");
4997 def->sidetext = def_infill_anchor_min->sidetext;
4998 def->ratio_over = def_infill_anchor_min->ratio_over;
4999 def->gui_type = def_infill_anchor_min->gui_type;
5000 def->enum_values = def_infill_anchor_min->enum_values;
5001 def->max_literal = def_infill_anchor_min->max_literal;
5002 def->enum_labels.push_back(L("0 (Simple connect)"));
5003 def->enum_labels.push_back("1 mm");
5004 def->enum_labels.push_back("2 mm");
5005 def->enum_labels.push_back("5 mm");
5006 def->enum_labels.push_back("10 mm");
5007 def->enum_labels.push_back(L("1000 (unlimited)"));
5008 def->mode = comAdvanced;
5009 def->set_default_value(new ConfigOptionFloatOrPercent(20, false));
5010
5011 def = this->add("sparse_infill_filament_id", coInt);
5013 def->label = L("Infill");
5014 def->category = L("Extruders");
5015 def->tooltip = L("Filament to print internal sparse infill.\n\"Default\" uses the active object/part filament.");
5016 def->min = 0;
5017 def->mode = comAdvanced;
5018 def->set_default_value(new ConfigOptionInt(0));
5019
5020 def = this->add("sparse_infill_line_width", coFloatOrPercent);
5021 def->label = L("Sparse infill");
5022 def->category = L("Quality");
5023 def->tooltip = L("Line width of internal sparse infill. If expressed as a %, it will be computed over the nozzle diameter.");
5024 def->sidetext = L("mm or %");
5025 def->ratio_over = "nozzle_diameter";
5026 def->min = 0;
5027 def->max = 1000;
5028 def->max_literal = 10;
5029 def->mode = comAdvanced;
5030 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
5031
5032 def = this->add("infill_wall_overlap", coPercent);
5033 def->label = L("Infill/wall overlap");
5034 def->category = L("Strength");
5035 // xgettext:no-c-format, no-boost-format
5036 def->tooltip = L("This allows the infill area to be enlarged slightly to overlap with walls for better bonding. The percentage value is relative to the inner wall line width. Set this value to ~10-15% to minimize potential over extrusion and accumulation of material resulting in rough top surfaces.");
5037 def->sidetext = "%";
5038 def->ratio_over = "inner_wall_line_width";
5039 def->mode = comAdvanced;
5040 def->set_default_value(new ConfigOptionPercent(15));
5041
5042 def = this->add("top_bottom_infill_wall_overlap", coPercent);
5043 def->label = L("Top/Bottom solid infill/wall overlap");
5044 def->category = L("Strength");
5045 // xgettext:no-c-format, no-boost-format
5046 def->tooltip = L("Top solid infill area is enlarged slightly to overlap with wall for better bonding "
5047 "and to minimize the appearance of pinholes where the top infill meets the walls. "
5048 "A value of 25-30% is a good starting point, minimizing the appearance of pinholes. "
5049 "The percentage value is relative to the inner wall line width.");
5050 def->sidetext = "%";
5051 def->ratio_over = "inner_wall_line_width";
5052 def->mode = comAdvanced;
5053 def->set_default_value(new ConfigOptionPercent(25));
5054
5055 def = this->add("sparse_infill_speed", coFloats);
5056 def->label = L("Sparse infill");
5057 def->category = L("Speed");
5058 def->tooltip = L("This is the speed for internal sparse infill.");
5059 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5060 def->min = 1;
5061 def->mode = comAdvanced;
5062 def->nullable = true;
5063 def->set_default_value(new ConfigOptionFloatsNullable{100});
5064
5065 def = this->add("inherits", coString);
5066 def->label = L("Inherits profile");
5067 def->tooltip = L("Name of parent profile.");
5068 def->full_width = true;
5069 def->height = 5;
5070 def->set_default_value(new ConfigOptionString());
5071 def->cli = ConfigOptionDef::nocli;
5072
5073 // The following value is to be stored into the project file (AMF, 3MF, Config ...)
5074 // and it contains a sum of "inherits" values over the print and filament profiles.
5075 def = this->add("inherits_group", coStrings);
5076 def->set_default_value(new ConfigOptionStrings());
5077 def->cli = ConfigOptionDef::nocli;
5078
5079 def = this->add("interface_shells", coBool);
5080 def->label = L("Interface shells");
5081 def->tooltip = L("Force the generation of solid shells between adjacent materials/volumes. "
5082 "Useful for multi-extruder prints with translucent materials or manual soluble "
5083 "support material.");
5084 def->category = L("Quality");
5085 def->mode = comAdvanced;
5086 def->set_default_value(new ConfigOptionBool(false));
5087
5088 def = this->add("mmu_segmented_region_max_width", coFloat);
5089 def->label = L("Maximum width of a segmented region");
5090 def->tooltip = L("Maximum width of a segmented region. A value of 0 disables this feature.");
5091 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5092 def->min = 0;
5093 def->category = L("Advanced");
5094 def->mode = comAdvanced;
5095 def->set_default_value(new ConfigOptionFloat(0.));
5096
5097 def = this->add("mmu_segmented_region_interlocking_depth", coFloat);
5098 def->label = L("Interlocking depth of a segmented region");
5099 def->tooltip = L("Interlocking depth of a segmented region. On every other layer, the segmented region "
5100 "is limited to this depth. It will be ignored if \"interlocking_beam\" is enabled. "
5101 "Zero disables this feature.");
5102 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5103 def->min = 0;
5104 def->category = L("Advanced");
5105 def->mode = comAdvanced;
5106 def->set_default_value(new ConfigOptionFloat(0.));
5107
5108 def = this->add("interlocking_beam", coBool);
5109 def->label = L("Use beam interlocking");
5110 def->tooltip = L("Generate interlocking beam structure at the locations where different filaments touch. This improves the adhesion between filaments, especially models printed in different materials.");
5111 def->category = L("Advanced");
5112 def->mode = comAdvanced;
5113 def->set_default_value(new ConfigOptionBool(false));
5114
5115 def = this->add("interlocking_beam_width", coFloat);
5116 def->label = L("Interlocking beam width");
5117 def->tooltip = L("The width of the interlocking structure beams.");
5118 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5119 def->min = 0.01;
5120 def->category = L("Advanced");
5121 def->mode = comAdvanced;
5122 def->set_default_value(new ConfigOptionFloat(0.8));
5123
5124 def = this->add("interlocking_orientation", coFloat);
5125 def->label = L("Interlocking direction");
5126 def->tooltip = L("Orientation of interlock beams.");
5127 def->sidetext = u8"°"; // degrees, don't need translation
5128 def->min = 0;
5129 def->max = 360;
5130 def->category = L("Advanced");
5131 def->mode = comAdvanced;
5132 def->set_default_value(new ConfigOptionFloat(22.5));
5133
5134 def = this->add("interlocking_beam_layer_count", coInt);
5135 def->label = L("Interlocking beam layers");
5136 def->tooltip = L("The height of the beams of the interlocking structure, measured in number of layers. Less layers is stronger, but more prone to defects.");
5137 def->min = 1;
5138 def->category = L("Advanced");
5139 def->mode = comAdvanced;
5140 def->set_default_value(new ConfigOptionInt(2));
5141
5142 def = this->add("interlocking_depth", coInt);
5143 def->label = L("Interlocking depth");
5144 def->tooltip = L("The distance from the boundary between filaments to generate interlocking structure, measured in cells. Too few cells will result in poor adhesion.");
5145 def->min = 1;
5146 def->category = L("Advanced");
5147 def->mode = comAdvanced;
5148 def->set_default_value(new ConfigOptionInt(2));
5149
5150 def = this->add("interlocking_boundary_avoidance", coInt);
5151 def->label = L("Interlocking boundary avoidance");
5152 def->tooltip = L("The distance from the outside of a model where interlocking structures will not be generated, measured in cells.");
5153 def->min = 0;
5154 def->category = L("Advanced");
5155 def->mode = comAdvanced;
5156 def->set_default_value(new ConfigOptionInt(2));
5157
5158 // ORCA: special flag for flow rate calibration
5159 def = this->add("calib_flowrate_topinfill_special_order", coBool);
5160 def->mode = comDevelop;
5161 def->set_default_value(new ConfigOptionBool(false));
5162
5163 def = this->add("ironing_type", coEnum);
5164 def->label = L("Ironing type");
5165 def->category = L("Quality");
5166 def->tooltip = L("Ironing uses a small flow to print at the same height of a surface to make flat surfaces smoother. This setting controls which layers are being ironed.");
5167 def->enum_keys_map = &ConfigOptionEnum<IroningType>::get_enum_values();
5168 def->enum_values.push_back("no ironing");
5169 def->enum_values.push_back("top");
5170 def->enum_values.push_back("topmost");
5171 def->enum_values.push_back("solid");
5172 def->enum_labels.push_back(L("No ironing"));
5173 def->enum_labels.push_back(L("All top surfaces"));
5174 def->enum_labels.push_back(L("Topmost surface only"));
5175 def->enum_labels.push_back(L("All solid layers"));
5176 def->mode = comAdvanced;
5177 def->set_default_value(new ConfigOptionEnum<IroningType>(IroningType::NoIroning));
5178
5179 def = this->add("ironing_pattern", coEnum);
5180 def->label = L("Ironing Pattern");
5181 def->tooltip = L("The pattern that will be used when ironing.");
5182 def->category = L("Quality");
5184 def->enum_values.push_back("rectilinear");
5185 def->enum_values.push_back("concentric");
5186 def->enum_labels.push_back(L("Rectilinear"));
5187 def->enum_labels.push_back(L("Concentric"));
5188 def->mode = comAdvanced;
5189 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipRectilinear));
5190
5191 def = this->add("ironing_flow", coPercent);
5192 def->label = L("Ironing flow");
5193 def->category = L("Quality");
5194 def->tooltip = L("This is the amount of material to be extruded during ironing. It is relative to the flow of normal layer height. Too high a value will result in overextrusion on the surface.");
5195 def->sidetext = "%";
5196 def->ratio_over = "layer_height";
5197 def->min = 0;
5198 def->max = 100;
5199 def->mode = comAdvanced;
5200 def->set_default_value(new ConfigOptionPercent(10));
5201
5202 def = this->add("ironing_spacing", coFloat);
5203 def->label = L("Ironing line spacing");
5204 def->category = L("Quality");
5205 def->tooltip = L("This is the distance between the lines used for ironing.");
5206 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5207 def->min = 0;
5208 def->max = 1;
5209 def->mode = comAdvanced;
5210 def->set_default_value(new ConfigOptionFloat(0.1));
5211
5212 def = this->add("ironing_inset", coFloat);
5213 def->label = L("Ironing inset");
5214 def->category = L("Quality");
5215 def->tooltip = L("The distance to keep from the edges. A value of 0 sets this to half of the nozzle diameter.");
5216 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5217 def->min = 0;
5218 def->max = 100;
5219 def->mode = comAdvanced;
5220 def->set_default_value(new ConfigOptionFloat(0));
5221
5222 def = this->add("ironing_speed", coFloat);
5223 def->label = L("Ironing speed");
5224 def->category = L("Quality");
5225 def->tooltip = L("This is the print speed for ironing lines.");
5226 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5227 def->min = 1;
5228 def->mode = comAdvanced;
5229 def->set_default_value(new ConfigOptionFloat(20));
5230
5231 def = this->add("ironing_angle", coFloat);
5232 def->label = L("Ironing angle offset");
5233 def->category = L("Quality");
5234 def->tooltip = L("The angle of ironing lines offset from the top surface.");
5235 def->sidetext = u8"°"; // degrees, don't need translation
5236 def->min = 0;
5237 def->max = 359;
5238 def->mode = comAdvanced;
5239 def->set_default_value(new ConfigOptionFloat(0));
5240
5241 def = this->add("ironing_angle_fixed", coBool);
5242 def->label = L("Fixed ironing angle");
5243 def->category = L("Quality");
5244 def->tooltip = L("Use a fixed absolute angle for ironing.");
5245 def->mode = comAdvanced;
5246 def->set_default_value(new ConfigOptionBool(false));
5247
5248 def = this->add("ironing_expansion", coFloat);
5249 def->label = L("Ironing expansion");
5250 def->category = L("Quality");
5251 def->tooltip = L("Expand or contract the ironing area.");
5252 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5253 def->min = -100;
5254 def->max = 100;
5255 def->mode = comExpert;
5256 def->set_default_value(new ConfigOptionFloat(0));
5257
5258 def = this->add("zaa_enabled", coBool);
5259 def->label = L("Z contouring enabled");
5260 def->category = L("Quality");
5261 def->tooltip = L("Enable Z-layer contouring (aka Z-layer anti-aliasing).");
5262 def->mode = comExpert;
5263 def->set_default_value(new ConfigOptionBool(false));
5264
5265 def = this->add("zaa_minimize_perimeter_height", coFloat);
5266 def->label = L("Minimize wall height angle");
5267 def->category = L("Quality");
5268 def->tooltip = L("Reduce the height of top-surface perimeters to match the model edge height.\n"
5269 "Affects perimeters with a slope greater than this angle (degrees).\n"
5270 "A reasonable value is 35. Set to 0 to disable.");
5271 def->sidetext = u8"°"; // degrees, don't need translation
5272 def->min = 0;
5273 def->max = 90;
5274 def->mode = comExpert;
5275 def->set_default_value(new ConfigOptionFloat(35));
5276
5277 def = this->add("zaa_dont_alternate_fill_direction", coBool);
5278 def->label = L("Don't alternate fill direction");
5279 def->category = L("Quality");
5280 def->tooltip = L("Disable alternating fill direction when using Z contouring.");
5281 def->mode = comExpert;
5282 def->set_default_value(new ConfigOptionBool(false));
5283
5284 def = this->add("zaa_min_z", coFloat);
5285 def->label = L("Minimum Z height");
5286 def->category = L("Quality");
5287 def->tooltip = L("Minimum Z-layer height.\n"
5288 "Also controls the slicing plane.");
5289 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5290 def->min = 0;
5291 def->max = 100;
5292 def->mode = comExpert;
5293 def->set_default_value(new ConfigOptionFloat(0.05));
5294
5295 def = this->add("layer_change_gcode", coString);
5296 def->label = L("Layer change G-code");
5297 def->tooltip = L("This G-code is inserted at every layer change after the Z lift.");
5298 def->multiline = true;
5299 def->full_width = true;
5300 def->height = 5;
5301 def->mode = comAdvanced;
5302 def->set_default_value(new ConfigOptionString());
5303
5304 def = this->add("time_lapse_gcode",coString);
5305 def->label = L("Timelapse G-code");
5306 def->multiline = true;
5307 def->full_width = true;
5308 def->height =5;
5309 def->mode = comAdvanced;
5310 def->set_default_value(new ConfigOptionString());
5311
5312 def = this->add("wrapping_detection_gcode", coString);
5313 def->label = L("Clumping detection G-code");
5314 def->multiline = true;
5315 def->full_width = true;
5316 def->height = 5;
5317 def->mode = comAdvanced;
5318 def->set_default_value(new ConfigOptionString(""));
5319
5320 def = this->add("emit_machine_limits_to_gcode", coBool);
5321 def->label = L("Emit limits to G-code");
5322 def->category = L("Machine limits");
5323 def->tooltip = L("If enabled, the machine limits will be emitted to G-code file.\nThis option will be ignored if the G-code flavor is "
5324 "set to Klipper.");
5325 def->mode = comAdvanced;
5326 def->set_default_value(new ConfigOptionBool(true));
5327
5328 def = this->add("machine_pause_gcode", coString);
5329 def->label = L("Pause G-code");
5330 def->tooltip = L("This G-code will be used as a code for the pause print. Users can insert pause G-code in the G-code viewer.");
5331 def->multiline = true;
5332 def->full_width = true;
5333 def->height = 12;
5334 def->mode = comAdvanced;
5335 def->set_default_value(new ConfigOptionString());
5336
5337 def = this->add("template_custom_gcode", coString);
5338 def->label = L("Custom G-code");
5339 def->tooltip = L("This G-code will be used as a custom code.");
5340 def->multiline = true;
5341 def->full_width = true;
5342 def->height = 12;
5343 def->mode = comAdvanced;
5344 def->set_default_value(new ConfigOptionString());
5345
5346 def = this->add("small_area_infill_flow_compensation", coBool);
5347 def->label = L("Small area flow compensation (beta)");
5348 def->category = L("Quality");
5349 def->tooltip = L("Enable flow compensation for small infill areas.");
5350 def->mode = comAdvanced;
5351 def->set_default_value(new ConfigOptionBool(false));
5352
5353 def = this->add("small_area_infill_flow_compensation_model", coStrings);
5354 def->label = L("Flow Compensation Model");
5355 def->tooltip = L(
5356 "Flow Compensation Model, used to adjust the flow for small infill "
5357 "areas. The model is expressed as a comma separated pair of values for "
5358 "extrusion length and flow correction factor. Each pair is on a "
5359 "separate line, followed by a semicolon, in the following format: \"1.234, 5.678;\"");
5360 def->mode = comAdvanced;
5361 def->gui_flags = "serialized";
5362 def->multiline = true;
5363 def->full_width = true;
5364 def->height = 15;
5365 def->set_default_value(new ConfigOptionStrings{"0,0", "\n0.2,0.4444", "\n0.4,0.6145", "\n0.6,0.7059", "\n0.8,0.7619", "\n1.5,0.8571", "\n2,0.8889", "\n3,0.9231", "\n5,0.9520", "\n10,1"});
5366
5367 def = this->add("has_scarf_joint_seam", coBool);
5368 def->mode = comAdvanced;
5369 def->set_default_value(new ConfigOptionBool(false));
5370
5371 {
5372 struct AxisDefault {
5373 std::string name;
5374 std::vector<double> max_feedrate;
5375 std::vector<double> max_acceleration;
5376 std::vector<double> max_jerk;
5377 };
5378 std::vector<AxisDefault> axes {
5379 // name, max_feedrate, max_acceleration, max_jerk
5380 { "x", { 500., 200. }, { 1000., 1000. }, { 10. , 10. } },
5381 { "y", { 500., 200. }, { 1000., 1000. }, { 10. , 10. } },
5382 { "z", { 12., 12. }, { 500., 200. }, { 0.2, 0.4 } },
5383 { "e", { 120., 120. }, { 5000., 5000. }, { 2.5, 2.5 } }
5384 };
5385 for (const AxisDefault &axis : axes) {
5386 std::string axis_upper = boost::to_upper_copy<std::string>(axis.name);
5387 // Add the machine feedrate limits for XYZE axes. (M203)
5388 def = this->add("machine_max_speed_" + axis.name, coFloats);
5389 def->full_label = (boost::format("Maximum speed %1%") % axis_upper).str();
5390 (void)L("Maximum speed X");
5391 (void)L("Maximum speed Y");
5392 (void)L("Maximum speed Z");
5393 (void)L("Maximum speed E");
5394 def->category = L("Machine limits");
5395 def->readonly = false;
5396 def->tooltip = (boost::format("Maximum speed of the %1% axis") % axis_upper).str();
5397 (void)L("Maximum speed of the X axis");
5398 (void)L("Maximum speed of the Y axis");
5399 (void)L("Maximum speed of the Z axis");
5400 (void)L("Maximum speed of the E axis");
5401 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5402 def->min = 0;
5403 def->mode = comSimple;
5404 def->set_default_value(new ConfigOptionFloats(axis.max_feedrate));
5405 // Add the machine acceleration limits for XYZE axes (M201)
5406 def = this->add("machine_max_acceleration_" + axis.name, coFloats);
5407 def->full_label = (boost::format("Maximum acceleration %1%") % axis_upper).str();
5408 (void)L("Maximum acceleration X");
5409 (void)L("Maximum acceleration Y");
5410 (void)L("Maximum acceleration Z");
5411 (void)L("Maximum acceleration E");
5412 def->category = L("Machine limits");
5413 def->readonly = false;
5414 def->tooltip = (boost::format("Maximum acceleration of the %1% axis") % axis_upper).str();
5415 (void)L("Maximum acceleration of the X axis");
5416 (void)L("Maximum acceleration of the Y axis");
5417 (void)L("Maximum acceleration of the Z axis");
5418 (void)L("Maximum acceleration of the E axis");
5419 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
5420 def->min = 0;
5421 def->mode = comSimple;
5422 def->set_default_value(new ConfigOptionFloats(axis.max_acceleration));
5423 // Add the machine jerk limits for XYZE axes (M205)
5424 def = this->add("machine_max_jerk_" + axis.name, coFloats);
5425 def->full_label = (boost::format("Maximum jerk %1%") % axis_upper).str();
5426 (void)L("Maximum jerk X");
5427 (void)L("Maximum jerk Y");
5428 (void)L("Maximum jerk Z");
5429 (void)L("Maximum jerk E");
5430 def->category = L("Machine limits");
5431 def->readonly = false;
5432 def->tooltip = (boost::format("Maximum jerk of the %1% axis") % axis_upper).str();
5433 (void)L("Maximum jerk of the X axis");
5434 (void)L("Maximum jerk of the Y axis");
5435 (void)L("Maximum jerk of the Z axis");
5436 (void)L("Maximum jerk of the E axis");
5437 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5438 def->min = 0;
5439 def->mode = comSimple;
5440 def->set_default_value(new ConfigOptionFloats(axis.max_jerk));
5441 }
5442 }
5443 // M205 J... [mm] machine junction deviation limits
5444 def = this->add("machine_max_junction_deviation", coFloats);
5445 def->full_label = L("Maximum Junction Deviation");
5446 def->category = L("Machine limits");
5447 def->tooltip = L("Maximum junction deviation (M205 J, only apply if JD > 0 for Marlin Firmware\nIf your Marlin 2 printer uses Classic Jerk set this value to 0.)");
5448 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5449 def->min = 0.f;
5450 def->max = 0.3f;
5451 def->mode = comAdvanced;
5452 def->set_default_value(new ConfigOptionFloats{ 0.01f });
5453
5454 // M205 S... [mm/sec]
5455 def = this->add("machine_min_extruding_rate", coFloats);
5456 def->full_label = L("Minimum speed for extruding");
5457 def->category = L("Machine limits");
5458 def->tooltip = L("Minimum speed for extruding (M205 S)");
5459 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5460 def->min = 0;
5461 def->mode = comDevelop;
5462 def->set_default_value(new ConfigOptionFloats{ 0., 0. });
5463
5464 // M205 T... [mm/sec]
5465 def = this->add("machine_min_travel_rate", coFloats);
5466 def->full_label = L("Minimum travel speed");
5467 def->category = L("Machine limits");
5468 def->tooltip = L("Minimum travel speed (M205 T)");
5469 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5470 def->min = 0;
5471 def->mode = comDevelop;
5472 def->set_default_value(new ConfigOptionFloats{ 0., 0. });
5473
5474 // Bedslinger mass/force limits.
5475 // Consumed by GCode::mass_load_limited_machine_acceleration (curr_y_acceleration_limit)
5476 // and the printed-mass check. Default 0 keeps them inactive for existing printers.
5477 def = this->add("machine_max_force_Y", coFloat);
5478 def->full_label = L("Maximum force of the Y axis");
5479 def->category = L("Machine limits");
5480 def->readonly = false;
5481 def->tooltip = L("The allowed maximum output force of Y axis");
5482 def->sidetext = L_CONTEXT("N", "Newton"); // Newtons, CIS languages need translation
5483 def->min = 0;
5484 def->mode = comDevelop;
5485 def->set_default_value(new ConfigOptionFloat(0));
5486
5487 def = this->add("machine_bed_mass_Y", coFloat);
5488 def->full_label = L("Bed mass of the Y axis");
5489 def->category = L("Machine limits");
5490 def->readonly = false;
5491 def->tooltip = L("The machine bed mass load of Y axis");
5492 def->sidetext = L_CONTEXT("g", "gram"); // grams, CIS languages need translation
5493 def->min = 0;
5494 def->mode = comDevelop;
5495 def->set_default_value(new ConfigOptionFloat(0));
5496
5497 def = this->add("machine_max_printed_mass", coFloat);
5498 def->full_label = L("The allowed max printed mass");
5499 def->category = L("Machine limits");
5500 def->readonly = false;
5501 def->tooltip = L("The allowed max printed mass on a plate");
5502 def->sidetext = L_CONTEXT("g", "gram"); // grams, CIS languages need translation
5503 def->min = 0;
5504 def->mode = comDevelop;
5505 def->set_default_value(new ConfigOptionFloat(0));
5506
5507 // M204 P... [mm/sec^2]
5508 def = this->add("machine_max_acceleration_extruding", coFloats);
5509 def->full_label = L("Maximum acceleration for extruding");
5510 def->category = L("Machine limits");
5511 def->tooltip = L("Maximum acceleration for extruding (M204 P)");
5512 // "Marlin (legacy) firmware flavor will use this also "
5513 // "as travel acceleration (M204 T).");
5514 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
5515 def->min = 0;
5516 def->readonly = false;
5517 def->mode = comSimple;
5518 def->set_default_value(new ConfigOptionFloats{ 1500., 1250. });
5519
5520
5521 // M204 R... [mm/sec^2]
5522 def = this->add("machine_max_acceleration_retracting", coFloats);
5523 def->full_label = L("Maximum acceleration for retracting");
5524 def->category = L("Machine limits");
5525 def->tooltip = L("Maximum acceleration for retracting (M204 R)");
5526 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
5527 def->min = 0;
5528 def->readonly = false;
5529 def->mode = comSimple;
5530 def->set_default_value(new ConfigOptionFloats{ 1500., 1250. });
5531
5532 // M204 T... [mm/sec^2]
5533 def = this->add("machine_max_acceleration_travel", coFloats);
5534 def->full_label = L("Maximum acceleration for travel");
5535 def->category = L("Machine limits");
5536 def->tooltip = L("Maximum acceleration for travel (M204 T), it only applies to Marlin 2.");
5537 def->sidetext = L(u8"mm/s²"); // millimeters per second per second, CIS languages need translation
5538 def->min = 0;
5539 def->readonly = false;
5540 def->mode = comAdvanced;
5541 def->set_default_value(new ConfigOptionFloats{ 0., 0. });
5542
5543 // resonance avoidance ported over from qidi slicer
5544 def = this->add("resonance_avoidance", coBool);
5545 def->label = L("Resonance avoidance");
5546 def->tooltip = L("By reducing the speed of the outer wall to avoid the resonance zone of the printer, ringing on the surface of the "
5547 "model are avoided.\n"
5548 "Please turn this option off when testing ringing.");
5549 def->mode = comAdvanced;
5550 def->set_default_value(new ConfigOptionBool(false));
5551
5552 def = this->add("min_resonance_avoidance_speed", coFloat);
5553 def->label = L("Min");
5554 def->tooltip = L("Minimum speed of resonance avoidance.");
5555 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5556 def->min = 0;
5557 def->mode = comAdvanced;
5558 def->set_default_value(new ConfigOptionFloat(70));
5559
5560 def = this->add("max_resonance_avoidance_speed", coFloat);
5561 def->label = L("Max");
5562 def->tooltip = L("Maximum speed of resonance avoidance.");
5563 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5564 def->min = 0;
5565 def->mode = comAdvanced;
5566 def->set_default_value(new ConfigOptionFloat(120));
5567
5568 // Orca: Input Shaping support
5569 def = this->add("input_shaping_emit", coBool);
5570 def->label = L("Emit input shaping");
5571 def->tooltip = L("Override firmware input shaping settings.\nIf disabled, firmware settings are used.");
5572 def->mode = comExpert;
5573 def->set_default_value(new ConfigOptionBool(false));
5574
5575 def = this->add("input_shaping_type", coEnum);
5576 def->label = L("Input shaper type");
5577 def->tooltip = L("Choose the input shaper algorithm.\nDefault uses the firmware default settings.\nDisable turns off input shaping in the firmware.");
5579 def->enum_values = {"Default", "MZV", "ZV", "ZVD", "ZVDD", "ZVDDD", "EI", "EI2", "2HUMP_EI", "EI3", "3HUMP_EI", "DAA", "Disable"};
5580 def->enum_labels = {L("Default"), L("MZV"), L("ZV"), L("ZVD"), L("ZVDD"), L("ZVDDD"), L("EI"), L("EI2"), L("2HUMP_EI"), L("EI3"), L("3HUMP_EI"), L("DAA"), L("Disable")};
5581 def->mode = comExpert;
5582 def->set_default_value(new ConfigOptionEnum<InputShaperType>(InputShaperType::Default));
5583
5584 def = this->add("input_shaping_freq_x", coFloat);
5585 def->label = L_CONTEXT("X", "Axis");
5586 def->tooltip = L("Resonant frequency for the X axis input shaper.\nZero will use the firmware frequency.\nTo disable input shaping, use the Disable type.\nRRF: X and Y values are equal.");
5587 def->sidetext = L("Hz"); // Hertz, CIS languages need translation
5588 def->min = 0;
5589 def->max = 1000;
5590 def->mode = comExpert;
5591 def->set_default_value(new ConfigOptionFloat(0));
5592
5593 def = this->add("input_shaping_freq_y", coFloat);
5594 def->label = L_CONTEXT("Y", "Axis");
5595 def->tooltip = L("Resonant frequency for the Y axis input shaper.\nZero will use the firmware frequency.\nTo disable input shaping, use the Disable type.");
5596 def->sidetext = L("Hz"); // Hertz, CIS languages need translation
5597 def->min = 0;
5598 def->max = 1000;
5599 def->mode = comExpert;
5600 def->set_default_value(new ConfigOptionFloat(0));
5601
5602 def = this->add("input_shaping_damp_x", coFloat);
5603 def->label = L_CONTEXT("X", "Axis");
5604 def->tooltip = L("Damping ratio for the X axis input shaper.\nZero will use the firmware damping ratio.\nTo disable input shaping, use the Disable type.\nRRF: X and Y values are equal.");
5605 def->min = 0;
5606 def->max = 1;
5607 def->mode = comExpert;
5608 def->set_default_value(new ConfigOptionFloat(0.1));
5609
5610 def = this->add("input_shaping_damp_y", coFloat);
5611 def->label = L_CONTEXT("Y", "Axis");
5612 def->tooltip = L("Damping ratio for the Y axis input shaper.\nZero will use the firmware damping ratio.\nTo disable input shaping, use the Disable type.");
5613 def->min = 0;
5614 def->max = 1;
5615 def->mode = comExpert;
5616 def->set_default_value(new ConfigOptionFloat(0.1));
5617
5618 def = this->add("fan_max_speed", coFloats);
5619 def->label = L("Fan speed");
5620 def->tooltip = L("The part cooling fan speed may be increased when auto cooling is enabled. This is the maximum speed for the part cooling fan.");
5621 def->sidetext = "%";
5622 def->min = 0;
5623 def->max = 100;
5624 def->mode = comSimple;
5625 def->set_default_value(new ConfigOptionFloats { 100 });
5626
5627 def = this->add("max_layer_height", coFloats);
5628 def->label = L("Max");
5629 def->tooltip = L("The highest printable layer height for the extruder. "
5630 "Used to limit the maximum layer height when enable adaptive layer height.");
5631 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5632 def->min = 0;
5633 def->mode = comAdvanced;
5634 def->set_default_value(new ConfigOptionFloats { 0. });
5635
5636 def = this->add("max_volumetric_extrusion_rate_slope", coFloat);
5637 def->label = L("Extrusion rate smoothing");
5638 def->tooltip = L("This parameter smooths out sudden extrusion rate changes that happen when "
5639 "the printer transitions from printing a high flow (high speed/larger width) "
5640 "extrusion to a lower flow (lower speed/smaller width) extrusion and vice versa.\n\n"
5641 "It defines the maximum rate by which the extruded volumetric flow in mm³/s can change over time. "
5642 "Higher values mean higher extrusion rate changes are allowed, resulting in faster speed transitions.\n\n"
5643 "A value of 0 disables the feature.\n\n"
5644 "For a high speed, high flow direct drive printer (like the Bambu lab or Voron) this value is usually not needed. "
5645 "However it can provide some marginal benefit in certain cases where feature speeds vary greatly. For example, "
5646 "when there are aggressive slowdowns due to overhangs. In these cases a high value of around 300-350 mm³/s² is "
5647 "recommended as this allows for just enough smoothing to assist pressure advance achieve a smoother flow transition.\n\n"
5648 "For slower printers without pressure advance, the value should be set much lower. "
5649 "A value of 10-15 mm³/s² is a good starting point for direct drive extruders and 5-10 mm³/s² for Bowden style.\n\n"
5650 "This feature is known as Pressure Equalizer in Prusa slicer.\n\n"
5651 "Note: this parameter disables arc fitting.");
5652 def->sidetext = L(u8"mm³/s²"); // cubic millimeters per second per second, CIS languages need translation
5653 def->min = 0;
5654 def->mode = comAdvanced;
5655 def->set_default_value(new ConfigOptionFloat(0));
5656
5657 def = this->add("max_volumetric_extrusion_rate_slope_segment_length", coFloat);
5658 def->label = L("Smoothing segment length");
5659 def->tooltip = L("A lower value results in smoother extrusion rate transitions. "
5660 "However, this results in a significantly larger G-code file and more instructions for the printer to process.\n\n"
5661 "Default value of 3 works well for most cases. If your printer is stuttering, increase this value to reduce the number of adjustments made.\n\n"
5662 "Allowed values: 0.5-5");
5663 def->min = 0.5;
5664 def->max = 5;
5665 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5666 def->mode = comAdvanced;
5667 def->set_default_value(new ConfigOptionFloat(3.0));
5668
5669 def = this->add("extrusion_rate_smoothing_external_perimeter_only", coBool);
5670 def->label = L("Apply only on external features");
5671 def->tooltip = L("Applies extrusion rate smoothing only on external perimeters and overhangs. This can help reduce artefacts due to sharp speed transitions on externally visible "
5672 "overhangs without impacting the print speed of features that will not be visible to the user.");
5673 def->mode = comAdvanced;
5674 def->set_default_value(new ConfigOptionBool(false));
5675
5676
5677 def = this->add("fan_min_speed", coFloats);
5678 def->label = L("Fan speed");
5679 def->tooltip = L("Minimum speed for part cooling fan.");
5680 def->sidetext = "%";
5681 def->min = 0;
5682 def->max = 100;
5683 def->mode = comSimple;
5684 def->set_default_value(new ConfigOptionFloats { 20 });
5685
5686 def = this->add("additional_cooling_fan_speed", coInts);
5687 def->label = L("Fan speed");
5688 def->tooltip = L("Speed of auxiliary part cooling fan. Auxiliary fan will run at this speed during printing except the first several layers "
5689 "which is defined by no cooling layers.\nPlease enable auxiliary_fan in printer settings to use this feature. G-code command: M106 P2 S(0-255)");
5690 def->sidetext = "%";
5691 def->min = 0;
5692 def->max = 100;
5693 def->mode = comSimple;
5694 def->set_default_value(new ConfigOptionInts { 0 });
5695
5696 def = this->add("close_additional_fan_first_x_layers", coInts);
5697 def->label = L("For the first");
5698 def->tooltip = L("Set special auxiliary cooling fan for the first certain layers.");
5699 def->sidetext = L("layers");
5700 def->min = 0;
5701 def->max = 1000;
5702 def->mode = comSimple;
5703 def->set_default_value(new ConfigOptionInts { 1 });
5704
5705 def = this->add("additional_fan_full_speed_layer", coInts);
5706 def->label = L("Full fan speed at layer");
5707 def->tooltip = L("Auxiliary fan speed will be ramped up linearly from layer \"For the first\" to maximum at layer \"Full fan speed at layer\".\n"
5708 "\"Full fan speed at layer\" will be ignored if lower than \"For the first\", in which case the fan will run at maximum allowed speed at layer \"For the first\" + 1.");
5709 def->min = 0;
5710 def->max = 1000;
5711 def->mode = comSimple;
5712 def->set_default_value(new ConfigOptionInts { 0 });
5713
5714 def = this->add("first_x_layer_fan_speed", coFloats);
5715 def->label = L("Fan speed");
5716 def->tooltip = L("Special auxiliary cooling fan speed, effective only for the first x layers.");
5717 def->sidetext = "%";
5718 def->min = 0;
5719 def->max = 100;
5720 def->mode = comSimple;
5721 def->set_default_value(new ConfigOptionFloats { 0 });
5722
5723 def = this->add("min_layer_height", coFloats);
5724 def->label = L("Min");
5725 def->tooltip = L("The lowest printable layer height for the extruder. "
5726 "Used to limit the minimum layer height when enable adaptive layer height.");
5727 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5728 def->min = 0;
5729 def->mode = comAdvanced;
5730 def->set_default_value(new ConfigOptionFloats { 0.07 });
5731
5732 def = this->add("slow_down_min_speed", coFloats);
5733 def->label = L("Min print speed");
5734 def->tooltip = L("The minimum print speed to which the printer slows down to maintain the minimum layer time defined above "
5735 "when the slowdown for better layer cooling is enabled.");
5736 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5737 def->min = 0;
5738 def->mode = comAdvanced;
5739 def->set_default_value(new ConfigOptionFloats { 10. });
5740
5741 def = this->add("nozzle_diameter", coFloats);
5742 def->label = L("Nozzle diameter");
5743 def->tooltip = L("The diameter of nozzle.");
5744 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5745 def->mode = comAdvanced;
5746 def->max = 100;
5747 def->set_default_value(new ConfigOptionFloats { 0.4 });
5748
5749 def = this->add("notes", coString);
5750 def->label = L("Configuration notes");
5751 def->tooltip = L("You can put here your personal notes. This text will be added to the G-code "
5752 "header comments.");
5753 def->multiline = true;
5754 def->full_width = true;
5755 def->height = 13;
5756 def->mode = comAdvanced;
5757 def->set_default_value(new ConfigOptionString());
5758
5759 def = this->add("host_type", coEnum);
5760 def->label = L("Host Type");
5761 def->tooltip = L("Orca Slicer can upload G-code files to a printer host. This field must contain "
5762 "the kind of the host.");
5764 def->enum_values.push_back("prusalink");
5765 def->enum_values.push_back("prusaconnect");
5766 def->enum_values.push_back("octoprint");
5767 def->enum_values.push_back("duet");
5768 def->enum_values.push_back("ultimaker");
5769 def->enum_values.push_back("flashair");
5770 def->enum_values.push_back("astrobox");
5771 def->enum_values.push_back("repetier");
5772 def->enum_values.push_back("mks");
5773 def->enum_values.push_back("esp3d");
5774 def->enum_values.push_back("crealityprint");
5775 def->enum_values.push_back("obico");
5776 def->enum_values.push_back("flashforge");
5777 def->enum_values.push_back("simplyprint");
5778 def->enum_values.push_back("elegoolink");
5779 def->enum_values.push_back("3dprinteros");
5780 def->enum_values.push_back("moonraker");
5781 def->enum_labels.push_back("PrusaLink");
5782 def->enum_labels.push_back("PrusaConnect");
5783 def->enum_labels.push_back("Octo/Klipper");
5784 def->enum_labels.push_back("Duet");
5785 def->enum_labels.push_back("UltiMaker");
5786 def->enum_labels.push_back("FlashAir");
5787 def->enum_labels.push_back("AstroBox");
5788 def->enum_labels.push_back("Repetier");
5789 def->enum_labels.push_back("MKS");
5790 def->enum_labels.push_back("ESP3D");
5791 def->enum_labels.push_back("CrealityPrint");
5792 def->enum_labels.push_back("Obico");
5793 def->enum_labels.push_back("Flashforge");
5794 def->enum_labels.push_back("SimplyPrint");
5795 def->enum_labels.push_back("Elegoo Link");
5796 def->enum_labels.push_back("3DPrinterOS");
5797 def->enum_labels.push_back("Moonraker (Klipper)");
5798 def->mode = comAdvanced;
5799 def->cli = ConfigOptionDef::nocli;
5800 def->set_default_value(new ConfigOptionEnum<PrintHostType>(htOctoPrint));
5801
5802 def = this->add("nozzle_volume", coFloats);
5803 def->label = L("Nozzle volume");
5804 def->tooltip = L("Volume of nozzle between the filament cutter and the end of the nozzle");
5805 def->sidetext = L(u8"mm³"); // cubic millimeters, CIS languages need translation
5806 def->mode = comAdvanced;
5807 def->readonly = false;
5808 def->nullable = true;
5809 def->set_default_value(new ConfigOptionFloatsNullable { 0.0 });
5810
5811 def = this->add("cooling_tube_retraction", coFloat);
5812 def->label = L("Cooling tube position");
5813 def->tooltip = L("Distance of the center-point of the cooling tube from the extruder tip.");
5814 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5815 def->min = 0;
5816 def->mode = comAdvanced;
5817 def->set_default_value(new ConfigOptionFloat(91.5));
5818
5819 def = this->add("cooling_tube_length", coFloat);
5820 def->label = L("Cooling tube length");
5821 def->tooltip = L("Length of the cooling tube to limit space for cooling moves inside it.");
5822 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5823 def->min = 0;
5824 def->mode = comAdvanced;
5825 def->set_default_value(new ConfigOptionFloat(5.));
5826
5827 def = this->add("high_current_on_filament_swap", coBool);
5828 def->label = L("High extruder current on filament swap");
5829 def->tooltip = L("It may be beneficial to increase the extruder motor current during the filament exchange"
5830 " sequence to allow for rapid ramming feed rates and to overcome resistance when loading"
5831 " a filament with an ugly shaped tip.");
5832 def->mode = comAdvanced;
5833 def->set_default_value(new ConfigOptionBool(0));
5834
5835 def = this->add("parking_pos_retraction", coFloat);
5836 def->label = L("Filament parking position");
5837 def->tooltip = L("Distance of the extruder tip from the position where the filament is parked "
5838 "when unloaded. This should match the value in printer firmware.");
5839 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5840 def->min = 0;
5841 def->mode = comAdvanced;
5842 def->set_default_value(new ConfigOptionFloat(92.));
5843
5844 def = this->add("extra_loading_move", coFloat);
5845 def->label = L("Extra loading distance");
5846 def->tooltip = L("When set to zero, the distance the filament is moved from parking position during load "
5847 "is exactly the same as it was moved back during unload. When positive, it is loaded further, "
5848 "if negative, the loading move is shorter than unloading.");
5849 def->sidetext = L("mm"); // millimeters, CIS languages need translation
5850 def->mode = comAdvanced;
5851 def->set_default_value(new ConfigOptionFloat(-2.));
5852
5853 def = this->add("start_end_points", coPoints);
5854 def->label = L("Start end points");
5855 def->tooltip = L("The start and end points which are from the cutter area to the excess chute.");
5856 def->mode = comDevelop;
5857 def->readonly = true;
5858 // start and end point is from the change_filament_gcode
5859 def->set_default_value(new ConfigOptionPoints{Vec2d(30, -3), Vec2d(54, 245)});
5860
5861 def = this->add("reduce_infill_retraction", coBool);
5862 def->label = L("Reduce infill retraction");
5863 def->tooltip = L("Don\'t retract when the travel is entirely within an infill area. That means the oozing can\'t been seen. This can reduce times of retraction for complex model and save printing time, but make slicing and G-code generating slower. Note that Z-hop is also not performed in areas where retraction is skipped.");
5864 def->mode = comAdvanced;
5865 def->set_default_value(new ConfigOptionBool(false));
5866
5867 def = this->add("ooze_prevention", coBool);
5868 def->label = L("Enable");
5869 def->tooltip = L("This option will drop the temperature of the inactive extruders to prevent oozing.");
5870 def->mode = comAdvanced;
5871 def->set_default_value(new ConfigOptionBool(false));
5872
5873 def = this->add("filename_format", coString);
5874 def->label = L("Filename format");
5875 def->tooltip = L("Users can decide project file names when exporting.");
5876 def->full_width = true;
5877 def->mode = comAdvanced;
5878 def->set_default_value(new ConfigOptionString("{input_filename_base}_{filament_type[initial_tool]}_{print_time}.gcode"));
5879
5880 def = this->add("make_overhang_printable", coBool);
5881 def->label = L("Make overhangs printable");
5882 def->category = L("Quality");
5883 def->tooltip = L("Modify the geometry to print overhangs without support material.");
5884 def->mode = comAdvanced;
5885 def->set_default_value(new ConfigOptionBool(false));
5886
5887 def = this->add("make_overhang_printable_angle", coFloat);
5888 def->label = L("Make overhangs printable - Maximum angle");
5889 def->category = L("Quality");
5890 def->tooltip = L("Maximum angle of overhangs to allow after making more steep overhangs printable."
5891 "90° will not change the model at all and allow any overhang, while 0 will "
5892 "replace all overhangs with conical material.");
5893 def->sidetext = u8"°"; // degrees, don't need translation
5894 def->mode = comAdvanced;
5895 def->min = 0.;
5896 def->max = 90.;
5897 def->set_default_value(new ConfigOptionFloat(55.));
5898
5899 def = this->add("make_overhang_printable_hole_size", coFloat);
5900 def->label = L("Make overhangs printable - Hole area");
5901 def->category = L("Quality");
5902 def->tooltip = L("Maximum area of a hole in the base of the model before it's filled by conical material. "
5903 "A value of 0 will fill all the holes in the model base.");
5904 def->sidetext = L(u8"mm²"); // square millimeters, CIS languages need translation
5905 def->mode = comAdvanced;
5906 def->min = 0.;
5907 def->set_default_value(new ConfigOptionFloat(0.));
5908
5909 def = this->add("detect_overhang_wall", coBool);
5910 def->label = L("Detect overhang walls");
5911 def->category = L("Quality");
5912 // xgettext:no-c-format, no-boost-format
5913 def->tooltip = L("This detects the overhang percentage relative to line width and uses a different speed to print. For 100% overhang, bridging speed is used.");
5914 def->mode = comAdvanced;
5915 def->set_default_value(new ConfigOptionBool(true));
5916
5917 def = this->add("unsupported_wall_last", coBool);
5918 def->label = L("Print unsupported walls last");
5919 def->category = L("Quality");
5920 def->tooltip = L("Wall loops that lie entirely in mid air are printed once something can hold them:\n"
5921 "they are extruded after the other walls of their island, innermost first, whatever the wall order is.\n"
5922 "A loop that only the bridges of this layer can anchor waits until those bridges are printed, while a loop running "
5923 "alongside a supported wall keeps its place before the infill, which needs it as an anchor.");
5924 def->mode = comAdvanced;
5925 def->set_default_value(new ConfigOptionBool(false));
5926
5927 def = this->add("outer_wall_filament_id", coInt);
5929 def->label = L("Outer walls");
5930 def->category = L("Extruders");
5931 def->tooltip = L("Filament to print outer walls.\n\"Default\" uses the active object/part filament.");
5932 def->min = 0;
5933 def->mode = comAdvanced;
5934 def->set_default_value(new ConfigOptionInt(0));
5935
5936 def = this->add("inner_wall_filament_id", coInt);
5938 def->label = L("Inner walls");
5939 def->category = L("Extruders");
5940 def->tooltip = L("Filament to print inner walls.\n\"Default\" uses the active object/part filament.");
5941 def->min = 0;
5942 def->mode = comAdvanced;
5943 def->set_default_value(new ConfigOptionInt(0));
5944
5945 def = this->add("inner_wall_line_width", coFloatOrPercent);
5946 def->label = L("Inner wall");
5947 def->category = L("Quality");
5948 def->tooltip = L("Line width of inner wall. If expressed as a %, it will be computed over the nozzle diameter.");
5949 def->sidetext = L("mm or %");
5950 def->ratio_over = "nozzle_diameter";
5951 def->min = 0;
5952 def->max = 1000;
5953 def->max_literal = 10;
5954 def->mode = comAdvanced;
5955 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
5956
5957 def = this->add("inner_wall_speed", coFloats);
5958 def->label = L("Inner wall");
5959 def->category = L("Speed");
5960 def->tooltip = L("This is the speed for inner walls.");
5961 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
5962 def->aliases = { "perimeter_feed_rate" };
5963 def->min = 1;
5964 def->mode = comAdvanced;
5965 def->nullable = true;
5966 def->set_default_value(new ConfigOptionFloatsNullable{60});
5967
5968 def = this->add("wall_loops", coInt);
5969 def->label = L("Wall loops");
5970 def->category = L("Strength");
5971 def->tooltip = L("This is the number of walls per layer.");
5972 def->min = 0;
5973 def->max = 1000;
5974 def->set_default_value(new ConfigOptionInt(2));
5975
5976 def = this->add("alternate_extra_wall", coBool);
5977 def->label = L("Alternate extra wall");
5978 def->category = L("Strength");
5979 def->tooltip = L("This setting adds an extra wall to every other layer. This way the infill gets wedged vertically between the walls, resulting in stronger prints.\n\n"
5980 "When this option is enabled, the ensure vertical shell thickness option needs to be disabled.\n\n"
5981 "Using lightning infill together with this option is not recommended as there is limited infill to anchor the extra perimeters to.");
5982 def->mode = comAdvanced;
5983 def->set_default_value(new ConfigOptionBool(false));
5984
5985 def = this->add("post_process", coStrings);
5986 def->label = L("Post-processing Scripts");
5987 def->tooltip = L("If you want to process the output G-code through custom scripts, "
5988 "just list their absolute paths here. Separate multiple scripts with a semicolon. "
5989 "Scripts will be passed the absolute path to the G-code file as the first argument, "
5990 "and they can access the Orca Slicer config settings by reading environment variables.");
5991 def->gui_flags = "serialized";
5992 def->multiline = true;
5993 def->full_width = true;
5994 def->height = 6;
5995 def->mode = comAdvanced;
5996 def->set_default_value(new ConfigOptionStrings());
5997
5998 def = this->add("process_change_extrusion_role_gcode", coString);
5999 def->label = L("Change extrusion role G-code (process)");
6000 def->tooltip = L("This G-code is inserted when the extrusion role is changed. It runs after the machine and filament extrusion role G-code.");
6001 def->multiline = true;
6002 def->full_width = true;
6003 def->height = 5;
6004 def->mode = comAdvanced;
6005 def->set_default_value(new ConfigOptionString());
6006
6007 def = this->add("plugins", coStrings);
6008 def->label = L("Plugins Used");
6009 def->tooltip = L("Plugin capabilities referenced by this preset, stored as name;uuid;capability.");
6010 def->mode = comDevelop;
6011 def->set_default_value(new ConfigOptionStrings());
6012
6013 def = this->add("slicing_pipeline_plugin", coStrings);
6014 def->label = L("Slicing Pipeline Plugin");
6015 def->tooltip = L("Python plugins invoked at each slicing pipeline step to read and modify intermediate slicing data, "
6016 "including a final G-code post-processing step. Research/experimental.");
6018 def->plugin_type = "slicing-pipeline";
6019 def->full_width = true;
6020 def->mode = comAdvanced;
6021 def->set_default_value(new ConfigOptionStrings());
6022
6023 def = this->add("printer_model", coString);
6024 def->label = L("Printer type");
6025 def->tooltip = L("Type of the printer.");
6026 def->set_default_value(new ConfigOptionString());
6027 def->cli = ConfigOptionDef::nocli;
6028
6029 def = this->add("printer_notes", coString);
6030 def->label = L("Printer notes");
6031 def->tooltip = L("You can put your notes regarding the printer here.");
6032 def->multiline = true;
6033 def->full_width = true;
6034 def->height = 13;
6035 def->mode = comAdvanced;
6036 def->set_default_value(new ConfigOptionString());
6037
6038 def = this->add("printer_variant", coString);
6039 def->label = L("Printer variant");
6040 //def->tooltip = L("Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter.");
6041 def->set_default_value(new ConfigOptionString());
6042 def->cli = ConfigOptionDef::nocli;
6043
6044 def = this->add("print_settings_id", coString);
6045 def->set_default_value(new ConfigOptionString());
6046 //BBS: open this option to command line
6047 //def->cli = ConfigOptionDef::nocli;
6048
6049 def = this->add("printer_settings_id", coString);
6050 def->set_default_value(new ConfigOptionString());
6051 //BBS: open this option to command line
6052 //def->cli = ConfigOptionDef::nocli;
6053
6054 def = this->add("raft_contact_distance", coFloat);
6055 def->label = L("Raft contact Z distance");
6056 def->category = L("Support");
6057 def->tooltip = L("Z gap between raft and object. If Support Top Z Distance is 0, this value is ignored and the object is printed in direct contact with the raft (no gap).");
6058 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6059 def->min = 0;
6060 def->mode = comAdvanced;
6061 def->set_default_value(new ConfigOptionFloat(0.1));
6062
6063 def = this->add("raft_expansion", coFloat);
6064 def->label = L("Raft expansion");
6065 def->category = L("Support");
6066 def->tooltip = L("This expands all raft layers in XY plane.");
6067 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6068 def->min = 0;
6069 def->mode = comAdvanced;
6070 def->set_default_value(new ConfigOptionFloat(1.5));
6071
6072 def = this->add("raft_first_layer_density", coPercent);
6073 def->label = L("First layer density");
6074 def->category = L("Support");
6075 def->tooltip = L("This is the density of the first raft or support layer.");
6076 def->sidetext = "%";
6077 def->min = 10;
6078 def->max = 100;
6079 def->mode = comAdvanced;
6080 def->set_default_value(new ConfigOptionPercent(90));
6081
6082 def = this->add("raft_first_layer_expansion", coFloat);
6083 def->label = L("First layer expansion");
6084 def->category = L("Support");
6085 def->tooltip = L("This expands the first raft or support layer to improve bed adhesion.");
6086 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6087 def->min = 0;
6088 def->mode = comAdvanced;
6089 //BBS: change from 3.0 to 2.0
6090 def->set_default_value(new ConfigOptionFloat(2.0));
6091
6092 def = this->add("raft_layers", coInt);
6093 def->label = L("Raft layers");
6094 def->category = L("Support");
6095 def->tooltip = L("Object will be raised by this number of support layers. "
6096 "Use this function to avoid warping when printing ABS.");
6097 def->sidetext = L("layers");
6098 def->min = 0;
6099 def->max = 100;
6100 def->mode = comAdvanced;
6101 def->set_default_value(new ConfigOptionInt(INITIAL_RAFT_LAYERS));
6102
6103 def = this->add("resolution", coFloat);
6104 def->label = L("Resolution");
6105 def->tooltip = L("The G-code path is generated after simplifying the contour of models to avoid too many points and G-code lines. Smaller values mean higher resolution and more time required to slice.");
6106 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6107 def->min = 0;
6108 def->mode = comAdvanced;
6109 def->set_default_value(new ConfigOptionFloat(0.01));
6110
6111 def = this->add("retraction_minimum_travel", coFloats);
6112 def->label = L("Travel distance threshold");
6113 def->tooltip = L("Only trigger retraction when the travel distance is longer than this threshold.");
6114 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6115 def->mode = comAdvanced;
6116 def->set_default_value(new ConfigOptionFloats { 2. });
6117
6118 def = this->add("retract_before_wipe", coPercents);
6119 def->label = L("Retract amount before wipe");
6120 def->tooltip = L("This is the length of fast retraction before a wipe, relative to retraction length.");
6121 def->sidetext = "%";
6122 def->mode = comAdvanced;
6123 def->set_default_value(new ConfigOptionPercents { 100 });
6124
6125 // Orca:
6126 def = this->add("retract_after_wipe", coPercents);
6127 def->label = L("Retract amount after wipe");
6128 // xgettext:no-c-format, no-boost-format
6129 def->tooltip = L("This is the length of fast retraction after wipe, relative to retraction length.\n"
6130 "The value will be clamped by 100% minus the retract amount before the wipe value.");
6131 def->sidetext = "%";
6132 def->mode = comExpert;
6133 def->set_default_value(new ConfigOptionPercents { 0 });
6134
6135 def = this->add("retract_when_changing_layer", coBools);
6136 def->label = L("Retract on layer change");
6137 def->tooltip = L("This forces a retraction on layer changes.");
6138 def->mode = comAdvanced;
6139 def->set_default_value(new ConfigOptionBools { false });
6140
6141 def = this->add("retraction_length", coFloats);
6142 def->label = L("Length");
6143 def->full_label = L("Retraction Length");
6144 def->tooltip = L("Some amount of material in extruder is pulled back to avoid ooze during long travel. "
6145 "Set zero to disable retraction.");
6146 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6147 def->mode = comSimple;
6148 def->set_default_value(new ConfigOptionFloats { 0.8 });
6149
6150 def = this->add("enable_long_retraction_when_cut",coInt);
6151 def->mode = comDevelop;
6152 def->set_default_value(new ConfigOptionInt {0});
6153
6154 def = this->add("long_retractions_when_cut", coBools);
6155 def->label = L("Long retraction when cut (beta)");
6156 def->tooltip = L("Experimental feature: Retracting and cutting off the filament at a longer distance during changes to minimize purge. "
6157 "While this reduces flush significantly, it may also raise the risk of nozzle clogs or other printing problems.");
6158 def->mode = comDevelop;
6159 def->set_default_value(new ConfigOptionBools {false});
6160
6161 def = this->add("retraction_distances_when_cut",coFloats);
6162 def->label = L("Retraction distance when cut");
6163 def->tooltip = L("Experimental feature: Retraction length before cutting off during filament change.");
6164 def->mode = comDevelop;
6165 def->min = 10;
6166 def->max = 18;
6167 def->set_default_value(new ConfigOptionFloats {18});
6168
6169 def = this->add("long_retractions_when_ec", coBools);
6170 def->label = L("Long retraction when extruder change");
6171 def->mode = comAdvanced;
6172 def->nullable = true;
6173 def->set_default_value(new ConfigOptionBoolsNullable {false});
6174
6175 def = this->add("retraction_distances_when_ec", coFloats);
6176 def->label = L("Retraction distance when extruder change");
6177 def->mode = comAdvanced;
6178 def->nullable = true;
6179 def->min = 0;
6180 def->max = 10;
6181 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6182 def->set_default_value(new ConfigOptionFloatsNullable{10});
6183
6184 def = this->add("retract_length_toolchange", coFloats);
6185 def->label = L("Retraction Length (Toolchange)");
6186 def->tooltip = L("When retraction is triggered before changing tool, filament is pulled back "
6187 "by the specified amount (the length is measured on raw filament, before it enters "
6188 "the extruder).");
6189 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6190 def->mode = comAdvanced;
6191 def->set_default_value(new ConfigOptionFloats { 10. });
6192
6193 def = this->add("z_hop", coFloats);
6194 def->label = L("Z-hop height");
6195 def->tooltip = L("Whenever there is a retraction, the nozzle is lifted a little to create clearance between the nozzle and the print. This prevents the nozzle from hitting the print when traveling more. Using spiral lines to lift Z can prevent stringing.");
6196 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6197 def->mode = comSimple;
6198 def->min = 0;
6199 def->max = 5;
6200 def->set_default_value(new ConfigOptionFloats { 0.4 });
6201
6202 def = this->add("retract_lift_above", coFloats);
6203 def->label = L("Z-hop lower boundary");
6204 def->tooltip = L("Z-hop will only come into effect when Z is above this value and is below the parameter: \"Z-hop upper boundary\".");
6205 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6206 def->mode = comAdvanced;
6207 def->min = 0;
6208 def->set_default_value(new ConfigOptionFloats{0.});
6209
6210 def = this->add("retract_lift_below", coFloats);
6211 def->label = L("Z-hop upper boundary");
6212 def->tooltip = L("If this value is positive, Z-hop will only come into effect when Z is above the parameter: \"Z-hop lower boundary\" and is below this value.");
6213 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6214 def->mode = comAdvanced;
6215 def->min = 0;
6216 def->set_default_value(new ConfigOptionFloats{0.});
6217
6218 def = this->add("z_hop_types", coEnums);
6219 def->label = L("Z-hop type");
6220 def->tooltip = L("Type of Z-hop.");
6221 def->enum_keys_map = &ConfigOptionEnum<ZHopType>::get_enum_values();
6222 def->enum_values.push_back("Auto Lift");
6223 def->enum_values.push_back("Normal Lift");
6224 def->enum_values.push_back("Slope Lift");
6225 def->enum_values.push_back("Spiral Lift");
6226 def->enum_labels.push_back(L("Auto"));
6227 def->enum_labels.push_back(L("Normal"));
6228 def->enum_labels.push_back(L("Slope"));
6229 def->enum_labels.push_back(L("Spiral"));
6230 def->mode = comAdvanced;
6231 def->set_default_value(new ConfigOptionEnumsGeneric{ ZHopType::zhtSlope });
6232
6233 def = this->add("travel_slope", coFloats);
6234 def->label = L("Traveling angle");
6235 def->tooltip = L("Traveling angle for Slope and Spiral Z-hop type. Setting it to 90° results in Normal Lift.");
6236 def->sidetext = u8"°"; // degrees, don't need translation
6237 def->mode = comAdvanced;
6238 def->min = 1;
6239 def->max = 90;
6240 def->set_default_value(new ConfigOptionFloats { 3 });
6241
6242 def = this->add("retract_lift_above", coFloats);
6243 def->label = L("Only lift Z above");
6244 def->tooltip = L("If you set this to a positive value, Z lift will only take place above the specified absolute Z.");
6245 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6246 def->mode = comAdvanced;
6247 def->set_default_value(new ConfigOptionFloats{0.});
6248
6249 def = this->add("retract_lift_below", coFloats);
6250 def->label = L("Only lift Z below");
6251 def->tooltip = L("If you set this to a positive value, Z lift will only take place below the specified absolute Z.");
6252 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6253 def->mode = comAdvanced;
6254 def->set_default_value(new ConfigOptionFloats{0.});
6255
6256 def = this->add("retract_lift_enforce", coEnums);
6257 def->label = L("On surfaces");
6258 def->tooltip = L("Enforce Z-Hop behavior. This setting is impacted by the above settings (Only lift Z above/below).");
6260 def->enum_values.push_back("All Surfaces");
6261 def->enum_values.push_back("Top Only");
6262 def->enum_values.push_back("Bottom Only");
6263 def->enum_values.push_back("Top and Bottom");
6264 def->enum_labels.push_back(L("All Surfaces"));
6265 def->enum_labels.push_back(L("Top Only"));
6266 def->enum_labels.push_back(L("Bottom Only"));
6267 def->enum_labels.push_back(L("Top and Bottom"));
6268 def->mode = comAdvanced;
6269 def->set_default_value(new ConfigOptionEnumsGeneric{RetractLiftEnforceType ::rletAllSurfaces});
6270
6271 def = this->add("extruder_type", coEnums);
6272 // internal use only, don't need translation
6273 def->label = "Type";
6274 def->tooltip = "This setting is only used for initial value of manual calibration of pressure advance. Bowden extruder usually has larger PA value. This setting doesn't influence normal slicing.";
6276 def->enum_values.push_back("Direct Drive");
6277 def->enum_values.push_back("Bowden");
6278 def->enum_labels.push_back(L("Direct Drive"));
6279 def->enum_labels.push_back(L("Bowden"));
6280 def->mode = comAdvanced;
6281 def->set_default_value(new ConfigOptionEnumsGeneric{ ExtruderType::etDirectDrive });
6282
6283 //BBS
6284 def = this->add("nozzle_volume_type", coEnums);
6285 // internal use only, don't need translation
6286 def->label = "Nozzle Volume Type";
6287 def->tooltip = "Nozzle volume type for extruders.";
6289 // Listed in display order. A position is not the enum value (E3D High Flow is 5, after the reserved 4),
6290 // so map a position to its NozzleVolumeType through enum_keys_map.
6291 def->enum_values.push_back(L("Standard"));
6292 def->enum_values.push_back(L("High Flow"));
6293 def->enum_values.push_back(L("Hybrid"));
6294 def->enum_values.push_back(L("TPU High Flow"));
6295 def->enum_values.push_back(L("E3D High Flow"));
6296 def->enum_values.push_back(L("Extra High Flow"));
6297 def->enum_labels.push_back(L("Standard"));
6298 def->enum_labels.push_back(L("High Flow"));
6299 def->enum_labels.push_back(L("Hybrid"));
6300 def->enum_labels.push_back(L("TPU High Flow"));
6301 def->enum_labels.push_back(L("E3D High Flow"));
6302 def->enum_labels.push_back(L("Extra High Flow"));
6303 def->mode = comSimple;
6304 def->set_default_value(new ConfigOptionEnumsGeneric{ NozzleVolumeType::nvtStandard });
6305
6306 def = this->add("default_nozzle_volume_type", coEnums);
6307 // internal use only, don't need translation
6308 def->label = "Default Nozzle Volume Type.";
6309 def->tooltip = "Default Nozzle volume type for extruders in this printer.";
6311 def->enum_values.push_back(L("Standard"));
6312 def->enum_values.push_back(L("High Flow"));
6313 def->enum_values.push_back(L("Hybrid"));
6314 def->enum_values.push_back(L("TPU High Flow"));
6315 def->enum_values.push_back(L("E3D High Flow"));
6316 def->enum_values.push_back(L("Extra High Flow"));
6317 def->enum_labels.push_back(L("Standard"));
6318 def->enum_labels.push_back(L("High Flow"));
6319 def->enum_labels.push_back(L("Hybrid"));
6320 def->enum_labels.push_back(L("TPU High Flow"));
6321 def->enum_labels.push_back(L("E3D High Flow"));
6322 def->enum_labels.push_back(L("Extra High Flow"));
6323 def->mode = comDevelop;
6324 def->set_default_value(new ConfigOptionEnumsGeneric{ NozzleVolumeType::nvtStandard });
6325
6326 def = this->add("extruder_variant_list", coStrings);
6327 // internal use only, don't need translation
6328 def->label = "Extruder variant list";
6329 def->tooltip = "Extruder variant list.";
6330 def->set_default_value(new ConfigOptionStrings { "Direct Drive Standard" });
6331 def->cli = ConfigOptionDef::nocli;
6332
6333 def = this->add("extruder_ams_count", coStrings);
6334 // internal use only, don't need translation
6335 def->label = "Extruder AMS count";
6336 def->tooltip = "AMS counts per extruder.";
6337 def->set_default_value(new ConfigOptionStrings { });
6338
6339 // Multi-nozzle: per-extruder physical nozzle inventory by volume type,
6340 // "<volume_type>#<count>" tokens joined by "|". Internal use only, no translation.
6341 def = this->add("extruder_nozzle_stats", coStrings);
6342 def->label = "Extruder nozzle stats";
6343 def->tooltip = "Physical nozzle counts per extruder, keyed by nozzle volume type.";
6344 def->set_default_value(new ConfigOptionStrings { });
6345
6346 // Multi-nozzle: number of physical nozzles per extruder. Forward-compat-only registration
6347 // with no slicing consumer: the nozzle-assignment engine derives its per-extruder physical nozzle
6348 // inventory from the richer `extruder_nozzle_stats` key, not from this scalar count, so nothing in
6349 // src/ reads it. Kept registered so an H2C project/config that carries the key loads without an
6350 // unknown-option substitution warning. Default {1} == today's single-nozzle-per-extruder assumption,
6351 // so absent/default is a no-op for every shipping printer. Internal use only, no translation.
6352 def = this->add("extruder_nozzle_count", coInts);
6353 def->label = "extruder nozzle count";
6354 def->tooltip = "extruder nozzle count";
6355 def->mode = comDevelop;
6356 def->set_default_value(new ConfigOptionInts{1});
6357
6358 // Per-nozzle volume type. Forward-compat-only registration with no slicing consumer — nothing in
6359 // src/ reads it; the engine resolves per-nozzle volume types from `extruder_nozzle_stats` tokens
6360 // instead. Kept registered so a project/config carrying it loads without an unknown-option
6361 // substitution warning. Registers the physical types only (no Hybrid).
6362 // Internal use only, no translation.
6363 def = this->add("extruder_nozzle_volume_type", coEnums);
6364 def->label = "Extruder nozzle volume type";
6365 def->tooltip = "Nozzle volume type per physical nozzle of an extruder.";
6367 def->enum_values.push_back("Standard");
6368 def->enum_values.push_back("High Flow");
6369 def->enum_values.push_back("TPU High Flow");
6370 def->enum_values.push_back("E3D High Flow");
6371 def->enum_values.push_back("Extra High Flow");
6372 def->enum_labels.push_back("Standard");
6373 def->enum_labels.push_back("High Flow");
6374 def->enum_labels.push_back("TPU High Flow");
6375 def->enum_labels.push_back("E3D High Flow");
6376 def->enum_labels.push_back("Extra High Flow");
6377 def->mode = comDevelop;
6378 def->set_default_value(new ConfigOptionEnumsGeneric{ NozzleVolumeType::nvtStandard });
6379
6380 def = this->add("enable_filament_dynamic_map", coBool);
6381 def->label = L("Enable filament dynamic map");
6382 def->tooltip = L("Enable dynamic filament mapping during print.");
6383 def->mode = comDevelop;
6384 def->set_default_value(new ConfigOptionBool(false));
6385
6386 def = this->add("has_filament_switcher", coBool);
6387 def->label = L("Has filament switcher");
6388 def->tooltip = L("Printer has a filament switcher hardware (e.g., AMS).");
6389 def->mode = comDevelop;
6390 def->set_default_value(new ConfigOptionBool(false));
6391
6392 def = this->add("printer_extruder_id", coInts);
6393 // internal use only, don't need translation
6394 def->label = "Printer extruder id";
6395 def->tooltip = "Printer extruder id.";
6396 def->set_default_value(new ConfigOptionInts { 1 });
6397 def->cli = ConfigOptionDef::nocli;
6398
6399 def = this->add("printer_extruder_variant", coStrings);
6400 // internal use only, don't need translation
6401 def->label = "Printer's extruder variant";
6402 def->tooltip = "Printer's extruder variant.";
6403 def->set_default_value(new ConfigOptionStrings { "Direct Drive Standard" });
6404 def->cli = ConfigOptionDef::nocli;
6405
6406 def = this->add("master_extruder_id", coInt);
6407 // internal use only, don't need translation
6408 def->label = "Master extruder id";
6409 def->tooltip = "Default extruder id to place filament.";
6410 def->set_default_value(new ConfigOptionInt{ 1 });
6411
6412 def = this->add("print_extruder_id", coInts);
6413 // internal use only, don't need translation
6414 def->label = "Print extruder id";
6415 def->tooltip = "Print extruder id.";
6416 def->set_default_value(new ConfigOptionInts { 1 });
6417 def->cli = ConfigOptionDef::nocli;
6418
6419 def = this->add("print_extruder_variant", coStrings);
6420 // internal use only, don't need translation
6421 def->label = "Print's extruder variant";
6422 def->tooltip = "Print's extruder variant.";
6423 def->set_default_value(new ConfigOptionStrings { "Direct Drive Standard" });
6424 def->cli = ConfigOptionDef::nocli;
6425
6426 /*def = this->add("filament_extruder_id", coInts);
6427 def->label = "Filament extruder id";
6428 def->tooltip = "Filament extruder id.";
6429 def->set_default_value(new ConfigOptionInts { 1 });
6430 def->cli = ConfigOptionDef::nocli;*/
6431
6432 def = this->add("filament_extruder_variant", coStrings);
6433 // internal use only, don't need translation
6434 def->label = "Filament's extruder variant";
6435 def->tooltip = "Filament's extruder variant.";
6436 def->set_default_value(new ConfigOptionStrings { "Direct Drive Standard" });
6437 def->cli = ConfigOptionDef::nocli;
6438
6439 def = this->add("filament_self_index", coInts);
6440 // internal use only, don't need translation
6441 def->label = "Filament self index";
6442 def->tooltip = "Filament self index.";
6443 def->set_default_value(new ConfigOptionInts { 1 });
6444 def->cli = ConfigOptionDef::nocli;
6445
6446 def = this->add("retract_restart_extra", coFloats);
6447 def->label = L("Extra length on restart");
6448 def->tooltip = L("When the retraction is compensated after the travel move, the extruder will push "
6449 "this additional amount of filament. This setting is rarely needed.");
6450 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6451 def->mode = comAdvanced;
6452 def->set_default_value(new ConfigOptionFloats { 0. });
6453
6454 def = this->add("retract_restart_extra_toolchange", coFloats);
6455 def->label = L("Extra length on restart (Toolchange)");
6456 def->tooltip = L("When the retraction is compensated after changing tool, the extruder will push "
6457 "this additional amount of filament.");
6458 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6459 def->mode = comAdvanced;
6460 def->set_default_value(new ConfigOptionFloats { 0. });
6461
6462 def = this->add("retraction_speed", coFloats);
6463 def->label = L("Retraction speed");
6464 def->full_label = L("Retraction speed");
6465 def->tooltip = L("Speed for retracting filament from the nozzle.");
6466 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
6467 def->mode = comAdvanced;
6468 def->set_default_value(new ConfigOptionFloats { 30. });
6469
6470 def = this->add("deretraction_speed", coFloats);
6471 def->label = L("Deretraction speed");
6472 def->full_label = L("Deretraction speed");
6473 def->tooltip = L("Speed for reloading filament into the nozzle. Zero means same speed of retraction.");
6474 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
6475 def->mode = comAdvanced;
6476 def->set_default_value(new ConfigOptionFloats { 0. });
6477
6478 // Per-(extruder,variant) deretraction speed at an extruder change. This value
6479 // ships in multi-extruder machine profiles but has no slicer consumer — it is a device/firmware-facing
6480 // profile key. Registered here (ConfigDef-only, no FullPrintConfig static member) so X2D/P2S profiles
6481 // that already carry it — and the H2D/A2L leaves — validate as a known key; unread by the slicer.
6482 // nullable so absent leaves stay nil (excluded from the g-code config block).
6483 def = this->add("deretract_speed_extruder_change", coFloats);
6484 def->label = L("Deretraction speed (extruder change)");
6485 def->tooltip = L("Speed for reloading filament into the nozzle when switching extruder.");
6486 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
6487 def->mode = comDevelop;
6488 def->nullable = true;
6489 def->set_default_value(new ConfigOptionFloatsNullable { 0. });
6490
6491 def = this->add("use_firmware_retraction", coBool);
6492 def->label = L("Use firmware retraction");
6493 def->tooltip = L("This experimental setting uses G10 and G11 commands to have the firmware "
6494 "handle the retraction. This is only supported in recent Marlin.");
6495 def->mode = comAdvanced;
6496 def->set_default_value(new ConfigOptionBool(false));
6497
6498 def = this->add("bbl_calib_mark_logo", coBool);
6499 def->label = L("Show auto-calibration marks");
6500 //def->tooltip = L("");
6501 def->mode = comAdvanced;
6502 def->set_default_value(new ConfigOptionBool(true));
6503
6504 def = this->add("disable_m73", coBool);
6505 def->label = L("Disable set remaining print time");
6506 def->tooltip = L("Disable generating of the M73: Set remaining print time in the final G-code.");
6507 def->mode = comAdvanced;
6508 def->set_default_value(new ConfigOptionBool(false));
6509
6510 def = this->add("seam_position", coEnum);
6511 def->label = L("Seam position");
6512 def->category = L("Quality");
6513 def->tooltip = L("This is the starting position for each part of the outer wall.");
6515 def->enum_values.push_back("nearest");
6516 def->enum_values.push_back("aligned");
6517 def->enum_values.push_back("aligned_back");
6518 def->enum_values.push_back("back");
6519 def->enum_values.push_back("random");
6520 def->enum_labels.push_back(L("Nearest"));
6521 def->enum_labels.push_back(L("Aligned"));
6522 def->enum_labels.push_back(L("Aligned back"));
6523 def->enum_labels.push_back(L("Back"));
6524 def->enum_labels.push_back(L("Random"));
6525 def->mode = comSimple;
6526 def->set_default_value(new ConfigOptionEnum<SeamPosition>(spAligned));
6527
6528 def = this->add("staggered_inner_seams", coBool);
6529 def->label = L("Staggered inner seams");
6530 def->category = L("Quality");
6531 def->tooltip = L("This option causes the inner seams to be shifted backwards based on their depth, forming a zigzag pattern.");
6532 def->mode = comAdvanced;
6533 def->set_default_value(new ConfigOptionBool(false));
6534
6535 def = this->add("seam_gap", coFloatOrPercent);
6536 def->label = L("Seam gap");
6537 def->category = L("Quality");
6538 def->tooltip = L("In order to reduce the visibility of the seam in a closed loop extrusion, the loop is interrupted and shortened by a specified amount.\n"
6539 "This amount can be specified in millimeters or as a percentage of the nozzle diameter. The default value for this parameter is 10%.");
6540 def->sidetext = L("mm or %");
6541 def->min = 0;
6542 def->mode = comAdvanced;
6543 def->set_default_value(new ConfigOptionFloatOrPercent(10,true));
6544
6545 def = this->add("seam_slope_type", coEnum);
6546 def->label = L("Scarf joint seam (beta)");
6547 def->category = L("Quality");
6548 def->tooltip = L("Use scarf joint to minimize seam visibility and increase seam strength.");
6550 def->enum_values.push_back("none");
6551 def->enum_values.push_back("external");
6552 def->enum_values.push_back("all");
6553 def->enum_labels.push_back(L("None"));
6554 def->enum_labels.push_back(L("Contour"));
6555 def->enum_labels.push_back(L("Contour and hole"));
6556 def->mode = comAdvanced;
6557 def->set_default_value(new ConfigOptionEnum<SeamScarfType>(SeamScarfType::None));
6558
6559 def = this->add("seam_slope_conditional", coBool);
6560 def->label = L("Conditional scarf joint");
6561 def->category = L("Quality");
6562 def->tooltip = L("Apply scarf joints only to smooth perimeters where traditional seams do not conceal the seams at sharp corners effectively.");
6563 def->mode = comAdvanced;
6564 def->set_default_value(new ConfigOptionBool(false));
6565
6566 def = this->add("scarf_angle_threshold", coInt);
6567 def->label = L("Conditional angle threshold");
6568 def->category = L("Quality");
6569 def->tooltip = L(
6570 "This option sets the threshold angle for applying a conditional scarf joint seam.\nIf the maximum angle within the perimeter loop "
6571 "exceeds this value (indicating the absence of sharp corners), a scarf joint seam will be used. The default value is 155°.");
6572 def->mode = comAdvanced;
6573 def->sidetext = u8"°"; // degrees, don't need translation
6574 def->min = 0;
6575 def->max = 180;
6576 def->set_default_value(new ConfigOptionInt(155));
6577
6578 def = this->add("scarf_overhang_threshold", coPercent);
6579 def->label = L("Conditional overhang threshold");
6580 def->category = L("Quality");
6581 // xgettext:no-c-format, no-boost-format
6582 def->tooltip = L("This option determines the overhang threshold for the application of scarf joint seams. If the unsupported portion "
6583 "of the perimeter is less than this threshold, scarf joint seams will be applied. The default threshold is set at 40% "
6584 "of the external wall's width. Due to performance considerations, the degree of overhang is estimated.");
6585 def->sidetext = "%";
6586 def->min = 0;
6587 def->mode = comAdvanced;
6588 def->set_default_value(new ConfigOptionPercent(40));
6589
6590 def = this->add("scarf_joint_speed", coFloatOrPercent);
6591 def->label = L("Scarf joint speed");
6592 def->category = L("Quality");
6593 def->tooltip = L(
6594 "This option sets the printing speed for scarf joints. It is recommended to print scarf joints at a slow speed (less than 100 "
6595 "mm/s). It's also advisable to enable 'Extrusion rate smoothing' if the set speed varies significantly from the speed of the "
6596 "outer or inner walls. If the speed specified here is higher than the speed of the outer or inner walls, the printer will default "
6597 "to the slower of the two speeds. When specified as a percentage (e.g., 80%), the speed is calculated based on the respective "
6598 "outer or inner wall speed. The default value is set to 100%.");
6599 def->sidetext = L("mm/s or %");
6600 def->min = 1;
6601 def->mode = comAdvanced;
6602 def->set_default_value(new ConfigOptionFloatOrPercent(100, true));
6603
6604 def = this->add("scarf_joint_flow_ratio", coFloat);
6605 def->label = L("Scarf joint flow ratio");
6606 def->category = L("Quality");
6607 def->tooltip = L("This factor affects the amount of material for scarf joints.");
6608 def->mode = comExpert;
6609 def->min = 0;
6610 def->max = 2;
6611 def->set_default_value(new ConfigOptionFloat(1));
6612
6613 def = this->add("seam_slope_start_height", coFloatOrPercent);
6614 def->label = L("Scarf start height");
6615 def->category = L("Quality");
6616 def->tooltip = L("Start height of the scarf.\n"
6617 "This amount can be specified in millimeters or as a percentage of the current layer height. The default value for this parameter is 0.");
6618 def->sidetext = L("mm or %");
6619 def->ratio_over = "layer_height";
6620 def->min = 0;
6621 def->mode = comAdvanced;
6622 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
6623
6624 def = this->add("seam_slope_entire_loop", coBool);
6625 def->label = L("Scarf around entire wall");
6626 def->category = L("Quality");
6627 def->tooltip = L("The scarf extends to the entire length of the wall.");
6628 def->mode = comAdvanced;
6629 def->set_default_value(new ConfigOptionBool(false));
6630
6631 def = this->add("seam_slope_min_length", coFloat);
6632 def->label = L("Scarf length");
6633 def->category = L("Quality");
6634 def->tooltip = L("Length of the scarf. Setting this parameter to zero effectively disables the scarf.");
6635 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6636 def->min = 0;
6637 def->mode = comAdvanced;
6638 def->set_default_value(new ConfigOptionFloat(20));
6639
6640 def = this->add("seam_slope_steps", coInt);
6641 def->label = L("Scarf steps");
6642 def->category = L("Quality");
6643 def->tooltip = L("Minimum number of segments of each scarf.");
6644 def->min = 1;
6645 def->mode = comAdvanced;
6646 def->set_default_value(new ConfigOptionInt(10));
6647
6648 def = this->add("seam_slope_inner_walls", coBool);
6649 def->label = L("Scarf joint for inner walls");
6650 def->category = L("Quality");
6651 def->tooltip = L("Use scarf joint for inner walls as well.");
6652 def->mode = comAdvanced;
6653 def->set_default_value(new ConfigOptionBool(false));
6654
6655 def = this->add("role_based_wipe_speed", coBool);
6656 def->label = L("Role based wipe speed");
6657 def->category = L("Speed");
6658 def->tooltip = L("The wipe speed is determined by the speed of the current extrusion role. "
6659 "e.g. if a wipe action is executed immediately following an outer wall extrusion, the speed of the outer wall extrusion will be utilized for the wipe action.");
6660 def->mode = comAdvanced;
6661 def->set_default_value(new ConfigOptionBool(true));
6662
6663 def = this->add("wipe_on_loops", coBool);
6664 def->label = L("Wipe on loops");
6665 def->category = L("Quality");
6666 def->tooltip = L("To minimize the visibility of the seam in a closed loop extrusion, a small inward movement is executed before the extruder leaves the loop.");
6667 def->mode = comAdvanced;
6668 def->set_default_value(new ConfigOptionBool(false));
6669
6670 def = this->add("wipe_inward", coBool);
6671 def->label = L("Wipe inward");
6672 def->category = L("Quality");
6673 def->tooltip = L("Applies only to external walls, including hole boundaries. Moves the hot nozzle toward printed "
6674 "inner walls during wiping to reduce reheating of freshly printed plastic and seam marks.\n\n"
6675 "Especially useful at layer heights below 0.1 mm, where wipe marks are more visible.\n\n"
6676 "Uses the regular wipe if no adjacent inner wall is already printed (single-wall areas or "
6677 "Outer/Inner wall order), or if no supported inward path can be found, for example at tight "
6678 "corners or seam gaps.");
6679 def->mode = comExpert;
6680 def->set_default_value(new ConfigOptionBool(false));
6681
6682 def = this->add("wipe_inward_distance", coFloatOrPercent);
6683 def->label = L("Wipe inward distance");
6684 def->category = L("Quality");
6685 // xgettext:no-c-format, no-boost-format
6686 def->tooltip = L("The distance the wipe path is shifted away from the external perimeter, specified in millimeters "
6687 "or as a percentage of the actual outer-wall extrusion width.\n\n"
6688 "For example, 50% shifts the path by half of the outer-wall width. The effective offset is limited "
6689 "by both the actual outer-wall width and the available spacing to the adjacent wall, so values "
6690 "above 100% or an equivalent absolute distance have no additional effect. "
6691 "Set to 0 to disable the offset.");
6692 def->sidetext = L("mm or %");
6693 def->ratio_over = "outer_wall_line_width";
6694 def->min = 0;
6695 def->max = 100;
6696 def->max_literal = 2; // Orca: G-code generation also clamps literal values to the actual outer-wall width.
6697 def->mode = comExpert;
6698 def->set_default_value(new ConfigOptionFloatOrPercent(50, true));
6699
6700 def = this->add("wipe_before_external_loop", coBool);
6701 def->label = L("Wipe before external loop");
6702 def->category = L("Quality");
6703 def->tooltip = L("To minimize visibility of potential overextrusion at the start of an external perimeter when printing with "
6704 "Outer/Inner or Inner/Outer/Inner wall print order, the de-retraction is performed slightly on the inside from the "
6705 "start of the external perimeter. That way any potential over extrusion is hidden from the outside surface.\n\n"
6706 "This is useful when printing with Outer/Inner or Inner/Outer/Inner wall print order as in these modes it is more likely "
6707 "an external perimeter is printed immediately after a de-retraction move.");
6708 def->mode = comAdvanced;
6709 def->set_default_value(new ConfigOptionBool(false));
6710
6711 def = this->add("wipe_speed", coFloatOrPercent);
6712 def->label = L("Wipe speed");
6713 def->category = L("Speed");
6714 def->tooltip = L("The wipe speed is determined by the speed setting specified in this configuration. "
6715 "If the value is expressed as a percentage (e.g. 80%), it will be calculated based on the travel speed setting above. "
6716 "The default value for this parameter is 80%.");
6717 def->sidetext = L("mm/s or %");
6718 def->ratio_over = "travel_speed";
6719 def->min = 0;
6720 def->mode = comAdvanced;
6721 def->set_default_value(new ConfigOptionFloatOrPercent(80,true));
6722
6723 def = this->add("skirt_distance", coFloat);
6724 def->label = L("Skirt distance");
6725 def->tooltip = L("This is the distance from the skirt to the brim or the object.");
6726 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6727 def->min = 0;
6728 def->max = 60;
6729 def->mode = comAdvanced;
6730 def->set_default_value(new ConfigOptionFloat(2));
6731
6732 def = this->add("skirt_start_angle", coFloat);
6733 def->label = L("Skirt start point");
6734 def->category = L("Support");
6735 def->tooltip = L("Angle from the object center to skirt start point. Zero is the most right position, counter clockwise is positive angle.");
6736 def->sidetext = u8"°"; // degrees, don't need translation
6737 def->min = -180;
6738 def->max = 180;
6739 def->mode = comAdvanced;
6740 def->set_default_value(new ConfigOptionFloat(-135));
6741
6742 def = this->add("skirt_height", coInt);
6743 def->label = L("Skirt height");
6744 def->tooltip = L("Number of skirt layers: usually only one");
6745 def->sidetext = L("layers");
6746 def->mode = comSimple;
6747 def->max = 10000;
6748 def->set_default_value(new ConfigOptionInt(1));
6749
6750 def = this->add("single_loop_draft_shield", coBool);
6751 def->label = L("Single loop after first layer");
6752 def->tooltip = L("Limits the skirt/draft shield loops to one wall after the first layer. This is useful, on occasion, to conserve filament but may cause the draft shield/skirt to warp / crack.");
6753 def->mode = comAdvanced;
6754 def->set_default_value(new ConfigOptionBool(false));
6755
6756 def = this->add("draft_shield", coEnum);
6757 def->label = L("Draft shield");
6758 def->tooltip = L("A draft shield is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft. "
6759 "It is usually needed only with open frame printers, i.e. without an enclosure.\n\n"
6760 "Enabled = skirt is as tall as the highest printed object. Otherwise 'Skirt height' is used.");
6761 def->enum_keys_map = &ConfigOptionEnum<DraftShield>::get_enum_values();
6762 def->enum_values.push_back("disabled");
6763 def->enum_values.push_back("enabled");
6764 def->enum_labels.push_back(L("Disabled"));
6765 def->enum_labels.push_back(L("Enabled"));
6766 def->mode = comAdvanced;
6767 def->set_default_value(new ConfigOptionEnum<DraftShield>(dsDisabled));
6768
6769 def = this->add("skirt_type", coEnum);
6770 def->label = L("Skirt type");
6771 def->full_label = L("Skirt type");
6772 def->tooltip = L("Combined - single skirt for all objects, Per object - individual object skirt.");
6773 def->enum_keys_map = &ConfigOptionEnum<SkirtType>::get_enum_values();
6774 def->enum_values.push_back("combined");
6775 def->enum_values.push_back("perobject");
6776 def->enum_labels.push_back(L("Combined"));
6777 def->enum_labels.push_back(L("Per object"));
6778 def->mode = comAdvanced;
6779 def->set_default_value(new ConfigOptionEnum<SkirtType>(stCombined));
6780
6781 def = this->add("skirt_loops", coInt);
6782 def->label = L("Skirt loops");
6783 def->full_label = L("Skirt loops");
6784 def->tooltip = L("This is the number of loops for the skirt. 0 means the skirt is disabled.");
6785 def->min = 0;
6786 def->max = 10;
6787 def->mode = comSimple;
6788 def->set_default_value(new ConfigOptionInt(1));
6789
6790 def = this->add("skirt_speed", coFloat);
6791 def->label = L("Skirt speed");
6792 def->full_label = L("Skirt speed");
6793 def->tooltip = L("Speed of skirt, in mm/s. Zero means use default layer extrusion speed.");
6794 def->min = 0;
6795 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
6796 def->mode = comAdvanced;
6797 def->set_default_value(new ConfigOptionFloat(50.0));
6798
6799 def = this->add("min_skirt_length", coFloat);
6800 def->label = L("Skirt minimum extrusion length");
6801 def->full_label = L("Skirt minimum extrusion length");
6802 def->tooltip = L("Minimum filament extrusion length in mm when printing the skirt. Zero means this feature is disabled.\n\n"
6803 "Using a non-zero value is useful if the printer is set up to print without a prime line.\n"
6804 "Final number of loops is not taking into account while arranging or validating objects distance. Increase loop number in such case.");
6805 def->min = 0;
6806 def->sidetext = L("mm"); // millimeters, CIS languages need translation
6807 def->mode = comAdvanced;
6808 def->set_default_value(new ConfigOptionFloat(0.0));
6809
6810 def = this->add("slow_down_layer_time", coFloats);
6811 def->label = L("Layer time");
6812 def->tooltip = L("The printing speed in exported G-code will be slowed down when the estimated layer time is "
6813 "shorter than this value in order to get better cooling for these layers.");
6814 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
6815 def->min = 0;
6816 def->max = 1000;
6817 def->mode = comSimple;
6818 def->set_default_value(new ConfigOptionFloats { 5.0f });
6819
6820 def = this->add("minimum_sparse_infill_area", coFloat);
6821 def->label = L("Minimum sparse infill threshold");
6822 def->category = L("Strength");
6823 def->tooltip = L("Sparse infill areas which are smaller than this threshold value are replaced by internal solid infill.");
6824 def->sidetext = L(u8"mm²"); // square millimeters, CIS languages need translation
6825 def->min = 0;
6826 def->mode = comAdvanced;
6827 def->set_default_value(new ConfigOptionFloat(15));
6828
6829 def = this->add("internal_solid_filament_id", coInt);
6831 def->label = L("Internal solid infill");
6832 def->category = L("Extruders");
6833 def->tooltip = L("Filament to print internal solid infill.\n\"Default\" uses the active object/part filament.");
6834 def->min = 0;
6835 def->mode = comAdvanced;
6836 def->set_default_value(new ConfigOptionInt(0));
6837
6838 def = this->add("top_surface_filament_id", coInt);
6840 def->label = L("Top surface");
6841 def->category = L("Extruders");
6842 def->tooltip = L("Filament to print top surface.\n\"Default\" uses the active object/part filament.");
6843 def->min = 0;
6844 def->mode = comAdvanced;
6845 def->set_default_value(new ConfigOptionInt(0));
6846
6847 def = this->add("bottom_surface_filament_id", coInt);
6849 def->label = L("Bottom surface");
6850 def->category = L("Extruders");
6851 def->tooltip = L("Filament to print bottom surface.\n\"Default\" uses the active object/part filament.");
6852 def->min = 0;
6853 def->mode = comAdvanced;
6854 def->set_default_value(new ConfigOptionInt(0));
6855
6856 def = this->add("internal_solid_infill_line_width", coFloatOrPercent);
6857 def->label = L("Internal solid infill");
6858 def->category = L("Quality");
6859 def->tooltip = L("Line width of internal solid infill. If expressed as a %, it will be computed over the nozzle diameter.");
6860 def->sidetext = L("mm or %");
6861 def->ratio_over = "nozzle_diameter";
6862 def->min = 0;
6863 def->max = 1000;
6864 def->max_literal = 10;
6865 def->mode = comAdvanced;
6866 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
6867
6868 def = this->add("internal_solid_infill_speed", coFloats);
6869 def->label = L("Internal solid infill");
6870 def->category = L("Speed");
6871 def->tooltip = L("This is the speed for internal solid infill, not including the top or bottom surface.");
6872 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
6873 def->min = 1;
6874 def->mode = comAdvanced;
6875 def->nullable = true;
6876 def->set_default_value(new ConfigOptionFloatsNullable{100});
6877
6878 def = this->add("spiral_mode", coBool);
6879 def->label = L("Spiral vase");
6880 def->tooltip = L("This enables spiraling, which smooths out the Z moves of the outer contour and turns a solid model into a single walled print with solid bottom layers. The final generated model has no seam.");
6881 def->mode = comSimple;
6882 def->set_default_value(new ConfigOptionBool(false));
6883
6884 def = this->add("spiral_mode_smooth", coBool);
6885 def->label = L("Smooth Spiral");
6886 def->tooltip = L("Smooth Spiral smooths out X and Y moves as well, "
6887 "resulting in no visible seam at all, even in the XY directions on walls that are not vertical.");
6888 def->mode = comSimple;
6889 def->set_default_value(new ConfigOptionBool(false));
6890
6891 def = this->add("spiral_mode_max_xy_smoothing", coFloatOrPercent);
6892 def->label = L("Max XY Smoothing");
6893 // xgettext:no-c-format, no-boost-format
6894 def->tooltip = L("Maximum distance to move points in XY to try to achieve a smooth spiral. "
6895 "If expressed as a %, it will be computed over nozzle diameter.");
6896 def->sidetext = L("mm or %");
6897 def->ratio_over = "nozzle_diameter";
6898 def->min = 0;
6899 def->max = 1000;
6900 def->max_literal = 10;
6901 def->mode = comAdvanced;
6902 def->set_default_value(new ConfigOptionFloatOrPercent(200, true));
6903
6904 def = this->add("spiral_starting_flow_ratio", coFloat);
6905 def->label = L("Spiral starting flow ratio");
6906 // xgettext:no-c-format, no-boost-format
6907 def->tooltip = L("Sets the starting flow ratio while transitioning from the last bottom layer to the spiral. "
6908 "Normally the spiral transition scales the flow ratio from 0% to 100% during the first loop "
6909 "which can in some cases lead to under extrusion at the start of the spiral.");
6910 def->min = 0;
6911 def->max = 1;
6912 def->set_default_value(new ConfigOptionFloat(0));
6913 def->mode = comAdvanced;
6914
6915 def = this->add("spiral_finishing_flow_ratio", coFloat);
6916 def->label = L("Spiral finishing flow ratio");
6917 // xgettext:no-c-format, no-boost-format
6918 def->tooltip = L("Sets the finishing flow ratio while ending the spiral. "
6919 "Normally the spiral transition scales the flow ratio from 100% to 0% during the last loop "
6920 "which can in some cases lead to under extrusion at the end of the spiral.");
6921 def->min = 0;
6922 def->max = 1;
6923 def->set_default_value(new ConfigOptionFloat(0));
6924 def->mode = comAdvanced;
6925
6926 def = this->add("timelapse_type", coEnum);
6927 def->label = L("Timelapse");
6928 def->tooltip = L("If smooth or traditional mode is selected, a timelapse video will be generated for each print. After each layer is printed, a snapshot is taken with the chamber camera. All of these snapshots are composed into a timelapse video when printing completes. If smooth mode is selected, the toolhead will move to the excess chute after each layer is printed and then take a snapshot. Since the melt filament may leak from the nozzle during the process of taking a snapshot, a prime tower is required for smooth mode to wipe the nozzle.");
6930 def->enum_values.emplace_back("0");
6931 def->enum_values.emplace_back("1");
6932 def->enum_labels.emplace_back(L("Traditional"));
6933 def->enum_labels.emplace_back(L("Smooth"));
6934 def->mode = comSimple;
6935 def->set_default_value(new ConfigOptionEnum<TimelapseType>(tlTraditional));
6936
6937 // Farthest-point timelapse. Corexy-only refinement layered on top of the existing
6938 // timelapse_type: when enabled the traditional-mode snapshot is
6939 // taken at the extrusion point farthest from the camera (0,0) instead of traveling to a safe/chute
6940 // position. Gated in GCode::process_layer by timelapse_type==tlTraditional && printer_structure!=psI3,
6941 // so it is inert for i3 (A1/A2L) printers and whenever the toggle is off (default false → every
6942 // existing printer's g-code is byte-identical). Only H2C/H2D machine profiles set it =1.
6943 def = this->add("farthest_point_timelapse", coBool);
6944 def->label = L("Farthest point timelapse");
6945 def->tooltip = L("When enabled, the timelapse snapshot is taken at the farthest point from camera "
6946 "instead of traveling to the wipe tower or excess chute. "
6947 "Only effective in traditional timelapse mode on non-I3 printers.");
6948 def->mode = comSimple;
6949 def->set_default_value(new ConfigOptionBool(false));
6950
6951 def = this->add("standby_temperature_delta", coInt);
6952 def->label = L("Temperature variation");
6953 // TRN PrintSettings : "Ooze prevention" > "Temperature variation"
6954 def->tooltip = L("Temperature difference to be applied when an extruder is not active. "
6955 "The value is not used when 'idle_temperature' in filament settings "
6956 "is set to non-zero value.");
6957 def->sidetext = L(u8"\u2206\u2103" /* ∆°C */); // delta degrees Celsius, CIS languages need translation
6958 def->min = -max_temp;
6959 def->max = max_temp;
6960 def->mode = comAdvanced;
6961 def->set_default_value(new ConfigOptionInt(-5));
6962
6963 def = this->add("preheat_time", coFloat);
6964 def->label = L("Preheat time");
6965 def->tooltip = L("To reduce the waiting time after tool change, Orca can preheat the next tool while the current tool is still in use. "
6966 "This setting specifies the time in seconds to preheat the next tool. Orca will insert a M104 command to preheat the tool in advance.");
6967 def->sidetext = L_CONTEXT("s", "second"); // seconds, CIS languages need translation
6968 def->min = 0;
6969 def->max = 120;
6970 def->mode = comAdvanced;
6971 def->set_default_value(new ConfigOptionFloat(30.0));
6972
6973 def = this->add("preheat_steps", coInt);
6974 def->label = L("Preheat steps");
6975 def->tooltip = L("Insert multiple preheat commands (e.g. M104.1). Only useful for Prusa XL. For other printers, please set it to 1.");
6976 //def->sidetext = "";
6977 def->min = 1;
6978 def->max = 10;
6979 def->mode = comDevelop;
6980 def->set_default_value(new ConfigOptionInt(1));
6981
6982
6983 def = this->add("file_start_gcode", coString);
6984 def->label = L("File header G-code");
6985 def->tooltip = L("G-code written at the very top of the output file, before any other content. "
6986 "Useful for adding metadata that printer firmware reads from the first lines of the file "
6987 "(e.g. estimated print time, filament usage). "
6988 "Supports placeholders like {print_time_total_sec}, {print_time_day}, {print_time_hour}, {print_time_minute}, {print_time_sec} and {used_filament_length}.");
6989 def->multiline = true;
6990 def->full_width = true;
6991 def->height = 8;
6992 def->mode = comAdvanced;
6993 def->set_default_value(new ConfigOptionString(""));
6994
6995 def = this->add("machine_start_gcode", coString);
6996 def->label = L("Start G-code");
6997 def->tooltip = L("G-code added when starting a print.");
6998 def->multiline = true;
6999 def->full_width = true;
7000 def->height = 12;
7001 def->mode = comAdvanced;
7002 def->set_default_value(new ConfigOptionString("G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n"));
7003
7004 def = this->add("filament_start_gcode", coStrings);
7005 def->label = L("Start G-code");
7006 def->tooltip = L("G-code added when the printer starts using this filament");
7007 def->multiline = true;
7008 def->full_width = true;
7009 def->height = 12;
7010 def->mode = comAdvanced;
7011 def->set_default_value(new ConfigOptionStrings { " " });
7012
7013 def = this->add("single_extruder_multi_material", coBool);
7014 def->label = L("Single Extruder Multi Material");
7015 def->tooltip = L("Use single nozzle to print multi filament.");
7016 def->mode = comAdvanced;
7017 def->set_default_value(new ConfigOptionBool(true));
7018
7019 // IDEX/IQEX (independent X extruder) — parallel printing support for IDEX/IQEX printers.
7020 // Every key in this group is read at slice time from m_config, and the two per-plate process
7021 // keys (imex_parallel_mode, imex_head_filament_map) round-trip through the 3MF's
7022 // model_settings.config plate metadata, so none of them needs to appear in the exported
7023 // g-code. They all carry non-nil defaults, so emitting them would add a line to every
7024 // printer's dump. Kept out of the g-code config block (banned_keys).
7025 def = this->add("is_imex", coBool);
7026 def->label = L("IDEX/IQEX Printer");
7027 def->tooltip = L("Enable parallel printing for printers with multiple independent carriages (IDEX, IQEX, and similar).");
7028 def->mode = comAdvanced;
7029 def->set_default_value(new ConfigOptionBool(false));
7030
7031 // Firmware-managed zones: slice the primary zone's contents at bed origin (0,0)
7032 // so a center-origin printer firmware can apply its own copy/mirror offsets to
7033 // each toolhead. The slicer's zone overlay, placement check, and mode signaling
7034 // are unchanged; only the gcode emission frame shifts.
7035 def = this->add("imex_firmware_managed_zones", coBool);
7036 def->label = L("Firmware-managed zones");
7037 def->tooltip = L("When enabled, the slicer emits G-code with the primary zone's "
7038 "contents centered on bed origin (0,0). The printer firmware is "
7039 "responsible for placing copies/mirrors at each physical zone "
7040 "position. Enable only on printers whose firmware applies its own "
7041 "zone offsets in copy/mirror mode (e.g. RepRapFirmware IDEX "
7042 "duplication mode). Has no effect in Primary mode.");
7043 def->mode = comAdvanced;
7044 def->set_default_value(new ConfigOptionBool(false));
7045
7046 def = this->add("imex_gantry_count", coInt);
7047 def->label = L("Gantry Count");
7048 def->tooltip = L("Number of independent Y-axis gantries. 1 for IDEX/single-rail IQEX. 2 for dual-gantry systems (divides bed into rows).");
7049 def->min = 1;
7050 def->max = 2;
7051 def->mode = comAdvanced;
7052 def->set_default_value(new ConfigOptionInt(1));
7053
7054 def = this->add("imex_tools_per_gantry", coInt);
7055 def->label = L("Tools per Gantry");
7056 def->tooltip = L("Number of independent toolheads per gantry along X. 2 for IDEX-style.");
7057 def->min = 1;
7058 def->max = 4;
7059 def->mode = comAdvanced;
7060 def->set_default_value(new ConfigOptionInt(2));
7061
7062 def = this->add("imex_tool_layout", coEnum);
7063 def->label = L("Tool 0 Position");
7064 def->tooltip = L("Physical position on the bed where tool T0 (index 0) is located. "
7065 "Determines how tool indices map to bed zones. "
7066 "For single-gantry setups (IDEX) only left/right matters; "
7067 "for dual-gantry setups (IQEX) all four corners are selectable "
7068 "(front = lower Y / near the operator, rear = higher Y / back of machine).");
7069 def->mode = comAdvanced;
7071 def->enum_values.push_back("front-left");
7072 def->enum_values.push_back("front-right");
7073 def->enum_values.push_back("rear-left");
7074 def->enum_values.push_back("rear-right");
7075 def->enum_labels.push_back(L("Front-left"));
7076 def->enum_labels.push_back(L("Front-right"));
7077 def->enum_labels.push_back(L("Rear-left"));
7078 def->enum_labels.push_back(L("Rear-right"));
7079 def->set_default_value(new ConfigOptionEnum<ImexToolLayout>(ImexToolLayout::FrontLeft));
7080
7081 def = this->add("imex_nozzle_clearance_x", coFloat);
7082 def->label = L("Nozzle Clearance X");
7083 def->tooltip = L("Distance (mm) from the nozzle to the collision-side carriage edge in X. Used to calculate the width of the collision exclusion strip at each X boundary.");
7084 def->sidetext = L("mm");
7085 def->min = 0;
7086 def->mode = comAdvanced;
7087 def->set_default_value(new ConfigOptionFloat(30.0));
7088
7089 def = this->add("imex_nozzle_clearance_y", coFloat);
7090 def->label = L("Nozzle Clearance Y");
7091 def->tooltip = L("Distance (mm) from the nozzle to the collision-side carriage edge in Y. Used to calculate the width of the collision exclusion strip at each Y boundary.");
7092 def->sidetext = L("mm");
7093 def->min = 0;
7094 def->mode = comAdvanced;
7095 def->set_default_value(new ConfigOptionFloat(30.0));
7096
7097 def = this->add("imex_carriage_margin", coFloat);
7098 def->label = L("Safety Margin");
7099 def->tooltip = L("Non-blocking advisory clearance strip (mm) drawn inside the primary zone at each carriage boundary. Parts placed within this strip will still slice; it is a visual reminder to leave extra clearance near the zone edge.");
7100 def->sidetext = L("mm");
7101 def->min = 0;
7102 def->max = 200;
7103 def->mode = comAdvanced;
7104 def->set_default_value(new ConfigOptionFloat(0.0));
7105
7106 def = this->add("imex_viz_theme", coEnum);
7107 def->label = L("Visualization Theme");
7108 def->tooltip = L("Color theme for IDEX/IQEX bed zone visualization. Choose a colorblind-friendly theme if needed.");
7109 def->mode = comAdvanced;
7111 def->enum_values.push_back("standard");
7112 def->enum_values.push_back("deuteranopia");
7113 def->enum_values.push_back("tritanopia");
7114 def->enum_values.push_back("high_contrast");
7115 def->enum_labels.push_back(L("Standard"));
7116 def->enum_labels.push_back(L("Deuteranopia / Protanopia (red-green)"));
7117 def->enum_labels.push_back(L("Tritanopia (blue-yellow)"));
7118 def->enum_labels.push_back(L("High Contrast"));
7119 def->set_default_value(new ConfigOptionEnum<ImexVizTheme>(ImexVizTheme::Standard));
7120
7121 def = this->add("imex_parallel_mode", coString);
7122 def->label = L("IDEX/IQEX Print Mode");
7123 def->tooltip = L("Name of the active IDEX/IQEX parallel print mode, or \"primary\" for single-carriage printing. Requires IDEX/IQEX Printer enabled in the Printer preset (Printer \u2192 Multimaterial \u2192 IDEX/IQEX Configuration).");
7124 def->mode = comAdvanced;
7125 def->set_default_value(new ConfigOptionString("primary"));
7126
7127 def = this->add("imex_head_filament_map", coString);
7128 def->label = L("IDEX/IQEX head filament map");
7129 def->tooltip = L("Per-plate override mapping physical heads to filament slots "
7130 "(1-based). Empty means each head uses the first filament that the "
7131 "printer's physical extruder map routes to it.");
7132 def->mode = comDevelop;
7133 def->set_default_value(new ConfigOptionString(""));
7134
7135 def = this->add("imex_mode_names", coStrings);
7136 def->label = L("IDEX/IQEX Mode Names");
7137 def->tooltip = L("Display names for each user-defined IDEX/IQEX parallel print mode.");
7138 def->mode = comAdvanced;
7139 def->set_default_value(new ConfigOptionStrings());
7140
7141 def = this->add("imex_mode_active_tools", coStrings);
7142 def->label = L("IDEX/IQEX Mode Active Tools");
7143 def->tooltip = L("Tool role assignments for each mode. Format: \"idx:P,idx:C,idx:M\" where P=Primary, C=Copy, M=Mirror (e.g. \"0:P,1:C,2:M,3:M\"). Managed by the IDEX/IQEX Modes editor in the Printer preset.");
7144 def->mode = comAdvanced;
7145 def->set_default_value(new ConfigOptionStrings());
7146
7147 def = this->add("imex_mode_gcodes", coStrings);
7148 def->label = L("IDEX/IQEX Mode G-codes");
7149 def->tooltip = L("G-code or macro call to inject at print start for each mode.");
7150 def->mode = comAdvanced;
7151 def->set_default_value(new ConfigOptionStrings());
7152
7153 def = this->add("manual_filament_change", coBool);
7154 def->label = L("Manual Filament Change");
7155 def->tooltip = L("Enable this option to omit the custom Change filament G-code only at the beginning of the print. "
7156 "The tool change command (e.g., T0) will be skipped throughout the entire print. "
7157 "This is useful for manual multi-material printing, where we use M600/PAUSE to trigger the manual filament change action.");
7158 def->mode = comAdvanced;
7159 def->set_default_value(new ConfigOptionBool(false));
7160
7161 def = this->add("wipe_tower_type", coEnum);
7162 def->label = L("Wipe tower type");
7163 def->tooltip = L("Choose the wipe tower implementation for multi-material prints. Type 1 is recommended for Bambu and Qidi printers with a filament cutter. Type 2 offers better compatibility with multi-tool and MMU printers and provide overall better compatibility.");
7165 def->enum_values.emplace_back("type1");
7166 def->enum_values.emplace_back("type2");
7167 def->enum_labels.emplace_back(L("Type 1"));
7168 def->enum_labels.emplace_back(L("Type 2"));
7169 def->mode = comAdvanced;
7170 def->set_default_value(new ConfigOptionEnum<WipeTowerType>(WipeTowerType::Type2));
7171
7172 def = this->add("purge_in_prime_tower", coBool);
7173 def->label = L("Purge in prime tower");
7174 def->tooltip = L("Purge remaining filament into prime tower.");
7175 def->mode = comAdvanced;
7176 def->set_default_value(new ConfigOptionBool(true));
7177
7178 def = this->add("enable_filament_ramming", coBool);
7179 def->label = L("Enable filament ramming");
7180 def->tooltip = L("Enable filament ramming");
7181 def->mode = comAdvanced;
7182 def->set_default_value(new ConfigOptionBool(true));
7183
7184 def = this->add("tool_change_on_wipe_tower", coBool);
7185 def->label = L("Tool change on wipe tower");
7186 def->tooltip = L("Force the toolhead to travel to the wipe tower before issuing the tool change command (Tx). "
7187 "Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. "
7188 "By default Orca skips the travel on multi-toolhead machines because the firmware handles the head swap, "
7189 "which can result in the Tx command being issued above the printed part. "
7190 "Enable this option if you want the tool change to always be issued above the wipe tower instead.");
7191 def->mode = comAdvanced;
7192 def->set_default_value(new ConfigOptionBool(false));
7193
7194 def = this->add("wait_for_temp_on_wipe_tower", coBool);
7195 def->label = L("Wait for temperature on wipe tower");
7196 def->tooltip = L("Pick up the new tool without waiting for it to reach printing temperature, travel to the wipe "
7197 "tower, and wait for the temperature there, right before purging. Ooze from the heat-up lands on "
7198 "the tower instead of the model, and the travel overlaps with the heating. "
7199 "Only relevant for multi-extruder (multi-toolhead) printers using a Type 2 wipe tower. "
7200 "The firmware or tool change macro must not wait for the temperature itself. "
7201 "When disabled, the temperature wait is issued right after the tool change command.");
7202 def->mode = comAdvanced;
7203 def->set_default_value(new ConfigOptionBool(false));
7204
7205
7206 def = this->add("wipe_tower_no_sparse_layers", coBool);
7207 def->label = L("No sparse layers (beta)");
7208 def->tooltip = L("If enabled, the wipe tower will not be printed on layers with no tool changes. "
7209 "On layers with a tool change, extruder will travel downward to print the wipe tower, "
7210 "so the tower ends up below the model and the toolhead has to reach down to it. "
7211 "Layouts where that would collide with an already printed object are rejected. "
7212 "Has no effect with smooth timelapse or clumping detection, which need a tower on every layer.");
7213 def->mode = comAdvanced;
7214 def->set_default_value(new ConfigOptionBool(false));
7215
7216 def = this->add("wipe_tower_sparse_layers_combination", coBool);
7217 def->label = L("Combine sparse layers");
7218 def->tooltip = L("If enabled, consecutive layers on which the prime tower has no filament change are printed as a single "
7219 "thicker tower layer instead of one thin layer each, the same way infill combination merges sparse infill. "
7220 "The merged layer is printed at the top of the run, at the height of everything it covers.\n\n"
7221 "Only whole layers are merged, and never past the maximum layer height of the nozzle printing the tower "
7222 "(three quarters of the nozzle diameter when that is left at 0). Two or more layers therefore have to fit "
7223 "under that limit before anything changes at all: at a 0.2 mm layer height under a 0.3 mm maximum nothing "
7224 "is merged, while at 0.1 mm three layers become one.\n\n"
7225 "Unlike \"No sparse layers\" the tower keeps following the model, so the toolhead never has to reach down to it. "
7226 "Has no effect with \"No sparse layers\", smooth timelapse or clumping detection, which need a tower on every layer.");
7227 def->mode = comAdvanced;
7228 def->set_default_value(new ConfigOptionBool(false));
7229
7230 def = this->add("single_extruder_multi_material_priming", coBool);
7231 def->label = L("Prime all printing extruders");
7232 def->tooltip = L("If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print.");
7233 def->mode = comAdvanced;
7234 def->set_default_value(new ConfigOptionBool(false));
7235
7236 def = this->add("toolchange_ordering", coEnum);
7237 def->label = L("Toolchange ordering");
7238 def->category = L("Advanced");
7239 def->tooltip = L(
7240 "Determines the order of tool changes on each layer.\n"
7241 "- Default: Starts with the last used extruder to minimize tool changes.\n"
7242 "- Cyclic: Uses a fixed tool sequence each layer. This sacrifices speed for better surface quality, as the extra toolchanges allow layers more time to cool."
7243 );
7244 def->mode = comAdvanced;
7246 def->enum_values.emplace_back("default");
7247 def->enum_values.emplace_back("cyclic");
7248 def->enum_labels.emplace_back(L("Default"));
7249 def->enum_labels.emplace_back(L("Cyclic"));
7250 def->set_default_value(new ConfigOptionEnum<ToolChangeOrderingType>(ToolChangeOrderingType::Default));
7251
7252 def = this->add("toolchange_cyclic_order", coString);
7253 def->label = L("Cyclic order");
7254 def->category = L("Advanced");
7255 def->tooltip = L(
7256 "Custom filament sequence used by the cyclic toolchange ordering, as filament numbers separated by commas (e.g. \"3,2,1,4\").\n"
7257 "Each layer prints its filaments following this sequence; filaments not listed are printed last, in ascending order.\n"
7258 "Leave empty to cycle through the filaments in ascending order."
7259 );
7260 def->mode = comExpert;
7261 def->set_default_value(new ConfigOptionString(""));
7262
7263 def = this->add("toolchange_cyclic_first_layer", coBool);
7264 def->label = L("Apply cyclic order to first layer");
7265 def->category = L("Advanced");
7266 def->tooltip = L(
7267 "Applies the cyclic toolchange order to the first layer as well.\n"
7268 "By default this is disabled, because the first layer is instead ordered for the best bed "
7269 "adhesion: filaments that print small, fragile first-layer features are printed last, so the "
7270 "following tool changes and travel moves are less likely to knock those weakly anchored parts "
7271 "loose. This first-layer order also honors a custom first layer filament sequence when one is set. "
7272 "The cyclic order's benefit (extra tool changes give each layer more time to cool) does not apply "
7273 "to the first layer, which is printed slowly and hot for adhesion.\n"
7274 "Enable this only if you need the exact same tool sequence on every layer, including the first, at "
7275 "the cost of that adhesion optimization."
7276 );
7277 def->mode = comExpert;
7278 def->set_default_value(new ConfigOptionBool(false));
7279
7280 def = this->add("slice_closing_radius", coFloat);
7281 def->label = L("Slice gap closing radius");
7282 def->category = L("Quality");
7283 def->tooltip = L("Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. "
7284 "The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low.");
7285 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7286 def->min = 0;
7287 def->mode = comAdvanced;
7288 def->set_default_value(new ConfigOptionFloat(0.049));
7289
7290 def = this->add("slicing_mode", coEnum);
7291 def->label = L("Slicing Mode");
7292 def->category = L("Others");
7293 def->tooltip = L("Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model.");
7294 def->enum_keys_map = &ConfigOptionEnum<SlicingMode>::get_enum_values();
7295 def->enum_values.push_back("regular");
7296 def->enum_values.push_back("even_odd");
7297 def->enum_values.push_back("close_holes");
7298 def->enum_labels.push_back(L("Regular"));
7299 def->enum_labels.push_back(L("Even-odd"));
7300 def->enum_labels.push_back(L("Close holes"));
7301 def->mode = comAdvanced;
7302 def->set_default_value(new ConfigOptionEnum<SlicingMode>(SlicingMode::Regular));
7303
7304 def = this->add("z_offset", coFloat);
7305 def->label = L("Z offset");
7306 def->tooltip = L("This value will be added (or subtracted) from all the Z coordinates "
7307 "in the output G-code. It is used to compensate for bad Z endstop position: "
7308 "for example, if your endstop zero actually leaves the nozzle 0.3mm far "
7309 "from the print bed, set this to -0.3 (or fix your endstop).");
7310 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7311 def->mode = comAdvanced;
7312 def->set_default_value(new ConfigOptionFloat(0));
7313
7314 def = this->add("enable_support", coBool);
7315 //BBS: remove material behind support
7316 def->label = L("Enable support");
7317 def->category = L("Support");
7318 def->tooltip = L("This enables support generation.");
7319 def->set_default_value(new ConfigOptionBool(false));
7320
7321 def = this->add("support_type", coEnum);
7322 def->label = L("Type");
7323 def->category = L("Support");
7324 def->tooltip = L("Normal (auto) and Tree (auto) are used to generate support automatically. "
7325 "If Normal (manual) or Tree (manual) is selected, only support enforcers are generated.");
7326 def->enum_keys_map = &ConfigOptionEnum<SupportType>::get_enum_values();
7327 def->enum_values.push_back("normal(auto)");
7328 def->enum_values.push_back("tree(auto)");
7329 def->enum_values.push_back("normal(manual)");
7330 def->enum_values.push_back("tree(manual)");
7331 def->enum_labels.push_back(L("Normal (auto)"));
7332 def->enum_labels.push_back(L("Tree (auto)"));
7333 def->enum_labels.push_back(L("Normal (manual)"));
7334 def->enum_labels.push_back(L("Tree (manual)"));
7335 def->mode = comSimple;
7336 def->set_default_value(new ConfigOptionEnum<SupportType>(stNormalAuto));
7337
7338 def = this->add("support_object_xy_distance", coFloat);
7339 def->label = L("Support/object XY distance");
7340 def->category = L("Support");
7341 def->tooltip = L("This controls the XY separation between an object and its support.");
7342 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7343 def->min = 0;
7344 def->max = 10;
7345 def->mode = comAdvanced;
7346 //Support with too small spacing may touch the object and difficult to remove.
7347 def->set_default_value(new ConfigOptionFloat(0.35));
7348
7349 def = this->add("support_object_first_layer_gap", coFloat);
7350 def->label = L("Support/object first layer gap");
7351 def->category = L("Support");
7352 def->tooltip = L("XY separation between an object and its support at the first layer.");
7353 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7354 def->min = 0;
7355 def->max = 10;
7356 def->mode = comAdvanced;
7357 //Support with too small spacing may touch the object and difficult to remove.
7358 def->set_default_value(new ConfigOptionFloat(0.2));
7359
7360 def = this->add("support_angle", coFloat);
7361 def->label = L("Pattern angle");
7362 def->category = L("Support");
7363 def->tooltip = L("Use this setting to rotate the support pattern on the horizontal plane.");
7364 def->sidetext = u8"°"; // degrees, don't need translation
7365 def->min = 0;
7366 def->max = 359;
7367 def->mode = comAdvanced;
7368 def->set_default_value(new ConfigOptionFloat(0));
7369
7370 def = this->add("support_on_build_plate_only", coBool);
7371 def->label = L("On build plate only");
7372 def->category = L("Support");
7373 def->tooltip = L("This setting only generates supports that begin on the build plate.");
7374 def->mode = comSimple;
7375 def->set_default_value(new ConfigOptionBool(false));
7376
7377 // BBS
7378 def = this->add("support_critical_regions_only", coBool);
7379 def->label = L("Support critical regions only");
7380 def->category = L("Support");
7381 def->tooltip = L("Only create support for critical regions including sharp tail, cantilever, etc.");
7382 def->mode = comAdvanced;
7383 def->set_default_value(new ConfigOptionBool(false));
7384
7385 def = this->add("support_remove_small_overhang", coBool);
7386 def->label = L("Ignore small overhangs");
7387 def->category = L("Support");
7388 def->tooltip = L("Ignore small overhangs that possibly don't require support.");
7389 def->mode = comAdvanced;
7390 def->set_default_value(new ConfigOptionBool(true));
7391
7392 // BBS: change type to common float.
7393 // It may be rounded to mulitple layer height when independent_support_layer_height is false.
7394 def = this->add("support_top_z_distance", coFloat);
7395 //def->gui_type = ConfigOptionDef::GUIType::f_enum_open;
7396 def->label = L("Top Z distance");
7397 def->min = 0;
7398 def->category = L("Support");
7399 def->tooltip = L("Z gap between the support\'s top and object.");
7400 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7401// def->min = 0;
7402#if 0
7403 //def->enum_values.push_back("0");
7404 //def->enum_values.push_back("0.1");
7405 //def->enum_values.push_back("0.2");
7406 //def->enum_labels.push_back(L("0 (soluble)"));
7407 //def->enum_labels.push_back(L("0.1 (semi-detachable)"));
7408 //def->enum_labels.push_back(L("0.2 (detachable)"));
7409#endif
7410 def->mode = comAdvanced;
7411 def->set_default_value(new ConfigOptionFloat(0.2));
7412
7413 def = this->add("support_bottom_z_distance", coFloat);
7414 def->label = L("Bottom Z distance");
7415 def->category = L("Support");
7416 def->tooltip = L("Z gap between the object and the support bottom. If Support Top Z Distance is 0 and the bottom has interface layers, this value is ignored and the support is printed in direct contact with the object (no gap).");
7417 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7418 def->min = 0;
7419 def->mode = comAdvanced;
7420 def->set_default_value(new ConfigOptionFloat(0.2));
7421
7422 def = this->add("enforce_support_layers", coInt);
7423 //def->label = L("Enforce support for the first");
7424 def->category = L("Support");
7425 //def->tooltip = L("Generate support material for the specified number of layers counting from bottom, "
7426 // "regardless of whether normal support material is enabled or not and regardless "
7427 // "of any angle threshold. This is useful for getting more adhesion of objects "
7428 // "having a very thin or poor footprint on the build plate.");
7429 def->sidetext = L("layers");
7430 //def->full_label = L("Enforce support for the first n layers");
7431 def->min = 0;
7432 def->max = 5000;
7433 def->mode = comDevelop;
7434 def->set_default_value(new ConfigOptionInt(0));
7435
7436 def = this->add("support_filament", coInt);
7438 def->label = L("Support/raft base");
7439 def->category = L("Support");
7440 def->tooltip = L("Filament to print support base and raft.\n\"Default\" means no specific filament for support and current filament is used.");
7441 def->min = 0;
7442 def->mode = comSimple;
7443 def->set_default_value(new ConfigOptionInt(0));
7444
7445 def = this->add("support_interface_not_for_body",coBool);
7446 def->label = L("Avoid interface filament for base");
7447 def->category = L("Support");
7448 def->tooltip = L("Avoid using support interface filament to print support base if possible.");
7449 def->mode = comSimple;
7450 def->set_default_value(new ConfigOptionBool(true));
7451
7452 def = this->add("support_line_width", coFloatOrPercent);
7453 def->label = L("Support");
7454 def->category = L("Quality");
7455 def->tooltip = L("Line width of support. If expressed as a %, it will be computed over the nozzle diameter.");
7456 def->sidetext = L("mm or %");
7457 def->ratio_over = "nozzle_diameter";
7458 def->min = 0;
7459 def->max = 1000;
7460 def->max_literal = 10;
7461 def->mode = comAdvanced;
7462 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
7463
7464 def = this->add("support_interface_loop_pattern", coBool);
7465 def->label = L("Loop pattern interface");
7466 def->category = L("Support");
7467 def->tooltip = L("This covers the top contact layer of the supports with loops. It is disabled by default.");
7468 def->mode = comAdvanced;
7469 def->set_default_value(new ConfigOptionBool(false));
7470
7471 def = this->add("support_interface_filament", coInt);
7473 def->label = L("Support/raft interface");
7474 def->category = L("Support");
7475 def->tooltip = L("Filament to print support interface.\n\"Default\" means no specific filament for support interface and current filament is used.");
7476 def->min = 0;
7477 // BBS
7478 def->mode = comSimple;
7479 def->set_default_value(new ConfigOptionInt(0));
7480
7481 auto support_interface_top_layers = def = this->add("support_interface_top_layers", coInt);
7483 def->label = L("Top interface layers");
7484 def->category = L("Support");
7485 def->tooltip = L("This is the number of top interface layers.");
7486 def->sidetext = L("layers");
7487 def->min = 0;
7488 def->enum_values.push_back("0");
7489 def->enum_values.push_back("1");
7490 def->enum_values.push_back("2");
7491 def->enum_values.push_back("3");
7492 def->enum_labels.push_back("0");
7493 def->enum_labels.push_back("1");
7494 def->enum_labels.push_back("2");
7495 def->enum_labels.push_back("3");
7496 def->mode = comAdvanced;
7497 def->set_default_value(new ConfigOptionInt(3));
7498
7499 def = this->add("support_interface_bottom_layers", coInt);
7501 def->label = L("Bottom interface layers");
7502 def->category = L("Support");
7503 def->tooltip = L("Number of bottom interface layers.");
7504 def->sidetext = L("layers");
7505 def->min = -1;
7506 def->enum_values.push_back("-1");
7507 append(def->enum_values, support_interface_top_layers->enum_values);
7508 def->enum_labels.push_back(L("Same as top"));
7509 append(def->enum_labels, support_interface_top_layers->enum_labels);
7510 def->mode = comAdvanced;
7511 def->set_default_value(new ConfigOptionInt(0));
7512
7513 def = this->add("support_interface_spacing", coFloat);
7514 def->label = L("Top interface spacing");
7515 def->category = L("Support");
7516 def->tooltip = L("Spacing of interface lines. Zero means solid interface.\n"
7517 "Force using solid interface when support ironing is enabled.");
7518 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7519 def->min = 0;
7520 def->mode = comAdvanced;
7521 def->set_default_value(new ConfigOptionFloat(0.5));
7522
7523 //BBS
7524 def = this->add("support_bottom_interface_spacing", coFloat);
7525 def->label = L("Bottom interface spacing");
7526 def->category = L("Support");
7527 def->tooltip = L("This is the spacing of bottom interface lines. 0 means solid interface.");
7528 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7529 def->min = 0;
7530 def->mode = comAdvanced;
7531 def->set_default_value(new ConfigOptionFloat(0.5));
7532
7533 def = this->add("support_interface_speed", coFloats);
7534 def->label = L("Support interface");
7535 def->category = L("Speed");
7536 def->tooltip = L("This is the speed for support interfaces.");
7537 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
7538 def->min = 1;
7539 def->mode = comAdvanced;
7540 def->nullable = true;
7541 def->set_default_value(new ConfigOptionFloatsNullable{80});
7542
7543 def = this->add("support_base_pattern", coEnum);
7544 def->label = L("Base pattern");
7545 def->category = L("Support");
7546 def->tooltip = L("Line pattern of support.\n\n"
7547 "The Default option for Tree supports is Hollow, which means no base pattern. "
7548 "For other support types, the Default option is the Rectilinear pattern.\n\n"
7549 "NOTE: For Organic supports, the two walls are supported only with the Hollow/Default base pattern. "
7550 "The Lightning base pattern is supported only by Tree Slim/Strong/Hybrid supports. "
7551 "For the other support types, the Rectilinear will be used instead of Lightning.");
7553 def->enum_values.push_back("default");
7554 def->enum_values.push_back("rectilinear");
7555 def->enum_values.push_back("rectilinear-grid");
7556 def->enum_values.push_back("honeycomb");
7557 def->enum_values.push_back("lightning");
7558 def->enum_values.push_back("hollow");
7559 def->enum_labels.push_back(L("Default"));
7560 def->enum_labels.push_back(L("Rectilinear"));
7561 def->enum_labels.push_back(L("Rectilinear grid"));
7562 def->enum_labels.push_back(L("Honeycomb"));
7563 def->enum_labels.push_back(L("Lightning"));
7564 def->enum_labels.push_back(L("Hollow"));
7565 def->mode = comAdvanced;
7566 def->set_default_value(new ConfigOptionEnum<SupportMaterialPattern>(smpDefault));
7567
7568 def = this->add("support_interface_pattern", coEnum);
7569 def->label = L("Interface pattern");
7570 def->category = L("Support");
7571 def->tooltip = L("This is the line pattern for support interfaces. The default pattern for non-soluble support interfaces is Rectilinear while the default pattern for soluble support interfaces is Concentric.");
7573 def->enum_values.push_back("auto");
7574 def->enum_values.push_back("rectilinear");
7575 def->enum_values.push_back("concentric");
7576 def->enum_values.push_back("spiralinset");
7577 def->enum_values.push_back("rectilinear_interlaced");
7578 def->enum_values.push_back("grid");
7579 def->enum_labels.push_back(L("Default"));
7580 def->enum_labels.push_back(L("Rectilinear"));
7581 def->enum_labels.push_back(L("Concentric"));
7582 def->enum_labels.push_back(L("Spiral Inset"));
7583 def->enum_labels.push_back(L("Rectilinear Interlaced"));
7584 def->enum_labels.push_back(L("Grid"));
7585 def->mode = comAdvanced;
7586 def->set_default_value(new ConfigOptionEnum<SupportMaterialInterfacePattern>(smipAuto));
7587
7588 def = this->add("support_base_pattern_spacing", coFloat);
7589 def->label = L("Base pattern spacing");
7590 def->category = L("Support");
7591 def->tooltip = L("This determines the spacing between support lines.");
7592 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7593 def->min = 0;
7594 def->mode = comAdvanced;
7595 def->set_default_value(new ConfigOptionFloat(2.5));
7596
7597 def = this->add("support_expansion", coFloat);
7598 def->label = L("Normal support expansion");
7599 def->category = L("Support");
7600 def->tooltip = L("Expand (+) or shrink (-) the horizontal span of normal support.");
7601 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7602 def->mode = comAdvanced;
7603 def->set_default_value(new ConfigOptionFloat(0));
7604
7605 def = this->add("support_speed", coFloats);
7606 def->label = L("Support");
7607 def->category = L("Speed");
7608 def->tooltip = L("This is the speed for support.");
7609 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
7610 def->min = 1;
7611 def->mode = comAdvanced;
7612 def->nullable = true;
7613 def->set_default_value(new ConfigOptionFloatsNullable{ 80 });
7614
7615 def = this->add("support_style", coEnum);
7616 def->label = L("Style");
7617 def->category = L("Support");
7618 def->tooltip = L("Style and shape of the support. For normal support, projecting the supports into a regular grid "
7619 "will create more stable supports (default), while snug support towers will save material and reduce "
7620 "object scarring.\n"
7621 "For tree support, slim and organic style will merge branches more aggressively and save "
7622 "a lot of material (default organic), while hybrid style will create similar structure to normal support "
7623 "under large flat overhangs.");
7625 def->enum_values.push_back("default");
7626 def->enum_values.push_back("grid");
7627 def->enum_values.push_back("snug");
7628 def->enum_values.push_back("organic");
7629 def->enum_values.push_back("tree_slim");
7630 def->enum_values.push_back("tree_strong");
7631 def->enum_values.push_back("tree_hybrid");
7632 def->enum_labels.push_back(L("Default (Grid/Organic)"));
7633 def->enum_labels.push_back(L("Grid"));
7634 def->enum_labels.push_back(L("Snug"));
7635 def->enum_labels.push_back(L("Organic"));
7636 def->enum_labels.push_back(L("Tree Slim"));
7637 def->enum_labels.push_back(L("Tree Strong"));
7638 def->enum_labels.push_back(L("Tree Hybrid"));
7639
7640 def->mode = comAdvanced;
7641 def->set_default_value(new ConfigOptionEnum<SupportMaterialStyle>(smsDefault));
7642
7643 def = this->add("independent_support_layer_height", coBool);
7644 def->label = L("Independent support layer height");
7645 def->category = L("Support");
7646 def->tooltip = L("Support layer uses layer height independent with object layer. This is to support customizing Z-gap and save print time. "
7647 "This option will be invalid when the prime tower is enabled.");
7648 def->mode = comAdvanced;
7649 def->set_default_value(new ConfigOptionBool(true));
7650
7651 def = this->add("support_threshold_angle", coInt);
7652 def->label = L("Threshold angle");
7653 def->category = L("Support");
7654 def->tooltip = L("Support will be generated for overhangs whose slope angle is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support.\nNote: If set to 0, normal supports use the Threshold overlap instead, while tree supports fall back to a default value of 30.");
7655 def->sidetext = u8"°"; // degrees, don't need translation
7656 def->min = 0;
7657 def->max = 90;
7658 def->mode = comSimple;
7659 def->set_default_value(new ConfigOptionInt(30));
7660
7661 def = this->add("support_threshold_overlap", coFloatOrPercent);
7662 def->label = L("Threshold overlap");
7663 def->category = L("Support");
7664 def->tooltip = L("If threshold angle is zero, support will be generated for overhangs whose overlap is below the threshold. The smaller this value is, the steeper the overhang that can be printed without support.");
7665 def->sidetext = L("mm or %");
7666 def->min = 0;
7667 def->max = 100;
7668 def->max_literal = 0.5;
7669 def->mode = comSimple;
7670 def->set_default_value(new ConfigOptionFloatOrPercent(50., true));
7671
7672 def = this->add("build_plate_tilt_x", coFloat);
7673 def->label = L("Build plate tilt X");
7674 def->category = L("Support");
7675 def->tooltip = L("Tilt angle of the build plate along the X axis. "
7676 "A positive value tilts the plate so the +X side is higher, shifting gravity toward -X and increasing overhangs on the +X side. "
7677 "A negative value tilts the -X side higher. Set to 0 for no X-axis tilt. "
7678 "In belt printer mode, this is automatically synced to the belt angle.");
7679 def->sidetext = u8"\u00B0";
7680 def->min = -89;
7681 def->max = 89;
7682 def->mode = comExpert;
7683 def->set_default_value(new ConfigOptionFloat(0.));
7684
7685 def = this->add("build_plate_tilt_y", coFloat);
7686 def->label = L("Build plate tilt Y");
7687 def->category = L("Support");
7688 def->tooltip = L("Tilt angle of the build plate along the Y axis. "
7689 "A positive value tilts the plate so the +Y side is higher, shifting gravity toward -Y and increasing overhangs on the +Y side. "
7690 "A negative value tilts the -Y side higher. Set to 0 for no Y-axis tilt.");
7691 def->sidetext = u8"\u00B0";
7692 def->min = -89;
7693 def->max = 89;
7694 def->mode = comExpert;
7695 def->set_default_value(new ConfigOptionFloat(0.));
7696
7697 def = this->add("belt_printer", coBool);
7698 def->label = L("Enable belt printing");
7699 def->category = L("Printable space");
7700 def->tooltip = L("Enable belt printer mode. Belt printers use a conveyor belt as the build surface, "
7701 "tilted at an angle (typically 45 degrees). The slicer will rotate the slicing plane "
7702 "and transform G-code coordinates for the tilted build surface.");
7703 def->mode = comAdvanced;
7704 def->set_default_value(new ConfigOptionBool(false));
7705
7706 def = this->add("belt_printer_infinite_y", coBool);
7707 def->label = L("Infinite Y axis");
7708 def->category = L("Printable space");
7709 def->tooltip = L("Enable infinite Y axis for belt printers. "
7710 "When enabled, the Y axis build volume limit is effectively removed, "
7711 "allowing objects of any length to be printed along the belt direction.");
7712 def->mode = comAdvanced;
7713 def->set_default_value(new ConfigOptionBool(true));
7714
7715 // Mesh rotation applied before slicing — the sole mesh-side belt transform AND
7716 // the single source of truth for the physical belt tilt (bed rendering, support
7717 // gravity tilt and bed-exclusion projection all derive their angle from this).
7718 def = this->add("belt_slice_rotation", coEnum);
7719 def->label = L("Belt tilt axis");
7720 def->category = L("Printable space");
7721 def->tooltip = L("Axis the mesh is rotated about before slicing. This is the belt "
7722 "printer's tilt: an isometric (no distortion) rotation that also "
7723 "drives bed rendering and support gravity tilt, and that the G-code "
7724 "back-transform inverts before the machine-frame shear/scale and remap. "
7725 "X is the typical gantry tilt (belt travels along Y).");
7727 def->enum_values = {"none", "x", "y", "z"};
7728 def->enum_labels = {L("None"), L("X"), L("Y"), L("Z")};
7729 def->mode = comDevelop;
7730 def->set_default_value(new ConfigOptionEnum<BeltRotationAxis>(BeltRotationAxis::X));
7731
7732 def = this->add("belt_slice_rotation_angle", coFloat);
7733 def->label = L("Belt tilt angle");
7734 def->category = L("Printable space");
7735 def->tooltip = L("Tilt angle of the belt surface, in degrees. Most belt printers use "
7736 "45°. Positive values rotate counter-clockwise looking down the "
7737 "positive tilt axis; the magnitude is also the physical belt tilt "
7738 "used for bed rendering and support gravity.");
7739 def->sidetext = L("°");
7740 def->min = -180.;
7741 def->max = 180.;
7742 def->mode = comAdvanced;
7743 def->set_default_value(new ConfigOptionFloat(45.));
7744
7745 def = this->add("belt_frame_tilt_decouple", coBool);
7746 def->label = L("Decouple machine-frame tilt");
7747 def->category = L("Printable space");
7748 def->tooltip = L("Expert override: set the machine-frame (G-code shear/scale) tilt angle "
7749 "independently of the pre-slice rotation angle. When disabled, the "
7750 "machine-frame transform is derived from the belt tilt angle, so a single "
7751 "angle drives both stages. Enable only to compensate for a machine whose "
7752 "physical gantry tilt differs from the slicing rotation.");
7753 def->mode = comExpert;
7754 def->set_default_value(new ConfigOptionBool(false));
7755
7756 def = this->add("belt_frame_tilt_angle", coFloat);
7757 def->label = L("Machine-frame tilt angle");
7758 def->category = L("Printable space");
7759 def->tooltip = L("Tilt angle (degrees) used to derive the machine-frame shear (cot) and "
7760 "scale (1/|sin|) applied to G-code. Only used when 'Decouple machine-frame "
7761 "tilt' is enabled; otherwise the belt tilt angle is used.");
7762 def->sidetext = L("°");
7763 def->min = -89.9;
7764 def->max = 89.9;
7765 def->mode = comExpert;
7766 def->set_default_value(new ConfigOptionFloat(45.));
7767
7768 // G-code axis remap with sign. Each field is its own row in the settings tab. The
7769 // labels and tooltips are literals in L() so they are extracted for translation.
7770 auto add_belt_remap = [this](const char *key, const std::string &label, const std::string &tooltip,
7771 RemapAxis default_axis, ConfigOptionMode mode) {
7772 auto def = this->add(key, coEnum);
7773 def->label = label;
7774 def->category = L("Printable space");
7775 def->tooltip = tooltip;
7776 def->enum_keys_map = &ConfigOptionEnum<RemapAxis>::get_enum_values();
7777 def->enum_values = {"pos_x", "pos_y", "pos_z", "neg_x", "neg_y", "neg_z", "rev_x", "rev_y", "rev_z"};
7778 def->enum_labels = {L("+X"), L("+Y"), L("+Z"), L("-X"), L("-Y"), L("-Z"), L("Rev X"), L("Rev Y"), L("Rev Z")};
7779 def->mode = mode; // Visibility may also be gated by toggle_line in Tab.cpp
7780 def->set_default_value(new ConfigOptionEnum<RemapAxis>(default_axis));
7781 };
7782 add_belt_remap("gcode_remap_x", L("G-code remap X"),
7783 L("Which slicing axis maps to machine X in G-code output. Applied AFTER slicing, during G-code generation."),
7785 add_belt_remap("gcode_remap_y", L("G-code remap Y"),
7786 L("Which slicing axis maps to machine Y in G-code output. Applied AFTER slicing, during G-code generation."),
7788 add_belt_remap("gcode_remap_z", L("G-code remap Z"),
7789 L("Which slicing axis maps to machine Z in G-code output. Applied AFTER slicing, during G-code generation."),
7791
7792 // The machine-frame G-code transform (shear + scale) is no longer configured
7793 // by per-axis keys: it is derived from the belt tilt (belt_slice_rotation axis
7794 // + angle, or belt_frame_tilt_angle when decoupled) in MachineFrameTransform.
7795
7796 // Belt support floor debug controls
7797 def = this->add("belt_support_floor_offset", coFloat);
7798 def->label = L("Support Floor Z offset");
7799 def->category = L("Printable space");
7800 def->tooltip = L("Shifts the computed belt floor up or down (mm). Negative values lower the floor, allowing more supports to survive. Use this to diagnose belt floor formula issues.");
7801 def->sidetext = L("mm");
7802 def->min = -500;
7803 def->max = 500;
7804 def->mode = comAdvanced;
7805 def->set_default_value(new ConfigOptionFloat(0));
7806
7807 def = this->add("enable_belt_purge_tower", coBool);
7808 def->label = L("Enable belt purge tower");
7809 def->category = L("Multimaterial");
7810 def->tooltip = L("Belt-printer replacement for the wipe/prime tower. When enabled on a belt "
7811 "printer, a purge prism is automatically generated next to the printed parts "
7812 "and filament-change purging is routed into it (the classic wipe tower cannot "
7813 "be used on belt printers because its G-code bypasses the belt transform). "
7814 "Only available on belt printers.");
7815 def->mode = comAdvanced;
7816 def->set_default_value(new ConfigOptionBool(false));
7817
7818 def = this->add("belt_purge_tower_width", coFloat);
7819 def->label = L("Belt purge tower width");
7820 def->category = L("Printable space");
7821 def->tooltip = L("Width (machine X, across the belt) of the purge prism that is automatically "
7822 "generated on belt printers when the belt purge tower is enabled and multiple "
7823 "filaments are used. Filament-change purging is routed into this prism's "
7824 "extrusions instead of a classic wipe tower. Its height is computed "
7825 "automatically from the worst-case purge volume per layer: a wider prism "
7826 "results in a shorter one.");
7827 def->sidetext = L("mm");
7828 def->min = 1.;
7829 def->mode = comAdvanced;
7830 def->set_default_value(new ConfigOptionFloat(35.));
7831
7832 def = this->add("tree_support_branch_angle", coFloat);
7833 def->label = L("Tree support branch angle");
7834 def->category = L("Support");
7835 def->tooltip = L("This setting determines the maximum overhang angle that the branches of tree support are allowed to make. "
7836 "If the angle is increased, the branches can be printed more horizontally, allowing them to reach farther.");
7837 def->sidetext = u8"°"; // degrees, don't need translation
7838 def->min = 0;
7839 def->max = 60;
7840 def->mode = comAdvanced;
7841 def->set_default_value(new ConfigOptionFloat(40.));
7842
7843 def = this->add("tree_support_branch_angle_organic", coFloat);
7844 def->label = L("Tree support branch angle");
7845 def->category = L("Support");
7846 def->tooltip = L("This setting determines the maximum overhang angle that the branches of tree support are allowed to make. "
7847 "If the angle is increased, the branches can be printed more horizontally, allowing them to reach farther.");
7848 def->sidetext = u8"°"; // degrees, don't need translation
7849 def->min = 0;
7850 def->max = 60;
7851 def->mode = comAdvanced;
7852 def->set_default_value(new ConfigOptionFloat(40.));
7853
7854 def = this->add("tree_support_angle_slow", coFloat);
7855 def->label = L("Preferred Branch Angle");
7856 def->category = L("Support");
7857 // TRN PrintSettings: "Organic supports" > "Preferred Branch Angle"
7858 def->tooltip = L("The preferred angle of the branches, when they do not have to avoid the model. "
7859 "Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster.");
7860 def->sidetext = u8"°"; // degrees, don't need translation
7861 def->min = 10;
7862 def->max = 85;
7863 def->mode = comAdvanced;
7864 def->set_default_value(new ConfigOptionFloat(25));
7865
7866 def = this->add("tree_support_branch_distance", coFloat);
7867 def->label = L("Tree support branch distance");
7868 def->category = L("Support");
7869 def->tooltip = L("This setting determines the distance between neighboring tree support nodes.");
7870 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7871 def->min = 1.0;
7872 def->max = 10;
7873 def->mode = comAdvanced;
7874 def->set_default_value(new ConfigOptionFloat(5.));
7875
7876 def = this->add("tree_support_branch_distance_organic", coFloat);
7877 def->label = L("Tree support branch distance");
7878 def->category = L("Support");
7879 def->tooltip = L("This setting determines the distance between neighboring tree support nodes.");
7880 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7881 def->min = 1.0;
7882 def->max = 10;
7883 def->mode = comAdvanced;
7884 def->set_default_value(new ConfigOptionFloat(1.));
7885
7886 def = this->add("tree_support_top_rate", coPercent);
7887 def->label = L("Branch Density");
7888 def->category = L("Support");
7889 // TRN PrintSettings: "Organic supports" > "Branch Density"
7890 def->tooltip = L("Adjusts the density of the support structure used to generate the tips of the branches. "
7891 "A higher value results in better overhangs but the supports are harder to remove, "
7892 "thus it is recommended to enable top support interfaces instead of a high branch density value "
7893 "if dense interfaces are needed.");
7894 def->sidetext = "%";
7895 def->min = 5;
7896 def->max_literal = 35;
7897 def->mode = comAdvanced;
7898 def->set_default_value(new ConfigOptionPercent(30));
7899
7900 def = this->add("tree_support_auto_brim", coBool);
7901 def->label = L("Auto brim width");
7902 def->category = L("Quality");
7903 def->tooltip = L("Enabling this option means the width of the brim for tree support will be automatically calculated.");
7904 def->set_default_value(new ConfigOptionBool(1));
7905
7906 def = this->add("tree_support_brim_width", coFloat);
7907 def->label = L("Tree support brim width");
7908 def->category = L("Quality");
7909 def->min = 0.0;
7910 def->tooltip = L("Distance from tree branch to the outermost brim line.");
7911 def->set_default_value(new ConfigOptionFloat(3));
7912
7913 def = this->add("tree_support_tip_diameter", coFloat);
7914 def->label = L("Tip Diameter");
7915 def->category = L("Support");
7916 // TRN PrintSettings: "Organic supports" > "Tip Diameter"
7917 def->tooltip = L("Branch tip diameter for organic supports.");
7918 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7919 def->min = 0.1f;
7920 def->max = 100.f;
7921 def->mode = comAdvanced;
7922 def->set_default_value(new ConfigOptionFloat(0.8));
7923
7924 def = this->add("tree_support_branch_diameter", coFloat);
7925 def->label = L("Tree support branch diameter");
7926 def->category = L("Support");
7927 def->tooltip = L("This setting determines the initial diameter of support nodes.");
7928 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7929 def->min = 1.0;
7930 def->max = 10;
7931 def->mode = comAdvanced;
7932 def->set_default_value(new ConfigOptionFloat(5.));
7933
7934 def = this->add("tree_support_branch_diameter_angle", coFloat);
7935 // TRN PrintSettings: #lmFIXME
7936 def->label = L("Branch Diameter Angle");
7937 def->category = L("Support");
7938 // TRN PrintSettings: "Organic supports" > "Branch Diameter Angle"
7939 def->tooltip = L("The angle of the branches' diameter as they gradually become thicker towards the bottom. "
7940 "An angle of 0 will cause the branches to have uniform thickness over their length. "
7941 "A bit of an angle can increase stability of the organic support.");
7942 def->sidetext = u8"°"; // degrees, don't need translation
7943 def->min = 0;
7944 def->max = 15;
7945 def->mode = comAdvanced;
7946 def->set_default_value(new ConfigOptionFloat(5));
7947
7948 def = this->add("tree_support_branch_diameter_organic", coFloat);
7949 def->label = L("Tree support branch diameter");
7950 def->category = L("Support");
7951 def->tooltip = L("This setting determines the initial diameter of support nodes.");
7952 def->sidetext = L("mm"); // millimeters, CIS languages need translation
7953 def->min = 1.0;
7954 def->max = 10;
7955 def->mode = comAdvanced;
7956 def->set_default_value(new ConfigOptionFloat(2.));
7957
7958 def = this->add("tree_support_wall_count", coInt);
7959 def->label = L("Support wall loops");
7960 def->category = L("Support");
7961 def->tooltip = L("This setting specifies the count of support walls in the range of [0,2]. 0 means auto.");
7962 def->min = 0;
7963 def->max = 2;
7964 def->mode = comAdvanced;
7965 def->set_default_value(new ConfigOptionInt(0));
7966
7967 def = this->add("tree_support_with_infill", coBool);
7968 def->label = L("Tree support with infill");
7969 def->category = L("Support");
7970 def->tooltip = L("This setting specifies whether to add infill inside large hollows of tree support.");
7971 def->mode = comAdvanced;
7972 def->set_default_value(new ConfigOptionBool(false));
7973
7974 def = this->add("support_ironing", coBool);
7975 def->label = L("Ironing Support Interface");
7976 def->category = L("Support");
7977 def->tooltip = L("Ironing is using small flow to print on same height of support interface again to make it more smooth. "
7978 "This setting controls whether support interface being ironed. When enabled, support interface will be extruded as solid too.");
7979 def->mode = comAdvanced;
7980 def->set_default_value(new ConfigOptionBool(false));
7981
7982 def = this->add("support_ironing_pattern", coEnum);
7983 def->label = L("Support Ironing Pattern");
7984 def->tooltip = L("The pattern that will be used when ironing.");
7985 def->category = L("Support");
7987 def->enum_values.push_back("rectilinear");
7988 def->enum_values.push_back("concentric");
7989 def->enum_labels.push_back(L("Rectilinear"));
7990 def->enum_labels.push_back(L("Concentric"));
7991 def->mode = comAdvanced;
7992 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipRectilinear));
7993
7994 def = this->add("support_ironing_flow", coPercent);
7995 def->label = L("Support Ironing flow");
7996 def->category = L("Support");
7997 def->tooltip = L("The amount of material to extrude during ironing. Relative to flow of normal support interface layer height. "
7998 "Too high value results in overextrusion on the surface.");
7999 def->sidetext = "%";
8000 def->ratio_over = "layer_height";
8001 def->min = 0;
8002 def->max = 100;
8003 def->mode = comAdvanced;
8004 def->set_default_value(new ConfigOptionPercent(10));
8005
8006 def = this->add("support_ironing_spacing", coFloat);
8007 def->label = L("Support Ironing line spacing");
8008 def->category = L("Support");
8009 def->tooltip = L("This is the distance between the lines used for ironing.");
8010 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8011 def->min = 0;
8012 def->max = 1;
8013 def->mode = comAdvanced;
8014 def->set_default_value(new ConfigOptionFloat(0.1));
8015
8016 def = this->add("activate_chamber_temp_control",coBools);
8017 def->label = L("Activate temperature control");
8018 def->tooltip = L("Enable this option for automated chamber temperature control. "
8019 "This option activates the emitting of an M191 command before the \"machine_start_gcode\"\n which sets the chamber temperature and waits until it is reached. "
8020 "In addition, it emits an M141 command at the end of the print to turn off the chamber heater, if present.\n\n"
8021 "This option relies on the firmware supporting the M191 and M141 commands either via macros or natively and is usually used when an active chamber heater is installed.");
8022 def->mode = comSimple;
8023 def->set_default_value(new ConfigOptionBools{false});
8024
8025 def = this->add("chamber_temperature", coInts);
8026 def->label = L("Chamber temperature");
8027 def->tooltip = L("For high-temperature materials like ABS, ASA, PC, and PA, a higher chamber temperature can help "
8028 "suppress or reduce warping and potentially lead to higher interlayer bonding strength. "
8029 "However, at the same time, a higher chamber temperature will reduce the efficiency of air "
8030 "filtration for ABS and ASA.\n\n"
8031 "For PLA, PETG, TPU, PVA, and other low-temperature materials, this option should be disabled "
8032 "(set to 0) as the chamber temperature should be low to avoid extruder clogging caused by "
8033 "material softening at the heat break.\n\n"
8034 "If enabled, this parameter also sets a G-code variable named chamber_temperature, which can be "
8035 "used to pass the desired chamber temperature to your print start macro, or a heat soak macro "
8036 "like this: PRINT_START (other variables) CHAMBER_TEMP=[chamber_temperature]. "
8037 "This may be useful if your printer does not support M141/M191 commands, or if you desire "
8038 "to handle heat soaking in the print start macro if no active chamber heater is installed."
8039 );
8040 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8041 def->full_label = L("Chamber temperature");
8042 def->min = 0;
8043 def->max = max_temp;
8044 def->set_default_value(new ConfigOptionInts{0});
8045
8046 def = this->add("chamber_minimal_temperature", coInts);
8047 def->label = L("Minimal");
8048 def->tooltip = L("This is the chamber temperature at which printing should start, while the chamber continues heating "
8049 "toward the \"Target\" chamber temperature. For example, set the Target to 60 and the Minimal to 50 to "
8050 "begin printing once the chamber reaches 50℃, without waiting for the full 60℃.\n\n"
8051 "It sets a G-code variable named chamber_minimal_temperature, which can be passed to your print start macro "
8052 "or a heat soak macro, like this: PRINT_START (other variables) CHAMBER_MIN_TEMP=[chamber_minimal_temperature].\n\n"
8053 "Unlike the \"Target\" chamber temperature, this option does not emit any M141/M191 commands; it only exposes "
8054 "the value to your custom G-code. It should not exceed the \"Target\" chamber temperature.");
8055 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8056 def->full_label = L("Chamber minimal temperature");
8057 def->min = 0;
8058 def->max = max_temp;
8059 def->set_default_value(new ConfigOptionInts{0});
8060
8061 def = this->add("nozzle_temperature", coInts);
8062 def->label = L("Other layers");
8063 def->tooltip = L("Nozzle temperature after the first layer");
8064 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8065 def->full_label = L("Nozzle temperature");
8066 def->min = 0;
8067 def->max = max_temp;
8068 def->set_default_value(new ConfigOptionInts { 200 });
8069
8070 def = this->add("nozzle_temperature_range_low", coInts);
8071 def->label = L("Min");
8072 //def->tooltip = L("");
8073 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8074 def->min = 0;
8075 def->max = max_temp;
8076 def->set_default_value(new ConfigOptionInts { 190 });
8077
8078 def = this->add("nozzle_temperature_range_high", coInts);
8079 def->label = L("Max");
8080 //def->tooltip = L("");
8081 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8082 def->min = 0;
8083 def->max = max_temp;
8084 def->set_default_value(new ConfigOptionInts { 240 });
8085
8086 def = this->add("head_wrap_detect_zone", coPoints);
8087 def->label = "Head wrap detect zone"; //do not need translation
8088 def->mode = comDevelop;
8089 def->set_default_value(new ConfigOptionPoints{});
8090
8091 def = this->add("detect_thin_wall", coBool);
8092 def->label = L("Detect thin walls");
8093 def->category = L("Strength");
8094 def->tooltip = L("This detects thin walls which can\u2019t contain two lines and uses a single line to print. It may not print as well because it\u2019s not a closed loop.");
8095 def->mode = comAdvanced;
8096 def->set_default_value(new ConfigOptionBool(false));
8097
8098 def = this->add("change_filament_gcode", coString);
8099 def->label = L("Change filament G-code");
8100 def->tooltip = L("This G-code is inserted when filament is changed, including T commands to trigger tool change.");
8101 def->multiline = true;
8102 def->full_width = true;
8103 def->height = 5;
8104 def->mode = comAdvanced;
8105 def->set_default_value(new ConfigOptionString());
8106
8107 def = this->add("change_extrusion_role_gcode", coString);
8108 def->label = L("Change extrusion role G-code");
8109 def->tooltip = L("This G-code is inserted when the extrusion role is changed.");
8110 def->multiline = true;
8111 def->full_width = true;
8112 def->height = 5;
8113 def->mode = comAdvanced;
8114 def->set_default_value(new ConfigOptionString());
8115
8116 def = this->add("filament_change_extrusion_role_gcode", coStrings);
8117 def->label = L("Change extrusion role G-code (filament)");
8118 def->tooltip = L("This G-code is inserted when the extrusion role is changed for the active filament.");
8119 def->multiline = true;
8120 def->full_width = true;
8121 def->height = 5;
8122 def->mode = comAdvanced;
8123 def->set_default_value(new ConfigOptionStrings{ "" });
8124
8125 def = this->add("top_surface_line_width", coFloatOrPercent);
8126 def->label = L("Top surface");
8127 def->category = L("Quality");
8128 def->tooltip = L("Line width for top surfaces. If expressed as a %, it will be computed over the nozzle diameter.");
8129 def->sidetext = L("mm or %");
8130 def->ratio_over = "nozzle_diameter";
8131 def->min = 0;
8132 def->max = 1000;
8133 def->max_literal = 10;
8134 def->mode = comAdvanced;
8135 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
8136
8137 def = this->add("top_surface_speed", coFloats);
8138 def->label = L("Top surface");
8139 def->category = L("Speed");
8140 def->tooltip = L("This is the speed for solid top surface infill.");
8141 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
8142 def->min = 1;
8143 def->mode = comAdvanced;
8144 def->nullable = true;
8145 def->set_default_value(new ConfigOptionFloatsNullable{100});
8146
8147 def = this->add("top_shell_layers", coInt);
8148 def->label = L("Top shell layers");
8149 def->category = L("Strength");
8150 def->sidetext = L("layers"); // ORCA add side text
8151 def->tooltip = L("This is the number of solid layers of top shell, including the top surface layer. When the thickness calculated by this value is thinner than the top shell thickness, the top shell layers will be increased");
8152 def->full_label = L("Top solid layers");
8153 def->min = 0;
8154 def->set_default_value(new ConfigOptionInt(4));
8155
8156 def = this->add("top_shell_thickness", coFloat);
8157 def->label = L("Top shell thickness");
8158 def->category = L("Strength");
8159 def->tooltip = L("The number of top solid layers is increased when slicing if the thickness calculated by top shell layers is thinner than this value. This can avoid having too thin a shell when layer height is small. 0 means that this setting is disabled and thickness of top shell is determined simply by the number of top shell layers.");
8160 def->full_label = L("Top shell thickness");
8161 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8162 def->min = 0;
8163 def->set_default_value(new ConfigOptionFloat(0.6));
8164
8165 def = this->add("top_color_penetration_layers", coInt);
8166 def->label = L("Top paint penetration layers");
8167 def->category = L("Strength");
8168 def->sidetext = L("layers");
8169 def->tooltip = L("The number of layers, including the top surface layer, that take the color painted on a top surface. "
8170 "Set to 0 to use the top shell layers. A value larger than the top shell also colors the sparse "
8171 "infill below the painted area.");
8172 def->min = 0;
8173 def->mode = comAdvanced;
8174 def->set_default_value(new ConfigOptionInt(0));
8175
8176 def = this->add("separated_infills", coBool);
8177 def->label = L("Separated infills");
8178 def->category = L("Strength");
8179 def->tooltip = L("Centers the internal infill of each part on itself, as if it were sliced on its own, instead of on the "
8180 "whole assembly. Parts that touch or overlap are treated as one body and share a center; separate parts "
8181 "(or distinct 3D objects) each get their own.\n"
8182 "Useful when an assembly groups several objects that should each keep a consistent, self-centered infill.\n"
8183 "Adaptive Cubic and Support Cubic always center each part on itself, and Lightning infill is generated for "
8184 "the whole object and is unaffected.");
8185 def->mode = comExpert;
8186 def->set_default_value(new ConfigOptionBool(false));
8187
8188 def = this->add("center_of_surface_pattern", coEnum);
8189 def->label = L("Center surface pattern on");
8190 def->category = L("Strength");
8191 def->tooltip = L("Chooses where the centering point of centered top/bottom surface patterns (Archimedean Chords, "
8192 "Octagram Spiral) is placed.\n"
8193 " - Each Surface: centers the pattern on every individual surface region, so each island is symmetric on its own.\n"
8194 " - Each Model: centers the pattern on each connected body. Parts that touch or overlap share one center; "
8195 "parts detached from the rest each get their own.\n"
8196 " - Each Assembly: uses a single shared center for the whole object or assembly.");
8198 def->enum_values.push_back("each_surface");
8199 def->enum_values.push_back("each_model");
8200 def->enum_values.push_back("each_assembly");
8201 def->enum_labels.push_back(L("Each Surface"));
8202 def->enum_labels.push_back(L("Each Model"));
8203 def->enum_labels.push_back(L("Each Assembly"));
8204 def->mode = comExpert;
8205 def->set_default_value(new ConfigOptionEnum<CenterOfSurfacePattern>(CenterOfSurfacePattern::Each_Surface));
8206
8207 def = this->add("travel_speed", coFloats);
8208 def->label = L("Travel");
8209 def->tooltip = L("This is the speed at which traveling is done.");
8210 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
8211 def->min = 1;
8212 def->mode = comAdvanced;
8213 def->nullable = true;
8214 def->set_default_value(new ConfigOptionFloatsNullable{120});
8215
8216 def = this->add("travel_speed_z", coFloats);
8217 //def->label = L("Z travel");
8218 //def->tooltip = L("Speed of vertical travel along z axis. "
8219 // "This is typically lower because build plate or gantry is hard to be moved. "
8220 // "Zero means using travel speed directly in G-code, but will be limited by printer's ability when run G-code.");
8221 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
8222 def->min = 0;
8223 def->mode = comDevelop;
8224 def->nullable = true;
8225 def->set_default_value(new ConfigOptionFloatsNullable{0.});
8226
8227 def = this->add("wipe", coBools);
8228 def->label = L("Wipe while retracting");
8229 def->tooltip = L("This moves the nozzle along the last extrusion path when retracting to clean any leaked material on the nozzle. This can minimize blobs when printing a new part after traveling.");
8230 def->mode = comAdvanced;
8231 def->set_default_value(new ConfigOptionBools { false });
8232
8233 def = this->add("wipe_distance", coFloats);
8234 def->label = L("Wipe distance");
8235 def->tooltip = L("Describe how long the nozzle will move along the last path when retracting.\n\n"
8236 "Depending on how long the wipe operation lasts, how fast and long the extruder/filament retraction settings are, "
8237 "a retraction move may be needed to retract the remaining filament.\n\n"
8238 "Setting a value in the retract amount before wipe setting below will perform any excess retraction before the wipe, else it will be performed after.");
8239 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8240 def->min = 0;
8241 def->mode = comAdvanced;
8242 def->set_default_value(new ConfigOptionFloats { 1. });
8243
8244 def = this->add("enable_mixed_color_sublayer", coBool);
8245 def->label = L("Mixed color sublayer");
8246 def->tooltip = L("Enable mixed color sublayer splitting. When enabled, layers containing mixed color "
8247 "filaments will be split into sub-layers to achieve color mixing effects.");
8248 def->category = L("Quality");
8249 def->mode = comSimple;
8250 def->set_default_value(new ConfigOptionBool(false));
8251
8252 def = this->add("enable_prime_tower", coBool);
8253 def->label = L("Enable");
8254 def->tooltip = L("The wiping tower can be used to clean up residue on the nozzle and stabilize the chamber pressure inside the nozzle in order to avoid appearance defects when printing objects.");
8255 def->mode = comSimple;
8256 def->set_default_value(new ConfigOptionBool(false));
8257
8258 def = this->add("prime_tower_enable_framework", coBool);
8259 def->label = L("Internal ribs");
8260 def->tooltip = L("Enable internal ribs to increase the stability of the prime tower.");
8261 def->mode = comAdvanced;
8262 def->set_default_value(new ConfigOptionBool(false));
8263
8264 def = this->add("flush_volumes_vector", coFloats);
8265 // BBS: remove _L()
8266 def->label = ("Purging volumes - load/unload volumes");
8267 //def->tooltip = L("This vector saves required volumes to change from/to each tool used on the "
8268 // "wipe tower. These values are used to simplify creation of the full purging "
8269 // "volumes below.");
8270
8271 // BBS: change 70.f => 140.f
8272 def->set_default_value(new ConfigOptionFloats { 140.f, 140.f, 140.f, 140.f, 140.f, 140.f, 140.f, 140.f });
8273
8274 def = this->add("flush_volumes_matrix", coFloats);
8275 def->label = L("Purging volumes");
8276 //def->tooltip = L("This matrix describes volumes (in cubic millimeters) required to purge the"
8277 // " new filament on the wipe tower for any given pair of tools.");
8278 // BBS: change 140.f => 280.f
8279 def->set_default_value(new ConfigOptionFloats { 0.f, 280.f, 280.f, 280.f,
8280 280.f, 0.f, 280.f, 280.f,
8281 280.f, 280.f, 0.f, 280.f,
8282 280.f, 280.f, 280.f, 0.f });
8283
8284 def = this->add("flush_multiplier", coFloats);
8285 def->label = L("Flush multiplier");
8286 def->tooltip = L("The actual flushing volumes is equal to the flush multiplier value multiplied by the flushing volumes in the table.");
8287 //def->sidetext = "";
8288 def->set_default_value(new ConfigOptionFloats{0.3});
8289
8290 // Fast-purge mode: the flush multiplier used when prime_volume_mode==Fast.
8291 // Only consumed on the pvmFast branch (default prime_volume_mode==Default reads flush_multiplier),
8292 // so this key is inert for the shipping fleet. Kept out of the g-code config block (banned_keys).
8293 def = this->add("flush_multiplier_fast", coFloats);
8294 def->label = L("Flush multiplier (Fast mode)");
8295 def->tooltip = L("The flush multiplier used in fast purge mode.");
8296 def->set_default_value(new ConfigOptionFloats{1.2});
8297
8298 // Orca: used by the generic (Type2) wipe tower; also the fallback for filament_prime_volume on Type1.
8299 def = this->add("prime_volume", coFloat);
8300 def->label = L("Prime volume");
8301 def->tooltip = L("This is the volume of material to prime the extruder with on the tower.");
8302 def->sidetext = L(u8"mm³"); // cubic millimeters, CIS languages need translation
8303 def->min = 1.0;
8304 def->mode = comSimple;
8305 def->set_default_value(new ConfigOptionFloat(45.));
8306
8307 // Dual-extruder purge control: Default reproduces current behaviour
8308 // (per-extruder flush_multiplier + filament_prime_volume); Saving reduces the prime volume,
8309 // Fast selects flush_multiplier_fast + filament_flush_temp_fast. Default pvmDefault = inert.
8310 def = this->add("prime_volume_mode", coEnum);
8311 def->label = L("Prime volume mode");
8312 def->tooltip = L("Selects how the wipe-tower prime and flush volumes are computed on multi-extruder printers.");
8314 def->enum_values.push_back("Default");
8315 def->enum_values.push_back("Saving");
8316 def->enum_values.push_back("Fast");
8317 def->enum_labels.push_back(L("Default"));
8318 def->enum_labels.push_back(L("Saving"));
8319 def->enum_labels.push_back(L("Fast"));
8320 def->mode = comDevelop;
8321 def->set_default_value(new ConfigOptionEnum<PrimeVolumeMode>(pvmDefault));
8322
8323 def = this->add("wipe_tower_x", coFloats);
8324 //def->label = L("Position X");
8325 //def->tooltip = L("X coordinate of the left front corner of a wipe tower.");
8326 //def->sidetext = L("mm"); // millimeters, CIS languages need translation
8327 def->mode = comDevelop;
8328 // BBS: change data type to floats to add partplate logic
8329 def->set_default_value(new ConfigOptionFloats{ 15. });
8330
8331 def = this->add("wipe_tower_y", coFloats);
8332 //def->label = L("Position Y");
8333 //def->tooltip = L("Y coordinate of the left front corner of a wipe tower.");
8334 //def->sidetext = L("mm"); // millimeters, CIS languages need translation
8335 def->mode = comDevelop;
8336 // BBS: change data type to floats to add partplate logic
8337 def->set_default_value(new ConfigOptionFloats{ 220. });
8338
8339 def = this->add("prime_tower_width", coFloat);
8340 def->label = L("Width");
8341 def->tooltip = L("This is the width of prime towers.");
8342 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8343 def->min = 2.0;
8344 def->mode = comSimple;
8345 def->set_default_value(new ConfigOptionFloat(60.));
8346
8347 def = this->add("wipe_tower_rotation_angle", coFloat);
8348 def->label = L("Wipe tower rotation angle");
8349 def->tooltip = L("Wipe tower rotation angle with respect to X axis.");
8350 def->sidetext = u8"°"; // degrees, don't need translation
8351 def->mode = comAdvanced;
8352 def->set_default_value(new ConfigOptionFloat(0.));
8353
8354 def = this->add("prime_tower_brim_width", coFloat);
8356 def->label = L("Brim width");
8357 def->tooltip = L("Brim width of prime tower, negative number means auto calculated width based on the height of prime tower.");
8358 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8359 def->mode = comAdvanced;
8360 def->min = -1;
8361 def->enum_values.push_back("-1");
8362 def->enum_labels.push_back(L("Auto"));
8363 def->set_default_value(new ConfigOptionFloat(3.));
8364
8365 def = this->add("wipe_tower_cone_angle", coFloat);
8366 def->label = L("Stabilization cone apex angle");
8367 def->tooltip = L("Angle at the apex of the cone that is used to stabilize the wipe tower. "
8368 "Larger angle means wider base.");
8369 def->sidetext = u8"°"; // degrees, don't need translation
8370 def->mode = comAdvanced;
8371 def->min = 0.;
8372 def->max = 90.;
8373 def->set_default_value(new ConfigOptionFloat(30.0));
8374
8375 def = this->add("wipe_tower_max_purge_speed", coFloat);
8376 def->label = L("Maximum wipe tower print speed");
8377 def->tooltip = L("The maximum print speed when purging in the wipe tower and printing the wipe tower sparse layers. "
8378 "When purging, if the sparse infill speed or calculated speed from the filament max volumetric speed is lower, the lowest will be used instead.\n\n"
8379 "When printing the sparse layers, if the sparse infill speed or calculated speed from the filament max volumetric speed is lower, the lowest will be used instead.\n\n"
8380 "Increasing this speed may affect the tower's stability as well as increase the force with which the nozzle collides with any blobs that may have formed on the wipe tower.\n\n"
8381 "Before increasing this parameter beyond the default of 90 mm/s, make sure your printer can reliably bridge at the increased speeds and that ooze when tool changing is well controlled.\n\n"
8382 "For the wipe tower external perimeters the internal perimeter speed is used, also limited by this setting.");
8383 def->sidetext = L("mm/s"); // millimeters per second, CIS languages need translation
8384 def->mode = comAdvanced;
8385 def->min = 10;
8386 def->set_default_value(new ConfigOptionFloat(90.));
8387
8388 def = this->add("wipe_tower_wall_type", coEnum);
8389 def->label = L("Wall type");
8390 def->tooltip = L("Wipe tower outer wall type.\n"
8391 "1. Rectangle: A rectangle with fixed width and height.\n"
8392 "2. Cone: A cone with a fillet at the bottom to help stabilize the wipe tower.\n"
8393 "3. Rib: The default wall type, which adds four ribs to the tower wall for enhanced stability.");
8395 def->enum_values.emplace_back("rectangle");
8396 def->enum_values.emplace_back("cone");
8397 def->enum_values.emplace_back("rib");
8398 def->enum_labels.emplace_back(L("Rectangle"));
8399 def->enum_labels.emplace_back(L("Cone"));
8400 def->enum_labels.emplace_back(L("Rib"));
8401 def->mode = comAdvanced;
8402 def->set_default_value(new ConfigOptionEnum<WipeTowerWallType>(wtwRib));
8403
8404 def = this->add("wipe_tower_extra_rib_length", coFloat);
8405 def->label = L("Extra rib length");
8406 def->tooltip = L("Positive values can increase the size of the rib wall, while negative values can reduce the size. "
8407 "However, the size of the rib wall can not be smaller than that determined by the cleaning volume.");
8408 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8409 def->max = 300;
8410 def->mode = comAdvanced;
8411 def->set_default_value(new ConfigOptionFloat(0));
8412
8413 def = this->add("wipe_tower_rib_width", coFloat);
8414 def->label = L("Rib width");
8415 def->tooltip = L("Rib width is always less than half the prime tower side length.");
8416 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8417 def->mode = comAdvanced;
8418 def->min = 0;
8419 def->max = 300;
8420 def->set_default_value(new ConfigOptionFloat(8));
8421
8422 def = this->add("wipe_tower_fillet_wall", coBool);
8423 def->label = L("Fillet wall");
8424 def->tooltip = L("The wall of prime tower will fillet.");
8425 def->mode = comAdvanced;
8426 def->set_default_value(new ConfigOptionBool(true));
8427
8428
8429 def = this->add("wipe_tower_filament", coInt);
8431 def->label = L("Wipe tower");
8432 def->category = L("Extruders");
8433 def->tooltip = L("The extruder to use when printing perimeter of the wipe tower. "
8434 "Set to 0 to use the one that is available (non-soluble would be preferred).");
8435 def->min = 0;
8436 def->mode = comAdvanced;
8437 def->set_default_value(new ConfigOptionInt(0));
8438
8439 def = this->add("wiping_volumes_extruders", coFloats);
8440 def->label = L("Purging volumes - load/unload volumes");
8441 def->tooltip = L("This vector saves required volumes to change from/to each tool used on the "
8442 "wipe tower. These values are used to simplify creation of the full purging "
8443 "volumes below.");
8444 def->set_default_value(new ConfigOptionFloats { 70., 70., 70., 70., 70., 70., 70., 70., 70., 70. });
8445
8446 def = this->add("prime_tower_skip_points", coBool);
8447 def->label = L("Skip points");
8448 def->tooltip = L("The wall of prime tower will skip the start points of wipe path.");
8449 def->mode = comAdvanced;
8450 def->set_default_value(new ConfigOptionBool(true));
8451
8452 def = this->add("prime_tower_flat_ironing", coBool);
8453 def->mode = comAdvanced;
8454 def->set_default_value(new ConfigOptionBool(false));
8455
8456 def = this->add("enable_tower_interface_features", coBool);
8457 def->label = L("Enable tower interface features");
8458 def->tooltip = L("Enable optimized prime tower interface behavior when different materials meet.");
8459 def->mode = comAdvanced;
8460 def->set_default_value(new ConfigOptionBool(false));
8461
8462 def = this->add("enable_tower_interface_cooldown_during_tower", coBool);
8463 def->label = L("Cool down from interface boost during prime tower");
8464 def->tooltip = L("When interface-layer temperature boost is active, set the nozzle back to print temperature at the start of the prime tower so it cools down during the tower.");
8465 def->mode = comAdvanced;
8466 def->set_default_value(new ConfigOptionBool(false));
8467
8468 def = this->add("prime_tower_infill_gap", coPercent);
8469 def->label = L("Infill gap");
8470 def->tooltip = L("Infill gap.");
8471 def->sidetext = "%";
8472 def->mode = comAdvanced;
8473 def->min = 100;
8474 def->set_default_value(new ConfigOptionPercent(150));
8475
8476 def = this->add("flush_into_infill", coBool);
8477 def->category = L("Flush options");
8478 def->label = L("Flush into objects' infill");
8479 def->tooltip = L("Purging after filament change will be done inside objects\' infills. This may lower the amount of waste and decrease the print time. If the walls are printed with transparent filament, the mixed color infill will be visible. It will not take effect unless the prime tower is enabled.");
8480 def->set_default_value(new ConfigOptionBool(false));
8481
8482 def = this->add("flush_into_support", coBool);
8483 def->category = L("Flush options");
8484 def->label = L("Flush into objects' support");
8485 def->tooltip = L("Purging after filament change will be done inside objects\' support. This may lower the amount of waste and decrease the print time. It will not take effect unless a prime tower is enabled.");
8486 def->set_default_value(new ConfigOptionBool(true));
8487
8488 def = this->add("flush_into_objects", coBool);
8489 def->category = L("Flush options");
8490 def->label = L("Flush into this object");
8491 def->tooltip = L("This object will be used to purge the nozzle after a filament change to save filament and decrease the print time. "
8492 "Colors of the objects will be mixed as a result. "
8493 "It will not take effect unless the prime tower is enabled.");
8494 def->set_default_value(new ConfigOptionBool(false));
8495
8496 // Internal marker (not shown in any settings tab): identifies the auto-generated
8497 // belt purge prism so it can be updated/removed by the auto-manager and aligned
8498 // to the object layer grid by the backend. Persisted to 3mf like any per-object key.
8499 def = this->add("belt_purge_tower_object", coBool);
8500 def->category = L("Flush options");
8501 def->label = L("Belt purge tower object");
8502 def->tooltip = L("Marks the auto-generated belt purge prism. Managed automatically; do not set manually.");
8503 def->mode = comDevelop;
8504 def->set_default_value(new ConfigOptionBool(false));
8505
8506 def = this->add("wipe_tower_bridging", coFloat);
8507 def->label = L("Maximal bridging distance");
8508 def->tooltip = L("Maximal distance between supports on sparse infill sections.");
8509 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8510 def->mode = comAdvanced;
8511 def->set_default_value(new ConfigOptionFloat(10.));
8512
8513 def = this->add("wipe_tower_extra_spacing", coPercent);
8514 def->label = L("Wipe tower purge lines spacing");
8515 def->tooltip = L("Spacing of purge lines on the wipe tower.");
8516 def->sidetext = "%";
8517 def->mode = comAdvanced;
8518 def->min = 100.;
8519 def->max = 300.;
8520 def->set_default_value(new ConfigOptionPercent(100.));
8521
8522 def = this->add("wipe_tower_extra_flow", coPercent);
8523 def->label = L("Extra flow for purging");
8524 def->tooltip = L("Extra flow used for the purging lines on the wipe tower. This makes the purging lines thicker "
8525 "than they normally would be. The spacing is adjusted automatically.");
8526 def->sidetext = "%";
8527 def->mode = comAdvanced;
8528 def->min = 100.;
8529 def->max = 300.;
8530 def->set_default_value(new ConfigOptionPercent(100.));
8531
8532 def = this->add("idle_temperature", coInts);
8533 def->label = L("Idle temperature");
8534 def->tooltip = L("Nozzle temperature when the tool is currently not used in multi-tool setups. "
8535 "This is only used when 'Ooze prevention' is active in Print Settings. Set to 0 to disable.");
8536 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8537 def->min = 0;
8538 def->max = max_temp;
8539 def->set_default_value(new ConfigOptionInts{0});
8540
8541 def = this->add("xy_hole_compensation", coFloat);
8542 def->label = L("X-Y hole compensation");
8543 def->category = L("Quality");
8544 def->tooltip = L("Holes in objects will expand or contract in the XY plane by the set value. Positive values make holes bigger and negative values make holes smaller. This function is used to adjust sizes slightly when objects have assembly issues.");
8545 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8546 def->mode = comAdvanced;
8547 def->set_default_value(new ConfigOptionFloat(0));
8548
8549 def = this->add("xy_contour_compensation", coFloat);
8550 def->label = L("X-Y contour compensation");
8551 def->category = L("Quality");
8552 def->tooltip = L("Contours of objects will expand or contract in the XY plane by the set value. Positive values make contours bigger and negative values make contours smaller. This function is used to adjust sizes slightly when objects have assembly issues.");
8553 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8554 def->mode = comAdvanced;
8555 def->set_default_value(new ConfigOptionFloat(0));
8556
8557 def = this->add("hole_to_polyhole", coBool);
8558 def->label = L("Convert holes to polyholes");
8559 def->category = L("Quality");
8560 def->tooltip = L("Search for almost-circular holes that span more than one layer and convert the geometry to polyholes."
8561 " Use the nozzle size and the (biggest) diameter to compute the polyhole."
8562 "\nSee http://hydraraptor.blogspot.com/2011/02/polyholes.html");
8563 def->mode = comAdvanced;
8564 def->set_default_value(new ConfigOptionBool(false));
8565
8566 def = this->add("hole_to_polyhole_threshold", coFloatOrPercent);
8567 def->label = L("Polyhole detection margin");
8568 def->category = L("Quality");
8569 // xgettext:no-c-format, no-boost-format
8570 def->tooltip = L("Maximum defection of a point to the estimated radius of the circle."
8571 "\nAs cylinders are often exported as triangles of varying size, points may not be on the circle circumference."
8572 " This setting allows you some leeway to broaden the detection."
8573 "\nIn mm or in % of the radius.");
8574 def->sidetext = L("mm or %");
8575 def->max_literal = 10;
8576 def->mode = comAdvanced;
8577 def->set_default_value(new ConfigOptionFloatOrPercent(0.01, false));
8578
8579 def = this->add("hole_to_polyhole_twisted", coBool);
8580 def->label = L("Polyhole twist");
8581 def->category = L("Quality");
8582 def->tooltip = L("Rotate the polyhole every layer.");
8583 def->mode = comAdvanced;
8584 def->set_default_value(new ConfigOptionBool(true));
8585
8586 def = this->add("hole_to_polyhole_max_edges", coInt);
8587 def->label = L("Maximum Polyhole edge count");
8588 def->category = L("Quality");
8589 def->tooltip = L("Maximum number of polyhole edges"
8590 "\nThis setting limits the amount of edges a polyhole can have");
8591 def->mode = comExpert;
8592 def->min = 3;
8593 def->set_default_value(new ConfigOptionInt(50));
8594
8595 def = this->add("thumbnails", coString);
8596 def->label = L("G-code thumbnails");
8597 def->tooltip = L("Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxY, XxY, ...\"");
8598 def->mode = comAdvanced;
8600 def->set_default_value(new ConfigOptionString("48x48/PNG,300x300/PNG"));
8601
8602 def = this->add("thumbnails_format", coEnum);
8603 def->label = L("Format of G-code thumbnails");
8604 def->tooltip = L("Format of G-code thumbnails: PNG for best quality, JPG for smallest size, QOI for low memory firmware.");
8605 def->mode = comAdvanced;
8607 def->enum_values.push_back("PNG");
8608 def->enum_values.push_back("JPG");
8609 def->enum_values.push_back("QOI");
8610 def->enum_values.push_back("BTT_TFT");
8611 def->enum_values.push_back("COLPIC");
8612 def->enum_labels.push_back("PNG");
8613 def->enum_labels.push_back("JPG");
8614 def->enum_labels.push_back("QOI");
8615 def->enum_labels.push_back("BTT TT");
8616 def->enum_labels.push_back("ColPic");
8617 def->set_default_value(new ConfigOptionEnum<GCodeThumbnailsFormat>(GCodeThumbnailsFormat::PNG));
8618
8619 def = this->add("use_relative_e_distances", coBool);
8620 def->label = L("Use relative E distances");
8621 def->tooltip = L("Relative extrusion is recommended when using \"label_objects\" option. "
8622 "Some extruders work better with this option unchecked (absolute extrusion mode). "
8623 "Wipe tower is only compatible with relative mode. It is recommended on "
8624 "most printers. Default is checked.");
8625 def->mode = comAdvanced;
8626 def->set_default_value(new ConfigOptionBool(true));
8627
8628 def = this->add("wall_generator", coEnum);
8629 def->label = L("Wall generator");
8630 def->category = L("Quality");
8631 def->tooltip = L("The classic wall generator produces walls with constant extrusion width and for very thin areas, gap-fill is used. The Arachne engine produces walls with variable extrusion width.");
8633 def->enum_values.push_back("classic");
8634 def->enum_values.push_back("arachne");
8635 def->enum_labels.push_back(L("Classic"));
8636 def->enum_labels.push_back(L("Arachne"));
8637 def->mode = comAdvanced;
8638 def->set_default_value(new ConfigOptionEnum<PerimeterGeneratorType>(PerimeterGeneratorType::Arachne));
8639
8640 def = this->add("wall_transition_length", coPercent);
8641 def->label = L("Wall transition length");
8642 def->category = L("Quality");
8643 def->tooltip = L("When transitioning between different numbers of walls as the part becomes thinner, a certain amount of space is allotted to split or join the wall segments. It\'s expressed as a percentage over nozzle diameter.");
8644 def->sidetext = "%";
8645 def->mode = comAdvanced;
8646 def->min = 0;
8647 def->set_default_value(new ConfigOptionPercent(100));
8648
8649 def = this->add("wall_transition_filter_deviation", coPercent);
8650 def->label = L("Wall transitioning filter margin");
8651 def->category = L("Quality");
8652 def->tooltip = L("Prevent transitioning back and forth between one extra wall and one less. This "
8653 "margin extends the range of extrusion widths which follow to [Minimum wall width "
8654 "- margin, 2 * Minimum wall width + margin]. Increasing this margin "
8655 "reduces the number of transitions, which reduces the number of extrusion "
8656 "starts/stops and travel time. However, large extrusion width variation can lead to "
8657 "under- or overextrusion problems. "
8658 "It's expressed as a percentage over nozzle diameter.");
8659 def->sidetext = "%";
8660 def->mode = comAdvanced;
8661 def->min = 0;
8662 def->set_default_value(new ConfigOptionPercent(25));
8663
8664 def = this->add("wall_transition_angle", coFloat);
8665 def->label = L("Wall transitioning threshold angle");
8666 def->category = L("Quality");
8667 def->tooltip = L("When to create transitions between even and odd numbers of walls. A wedge shape with"
8668 " an angle greater than this setting will not have transitions and no walls will be "
8669 "printed in the center to fill the remaining space. Reducing this setting reduces "
8670 "the number and length of these center walls, but may leave gaps or overextrude.");
8671 def->sidetext = u8"°"; // degrees, don't need translation
8672 def->mode = comAdvanced;
8673 def->min = 1.;
8674 def->max = 59.;
8675 def->set_default_value(new ConfigOptionFloat(10.));
8676
8677 def = this->add("wall_distribution_count", coInt);
8678 def->label = L("Wall distribution count");
8679 def->category = L("Quality");
8680 def->tooltip = L("The number of walls, counted from the center, over which the variation needs to be "
8681 "spread. Lower values mean that the outer walls don't change in width.");
8682 def->mode = comAdvanced;
8683 def->min = 1;
8684 def->set_default_value(new ConfigOptionInt(1));
8685
8686 def = this->add("min_feature_size", coPercent);
8687 def->label = L("Minimum feature size");
8688 def->category = L("Quality");
8689 def->tooltip = L("Minimum thickness of thin features. Model features that are thinner than this value will not be printed, "
8690 "while features thicker than than this value will be widened to the minimum wall width. "
8691 "It's expressed as a percentage over nozzle diameter.");
8692 def->sidetext = "%";
8693 def->mode = comAdvanced;
8694 def->min = 0;
8695 def->set_default_value(new ConfigOptionPercent(25));
8696
8697 def = this->add("min_length_factor", coFloat);
8698 def->label = L("Minimum wall length");
8699 def->category = L("Quality");
8700 def->tooltip = L("Adjust this value to prevent short, unclosed walls from being printed, which could increase print time. "
8701 "The value is a multiple of the wall width. Higher values remove more and longer walls.\n\n"
8702 "NOTE: Bottom and top surfaces will not be affected by this value to prevent visual gaps on the outside of the model. "
8703 "Adjust 'One wall threshold' in the 'Walls and surfaces' settings below to adjust the sensitivity of what is considered a top-surface. "
8704 "'One wall threshold' is only visible if this setting is set above the default value of 0.5, or if single-wall top surfaces is enabled.");
8705 def->mode = comAdvanced;
8706 def->min = 0.0;
8707 def->max = 25.0;
8708 def->set_default_value(new ConfigOptionFloat(0.5));
8709
8710 def = this->add("wall_maximum_resolution", coFloat);
8711 def->label = L("Maximum wall resolution");
8712 def->category = L("Quality");
8713 def->tooltip = L("This value determines the smallest wall line segment length in mm. "
8714 "The smaller you set this value, the more accurate and precise the walls will be.");
8715 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8716 def->mode = comExpert;
8717 def->min = 0.005;
8718 def->max = 0.5f;
8719 def->set_default_value(new ConfigOptionFloat(0.5f));
8720
8721 def = this->add("wall_maximum_deviation", coFloat);
8722 def->label = L("Maximum wall deviation");
8723 def->category = L("Quality");
8724 def->tooltip = L("The maximum deviation allowed when reducing the resolution for the 'Maximum wall resolution' setting. If you increase this, "
8725 "the print will be less accurate, but the G-code will be smaller. 'Maximum wall deviation' limits 'Maximum wall resolution', "
8726 "so if the two conflict, 'Maximum wall deviation' takes precedence.");
8727 def->sidetext = L("mm"); // millimeters, CIS languages need translation
8728 def->mode = comExpert;
8729 def->min = 0.005f;
8730 def->max = 0.05f;
8731 def->set_default_value(new ConfigOptionFloat(0.025f));
8732
8733 def = this->add("initial_layer_min_bead_width", coPercent);
8734 def->label = L("First layer minimum wall width");
8735 def->category = L("Quality");
8736 def->tooltip = L("The minimum wall width that should be used for the first layer is recommended to be set "
8737 "to the same size as the nozzle. This adjustment is expected to enhance adhesion.");
8738 def->sidetext = "%";
8739 def->mode = comAdvanced;
8740 def->min = 0;
8741 def->set_default_value(new ConfigOptionPercent(85));
8742
8743 def = this->add("min_bead_width", coPercent);
8744 def->label = L("Minimum wall width");
8745 def->category = L("Quality");
8746 def->tooltip = L("Width of the wall that will replace thin features (according to the Minimum feature size) "
8747 "of the model. If the Minimum wall width is thinner than the thickness of the feature,"
8748 " the wall will become as thick as the feature itself. "
8749 "It's expressed as a percentage over nozzle diameter.");
8750 def->sidetext = "%";
8751 def->mode = comAdvanced;
8752 def->min = 0;
8753 def->set_default_value(new ConfigOptionPercent(85));
8754
8755 def = this->add("filament_dev_ams_drying_ams_limitations", coStrings);
8756 def->set_default_value(new ConfigOptionStrings{""});
8757
8758 def = this->add("filament_dev_ams_drying_temperature", coFloats);
8759 def->set_default_value(new ConfigOptionFloats{0});
8760
8761 def = this->add("filament_dev_ams_drying_time", coFloats);
8762 def->set_default_value(new ConfigOptionFloats{0});
8763
8764 def = this->add("filament_dev_ams_drying_heat_distortion_temperature", coFloats);
8765 def->set_default_value(new ConfigOptionFloats{0});
8766
8767 def = this->add("filament_dev_chamber_drying_bed_temperature", coFloats);
8768 def->set_default_value(new ConfigOptionFloats{0});
8769
8770 def = this->add("filament_dev_chamber_drying_time", coFloats);
8771 def->set_default_value(new ConfigOptionFloats{0});
8772
8773 def = this->add("filament_dev_drying_softening_temperature", coFloats);
8774 def->set_default_value(new ConfigOptionFloats{0});
8775
8776 def = this->add("filament_dev_drying_cooling_temperature", coFloats);
8777 def->set_default_value(new ConfigOptionFloats{0});
8778
8779 // Declare retract values for filament profile, overriding the printer's extruder profile.
8780 for (auto& opt_key : filament_extruder_override_keys) {
8781 const std::string filament_prefix = "filament_";
8782 std::string extruder_raw_key = opt_key.substr(opt_key.find(filament_prefix) + filament_prefix.length());
8783 auto it_opt = options.find(extruder_raw_key);
8784 assert(it_opt != options.end());
8785 def = this->add_nullable(opt_key, it_opt->second.type);
8786 def->label = it_opt->second.label;
8787 def->full_label = it_opt->second.full_label;
8788 def->tooltip = it_opt->second.tooltip;
8789 def->sidetext = it_opt->second.sidetext;
8790 def->enum_keys_map = it_opt->second.enum_keys_map;
8791 def->enum_labels = it_opt->second.enum_labels;
8792 def->enum_values = it_opt->second.enum_values;
8793 def->min = it_opt->second.min;
8794 def->max = it_opt->second.max;
8795 //BBS: shown specific filament retract config because we hide the machine retract into comDevelop mode
8796 if (opt_key =="filament_retraction_length"||
8797 opt_key=="filament_z_hop" ||
8798 opt_key== "filament_long_retractions_when_cut" ||
8799 opt_key=="filament_retraction_distances_when_cut")
8800 def->mode = comSimple;
8801 else
8802 def->mode = comAdvanced;
8803 switch (def->type) {
8804 case coFloats : def->set_default_value(new ConfigOptionFloatsNullable (static_cast<const ConfigOptionFloats* >(it_opt->second.default_value.get())->values)); break;
8805 case coPercents : def->set_default_value(new ConfigOptionPercentsNullable(static_cast<const ConfigOptionPercents*>(it_opt->second.default_value.get())->values)); break;
8806 case coBools : def->set_default_value(new ConfigOptionBoolsNullable (static_cast<const ConfigOptionBools* >(it_opt->second.default_value.get())->values)); break;
8807 case coEnums : def->set_default_value(new ConfigOptionEnumsGenericNullable(static_cast<const ConfigOptionEnumsGeneric* >(it_opt->second.default_value.get())->values)); break;
8808 default: assert(false);
8809 }
8810 }
8811
8812 // ---- Multi-nozzle + pre-heat + nozzle-change (nc) config keys ----
8813 // These back 6-nozzle cluster grouping, the pre-heat/pre-cool time model and wipe-tower
8814 // nozzle-change handling. Defaults are no-ops for existing single-nozzle printers (all new
8815 // readers gate on extruder_max_nozzle_count > 1).
8816 def = this->add("machine_hotend_change_time", coFloat);
8817 def->label = L("Hotend change time");
8818 def->tooltip = L("Time to change hotend.");
8819 def->sidetext = L_CONTEXT("s", "second");
8820 def->min = 0;
8821 def->mode = comAdvanced;
8822 def->set_default_value(new ConfigOptionFloat(0.0));
8823
8824 // Printer-owned toggle selecting the time-aware grouping objective (flush + change/print
8825 // time) over the flush-only objective. Default false == today's flush-only grouping, so
8826 // absent/default is inert. Consumed by the grouping solver (SpeedInfo).
8827 // Orca: pinned to comDevelop (rather than the default comSimple) to match the sibling multi-nozzle
8828 // dev keys and keep it out of user selectors.
8829 def = this->add("group_algo_with_time", coBool);
8830 def->mode = comDevelop;
8831 def->set_default_value(new ConfigOptionBool(false));
8832
8833 def = this->add("machine_prepare_compensation_time", coFloat);
8834 def->mode = comDevelop;
8835 def->set_default_value(new ConfigOptionFloat(260));
8836
8837 def = this->add("enable_pre_heating", coBool);
8838 def->set_default_value(new ConfigOptionBool(false));
8839
8840 // Pre-heat injector context key. handle_hotend_as_extruder is read defensively by the injector;
8841 // registered here (comDevelop, default off) as a known inert key.
8842 def = this->add("handle_hotend_as_extruder", coBool);
8843 def->mode = comDevelop;
8844 def->set_default_value(new ConfigOptionBool(false));
8845
8846 // filament_max_temperature_drop_when_ec: inert (default {0}, passed into the injector context but
8847 // never consumed). Registered inert-only (comDevelop); not wired into any estimator read, and not
8848 // added to any per-variant expansion list.
8849 def = this->add("filament_max_temperature_drop_when_ec", coFloats);
8850 def->mode = comDevelop;
8851 def->set_default_value(new ConfigOptionFloats{0});
8852
8853 def = this->add("hotend_cooling_rate", coFloats);
8854 def->nullable = true;
8855 def->set_default_value(new ConfigOptionFloatsNullable{2});
8856
8857 def = this->add("hotend_heating_rate", coFloats);
8858 def->nullable = true;
8859 def->set_default_value(new ConfigOptionFloatsNullable{2});
8860
8861 def = this->add("filament_change_length_nc", coFloats);
8862 def->label = L("Hotend change");
8863 def->tooltip = L("When changing the hotend, it is recommended to extrude a certain length of filament from the original nozzle. This helps minimize nozzle oozing.");
8864 def->sidetext = L("mm");
8865 def->min = 0;
8866 def->mode = comAdvanced;
8867 def->set_default_value(new ConfigOptionFloats{10});
8868
8869 def = this->add("filament_ramming_travel_time", coFloats);
8870 def->label = L("Extruder change");
8871 def->tooltip = L("To prevent oozing, the nozzle will perform a reverse travel movement for a certain period after "
8872 "the ramming is complete. The setting define the travel time.");
8873 def->mode = comAdvanced;
8874 def->sidetext = "s";
8875 def->min = 0;
8876 def->nullable = true;
8877 def->set_default_value(new ConfigOptionFloatsNullable{0});
8878
8879 def = this->add("filament_pre_cooling_temperature", coInts);
8880 def->label = L("Extruder change");
8881 def->tooltip = L("To prevent oozing, the nozzle temperature will be cooled during ramming. Therefore, the ramming time must be greater than the cooldown time. 0 means disabled.");
8882 def->mode = comAdvanced;
8883 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8884 def->min = 0;
8885 def->nullable = true;
8886 def->set_default_value(new ConfigOptionIntsNullable{0});
8887
8888 def = this->add("filament_ramming_volumetric_speed", coFloats);
8889 def->label = L("Extruder change");
8890 def->tooltip = L("The maximum volumetric speed for ramming before extruder change, where -1 means using the maximum volumetric speed.");
8891 def->sidetext = L("mm³/s");
8892 def->min = -1;
8893 def->max = 200;
8894 def->mode = comAdvanced;
8895 def->nullable = true;
8896 def->set_default_value(new ConfigOptionFloatsNullable{-1});
8897
8898 def = this->add("filament_ramming_travel_time_nc", coFloats);
8899 def->label = L("Hotend change");
8900 def->tooltip = L("To prevent oozing, the nozzle will perform a reverse travel movement for a certain period after "
8901 "the ramming is complete. The setting define the travel time.");
8902 def->mode = comAdvanced;
8903 def->sidetext = "s";
8904 def->min = 0;
8905 def->nullable = true;
8906 def->set_default_value(new ConfigOptionFloatsNullable{0});
8907
8908 def = this->add("filament_pre_cooling_temperature_nc", coInts);
8909 def->label = L("Hotend change");
8910 def->tooltip = L(
8911 "To prevent oozing, the nozzle temperature will be cooled during ramming. Note: only a cooldown command and fan activation are triggered, reaching the target temperature is not guaranteed. 0 means disabled.");
8912 def->mode = comAdvanced;
8913 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8914 def->min = 0;
8915 def->nullable = true;
8916 def->set_default_value(new ConfigOptionIntsNullable{0});
8917
8918 def = this->add("filament_ramming_volumetric_speed_nc", coFloats);
8919 def->label = L("Hotend change");
8920 def->tooltip = L("The maximum volumetric speed for ramming before a hotend change, where -1 means using the maximum volumetric speed.");
8921 def->sidetext = L("mm³/s");
8922 def->min = -1;
8923 def->max = 200;
8924 def->mode = comAdvanced;
8925 def->nullable = true;
8926 def->set_default_value(new ConfigOptionFloatsNullable{-1});
8927
8928 def = this->add("filament_retract_length_nc", coFloats);
8929 def->label = L("length when change hotend");
8930 def->tooltip = L("When this retraction value is modified, it will be used as the amount of filament retracted "
8931 "inside the hotend before changing hotends.");
8932 def->sidetext = L("mm");
8933 def->mode = comDevelop;
8934 def->nullable = true;
8935 def->min = 0;
8936 def->max = 18;
8937 def->set_default_value(new ConfigOptionFloatsNullable { 10. });
8938
8939 def = this->add("extruder_max_nozzle_count", coInts);
8940 def->mode = comDevelop;
8941 def->nullable = true;
8942 def->set_default_value(new ConfigOptionIntsNullable{ 1 });
8943
8944 // Printer flag gating the fast-purge mode selector in the Multi-Filament
8945 // UI. comDevelop, default false; profiles of printers that support fast purge
8946 // enable it, which shows the purge-mode selector for those printers.
8947 def = this->add("support_fast_purge_mode", coBool);
8948 def->label = L("Support fast purge mode");
8949 def->tooltip = L("Whether this printer supports fast purge mode with optimized temperature and multiplier.");
8950 def->mode = comDevelop;
8951 def->set_default_value(new ConfigOptionBool(false));
8952
8953 // Used by the Type1 wipe tower: filament_prime_volume on a filament change,
8954 // filament_prime_volume_nc on a hotend/nozzle change. Type2 uses prime_volume instead.
8955 def = this->add("filament_prime_volume", coFloats);
8956 def->label = L("Filament change");
8957 def->tooltip = L("The volume of material required to prime the extruder on the tower, excluding a hotend change.");
8958 def->sidetext = L("mm³");
8959 def->min = 1.0;
8960 def->mode = comSimple;
8961 def->set_default_value(new ConfigOptionFloats{45.});
8962
8963 def = this->add("filament_prime_volume_nc", coFloats);
8964 def->label = L("Hotend change");
8965 def->tooltip = L("The volume of material required to prime the extruder for a hotend change on the tower.");
8966 def->sidetext = L("mm³");
8967 def->min = 1.0;
8968 def->mode = comSimple;
8969 def->set_default_value(new ConfigOptionFloats{60.});
8970
8971 def = this->add("filament_preheat_temperature_delta", coFloats);
8972 def->label = L("Preheat temperature delta");
8973 def->tooltip = L("Temperature delta applied during pre-heating before tool change.");
8974 def->sidetext = L(u8"\u2103" /* °C */); // degrees Celsius, CIS languages need translation
8975 def->mode = comDevelop;
8976 def->nullable = true;
8977 def->set_default_value(new ConfigOptionFloatsNullable{0});
8978
8979 def = this->add("detect_narrow_internal_solid_infill", coBool);
8980 def->label = L("Detect narrow internal solid infills");
8981 def->category = L("Strength");
8982 def->tooltip = L("This option will auto-detect narrow internal solid infill areas. "
8983 "If enabled, the concentric pattern will be used for the area to speed up printing. "
8984 "Otherwise, the rectilinear pattern will be used by default.");
8985 def->mode = comAdvanced;
8986 def->set_default_value(new ConfigOptionBool(true));
8987}
#define L_CONTEXT(s, context)
Definition DesignOffer.hpp:17
#define INITIAL_RAFT_LAYERS
Definition PrintConfigConstants.hpp:6
#define INITIAL_REDUCE_CROSSING_WALL
Definition PrintConfigConstants.hpp:7
ConfigOptionDef * add_nullable(const t_config_option_key &opt_key, ConfigOptionType type)
Definition Config.cpp:374
@ f_enum_open
Definition Config.hpp:2323
@ i_enum_open
Definition Config.hpp:2321
@ color
Definition Config.hpp:2325
@ plugin_picker
Definition Config.hpp:2334
static double nil_value()
Definition Config.hpp:899
std::vector< double > values
Definition Config.hpp:418
static const std::vector< MaterialTypeInfo > & all()
Definition MaterialType.cpp:18
@ gcfMarlinLegacy
Definition PrintConfig.hpp:52
ConfigOptionMode
Definition Config.hpp:221
@ btAutoBrim
Definition PrintConfig.hpp:455
@ ipMonotonic
Definition PrintConfig.hpp:127
@ ipMonotonicLine
Definition PrintConfig.hpp:127
@ ipRectilinear
Definition PrintConfig.hpp:128
@ ipCrossHatch
Definition PrintConfig.hpp:133
@ spAligned
Definition PrintConfig.hpp:395
ConfigOptionBoolsTempl< true > ConfigOptionBoolsNullable
Definition Config.hpp:2067
@ nvtStandard
Definition PrintConfig.hpp:619
@ flsAuto
Definition PrintConfig.hpp:527
@ stCombined
Definition PrintConfig.hpp:474
@ PrinterConfiguration
Definition PrintConfig.hpp:232
@ smipAuto
Definition PrintConfig.hpp:374
@ Regular
Definition PrintConfig.hpp:329
ConfigOptionEnumsGenericTempl< false > ConfigOptionEnumsGeneric
Definition Config.hpp:2311
@ X
Definition PrintConfig.hpp:343
@ zhtSlope
Definition PrintConfig.hpp:585
ConfigOptionPercentsTempl< true > ConfigOptionPercentsNullable
Definition Config.hpp:1335
@ CounterClockwise
Definition PrintConfig.hpp:255
@ Disabled
Definition PrintConfig.hpp:239
@ btPC
Definition PrintConfig.hpp:509
ConfigOptionIntsTempl< true > ConfigOptionIntsNullable
Definition Config.hpp:1155
@ Disabled
Definition PrintConfig.hpp:291
@ chbNone
Definition PrintConfig.hpp:602
@ Overhang_threshold_bridge
Definition PrintConfig.hpp:503
@ gftNowhere
Definition PrintConfig.hpp:425
@ eblDisabled
Definition PrintConfig.hpp:420
@ ibfDisabled
Definition PrintConfig.hpp:415
@ tlTraditional
Definition PrintConfig.hpp:469
@ htOctoPrint
Definition PrintConfig.hpp:119
@ Displacement
Definition PrintConfig.hpp:86
@ pvmDefault
Definition PrintConfig.hpp:657
@ ntUndefine
Definition CommonDefs.hpp:14
@ ByLayer
Definition PrintConfig.hpp:311
@ smpDefault
Definition PrintConfig.hpp:356
@ Each_Surface
Definition PrintConfig.hpp:99
ConfigOptionIntsTempl< false > ConfigOptionInts
Definition Config.hpp:1154
@ Disabled_fuzzy
Definition PrintConfig.hpp:82
@ etDirectDrive
Definition PrintConfig.hpp:613
@ Linear
Definition PrintConfig.hpp:304
ConfigOptionBoolsTempl< false > ConfigOptionBools
Definition Config.hpp:2066
@ Type2
Definition PrintConfig.hpp:115
@ Default
Definition PrintConfig.hpp:492
@ Default
Definition PrintConfig.hpp:283
ConfigOptionFloatsOrPercentsTempl< true > ConfigOptionFloatsOrPercentsNullable
Definition Config.hpp:1532
@ Default
Definition PrintConfig.hpp:319
ConfigOptionPercentsTempl< false > ConfigOptionPercents
Definition Config.hpp:1334
@ stNormalAuto
Definition PrintConfig.hpp:379
@ NoIroning
Definition PrintConfig.hpp:203
@ fmmAutoForFlush
Definition PrintConfig.hpp:633
@ PNG
Definition PrintConfig.hpp:598
@ FrontLeft
Definition PrintConfig.hpp:263
@ evstAll
Definition PrintConfig.hpp:410
@ InnerOuter
Definition PrintConfig.hpp:246
const std::vector< std::string > filament_extruder_override_keys
Definition PrintConfig.cpp:97
@ psUndefine
Definition PrintConfig.hpp:558
static const t_config_enum_values s_keys_map_BedType
Definition PrintConfig.cpp:606
@ Default
Definition PrintConfig.hpp:566
@ smsDefault
Definition PrintConfig.hpp:363
@ btfHighestTemp
Definition PrintConfig.hpp:226
ConfigOptionEnumsGenericTempl< true > ConfigOptionEnumsGenericNullable
Definition Config.hpp:2312
RemapAxis
Definition PrintConfig.hpp:349
@ PosX
Definition PrintConfig.hpp:350
@ PosY
Definition PrintConfig.hpp:350
@ PosZ
Definition PrintConfig.hpp:350
@ coFloatsOrPercents
Definition Config.hpp:202
@ coPoint
Definition Config.hpp:204
@ coBools
Definition Config.hpp:212
@ coPercents
Definition Config.hpp:198
@ coInts
Definition Config.hpp:190
@ coEnums
Definition Config.hpp:216
@ coFloatOrPercent
Definition Config.hpp:200
void append(std::vector< T, Alloc > &dest, const std::vector< T, Alloc2 > &src)
Definition libslic3r.h:157
@ Standard
Definition PrintConfig.hpp:273
@ wtwRib
Definition PrintConfig.hpp:608
@ fdUndefine
Definition PrintConfig.hpp:532
@ dsDisabled
Definition PrintConfig.hpp:478
@ InwardAndOutward
Definition PrintConfig.hpp:93
@ None
Definition PrintConfig.hpp:400
@ Classic
Definition PrintConfig.hpp:105
@ Arachne
Definition PrintConfig.hpp:487

References Slic3r::ConfigDef::add(), Slic3r::ConfigDef::add_nullable(), Slic3r::ConfigOptionDef::aliases, Slic3r::MaterialType::all(), Slic3r::append(), Slic3r::Arachne, Slic3r::btAutoBrim, Slic3r::btfHighestTemp, Slic3r::btPC, Slic3r::ByLayer, Slic3r::ConfigOptionDef::category, Slic3r::chbNone, Slic3r::Classic, Slic3r::ConfigOptionDef::cli, Slic3r::coBool, Slic3r::coBools, Slic3r::coEnum, Slic3r::coEnums, Slic3r::coFloat, Slic3r::coFloatOrPercent, Slic3r::coFloats, Slic3r::coFloatsOrPercents, Slic3r::coInt, Slic3r::coInts, Slic3r::ConfigOptionDef::color, Slic3r::comAdvanced, Slic3r::comDevelop, Slic3r::comExpert, Slic3r::comSimple, Slic3r::ConfigOptionFloat, Slic3r::ConfigOptionString, Slic3r::coPercent, Slic3r::coPercents, Slic3r::coPoint, Slic3r::coPoints, Slic3r::coString, Slic3r::coStrings, Slic3r::CounterClockwise, Slic3r::Default, Slic3r::Disabled, Slic3r::Disabled_fuzzy, Slic3r::Displacement, Slic3r::dsDisabled, Slic3r::Each_Surface, Slic3r::eblDisabled, Slic3r::ConfigOptionDef::enum_keys_map, Slic3r::ConfigOptionDef::enum_labels, Slic3r::ConfigOptionDef::enum_values, Slic3r::etDirectDrive, Slic3r::evstAll, Slic3r::ConfigOptionDef::f_enum_open, Slic3r::fdUndefine, Slic3r::filament_extruder_override_keys, Slic3r::flsAuto, Slic3r::fmmAutoForFlush, Slic3r::FrontLeft, Slic3r::ConfigOptionDef::full_label, Slic3r::ConfigOptionDef::full_width, Slic3r::gcfMarlinLegacy, Slic3r::ConfigOptionEnum< T >::get_enum_values(), Slic3r::gftNowhere, Slic3r::ConfigOptionDef::gui_flags, Slic3r::ConfigOptionDef::gui_type, Slic3r::ConfigOptionDef::height, Slic3r::htOctoPrint, Slic3r::ConfigOptionDef::i_enum_open, Slic3r::ibfDisabled, INITIAL_RAFT_LAYERS, INITIAL_REDUCE_CROSSING_WALL, Slic3r::InnerOuter, Slic3r::InwardAndOutward, Slic3r::ipCrossHatch, Slic3r::ipMonotonic, Slic3r::ipMonotonicLine, Slic3r::ipRectilinear, L, L_CONTEXT, Slic3r::ConfigOptionDef::label, Slic3r::Linear, Slic3r::ConfigOptionDef::max, Slic3r::ConfigOptionDef::max_literal, Slic3r::ConfigOptionDef::min, Slic3r::ConfigOptionDef::mode, Slic3r::ConfigOptionDef::multiline, Slic3r::ConfigOptionFloatsTempl< true >::nil_value(), Slic3r::ConfigOptionPercentsTempl< true >::nil_value(), Slic3r::ConfigOptionDef::nocli, Slic3r::NoIroning, Slic3r::None, Slic3r::ntUndefine, Slic3r::ConfigOptionDef::nullable, Slic3r::nvtStandard, Slic3r::ConfigOptionDef::one_string, Slic3r::ConfigDef::options, Slic3r::Overhang_threshold_bridge, Slic3r::ConfigOptionDef::plugin_picker, Slic3r::ConfigOptionDef::plugin_type, Slic3r::PNG, Slic3r::PosX, Slic3r::PosY, Slic3r::PosZ, Slic3r::PrinterConfiguration, Slic3r::psUndefine, Slic3r::pvmDefault, Slic3r::ConfigOptionDef::ratio_over, Slic3r::ConfigOptionDef::readonly, Slic3r::Regular, Slic3r::s_keys_map_BedType, Slic3r::ConfigOptionDef::set_default_value(), Slic3r::ConfigOptionDef::sidetext, Slic3r::smipAuto, Slic3r::smpDefault, Slic3r::smsDefault, Slic3r::spAligned, Slic3r::Standard, Slic3r::stCombined, Slic3r::stNormalAuto, Slic3r::tlTraditional, Slic3r::ConfigOptionDef::tooltip, Slic3r::ConfigOptionDef::type, Slic3r::Type2, Slic3r::wtwRib, Slic3r::X, and Slic3r::zhtSlope.

Referenced by PrintConfigDef().

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

◆ init_filament_option_keys()

void Slic3r::PrintConfigDef::init_filament_option_keys ( )
private
9053{
9055 "default_filament_profile",
9056 "deretraction_speed",
9057 "filament_colour",
9058 "filament_diameter",
9059 "filament_retract_length_nc",
9060 // "filament_seam_gap",
9061 "long_retractions_when_cut",
9062 "max_layer_height",
9063 "min_layer_height",
9064 "retract_after_wipe",
9065 "retract_before_wipe",
9066 "retract_length_toolchange",
9067 "retract_lift_above",
9068 "retract_lift_below",
9069 "retract_lift_enforce",
9070 "retract_restart_extra",
9071 "retract_restart_extra_toolchange",
9072 "retract_when_changing_layer",
9073 "retraction_distances_when_cut",
9074 "retraction_length",
9075 "retraction_minimum_travel",
9076 "retraction_speed",
9077 "volumetric_speed_coefficients",
9078 "wipe",
9079 "wipe_distance",
9080 "z_hop",
9081 "z_hop_types",
9082 };
9083
9085 "deretraction_speed",
9086 "filament_retract_length_nc",
9087 "long_retractions_when_cut",
9088 "retract_after_wipe",
9089 "retract_before_wipe",
9090 "retract_lift_above",
9091 "retract_lift_below",
9092 "retract_lift_enforce",
9093 "retract_restart_extra",
9094 "retract_when_changing_layer",
9095 "retraction_distances_when_cut",
9096 "retraction_length",
9097 "retraction_minimum_travel",
9098 "retraction_speed",
9099 "wipe",
9100 "wipe_distance",
9101 "z_hop",
9102 "z_hop_types"
9103 };
9104 assert(std::is_sorted(m_filament_retract_keys.begin(), m_filament_retract_keys.end()));
9105}

References m_filament_option_keys, and m_filament_retract_keys.

◆ init_sla_params()

void Slic3r::PrintConfigDef::init_sla_params ( )
private
9108{
9109 ConfigOptionDef* def;
9110
9111 // SLA Printer settings
9112
9113 def = this->add("display_width", coFloat);
9114 //def->label = L("");
9115 //def->tooltip = L("");
9116 def->min = 1;
9117 def->set_default_value(new ConfigOptionFloat(120.));
9118
9119 def = this->add("display_height", coFloat);
9120 //def->label = L("");
9121 //def->tooltip = L("");
9122 def->min = 1;
9123 def->set_default_value(new ConfigOptionFloat(68.));
9124
9125 def = this->add("display_pixels_x", coInt);
9126 //def->full_label = L("");
9127 def->label = L_CONTEXT("X", "Axis");
9128 //def->tooltip = L("");
9129 def->min = 100;
9130 def->set_default_value(new ConfigOptionInt(2560));
9131
9132 def = this->add("display_pixels_y", coInt);
9133 //def->full_label = L("");
9134 def->label = L_CONTEXT("Y", "Axis");
9135 //def->tooltip = L("");
9136 def->min = 100;
9137 def->set_default_value(new ConfigOptionInt(1440));
9138
9139 def = this->add("display_mirror_x", coBool);
9140 //def->full_label = L("");
9141 //def->label = L("");
9142 //def->tooltip = L("");
9143 def->mode = comAdvanced;
9144 def->set_default_value(new ConfigOptionBool(true));
9145
9146 def = this->add("display_mirror_y", coBool);
9147 //def->full_label = L("");
9148 //def->label = L("");
9149 //def->tooltip = L("");
9150 def->mode = comAdvanced;
9151 def->set_default_value(new ConfigOptionBool(false));
9152
9153 def = this->add("display_orientation", coEnum);
9154 //def->label = L("");
9155 //def->tooltip = L("");
9157 def->enum_values.push_back("landscape");
9158 def->enum_values.push_back("portrait");
9159 def->enum_labels.push_back(" ");
9160 def->enum_labels.push_back(" ");
9161 def->mode = comAdvanced;
9162 def->set_default_value(new ConfigOptionEnum<SLADisplayOrientation>(sladoPortrait));
9163
9164 def = this->add("fast_tilt_time", coFloat);
9165 //def->label = L("");
9166 //def->full_label = L("");
9167 //def->tooltip = L("");
9168 //def->sidetext = "";
9169 def->min = 0;
9170 def->mode = comAdvanced;
9171 def->set_default_value(new ConfigOptionFloat(5.));
9172
9173 def = this->add("slow_tilt_time", coFloat);
9174 //def->label = L("");
9175 //def->full_label = L("");
9176 //def->tooltip = L("");
9177 //def->sidetext = "";
9178 def->min = 0;
9179 def->mode = comAdvanced;
9180 def->set_default_value(new ConfigOptionFloat(8.));
9181
9182 def = this->add("area_fill", coFloat);
9183 //def->label = L("");
9184 //def->tooltip = L("");
9185 //def->sidetext = "";
9186 def->min = 0;
9187 def->mode = comAdvanced;
9188 def->set_default_value(new ConfigOptionFloat(50.));
9189
9190 def = this->add("relative_correction", coFloats);
9191 //def->label = L("");
9192 //def->full_label = L("");
9193 //def->tooltip = L("");
9194 def->min = 0;
9195 def->mode = comAdvanced;
9196 def->set_default_value(new ConfigOptionFloats( { 1., 1.} ));
9197
9198 def = this->add("relative_correction_x", coFloat);
9199 //def->label = L("");
9200 //def->full_label = L("");
9201 //def->tooltip = L("");
9202 def->min = 0;
9203 def->mode = comAdvanced;
9204 def->set_default_value(new ConfigOptionFloat(1.));
9205
9206 def = this->add("relative_correction_y", coFloat);
9207 //def->label = L("");
9208 //def->full_label = L("");
9209 //def->tooltip = L("");
9210 def->min = 0;
9211 def->mode = comAdvanced;
9212 def->set_default_value(new ConfigOptionFloat(1.));
9213
9214 def = this->add("relative_correction_z", coFloat);
9215 //def->label = L("");
9216 //def->full_label = L("");
9217 //def->tooltip = L("");
9218 def->min = 0;
9219 def->mode = comAdvanced;
9220 def->set_default_value(new ConfigOptionFloat(1.));
9221
9222 def = this->add("absolute_correction", coFloat);
9223 //def->label = L("");
9224 //def->full_label = L("");
9225 //def->tooltip = L("");
9226 def->mode = comAdvanced;
9227 def->set_default_value(new ConfigOptionFloat(0.0));
9228
9229 def = this->add("elefant_foot_min_width", coFloat);
9230 //def->label = L("");
9231 //def->category = L("");
9232 //def->tooltip = L("");
9233 //def->sidetext = "";
9234 def->min = 0;
9235 def->mode = comAdvanced;
9236 def->set_default_value(new ConfigOptionFloat(0.2));
9237
9238 def = this->add("gamma_correction", coFloat);
9239 //def->label = L("");
9240 //def->full_label = L("");
9241 //def->tooltip = L("");
9242 def->min = 0;
9243 def->max = 1;
9244 def->mode = comAdvanced;
9245 def->set_default_value(new ConfigOptionFloat(1.0));
9246
9247
9248 // SLA Material settings.
9249
9250 def = this->add("material_colour", coString);
9251 //def->label = L("");
9252 //def->tooltip = L("");
9253 def->gui_type = ConfigOptionDef::GUIType::color;
9254 def->set_default_value(new ConfigOptionString("#29B2B2"));
9255
9256 def = this->add("material_type", coString);
9257 //def->label = L("");
9258 //def->tooltip = L("");
9259 def->gui_type = ConfigOptionDef::GUIType::f_enum_open; // TODO: ???
9260 def->gui_flags = "show_value";
9261 def->enum_values.push_back("Tough");
9262 def->enum_values.push_back("Flexible");
9263 def->enum_values.push_back("Casting");
9264 def->enum_values.push_back("Dental");
9265 def->enum_values.push_back("Heat-resistant");
9266 def->set_default_value(new ConfigOptionString("Tough"));
9267
9268 def = this->add("initial_layer_height", coFloat);
9269 //def->label = L("");
9270 //def->tooltip = L("");
9271 //def->sidetext = "";
9272 def->min = 0;
9273 def->set_default_value(new ConfigOptionFloat(0.3));
9274
9275 def = this->add("bottle_volume", coFloat);
9276 //def->label = L("");
9277 //def->tooltip = L("");
9278 //def->sidetext = "";
9279 def->min = 50;
9280 def->set_default_value(new ConfigOptionFloat(1000.0));
9281
9282 def = this->add("bottle_weight", coFloat);
9283 //def->label = L("");
9284 //def->tooltip = L("");
9285 //def->sidetext = "";
9286 def->min = 0;
9287 def->set_default_value(new ConfigOptionFloat(1.0));
9288
9289 def = this->add("material_density", coFloat);
9290 //def->label = L("");
9291 //def->tooltip = L("");
9292 //def->sidetext = "";
9293 def->min = 0;
9294 def->set_default_value(new ConfigOptionFloat(1.0));
9295
9296 def = this->add("bottle_cost", coFloat);
9297 //def->label = L("");
9298 //def->tooltip = L("");
9299 //def->sidetext = "";
9300 def->min = 0;
9301 def->set_default_value(new ConfigOptionFloat(0.0));
9302
9303 def = this->add("faded_layers", coInt);
9304 //def->label = L("");
9305 //def->tooltip = L("");
9306 def->min = 3;
9307 def->max = 20;
9308 def->mode = comAdvanced;
9309 def->set_default_value(new ConfigOptionInt(10));
9310
9311 def = this->add("min_exposure_time", coFloat);
9312 //def->label = L("");
9313 //def->tooltip = L("");
9314 //def->sidetext = "";
9315 def->min = 0;
9316 def->mode = comAdvanced;
9317 def->set_default_value(new ConfigOptionFloat(0));
9318
9319 def = this->add("max_exposure_time", coFloat);
9320 //def->label = L("");
9321 //def->tooltip = L("");
9322 //def->sidetext = "";
9323 def->min = 0;
9324 def->mode = comAdvanced;
9325 def->set_default_value(new ConfigOptionFloat(100));
9326
9327 def = this->add("exposure_time", coFloat);
9328 //def->label = L("");
9329 //def->tooltip = L("");
9330 //def->sidetext = "";
9331 def->min = 0;
9332 def->set_default_value(new ConfigOptionFloat(10));
9333
9334 def = this->add("min_initial_exposure_time", coFloat);
9335 //def->label = L("");
9336 //def->tooltip = L("");
9337 //def->sidetext = "";
9338 def->min = 0;
9339 def->mode = comAdvanced;
9340 def->set_default_value(new ConfigOptionFloat(0));
9341
9342 def = this->add("max_initial_exposure_time", coFloat);
9343 //def->label = L("");
9344 //def->tooltip = L("");
9345 //def->sidetext = "";
9346 def->min = 0;
9347 def->mode = comAdvanced;
9348 def->set_default_value(new ConfigOptionFloat(150));
9349
9350 def = this->add("initial_exposure_time", coFloat);
9351 //def->label = L("");
9352 //def->tooltip = L("");
9353 //def->sidetext = "";
9354 def->min = 0;
9355 def->set_default_value(new ConfigOptionFloat(15));
9356
9357 def = this->add("material_correction", coFloats);
9358 //def->full_label = L("");
9359 //def->tooltip = L("");
9360 def->min = 0;
9361 def->mode = comAdvanced;
9362 def->set_default_value(new ConfigOptionFloats( { 1., 1., 1. } ));
9363
9364 def = this->add("material_correction_x", coFloat);
9365 //def->full_label = L("");
9366 //def->tooltip = L("");
9367 def->min = 0;
9368 def->mode = comAdvanced;
9369 def->set_default_value(new ConfigOptionFloat(1.));
9370
9371 def = this->add("material_correction_y", coFloat);
9372 //def->full_label = L("");
9373 //def->tooltip = L("");
9374 def->min = 0;
9375 def->mode = comAdvanced;
9376 def->set_default_value(new ConfigOptionFloat(1.));
9377
9378 def = this->add("material_correction_z", coFloat);
9379 //def->full_label = L("");
9380 //def->tooltip = L("");
9381 def->min = 0;
9382 def->mode = comAdvanced;
9383 def->set_default_value(new ConfigOptionFloat(1.));
9384
9385 def = this->add("material_vendor", coString);
9386 //def->label = L("");
9387 //def->tooltip = L("");
9388 def->set_default_value(new ConfigOptionString());
9389 def->cli = ConfigOptionDef::nocli;
9390
9391 def = this->add("default_sla_material_profile", coString);
9392 //def->label = L("");
9393 //def->tooltip = L("");
9394 def->set_default_value(new ConfigOptionString());
9395 def->cli = ConfigOptionDef::nocli;
9396
9397 def = this->add("sla_material_settings_id", coString);
9398 //def->label = L("");
9399 //def->tooltip = L("");
9400 def->set_default_value(new ConfigOptionString());
9401 def->cli = ConfigOptionDef::nocli;
9402
9403 def = this->add("default_sla_print_profile", coString);
9404 //def->label = L("");
9405 //def->tooltip = L("");
9406 def->set_default_value(new ConfigOptionString());
9407 def->cli = ConfigOptionDef::nocli;
9408
9409 def = this->add("sla_print_settings_id", coString);
9410 //def->label = L("");
9411 //def->tooltip = L("");
9412 def->set_default_value(new ConfigOptionString());
9413 def->cli = ConfigOptionDef::nocli;
9414
9415 def = this->add("supports_enable", coBool);
9416 //def->label = L("");
9417 //def->category = L("");
9418 //def->tooltip = L("");
9419 def->mode = comSimple;
9420 def->set_default_value(new ConfigOptionBool(true));
9421
9422 def = this->add("support_head_front_diameter", coFloat);
9423 //def->label = L("");
9424 //def->category = L("");
9425 //def->tooltip = L("");
9426 //def->sidetext = "";
9427 def->min = 0;
9428 def->mode = comAdvanced;
9429 def->set_default_value(new ConfigOptionFloat(0.4));
9430
9431 def = this->add("support_head_penetration", coFloat);
9432 //def->label = L("");
9433 //def->category = L("");
9434 //def->tooltip = L("");
9435 //def->sidetext = "";
9436 def->mode = comAdvanced;
9437 def->min = 0;
9438 def->set_default_value(new ConfigOptionFloat(0.2));
9439
9440 def = this->add("support_head_width", coFloat);
9441 //def->label = L("");
9442 //def->category = L("");
9443 //def->tooltip = L("");
9444 //def->sidetext = "";
9445 def->min = 0;
9446 def->max = 20;
9447 def->mode = comAdvanced;
9448 def->set_default_value(new ConfigOptionFloat(1.0));
9449
9450 def = this->add("support_pillar_diameter", coFloat);
9451 //def->label = L("");
9452 //def->category = L("");
9453 //def->tooltip = L("");
9454 //def->sidetext = "";
9455 def->min = 0;
9456 def->max = 15;
9457 def->mode = comSimple;
9458 def->set_default_value(new ConfigOptionFloat(1.0));
9459
9460 def = this->add("support_small_pillar_diameter_percent", coPercent);
9461 //def->label = L("");
9462 //def->category = L("");
9463 //def->tooltip = L("");
9464 //def->sidetext = "";
9465 def->min = 1;
9466 def->max = 100;
9467 def->mode = comAdvanced;
9468 def->set_default_value(new ConfigOptionPercent(50));
9469
9470 def = this->add("support_max_bridges_on_pillar", coInt);
9471 //def->label = L("");
9472 //def->tooltip = L("");
9473 def->min = 0;
9474 def->max = 50;
9475 def->mode = comAdvanced;
9476 def->set_default_value(new ConfigOptionInt(3));
9477
9478 def = this->add("support_pillar_connection_mode", coEnum);
9479 //def->label = L("");
9480 //def->tooltip = L("");
9482 def->enum_values.push_back("zigzag");
9483 def->enum_values.push_back("cross");
9484 def->enum_values.push_back("dynamic");
9485 def->enum_labels.push_back(" ");
9486 def->enum_labels.push_back(" ");
9487 def->enum_labels.push_back(" ");
9488 def->mode = comAdvanced;
9489 def->set_default_value(new ConfigOptionEnum<SLAPillarConnectionMode>(slapcmDynamic));
9490
9491 def = this->add("support_buildplate_only", coBool);
9492 //def->label = L("");
9493 //def->category = L("");
9494 //def->tooltip = L("");
9495 def->mode = comSimple;
9496 def->set_default_value(new ConfigOptionBool(false));
9497
9498 def = this->add("support_pillar_widening_factor", coFloat);
9499 //def->label = L("");
9500 //def->category = L("");
9501 //def->tooltip = L("");
9502 def->min = 0;
9503 def->max = 1;
9504 def->mode = comAdvanced;
9505 def->set_default_value(new ConfigOptionFloat(0.0));
9506
9507 def = this->add("support_base_diameter", coFloat);
9508 //def->label = L("");
9509 //def->category = L("");
9510 //def->tooltip = L("");
9511 //def->sidetext = "";
9512 def->min = 0;
9513 def->max = 30;
9514 def->mode = comAdvanced;
9515 def->set_default_value(new ConfigOptionFloat(4.0));
9516
9517 def = this->add("support_base_height", coFloat);
9518 //def->label = L("");
9519 //def->category = L("");
9520 //def->tooltip = L("");
9521 //def->sidetext = "";
9522 def->min = 0;
9523 def->mode = comAdvanced;
9524 def->set_default_value(new ConfigOptionFloat(1.0));
9525
9526 def = this->add("support_base_safety_distance", coFloat);
9527 //def->label = L("");
9528 //def->category = L("");
9529 //def->tooltip = L("");
9530 //def->sidetext = "";
9531 def->min = 0;
9532 def->max = 10;
9533 def->mode = comAdvanced;
9534 def->set_default_value(new ConfigOptionFloat(1));
9535
9536 def = this->add("support_critical_angle", coFloat);
9537 //def->label = L("");
9538 //def->category = L("");
9539 //def->tooltip = L("");
9540 //def->sidetext = "";
9541 def->min = 0;
9542 def->max = 90;
9543 def->mode = comAdvanced;
9544 def->set_default_value(new ConfigOptionFloat(45));
9545
9546 def = this->add("support_max_bridge_length", coFloat);
9547 //def->label = L("");
9548 //def->category = L("");
9549 //def->tooltip = L("");
9550 //def->sidetext = "";
9551 def->min = 0;
9552 def->mode = comAdvanced;
9553 def->set_default_value(new ConfigOptionFloat(15.0));
9554
9555 def = this->add("support_max_pillar_link_distance", coFloat);
9556 //def->label = L("");
9557 //def->category = L("");
9558 //def->tooltip = L("");
9559 //def->sidetext = "";
9560 def->min = 0; // 0 means no linking
9561 def->mode = comAdvanced;
9562 def->set_default_value(new ConfigOptionFloat(10.0));
9563
9564 def = this->add("support_object_elevation", coFloat);
9565 //def->label = L("");
9566 //def->category = L("");
9567 //def->tooltip = L("");
9568 //def->sidetext = "";
9569 def->min = 0;
9570 def->max = 150; // This is the max height of print on SL1
9571 def->mode = comAdvanced;
9572 def->set_default_value(new ConfigOptionFloat(5.0));
9573
9574 def = this->add("support_points_density_relative", coInt);
9575 //def->label = L("");
9576 //def->category = L("");
9577 //def->tooltip = L("");
9578 //def->sidetext = "";
9579 def->min = 0;
9580 def->set_default_value(new ConfigOptionInt(100));
9581
9582 def = this->add("support_points_minimal_distance", coFloat);
9583 //def->label = L("");
9584 //def->category = L("");
9585 //def->tooltip = L("");
9586 def->sidetext = L("mm"); // millimeters, CIS languages need translation
9587 def->min = 0;
9588 def->set_default_value(new ConfigOptionFloat(1.));
9589
9590 def = this->add("pad_enable", coBool);
9591 //def->label = L("");
9592 //def->category = L("");
9593 //def->tooltip = L("");
9594 def->mode = comSimple;
9595 def->set_default_value(new ConfigOptionBool(true));
9596
9597 def = this->add("pad_wall_thickness", coFloat);
9598 //def->label = L("");
9599 //def->category = L("");
9600 //def->tooltip = L("");
9601 //def->sidetext = "";
9602 def->min = 0;
9603 def->max = 30;
9604 def->mode = comSimple;
9605 def->set_default_value(new ConfigOptionFloat(2.0));
9606
9607 def = this->add("pad_wall_height", coFloat);
9608 //def->label = L("");
9609 //def->tooltip = L("");
9610 //def->category = L("");
9611 //def->sidetext = "";
9612 def->min = 0;
9613 def->max = 30;
9614 def->mode = comAdvanced;
9615 def->set_default_value(new ConfigOptionFloat(0.));
9616
9617 def = this->add("pad_brim_size", coFloat);
9618 //def->label = L("");
9619 //def->tooltip = L("");
9620 //def->category = L("");
9621 //def->sidetext = "";
9622 def->min = 0;
9623 def->max = 30;
9624 def->mode = comAdvanced;
9625 def->set_default_value(new ConfigOptionFloat(1.6));
9626
9627 def = this->add("pad_max_merge_distance", coFloat);
9628 //def->label = L("");
9629 //def->category = L("");
9630 //def->tooltip = L("");
9631 //def->sidetext = "";
9632 def->min = 0;
9633 def->mode = comAdvanced;
9634 def->set_default_value(new ConfigOptionFloat(50.0));
9635
9636 def = this->add("pad_wall_slope", coFloat);
9637 //def->label = L("");
9638 //def->category = L("");
9639 //def->tooltip = L("");
9640 //def->sidetext = "";
9641 def->min = 45;
9642 def->max = 90;
9643 def->mode = comAdvanced;
9644 def->set_default_value(new ConfigOptionFloat(90.0));
9645
9646 def = this->add("pad_around_object", coBool);
9647 //def->label = L("");
9648 //def->category = L("");
9649 //def->tooltip = L("");
9650 def->mode = comSimple;
9651 def->set_default_value(new ConfigOptionBool(false));
9652
9653 def = this->add("pad_around_object_everywhere", coBool);
9654 //def->label = L("");
9655 //def->category = L("");
9656 //def->tooltip = L("");
9657 def->mode = comSimple;
9658 def->set_default_value(new ConfigOptionBool(false));
9659
9660 def = this->add("pad_object_gap", coFloat);
9661 //def->label = L("");
9662 //def->category = L("");
9663 //def->tooltip = L("");
9664 //def->sidetext = "";
9665 def->min = 0;
9666 def->max = 10;
9667 def->mode = comAdvanced;
9668 def->set_default_value(new ConfigOptionFloat(1));
9669
9670 def = this->add("pad_object_connector_stride", coFloat);
9671 //def->label = L("");
9672 //def->category = L("");
9673 //def->tooltip = L("");
9674 //def->sidetext = "";
9675 def->min = 0;
9676 def->mode = comAdvanced;
9677 def->set_default_value(new ConfigOptionFloat(10));
9678
9679 def = this->add("pad_object_connector_width", coFloat);
9680 //def->label = L("");
9681 //def->category = L("");
9682 //def->tooltip = L("");
9683 //def->sidetext = "";
9684 def->min = 0;
9685 def->mode = comAdvanced;
9686 def->set_default_value(new ConfigOptionFloat(0.5));
9687
9688 def = this->add("pad_object_connector_penetration", coFloat);
9689 //def->label = L("");
9690 //def->category = L("");
9691 //def->tooltip = L("");
9692 //def->sidetext = "";
9693 def->min = 0;
9694 def->mode = comAdvanced;
9695 def->set_default_value(new ConfigOptionFloat(0.3));
9696
9697 def = this->add("hollowing_enable", coBool);
9698 //def->label = L("");
9699 //def->category = L("");
9700 //def->tooltip = L("");
9701 def->mode = comSimple;
9702 def->set_default_value(new ConfigOptionBool(false));
9703
9704 def = this->add("hollowing_min_thickness", coFloat);
9705 //def->label = L("");
9706 //def->category = L("");
9707 //def->tooltip = L("");
9708 //def->sidetext = "";
9709 def->min = 1;
9710 def->max = 10;
9711 def->mode = comSimple;
9712 def->set_default_value(new ConfigOptionFloat(3.));
9713
9714 def = this->add("hollowing_quality", coFloat);
9715 //def->label = L("");
9716 //def->category = L("");
9717 //def->tooltip = L("");
9718 def->min = 0;
9719 def->max = 1;
9720 def->mode = comAdvanced;
9721 def->set_default_value(new ConfigOptionFloat(0.5));
9722
9723 def = this->add("hollowing_closing_distance", coFloat);
9724 //def->label = L("");
9725 //def->category = L("");
9726 //def->tooltip = L("");
9727 def->sidetext = L("mm"); // millimeters, CIS languages need translation
9728 def->min = 0;
9729 def->max = 10;
9730 def->mode = comAdvanced;
9731 def->set_default_value(new ConfigOptionFloat(2.0));
9732
9733 def = this->add("material_print_speed", coEnum);
9734 //def->label = L("");
9735 //def->tooltip = L("");
9737 def->enum_values.push_back("slow");
9738 def->enum_values.push_back("fast");
9739 def->enum_labels.push_back(" ");
9740 def->enum_labels.push_back(" ");
9741 def->mode = comAdvanced;
9742 def->set_default_value(new ConfigOptionEnum<SLAMaterialSpeed>(slamsFast));
9743}
@ sladoPortrait
Definition PrintConfig.hpp:445
@ slapcmDynamic
Definition PrintConfig.hpp:451

References Slic3r::ConfigDef::add(), Slic3r::ConfigOptionDef::cli, Slic3r::coBool, Slic3r::coEnum, Slic3r::coFloat, Slic3r::coFloats, Slic3r::coInt, Slic3r::ConfigOptionDef::color, Slic3r::comAdvanced, Slic3r::comSimple, Slic3r::ConfigOptionFloat, Slic3r::ConfigOptionString, Slic3r::coPercent, Slic3r::coString, Slic3r::ConfigOptionDef::enum_keys_map, Slic3r::ConfigOptionDef::enum_labels, Slic3r::ConfigOptionDef::enum_values, Slic3r::ConfigOptionDef::f_enum_open, Slic3r::ConfigOptionEnum< T >::get_enum_values(), Slic3r::ConfigOptionDef::gui_flags, Slic3r::ConfigOptionDef::gui_type, L, L_CONTEXT, Slic3r::ConfigOptionDef::label, Slic3r::ConfigOptionDef::max, Slic3r::ConfigOptionDef::min, Slic3r::ConfigOptionDef::mode, Slic3r::ConfigOptionDef::nocli, Slic3r::ConfigOptionDef::set_default_value(), Slic3r::ConfigOptionDef::sidetext, Slic3r::sladoPortrait, and Slic3r::slapcmDynamic.

Referenced by PrintConfigDef().

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

◆ keys()

std::vector< std::string > Slic3r::ConfigDef::keys ( ) const
inlineinherited
2666 {
2667 std::vector<std::string> out;
2668 out.reserve(options.size());
2669 for(auto const& kvp : options)
2670 out.push_back(kvp.first);
2671 return out;
2672 }

References options.

◆ print_cli_help()

std::ostream & Slic3r::ConfigDef::print_cli_help ( std::ostream & out,
bool show_defaults,
std::function< bool(const ConfigOptionDef &)> filter = [](const ConfigOptionDef &){ return true; } ) const
inherited
382{
383 // prepare a function for wrapping text
384 auto wrap = [](std::string text, size_t line_length) -> std::string {
385 std::istringstream words(text);
386 std::ostringstream wrapped;
387 std::string word;
388
389 if (words >> word) {
390 wrapped << word;
391 size_t space_left = line_length - word.length();
392 while (words >> word) {
393 if (space_left < word.length() + 1) {
394 wrapped << '\n' << word;
395 space_left = line_length - word.length();
396 } else {
397 wrapped << ' ' << word;
398 space_left -= word.length() + 1;
399 }
400 }
401 }
402 return wrapped.str();
403 };
404
405 // get the unique categories
406 std::set<std::string> categories;
407 for (const auto& opt : this->options) {
408 const ConfigOptionDef& def = opt.second;
409 if (filter(def))
410 categories.insert(def.category);
411 }
412
413 for (auto category : categories) {
414 if (category != "") {
415 out << category << ":" << std::endl;
416 } else if (categories.size() > 1) {
417 out << "Misc options:" << std::endl;
418 }
419
420 for (const auto& opt : this->options) {
421 const ConfigOptionDef& def = opt.second;
422 if (def.category != category || def.cli == ConfigOptionDef::nocli || !filter(def))
423 continue;
424
425 // get all possible variations: --foo, --foobar, -f...
426 std::vector<std::string> cli_args = def.cli_args(opt.first);
427 if (cli_args.empty())
428 continue;
429
430 for (auto& arg : cli_args) {
431 arg.insert(0, (arg.size() == 1) ? "-" : "--");
432 //BBS: refine the print help format
433 if (!def.cli_params.empty())
434 arg += " " + def.cli_params;
435 /*if ( def.type == coInt || def.type == coInts) {
436 arg += " int_value";
437 } else if (def.type == coFloat || def.type == coFloatOrPercent || def.type == coFloats) {
438 arg += " float_value";
439 } else if (def.type == coPoint) {
440 arg += " X,Y";
441 } else if (def.type == coPoint3) {
442 arg += " X,Y,Z";
443 } else if (def.type == coString || def.type == coStrings) {
444 arg += " filename_lists";
445 }*/
446 }
447
448 // left: command line options
449 const std::string cli = boost::algorithm::join(cli_args, ", ");
450 out << " " << std::left << std::setw(20) << cli;
451
452 // right: option description
453 std::string descr = def.tooltip;
454 bool show_defaults_this = show_defaults || def.opt_key == "config_compatibility";
455 if (show_defaults_this && def.default_value && def.type != coBool
456 && (def.type != coString || !def.default_value->serialize().empty())) {
457 descr += " (";
458 if (!def.sidetext.empty()) {
459 descr += def.sidetext + ", ";
460 } else if (!def.enum_values.empty()) {
461 descr += boost::algorithm::join(def.enum_values, ", ") + "; ";
462 }
463 descr += "default: " + def.default_value->serialize() + ")";
464 }
465
466 // wrap lines of description
467 descr = wrap(descr, 80);
468 std::vector<std::string> lines;
469 boost::split(lines, descr, boost::is_any_of("\n"));
470
471 // if command line options are too long, print description in new line
472 for (size_t i = 0; i < lines.size(); ++i) {
473 if (i == 0 && cli.size() > 19)
474 out << std::endl;
475 if (i > 0 || cli.size() > 19)
476 out << std::string(21, ' ');
477 out << lines[i] << std::endl;
478 }
479 }
480 }
481 return out;
482}

References Slic3r::ConfigOptionDef::category, Slic3r::ConfigOptionDef::cli, Slic3r::ConfigOptionDef::cli_args(), Slic3r::ConfigOptionDef::cli_params, Slic3r::coBool, Slic3r::coString, Slic3r::ConfigOptionDef::default_value, Slic3r::ConfigOptionDef::enum_values, Slic3r::ConfigOptionDef::nocli, Slic3r::ConfigOptionDef::opt_key, options, Slic3r::ConfigOptionDef::sidetext, Slic3r::ConfigOptionDef::tooltip, and Slic3r::ConfigOptionDef::type.

Here is the call graph for this function:

Member Data Documentation

◆ by_serialization_key_ordinal

std::map<size_t, const ConfigOptionDef*> Slic3r::ConfigDef::by_serialization_key_ordinal
inherited

◆ m_extruder_option_keys

std::vector<std::string> Slic3r::PrintConfigDef::m_extruder_option_keys
private

◆ m_extruder_retract_keys

std::vector<std::string> Slic3r::PrintConfigDef::m_extruder_retract_keys
private

◆ m_filament_option_keys

std::vector<std::string> Slic3r::PrintConfigDef::m_filament_option_keys
private

◆ m_filament_retract_keys

std::vector<std::string> Slic3r::PrintConfigDef::m_filament_retract_keys
private

◆ options


The documentation for this class was generated from the following files: