Prusa Slicer 2.6.0
Loading...
Searching...
No Matches
Slic3r::PrintConfigDef Class Reference

#include <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
 
bool has (const t_config_option_key &opt_key) const
 
const ConfigOptionDefget (const t_config_option_key &opt_key) const
 
std::vector< std::string > keys () const
 
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)
 

Public Attributes

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

Protected Member Functions

ConfigOptionDefadd (const t_config_option_key &opt_key, ConfigOptionType type)
 
ConfigOptionDefadd_nullable (const t_config_option_key &opt_key, ConfigOptionType type)
 
void finalize ()
 

Private Member Functions

void init_common_params ()
 
void init_fff_params ()
 
void init_extruder_option_keys ()
 
void init_sla_params ()
 
void init_sla_support_params (const std::string &method_prefix)
 

Private Attributes

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

Detailed Description

Constructor & Destructor Documentation

◆ PrintConfigDef()

Slic3r::PrintConfigDef::PrintConfigDef ( )
235{
236 this->init_common_params();
238 this->init_fff_params();
241 this->init_sla_params();
243 this->finalize();
244}
void finalize()
Definition Config.cpp:306
t_optiondef_map options
Definition Config.hpp:2065
void init_common_params()
Definition PrintConfig.cpp:246
void init_fff_params()
Definition PrintConfig.cpp:396
void init_extruder_option_keys()
Definition PrintConfig.cpp:3390
void init_sla_params()
Definition PrintConfig.cpp:3603
@ ptSLA
Definition Config.hpp:209
@ ptAny
Definition Config.hpp:213
@ ptFFF
Definition Config.hpp:207
static void assign_printer_technology_to_unknown(t_optiondef_map &options, PrinterTechnology printer_technology)
Definition PrintConfig.cpp:222

References Slic3r::assign_printer_technology_to_unknown(), Slic3r::ConfigDef::finalize(), 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
289{
290 static size_t serialization_key_ordinal_last = 0;
291 ConfigOptionDef *opt = &this->options[opt_key];
292 opt->opt_key = opt_key;
293 opt->type = type;
294 opt->serialization_key_ordinal = ++ serialization_key_ordinal_last;
295 this->by_serialization_key_ordinal[opt->serialization_key_ordinal] = opt;
296 return opt;
297}
std::map< size_t, const ConfigOptionDef * > by_serialization_key_ordinal
Definition Config.hpp:2066

References Slic3r::ConfigDef::by_serialization_key_ordinal, Slic3r::ConfigOptionDef::opt_key, Slic3r::ConfigDef::options, Slic3r::ConfigOptionDef::serialization_key_ordinal, and Slic3r::ConfigOptionDef::type.

Referenced by Slic3r::AnycubicSLAFormatConfigDef::AnycubicSLAFormatConfigDef(), Slic3r::CLIActionsConfigDef::CLIActionsConfigDef(), Slic3r::CLIMiscConfigDef::CLIMiscConfigDef(), Slic3r::CLITransformConfigDef::CLITransformConfigDef(), Slic3r::ConfigDef::add_nullable(), init_common_params(), init_fff_params(), init_sla_params(), and init_sla_support_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
300{
301 ConfigOptionDef *def = this->add(opt_key, type);
302 def->nullable = true;
303 return def;
304}
ConfigOptionDef * add(const t_config_option_key &opt_key, ConfigOptionType type)
Definition Config.cpp:288

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

Referenced by init_fff_params(), and init_sla_params().

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

◆ extruder_option_keys()

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

References m_extruder_option_keys.

Referenced by Slic3r::Preset::nozzle_options(), Slic3r::DynamicPrintConfig::set_num_extruders(), and Slic3r::ExtruderFilaments::update_compatible_internal().

+ Here is the caller graph for this function:

◆ extruder_retract_keys()

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

References m_extruder_retract_keys.

Referenced by Slic3r::print_config_diffs().

+ Here is the caller graph for this function:

◆ finalize()

void Slic3r::ConfigDef::finalize ( )
protectedinherited
307{
308 // Validate & finalize open & closed enums.
309 for (std::pair<const t_config_option_key, ConfigOptionDef> &kvp : options) {
310 ConfigOptionDef& def = kvp.second;
311 if (def.type == coEnum) {
312 assert(def.enum_def);
313 assert(def.enum_def->is_valid_closed_enum());
314 assert(def.gui_type != ConfigOptionDef::GUIType::i_enum_open &&
315 def.gui_type != ConfigOptionDef::GUIType::f_enum_open &&
317 def.enum_def->finalize_closed_enum();
318 } else if (def.gui_type == ConfigOptionDef::GUIType::i_enum_open || def.gui_type == ConfigOptionDef::GUIType::f_enum_open ||
320 assert(def.enum_def);
321 assert(def.enum_def->is_valid_open_enum());
322 assert(def.gui_type != ConfigOptionDef::GUIType::i_enum_open || def.type == coInt || def.type == coInts);
323 assert(def.gui_type != ConfigOptionDef::GUIType::f_enum_open || def.type == coFloat || def.type == coPercent || def.type == coFloatOrPercent);
324 assert(def.gui_type != ConfigOptionDef::GUIType::select_open || def.type == coString || def.type == coStrings);
325 } else {
326 assert(! def.enum_def);
327 }
328 }
329}
@ coString
Definition Config.hpp:172
@ coEnum
Definition Config.hpp:194
@ coInts
Definition Config.hpp:170
@ coInt
Definition Config.hpp:168
@ coFloat
Definition Config.hpp:164
@ coFloatOrPercent
Definition Config.hpp:180
@ coStrings
Definition Config.hpp:174
@ coPercent
Definition Config.hpp:176

References Slic3r::coEnum, Slic3r::coFloat, Slic3r::coFloatOrPercent, Slic3r::coInt, Slic3r::coInts, Slic3r::coPercent, Slic3r::coString, Slic3r::coStrings, Slic3r::ConfigOptionDef::enum_def, Slic3r::ConfigOptionDef::f_enum_open, Slic3r::ConfigOptionDef::gui_type, Slic3r::ConfigOptionDef::i_enum_open, Slic3r::ConfigDef::options, Slic3r::ConfigOptionDef::select_open, and Slic3r::ConfigOptionDef::type.

Referenced by PrintConfigDef().

+ Here is the caller graph for this function:

◆ get()

◆ handle_legacy()

void Slic3r::PrintConfigDef::handle_legacy ( t_config_option_key opt_key,
std::string &  value 
)
static
4198{
4199 // handle legacy options
4200 if (opt_key == "extrusion_width_ratio" || opt_key == "bottom_layer_speed_ratio"
4201 || opt_key == "first_layer_height_ratio") {
4202 boost::replace_first(opt_key, "_ratio", "");
4203 if (opt_key == "bottom_layer_speed") opt_key = "first_layer_speed";
4204 try {
4205 float v = boost::lexical_cast<float>(value);
4206 if (v != 0)
4207 value = boost::lexical_cast<std::string>(v*100) + "%";
4208 } catch (boost::bad_lexical_cast &) {
4209 value = "0";
4210 }
4211 } else if (opt_key == "gcode_flavor") {
4212 if (value == "makerbot")
4213 value = "makerware";
4214 else if (value == "marlinfirmware")
4215 // the "new" marlin firmware flavor used to be called "marlinfirmware" for some time during PrusaSlicer 2.4.0-alpha development.
4216 value = "marlin2";
4217 } else if (opt_key == "host_type" && value == "mainsail") {
4218 // the "mainsail" key (introduced in 2.6.0-alpha6) was renamed to "moonraker" (in 2.6.0-rc1).
4219 value = "moonraker";
4220 } else if (opt_key == "fill_density" && value.find("%") == std::string::npos) {
4221 try {
4222 // fill_density was turned into a percent value
4223 float v = boost::lexical_cast<float>(value);
4224 value = boost::lexical_cast<std::string>(v*100) + "%";
4225 } catch (boost::bad_lexical_cast &) {}
4226 } else if (opt_key == "randomize_start" && value == "1") {
4227 opt_key = "seam_position";
4228 value = "random";
4229 } else if (opt_key == "bed_size" && !value.empty()) {
4230 opt_key = "bed_shape";
4231 ConfigOptionPoint p;
4233 std::ostringstream oss;
4234 oss << "0x0," << p.value(0) << "x0," << p.value(0) << "x" << p.value(1) << ",0x" << p.value(1);
4235 value = oss.str();
4236 } else if ((opt_key == "perimeter_acceleration" && value == "25")
4237 || (opt_key == "infill_acceleration" && value == "50")) {
4238 /* For historical reasons, the world's full of configs having these very low values;
4239 to avoid unexpected behavior we need to ignore them. Banning these two hard-coded
4240 values is a dirty hack and will need to be removed sometime in the future, but it
4241 will avoid lots of complaints for now. */
4242 value = "0";
4243 } else if (opt_key == "support_material_pattern" && value == "pillars") {
4244 // Slic3r PE does not support the pillars. They never worked well.
4245 value = "rectilinear";
4246 } else if (opt_key == "skirt_height" && value == "-1") {
4247 // PrusaSlicer no more accepts skirt_height == -1 to print a draft shield to the top of the highest object.
4248 // A new "draft_shield" enum config value is used instead.
4249 opt_key = "draft_shield";
4250 value = "enabled";
4251 } else if (opt_key == "draft_shield" && (value == "1" || value == "0")) {
4252 // draft_shield used to be a bool, it was turned into an enum in PrusaSlicer 2.4.0.
4253 value = value == "1" ? "enabled" : "disabled";
4254 } else if (opt_key == "octoprint_host") {
4255 opt_key = "print_host";
4256 } else if (opt_key == "octoprint_cafile") {
4257 opt_key = "printhost_cafile";
4258 } else if (opt_key == "octoprint_apikey") {
4259 opt_key = "printhost_apikey";
4260 } else if (opt_key == "preset_name") {
4261 opt_key = "preset_names";
4262 } /*else if (opt_key == "material_correction" || opt_key == "relative_correction") {
4263 ConfigOptionFloats p;
4264 p.deserialize(value);
4265
4266 if (p.values.size() < 3) {
4267 double firstval = p.values.front();
4268 p.values.emplace(p.values.begin(), firstval);
4269 value = p.serialize();
4270 }
4271 }*/
4272
4273 // In PrusaSlicer 2.3.0-alpha0 the "monotonous" infill was introduced, which was later renamed to "monotonic".
4274 if (value == "monotonous" && (opt_key == "top_fill_pattern" || opt_key == "bottom_fill_pattern" || opt_key == "fill_pattern"))
4275 value = "monotonic";
4276
4277 if (PrintConfigDef_ignore.find(opt_key) != PrintConfigDef_ignore.end()) {
4278 opt_key = {};
4279 return;
4280 }
4281
4282 if (! print_config_def.has(opt_key)) {
4283 opt_key = {};
4284 return;
4285 }
4286}
bool has(const t_config_option_key &opt_key) const
Definition Config.hpp:2068
@ Disable
Definition Config.hpp:219
const PrintConfigDef print_config_def
Definition PrintConfig.cpp:4288
static std::set< std::string > PrintConfigDef_ignore
Definition PrintConfig.cpp:4178

References Slic3r::ConfigOptionPoint::deserialize(), Slic3r::Disable, Slic3r::ConfigDef::has(), Slic3r::print_config_def, Slic3r::PrintConfigDef_ignore, and Slic3r::ConfigOptionSingle< T >::value.

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

+ 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
2068{ return this->options.count(opt_key) > 0; }

Referenced by handle_legacy(), and Slic3r::CLI::setup().

+ Here is the caller graph for this function:

◆ init_common_params()

void Slic3r::PrintConfigDef::init_common_params ( )
private
247{
248 ConfigOptionDef* def;
249
250 def = this->add("printer_technology", coEnum);
251 def->label = L("Printer technology");
252 def->tooltip = L("Printer technology");
253 def->set_enum<PrinterTechnology>({ "FFF", "SLA" });
254 def->set_default_value(new ConfigOptionEnum<PrinterTechnology>(ptFFF));
255
256 def = this->add("bed_shape", coPoints);
257 def->label = L("Bed shape");
258 def->mode = comAdvanced;
259 def->set_default_value(new ConfigOptionPoints{ Vec2d(0, 0), Vec2d(200, 0), Vec2d(200, 200), Vec2d(0, 200) });
260
261 def = this->add("bed_custom_texture", coString);
262 def->label = L("Bed custom texture");
263 def->mode = comAdvanced;
264 def->set_default_value(new ConfigOptionString(""));
265
266 def = this->add("bed_custom_model", coString);
267 def->label = L("Bed custom model");
268 def->mode = comAdvanced;
269 def->set_default_value(new ConfigOptionString(""));
270
271 def = this->add("elefant_foot_compensation", coFloat);
272 def->label = L("Elephant foot compensation");
273 def->category = L("Advanced");
274 def->tooltip = L("The first layer will be shrunk in the XY plane by the configured value "
275 "to compensate for the 1st layer squish aka an Elephant Foot effect.");
276 def->sidetext = L("mm");
277 def->min = 0;
278 def->mode = comAdvanced;
279 def->set_default_value(new ConfigOptionFloat(0.));
280
281 def = this->add("thumbnails", coPoints);
282 def->label = L("G-code thumbnails");
283 def->tooltip = L("Picture sizes to be stored into a .gcode and .sl1 / .sl1s files, in the following format: \"XxY, XxY, ...\"");
284 def->mode = comExpert;
286 def->set_default_value(new ConfigOptionPoints());
287
288 def = this->add("thumbnails_format", coEnum);
289 def->label = L("Format of G-code thumbnails");
290 def->tooltip = L("Format of G-code thumbnails: PNG for best quality, JPG for smallest size, QOI for low memory firmware");
291 def->mode = comExpert;
292 def->set_enum<GCodeThumbnailsFormat>({ "PNG", "JPG", "QOI" });
293 def->set_default_value(new ConfigOptionEnum<GCodeThumbnailsFormat>(GCodeThumbnailsFormat::PNG));
294
295 def = this->add("layer_height", coFloat);
296 def->label = L("Layer height");
297 def->category = L("Layers and Perimeters");
298 def->tooltip = L("This setting controls the height (and thus the total number) of the slices/layers. "
299 "Thinner layers give better accuracy but take more time to print.");
300 def->sidetext = L("mm");
301 def->min = 0;
302 def->set_default_value(new ConfigOptionFloat(0.3));
303
304 def = this->add("max_print_height", coFloat);
305 def->label = L("Max print height");
306 def->tooltip = L("Set this to the maximum height that can be reached by your extruder while printing.");
307 def->sidetext = L("mm");
308 def->min = 0;
309 def->max = 1200;
310 def->mode = comAdvanced;
311 def->set_default_value(new ConfigOptionFloat(200.0));
312
313 def = this->add("print_host", coString);
314 def->label = L("Hostname, IP or URL");
315 def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain "
316 "the hostname, IP address or URL of the printer host instance. "
317 "Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL "
318 "in the following format: https://username:password@your-octopi-address/");
319 def->mode = comAdvanced;
320 def->cli = ConfigOptionDef::nocli;
321 def->set_default_value(new ConfigOptionString(""));
322
323 def = this->add("printhost_apikey", coString);
324 def->label = L("API Key / Password");
325 def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain "
326 "the API Key or the password required for authentication.");
327 def->mode = comAdvanced;
328 def->cli = ConfigOptionDef::nocli;
329 def->set_default_value(new ConfigOptionString(""));
330
331 def = this->add("printhost_port", coString);
332 def->label = L("Printer");
333 def->tooltip = L("Name of the printer");
335 def->mode = comAdvanced;
336 def->cli = ConfigOptionDef::nocli;
337 def->set_default_value(new ConfigOptionString(""));
338
339 def = this->add("printhost_cafile", coString);
340 def->label = L("HTTPS CA File");
341 def->tooltip = L("Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. "
342 "If left blank, the default OS CA certificate repository is used.");
343 def->mode = comAdvanced;
344 def->cli = ConfigOptionDef::nocli;
345 def->set_default_value(new ConfigOptionString(""));
346
347 // Options used by physical printers
348
349 def = this->add("printhost_user", coString);
350 def->label = L("User");
351// def->tooltip = L("");
352 def->mode = comAdvanced;
353 def->cli = ConfigOptionDef::nocli;
354 def->set_default_value(new ConfigOptionString(""));
355
356 def = this->add("printhost_password", coString);
357 def->label = L("Password");
358// def->tooltip = L("");
359 def->mode = comAdvanced;
360 def->cli = ConfigOptionDef::nocli;
361 def->set_default_value(new ConfigOptionString(""));
362
363 // Only available on Windows.
364 def = this->add("printhost_ssl_ignore_revoke", coBool);
365 def->label = L("Ignore HTTPS certificate revocation checks");
366 def->tooltip = L("Ignore HTTPS certificate revocation checks in case of missing or offline distribution points. "
367 "One may want to enable this option for self signed certificates if connection fails.");
368 def->mode = comAdvanced;
369 def->cli = ConfigOptionDef::nocli;
370 def->set_default_value(new ConfigOptionBool(false));
371
372 def = this->add("preset_names", coStrings);
373 def->label = L("Printer preset names");
374 def->tooltip = L("Names of presets related to the physical printer");
375 def->mode = comAdvanced;
376 def->set_default_value(new ConfigOptionStrings());
377
378 def = this->add("printhost_authorization_type", coEnum);
379 def->label = L("Authorization Type");
380// def->tooltip = L("");
381 def->set_enum<AuthorizationType>({
382 { "key", L("API key") },
383 { "user", L("HTTP digest") }
384 });
385 def->mode = comAdvanced;
386 def->cli = ConfigOptionDef::nocli;
387 def->set_default_value(new ConfigOptionEnum<AuthorizationType>(atKeyPassword));
388
389 // temporary workaround for compatibility with older Slicer
390 {
391 def = this->add("preset_name", coString);
392 def->set_default_value(new ConfigOptionString());
393 }
394}
static const constexpr char * nocli
Definition Config.hpp:2035
ConfigOptionFloat
Definition PrintConfig.hpp:570
@ comAdvanced
Definition Config.hpp:199
@ comExpert
Definition Config.hpp:200
ConfigOptionBool
Definition PrintConfig.hpp:665
AuthorizationType
Definition PrintConfig.hpp:50
@ atKeyPassword
Definition PrintConfig.hpp:51
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > Vec2d
Definition Point.hpp:51
PrinterTechnology
Definition Config.hpp:205
ConfigOptionEnum< PrinterTechnology >
Definition PrintConfig.hpp:1079
GCodeThumbnailsFormat
Definition PrintConfig.hpp:137
@ coPoints
Definition Config.hpp:186
@ coBool
Definition Config.hpp:190
#define L(s)
Definition I18N.hpp:18

References Slic3r::ConfigDef::add(), Slic3r::atKeyPassword, Slic3r::ConfigOptionDef::category, Slic3r::ConfigOptionDef::cli, Slic3r::coBool, Slic3r::coEnum, Slic3r::coFloat, Slic3r::comAdvanced, Slic3r::comExpert, Slic3r::coPoints, Slic3r::coString, Slic3r::coStrings, Slic3r::ConfigOptionDef::gui_type, L, Slic3r::ConfigOptionDef::label, Slic3r::ConfigOptionDef::max, Slic3r::ConfigOptionDef::min, Slic3r::ConfigOptionDef::mode, Slic3r::ConfigOptionDef::nocli, Slic3r::ConfigOptionDef::one_string, Slic3r::PNG, Slic3r::ptFFF, Slic3r::ConfigOptionDef::select_close, Slic3r::ConfigOptionDef::set_default_value(), Slic3r::ConfigOptionDef::set_enum(), 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
3391{
3392 // ConfigOptionFloats, ConfigOptionPercents, ConfigOptionBools, ConfigOptionStrings
3394 "nozzle_diameter", "min_layer_height", "max_layer_height", "extruder_offset",
3395 "retract_length", "retract_lift", "retract_lift_above", "retract_lift_below", "retract_speed", "deretract_speed",
3396 "retract_before_wipe", "retract_restart_extra", "retract_before_travel", "wipe",
3397 "retract_layer_change", "retract_length_toolchange", "retract_restart_extra_toolchange", "extruder_colour",
3398 "default_filament_profile"
3399 };
3400
3402 "deretract_speed",
3403 "retract_before_travel",
3404 "retract_before_wipe",
3405 "retract_layer_change",
3406 "retract_length",
3407 "retract_lift",
3408 "retract_lift_above",
3409 "retract_lift_below",
3410 "retract_restart_extra",
3411 "retract_speed",
3412 "wipe"
3413 };
3414 assert(std::is_sorted(m_extruder_retract_keys.begin(), m_extruder_retract_keys.end()));
3415}

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
397{
398 ConfigOptionDef* def;
399
400 // Maximum extruder temperature, bumped to 1500 to support printing of glass.
401 const int max_temp = 1500;
402 def = this->add("avoid_crossing_curled_overhangs", coBool);
403 def->label = L("Avoid crossing curled overhangs (Experimental)");
404 // TRN PrintSettings: "Avoid crossing curled overhangs (Experimental)"
405 def->tooltip = L("Plan travel moves such that the extruder avoids areas where the filament may be curled up. "
406 "This is mostly happening on steeper rounded overhangs and may cause a crash with the nozzle. "
407 "This feature slows down both the print and the G-code generation.");
408 def->mode = comExpert;
409 def->set_default_value(new ConfigOptionBool(false));
410
411 def = this->add("avoid_crossing_perimeters", coBool);
412 def->label = L("Avoid crossing perimeters");
413 def->tooltip = L("Optimize travel moves in order to minimize the crossing of perimeters. "
414 "This is mostly useful with Bowden extruders which suffer from oozing. "
415 "This feature slows down both the print and the G-code generation.");
416 def->mode = comExpert;
417 def->set_default_value(new ConfigOptionBool(false));
418
419 def = this->add("avoid_crossing_perimeters_max_detour", coFloatOrPercent);
420 def->label = L("Avoid crossing perimeters - Max detour length");
421 def->category = L("Layers and Perimeters");
422 def->tooltip = L("The maximum detour length for avoid crossing perimeters. "
423 "If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. "
424 "Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path.");
425 def->sidetext = L("mm or % (zero to disable)");
426 def->min = 0;
427 def->max_literal = 1000;
428 def->mode = comExpert;
429 def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
430
431 def = this->add("bed_temperature", coInts);
432 def->label = L("Other layers");
433 def->tooltip = L("Bed temperature for layers after the first one. "
434 "Set this to zero to disable bed temperature control commands in the output.");
435 def->sidetext = L("°C");
436 def->full_label = L("Bed temperature");
437 def->min = 0;
438 def->max = 300;
439 def->set_default_value(new ConfigOptionInts { 0 });
440
441 def = this->add("before_layer_gcode", coString);
442 def->label = L("Before layer change G-code");
443 def->tooltip = L("This custom code is inserted at every layer change, right before the Z move. "
444 "Note that you can use placeholder variables for all Slic3r settings as well "
445 "as [layer_num] and [layer_z].");
446 def->multiline = true;
447 def->full_width = true;
448 def->height = 5;
449 def->mode = comExpert;
450 def->set_default_value(new ConfigOptionString(""));
451
452 def = this->add("between_objects_gcode", coString);
453 def->label = L("Between objects G-code");
454 def->tooltip = L("This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want.");
455 def->multiline = true;
456 def->full_width = true;
457 def->height = 12;
458 def->mode = comExpert;
459 def->set_default_value(new ConfigOptionString(""));
460
461 def = this->add("bottom_solid_layers", coInt);
462 //TRN Print Settings: "Bottom solid layers"
463 def->label = L_CONTEXT("Bottom", "Layers");
464 def->category = L("Layers and Perimeters");
465 def->tooltip = L("Number of solid layers to generate on bottom surfaces.");
466 def->full_label = L("Bottom solid layers");
467 def->min = 0;
468 def->set_default_value(new ConfigOptionInt(3));
469
470 def = this->add("bottom_solid_min_thickness", coFloat);
471 def->label = L_CONTEXT("Bottom", "Layers");
472 def->category = L("Layers and Perimeters");
473 def->tooltip = L("The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy "
474 "minimum thickness of bottom shell.");
475 def->full_label = L("Minimum bottom shell thickness");
476 def->sidetext = L("mm");
477 def->min = 0;
478 def->set_default_value(new ConfigOptionFloat(0.));
479
480 def = this->add("bridge_acceleration", coFloat);
481 def->label = L("Bridge");
482 def->tooltip = L("This is the acceleration your printer will use for bridges. "
483 "Set zero to disable acceleration control for bridges.");
484 def->sidetext = L("mm/s²");
485 def->min = 0;
486 def->mode = comExpert;
487 def->set_default_value(new ConfigOptionFloat(0));
488
489 def = this->add("bridge_angle", coFloat);
490 def->label = L("Bridging angle");
491 def->category = L("Infill");
492 def->tooltip = L("Bridging angle override. If left to zero, the bridging angle will be calculated "
493 "automatically. Otherwise the provided angle will be used for all bridges. "
494 "Use 180° for zero angle.");
495 def->sidetext = L("°");
496 def->min = 0;
497 def->mode = comAdvanced;
498 def->set_default_value(new ConfigOptionFloat(0.));
499
500 def = this->add("bridge_fan_speed", coInts);
501 def->label = L("Bridges fan speed");
502 def->tooltip = L("This fan speed is enforced during all bridges and overhangs.");
503 def->sidetext = L("%");
504 def->min = 0;
505 def->max = 100;
506 def->mode = comExpert;
507 def->set_default_value(new ConfigOptionInts { 100 });
508
509 def = this->add("bridge_flow_ratio", coFloat);
510 def->label = L("Bridge flow ratio");
511 def->category = L("Advanced");
512 def->tooltip = L("This factor affects the amount of plastic for bridging. "
513 "You can decrease it slightly to pull the extrudates and prevent sagging, "
514 "although default settings are usually good and you should experiment "
515 "with cooling (use a fan) before tweaking this.");
516 def->min = 0;
517 def->max = 2;
518 def->mode = comAdvanced;
519 def->set_default_value(new ConfigOptionFloat(1));
520
521 def = this->add("bridge_speed", coFloat);
522 def->label = L("Bridges");
523 def->category = L("Speed");
524 def->tooltip = L("Speed for printing bridges.");
525 def->sidetext = L("mm/s");
526 def->aliases = { "bridge_feed_rate" };
527 def->min = 0;
528 def->mode = comAdvanced;
529 def->set_default_value(new ConfigOptionFloat(60));
530
531 def = this->add("enable_dynamic_overhang_speeds", coBool);
532 def->label = L("Enable dynamic overhang speeds");
533 def->category = L("Speed");
534 def->tooltip = L("This setting enables dynamic speed control on overhangs.");
535 def->mode = comExpert;
536 def->set_default_value(new ConfigOptionBool(false));
537
538 // TRN PrintSettings : "Dynamic overhang speed"
539 auto overhang_speed_setting_description = L("Overhang size is expressed as a percentage of overlap of the extrusion with the previous layer: "
540 "100% would be full overlap (no overhang), while 0% represents full overhang (floating extrusion, bridge). "
541 "Speeds for overhang sizes in between are calculated via linear interpolation. "
542 "If set as percentage, the speed is calculated over the external perimeter speed.");
543
544 def = this->add("overhang_speed_0", coFloatOrPercent);
545 def->label = L("speed for 0% overlap (bridge)");
546 def->category = L("Speed");
547 def->tooltip = overhang_speed_setting_description;
548 def->sidetext = L("mm/s or %");
549 def->min = 0;
550 def->mode = comExpert;
551 def->set_default_value(new ConfigOptionFloatOrPercent(15, false));
552
553 def = this->add("overhang_speed_1", coFloatOrPercent);
554 def->label = L("speed for 25% overlap");
555 def->category = L("Speed");
556 def->tooltip = overhang_speed_setting_description;
557 def->sidetext = L("mm/s or %");
558 def->min = 0;
559 def->mode = comExpert;
560 def->set_default_value(new ConfigOptionFloatOrPercent(15, false));
561
562 def = this->add("overhang_speed_2", coFloatOrPercent);
563 def->label = L("speed for 50% overlap");
564 def->category = L("Speed");
565 def->tooltip = overhang_speed_setting_description;
566 def->sidetext = L("mm/s or %");
567 def->min = 0;
568 def->mode = comExpert;
569 def->set_default_value(new ConfigOptionFloatOrPercent(20, false));
570
571 def = this->add("overhang_speed_3", coFloatOrPercent);
572 def->label = L("speed for 75% overlap");
573 def->category = L("Speed");
574 def->tooltip = overhang_speed_setting_description;
575 def->sidetext = L("mm/s or %");
576 def->min = 0;
577 def->mode = comExpert;
578 def->set_default_value(new ConfigOptionFloatOrPercent(25, false));
579
580 def = this->add("enable_dynamic_fan_speeds", coBools);
581 def->label = L("Enable dynamic fan speeds");
582 def->tooltip = L("This setting enables dynamic fan speed control on overhangs.");
583 def->mode = comExpert;
584 def->set_default_value(new ConfigOptionBools{false});
585
586 // TRN FilamentSettings : "Dynamic fan speeds"
587 auto fan_speed_setting_description = L("Overhang size is expressed as a percentage of overlap of the extrusion with the previous layer: "
588 "100% would be full overlap (no overhang), while 0% represents full overhang (floating extrusion, bridge). "
589 "Fan speeds for overhang sizes in between are calculated via linear interpolation.");
590
591 def = this->add("overhang_fan_speed_0", coInts);
592 def->label = L("speed for 0% overlap (bridge)");
593 def->tooltip = fan_speed_setting_description;
594 def->sidetext = L("%");
595 def->min = 0;
596 def->max = 100;
597 def->mode = comExpert;
598 def->set_default_value(new ConfigOptionInts{0});
599
600 def = this->add("overhang_fan_speed_1", coInts);
601 def->label = L("speed for 25% overlap");
602 def->tooltip = fan_speed_setting_description;
603 def->sidetext = L("%");
604 def->min = 0;
605 def->max = 100;
606 def->mode = comExpert;
607 def->set_default_value(new ConfigOptionInts{0});
608
609 def = this->add("overhang_fan_speed_2", coInts);
610 def->label = L("speed for 50% overlap");
611 def->tooltip = fan_speed_setting_description;
612 def->sidetext = L("%");
613 def->min = 0;
614 def->max = 100;
615 def->mode = comExpert;
616 def->set_default_value(new ConfigOptionInts{0});
617
618 def = this->add("overhang_fan_speed_3", coInts);
619 def->label = L("speed for 75% overlap");
620 def->tooltip = fan_speed_setting_description;
621 def->sidetext = L("%");
622 def->min = 0;
623 def->max = 100;
624 def->mode = comExpert;
625 def->set_default_value(new ConfigOptionInts{0});
626
627 def = this->add("brim_width", coFloat);
628 def->label = L("Brim width");
629 def->category = L("Skirt and brim");
630 def->tooltip = L("The horizontal width of the brim that will be printed around each object on the first layer. "
631 "When raft is used, no brim is generated (use raft_first_layer_expansion).");
632 def->sidetext = L("mm");
633 def->min = 0;
634 def->max = 200;
635 def->mode = comSimple;
636 def->set_default_value(new ConfigOptionFloat(0));
637
638 def = this->add("brim_type", coEnum);
639 def->label = L("Brim type");
640 def->category = L("Skirt and brim");
641 def->tooltip = L("The places where the brim will be printed around each object on the first layer.");
642 def->set_enum<BrimType>({
643 { "no_brim", L("No brim") },
644 { "outer_only", L("Outer brim only") },
645 { "inner_only", L("Inner brim only") },
646 { "outer_and_inner", L("Outer and inner brim") }
647 });
648 def->mode = comSimple;
649 def->set_default_value(new ConfigOptionEnum<BrimType>(btOuterOnly));
650
651 def = this->add("brim_separation", coFloat);
652 def->label = L("Brim separation gap");
653 def->category = L("Skirt and brim");
654 def->tooltip = L("Offset of brim from the printed object. The offset is applied after the elephant foot compensation.");
655 def->sidetext = L("mm");
656 def->min = 0;
657 def->mode = comAdvanced;
658 def->set_default_value(new ConfigOptionFloat(0.f));
659
660 def = this->add("colorprint_heights", coFloats);
661 def->label = L("Colorprint height");
662 def->tooltip = L("Heights at which a filament change is to occur.");
663 def->set_default_value(new ConfigOptionFloats { });
664
665 def = this->add("compatible_printers", coStrings);
666 def->label = L("Compatible printers");
667 def->mode = comAdvanced;
668 def->set_default_value(new ConfigOptionStrings());
669 def->cli = ConfigOptionDef::nocli;
670
671 def = this->add("compatible_printers_condition", coString);
672 def->label = L("Compatible printers condition");
673 def->tooltip = L("A boolean expression using the configuration values of an active printer profile. "
674 "If this expression evaluates to true, this profile is considered compatible "
675 "with the active printer profile.");
676 def->mode = comExpert;
677 def->set_default_value(new ConfigOptionString());
678 def->cli = ConfigOptionDef::nocli;
679
680 def = this->add("compatible_prints", coStrings);
681 def->label = L("Compatible print profiles");
682 def->mode = comAdvanced;
683 def->set_default_value(new ConfigOptionStrings());
684 def->cli = ConfigOptionDef::nocli;
685
686 def = this->add("compatible_prints_condition", coString);
687 def->label = L("Compatible print profiles condition");
688 def->tooltip = L("A boolean expression using the configuration values of an active print profile. "
689 "If this expression evaluates to true, this profile is considered compatible "
690 "with the active print profile.");
691 def->mode = comExpert;
692 def->set_default_value(new ConfigOptionString());
693 def->cli = ConfigOptionDef::nocli;
694
695 // The following value is to be stored into the project file (AMF, 3MF, Config ...)
696 // and it contains a sum of "compatible_printers_condition" values over the print and filament profiles.
697 def = this->add("compatible_printers_condition_cummulative", coStrings);
698 def->set_default_value(new ConfigOptionStrings());
699 def->cli = ConfigOptionDef::nocli;
700 def = this->add("compatible_prints_condition_cummulative", coStrings);
701 def->set_default_value(new ConfigOptionStrings());
702 def->cli = ConfigOptionDef::nocli;
703
704 def = this->add("complete_objects", coBool);
705 def->label = L("Complete individual objects");
706 def->tooltip = L("When printing multiple objects or copies, this feature will complete "
707 "each object before moving onto next one (and starting it from its bottom layer). "
708 "This feature is useful to avoid the risk of ruined prints. "
709 "Slic3r should warn and prevent you from extruder collisions, but beware.");
710 def->mode = comAdvanced;
711 def->set_default_value(new ConfigOptionBool(false));
712
713 def = this->add("cooling", coBools);
714 def->label = L("Enable auto cooling");
715 def->tooltip = L("This flag enables the automatic cooling logic that adjusts print speed "
716 "and fan speed according to layer printing time.");
717 def->set_default_value(new ConfigOptionBools { true });
718
719 def = this->add("cooling_tube_retraction", coFloat);
720 def->label = L("Cooling tube position");
721 def->tooltip = L("Distance of the center-point of the cooling tube from the extruder tip.");
722 def->sidetext = L("mm");
723 def->min = 0;
724 def->mode = comAdvanced;
725 def->set_default_value(new ConfigOptionFloat(91.5));
726
727 def = this->add("cooling_tube_length", coFloat);
728 def->label = L("Cooling tube length");
729 def->tooltip = L("Length of the cooling tube to limit space for cooling moves inside it.");
730 def->sidetext = L("mm");
731 def->min = 0;
732 def->mode = comAdvanced;
733 def->set_default_value(new ConfigOptionFloat(5.));
734
735 def = this->add("default_acceleration", coFloat);
736 def->label = L("Default");
737 def->tooltip = L("This is the acceleration your printer will be reset to after "
738 "the role-specific acceleration values are used (perimeter/infill). "
739 "Set zero to prevent resetting acceleration at all.");
740 def->sidetext = L("mm/s²");
741 def->min = 0;
742 def->mode = comExpert;
743 def->set_default_value(new ConfigOptionFloat(0));
744
745 def = this->add("default_filament_profile", coStrings);
746 def->label = L("Default filament profile");
747 def->tooltip = L("Default filament profile associated with the current printer profile. "
748 "On selection of the current printer profile, this filament profile will be activated.");
749 def->set_default_value(new ConfigOptionStrings());
750 def->cli = ConfigOptionDef::nocli;
751
752 def = this->add("default_print_profile", coString);
753 def->label = L("Default print profile");
754 def->tooltip = L("Default print profile associated with the current printer profile. "
755 "On selection of the current printer profile, this print profile will be activated.");
756 def->set_default_value(new ConfigOptionString());
757 def->cli = ConfigOptionDef::nocli;
758
759 def = this->add("disable_fan_first_layers", coInts);
760 def->label = L("Disable fan for the first");
761 def->tooltip = L("You can set this to a positive value to disable fan at all "
762 "during the first layers, so that it does not make adhesion worse.");
763 def->sidetext = L("layers");
764 def->min = 0;
765 def->max = 1000;
766 def->mode = comExpert;
767 def->set_default_value(new ConfigOptionInts { 3 });
768
769 def = this->add("dont_support_bridges", coBool);
770 def->label = L("Don't support bridges");
771 def->category = L("Support material");
772 def->tooltip = L("Experimental option for preventing support material from being generated "
773 "under bridged areas.");
774 def->mode = comAdvanced;
775 def->set_default_value(new ConfigOptionBool(true));
776
777 def = this->add("duplicate_distance", coFloat);
778 def->label = L("Distance between copies");
779 def->tooltip = L("Distance used for the auto-arrange feature of the plater.");
780 def->sidetext = L("mm");
781 def->aliases = { "multiply_distance" };
782 def->min = 0;
783 def->set_default_value(new ConfigOptionFloat(6));
784
785 def = this->add("end_gcode", coString);
786 def->label = L("End G-code");
787 def->tooltip = L("This end procedure is inserted at the end of the output file. "
788 "Note that you can use placeholder variables for all PrusaSlicer settings.");
789 def->multiline = true;
790 def->full_width = true;
791 def->height = 12;
792 def->mode = comExpert;
793 def->set_default_value(new ConfigOptionString("M104 S0 ; turn off temperature\nG28 X0 ; home X axis\nM84 ; disable motors\n"));
794
795 def = this->add("end_filament_gcode", coStrings);
796 def->label = L("End G-code");
797 def->tooltip = L("This end procedure is inserted at the end of the output file, before the printer end gcode (and "
798 "before any toolchange from this filament in case of multimaterial printers). "
799 "Note that you can use placeholder variables for all PrusaSlicer settings. "
800 "If you have multiple extruders, the gcode is processed in extruder order.");
801 def->multiline = true;
802 def->full_width = true;
803 def->height = 120;
804 def->mode = comExpert;
805 def->set_default_value(new ConfigOptionStrings { "; Filament-specific end gcode \n;END gcode for filament\n" });
806
807 auto def_top_fill_pattern = def = this->add("top_fill_pattern", coEnum);
808 def->label = L("Top fill pattern");
809 def->category = L("Infill");
810 def->tooltip = L("Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells.");
811 def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern";
812 def->set_enum<InfillPattern>({
813 { "rectilinear", L("Rectilinear") },
814 { "monotonic", L("Monotonic") },
815 { "monotoniclines", L("Monotonic Lines") },
816 { "alignedrectilinear", L("Aligned Rectilinear") },
817 { "concentric", L("Concentric") },
818 { "hilbertcurve", L("Hilbert Curve") },
819 { "archimedeanchords", L("Archimedean Chords") },
820 { "octagramspiral", L("Octagram Spiral") }
821 });
822
823 // solid_fill_pattern is an obsolete equivalent to top_fill_pattern/bottom_fill_pattern.
824 def->aliases = { "solid_fill_pattern", "external_fill_pattern" };
825 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic));
826
827 def = this->add("bottom_fill_pattern", coEnum);
828 def->label = L("Bottom fill pattern");
829 def->category = L("Infill");
830 def->tooltip = L("Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells.");
831 def->cli = "bottom-fill-pattern|external-fill-pattern|solid-fill-pattern";
832 def->enum_def = Slic3r::clonable_ptr<Slic3r::ConfigOptionEnumDef>(def_top_fill_pattern->enum_def->clone());
833 def->aliases = def_top_fill_pattern->aliases;
834 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic));
835
836 def = this->add("external_perimeter_extrusion_width", coFloatOrPercent);
837 def->label = L("External perimeters");
838 def->category = L("Extrusion Width");
839 def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for external perimeters. "
840 "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. "
841 "If expressed as percentage (for example 200%), it will be computed over layer height.");
842 def->sidetext = L("mm or %");
843 def->min = 0;
844 def->max_literal = 50;
845 def->mode = comAdvanced;
846 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
847
848 def = this->add("external_perimeter_speed", coFloatOrPercent);
849 def->label = L("External perimeters");
850 def->category = L("Speed");
851 def->tooltip = L("This separate setting will affect the speed of external perimeters (the visible ones). "
852 "If expressed as percentage (for example: 80%) it will be calculated "
853 "on the perimeters speed setting above. Set to zero for auto.");
854 def->sidetext = L("mm/s or %");
855 def->ratio_over = "perimeter_speed";
856 def->min = 0;
857 def->mode = comAdvanced;
858 def->set_default_value(new ConfigOptionFloatOrPercent(50, true));
859
860 def = this->add("external_perimeters_first", coBool);
861 def->label = L("External perimeters first");
862 def->category = L("Layers and Perimeters");
863 def->tooltip = L("Print contour perimeters from the outermost one to the innermost one "
864 "instead of the default inverse order.");
865 def->mode = comExpert;
866 def->set_default_value(new ConfigOptionBool(false));
867
868 def = this->add("extra_perimeters", coBool);
869 def->label = L("Extra perimeters if needed");
870 def->category = L("Layers and Perimeters");
871 def->tooltip = L("Add more perimeters when needed for avoiding gaps in sloping walls. "
872 "Slic3r keeps adding perimeters, until more than 70% of the loop immediately above "
873 "is supported.");
874 def->mode = comExpert;
875 def->set_default_value(new ConfigOptionBool(true));
876
877 def = this->add("extra_perimeters_on_overhangs", coBool);
878 def->label = L("Extra perimeters on overhangs (Experimental)");
879 def->category = L("Layers and Perimeters");
880 def->tooltip = L("Detect overhang areas where bridges cannot be anchored, and fill them with "
881 "extra perimeter paths. These paths are anchored to the nearby non-overhang area when possible.");
882 def->mode = comExpert;
883 def->set_default_value(new ConfigOptionBool(false));
884
885 def = this->add("extruder", coInt);
886 def->label = L("Extruder");
887 def->category = L("Extruders");
888 def->tooltip = L("The extruder to use (unless more specific extruder settings are specified). "
889 "This value overrides perimeter and infill extruders, but not the support extruders.");
890 def->min = 0; // 0 = inherit defaults
891 def->set_enum_labels(ConfigOptionDef::GUIType::i_enum_open,
892 { L("default"), "1", "2", "3", "4", "5" }); // override label for item 0
893
894 def = this->add("extruder_clearance_height", coFloat);
895 def->label = L("Height");
896 def->tooltip = L("Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. "
897 "In other words, this is the height of the clearance cylinder around your extruder, "
898 "and it represents the maximum depth the extruder can peek before colliding with "
899 "other printed objects.");
900 def->sidetext = L("mm");
901 def->min = 0;
902 def->mode = comExpert;
903 def->set_default_value(new ConfigOptionFloat(20));
904
905 def = this->add("extruder_clearance_radius", coFloat);
906 def->label = L("Radius");
907 def->tooltip = L("Set this to the clearance radius around your extruder. "
908 "If the extruder is not centered, choose the largest value for safety. "
909 "This setting is used to check for collisions and to display the graphical preview "
910 "in the plater.");
911 def->sidetext = L("mm");
912 def->min = 0;
913 def->mode = comExpert;
914 def->set_default_value(new ConfigOptionFloat(20));
915
916 def = this->add("extruder_colour", coStrings);
917 def->label = L("Extruder Color");
918 def->tooltip = L("This is only used in the Slic3r interface as a visual help.");
919 def->gui_type = ConfigOptionDef::GUIType::color;
920 // Empty string means no color assigned yet.
921 def->set_default_value(new ConfigOptionStrings { "" });
922
923 def = this->add("extruder_offset", coPoints);
924 def->label = L("Extruder offset");
925 def->tooltip = L("If your firmware doesn't handle the extruder displacement you need the G-code "
926 "to take it into account. This option lets you specify the displacement of each extruder "
927 "with respect to the first one. It expects positive coordinates (they will be subtracted "
928 "from the XY coordinate).");
929 def->sidetext = L("mm");
930 def->mode = comAdvanced;
931 def->set_default_value(new ConfigOptionPoints { Vec2d(0,0) });
932
933 def = this->add("extrusion_axis", coString);
934 def->label = L("Extrusion axis");
935 def->tooltip = L("Use this option to set the axis letter associated to your printer's extruder "
936 "(usually E but some printers use A).");
937 def->set_default_value(new ConfigOptionString("E"));
938
939 def = this->add("extrusion_multiplier", coFloats);
940 def->label = L("Extrusion multiplier");
941 def->tooltip = L("This factor changes the amount of flow proportionally. You may need to tweak "
942 "this setting to get nice surface finish and correct single wall widths. "
943 "Usual values are between 0.9 and 1.1. If you think you need to change this more, "
944 "check filament diameter and your firmware E steps.");
945 def->max = 2;
946 def->mode = comAdvanced;
947 def->set_default_value(new ConfigOptionFloats { 1. });
948
949 def = this->add("extrusion_width", coFloatOrPercent);
950 def->label = L("Default extrusion width");
951 def->category = L("Extrusion Width");
952 def->tooltip = L("Set this to a non-zero value to allow a manual extrusion width. "
953 "If left to zero, Slic3r derives extrusion widths from the nozzle diameter "
954 "(see the tooltips for perimeter extrusion width, infill extrusion width etc). "
955 "If expressed as percentage (for example: 230%), it will be computed over layer height.");
956 def->sidetext = L("mm or %");
957 def->min = 0;
958 def->max = 1000;
959 def->max_literal = 50;
960 def->mode = comAdvanced;
961 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
962
963 def = this->add("fan_always_on", coBools);
964 def->label = L("Keep fan always on");
965 def->tooltip = L("If this is enabled, fan will never be disabled and will be kept running at least "
966 "at its minimum speed. Useful for PLA, harmful for ABS.");
967 def->set_default_value(new ConfigOptionBools { false });
968
969 def = this->add("fan_below_layer_time", coInts);
970 def->label = L("Enable fan if layer print time is below");
971 def->tooltip = L("If layer print time is estimated below this number of seconds, fan will be enabled "
972 "and its speed will be calculated by interpolating the minimum and maximum speeds.");
973 def->sidetext = L("approximate seconds");
974 def->min = 0;
975 def->max = 1000;
976 def->mode = comExpert;
977 def->set_default_value(new ConfigOptionInts { 60 });
978
979 def = this->add("filament_colour", coStrings);
980 def->label = L("Color");
981 def->tooltip = L("This is only used in the Slic3r interface as a visual help.");
982 def->gui_type = ConfigOptionDef::GUIType::color;
983 def->set_default_value(new ConfigOptionStrings { "#29B2B2" });
984
985 def = this->add("filament_notes", coStrings);
986 def->label = L("Filament notes");
987 def->tooltip = L("You can put your notes regarding the filament here.");
988 def->multiline = true;
989 def->full_width = true;
990 def->height = 13;
991 def->mode = comAdvanced;
992 def->set_default_value(new ConfigOptionStrings { "" });
993
994 def = this->add("filament_max_volumetric_speed", coFloats);
995 def->label = L("Max volumetric speed");
996 def->tooltip = L("Maximum volumetric speed allowed for this filament. Limits the maximum volumetric "
997 "speed of a print to the minimum of print and filament volumetric speed. "
998 "Set to zero for no limit.");
999 def->sidetext = L("mm³/s");
1000 def->min = 0;
1001 def->mode = comAdvanced;
1002 def->set_default_value(new ConfigOptionFloats { 0. });
1003
1004 def = this->add("filament_loading_speed", coFloats);
1005 def->label = L("Loading speed");
1006 def->tooltip = L("Speed used for loading the filament on the wipe tower.");
1007 def->sidetext = L("mm/s");
1008 def->min = 0;
1009 def->mode = comExpert;
1010 def->set_default_value(new ConfigOptionFloats { 28. });
1011
1012 def = this->add("filament_loading_speed_start", coFloats);
1013 def->label = L("Loading speed at the start");
1014 def->tooltip = L("Speed used at the very beginning of loading phase.");
1015 def->sidetext = L("mm/s");
1016 def->min = 0;
1017 def->mode = comExpert;
1018 def->set_default_value(new ConfigOptionFloats { 3. });
1019
1020 def = this->add("filament_unloading_speed", coFloats);
1021 def->label = L("Unloading speed");
1022 def->tooltip = L("Speed used for unloading the filament on the wipe tower (does not affect "
1023 " initial part of unloading just after ramming).");
1024 def->sidetext = L("mm/s");
1025 def->min = 0;
1026 def->mode = comExpert;
1027 def->set_default_value(new ConfigOptionFloats { 90. });
1028
1029 def = this->add("filament_unloading_speed_start", coFloats);
1030 def->label = L("Unloading speed at the start");
1031 def->tooltip = L("Speed used for unloading the tip of the filament immediately after ramming.");
1032 def->sidetext = L("mm/s");
1033 def->min = 0;
1034 def->mode = comExpert;
1035 def->set_default_value(new ConfigOptionFloats { 100. });
1036
1037 def = this->add("filament_toolchange_delay", coFloats);
1038 def->label = L("Delay after unloading");
1039 def->tooltip = L("Time to wait after the filament is unloaded. "
1040 "May help to get reliable toolchanges with flexible materials "
1041 "that may need more time to shrink to original dimensions.");
1042 def->sidetext = L("s");
1043 def->min = 0;
1044 def->mode = comExpert;
1045 def->set_default_value(new ConfigOptionFloats { 0. });
1046
1047 def = this->add("filament_cooling_moves", coInts);
1048 def->label = L("Number of cooling moves");
1049 def->tooltip = L("Filament is cooled by being moved back and forth in the "
1050 "cooling tubes. Specify desired number of these moves.");
1051 def->max = 0;
1052 def->max = 20;
1053 def->mode = comExpert;
1054 def->set_default_value(new ConfigOptionInts { 4 });
1055
1056 def = this->add("filament_cooling_initial_speed", coFloats);
1057 def->label = L("Speed of the first cooling move");
1058 def->tooltip = L("Cooling moves are gradually accelerating beginning at this speed.");
1059 def->sidetext = L("mm/s");
1060 def->min = 0;
1061 def->mode = comExpert;
1062 def->set_default_value(new ConfigOptionFloats { 2.2 });
1063
1064 def = this->add("filament_minimal_purge_on_wipe_tower", coFloats);
1065 def->label = L("Minimal purge on wipe tower");
1066 def->tooltip = L("After a tool change, the exact position of the newly loaded filament inside "
1067 "the nozzle may not be known, and the filament pressure is likely not yet stable. "
1068 "Before purging the print head into an infill or a sacrificial object, Slic3r will always prime "
1069 "this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably.");
1070 def->sidetext = L("mm³");
1071 def->min = 0;
1072 def->mode = comExpert;
1073 def->set_default_value(new ConfigOptionFloats { 15. });
1074
1075 def = this->add("filament_cooling_final_speed", coFloats);
1076 def->label = L("Speed of the last cooling move");
1077 def->tooltip = L("Cooling moves are gradually accelerating towards this speed.");
1078 def->sidetext = L("mm/s");
1079 def->min = 0;
1080 def->mode = comExpert;
1081 def->set_default_value(new ConfigOptionFloats { 3.4 });
1082
1083 def = this->add("filament_load_time", coFloats);
1084 def->label = L("Filament load time");
1085 def->tooltip = L("Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator.");
1086 def->sidetext = L("s");
1087 def->min = 0;
1088 def->mode = comExpert;
1089 def->set_default_value(new ConfigOptionFloats { 0. });
1090
1091 def = this->add("filament_ramming_parameters", coStrings);
1092 def->label = L("Ramming parameters");
1093 def->tooltip = L("This string is edited by RammingDialog and contains ramming specific parameters.");
1094 def->mode = comExpert;
1095 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|"
1096 " 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" });
1097
1098 def = this->add("filament_unload_time", coFloats);
1099 def->label = L("Filament unload time");
1100 def->tooltip = L("Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator.");
1101 def->sidetext = L("s");
1102 def->min = 0;
1103 def->mode = comExpert;
1104 def->set_default_value(new ConfigOptionFloats { 0. });
1105
1106 def = this->add("filament_diameter", coFloats);
1107 def->label = L("Diameter");
1108 def->tooltip = L("Enter your filament diameter here. Good precision is required, so use a caliper "
1109 "and do multiple measurements along the filament, then compute the average.");
1110 def->sidetext = L("mm");
1111 def->min = 0;
1112 def->set_default_value(new ConfigOptionFloats { 1.75 });
1113
1114 def = this->add("filament_density", coFloats);
1115 def->label = L("Density");
1116 def->tooltip = L("Enter your filament density here. This is only for statistical information. "
1117 "A decent way is to weigh a known length of filament and compute the ratio "
1118 "of the length to volume. Better is to calculate the volume directly through displacement.");
1119 def->sidetext = L("g/cm³");
1120 def->min = 0;
1121 def->set_default_value(new ConfigOptionFloats { 0. });
1122
1123 def = this->add("filament_type", coStrings);
1124 def->label = L("Filament type");
1125 def->tooltip = L("The filament material type for use in custom G-codes.");
1126 def->gui_flags = "show_value";
1127 def->set_enum_values(ConfigOptionDef::GUIType::select_open, {
1128 "PLA",
1129 "PET",
1130 "ABS",
1131 "ASA",
1132 "FLEX",
1133 "HIPS",
1134 "EDGE",
1135 "NGEN",
1136 "PA",
1137 "NYLON",
1138 "PVA",
1139 "PC",
1140 "PP",
1141 "PEI",
1142 "PEEK",
1143 "PEKK",
1144 "POM",
1145 "PSU",
1146 "PVDF",
1147 "SCAFF"
1148 });
1149 def->mode = comAdvanced;
1150 def->set_default_value(new ConfigOptionStrings { "PLA" });
1151
1152 def = this->add("filament_soluble", coBools);
1153 def->label = L("Soluble material");
1154 def->tooltip = L("Soluble material is most likely used for a soluble support.");
1155 def->mode = comAdvanced;
1156 def->set_default_value(new ConfigOptionBools { false });
1157
1158 def = this->add("filament_cost", coFloats);
1159 def->label = L("Cost");
1160 def->tooltip = L("Enter your filament cost per kg here. This is only for statistical information.");
1161 def->sidetext = L("money/kg");
1162 def->min = 0;
1163 def->set_default_value(new ConfigOptionFloats { 0. });
1164
1165 def = this->add("filament_spool_weight", coFloats);
1166 def->label = L("Spool weight");
1167 def->tooltip = L("Enter weight of the empty filament spool. "
1168 "One may weigh a partially consumed filament spool before printing and one may compare the measured weight "
1169 "with the calculated weight of the filament with the spool to find out whether the amount "
1170 "of filament on the spool is sufficient to finish the print.");
1171 def->sidetext = L("g");
1172 def->min = 0;
1173 def->set_default_value(new ConfigOptionFloats { 0. });
1174
1175 def = this->add("filament_settings_id", coStrings);
1176 def->set_default_value(new ConfigOptionStrings { "" });
1177 def->cli = ConfigOptionDef::nocli;
1178
1179 def = this->add("filament_vendor", coString);
1180 def->set_default_value(new ConfigOptionString(L("(Unknown)")));
1181 def->cli = ConfigOptionDef::nocli;
1182
1183 def = this->add("fill_angle", coFloat);
1184 def->label = L("Fill angle");
1185 def->category = L("Infill");
1186 def->tooltip = L("Default base angle for infill orientation. Cross-hatching will be applied to this. "
1187 "Bridges will be infilled using the best direction Slic3r can detect, so this setting "
1188 "does not affect them.");
1189 def->sidetext = L("°");
1190 def->min = 0;
1191 def->max = 360;
1192 def->mode = comAdvanced;
1193 def->set_default_value(new ConfigOptionFloat(45));
1194
1195 def = this->add("fill_density", coPercent);
1196 def->gui_flags = "show_value";
1197 def->label = L("Fill density");
1198 def->category = L("Infill");
1199 def->tooltip = L("Density of internal infill, expressed in the range 0% - 100%.");
1200 def->sidetext = L("%");
1201 def->min = 0;
1202 def->max = 100;
1203 def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, {
1204 { "0", "0%" },
1205 { "5", "5%" },
1206 { "10", "10%" },
1207 { "15", "15%" },
1208 { "20", "20%" },
1209 { "25", "25%" },
1210 { "30", "30%" },
1211 { "40", "40%" },
1212 { "50", "50%" },
1213 { "60", "60%" },
1214 { "70", "70%" },
1215 { "80", "80%" },
1216 { "90", "90%" },
1217 { "100", "100%" }
1218 });
1219 def->set_default_value(new ConfigOptionPercent(20));
1220
1221 def = this->add("fill_pattern", coEnum);
1222 def->label = L("Fill pattern");
1223 def->category = L("Infill");
1224 def->tooltip = L("Fill pattern for general low-density infill.");
1225 def->set_enum<InfillPattern>({
1226 { "rectilinear", L("Rectilinear") },
1227 { "alignedrectilinear", L("Aligned Rectilinear") },
1228 { "grid", L("Grid") },
1229 { "triangles", L("Triangles")},
1230 { "stars", L("Stars")},
1231 { "cubic", L("Cubic")},
1232 { "line", L("Line")},
1233 { "concentric", L("Concentric")},
1234 { "honeycomb", L("Honeycomb")},
1235 { "3dhoneycomb", L("3D Honeycomb")},
1236 { "gyroid", L("Gyroid")},
1237 { "hilbertcurve", L("Hilbert Curve")},
1238 { "archimedeanchords", L("Archimedean Chords")},
1239 { "octagramspiral", L("Octagram Spiral")},
1240 { "adaptivecubic", L("Adaptive Cubic")},
1241 { "supportcubic", L("Support Cubic")},
1242 { "lightning", L("Lightning")}
1243 });
1244 def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipStars));
1245
1246 def = this->add("first_layer_acceleration", coFloat);
1247 def->label = L("First layer");
1248 def->tooltip = L("This is the acceleration your printer will use for first layer. Set zero "
1249 "to disable acceleration control for first layer.");
1250 def->sidetext = L("mm/s²");
1251 def->min = 0;
1252 def->mode = comExpert;
1253 def->set_default_value(new ConfigOptionFloat(0));
1254
1255 def = this->add("first_layer_acceleration_over_raft", coFloat);
1256 def->label = L("First object layer over raft interface");
1257 def->tooltip = L("This is the acceleration your printer will use for first layer of object above raft interface. Set zero "
1258 "to disable acceleration control for first layer of object above raft interface.");
1259 def->sidetext = L("mm/s²");
1260 def->min = 0;
1261 def->mode = comExpert;
1262 def->set_default_value(new ConfigOptionFloat(0));
1263
1264 def = this->add("first_layer_bed_temperature", coInts);
1265 def->label = L("First layer");
1266 def->full_label = L("First layer bed temperature");
1267 def->tooltip = L("Heated build plate temperature for the first layer. Set this to zero to disable "
1268 "bed temperature control commands in the output.");
1269 def->sidetext = L("°C");
1270 def->max = 0;
1271 def->max = 300;
1272 def->set_default_value(new ConfigOptionInts { 0 });
1273
1274 def = this->add("first_layer_extrusion_width", coFloatOrPercent);
1275 def->label = L("First layer");
1276 def->category = L("Extrusion Width");
1277 def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for first layer. "
1278 "You can use this to force fatter extrudates for better adhesion. If expressed "
1279 "as percentage (for example 120%) it will be computed over first layer height. "
1280 "If set to zero, it will use the default extrusion width.");
1281 def->sidetext = L("mm or %");
1282 def->ratio_over = "first_layer_height";
1283 def->min = 0;
1284 def->max_literal = 50;
1285 def->mode = comAdvanced;
1286 def->set_default_value(new ConfigOptionFloatOrPercent(200, true));
1287
1288 def = this->add("first_layer_height", coFloatOrPercent);
1289 def->label = L("First layer height");
1290 def->category = L("Layers and Perimeters");
1291 def->tooltip = L("When printing with very low layer heights, you might still want to print a thicker "
1292 "bottom layer to improve adhesion and tolerance for non perfect build plates.");
1293 def->sidetext = L("mm");
1294 def->min = 0;
1295 def->ratio_over = "layer_height";
1296 def->set_default_value(new ConfigOptionFloatOrPercent(0.35, false));
1297
1298 def = this->add("first_layer_speed", coFloatOrPercent);
1299 def->label = L("First layer speed");
1300 def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to all the print moves "
1301 "of the first layer, regardless of their type. If expressed as a percentage "
1302 "(for example: 40%) it will scale the default speeds.");
1303 def->sidetext = L("mm/s or %");
1304 def->min = 0;
1305 def->max_literal = 20;
1306 def->mode = comAdvanced;
1307 def->set_default_value(new ConfigOptionFloatOrPercent(30, false));
1308
1309 def = this->add("first_layer_speed_over_raft", coFloatOrPercent);
1310 def->label = L("Speed of object first layer over raft interface");
1311 def->tooltip = L("If expressed as absolute value in mm/s, this speed will be applied to all the print moves "
1312 "of the first object layer above raft interface, regardless of their type. If expressed as a percentage "
1313 "(for example: 40%) it will scale the default speeds.");
1314 def->sidetext = L("mm/s or %");
1315 def->min = 0;
1316 def->mode = comAdvanced;
1317 def->set_default_value(new ConfigOptionFloatOrPercent(30, false));
1318
1319 def = this->add("first_layer_temperature", coInts);
1320 def->label = L("First layer");
1321 def->full_label = L("First layer nozzle temperature");
1322 def->tooltip = L("Nozzle temperature for the first layer. If you want to control temperature manually "
1323 "during print, set this to zero to disable temperature control commands in the output G-code.");
1324 def->sidetext = L("°C");
1325 def->min = 0;
1326 def->max = max_temp;
1327 def->set_default_value(new ConfigOptionInts { 200 });
1328
1329 def = this->add("full_fan_speed_layer", coInts);
1330 def->label = L("Full fan speed at layer");
1331 def->tooltip = L("Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" "
1332 "to maximum at layer \"full_fan_speed_layer\". "
1333 "\"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case "
1334 "the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1.");
1335 def->min = 0;
1336 def->max = 1000;
1337 def->mode = comExpert;
1338 def->set_default_value(new ConfigOptionInts { 0 });
1339
1340 def = this->add("fuzzy_skin", coEnum);
1341 def->label = L("Fuzzy Skin");
1342 def->category = L("Fuzzy Skin");
1343 def->tooltip = L("Fuzzy skin type.");
1344 def->set_enum<FuzzySkinType>({
1345 { "none", L("None") },
1346 { "external", L("Outside walls") },
1347 { "all", L("All walls") }
1348 });
1349 def->mode = comSimple;
1350 def->set_default_value(new ConfigOptionEnum<FuzzySkinType>(FuzzySkinType::None));
1351
1352 def = this->add("fuzzy_skin_thickness", coFloat);
1353 def->label = L("Fuzzy skin thickness");
1354 def->category = L("Fuzzy Skin");
1355 def->tooltip = L("The maximum distance that each skin point can be offset (both ways), "
1356 "measured perpendicular to the perimeter wall.");
1357 def->sidetext = L("mm");
1358 def->min = 0;
1359 def->mode = comAdvanced;
1360 def->set_default_value(new ConfigOptionFloat(0.3));
1361
1362 def = this->add("fuzzy_skin_point_dist", coFloat);
1363 def->label = L("Fuzzy skin point distance");
1364 def->category = L("Fuzzy Skin");
1365 def->tooltip = L("Perimeters will be split into multiple segments by inserting Fuzzy skin points. "
1366 "Lowering the Fuzzy skin point distance will increase the number of randomly offset points on the perimeter wall.");
1367 def->sidetext = L("mm");
1368 def->min = 0;
1369 def->mode = comAdvanced;
1370 def->set_default_value(new ConfigOptionFloat(0.8));
1371
1372 def = this->add("gap_fill_enabled", coBool);
1373 def->label = L("Fill gaps");
1374 def->category = L("Layers and Perimeters");
1375 def->tooltip = L("Enables filling of gaps between perimeters and between the inner most perimeters and infill.");
1376 def->mode = comAdvanced;
1377 def->set_default_value(new ConfigOptionBool(true));
1378
1379 def = this->add("gap_fill_speed", coFloat);
1380 def->label = L("Gap fill");
1381 def->category = L("Speed");
1382 def->tooltip = L("Speed for filling small gaps using short zigzag moves. Keep this reasonably low "
1383 "to avoid too much shaking and resonance issues. Set zero to disable gaps filling.");
1384 def->sidetext = L("mm/s");
1385 def->min = 0;
1386 def->mode = comAdvanced;
1387 def->set_default_value(new ConfigOptionFloat(20));
1388
1389 def = this->add("gcode_comments", coBool);
1390 def->label = L("Verbose G-code");
1391 def->tooltip = L("Enable this to get a commented G-code file, with each line explained by a descriptive text. "
1392 "If you print from SD card, the additional weight of the file could make your firmware "
1393 "slow down.");
1394 def->mode = comExpert;
1395 def->set_default_value(new ConfigOptionBool(0));
1396
1397 def = this->add("gcode_flavor", coEnum);
1398 def->label = L("G-code flavor");
1399 def->tooltip = L("Some G/M-code commands, including temperature control and others, are not universal. "
1400 "Set this option to your printer's firmware to get a compatible output. "
1401 "The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all.");
1402 def->set_enum<GCodeFlavor>({
1403 { "reprap", "RepRap/Sprinter" },
1404 { "reprapfirmware", "RepRapFirmware" },
1405 { "repetier", "Repetier" },
1406 { "teacup", "Teacup" },
1407 { "makerware", "MakerWare (MakerBot)" },
1408 { "marlin", "Marlin (legacy)" },
1409 { "marlin2", "Marlin 2" },
1410 { "klipper", "Klipper" },
1411 { "sailfish", "Sailfish (MakerBot)" },
1412 { "mach3", "Mach3/LinuxCNC" },
1413 { "machinekit", "Machinekit" },
1414 { "smoothie", "Smoothie" },
1415 { "no-extrusion", L("No extrusion") }
1416 });
1417 def->mode = comExpert;
1418 def->set_default_value(new ConfigOptionEnum<GCodeFlavor>(gcfRepRapSprinter));
1419
1420 def = this->add("gcode_label_objects", coBool);
1421 def->label = L("Label objects");
1422 def->tooltip = L("Enable this to add comments into the G-Code labeling print moves with what object they belong to,"
1423 " which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with "
1424 "Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill.");
1425 def->mode = comAdvanced;
1426 def->set_default_value(new ConfigOptionBool(0));
1427
1428 def = this->add("gcode_substitutions", coStrings);
1429 def->label = L("G-code substitutions");
1430 def->tooltip = L("Find / replace patterns in G-code lines and substitute them.");
1431 def->mode = comExpert;
1432 def->set_default_value(new ConfigOptionStrings());
1433
1434 def = this->add("high_current_on_filament_swap", coBool);
1435 def->label = L("High extruder current on filament swap");
1436 def->tooltip = L("It may be beneficial to increase the extruder motor current during the filament exchange"
1437 " sequence to allow for rapid ramming feed rates and to overcome resistance when loading"
1438 " a filament with an ugly shaped tip.");
1439 def->mode = comExpert;
1440 def->set_default_value(new ConfigOptionBool(0));
1441
1442 def = this->add("infill_acceleration", coFloat);
1443 def->label = L("Infill");
1444 def->tooltip = L("This is the acceleration your printer will use for infill. Set zero to disable "
1445 "acceleration control for infill.");
1446 def->sidetext = L("mm/s²");
1447 def->min = 0;
1448 def->mode = comExpert;
1449 def->set_default_value(new ConfigOptionFloat(0));
1450
1451 def = this->add("solid_infill_acceleration", coFloat);
1452 def->label = L("Solid infill");
1453 def->tooltip = L("This is the acceleration your printer will use for solid infill. Set zero to use "
1454 "the value for infill.");
1455 def->sidetext = L("mm/s²");
1456 def->min = 0;
1457 def->mode = comExpert;
1458 def->set_default_value(new ConfigOptionFloat(0));
1459
1460 def = this->add("top_solid_infill_acceleration", coFloat);
1461 def->label = L("Top solid infill");
1462 def->tooltip = L("This is the acceleration your printer will use for top solid infill. Set zero to use "
1463 "the value for solid infill.");
1464 def->sidetext = L("mm/s²");
1465 def->min = 0;
1466 def->mode = comExpert;
1467 def->set_default_value(new ConfigOptionFloat(0));
1468
1469 def = this->add("travel_acceleration", coFloat);
1470 def->label = L("Travel");
1471 def->tooltip = L("This is the acceleration your printer will use for travel moves. Set zero to disable "
1472 "acceleration control for travel.");
1473 def->sidetext = L("mm/s²");
1474 def->min = 0;
1475 def->mode = comExpert;
1476 def->set_default_value(new ConfigOptionFloat(0));
1477
1478 def = this->add("infill_every_layers", coInt);
1479 def->label = L("Combine infill every");
1480 def->category = L("Infill");
1481 def->tooltip = L("This feature allows to combine infill and speed up your print by extruding thicker "
1482 "infill layers while preserving thin perimeters, thus accuracy.");
1483 def->sidetext = L("layers");
1484 def->full_label = L("Combine infill every n layers");
1485 def->min = 1;
1486 def->mode = comAdvanced;
1487 def->set_default_value(new ConfigOptionInt(1));
1488
1489 auto def_infill_anchor_min = def = this->add("infill_anchor", coFloatOrPercent);
1490 def->label = L("Length of the infill anchor");
1491 def->category = L("Advanced");
1492 def->tooltip = L("Connect an infill line to an internal perimeter with a short segment of an additional perimeter. "
1493 "If expressed as percentage (example: 15%) it is calculated over infill extrusion width. "
1494 "PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment "
1495 "shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side "
1496 "and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. "
1497 "Set this parameter to zero to disable anchoring perimeters connected to a single infill line.");
1498 def->sidetext = L("mm or %");
1499 def->ratio_over = "infill_extrusion_width";
1500 def->max_literal = 1000;
1501 def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, {
1502 { "0", L("0 (no open anchors)") },
1503 { "1", L("1 mm") },
1504 { "2", L("2 mm") },
1505 { "5", L("5 mm") },
1506 { "10", L("10 mm") },
1507 { "1000", L("1000 (unlimited)") }
1508 });
1509 def->mode = comAdvanced;
1510 def->set_default_value(new ConfigOptionFloatOrPercent(600, true));
1511
1512 def = this->add("infill_anchor_max", coFloatOrPercent);
1513 def->label = L("Maximum length of the infill anchor");
1514 def->category = def_infill_anchor_min->category;
1515 def->tooltip = L("Connect an infill line to an internal perimeter with a short segment of an additional perimeter. "
1516 "If expressed as percentage (example: 15%) it is calculated over infill extrusion width. "
1517 "PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment "
1518 "shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side "
1519 "and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. "
1520 "Set this parameter to zero to disable anchoring.");
1521 def->sidetext = def_infill_anchor_min->sidetext;
1522 def->ratio_over = def_infill_anchor_min->ratio_over;
1523 def->max_literal = def_infill_anchor_min->max_literal;
1524 def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, {
1525 { "0", L("0 (not anchored)") },
1526 { "1", L("1 mm") },
1527 { "2", L("2 mm") },
1528 { "5", L("5 mm") },
1529 { "10", L("10 mm") },
1530 { "1000", L("1000 (unlimited)") }
1531 });
1532 def->mode = def_infill_anchor_min->mode;
1533 def->set_default_value(new ConfigOptionFloatOrPercent(50, false));
1534
1535 def = this->add("infill_extruder", coInt);
1536 def->label = L("Infill extruder");
1537 def->category = L("Extruders");
1538 def->tooltip = L("The extruder to use when printing infill.");
1539 def->min = 1;
1540 def->mode = comAdvanced;
1541 def->set_default_value(new ConfigOptionInt(1));
1542
1543 def = this->add("infill_extrusion_width", coFloatOrPercent);
1544 def->label = L("Infill");
1545 def->category = L("Extrusion Width");
1546 def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for infill. "
1547 "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. "
1548 "You may want to use fatter extrudates to speed up the infill and make your parts stronger. "
1549 "If expressed as percentage (for example 90%) it will be computed over layer height.");
1550 def->sidetext = L("mm or %");
1551 def->min = 0;
1552 def->max_literal = 50;
1553 def->mode = comAdvanced;
1554 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
1555
1556 def = this->add("infill_first", coBool);
1557 def->label = L("Infill before perimeters");
1558 def->tooltip = L("This option will switch the print order of perimeters and infill, making the latter first.");
1559 def->mode = comExpert;
1560 def->set_default_value(new ConfigOptionBool(false));
1561
1562 // def = this->add("infill_only_where_needed", coBool);
1563 // def->label = L("Only infill where needed");
1564 // def->category = L("Infill");
1565 // def->tooltip = L("This option will limit infill to the areas actually needed for supporting ceilings "
1566 // "(it will act as internal support material). If enabled, slows down the G-code generation "
1567 // "due to the multiple checks involved.");
1568 // def->mode = comAdvanced;
1569 // def->set_default_value(new ConfigOptionBool(false));
1570
1571 def = this->add("infill_overlap", coFloatOrPercent);
1572 def->label = L("Infill/perimeters overlap");
1573 def->category = L("Advanced");
1574 def->tooltip = L("This setting applies an additional overlap between infill and perimeters for better bonding. "
1575 "Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed "
1576 "as percentage (example: 15%) it is calculated over perimeter extrusion width.");
1577 def->sidetext = L("mm or %");
1578 def->ratio_over = "perimeter_extrusion_width";
1579 def->mode = comExpert;
1580 def->set_default_value(new ConfigOptionFloatOrPercent(25, true));
1581
1582 def = this->add("infill_speed", coFloat);
1583 def->label = L("Infill");
1584 def->category = L("Speed");
1585 def->tooltip = L("Speed for printing the internal fill. Set to zero for auto.");
1586 def->sidetext = L("mm/s");
1587 def->aliases = { "print_feed_rate", "infill_feed_rate" };
1588 def->min = 0;
1589 def->mode = comAdvanced;
1590 def->set_default_value(new ConfigOptionFloat(80));
1591
1592 def = this->add("inherits", coString);
1593 def->label = L("Inherits profile");
1594 def->tooltip = L("Name of the profile, from which this profile inherits.");
1595 def->full_width = true;
1596 def->height = 5;
1597 def->set_default_value(new ConfigOptionString());
1598 def->cli = ConfigOptionDef::nocli;
1599
1600 // The following value is to be stored into the project file (AMF, 3MF, Config ...)
1601 // and it contains a sum of "inherits" values over the print and filament profiles.
1602 def = this->add("inherits_cummulative", coStrings);
1603 def->set_default_value(new ConfigOptionStrings());
1604 def->cli = ConfigOptionDef::nocli;
1605
1606 def = this->add("interface_shells", coBool);
1607 def->label = L("Interface shells");
1608 def->tooltip = L("Force the generation of solid shells between adjacent materials/volumes. "
1609 "Useful for multi-extruder prints with translucent materials or manual soluble "
1610 "support material.");
1611 def->category = L("Layers and Perimeters");
1612 def->mode = comExpert;
1613 def->set_default_value(new ConfigOptionBool(false));
1614
1615 def = this->add("mmu_segmented_region_max_width", coFloat);
1616 def->label = L("Maximum width of a segmented region");
1617 def->tooltip = L("Maximum width of a segmented region. Zero disables this feature.");
1618 def->sidetext = L("mm (zero to disable)");
1619 def->min = 0;
1620 def->category = L("Advanced");
1621 def->mode = comExpert;
1622 def->set_default_value(new ConfigOptionFloat(0.));
1623
1624 def = this->add("ironing", coBool);
1625 def->label = L("Enable ironing");
1626 def->tooltip = L("Enable ironing of the top layers with the hot print head for smooth surface");
1627 def->category = L("Ironing");
1628 def->mode = comAdvanced;
1629 def->set_default_value(new ConfigOptionBool(false));
1630
1631 def = this->add("ironing_type", coEnum);
1632 def->label = L("Ironing Type");
1633 def->category = L("Ironing");
1634 def->tooltip = L("Ironing Type");
1635 def->set_enum<IroningType>({
1636 { "top", L("All top surfaces") },
1637 { "topmost", L("Topmost surface only") },
1638 { "solid", L("All solid surfaces") }
1639 });
1640 def->mode = comAdvanced;
1641 def->set_default_value(new ConfigOptionEnum<IroningType>(IroningType::TopSurfaces));
1642
1643 def = this->add("ironing_flowrate", coPercent);
1644 def->label = L("Flow rate");
1645 def->category = L("Ironing");
1646 def->tooltip = L("Percent of a flow rate relative to object's normal layer height.");
1647 def->sidetext = L("%");
1648 def->ratio_over = "layer_height";
1649 def->min = 0;
1650 def->mode = comExpert;
1651 def->set_default_value(new ConfigOptionPercent(15));
1652
1653 def = this->add("ironing_spacing", coFloat);
1654 def->label = L("Spacing between ironing passes");
1655 def->category = L("Ironing");
1656 def->tooltip = L("Distance between ironing lines");
1657 def->sidetext = L("mm");
1658 def->min = 0;
1659 def->mode = comExpert;
1660 def->set_default_value(new ConfigOptionFloat(0.1));
1661
1662 def = this->add("ironing_speed", coFloat);
1663 def->label = L("Ironing");
1664 def->category = L("Speed");
1665 def->tooltip = L("Ironing");
1666 def->sidetext = L("mm/s");
1667 def->min = 0;
1668 def->mode = comAdvanced;
1669 def->set_default_value(new ConfigOptionFloat(15));
1670
1671 def = this->add("layer_gcode", coString);
1672 def->label = L("After layer change G-code");
1673 def->tooltip = L("This custom code is inserted at every layer change, right after the Z move "
1674 "and before the extruder moves to the first layer point. Note that you can use "
1675 "placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z].");
1676 def->cli = "after-layer-gcode|layer-gcode";
1677 def->multiline = true;
1678 def->full_width = true;
1679 def->height = 5;
1680 def->mode = comExpert;
1681 def->set_default_value(new ConfigOptionString(""));
1682
1683 def = this->add("remaining_times", coBool);
1684 def->label = L("Supports remaining times");
1685 def->tooltip = L("Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute"
1686 " intervals into the G-code to let the firmware show accurate remaining time."
1687 " As of now only the Prusa i3 MK3 firmware recognizes M73."
1688 " Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode.");
1689 def->mode = comExpert;
1690 def->set_default_value(new ConfigOptionBool(false));
1691
1692 def = this->add("silent_mode", coBool);
1693 def->label = L("Supports stealth mode");
1694 def->tooltip = L("The firmware supports stealth mode");
1695 def->mode = comExpert;
1696 def->set_default_value(new ConfigOptionBool(true));
1697
1698 def = this->add("machine_limits_usage", coEnum);
1699 def->label = L("How to apply limits");
1700 def->full_label = L("Purpose of Machine Limits");
1701 def->category = L("Machine limits");
1702 def->tooltip = L("How to apply the Machine Limits");
1703 def->set_enum<MachineLimitsUsage>({
1704 { "emit_to_gcode", L("Emit to G-code") },
1705 { "time_estimate_only", L("Use for time estimate") },
1706 { "ignore", L("Ignore") }
1707 });
1708 def->mode = comAdvanced;
1710
1711 {
1712 struct AxisDefault {
1713 std::string name;
1714 std::vector<double> max_feedrate;
1715 std::vector<double> max_acceleration;
1716 std::vector<double> max_jerk;
1717 };
1718 std::vector<AxisDefault> axes {
1719 // name, max_feedrate, max_acceleration, max_jerk
1720 { "x", { 500., 200. }, { 9000., 1000. }, { 10. , 10. } },
1721 { "y", { 500., 200. }, { 9000., 1000. }, { 10. , 10. } },
1722 { "z", { 12., 12. }, { 500., 200. }, { 0.2, 0.4 } },
1723 { "e", { 120., 120. }, { 10000., 5000. }, { 2.5, 2.5 } }
1724 };
1725 for (const AxisDefault &axis : axes) {
1726 std::string axis_upper = boost::to_upper_copy<std::string>(axis.name);
1727 // Add the machine feedrate limits for XYZE axes. (M203)
1728 def = this->add("machine_max_feedrate_" + axis.name, coFloats);
1729 def->full_label = (boost::format("Maximum feedrate %1%") % axis_upper).str();
1730 (void)L("Maximum feedrate X");
1731 (void)L("Maximum feedrate Y");
1732 (void)L("Maximum feedrate Z");
1733 (void)L("Maximum feedrate E");
1734 def->category = L("Machine limits");
1735 def->tooltip = (boost::format("Maximum feedrate of the %1% axis") % axis_upper).str();
1736 (void)L("Maximum feedrate of the X axis");
1737 (void)L("Maximum feedrate of the Y axis");
1738 (void)L("Maximum feedrate of the Z axis");
1739 (void)L("Maximum feedrate of the E axis");
1740 def->sidetext = L("mm/s");
1741 def->min = 0;
1742 def->mode = comAdvanced;
1743 def->set_default_value(new ConfigOptionFloats(axis.max_feedrate));
1744 // Add the machine acceleration limits for XYZE axes (M201)
1745 def = this->add("machine_max_acceleration_" + axis.name, coFloats);
1746 def->full_label = (boost::format("Maximum acceleration %1%") % axis_upper).str();
1747 (void)L("Maximum acceleration X");
1748 (void)L("Maximum acceleration Y");
1749 (void)L("Maximum acceleration Z");
1750 (void)L("Maximum acceleration E");
1751 def->category = L("Machine limits");
1752 def->tooltip = (boost::format("Maximum acceleration of the %1% axis") % axis_upper).str();
1753 (void)L("Maximum acceleration of the X axis");
1754 (void)L("Maximum acceleration of the Y axis");
1755 (void)L("Maximum acceleration of the Z axis");
1756 (void)L("Maximum acceleration of the E axis");
1757 def->sidetext = L("mm/s²");
1758 def->min = 0;
1759 def->mode = comAdvanced;
1760 def->set_default_value(new ConfigOptionFloats(axis.max_acceleration));
1761 // Add the machine jerk limits for XYZE axes (M205)
1762 def = this->add("machine_max_jerk_" + axis.name, coFloats);
1763 def->full_label = (boost::format("Maximum jerk %1%") % axis_upper).str();
1764 (void)L("Maximum jerk X");
1765 (void)L("Maximum jerk Y");
1766 (void)L("Maximum jerk Z");
1767 (void)L("Maximum jerk E");
1768 def->category = L("Machine limits");
1769 def->tooltip = (boost::format("Maximum jerk of the %1% axis") % axis_upper).str();
1770 (void)L("Maximum jerk of the X axis");
1771 (void)L("Maximum jerk of the Y axis");
1772 (void)L("Maximum jerk of the Z axis");
1773 (void)L("Maximum jerk of the E axis");
1774 def->sidetext = L("mm/s");
1775 def->min = 0;
1776 def->mode = comAdvanced;
1777 def->set_default_value(new ConfigOptionFloats(axis.max_jerk));
1778 }
1779 }
1780
1781 // M205 S... [mm/sec]
1782 def = this->add("machine_min_extruding_rate", coFloats);
1783 def->full_label = L("Minimum feedrate when extruding");
1784 def->category = L("Machine limits");
1785 def->tooltip = L("Minimum feedrate when extruding (M205 S)");
1786 def->sidetext = L("mm/s");
1787 def->min = 0;
1788 def->mode = comAdvanced;
1789 def->set_default_value(new ConfigOptionFloats{ 0., 0. });
1790
1791 // M205 T... [mm/sec]
1792 def = this->add("machine_min_travel_rate", coFloats);
1793 def->full_label = L("Minimum travel feedrate");
1794 def->category = L("Machine limits");
1795 def->tooltip = L("Minimum travel feedrate (M205 T)");
1796 def->sidetext = L("mm/s");
1797 def->min = 0;
1798 def->mode = comAdvanced;
1799 def->set_default_value(new ConfigOptionFloats{ 0., 0. });
1800
1801 // M204 P... [mm/sec^2]
1802 def = this->add("machine_max_acceleration_extruding", coFloats);
1803 def->full_label = L("Maximum acceleration when extruding");
1804 def->category = L("Machine limits");
1805 def->tooltip = L("Maximum acceleration when extruding");
1806 def->sidetext = L("mm/s²");
1807 def->min = 0;
1808 def->mode = comAdvanced;
1809 def->set_default_value(new ConfigOptionFloats{ 1500., 1250. });
1810
1811
1812 // M204 R... [mm/sec^2]
1813 def = this->add("machine_max_acceleration_retracting", coFloats);
1814 def->full_label = L("Maximum acceleration when retracting");
1815 def->category = L("Machine limits");
1816 def->tooltip = L("Maximum acceleration when retracting.\n\n"
1817 "Not used for RepRapFirmware, which does not support it.");
1818 def->sidetext = L("mm/s²");
1819 def->min = 0;
1820 def->mode = comAdvanced;
1821 def->set_default_value(new ConfigOptionFloats{ 1500., 1250. });
1822
1823 // M204 T... [mm/sec^2]
1824 def = this->add("machine_max_acceleration_travel", coFloats);
1825 def->full_label = L("Maximum acceleration for travel moves");
1826 def->category = L("Machine limits");
1827 def->tooltip = L("Maximum acceleration for travel moves.");
1828 def->sidetext = L("mm/s²");
1829 def->min = 0;
1830 def->mode = comAdvanced;
1831 def->set_default_value(new ConfigOptionFloats{ 1500., 1250. });
1832
1833 def = this->add("max_fan_speed", coInts);
1834 def->label = L("Max");
1835 def->tooltip = L("This setting represents the maximum speed of your fan.");
1836 def->sidetext = L("%");
1837 def->min = 0;
1838 def->max = 100;
1839 def->mode = comExpert;
1840 def->set_default_value(new ConfigOptionInts { 100 });
1841
1842 def = this->add("max_layer_height", coFloats);
1843 def->label = L("Max");
1844 def->tooltip = L("This is the highest printable layer height for this extruder, used to cap "
1845 "the variable layer height and support layer height. Maximum recommended layer height "
1846 "is 75% of the extrusion width to achieve reasonable inter-layer adhesion. "
1847 "If set to 0, layer height is limited to 75% of the nozzle diameter.");
1848 def->sidetext = L("mm");
1849 def->min = 0;
1850 def->mode = comAdvanced;
1851 def->set_default_value(new ConfigOptionFloats { 0. });
1852
1853 def = this->add("max_print_speed", coFloat);
1854 def->label = L("Max print speed");
1855 def->tooltip = L("When setting other speed settings to 0 Slic3r will autocalculate the optimal speed "
1856 "in order to keep constant extruder pressure. This experimental setting is used "
1857 "to set the highest print speed you want to allow.");
1858 def->sidetext = L("mm/s");
1859 def->min = 1;
1860 def->mode = comExpert;
1861 def->set_default_value(new ConfigOptionFloat(80));
1862
1863 def = this->add("max_volumetric_speed", coFloat);
1864 def->label = L("Max volumetric speed");
1865 def->tooltip = L("This experimental setting is used to set the maximum volumetric speed your "
1866 "extruder supports.");
1867 def->sidetext = L("mm³/s");
1868 def->min = 0;
1869 def->mode = comExpert;
1870 def->set_default_value(new ConfigOptionFloat(0));
1871
1872 def = this->add("max_volumetric_extrusion_rate_slope_positive", coFloat);
1873 def->label = L("Max volumetric slope positive");
1874 def->tooltip = L("This experimental setting is used to limit the speed of change in extrusion rate "
1875 "for a transition from lower speed to higher speed. "
1876 "A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
1877 "of 1.8 mm³/s (0.45 mm extrusion width, 0.2 mm extrusion height, feedrate 20 mm/s) "
1878 "to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds.");
1879 def->sidetext = L("mm³/s²");
1880 def->min = 0;
1881 def->mode = comExpert;
1882 def->set_default_value(new ConfigOptionFloat(0));
1883
1884 def = this->add("max_volumetric_extrusion_rate_slope_negative", coFloat);
1885 def->label = L("Max volumetric slope negative");
1886 def->tooltip = L("This experimental setting is used to limit the speed of change in extrusion rate "
1887 "for a transition from higher speed to lower speed. "
1888 "A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
1889 "of 5.4 mm³/s (0.45 mm extrusion width, 0.2 mm extrusion height, feedrate 60 mm/s) "
1890 "to 1.8 mm³/s (feedrate 20 mm/s) will take at least 2 seconds.");
1891 def->sidetext = L("mm³/s²");
1892 def->min = 0;
1893 def->mode = comExpert;
1894 def->set_default_value(new ConfigOptionFloat(0));
1895
1896 def = this->add("min_fan_speed", coInts);
1897 def->label = L("Min");
1898 def->tooltip = L("This setting represents the minimum PWM your fan needs to work.");
1899 def->sidetext = L("%");
1900 def->min = 0;
1901 def->max = 100;
1902 def->mode = comExpert;
1903 def->set_default_value(new ConfigOptionInts { 35 });
1904
1905 def = this->add("min_layer_height", coFloats);
1906 def->label = L("Min");
1907 def->tooltip = L("This is the lowest printable layer height for this extruder and limits "
1908 "the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm.");
1909 def->sidetext = L("mm");
1910 def->min = 0;
1911 def->mode = comAdvanced;
1912 def->set_default_value(new ConfigOptionFloats { 0.07 });
1913
1914 def = this->add("min_print_speed", coFloats);
1915 def->label = L("Min print speed");
1916 def->tooltip = L("Slic3r will not scale speed down below this speed.");
1917 def->sidetext = L("mm/s");
1918 def->min = 0;
1919 def->mode = comExpert;
1920 def->set_default_value(new ConfigOptionFloats { 10. });
1921
1922 def = this->add("min_skirt_length", coFloat);
1923 def->label = L("Minimal filament extrusion length");
1924 def->tooltip = L("Generate no less than the number of skirt loops required to consume "
1925 "the specified amount of filament on the bottom layer. For multi-extruder machines, "
1926 "this minimum applies to each extruder.");
1927 def->sidetext = L("mm");
1928 def->min = 0;
1929 def->mode = comExpert;
1930 def->set_default_value(new ConfigOptionFloat(0));
1931
1932 def = this->add("notes", coString);
1933 def->label = L("Configuration notes");
1934 def->tooltip = L("You can put here your personal notes. This text will be added to the G-code "
1935 "header comments.");
1936 def->multiline = true;
1937 def->full_width = true;
1938 def->height = 13;
1939 def->mode = comAdvanced;
1940 def->set_default_value(new ConfigOptionString(""));
1941
1942 def = this->add("nozzle_diameter", coFloats);
1943 def->label = L("Nozzle diameter");
1944 def->tooltip = L("This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)");
1945 def->sidetext = L("mm");
1946 def->set_default_value(new ConfigOptionFloats { 0.4 });
1947
1948 def = this->add("host_type", coEnum);
1949 def->label = L("Host Type");
1950 def->tooltip = L("Slic3r can upload G-code files to a printer host. This field must contain "
1951 "the kind of the host.");
1952 def->set_enum<PrintHostType>({
1953 { "prusalink", "PrusaLink" },
1954 { "prusaconnect", "PrusaConnect" },
1955 { "octoprint", "OctoPrint" },
1956 { "moonraker", "Klipper (via Moonraker)" },
1957 { "duet", "Duet" },
1958 { "flashair", "FlashAir" },
1959 { "astrobox", "AstroBox" },
1960 { "repetier", "Repetier" },
1961 { "mks", "MKS" }
1962 });
1963 def->mode = comAdvanced;
1964 def->cli = ConfigOptionDef::nocli;
1965 def->set_default_value(new ConfigOptionEnum<PrintHostType>(htPrusaLink));
1966
1967 def = this->add("only_retract_when_crossing_perimeters", coBool);
1968 def->label = L("Only retract when crossing perimeters");
1969 def->tooltip = L("Disables retraction when the travel path does not exceed the upper layer's perimeters "
1970 "(and thus any ooze will be probably invisible).");
1971 def->mode = comExpert;
1972 def->set_default_value(new ConfigOptionBool(false));
1973
1974 def = this->add("ooze_prevention", coBool);
1975 def->label = L("Enable");
1976 // TRN PrintSettings: Enable ooze prevention
1977 def->tooltip = L("This option will drop the temperature of the inactive extruders to prevent oozing.");
1978 def->mode = comExpert;
1979 def->set_default_value(new ConfigOptionBool(false));
1980
1981 def = this->add("output_filename_format", coString);
1982 def->label = L("Output filename format");
1983 def->tooltip = L("You can use all configuration options as variables inside this template. "
1984 "For example: [layer_height], [fill_density] etc. You can also use [timestamp], "
1985 "[year], [month], [day], [hour], [minute], [second], [version], [input_filename], "
1986 "[input_filename_base], [default_output_extension].");
1987 def->full_width = true;
1988 def->mode = comExpert;
1989 def->set_default_value(new ConfigOptionString("[input_filename_base].gcode"));
1990
1991 def = this->add("overhangs", coBool);
1992 def->label = L("Detect bridging perimeters");
1993 def->category = L("Layers and Perimeters");
1994 def->tooltip = L("Experimental option to adjust flow for overhangs (bridge flow will be used), "
1995 "to apply bridge speed to them and enable fan.");
1996 def->mode = comAdvanced;
1997 def->set_default_value(new ConfigOptionBool(true));
1998
1999 def = this->add("parking_pos_retraction", coFloat);
2000 def->label = L("Filament parking position");
2001 def->tooltip = L("Distance of the extruder tip from the position where the filament is parked "
2002 "when unloaded. This should match the value in printer firmware.");
2003 def->sidetext = L("mm");
2004 def->min = 0;
2005 def->mode = comAdvanced;
2006 def->set_default_value(new ConfigOptionFloat(92.));
2007
2008 def = this->add("extra_loading_move", coFloat);
2009 def->label = L("Extra loading distance");
2010 def->tooltip = L("When set to zero, the distance the filament is moved from parking position during load "
2011 "is exactly the same as it was moved back during unload. When positive, it is loaded further, "
2012 " if negative, the loading move is shorter than unloading.");
2013 def->sidetext = L("mm");
2014 def->mode = comAdvanced;
2015 def->set_default_value(new ConfigOptionFloat(-2.));
2016
2017 def = this->add("perimeter_acceleration", coFloat);
2018 def->label = L("Perimeters");
2019 def->tooltip = L("This is the acceleration your printer will use for perimeters. "
2020 "Set zero to disable acceleration control for perimeters.");
2021 def->sidetext = L("mm/s²");
2022 def->mode = comExpert;
2023 def->set_default_value(new ConfigOptionFloat(0));
2024
2025 def = this->add("external_perimeter_acceleration", coFloat);
2026 def->label = L("External perimeters");
2027 def->tooltip = L("This is the acceleration your printer will use for external perimeters. "
2028 "Set zero to use the value for perimeters.");
2029 def->sidetext = L("mm/s²");
2030 def->mode = comExpert;
2031 def->set_default_value(new ConfigOptionFloat(0));
2032
2033 def = this->add("perimeter_extruder", coInt);
2034 def->label = L("Perimeter extruder");
2035 def->category = L("Extruders");
2036 def->tooltip = L("The extruder to use when printing perimeters and brim. First extruder is 1.");
2037 def->aliases = { "perimeters_extruder" };
2038 def->min = 1;
2039 def->mode = comAdvanced;
2040 def->set_default_value(new ConfigOptionInt(1));
2041
2042 def = this->add("perimeter_extrusion_width", coFloatOrPercent);
2043 def->label = L("Perimeters");
2044 def->category = L("Extrusion Width");
2045 def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for perimeters. "
2046 "You may want to use thinner extrudates to get more accurate surfaces. "
2047 "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. "
2048 "If expressed as percentage (for example 200%) it will be computed over layer height.");
2049 def->sidetext = L("mm or %");
2050 def->aliases = { "perimeters_extrusion_width" };
2051 def->min = 0;
2052 def->max_literal = 50;
2053 def->mode = comAdvanced;
2054 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
2055
2056 def = this->add("perimeter_speed", coFloat);
2057 def->label = L("Perimeters");
2058 def->category = L("Speed");
2059 def->tooltip = L("Speed for perimeters (contours, aka vertical shells). Set to zero for auto.");
2060 def->sidetext = L("mm/s");
2061 def->aliases = { "perimeter_feed_rate" };
2062 def->min = 0;
2063 def->mode = comAdvanced;
2064 def->set_default_value(new ConfigOptionFloat(60));
2065
2066 def = this->add("perimeters", coInt);
2067 def->label = L("Perimeters");
2068 def->category = L("Layers and Perimeters");
2069 def->tooltip = L("This option sets the number of perimeters to generate for each layer. "
2070 "Note that Slic3r may increase this number automatically when it detects "
2071 "sloping surfaces which benefit from a higher number of perimeters "
2072 "if the Extra Perimeters option is enabled.");
2073 def->sidetext = L("(minimum)");
2074 def->aliases = { "perimeter_offsets" };
2075 def->min = 0;
2076 def->max = 10000;
2077 def->set_default_value(new ConfigOptionInt(3));
2078
2079 def = this->add("post_process", coStrings);
2080 def->label = L("Post-processing scripts");
2081 def->tooltip = L("If you want to process the output G-code through custom scripts, "
2082 "just list their absolute paths here. Separate multiple scripts with a semicolon. "
2083 "Scripts will be passed the absolute path to the G-code file as the first argument, "
2084 "and they can access the Slic3r config settings by reading environment variables.");
2085 def->gui_flags = "serialized";
2086 def->multiline = true;
2087 def->full_width = true;
2088 def->height = 6;
2089 def->mode = comExpert;
2090 def->set_default_value(new ConfigOptionStrings());
2091
2092 def = this->add("printer_model", coString);
2093 def->label = L("Printer type");
2094 def->tooltip = L("Type of the printer.");
2095 def->set_default_value(new ConfigOptionString());
2096 def->cli = ConfigOptionDef::nocli;
2097
2098 def = this->add("printer_notes", coString);
2099 def->label = L("Printer notes");
2100 def->tooltip = L("You can put your notes regarding the printer here.");
2101 def->multiline = true;
2102 def->full_width = true;
2103 def->height = 13;
2104 def->mode = comAdvanced;
2105 def->set_default_value(new ConfigOptionString(""));
2106
2107 def = this->add("printer_vendor", coString);
2108 def->label = L("Printer vendor");
2109 def->tooltip = L("Name of the printer vendor.");
2110 def->set_default_value(new ConfigOptionString());
2111 def->cli = ConfigOptionDef::nocli;
2112
2113 def = this->add("printer_variant", coString);
2114 def->label = L("Printer variant");
2115 def->tooltip = L("Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter.");
2116 def->set_default_value(new ConfigOptionString());
2117 def->cli = ConfigOptionDef::nocli;
2118
2119 def = this->add("print_settings_id", coString);
2120 def->set_default_value(new ConfigOptionString(""));
2121 def->cli = ConfigOptionDef::nocli;
2122
2123 def = this->add("printer_settings_id", coString);
2124 def->set_default_value(new ConfigOptionString(""));
2125 def->cli = ConfigOptionDef::nocli;
2126
2127 def = this->add("physical_printer_settings_id", coString);
2128 def->set_default_value(new ConfigOptionString(""));
2129 def->cli = ConfigOptionDef::nocli;
2130
2131 def = this->add("raft_contact_distance", coFloat);
2132 def->label = L("Raft contact Z distance");
2133 def->category = L("Support material");
2134 def->tooltip = L("The vertical distance between object and raft. Ignored for soluble interface.");
2135 def->sidetext = L("mm");
2136 def->min = 0;
2137 def->mode = comAdvanced;
2138 def->set_default_value(new ConfigOptionFloat(0.1));
2139
2140 def = this->add("raft_expansion", coFloat);
2141 def->label = L("Raft expansion");
2142 def->category = L("Support material");
2143 def->tooltip = L("Expansion of the raft in XY plane for better stability.");
2144 def->sidetext = L("mm");
2145 def->min = 0;
2146 def->mode = comExpert;
2147 def->set_default_value(new ConfigOptionFloat(1.5));
2148
2149 def = this->add("raft_first_layer_density", coPercent);
2150 def->label = L("First layer density");
2151 def->category = L("Support material");
2152 def->tooltip = L("Density of the first raft or support layer.");
2153 def->sidetext = L("%");
2154 def->min = 10;
2155 def->max = 100;
2156 def->mode = comExpert;
2157 def->set_default_value(new ConfigOptionPercent(90));
2158
2159 def = this->add("raft_first_layer_expansion", coFloat);
2160 def->label = L("First layer expansion");
2161 def->category = L("Support material");
2162 def->tooltip = L("Expansion of the first raft or support layer to improve adhesion to print bed.");
2163 def->sidetext = L("mm");
2164 def->min = 0;
2165 def->mode = comExpert;
2166 def->set_default_value(new ConfigOptionFloat(3.));
2167
2168 def = this->add("raft_layers", coInt);
2169 def->label = L("Raft layers");
2170 def->category = L("Support material");
2171 def->tooltip = L("The object will be raised by this number of layers, and support material "
2172 "will be generated under it.");
2173 def->sidetext = L("layers");
2174 def->min = 0;
2175 def->mode = comAdvanced;
2176 def->set_default_value(new ConfigOptionInt(0));
2177
2178 def = this->add("resolution", coFloat);
2179 def->label = L("Slice resolution");
2180 def->tooltip = L("Minimum detail resolution, used to simplify the input file for speeding up "
2181 "the slicing job and reducing memory usage. High-resolution models often carry "
2182 "more detail than printers can render. Set to zero to disable any simplification "
2183 "and use full resolution from input.");
2184 def->sidetext = L("mm");
2185 def->min = 0;
2186 def->mode = comExpert;
2187 def->set_default_value(new ConfigOptionFloat(0));
2188
2189 def = this->add("gcode_resolution", coFloat);
2190 def->label = L("G-code resolution");
2191 def->tooltip = L("Maximum deviation of exported G-code paths from their full resolution counterparts. "
2192 "Very high resolution G-code requires huge amount of RAM to slice and preview, "
2193 "also a 3D printer may stutter not being able to process a high resolution G-code in a timely manner. "
2194 "On the other hand, a low resolution G-code will produce a low poly effect and because "
2195 "the G-code reduction is performed at each layer independently, visible artifacts may be produced.");
2196 def->sidetext = L("mm");
2197 def->min = 0;
2198 def->mode = comExpert;
2199 def->set_default_value(new ConfigOptionFloat(0.0125));
2200
2201 def = this->add("retract_before_travel", coFloats);
2202 def->label = L("Minimum travel after retraction");
2203 def->tooltip = L("Retraction is not triggered when travel moves are shorter than this length.");
2204 def->sidetext = L("mm");
2205 def->mode = comAdvanced;
2206 def->set_default_value(new ConfigOptionFloats { 2. });
2207
2208 def = this->add("retract_before_wipe", coPercents);
2209 def->label = L("Retract amount before wipe");
2210 def->tooltip = L("With bowden extruders, it may be wise to do some amount of quick retract "
2211 "before doing the wipe movement.");
2212 def->sidetext = L("%");
2213 def->mode = comAdvanced;
2214 def->set_default_value(new ConfigOptionPercents { 0. });
2215
2216 def = this->add("retract_layer_change", coBools);
2217 def->label = L("Retract on layer change");
2218 def->tooltip = L("This flag enforces a retraction whenever a Z move is done.");
2219 def->mode = comAdvanced;
2220 def->set_default_value(new ConfigOptionBools { false });
2221
2222 def = this->add("retract_length", coFloats);
2223 def->label = L("Length");
2224 def->full_label = L("Retraction Length");
2225 def->tooltip = L("When retraction is triggered, filament is pulled back by the specified amount "
2226 "(the length is measured on raw filament, before it enters the extruder).");
2227 def->sidetext = L("mm (zero to disable)");
2228 def->set_default_value(new ConfigOptionFloats { 2. });
2229
2230 def = this->add("retract_length_toolchange", coFloats);
2231 def->label = L("Length");
2232 def->full_label = L("Retraction Length (Toolchange)");
2233 def->tooltip = L("When retraction is triggered before changing tool, filament is pulled back "
2234 "by the specified amount (the length is measured on raw filament, before it enters "
2235 "the extruder).");
2236 def->sidetext = L("mm (zero to disable)");
2237 def->mode = comExpert;
2238 def->set_default_value(new ConfigOptionFloats { 10. });
2239
2240 def = this->add("retract_lift", coFloats);
2241 def->label = L("Lift Z");
2242 def->tooltip = L("If you set this to a positive value, Z is quickly raised every time a retraction "
2243 "is triggered. When using multiple extruders, only the setting for the first extruder "
2244 "will be considered.");
2245 def->sidetext = L("mm");
2246 def->set_default_value(new ConfigOptionFloats { 0. });
2247
2248 def = this->add("retract_lift_above", coFloats);
2249 def->label = L("Above Z");
2250 def->full_label = L("Only lift Z above");
2251 def->tooltip = L("If you set this to a positive value, Z lift will only take place above the specified "
2252 "absolute Z. You can tune this setting for skipping lift on the first layers.");
2253 def->sidetext = L("mm");
2254 def->mode = comAdvanced;
2255 def->set_default_value(new ConfigOptionFloats { 0. });
2256
2257 def = this->add("retract_lift_below", coFloats);
2258 def->label = L("Below Z");
2259 def->full_label = L("Only lift Z below");
2260 def->tooltip = L("If you set this to a positive value, Z lift will only take place below "
2261 "the specified absolute Z. You can tune this setting for limiting lift "
2262 "to the first layers.");
2263 def->sidetext = L("mm");
2264 def->mode = comAdvanced;
2265 def->set_default_value(new ConfigOptionFloats { 0. });
2266
2267 def = this->add("retract_restart_extra", coFloats);
2268 def->label = L("Extra length on restart");
2269 def->tooltip = L("When the retraction is compensated after the travel move, the extruder will push "
2270 "this additional amount of filament. This setting is rarely needed.");
2271 def->sidetext = L("mm");
2272 def->mode = comAdvanced;
2273 def->set_default_value(new ConfigOptionFloats { 0. });
2274
2275 def = this->add("retract_restart_extra_toolchange", coFloats);
2276 def->label = L("Extra length on restart");
2277 def->tooltip = L("When the retraction is compensated after changing tool, the extruder will push "
2278 "this additional amount of filament.");
2279 def->sidetext = L("mm");
2280 def->mode = comExpert;
2281 def->set_default_value(new ConfigOptionFloats { 0. });
2282
2283 def = this->add("retract_speed", coFloats);
2284 def->label = L("Retraction Speed");
2285 def->full_label = L("Retraction Speed");
2286 def->tooltip = L("The speed for retractions (it only applies to the extruder motor).");
2287 def->sidetext = L("mm/s");
2288 def->mode = comAdvanced;
2289 def->set_default_value(new ConfigOptionFloats { 40. });
2290
2291 def = this->add("deretract_speed", coFloats);
2292 def->label = L("Deretraction Speed");
2293 def->full_label = L("Deretraction Speed");
2294 def->tooltip = L("The speed for loading of a filament into extruder after retraction "
2295 "(it only applies to the extruder motor). If left to zero, the retraction speed is used.");
2296 def->sidetext = L("mm/s");
2297 def->mode = comAdvanced;
2298 def->set_default_value(new ConfigOptionFloats { 0. });
2299
2300 def = this->add("seam_position", coEnum);
2301 def->label = L("Seam position");
2302 def->category = L("Layers and Perimeters");
2303 def->tooltip = L("Position of perimeters starting points.");
2304 def->set_enum<SeamPosition>({
2305 { "random", L("Random") },
2306 { "nearest", L("Nearest") },
2307 { "aligned", L("Aligned") },
2308 { "rear", L("Rear") }
2309 });
2310 def->mode = comSimple;
2311 def->set_default_value(new ConfigOptionEnum<SeamPosition>(spAligned));
2312
2313 def = this->add("staggered_inner_seams", coBool);
2314 def->label = L("Staggered inner seams");
2315 // TRN PrintSettings: "Staggered inner seams"
2316 def->tooltip = L("This option causes the inner seams to be shifted backwards based on their depth, forming a zigzag pattern.");
2317 def->mode = comAdvanced;
2318 def->set_default_value(new ConfigOptionBool(false));
2319
2320#if 0
2321 def = this->add("seam_preferred_direction", coFloat);
2322// def->gui_type = ConfigOptionDef::GUIType::slider;
2323 def->label = L("Direction");
2324 def->sidetext = L("°");
2325 def->full_label = L("Preferred direction of the seam");
2326 def->tooltip = L("Seam preferred direction");
2327 def->min = 0;
2328 def->max = 360;
2329 def->set_default_value(new ConfigOptionFloat(0));
2330
2331 def = this->add("seam_preferred_direction_jitter", coFloat);
2332// def->gui_type = ConfigOptionDef::GUIType::slider;
2333 def->label = L("Jitter");
2334 def->sidetext = L("°");
2335 def->full_label = L("Seam preferred direction jitter");
2336 def->tooltip = L("Preferred direction of the seam - jitter");
2337 def->min = 0;
2338 def->max = 360;
2339 def->set_default_value(new ConfigOptionFloat(30));
2340#endif
2341
2342 def = this->add("skirt_distance", coFloat);
2343 def->label = L("Distance from brim/object");
2344 def->tooltip = L("Distance between skirt and brim (when draft shield is not used) or objects.");
2345 def->sidetext = L("mm");
2346 def->min = 0;
2347 def->set_default_value(new ConfigOptionFloat(6));
2348
2349 def = this->add("skirt_height", coInt);
2350 def->label = L("Skirt height");
2351 def->tooltip = L("Height of skirt expressed in layers.");
2352 def->sidetext = L("layers");
2353 def->mode = comAdvanced;
2354 def->set_default_value(new ConfigOptionInt(1));
2355
2356 def = this->add("draft_shield", coEnum);
2357 def->label = L("Draft shield");
2358 def->tooltip = L("With draft shield active, the skirt will be printed skirt_distance from the object, possibly intersecting brim.\n"
2359 "Enabled = skirt is as tall as the highest printed object.\n"
2360 "Limited = skirt is as tall as specified by skirt_height.\n"
2361 "This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft.");
2362 def->set_enum<DraftShield>({
2363 { "disabled", L("Disabled") },
2364 { "limited", L("Limited") },
2365 { "enabled", L("Enabled") }
2366 });
2367 def->mode = comAdvanced;
2368 def->set_default_value(new ConfigOptionEnum<DraftShield>(dsDisabled));
2369
2370 def = this->add("skirts", coInt);
2371 def->label = L("Loops (minimum)");
2372 def->full_label = L("Skirt Loops");
2373 def->tooltip = L("Number of loops for the skirt. If the Minimum Extrusion Length option is set, "
2374 "the number of loops might be greater than the one configured here. Set this to zero "
2375 "to disable skirt completely.");
2376 def->min = 0;
2377 def->mode = comAdvanced;
2378 def->set_default_value(new ConfigOptionInt(1));
2379
2380 def = this->add("slowdown_below_layer_time", coInts);
2381 def->label = L("Slow down if layer print time is below");
2382 def->tooltip = L("If layer print time is estimated below this number of seconds, print moves "
2383 "speed will be scaled down to extend duration to this value.");
2384 def->sidetext = L("approximate seconds");
2385 def->min = 0;
2386 def->max = 1000;
2387 def->mode = comExpert;
2388 def->set_default_value(new ConfigOptionInts { 5 });
2389
2390 def = this->add("small_perimeter_speed", coFloatOrPercent);
2391 def->label = L("Small perimeters");
2392 def->category = L("Speed");
2393 def->tooltip = L("This separate setting will affect the speed of perimeters having radius <= 6.5mm "
2394 "(usually holes). If expressed as percentage (for example: 80%) it will be calculated "
2395 "on the perimeters speed setting above. Set to zero for auto.");
2396 def->sidetext = L("mm/s or %");
2397 def->ratio_over = "perimeter_speed";
2398 def->min = 0;
2399 def->mode = comAdvanced;
2400 def->set_default_value(new ConfigOptionFloatOrPercent(15, false));
2401
2402 def = this->add("solid_infill_below_area", coFloat);
2403 def->label = L("Solid infill threshold area");
2404 def->category = L("Infill");
2405 def->tooltip = L("Force solid infill for regions having a smaller area than the specified threshold.");
2406 def->sidetext = L("mm²");
2407 def->min = 0;
2408 def->mode = comExpert;
2409 def->set_default_value(new ConfigOptionFloat(70));
2410
2411 def = this->add("solid_infill_extruder", coInt);
2412 def->label = L("Solid infill extruder");
2413 def->category = L("Extruders");
2414 def->tooltip = L("The extruder to use when printing solid infill.");
2415 def->min = 1;
2416 def->mode = comAdvanced;
2417 def->set_default_value(new ConfigOptionInt(1));
2418
2419 def = this->add("solid_infill_every_layers", coInt);
2420 def->label = L("Solid infill every");
2421 def->category = L("Infill");
2422 def->tooltip = L("This feature allows to force a solid layer every given number of layers. "
2423 "Zero to disable. You can set this to any value (for example 9999); "
2424 "Slic3r will automatically choose the maximum possible number of layers "
2425 "to combine according to nozzle diameter and layer height.");
2426 def->sidetext = L("layers");
2427 def->min = 0;
2428 def->mode = comExpert;
2429 def->set_default_value(new ConfigOptionInt(0));
2430
2431 def = this->add("solid_infill_extrusion_width", coFloatOrPercent);
2432 def->label = L("Solid infill");
2433 def->category = L("Extrusion Width");
2434 def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. "
2435 "If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. "
2436 "If expressed as percentage (for example 90%) it will be computed over layer height.");
2437 def->sidetext = L("mm or %");
2438 def->min = 0;
2439 def->max_literal = 50;
2440 def->mode = comAdvanced;
2441 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
2442
2443 def = this->add("solid_infill_speed", coFloatOrPercent);
2444 def->label = L("Solid infill");
2445 def->category = L("Speed");
2446 def->tooltip = L("Speed for printing solid regions (top/bottom/internal horizontal shells). "
2447 "This can be expressed as a percentage (for example: 80%) over the default "
2448 "infill speed above. Set to zero for auto.");
2449 def->sidetext = L("mm/s or %");
2450 def->ratio_over = "infill_speed";
2451 def->aliases = { "solid_infill_feed_rate" };
2452 def->min = 0;
2453 def->mode = comAdvanced;
2454 def->set_default_value(new ConfigOptionFloatOrPercent(20, false));
2455
2456 def = this->add("solid_layers", coInt);
2457 def->label = L("Solid layers");
2458 def->tooltip = L("Number of solid layers to generate on top and bottom surfaces.");
2459 def->shortcut.push_back("top_solid_layers");
2460 def->shortcut.push_back("bottom_solid_layers");
2461 def->min = 0;
2462
2463 def = this->add("solid_min_thickness", coFloat);
2464 def->label = L("Minimum thickness of a top / bottom shell");
2465 def->tooltip = L("Minimum thickness of a top / bottom shell");
2466 def->shortcut.push_back("top_solid_min_thickness");
2467 def->shortcut.push_back("bottom_solid_min_thickness");
2468 def->min = 0;
2469
2470 def = this->add("spiral_vase", coBool);
2471 def->label = L("Spiral vase");
2472 def->tooltip = L("This feature will raise Z gradually while printing a single-walled object "
2473 "in order to remove any visible seam. This option requires a single perimeter, "
2474 "no infill, no top solid layers and no support material. You can still set "
2475 "any number of bottom solid layers as well as skirt/brim loops. "
2476 "It won't work when printing more than one single object.");
2477 def->set_default_value(new ConfigOptionBool(false));
2478
2479 def = this->add("standby_temperature_delta", coInt);
2480 def->label = L("Temperature variation");
2481 // TRN PrintSettings : "Ooze prevention" > "Temperature variation"
2482 def->tooltip = L("Temperature difference to be applied when an extruder is not active. "
2483 "The value is not used when 'idle_temperature' in filament settings "
2484 "is defined.");
2485 def->sidetext = "∆°C";
2486 def->min = -max_temp;
2487 def->max = max_temp;
2488 def->mode = comExpert;
2489 def->set_default_value(new ConfigOptionInt(-5));
2490
2491 def = this->add("autoemit_temperature_commands", coBool);
2492 def->label = L("Emit temperature commands automatically");
2493 def->tooltip = L("When enabled, PrusaSlicer will check whether your Custom Start G-Code contains M104 or M190. "
2494 "If so, the temperatures will not be emitted automatically so you're free to customize "
2495 "the order of heating commands and other custom actions. Note that you can use "
2496 "placeholder variables for all PrusaSlicer settings, so you can put "
2497 "a \"M109 S[first_layer_temperature]\" command wherever you want.\n"
2498 "If your Custom Start G-Code does NOT contain M104 or M190, "
2499 "PrusaSlicer will execute the Start G-Code after bed reached its target temperature "
2500 "and extruder just started heating.\n\n"
2501 "When disabled, PrusaSlicer will NOT emit commands to heat up extruder and bed, "
2502 "leaving both to Custom Start G-Code.");
2503 def->mode = comExpert;
2504 def->set_default_value(new ConfigOptionBool(true));
2505
2506 def = this->add("start_gcode", coString);
2507 def->label = L("Start G-code");
2508 def->tooltip = L("This start procedure is inserted at the beginning, possibly prepended by "
2509 "temperature-changing commands. See 'autoemit_temperature_commands'.");
2510 def->multiline = true;
2511 def->full_width = true;
2512 def->height = 12;
2513 def->mode = comExpert;
2514 def->set_default_value(new ConfigOptionString("G28 ; home all axes\nG1 Z5 F5000 ; lift nozzle\n"));
2515
2516 def = this->add("start_filament_gcode", coStrings);
2517 def->label = L("Start G-code");
2518 def->tooltip = L("This start procedure is inserted at the beginning, after any printer start gcode (and "
2519 "after any toolchange to this filament in case of multi-material printers). "
2520 "This is used to override settings for a specific filament. If PrusaSlicer detects "
2521 "M104, M109, M140 or M190 in your custom codes, such commands will "
2522 "not be prepended automatically so you're free to customize the order "
2523 "of heating commands and other custom actions. Note that you can use placeholder variables "
2524 "for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command "
2525 "wherever you want. If you have multiple extruders, the gcode is processed "
2526 "in extruder order.");
2527 def->multiline = true;
2528 def->full_width = true;
2529 def->height = 12;
2530 def->mode = comExpert;
2531 def->set_default_value(new ConfigOptionStrings { "; Filament gcode\n" });
2532
2533 def = this->add("color_change_gcode", coString);
2534 def->label = L("Color change G-code");
2535 def->tooltip = L("This G-code will be used as a code for the color change");
2536 def->multiline = true;
2537 def->full_width = true;
2538 def->height = 12;
2539 def->mode = comExpert;
2540 def->set_default_value(new ConfigOptionString("M600"));
2541
2542 def = this->add("pause_print_gcode", coString);
2543 def->label = L("Pause Print G-code");
2544 def->tooltip = L("This G-code will be used as a code for the pause print");
2545 def->multiline = true;
2546 def->full_width = true;
2547 def->height = 12;
2548 def->mode = comExpert;
2549 def->set_default_value(new ConfigOptionString("M601"));
2550
2551 def = this->add("template_custom_gcode", coString);
2552 def->label = L("Custom G-code");
2553 def->tooltip = L("This G-code will be used as a custom code");
2554 def->multiline = true;
2555 def->full_width = true;
2556 def->height = 12;
2557 def->mode = comExpert;
2558 def->set_default_value(new ConfigOptionString(""));
2559
2560 def = this->add("single_extruder_multi_material", coBool);
2561 def->label = L("Single Extruder Multi Material");
2562 def->tooltip = L("The printer multiplexes filaments into a single hot end.");
2563 def->mode = comExpert;
2564 def->set_default_value(new ConfigOptionBool(false));
2565
2566 def = this->add("single_extruder_multi_material_priming", coBool);
2567 def->label = L("Prime all printing extruders");
2568 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.");
2569 def->mode = comAdvanced;
2570 def->set_default_value(new ConfigOptionBool(true));
2571
2572 def = this->add("wipe_tower_no_sparse_layers", coBool);
2573 def->label = L("No sparse layers (EXPERIMENTAL)");
2574 def->tooltip = L("If enabled, the wipe tower will not be printed on layers with no toolchanges. "
2575 "On layers with a toolchange, extruder will travel downward to print the wipe tower. "
2576 "User is responsible for ensuring there is no collision with the print.");
2577 def->mode = comAdvanced;
2578 def->set_default_value(new ConfigOptionBool(false));
2579
2580 def = this->add("slice_closing_radius", coFloat);
2581 def->label = L("Slice gap closing radius");
2582 def->category = L("Advanced");
2583 def->tooltip = L("Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. "
2584 "The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low.");
2585 def->sidetext = L("mm");
2586 def->min = 0;
2587 def->mode = comAdvanced;
2588 def->set_default_value(new ConfigOptionFloat(0.049));
2589
2590 def = this->add("slicing_mode", coEnum);
2591 def->label = L("Slicing Mode");
2592 def->category = L("Advanced");
2593 def->tooltip = L("Use \"Even-odd\" for 3DLabPrint airplane models. Use \"Close holes\" to close all holes in the model.");
2594 def->set_enum<SlicingMode>({
2595 { "regular", L("Regular") },
2596 { "even_odd", L("Even-odd") },
2597 { "close_holes", L("Close holes") }
2598 });
2599 def->mode = comAdvanced;
2600 def->set_default_value(new ConfigOptionEnum<SlicingMode>(SlicingMode::Regular));
2601
2602 def = this->add("support_material", coBool);
2603 def->label = L("Generate support material");
2604 def->category = L("Support material");
2605 def->tooltip = L("Enable support material generation.");
2606 def->set_default_value(new ConfigOptionBool(false));
2607
2608 def = this->add("support_material_auto", coBool);
2609 def->label = L("Auto generated supports");
2610 def->category = L("Support material");
2611 def->tooltip = L("If checked, supports will be generated automatically based on the overhang threshold value."\
2612 " If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only.");
2613 def->mode = comSimple;
2614 def->set_default_value(new ConfigOptionBool(true));
2615
2616 def = this->add("support_material_xy_spacing", coFloatOrPercent);
2617 def->label = L("XY separation between an object and its support");
2618 def->category = L("Support material");
2619 def->tooltip = L("XY separation between an object and its support. If expressed as percentage "
2620 "(for example 50%), it will be calculated over external perimeter width.");
2621 def->sidetext = L("mm or %");
2622 def->ratio_over = "external_perimeter_extrusion_width";
2623 def->min = 0;
2624 def->max_literal = 10;
2625 def->mode = comAdvanced;
2626 // Default is half the external perimeter width.
2627 def->set_default_value(new ConfigOptionFloatOrPercent(50, true));
2628
2629 def = this->add("support_material_angle", coFloat);
2630 def->label = L("Pattern angle");
2631 def->category = L("Support material");
2632 def->tooltip = L("Use this setting to rotate the support material pattern on the horizontal plane.");
2633 def->sidetext = L("°");
2634 def->min = 0;
2635 def->max = 359;
2636 def->mode = comExpert;
2637 def->set_default_value(new ConfigOptionFloat(0));
2638
2639 def = this->add("support_material_buildplate_only", coBool);
2640 def->label = L("Support on build plate only");
2641 def->category = L("Support material");
2642 def->tooltip = L("Only create support if it lies on a build plate. Don't create support on a print.");
2643 def->mode = comSimple;
2644 def->set_default_value(new ConfigOptionBool(false));
2645
2646 def = this->add("support_material_contact_distance", coFloat);
2647 def->label = L("Top contact Z distance");
2648 def->category = L("Support material");
2649 def->tooltip = L("The vertical distance between object and support material interface. "
2650 "Setting this to 0 will also prevent Slic3r from using bridge flow and speed "
2651 "for the first object layer.");
2652 def->sidetext = L("mm");
2653// def->min = 0;
2654 def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, {
2655 { "0", L("0 (soluble)") },
2656 { "0.1", L("0.1 (detachable)") },
2657 { "0.2", L("0.2 (detachable)") }
2658 });
2659 def->mode = comAdvanced;
2660 def->set_default_value(new ConfigOptionFloat(0.2));
2661
2662 def = this->add("support_material_bottom_contact_distance", coFloat);
2663 def->label = L("Bottom contact Z distance");
2664 def->category = L("Support material");
2665 def->tooltip = L("The vertical distance between the object top surface and the support material interface. "
2666 "If set to zero, support_material_contact_distance will be used for both top and bottom contact Z distances.");
2667 def->sidetext = L("mm");
2668// def->min = 0;
2669 def->set_enum_values(ConfigOptionDef::GUIType::f_enum_open, {
2670 //TRN Print Settings: "Bottom contact Z distance". Have to be as short as possible
2671 { "0", L("Same as top") },
2672 { "0.1", "0.1" },
2673 { "0.2", "0.2" }
2674 });
2675 def->mode = comAdvanced;
2676 def->set_default_value(new ConfigOptionFloat(0));
2677
2678 def = this->add("support_material_enforce_layers", coInt);
2679 def->label = L("Enforce support for the first");
2680 def->category = L("Support material");
2681 def->tooltip = L("Generate support material for the specified number of layers counting from bottom, "
2682 "regardless of whether normal support material is enabled or not and regardless "
2683 "of any angle threshold. This is useful for getting more adhesion of objects "
2684 "having a very thin or poor footprint on the build plate.");
2685 def->sidetext = L("layers");
2686 def->full_label = L("Enforce support for the first n layers");
2687 def->min = 0;
2688 def->mode = comExpert;
2689 def->set_default_value(new ConfigOptionInt(0));
2690
2691 def = this->add("support_material_extruder", coInt);
2692 def->label = L("Support material/raft/skirt extruder");
2693 def->category = L("Extruders");
2694 def->tooltip = L("The extruder to use when printing support material, raft and skirt "
2695 "(1+, 0 to use the current extruder to minimize tool changes).");
2696 def->min = 0;
2697 def->mode = comAdvanced;
2698 def->set_default_value(new ConfigOptionInt(1));
2699
2700 def = this->add("support_material_extrusion_width", coFloatOrPercent);
2701 def->label = L("Support material");
2702 def->category = L("Extrusion Width");
2703 def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for support material. "
2704 "If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. "
2705 "If expressed as percentage (for example 90%) it will be computed over layer height.");
2706 def->sidetext = L("mm or %");
2707 def->min = 0;
2708 def->max_literal = 50;
2709 def->mode = comAdvanced;
2710 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
2711
2712 def = this->add("support_material_interface_contact_loops", coBool);
2713 def->label = L("Interface loops");
2714 def->category = L("Support material");
2715 def->tooltip = L("Cover the top contact layer of the supports with loops. Disabled by default.");
2716 def->mode = comExpert;
2717 def->set_default_value(new ConfigOptionBool(false));
2718
2719 def = this->add("support_material_interface_extruder", coInt);
2720 def->label = L("Support material/raft interface extruder");
2721 def->category = L("Extruders");
2722 def->tooltip = L("The extruder to use when printing support material interface "
2723 "(1+, 0 to use the current extruder to minimize tool changes). This affects raft too.");
2724 def->min = 0;
2725 def->mode = comAdvanced;
2726 def->set_default_value(new ConfigOptionInt(1));
2727
2728 def = this->add("support_material_interface_layers", coInt);
2729 def->label = L("Top interface layers");
2730 def->category = L("Support material");
2731 def->tooltip = L("Number of interface layers to insert between the object(s) and support material.");
2732 def->sidetext = L("layers");
2733 def->min = 0;
2734 def->set_enum_values(ConfigOptionDef::GUIType::i_enum_open, {
2735 { "0", L("0 (off)") },
2736 { "1", L("1 (light)") },
2737 { "2", L("2 (default)") },
2738 { "3", L("3 (heavy)") }
2739 });
2740 def->mode = comAdvanced;
2741 def->set_default_value(new ConfigOptionInt(3));
2742
2743 def = this->add("support_material_bottom_interface_layers", coInt);
2744 def->label = L("Bottom interface layers");
2745 def->category = L("Support material");
2746 def->tooltip = L("Number of interface layers to insert between the object(s) and support material. "
2747 "Set to -1 to use support_material_interface_layers");
2748 def->sidetext = L("layers");
2749 def->min = -1;
2750 def->set_enum_values(ConfigOptionDef::GUIType::i_enum_open, {
2751 //TRN Print Settings: "Bottom interface layers". Have to be as short as possible
2752 { "-1", L("Same as top") },
2753 { "0", L("0 (off)") },
2754 { "1", L("1 (light)") },
2755 { "2", L("2 (default)") },
2756 { "3", L("3 (heavy)") }
2757 });
2758 def->mode = comAdvanced;
2759 def->set_default_value(new ConfigOptionInt(-1));
2760
2761 def = this->add("support_material_closing_radius", coFloat);
2762 def->label = L("Closing radius");
2763 def->category = L("Support material");
2764 def->tooltip = L("For snug supports, the support regions will be merged using morphological closing operation."
2765 " Gaps smaller than the closing radius will be filled in.");
2766 def->sidetext = L("mm");
2767 def->min = 0;
2768 def->mode = comAdvanced;
2769 def->set_default_value(new ConfigOptionFloat(2));
2770
2771 def = this->add("support_material_interface_spacing", coFloat);
2772 def->label = L("Interface pattern spacing");
2773 def->category = L("Support material");
2774 def->tooltip = L("Spacing between interface lines. Set zero to get a solid interface.");
2775 def->sidetext = L("mm");
2776 def->min = 0;
2777 def->mode = comAdvanced;
2778 def->set_default_value(new ConfigOptionFloat(0));
2779
2780 def = this->add("support_material_interface_speed", coFloatOrPercent);
2781 def->label = L("Support material interface");
2782 def->category = L("Support material");
2783 def->tooltip = L("Speed for printing support material interface layers. If expressed as percentage "
2784 "(for example 50%) it will be calculated over support material speed.");
2785 def->sidetext = L("mm/s or %");
2786 def->ratio_over = "support_material_speed";
2787 def->min = 0;
2788 def->mode = comAdvanced;
2789 def->set_default_value(new ConfigOptionFloatOrPercent(100, true));
2790
2791 def = this->add("support_material_pattern", coEnum);
2792 def->label = L("Pattern");
2793 def->category = L("Support material");
2794 def->tooltip = L("Pattern used to generate support material.");
2795 def->set_enum<SupportMaterialPattern>({
2796 { "rectilinear", L("Rectilinear") },
2797 { "rectilinear-grid", L("Rectilinear grid") },
2798 { "honeycomb", L("Honeycomb") }
2799 });
2800 def->mode = comAdvanced;
2801 def->set_default_value(new ConfigOptionEnum<SupportMaterialPattern>(smpRectilinear));
2802
2803 def = this->add("support_material_interface_pattern", coEnum);
2804 def->label = L("Interface pattern");
2805 def->category = L("Support material");
2806 def->tooltip = L("Pattern used to generate support material interface. "
2807 "Default pattern for non-soluble support interface is Rectilinear, "
2808 "while default pattern for soluble support interface is Concentric.");
2809 def->set_enum<SupportMaterialInterfacePattern>({
2810 { "auto", L("Default") },
2811 { "rectilinear", L("Rectilinear") },
2812 { "concentric", L("Concentric") }
2813 });
2814 def->mode = comAdvanced;
2815 def->set_default_value(new ConfigOptionEnum<SupportMaterialInterfacePattern>(smipRectilinear));
2816
2817 def = this->add("support_material_spacing", coFloat);
2818 def->label = L("Pattern spacing");
2819 def->category = L("Support material");
2820 def->tooltip = L("Spacing between support material lines.");
2821 def->sidetext = L("mm");
2822 def->min = 0;
2823 def->mode = comAdvanced;
2824 def->set_default_value(new ConfigOptionFloat(2.5));
2825
2826 def = this->add("support_material_speed", coFloat);
2827 def->label = L("Support material");
2828 def->category = L("Support material");
2829 def->tooltip = L("Speed for printing support material.");
2830 def->sidetext = L("mm/s");
2831 def->min = 0;
2832 def->mode = comAdvanced;
2833 def->set_default_value(new ConfigOptionFloat(60));
2834
2835 def = this->add("support_material_style", coEnum);
2836 def->label = L("Style");
2837 def->category = L("Support material");
2838 def->tooltip = L("Style and shape of the support towers. Projecting the supports into a regular grid "
2839 "will create more stable supports, while snug support towers will save material and reduce "
2840 "object scarring.");
2841 def->set_enum<SupportMaterialStyle>({
2842 { "grid", L("Grid") },
2843 { "snug", L("Snug") },
2844 { "organic", L("Organic") }
2845 });
2846 def->mode = comAdvanced;
2847 def->set_default_value(new ConfigOptionEnum<SupportMaterialStyle>(smsGrid));
2848
2849 def = this->add("support_material_synchronize_layers", coBool);
2850 def->label = L("Synchronize with object layers");
2851 def->category = L("Support material");
2852 // TRN PrintSettings : "Synchronize with object layers"
2853 def->tooltip = L("Synchronize support layers with the object print layers. This is useful "
2854 "with multi-material printers, where the extruder switch is expensive. "
2855 "This option is only available when top contact Z distance is set to zero.");
2856 def->mode = comExpert;
2857 def->set_default_value(new ConfigOptionBool(false));
2858
2859 def = this->add("support_material_threshold", coInt);
2860 def->label = L("Overhang threshold");
2861 def->category = L("Support material");
2862 def->tooltip = L("Support material will not be generated for overhangs whose slope angle "
2863 "(90° = vertical) is above the given threshold. In other words, this value "
2864 "represent the most horizontal slope (measured from the horizontal plane) "
2865 "that you can print without support material. Set to zero for automatic detection "
2866 "(recommended).");
2867 def->sidetext = L("°");
2868 def->min = 0;
2869 def->max = 90;
2870 def->mode = comAdvanced;
2871 def->set_default_value(new ConfigOptionInt(0));
2872
2873 def = this->add("support_material_with_sheath", coBool);
2874 def->label = L("With sheath around the support");
2875 def->category = L("Support material");
2876 def->tooltip = L("Add a sheath (a single perimeter line) around the base support. This makes "
2877 "the support more reliable, but also more difficult to remove.");
2878 def->mode = comExpert;
2879 def->set_default_value(new ConfigOptionBool(true));
2880
2881 def = this->add("support_tree_angle", coFloat);
2882 def->label = L("Maximum Branch Angle");
2883 def->category = L("Support material");
2884 // TRN PrintSettings: "Organic supports" > "Maximum Branch Angle"
2885 def->tooltip = L("The maximum angle of the branches, when the branches have to avoid the model. "
2886 "Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach.");
2887 def->sidetext = L("°");
2888 def->min = 0;
2889 def->max = 85;
2890 def->mode = comAdvanced;
2891 def->set_default_value(new ConfigOptionFloat(40));
2892
2893 def = this->add("support_tree_angle_slow", coFloat);
2894 def->label = L("Preferred Branch Angle");
2895 def->category = L("Support material");
2896 // TRN PrintSettings: "Organic supports" > "Preferred Branch Angle"
2897 def->tooltip = L("The preferred angle of the branches, when they do not have to avoid the model. "
2898 "Use a lower angle to make them more vertical and more stable. Use a higher angle for branches to merge faster.");
2899 def->sidetext = L("°");
2900 def->min = 10;
2901 def->max = 85;
2902 def->mode = comAdvanced;
2903 def->set_default_value(new ConfigOptionFloat(25));
2904
2905 def = this->add("support_tree_tip_diameter", coFloat);
2906 def->label = L("Tip Diameter");
2907 def->category = L("Support material");
2908 // TRN PrintSettings: "Organic supports" > "Tip Diameter"
2909 def->tooltip = L("Branch tip diameter for organic supports.");
2910 def->sidetext = L("mm");
2911 def->min = 0.1f;
2912 def->max = 100.f;
2913 def->mode = comAdvanced;
2914 def->set_default_value(new ConfigOptionFloat(0.8));
2915
2916 def = this->add("support_tree_branch_diameter", coFloat);
2917 def->label = L("Branch Diameter");
2918 def->category = L("Support material");
2919 // TRN PrintSettings: "Organic supports" > "Branch Diameter"
2920 def->tooltip = L("The diameter of the thinnest branches of organic support. Thicker branches are more sturdy. "
2921 "Branches towards the base will be thicker than this.");
2922 def->sidetext = L("mm");
2923 def->min = 0.1f;
2924 def->max = 100.f;
2925 def->mode = comAdvanced;
2926 def->set_default_value(new ConfigOptionFloat(2));
2927
2928 def = this->add("support_tree_branch_diameter_angle", coFloat);
2929 // TRN PrintSettings: #lmFIXME
2930 def->label = L("Branch Diameter Angle");
2931 def->category = L("Support material");
2932 // TRN PrintSettings: "Organic supports" > "Branch Diameter Angle"
2933 def->tooltip = L("The angle of the branches' diameter as they gradually become thicker towards the bottom. "
2934 "An angle of 0 will cause the branches to have uniform thickness over their length. "
2935 "A bit of an angle can increase stability of the organic support.");
2936 def->sidetext = L("°");
2937 def->min = 0;
2938 def->max = 15;
2939 def->mode = comAdvanced;
2940 def->set_default_value(new ConfigOptionFloat(5));
2941
2942 def = this->add("support_tree_branch_diameter_double_wall", coFloat);
2943 def->label = L("Branch Diameter with double walls");
2944 def->category = L("Support material");
2945 // TRN PrintSettings: "Organic supports" > "Branch Diameter"
2946 def->tooltip = L("Branches with area larger than the area of a circle of this diameter will be printed with double walls for stability. "
2947 "Set this value to zero for no double walls.");
2948 def->sidetext = L("mm");
2949 def->min = 0;
2950 def->max = 100.f;
2951 def->mode = comAdvanced;
2952 def->set_default_value(new ConfigOptionFloat(3));
2953
2954 // Tree Support Branch Distance
2955 // How far apart the branches need to be when they touch the model. Making this distance small will cause
2956 // the tree support to touch the model at more points, causing better overhang but making support harder to remove.
2957 def = this->add("support_tree_branch_distance", coFloat);
2958 // TRN PrintSettings: #lmFIXME
2959 def->label = L("Branch Distance");
2960 def->category = L("Support material");
2961 // TRN PrintSettings: "Organic supports" > "Branch Distance"
2962 def->tooltip = L("How far apart the branches need to be when they touch the model. "
2963 "Making this distance small will cause the tree support to touch the model at more points, "
2964 "causing better overhang but making support harder to remove.");
2965 def->mode = comAdvanced;
2966 def->set_default_value(new ConfigOptionFloat(1.));
2967
2968 def = this->add("support_tree_top_rate", coPercent);
2969 def->label = L("Branch Density");
2970 def->category = L("Support material");
2971 // TRN PrintSettings: "Organic supports" > "Branch Density"
2972 def->tooltip = L("Adjusts the density of the support structure used to generate the tips of the branches. "
2973 "A higher value results in better overhangs but the supports are harder to remove, "
2974 "thus it is recommended to enable top support interfaces instead of a high branch density value "
2975 "if dense interfaces are needed.");
2976 def->sidetext = L("%");
2977 def->min = 5;
2978 def->max_literal = 35;
2979 def->mode = comAdvanced;
2980 def->set_default_value(new ConfigOptionPercent(15));
2981
2982 def = this->add("temperature", coInts);
2983 def->label = L("Other layers");
2984 def->tooltip = L("Nozzle temperature for layers after the first one. Set this to zero to disable "
2985 "temperature control commands in the output G-code.");
2986 def->sidetext = L("°C");
2987 def->full_label = L("Nozzle temperature");
2988 def->min = 0;
2989 def->max = max_temp;
2990 def->set_default_value(new ConfigOptionInts { 200 });
2991
2992 def = this->add("thick_bridges", coBool);
2993 def->label = L("Thick bridges");
2994 def->category = L("Layers and Perimeters");
2995 def->tooltip = L("If enabled, bridges are more reliable, can bridge longer distances, but may look worse. "
2996 "If disabled, bridges look better but are reliable just for shorter bridged distances.");
2997 def->mode = comAdvanced;
2998 def->set_default_value(new ConfigOptionBool(true));
2999
3000 def = this->add("thin_walls", coBool);
3001 def->label = L("Detect thin walls");
3002 def->category = L("Layers and Perimeters");
3003 def->tooltip = L("Detect single-width walls (parts where two extrusions don't fit and we need "
3004 "to collapse them into a single trace).");
3005 def->mode = comAdvanced;
3006 def->set_default_value(new ConfigOptionBool(true));
3007
3008 def = this->add("threads", coInt);
3009 def->label = L("Threads");
3010 def->tooltip = L("Threads are used to parallelize long-running tasks. Optimal threads number "
3011 "is slightly above the number of available cores/processors.");
3012 def->readonly = true;
3013 def->min = 1;
3014 {
3015 int threads = (unsigned int)boost::thread::hardware_concurrency();
3016 def->set_default_value(new ConfigOptionInt(threads > 0 ? threads : 2));
3017 def->cli = ConfigOptionDef::nocli;
3018 }
3019
3020 def = this->add("toolchange_gcode", coString);
3021 def->label = L("Tool change G-code");
3022 def->tooltip = L("This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings "
3023 "as well as {toolchange_z}, {previous_extruder} and {next_extruder} can be used. When a tool-changing command "
3024 "which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. "
3025 "It is therefore possible to script custom behaviour both before and after the toolchange.");
3026 def->multiline = true;
3027 def->full_width = true;
3028 def->height = 5;
3029 def->mode = comExpert;
3030 def->set_default_value(new ConfigOptionString(""));
3031
3032 def = this->add("top_infill_extrusion_width", coFloatOrPercent);
3033 def->label = L("Top solid infill");
3034 def->category = L("Extrusion Width");
3035 def->tooltip = L("Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. "
3036 "You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. "
3037 "If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. "
3038 "If expressed as percentage (for example 90%) it will be computed over layer height.");
3039 def->sidetext = L("mm or %");
3040 def->min = 0;
3041 def->max_literal = 50;
3042 def->mode = comAdvanced;
3043 def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
3044
3045 def = this->add("top_solid_infill_speed", coFloatOrPercent);
3046 def->label = L("Top solid infill");
3047 def->category = L("Speed");
3048 def->tooltip = L("Speed for printing top solid layers (it only applies to the uppermost "
3049 "external layers and not to their internal solid layers). You may want "
3050 "to slow down this to get a nicer surface finish. This can be expressed "
3051 "as a percentage (for example: 80%) over the solid infill speed above. "
3052 "Set to zero for auto.");
3053 def->sidetext = L("mm/s or %");
3054 def->ratio_over = "solid_infill_speed";
3055 def->min = 0;
3056 def->mode = comAdvanced;
3057 def->set_default_value(new ConfigOptionFloatOrPercent(15, false));
3058
3059 def = this->add("top_solid_layers", coInt);
3060 //TRN Print Settings: "Top solid layers"
3061 def->label = L_CONTEXT("Top", "Layers");
3062 def->category = L("Layers and Perimeters");
3063 def->tooltip = L("Number of solid layers to generate on top surfaces.");
3064 def->full_label = L("Top solid layers");
3065 def->min = 0;
3066 def->set_default_value(new ConfigOptionInt(3));
3067
3068 def = this->add("top_solid_min_thickness", coFloat);
3069 def->label = L_CONTEXT("Top", "Layers");
3070 def->category = L("Layers and Perimeters");
3071 def->tooltip = L("The number of top solid layers is increased above top_solid_layers if necessary to satisfy "
3072 "minimum thickness of top shell."
3073 " This is useful to prevent pillowing effect when printing with variable layer height.");
3074 def->full_label = L("Minimum top shell thickness");
3075 def->sidetext = L("mm");
3076 def->min = 0;
3077 def->set_default_value(new ConfigOptionFloat(0.));
3078
3079 def = this->add("travel_speed", coFloat);
3080 def->label = L("Travel");
3081 def->tooltip = L("Speed for travel moves (jumps between distant extrusion points).");
3082 def->sidetext = L("mm/s");
3083 def->aliases = { "travel_feed_rate" };
3084 def->min = 1;
3085 def->mode = comAdvanced;
3086 def->set_default_value(new ConfigOptionFloat(130));
3087
3088 def = this->add("travel_speed_z", coFloat);
3089 def->label = L("Z travel");
3090 def->tooltip = L("Speed for movements along the Z axis.\nWhen set to zero, the value "
3091 "is ignored and regular travel speed is used instead.");
3092 def->sidetext = L("mm/s");
3093 def->min = 0;
3094 def->mode = comAdvanced;
3095 def->set_default_value(new ConfigOptionFloat(0.));
3096
3097 def = this->add("use_firmware_retraction", coBool);
3098 def->label = L("Use firmware retraction");
3099 def->tooltip = L("This experimental setting uses G10 and G11 commands to have the firmware "
3100 "handle the retraction. This is only supported in recent Marlin.");
3101 def->mode = comExpert;
3102 def->set_default_value(new ConfigOptionBool(false));
3103
3104 def = this->add("use_relative_e_distances", coBool);
3105 def->label = L("Use relative E distances");
3106 def->tooltip = L("If your firmware requires relative E values, check this, "
3107 "otherwise leave it unchecked. Most firmwares use absolute values.");
3108 def->mode = comExpert;
3109 def->set_default_value(new ConfigOptionBool(false));
3110
3111 def = this->add("use_volumetric_e", coBool);
3112 def->label = L("Use volumetric E");
3113 def->tooltip = L("This experimental setting uses outputs the E values in cubic millimeters "
3114 "instead of linear millimeters. If your firmware doesn't already know "
3115 "filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' "
3116 "in your start G-code in order to turn volumetric mode on and use the filament "
3117 "diameter associated to the filament selected in Slic3r. This is only supported "
3118 "in recent Marlin.");
3119 def->mode = comExpert;
3120 def->set_default_value(new ConfigOptionBool(false));
3121
3122 def = this->add("variable_layer_height", coBool);
3123 def->label = L("Enable variable layer height feature");
3124 def->tooltip = L("Some printers or printer setups may have difficulties printing "
3125 "with a variable layer height. Enabled by default.");
3126 def->mode = comExpert;
3127 def->set_default_value(new ConfigOptionBool(true));
3128
3129 def = this->add("wipe", coBools);
3130 def->label = L("Wipe while retracting");
3131 def->tooltip = L("This flag will move the nozzle while retracting to minimize the possible blob "
3132 "on leaky extruders.");
3133 def->mode = comAdvanced;
3134 def->set_default_value(new ConfigOptionBools { false });
3135
3136 def = this->add("wipe_tower", coBool);
3137 def->label = L("Enable");
3138 def->tooltip = L("Multi material printers may need to prime or purge extruders on tool changes. "
3139 "Extrude the excess material into the wipe tower.");
3140 def->mode = comAdvanced;
3141 def->set_default_value(new ConfigOptionBool(false));
3142
3143 def = this->add("wiping_volumes_extruders", coFloats);
3144 def->label = L("Purging volumes - load/unload volumes");
3145 def->tooltip = L("This vector saves required volumes to change from/to each tool used on the "
3146 "wipe tower. These values are used to simplify creation of the full purging "
3147 "volumes below.");
3148 def->set_default_value(new ConfigOptionFloats { 70., 70., 70., 70., 70., 70., 70., 70., 70., 70. });
3149
3150 def = this->add("wiping_volumes_matrix", coFloats);
3151 def->label = L("Purging volumes - matrix");
3152 def->tooltip = L("This matrix describes volumes (in cubic milimetres) required to purge the"
3153 " new filament on the wipe tower for any given pair of tools.");
3154 def->set_default_value(new ConfigOptionFloats { 0., 140., 140., 140., 140.,
3155 140., 0., 140., 140., 140.,
3156 140., 140., 0., 140., 140.,
3157 140., 140., 140., 0., 140.,
3158 140., 140., 140., 140., 0. });
3159
3160 def = this->add("wipe_tower_x", coFloat);
3161 def->label = L("Position X");
3162 def->tooltip = L("X coordinate of the left front corner of a wipe tower");
3163 def->sidetext = L("mm");
3164 def->mode = comAdvanced;
3165 def->set_default_value(new ConfigOptionFloat(180.));
3166
3167 def = this->add("wipe_tower_y", coFloat);
3168 def->label = L("Position Y");
3169 def->tooltip = L("Y coordinate of the left front corner of a wipe tower");
3170 def->sidetext = L("mm");
3171 def->mode = comAdvanced;
3172 def->set_default_value(new ConfigOptionFloat(140.));
3173
3174 def = this->add("wipe_tower_width", coFloat);
3175 def->label = L("Width");
3176 def->tooltip = L("Width of a wipe tower");
3177 def->sidetext = L("mm");
3178 def->mode = comAdvanced;
3179 def->set_default_value(new ConfigOptionFloat(60.));
3180
3181 def = this->add("wipe_tower_rotation_angle", coFloat);
3182 def->label = L("Wipe tower rotation angle");
3183 def->tooltip = L("Wipe tower rotation angle with respect to x-axis.");
3184 def->sidetext = L("°");
3185 def->mode = comAdvanced;
3186 def->set_default_value(new ConfigOptionFloat(0.));
3187
3188 def = this->add("wipe_tower_brim_width", coFloat);
3189 def->label = L("Wipe tower brim width");
3190 def->tooltip = L("Wipe tower brim width");
3191 def->sidetext = L("mm");
3192 def->mode = comAdvanced;
3193 def->min = 0.;
3194 def->set_default_value(new ConfigOptionFloat(2.));
3195
3196 def = this->add("wipe_tower_cone_angle", coFloat);
3197 def->label = L("Stabilization cone apex angle");
3198 def->tooltip = L("Angle at the apex of the cone that is used to stabilize the wipe tower. "
3199 "Larger angle means wider base.");
3200 def->sidetext = L("°");
3201 def->mode = comAdvanced;
3202 def->min = 0.;
3203 def->max = 90.;
3204 def->set_default_value(new ConfigOptionFloat(0.));
3205
3206 def = this->add("wipe_tower_extra_spacing", coPercent);
3207 def->label = L("Wipe tower purge lines spacing");
3208 def->tooltip = L("Spacing of purge lines on the wipe tower.");
3209 def->sidetext = L("%");
3210 def->mode = comExpert;
3211 def->min = 100.;
3212 def->max = 300.;
3213 def->set_default_value(new ConfigOptionPercent(100.));
3214
3215 def = this->add("wipe_into_infill", coBool);
3216 def->category = L("Wipe options");
3217 def->label = L("Wipe into this object's infill");
3218 def->tooltip = L("Purging after toolchange will be done inside this object's infills. "
3219 "This lowers the amount of waste but may result in longer print time "
3220 " due to additional travel moves.");
3221 def->set_default_value(new ConfigOptionBool(false));
3222
3223 def = this->add("wipe_into_objects", coBool);
3224 def->category = L("Wipe options");
3225 def->label = L("Wipe into this object");
3226 def->tooltip = L("Object will be used to purge the nozzle after a toolchange to save material "
3227 "that would otherwise end up in the wipe tower and decrease print time. "
3228 "Colours of the objects will be mixed as a result.");
3229 def->set_default_value(new ConfigOptionBool(false));
3230
3231 def = this->add("wipe_tower_bridging", coFloat);
3232 def->label = L("Maximal bridging distance");
3233 def->tooltip = L("Maximal distance between supports on sparse infill sections.");
3234 def->sidetext = L("mm");
3235 def->mode = comAdvanced;
3236 def->set_default_value(new ConfigOptionFloat(10.));
3237
3238 def = this->add("wipe_tower_extruder", coInt);
3239 def->label = L("Wipe tower extruder");
3240 def->category = L("Extruders");
3241 def->tooltip = L("The extruder to use when printing perimeter of the wipe tower. "
3242 "Set to 0 to use the one that is available (non-soluble would be preferred).");
3243 def->min = 0;
3244 def->mode = comAdvanced;
3245 def->set_default_value(new ConfigOptionInt(0));
3246
3247 def = this->add("solid_infill_every_layers", coInt);
3248 def->label = L("Solid infill every");
3249 def->category = L("Infill");
3250 def->tooltip = L("This feature allows to force a solid layer every given number of layers. "
3251 "Zero to disable. You can set this to any value (for example 9999); "
3252 "Slic3r will automatically choose the maximum possible number of layers "
3253 "to combine according to nozzle diameter and layer height.");
3254 def->sidetext = L("layers");
3255 def->min = 0;
3256 def->mode = comExpert;
3257 def->set_default_value(new ConfigOptionInt(0));
3258
3259 def = this->add("xy_size_compensation", coFloat);
3260 def->label = L("XY Size Compensation");
3261 def->category = L("Advanced");
3262 def->tooltip = L("The object will be grown/shrunk in the XY plane by the configured value "
3263 "(negative = inwards, positive = outwards). This might be useful "
3264 "for fine-tuning hole sizes.");
3265 def->sidetext = L("mm");
3266 def->mode = comExpert;
3267 def->set_default_value(new ConfigOptionFloat(0));
3268
3269 def = this->add("z_offset", coFloat);
3270 def->label = L("Z offset");
3271 def->tooltip = L("This value will be added (or subtracted) from all the Z coordinates "
3272 "in the output G-code. It is used to compensate for bad Z endstop position: "
3273 "for example, if your endstop zero actually leaves the nozzle 0.3mm far "
3274 "from the print bed, set this to -0.3 (or fix your endstop).");
3275 def->sidetext = L("mm");
3276 def->mode = comAdvanced;
3277 def->set_default_value(new ConfigOptionFloat(0));
3278
3279 def = this->add("perimeter_generator", coEnum);
3280 def->label = L("Perimeter generator");
3281 def->category = L("Layers and Perimeters");
3282 def->tooltip = L("Classic perimeter generator produces perimeters with constant extrusion width and for "
3283 "very thin areas is used gap-fill. "
3284 "Arachne engine produces perimeters with variable extrusion width. "
3285 "This setting also affects the Concentric infill.");
3286 def->set_enum<PerimeterGeneratorType>({
3287 { "classic", L("Classic") },
3288 { "arachne", L("Arachne") }
3289 });
3290 def->mode = comAdvanced;
3291 def->set_default_value(new ConfigOptionEnum<PerimeterGeneratorType>(PerimeterGeneratorType::Arachne));
3292
3293 def = this->add("wall_transition_length", coFloatOrPercent);
3294 def->label = L("Perimeter transition length");
3295 def->category = L("Advanced");
3296 def->tooltip = L("When transitioning between different numbers of perimeters as the part becomes "
3297 "thinner, a certain amount of space is allotted to split or join the perimeter segments. "
3298 "If expressed as a percentage (for example 100%), it will be computed based on the nozzle diameter.");
3299 def->sidetext = L("mm or %");
3300 def->mode = comExpert;
3301 def->min = 0;
3302 def->set_default_value(new ConfigOptionFloatOrPercent(100, true));
3303
3304 def = this->add("wall_transition_filter_deviation", coFloatOrPercent);
3305 def->label = L("Perimeter transitioning filter margin");
3306 def->category = L("Advanced");
3307 def->tooltip = L("Prevent transitioning back and forth between one extra perimeter and one less. This "
3308 "margin extends the range of extrusion widths which follow to [Minimum perimeter width "
3309 "- margin, 2 * Minimum perimeter width + margin]. Increasing this margin "
3310 "reduces the number of transitions, which reduces the number of extrusion "
3311 "starts/stops and travel time. However, large extrusion width variation can lead to "
3312 "under- or overextrusion problems. "
3313 "If expressed as a percentage (for example 25%), it will be computed based on the nozzle diameter.");
3314 def->sidetext = L("mm or %");
3315 def->mode = comExpert;
3316 def->min = 0;
3317 def->set_default_value(new ConfigOptionFloatOrPercent(25, true));
3318
3319 def = this->add("wall_transition_angle", coFloat);
3320 def->label = L("Perimeter transitioning threshold angle");
3321 def->category = L("Advanced");
3322 def->tooltip = L("When to create transitions between even and odd numbers of perimeters. A wedge shape with"
3323 " an angle greater than this setting will not have transitions and no perimeters will be "
3324 "printed in the center to fill the remaining space. Reducing this setting reduces "
3325 "the number and length of these center perimeters, but may leave gaps or overextrude.");
3326 def->sidetext = L("°");
3327 def->mode = comExpert;
3328 def->min = 1.;
3329 def->max = 59.;
3330 def->set_default_value(new ConfigOptionFloat(10.));
3331
3332 def = this->add("wall_distribution_count", coInt);
3333 def->label = L("Perimeter distribution count");
3334 def->category = L("Advanced");
3335 def->tooltip = L("The number of perimeters, counted from the center, over which the variation needs to be "
3336 "spread. Lower values mean that the outer perimeters don't change in width.");
3337 def->mode = comExpert;
3338 def->min = 1;
3339 def->set_default_value(new ConfigOptionInt(1));
3340
3341 def = this->add("min_feature_size", coFloatOrPercent);
3342 def->label = L("Minimum feature size");
3343 def->category = L("Advanced");
3344 def->tooltip = L("Minimum thickness of thin features. Model features that are thinner than this value will "
3345 "not be printed, while features thicker than the Minimum feature size will be widened to "
3346 "the Minimum perimeter width. "
3347 "If expressed as a percentage (for example 25%), it will be computed based on the nozzle diameter.");
3348 def->sidetext = L("mm or %");
3349 def->mode = comExpert;
3350 def->min = 0;
3351 def->set_default_value(new ConfigOptionFloatOrPercent(25, true));
3352
3353 def = this->add("min_bead_width", coFloatOrPercent);
3354 def->label = L("Minimum perimeter width");
3355 def->category = L("Advanced");
3356 def->tooltip = L("Width of the perimeter that will replace thin features (according to the Minimum feature size) "
3357 "of the model. If the Minimum perimeter width is thinner than the thickness of the feature,"
3358 " the perimeter will become as thick as the feature itself. "
3359 "If expressed as a percentage (for example 85%), it will be computed based on the nozzle diameter.");
3360 def->sidetext = L("mm or %");
3361 def->mode = comExpert;
3362 def->min = 0;
3363 def->set_default_value(new ConfigOptionFloatOrPercent(85, true));
3364
3365 // Declare retract values for filament profile, overriding the printer's extruder profile.
3366 for (const char *opt_key : {
3367 // floats
3368 "retract_length", "retract_lift", "retract_lift_above", "retract_lift_below", "retract_speed", "deretract_speed", "retract_restart_extra", "retract_before_travel",
3369 // bools
3370 "retract_layer_change", "wipe",
3371 // percents
3372 "retract_before_wipe"}) {
3373 auto it_opt = options.find(opt_key);
3374 assert(it_opt != options.end());
3375 def = this->add_nullable(std::string("filament_") + opt_key, it_opt->second.type);
3376 def->label = it_opt->second.label;
3377 def->full_label = it_opt->second.full_label;
3378 def->tooltip = it_opt->second.tooltip;
3379 def->sidetext = it_opt->second.sidetext;
3380 def->mode = it_opt->second.mode;
3381 switch (def->type) {
3382 case coFloats : def->set_default_value(new ConfigOptionFloatsNullable (static_cast<const ConfigOptionFloats* >(it_opt->second.default_value.get())->values)); break;
3383 case coPercents : def->set_default_value(new ConfigOptionPercentsNullable(static_cast<const ConfigOptionPercents*>(it_opt->second.default_value.get())->values)); break;
3384 case coBools : def->set_default_value(new ConfigOptionBoolsNullable (static_cast<const ConfigOptionBools* >(it_opt->second.default_value.get())->values)); break;
3385 default: assert(false);
3386 }
3387 }
3388}
ConfigOptionDef * add_nullable(const t_config_option_key &opt_key, ConfigOptionType type)
Definition Config.cpp:299
Definition clonable_ptr.hpp:28
typedef void(GLAPIENTRYP _GLUfuncptr)(void)
const int max_temp
Definition PrintConfig.cpp:231
GCodeFlavor
Definition PrintConfig.hpp:34
@ gcfRepRapSprinter
Definition PrintConfig.hpp:35
@ comSimple
Definition Config.hpp:198
BrimType
Definition PrintConfig.hpp:117
@ btOuterOnly
Definition PrintConfig.hpp:119
InfillPattern
Definition PrintConfig.hpp:60
@ ipStars
Definition PrintConfig.hpp:61
@ ipMonotonic
Definition PrintConfig.hpp:61
SeamPosition
Definition PrintConfig.hpp:97
@ spAligned
Definition PrintConfig.hpp:98
SupportMaterialInterfacePattern
Definition PrintConfig.hpp:93
@ smipRectilinear
Definition PrintConfig.hpp:94
SlicingMode
Definition PrintConfig.hpp:76
ConfigOptionPercentsTempl< true > ConfigOptionPercentsNullable
Definition Config.hpp:1009
ConfigOptionPercentsTempl< false > ConfigOptionPercents
Definition Config.hpp:1008
PrintHostType
Definition PrintConfig.hpp:46
@ htPrusaLink
Definition PrintConfig.hpp:47
ConfigOptionFloatsTempl< true > ConfigOptionFloatsNullable
Definition Config.hpp:717
SupportMaterialPattern
Definition PrintConfig.hpp:85
@ smpRectilinear
Definition PrintConfig.hpp:86
FuzzySkinType
Definition PrintConfig.hpp:54
ConfigOptionBoolsTempl< true > ConfigOptionBoolsNullable
Definition Config.hpp:1492
ConfigOptionBoolsTempl< false > ConfigOptionBools
Definition Config.hpp:1491
IroningType
Definition PrintConfig.hpp:68
SupportMaterialStyle
Definition PrintConfig.hpp:89
@ smsGrid
Definition PrintConfig.hpp:90
ConfigOptionFloatsTempl< false > ConfigOptionFloats
Definition Config.hpp:716
ConfigOptionIntsTempl< false > ConfigOptionInts
Definition Config.hpp:844
@ coBools
Definition Config.hpp:192
@ coPercents
Definition Config.hpp:178
@ coFloats
Definition Config.hpp:166
ConfigOptionEnum< MachineLimitsUsage >
Definition PrintConfig.hpp:634
MachineLimitsUsage
Definition PrintConfig.hpp:39
DraftShield
Definition PrintConfig.hpp:124
@ dsDisabled
Definition PrintConfig.hpp:125
PerimeterGeneratorType
Definition PrintConfig.hpp:129
#define L_CONTEXT(s, context)
Definition I18N.hpp:22

References Slic3r::ConfigDef::add(), Slic3r::ConfigDef::add_nullable(), Slic3r::ConfigOptionDef::aliases, Slic3r::Arachne, Slic3r::btOuterOnly, Slic3r::ConfigOptionDef::category, Slic3r::ConfigOptionDef::cli, Slic3r::coBool, Slic3r::coBools, Slic3r::coEnum, Slic3r::coFloat, Slic3r::coFloatOrPercent, Slic3r::coFloats, Slic3r::coInt, Slic3r::coInts, Slic3r::ConfigOptionDef::color, Slic3r::comAdvanced, Slic3r::comExpert, Slic3r::comSimple, Slic3r::coPercent, Slic3r::coPercents, Slic3r::coPoints, Slic3r::coString, Slic3r::coStrings, Slic3r::dsDisabled, Slic3r::ConfigOptionDef::enum_def, Slic3r::ConfigOptionDef::f_enum_open, Slic3r::ConfigOptionDef::full_label, Slic3r::ConfigOptionDef::full_width, Slic3r::gcfRepRapSprinter, Slic3r::ConfigOptionDef::gui_flags, Slic3r::ConfigOptionDef::gui_type, Slic3r::ConfigOptionDef::height, Slic3r::htPrusaLink, Slic3r::ConfigOptionDef::i_enum_open, Slic3r::ipMonotonic, Slic3r::ipStars, L, L_CONTEXT, Slic3r::ConfigOptionDef::label, Slic3r::ConfigOptionDef::max, Slic3r::ConfigOptionDef::max_literal, Slic3r::ConfigOptionDef::min, Slic3r::ConfigOptionDef::mode, Slic3r::ConfigOptionDef::multiline, Slic3r::ConfigOptionDef::nocli, Slic3r::None, Slic3r::ConfigDef::options, Slic3r::ConfigOptionDef::ratio_over, Slic3r::ConfigOptionDef::readonly, Slic3r::Regular, Slic3r::ConfigOptionDef::select_open, Slic3r::ConfigOptionDef::set_default_value(), Slic3r::ConfigOptionDef::set_enum(), Slic3r::ConfigOptionDef::set_enum_labels(), Slic3r::ConfigOptionDef::set_enum_values(), Slic3r::ConfigOptionDef::shortcut, Slic3r::ConfigOptionDef::sidetext, Slic3r::smipRectilinear, Slic3r::smpRectilinear, Slic3r::smsGrid, Slic3r::spAligned, Slic3r::TimeEstimateOnly, Slic3r::ConfigOptionDef::tooltip, Slic3r::TopSurfaces, Slic3r::ConfigOptionDef::type, Slic3r::ConfigOptionVector< T >::values, and void().

Referenced by PrintConfigDef().

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

◆ init_sla_params()

void Slic3r::PrintConfigDef::init_sla_params ( )
private
3604{
3605 ConfigOptionDef* def;
3606
3607 // SLA Printer settings
3608
3609 def = this->add("display_width", coFloat);
3610 def->label = L("Display width");
3611 def->tooltip = L("Width of the display");
3612 def->min = 1;
3613 def->set_default_value(new ConfigOptionFloat(120.));
3614
3615 def = this->add("display_height", coFloat);
3616 def->label = L("Display height");
3617 def->tooltip = L("Height of the display");
3618 def->min = 1;
3619 def->set_default_value(new ConfigOptionFloat(68.));
3620
3621 def = this->add("display_pixels_x", coInt);
3622 def->full_label = L("Number of pixels in");
3623 def->label = ("X");
3624 def->tooltip = L("Number of pixels in X");
3625 def->min = 100;
3626 def->set_default_value(new ConfigOptionInt(2560));
3627
3628 def = this->add("display_pixels_y", coInt);
3629 def->label = ("Y");
3630 def->tooltip = L("Number of pixels in Y");
3631 def->min = 100;
3632 def->set_default_value(new ConfigOptionInt(1440));
3633
3634 def = this->add("display_mirror_x", coBool);
3635 def->full_label = L("Display horizontal mirroring");
3636 def->label = L("Mirror horizontally");
3637 def->tooltip = L("Enable horizontal mirroring of output images");
3638 def->mode = comExpert;
3639 def->set_default_value(new ConfigOptionBool(true));
3640
3641 def = this->add("display_mirror_y", coBool);
3642 def->full_label = L("Display vertical mirroring");
3643 def->label = L("Mirror vertically");
3644 def->tooltip = L("Enable vertical mirroring of output images");
3645 def->mode = comExpert;
3646 def->set_default_value(new ConfigOptionBool(false));
3647
3648 def = this->add("display_orientation", coEnum);
3649 def->label = L("Display orientation");
3650 def->tooltip = L("Set the actual LCD display orientation inside the SLA printer."
3651 " Portrait mode will flip the meaning of display width and height parameters"
3652 " and the output images will be rotated by 90 degrees.");
3653 def->set_enum<SLADisplayOrientation>({
3654 { "landscape", L("Landscape") },
3655 { "portrait", L("Portrait") }
3656 });
3657 def->mode = comExpert;
3658 def->set_default_value(new ConfigOptionEnum<SLADisplayOrientation>(sladoPortrait));
3659
3660 def = this->add("fast_tilt_time", coFloat);
3661 def->label = L("Fast");
3662 def->full_label = L("Fast tilt");
3663 def->tooltip = L("Time of the fast tilt");
3664 def->sidetext = L("s");
3665 def->min = 0;
3666 def->mode = comExpert;
3667 def->set_default_value(new ConfigOptionFloat(5.));
3668
3669 def = this->add("slow_tilt_time", coFloat);
3670 def->label = L("Slow");
3671 def->full_label = L("Slow tilt");
3672 def->tooltip = L("Time of the slow tilt");
3673 def->sidetext = L("s");
3674 def->min = 0;
3675 def->mode = comExpert;
3676 def->set_default_value(new ConfigOptionFloat(8.));
3677
3678 def = this->add("high_viscosity_tilt_time", coFloat);
3679 def->label = L("High viscosity");
3680 def->full_label = L("Tilt for high viscosity resin");
3681 def->tooltip = L("Time of the super slow tilt");
3682 def->sidetext = L("s");
3683 def->min = 0;
3684 def->mode = comExpert;
3685 def->set_default_value(new ConfigOptionFloat(10.));
3686
3687 def = this->add("area_fill", coFloat);
3688 def->label = L("Area fill");
3689 def->tooltip = L("The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt");
3690 def->sidetext = L("%");
3691 def->min = 0;
3692 def->mode = comExpert;
3693 def->set_default_value(new ConfigOptionFloat(50.));
3694
3695 def = this->add("relative_correction", coFloats);
3696 def->label = L("Printer scaling correction");
3697 def->full_label = L("Printer scaling correction");
3698 def->tooltip = L("Printer scaling correction");
3699 def->min = 0;
3700 def->mode = comExpert;
3701 def->set_default_value(new ConfigOptionFloats( { 1., 1.} ));
3702
3703 def = this->add("relative_correction_x", coFloat);
3704 def->label = L("Printer scaling correction in X axis");
3705 def->full_label = L("Printer scaling X axis correction");
3706 def->tooltip = L("Printer scaling correction in X axis");
3707 def->min = 0;
3708 def->mode = comExpert;
3709 def->set_default_value(new ConfigOptionFloat(1.));
3710
3711 def = this->add("relative_correction_y", coFloat);
3712 def->label = L("Printer scaling correction in Y axis");
3713 def->full_label = L("Printer scaling Y axis correction");
3714 def->tooltip = L("Printer scaling correction in Y axis");
3715 def->min = 0;
3716 def->mode = comExpert;
3717 def->set_default_value(new ConfigOptionFloat(1.));
3718
3719 def = this->add("relative_correction_z", coFloat);
3720 def->label = L("Printer scaling correction in Z axis");
3721 def->full_label = L("Printer scaling Z axis correction");
3722 def->tooltip = L("Printer scaling correction in Z axis");
3723 def->min = 0;
3724 def->mode = comExpert;
3725 def->set_default_value(new ConfigOptionFloat(1.));
3726
3727 def = this->add("absolute_correction", coFloat);
3728 def->label = L("Printer absolute correction");
3729 def->full_label = L("Printer absolute correction");
3730 def->tooltip = L("Will inflate or deflate the sliced 2D polygons according "
3731 "to the sign of the correction.");
3732 def->mode = comExpert;
3733 def->set_default_value(new ConfigOptionFloat(0.0));
3734
3735 def = this->add("elefant_foot_min_width", coFloat);
3736 def->label = L("Elephant foot minimum width");
3737 def->category = L("Advanced");
3738 def->tooltip = L("Minimum width of features to maintain when doing elephant foot compensation.");
3739 def->sidetext = L("mm");
3740 def->min = 0;
3741 def->mode = comAdvanced;
3742 def->set_default_value(new ConfigOptionFloat(0.2));
3743
3744 def = this->add("gamma_correction", coFloat);
3745 def->label = L("Printer gamma correction");
3746 def->full_label = L("Printer gamma correction");
3747 def->tooltip = L("This will apply a gamma correction to the rasterized 2D "
3748 "polygons. A gamma value of zero means thresholding with "
3749 "the threshold in the middle. This behaviour eliminates "
3750 "antialiasing without losing holes in polygons.");
3751 def->min = 0;
3752 def->max = 1;
3753 def->mode = comExpert;
3754 def->set_default_value(new ConfigOptionFloat(1.0));
3755
3756
3757 // SLA Material settings.
3758
3759 def = this->add("material_colour", coString);
3760 def->label = L("Color");
3761 def->tooltip = L("This is only used in the Slic3r interface as a visual help.");
3762 def->gui_type = ConfigOptionDef::GUIType::color;
3763 def->set_default_value(new ConfigOptionString("#29B2B2"));
3764
3765 def = this->add("material_type", coString);
3766 def->label = L("SLA material type");
3767 def->tooltip = L("SLA material type");
3768 def->gui_flags = "show_value";
3769 def->set_enum_values(ConfigOptionDef::GUIType::select_open,
3770 { "Tough", "Flexible", "Casting", "Dental", "Heat-resistant" });
3771 def->set_default_value(new ConfigOptionString("Tough"));
3772
3773 def = this->add("initial_layer_height", coFloat);
3774 def->label = L("Initial layer height");
3775 def->tooltip = L("Initial layer height");
3776 def->sidetext = L("mm");
3777 def->min = 0;
3778 def->set_default_value(new ConfigOptionFloat(0.3));
3779
3780 def = this->add_nullable("idle_temperature", coInts);
3781 def->label = L("Idle temperature");
3782 def->tooltip = L("Nozzle temperature when the tool is currently not used in multi-tool setups."
3783 "This is only used when 'Ooze prevention' is active in Print Settings.");
3784 def->sidetext = L("°C");
3785 def->min = 0;
3786 def->max = max_temp;
3787 def->set_default_value(new ConfigOptionIntsNullable { ConfigOptionIntsNullable::nil_value() });
3788
3789 def = this->add("bottle_volume", coFloat);
3790 def->label = L("Bottle volume");
3791 def->tooltip = L("Bottle volume");
3792 def->sidetext = L("ml");
3793 def->min = 50;
3794 def->set_default_value(new ConfigOptionFloat(1000.0));
3795
3796 def = this->add("bottle_weight", coFloat);
3797 def->label = L("Bottle weight");
3798 def->tooltip = L("Bottle weight");
3799 def->sidetext = L("kg");
3800 def->min = 0;
3801 def->set_default_value(new ConfigOptionFloat(1.0));
3802
3803 def = this->add("material_density", coFloat);
3804 def->label = L("Density");
3805 def->tooltip = L("Density");
3806 def->sidetext = L("g/ml");
3807 def->min = 0;
3808 def->set_default_value(new ConfigOptionFloat(1.0));
3809
3810 def = this->add("bottle_cost", coFloat);
3811 def->label = L("Cost");
3812 def->tooltip = L("Cost");
3813 def->sidetext = L("money/bottle");
3814 def->min = 0;
3815 def->set_default_value(new ConfigOptionFloat(0.0));
3816
3817 def = this->add("faded_layers", coInt);
3818 def->label = L("Faded layers");
3819 def->tooltip = L("Number of the layers needed for the exposure time fade from initial exposure time to the exposure time");
3820 def->min = 3;
3821 def->max = 20;
3822 def->mode = comExpert;
3823 def->set_default_value(new ConfigOptionInt(10));
3824
3825 def = this->add("min_exposure_time", coFloat);
3826 def->label = L("Minimum exposure time");
3827 def->tooltip = L("Minimum exposure time");
3828 def->sidetext = L("s");
3829 def->min = 0;
3830 def->mode = comExpert;
3831 def->set_default_value(new ConfigOptionFloat(0));
3832
3833 def = this->add("max_exposure_time", coFloat);
3834 def->label = L("Maximum exposure time");
3835 def->tooltip = L("Maximum exposure time");
3836 def->sidetext = L("s");
3837 def->min = 0;
3838 def->mode = comExpert;
3839 def->set_default_value(new ConfigOptionFloat(100));
3840
3841 def = this->add("exposure_time", coFloat);
3842 def->label = L("Exposure time");
3843 def->tooltip = L("Exposure time");
3844 def->sidetext = L("s");
3845 def->min = 0;
3846 def->set_default_value(new ConfigOptionFloat(10));
3847
3848 def = this->add("min_initial_exposure_time", coFloat);
3849 def->label = L("Minimum initial exposure time");
3850 def->tooltip = L("Minimum initial exposure time");
3851 def->sidetext = L("s");
3852 def->min = 0;
3853 def->mode = comExpert;
3854 def->set_default_value(new ConfigOptionFloat(0));
3855
3856 def = this->add("max_initial_exposure_time", coFloat);
3857 def->label = L("Maximum initial exposure time");
3858 def->tooltip = L("Maximum initial exposure time");
3859 def->sidetext = L("s");
3860 def->min = 0;
3861 def->mode = comExpert;
3862 def->set_default_value(new ConfigOptionFloat(150));
3863
3864 def = this->add("initial_exposure_time", coFloat);
3865 def->label = L("Initial exposure time");
3866 def->tooltip = L("Initial exposure time");
3867 def->sidetext = L("s");
3868 def->min = 0;
3869 def->set_default_value(new ConfigOptionFloat(15));
3870
3871 def = this->add("material_correction", coFloats);
3872 def->full_label = L("Correction for expansion");
3873 def->tooltip = L("Correction for expansion");
3874 def->min = 0;
3875 def->mode = comExpert;
3876 def->set_default_value(new ConfigOptionFloats( { 1., 1., 1. } ));
3877
3878 def = this->add("material_correction_x", coFloat);
3879 def->full_label = L("Correction for expansion in X axis");
3880 def->tooltip = L("Correction for expansion in X axis");
3881 def->min = 0;
3882 def->mode = comExpert;
3883 def->set_default_value(new ConfigOptionFloat(1.));
3884
3885 def = this->add("material_correction_y", coFloat);
3886 def->full_label = L("Correction for expansion in Y axis");
3887 def->tooltip = L("Correction for expansion in Y axis");
3888 def->min = 0;
3889 def->mode = comExpert;
3890 def->set_default_value(new ConfigOptionFloat(1.));
3891
3892 def = this->add("material_correction_z", coFloat);
3893 def->full_label = L("Correction for expansion in Z axis");
3894 def->tooltip = L("Correction for expansion in Z axis");
3895 def->min = 0;
3896 def->mode = comExpert;
3897 def->set_default_value(new ConfigOptionFloat(1.));
3898
3899 def = this->add("material_notes", coString);
3900 def->label = L("SLA print material notes");
3901 def->tooltip = L("You can put your notes regarding the SLA print material here.");
3902 def->multiline = true;
3903 def->full_width = true;
3904 def->height = 13;
3905 // TODO currently notes are the only way to pass data
3906 // for non-PrusaResearch printers. We therefore need to always show them
3907 def->mode = comSimple;
3908 def->set_default_value(new ConfigOptionString(""));
3909
3910 def = this->add("material_vendor", coString);
3911 def->set_default_value(new ConfigOptionString(L("(Unknown)")));
3912 def->cli = ConfigOptionDef::nocli;
3913
3914 def = this->add("default_sla_material_profile", coString);
3915 def->label = L("Default SLA material profile");
3916 def->tooltip = L("Default print profile associated with the current printer profile. "
3917 "On selection of the current printer profile, this print profile will be activated.");
3918 def->set_default_value(new ConfigOptionString());
3919 def->cli = ConfigOptionDef::nocli;
3920
3921 def = this->add("sla_material_settings_id", coString);
3922 def->set_default_value(new ConfigOptionString(""));
3923 def->cli = ConfigOptionDef::nocli;
3924
3925 def = this->add("default_sla_print_profile", coString);
3926 def->label = L("Default SLA material profile");
3927 def->tooltip = L("Default print profile associated with the current printer profile. "
3928 "On selection of the current printer profile, this print profile will be activated.");
3929 def->set_default_value(new ConfigOptionString());
3930 def->cli = ConfigOptionDef::nocli;
3931
3932 def = this->add("sla_print_settings_id", coString);
3933 def->set_default_value(new ConfigOptionString(""));
3934 def->cli = ConfigOptionDef::nocli;
3935
3936 def = this->add("supports_enable", coBool);
3937 def->label = L("Generate supports");
3938 def->category = L("Supports");
3939 def->tooltip = L("Generate supports for the models");
3940 def->mode = comSimple;
3941 def->set_default_value(new ConfigOptionBool(true));
3942
3943 def = this->add("support_tree_type", coEnum);
3944 def->label = L("Support tree type");
3945 def->tooltip = L("Support tree building strategy");
3946 def->set_enum<sla::SupportTreeType>(
3948 { L("Default"),
3949 // TRN One of the "Support tree type"s on SLAPrintSettings : Supports
3950 L("Branching (experimental)") });
3951 // TODO: def->enum_def->labels[2] = L("Organic");
3952 def->mode = comSimple;
3953 def->set_default_value(new ConfigOptionEnum(sla::SupportTreeType::Default));
3954
3956 init_sla_support_params("branching");
3957
3958 def = this->add("support_enforcers_only", coBool);
3959 def->label = L("Support only in enforced regions");
3960 def->category = L("Supports");
3961 def->tooltip = L("Only create support if it lies in a support enforcer.");
3962 def->mode = comSimple;
3963 def->set_default_value(new ConfigOptionBool(false));
3964
3965 def = this->add("support_points_density_relative", coInt);
3966 def->label = L("Support points density");
3967 def->category = L("Supports");
3968 def->tooltip = L("This is a relative measure of support points density.");
3969 def->sidetext = L("%");
3970 def->min = 0;
3971 def->set_default_value(new ConfigOptionInt(100));
3972
3973 def = this->add("support_points_minimal_distance", coFloat);
3974 def->label = L("Minimal distance of the support points");
3975 def->category = L("Supports");
3976 def->tooltip = L("No support points will be placed closer than this threshold.");
3977 def->sidetext = L("mm");
3978 def->min = 0;
3979 def->set_default_value(new ConfigOptionFloat(1.));
3980
3981 def = this->add("pad_enable", coBool);
3982 def->label = L("Use pad");
3983 def->category = L("Pad");
3984 def->tooltip = L("Add a pad underneath the supported model");
3985 def->mode = comSimple;
3986 def->set_default_value(new ConfigOptionBool(true));
3987
3988 def = this->add("pad_wall_thickness", coFloat);
3989 def->label = L("Pad wall thickness");
3990 def->category = L("Pad");
3991 def->tooltip = L("The thickness of the pad and its optional cavity walls.");
3992 def->sidetext = L("mm");
3993 def->min = 0;
3994 def->max = 30;
3995 def->mode = comSimple;
3996 def->set_default_value(new ConfigOptionFloat(2.0));
3997
3998 def = this->add("pad_wall_height", coFloat);
3999 def->label = L("Pad wall height");
4000 def->tooltip = L("Defines the pad cavity depth. Set to zero to disable the cavity. "
4001 "Be careful when enabling this feature, as some resins may "
4002 "produce an extreme suction effect inside the cavity, "
4003 "which makes peeling the print off the vat foil difficult.");
4004 def->category = L("Pad");
4005// def->tooltip = L("");
4006 def->sidetext = L("mm");
4007 def->min = 0;
4008 def->max = 30;
4009 def->mode = comExpert;
4010 def->set_default_value(new ConfigOptionFloat(0.));
4011
4012 def = this->add("pad_brim_size", coFloat);
4013 def->label = L("Pad brim size");
4014 def->tooltip = L("How far should the pad extend around the contained geometry");
4015 def->category = L("Pad");
4016 // def->tooltip = L("");
4017 def->sidetext = L("mm");
4018 def->min = 0;
4019 def->max = 30;
4020 def->mode = comAdvanced;
4021 def->set_default_value(new ConfigOptionFloat(1.6));
4022
4023 def = this->add("pad_max_merge_distance", coFloat);
4024 def->label = L("Max merge distance");
4025 def->category = L("Pad");
4026 def->tooltip = L("Some objects can get along with a few smaller pads "
4027 "instead of a single big one. This parameter defines "
4028 "how far the center of two smaller pads should be. If they"
4029 "are closer, they will get merged into one pad.");
4030 def->sidetext = L("mm");
4031 def->min = 0;
4032 def->mode = comExpert;
4033 def->set_default_value(new ConfigOptionFloat(50.0));
4034
4035 // This is disabled on the UI. I hope it will never be enabled.
4036// def = this->add("pad_edge_radius", coFloat);
4037// def->label = L("Pad edge radius");
4038// def->category = L("Pad");
4040// def->sidetext = L("mm");
4041// def->min = 0;
4042// def->mode = comAdvanced;
4043// def->set_default_value(new ConfigOptionFloat(1.0));
4044
4045 def = this->add("pad_wall_slope", coFloat);
4046 def->label = L("Pad wall slope");
4047 def->category = L("Pad");
4048 def->tooltip = L("The slope of the pad wall relative to the bed plane. "
4049 "90 degrees means straight walls.");
4050 def->sidetext = L("°");
4051 def->min = 45;
4052 def->max = 90;
4053 def->mode = comAdvanced;
4054 def->set_default_value(new ConfigOptionFloat(90.0));
4055
4056 def = this->add("pad_around_object", coBool);
4057 def->label = L("Pad around object");
4058 def->category = L("Pad");
4059 def->tooltip = L("Create pad around object and ignore the support elevation");
4060 def->mode = comSimple;
4061 def->set_default_value(new ConfigOptionBool(false));
4062
4063 def = this->add("pad_around_object_everywhere", coBool);
4064 def->label = L("Pad around object everywhere");
4065 def->category = L("Pad");
4066 def->tooltip = L("Force pad around object everywhere");
4067 def->mode = comSimple;
4068 def->set_default_value(new ConfigOptionBool(false));
4069
4070 def = this->add("pad_object_gap", coFloat);
4071 def->label = L("Pad object gap");
4072 def->category = L("Pad");
4073 def->tooltip = L("The gap between the object bottom and the generated "
4074 "pad in zero elevation mode.");
4075 def->sidetext = L("mm");
4076 def->min = 0;
4077 def->max = 10;
4078 def->mode = comExpert;
4079 def->set_default_value(new ConfigOptionFloat(1));
4080
4081 def = this->add("pad_object_connector_stride", coFloat);
4082 def->label = L("Pad object connector stride");
4083 def->category = L("Pad");
4084 def->tooltip = L("Distance between two connector sticks which connect the object and the generated pad.");
4085 def->sidetext = L("mm");
4086 def->min = 0;
4087 def->mode = comExpert;
4088 def->set_default_value(new ConfigOptionFloat(10));
4089
4090 def = this->add("pad_object_connector_width", coFloat);
4091 def->label = L("Pad object connector width");
4092 def->category = L("Pad");
4093 def->tooltip = L("Width of the connector sticks which connect the object and the generated pad.");
4094 def->sidetext = L("mm");
4095 def->min = 0;
4096 def->mode = comExpert;
4097 def->set_default_value(new ConfigOptionFloat(0.5));
4098
4099 def = this->add("pad_object_connector_penetration", coFloat);
4100 def->label = L("Pad object connector penetration");
4101 def->category = L("Pad");
4102 def->tooltip = L(
4103 "How much should the tiny connectors penetrate into the model body.");
4104 def->sidetext = L("mm");
4105 def->min = 0;
4106 def->mode = comExpert;
4107 def->set_default_value(new ConfigOptionFloat(0.3));
4108
4109 def = this->add("hollowing_enable", coBool);
4110 def->label = L("Enable hollowing");
4111 def->category = L("Hollowing");
4112 def->tooltip = L("Hollow out a model to have an empty interior");
4113 def->mode = comSimple;
4114 def->set_default_value(new ConfigOptionBool(false));
4115
4116 def = this->add("hollowing_min_thickness", coFloat);
4117 def->label = L("Wall thickness");
4118 def->category = L("Hollowing");
4119 def->tooltip = L("Minimum wall thickness of a hollowed model.");
4120 def->sidetext = L("mm");
4121 def->min = 1;
4122 def->max = 10;
4123 def->mode = comSimple;
4124 def->set_default_value(new ConfigOptionFloat(3.));
4125
4126 def = this->add("hollowing_quality", coFloat);
4127 def->label = L("Accuracy");
4128 def->category = L("Hollowing");
4129 def->tooltip = L("Performance vs accuracy of calculation. Lower values may produce unwanted artifacts.");
4130 def->min = 0;
4131 def->max = 1;
4132 def->mode = comExpert;
4133 def->set_default_value(new ConfigOptionFloat(0.5));
4134
4135 def = this->add("hollowing_closing_distance", coFloat);
4136 def->label = L("Closing distance");
4137 def->category = L("Hollowing");
4138 def->tooltip = L(
4139 "Hollowing is done in two steps: first, an imaginary interior is "
4140 "calculated deeper (offset plus the closing distance) in the object and "
4141 "then it's inflated back to the specified offset. A greater closing "
4142 "distance makes the interior more rounded. At zero, the interior will "
4143 "resemble the exterior the most.");
4144 def->sidetext = L("mm");
4145 def->min = 0;
4146 def->max = 10;
4147 def->mode = comExpert;
4148 def->set_default_value(new ConfigOptionFloat(2.0));
4149
4150 def = this->add("material_print_speed", coEnum);
4151 def->label = L("Print speed");
4152 def->tooltip = L(
4153 "A slower printing profile might be necessary when using materials with higher viscosity "
4154 "or with some hollowed parts. It slows down the tilt movement and adds a delay before exposure.");
4155 def->set_enum<SLAMaterialSpeed>({
4156 { "slow", L("Slow") },
4157 { "fast", L("Fast") },
4158 { "high_viscosity", L("High viscosity") }
4159 });
4160 def->mode = comAdvanced;
4161 def->set_default_value(new ConfigOptionEnum<SLAMaterialSpeed>(slamsFast));
4162
4163 def = this->add("sla_archive_format", coString);
4164 def->label = L("Format of the output SLA archive");
4165 def->mode = comAdvanced;
4166 def->set_default_value(new ConfigOptionString("SL1"));
4167
4168 def = this->add("sla_output_precision", coFloat);
4169 def->label = L("SLA output precision");
4170 def->tooltip = L("Minimum resolution in nanometers");
4171 def->sidetext = L("mm");
4172 def->min = float(SCALING_FACTOR);
4173 def->mode = comExpert;
4174 def->set_default_value(new ConfigOptionFloat(0.001));
4175}
static const t_config_enum_names & get_enum_names()
static int nil_value()
Definition Config.hpp:778
void init_sla_support_params(const std::string &method_prefix)
Definition PrintConfig.cpp:3417
static constexpr double SCALING_FACTOR
Definition libslic3r.h:57
SupportTreeType
Definition SupportTreeStrategies.hpp:8
SLADisplayOrientation
Definition PrintConfig.hpp:109
@ sladoPortrait
Definition PrintConfig.hpp:111
SLAMaterialSpeed
Definition PrintConfig.hpp:1057
@ slamsFast
Definition PrintConfig.hpp:1057
ConfigOptionIntsTempl< true > ConfigOptionIntsNullable
Definition Config.hpp:845

References Slic3r::ConfigDef::add(), Slic3r::ConfigDef::add_nullable(), Slic3r::ConfigOptionDef::category, Slic3r::ConfigOptionDef::cli, Slic3r::coBool, Slic3r::coEnum, Slic3r::coFloat, Slic3r::coFloats, Slic3r::coInt, Slic3r::coInts, Slic3r::ConfigOptionDef::color, Slic3r::comAdvanced, Slic3r::comExpert, Slic3r::comSimple, Slic3r::coString, Slic3r::sla::Default, Slic3r::ConfigOptionDef::full_label, Slic3r::ConfigOptionDef::full_width, Slic3r::ConfigOptionEnum< T >::get_enum_names(), Slic3r::ConfigOptionDef::gui_flags, Slic3r::ConfigOptionDef::gui_type, Slic3r::ConfigOptionDef::height, init_sla_support_params(), L, Slic3r::ConfigOptionDef::label, Slic3r::ConfigOptionDef::max, Slic3r::ConfigOptionDef::min, Slic3r::ConfigOptionDef::mode, Slic3r::ConfigOptionDef::multiline, Slic3r::ConfigOptionIntsTempl< NULLABLE >::nil_value(), Slic3r::ConfigOptionDef::nocli, SCALING_FACTOR, Slic3r::ConfigOptionDef::select_open, Slic3r::ConfigOptionDef::set_default_value(), Slic3r::ConfigOptionDef::set_enum(), Slic3r::ConfigOptionDef::set_enum_values(), Slic3r::ConfigOptionDef::sidetext, Slic3r::sladoPortrait, Slic3r::slamsFast, and Slic3r::ConfigOptionDef::tooltip.

Referenced by PrintConfigDef().

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

◆ init_sla_support_params()

void Slic3r::PrintConfigDef::init_sla_support_params ( const std::string &  method_prefix)
private
3418{
3419 ConfigOptionDef* def;
3420
3421 def = this->add(prefix + "support_head_front_diameter", coFloat);
3422 def->label = L("Pinhead front diameter");
3423 def->category = L("Supports");
3424 def->tooltip = L("Diameter of the pointing side of the head");
3425 def->sidetext = L("mm");
3426 def->min = 0;
3427 def->mode = comAdvanced;
3428 def->set_default_value(new ConfigOptionFloat(0.4));
3429
3430 def = this->add(prefix + "support_head_penetration", coFloat);
3431 def->label = L("Head penetration");
3432 def->category = L("Supports");
3433 def->tooltip = L("How much the pinhead has to penetrate the model surface");
3434 def->sidetext = L("mm");
3435 def->mode = comAdvanced;
3436 def->min = 0;
3437 def->set_default_value(new ConfigOptionFloat(0.2));
3438
3439 def = this->add(prefix + "support_head_width", coFloat);
3440 def->label = L("Pinhead width");
3441 def->category = L("Supports");
3442 def->tooltip = L("Width from the back sphere center to the front sphere center");
3443 def->sidetext = L("mm");
3444 def->min = 0;
3445 def->max = 20;
3446 def->mode = comAdvanced;
3447 def->set_default_value(new ConfigOptionFloat(1.0));
3448
3449 def = this->add(prefix + "support_pillar_diameter", coFloat);
3450 def->label = L("Pillar diameter");
3451 def->category = L("Supports");
3452 def->tooltip = L("Diameter in mm of the support pillars");
3453 def->sidetext = L("mm");
3454 def->min = 0;
3455 def->max = 15;
3456 def->mode = comSimple;
3457 def->set_default_value(new ConfigOptionFloat(1.0));
3458
3459 def = this->add(prefix + "support_small_pillar_diameter_percent", coPercent);
3460 def->label = L("Small pillar diameter percent");
3461 def->category = L("Supports");
3462 def->tooltip = L("The percentage of smaller pillars compared to the normal pillar diameter "
3463 "which are used in problematic areas where a normal pilla cannot fit.");
3464 def->sidetext = L("%");
3465 def->min = 1;
3466 def->max = 100;
3467 def->mode = comExpert;
3468 def->set_default_value(new ConfigOptionPercent(50));
3469
3470 def = this->add(prefix + "support_max_bridges_on_pillar", coInt);
3471 def->label = L("Max bridges on a pillar");
3472 def->tooltip = L(
3473 "Maximum number of bridges that can be placed on a pillar. Bridges "
3474 "hold support point pinheads and connect to pillars as small branches.");
3475 def->min = 0;
3476 def->max = 50;
3477 def->mode = comExpert;
3478 def->set_default_value(new ConfigOptionInt(prefix == "branching" ? 2 : 3));
3479
3480 def = this->add(prefix + "support_max_weight_on_model", coFloat);
3481 def->label = L("Max weight on model");
3482 def->category = L("Supports");
3483 def->tooltip = L(
3484 "Maximum weight of sub-trees that terminate on the model instead of the print bed. The weight is the sum of the lenghts of all "
3485 "branches emanating from the endpoint.");
3486 def->sidetext = L("mm");
3487 def->min = 0;
3488 def->mode = comExpert;
3489 def->set_default_value(new ConfigOptionFloat(10.));
3490
3491 def = this->add(prefix + "support_pillar_connection_mode", coEnum);
3492 def->label = L("Pillar connection mode");
3493 def->tooltip = L("Controls the bridge type between two neighboring pillars."
3494 " Can be zig-zag, cross (double zig-zag) or dynamic which"
3495 " will automatically switch between the first two depending"
3496 " on the distance of the two pillars.");
3497 def->set_enum<SLAPillarConnectionMode>(
3499 { L("Zig-Zag"), L("Cross"), L("Dynamic") });
3500 def->mode = comAdvanced;
3501 def->set_default_value(new ConfigOptionEnum(SLAPillarConnectionMode::dynamic));
3502
3503 def = this->add(prefix + "support_buildplate_only", coBool);
3504 def->label = L("Support on build plate only");
3505 def->category = L("Supports");
3506 def->tooltip = L("Only create support if it lies on a build plate. Don't create support on a print.");
3507 def->mode = comSimple;
3508 def->set_default_value(new ConfigOptionBool(false));
3509
3510 def = this->add(prefix + "support_pillar_widening_factor", coFloat);
3511 def->label = L("Pillar widening factor");
3512 def->category = L("Supports");
3513
3514 def->tooltip =
3515 L("Merging bridges or pillars into another pillars can "
3516 "increase the radius. Zero means no increase, one means "
3517 "full increase. The exact amount of increase is unspecified and can "
3518 "change in the future.");
3519
3520 def->min = 0;
3521 def->max = 1;
3522 def->mode = comExpert;
3523 def->set_default_value(new ConfigOptionFloat(0.5));
3524
3525 def = this->add(prefix + "support_base_diameter", coFloat);
3526 def->label = L("Support base diameter");
3527 def->category = L("Supports");
3528 def->tooltip = L("Diameter in mm of the pillar base");
3529 def->sidetext = L("mm");
3530 def->min = 0;
3531 def->max = 30;
3532 def->mode = comAdvanced;
3533 def->set_default_value(new ConfigOptionFloat(4.0));
3534
3535 def = this->add(prefix + "support_base_height", coFloat);
3536 def->label = L("Support base height");
3537 def->category = L("Supports");
3538 def->tooltip = L("The height of the pillar base cone");
3539 def->sidetext = L("mm");
3540 def->min = 0;
3541 def->mode = comAdvanced;
3542 def->set_default_value(new ConfigOptionFloat(1.0));
3543
3544 def = this->add(prefix + "support_base_safety_distance", coFloat);
3545 def->label = L("Support base safety distance");
3546 def->category = L("Supports");
3547 def->tooltip = L(
3548 "The minimum distance of the pillar base from the model in mm. "
3549 "Makes sense in zero elevation mode where a gap according "
3550 "to this parameter is inserted between the model and the pad.");
3551 def->sidetext = L("mm");
3552 def->min = 0;
3553 def->max = 10;
3554 def->mode = comExpert;
3555 def->set_default_value(new ConfigOptionFloat(1));
3556
3557 def = this->add(prefix + "support_critical_angle", coFloat);
3558 def->label = L("Critical angle");
3559 def->category = L("Supports");
3560 def->tooltip = L("The default angle for connecting support sticks and junctions.");
3561 def->sidetext = L("°");
3562 def->min = 0;
3563 def->max = 90;
3564 def->mode = comExpert;
3565 def->set_default_value(new ConfigOptionFloat(45));
3566
3567 def = this->add(prefix + "support_max_bridge_length", coFloat);
3568 def->label = L("Max bridge length");
3569 def->category = L("Supports");
3570 def->tooltip = L("The max length of a bridge");
3571 def->sidetext = L("mm");
3572 def->min = 0;
3573 def->mode = comAdvanced;
3574
3575 double default_val = 15.0;
3576 if (prefix == "branching")
3577 default_val = 5.0;
3578
3579 def->set_default_value(new ConfigOptionFloat(default_val));
3580
3581 def = this->add(prefix + "support_max_pillar_link_distance", coFloat);
3582 def->label = L("Max pillar linking distance");
3583 def->category = L("Supports");
3584 def->tooltip = L("The max distance of two pillars to get linked with each other."
3585 " A zero value will prohibit pillar cascading.");
3586 def->sidetext = L("mm");
3587 def->min = 0; // 0 means no linking
3588 def->mode = comAdvanced;
3589 def->set_default_value(new ConfigOptionFloat(10.0));
3590
3591 def = this->add(prefix + "support_object_elevation", coFloat);
3592 def->label = L("Object elevation");
3593 def->category = L("Supports");
3594 def->tooltip = L("How much the supports should lift up the supported object. "
3595 "If \"Pad around object\" is enabled, this value is ignored.");
3596 def->sidetext = L("mm");
3597 def->min = 0;
3598 def->max = 150; // This is the max height of print on SL1
3599 def->mode = comAdvanced;
3600 def->set_default_value(new ConfigOptionFloat(5.0));
3601}
sla::PillarConnectionMode SLAPillarConnectionMode
Definition PrintConfig.hpp:115

References Slic3r::ConfigDef::add(), Slic3r::ConfigOptionDef::category, Slic3r::coBool, Slic3r::coEnum, Slic3r::coFloat, Slic3r::coInt, Slic3r::comAdvanced, Slic3r::comExpert, Slic3r::comSimple, Slic3r::coPercent, Slic3r::ConfigOptionEnum< T >::get_enum_names(), L, Slic3r::ConfigOptionDef::label, Slic3r::ConfigOptionDef::max, Slic3r::ConfigOptionDef::min, Slic3r::ConfigOptionDef::mode, Slic3r::ConfigOptionDef::set_default_value(), Slic3r::ConfigOptionDef::set_enum(), Slic3r::ConfigOptionDef::sidetext, and Slic3r::ConfigOptionDef::tooltip.

Referenced by init_sla_params().

+ 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
2073 {
2074 std::vector<std::string> out;
2075 out.reserve(options.size());
2076 for(auto const& kvp : options)
2077 out.push_back(kvp.first);
2078 return out;
2079 }

References Slic3r::ConfigDef::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
332{
333 // prepare a function for wrapping text
334 auto wrap = [](const std::string& text, size_t line_length) -> std::string {
335 std::istringstream words(text);
336 std::ostringstream wrapped;
337 std::string word;
338
339 if (words >> word) {
340 wrapped << word;
341 size_t space_left = line_length - word.length();
342 while (words >> word) {
343 if (space_left < word.length() + 1) {
344 wrapped << '\n' << word;
345 space_left = line_length - word.length();
346 } else {
347 wrapped << ' ' << word;
348 space_left -= word.length() + 1;
349 }
350 }
351 }
352 return wrapped.str();
353 };
354
355 // get the unique categories
356 std::set<std::string> categories;
357 for (const auto& opt : this->options) {
358 const ConfigOptionDef& def = opt.second;
359 if (filter(def))
360 categories.insert(def.category);
361 }
362
363 for (const std::string& category : categories) {
364 if (category != "") {
365 out << category << ":" << std::endl;
366 } else if (categories.size() > 1) {
367 out << "Misc options:" << std::endl;
368 }
369
370 for (const auto& opt : this->options) {
371 const ConfigOptionDef& def = opt.second;
372 if (def.category != category || def.cli == ConfigOptionDef::nocli || !filter(def))
373 continue;
374
375 // get all possible variations: --foo, --foobar, -f...
376 std::vector<std::string> cli_args = def.cli_args(opt.first);
377 if (cli_args.empty())
378 continue;
379
380 for (auto& arg : cli_args) {
381 arg.insert(0, (arg.size() == 1) ? "-" : "--");
382 if (def.type == coFloat || def.type == coInt || def.type == coFloatOrPercent
383 || def.type == coFloats || def.type == coInts) {
384 arg += " N";
385 } else if (def.type == coPoint) {
386 arg += " X,Y";
387 } else if (def.type == coPoint3) {
388 arg += " X,Y,Z";
389 } else if (def.type == coString || def.type == coStrings) {
390 arg += " ABCD";
391 }
392 }
393
394 // left: command line options
395 const std::string cli = boost::algorithm::join(cli_args, ", ");
396 out << " " << std::left << std::setw(20) << cli;
397
398 // right: option description
399 std::string descr = def.tooltip;
400 bool show_defaults_this = show_defaults || def.opt_key == "config_compatibility";
401 if (show_defaults_this && def.default_value && def.type != coBool
402 && (def.type != coString || !def.default_value->serialize().empty())) {
403 descr += " (";
404 if (!def.sidetext.empty()) {
405 descr += def.sidetext + ", ";
406 } else if (def.enum_def->has_values()) {
407 descr += boost::algorithm::join(def.enum_def->values(), ", ") + "; ";
408 }
409 descr += "default: " + def.default_value->serialize() + ")";
410 }
411
412 // wrap lines of description
413 descr = wrap(descr, 80);
414 std::vector<std::string> lines;
415 boost::split(lines, descr, boost::is_any_of("\n"));
416
417 // if command line options are too long, print description in new line
418 for (size_t i = 0; i < lines.size(); ++i) {
419 if (i == 0 && cli.size() > 19)
420 out << std::endl;
421 if (i > 0 || cli.size() > 19)
422 out << std::string(21, ' ');
423 out << lines[i] << std::endl;
424 }
425 }
426 }
427 return out;
428}
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const ArgReturnType arg() const
Definition ArrayCwiseUnaryOps.h:57
@ coPoint
Definition Config.hpp:184
@ coPoint3
Definition Config.hpp:187

References arg(), Slic3r::ConfigOptionDef::category, Slic3r::ConfigOptionDef::cli, Slic3r::ConfigOptionDef::cli_args(), Slic3r::coBool, Slic3r::coFloat, Slic3r::coFloatOrPercent, Slic3r::coFloats, Slic3r::coInt, Slic3r::coInts, Slic3r::coPoint, Slic3r::coPoint3, Slic3r::coString, Slic3r::coStrings, Slic3r::ConfigOptionDef::default_value, Slic3r::ConfigOptionDef::enum_def, Slic3r::ConfigOptionDef::nocli, Slic3r::ConfigOptionDef::opt_key, Slic3r::ConfigDef::options, Slic3r::ConfigOptionDef::sidetext, Slic3r::ConfigOptionDef::tooltip, and Slic3r::ConfigOptionDef::type.

Referenced by Slic3r::CLI::print_help().

+ Here is the call graph for this function:
+ Here is the caller 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

◆ options


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