2016-09-13 13:30:00 +02:00
// Configuration store of Slic3r.
//
// The configuration store is either static or dynamic.
// DynamicPrintConfig is used mainly at the user interface. while the StaticPrintConfig is used
// during the slicing and the g-code generation.
//
// The classes derived from StaticPrintConfig form a following hierarchy.
//
// FullPrintConfig
// PrintObjectConfig
// PrintRegionConfig
// PrintConfig
// GCodeConfig
//
2013-12-21 16:15:41 +01:00
#ifndef slic3r_PrintConfig_hpp_
#define slic3r_PrintConfig_hpp_
2015-12-08 00:39:54 +01:00
#include "libslic3r.h"
2013-12-21 16:15:41 +01:00
#include "Config.hpp"
2019-01-29 18:07:45 +01:00
// #define HAS_PRESSURE_EQUALIZER
2013-12-21 16:15:41 +01:00
namespace Slic3r {
2019-08-29 13:17:10 +02:00
enum GCodeFlavor : unsigned char {
2020-08-21 14:07:50 +10:00
gcfRepRapSprinter , gcfRepRapFirmware , gcfRepetier , gcfTeacup , gcfMakerWare , gcfMarlin , gcfSailfish , gcfMach3 , gcfMachinekit ,
2018-01-06 18:49:28 +01:00
gcfSmoothie , gcfNoExtrusion ,
2013-12-21 16:15:41 +01:00
};
2020-10-02 17:31:55 +02:00
enum class MachineLimitsUsage {
EmitToGCode ,
TimeEstimateOnly ,
Ignore ,
Count ,
};
2018-07-08 14:32:48 +02:00
enum PrintHostType {
2020-10-28 09:51:05 +01:00
htOctoPrint , htDuet , htFlashAir , htAstroBox , htRepetier
2018-07-08 14:32:48 +02:00
};
2020-06-25 12:58:59 +02:00
enum AuthorizationType {
atKeyPassword , atUserPassword
};
2021-02-10 16:02:32 +01:00
enum class FuzzySkinType {
2021-01-22 17:51:26 +01:00
None ,
External ,
2021-02-10 16:02:32 +01:00
All ,
2021-01-22 17:51:26 +01:00
};
2020-05-26 17:42:57 +02:00
enum InfillPattern : int {
2020-11-21 14:10:10 +01:00
ipRectilinear , ipMonotonic , ipAlignedRectilinear , ipGrid , ipTriangles , ipStars , ipCubic , ipLine , ipConcentric , ipHoneycomb , ip3DHoneycomb ,
2020-09-10 16:53:08 +02:00
ipGyroid , ipHilbertCurve , ipArchimedeanChords , ipOctagramSpiral , ipAdaptiveCubic , ipSupportCubic , ipCount ,
2013-12-22 00:39:03 +01:00
};
2020-04-14 11:53:28 +02:00
enum class IroningType {
TopSurfaces ,
TopmostOnly ,
AllSolid ,
Count ,
};
2014-01-05 16:51:16 +01:00
enum SupportMaterialPattern {
2018-03-14 20:08:34 +01:00
smpRectilinear , smpRectilinearGrid , smpHoneycomb ,
2014-01-05 16:51:16 +01:00
};
2021-02-24 15:59:09 +01:00
enum SupportMaterialInterfacePattern {
smipAuto , smipRectilinear , smipConcentric ,
};
2014-05-24 22:10:28 +02:00
enum SeamPosition {
2017-02-07 18:46:02 +01:00
spRandom , spNearest , spAligned , spRear
2014-05-22 19:34:49 +02:00
};
2019-08-02 16:15:27 +02:00
enum SLAMaterial {
slamTough ,
slamFlex ,
slamCasting ,
slamDental ,
slamHeatResistant ,
};
2018-12-13 12:42:45 +01:00
enum SLADisplayOrientation {
sladoLandscape ,
sladoPortrait
};
2019-01-09 12:21:43 +01:00
enum SLAPillarConnectionMode {
slapcmZigZag ,
slapcmCross ,
slapcmDynamic
};
2021-02-03 15:12:53 +01:00
enum BrimType {
btNoBrim ,
btOuterOnly ,
btInnerOnly ,
btOuterAndInner ,
};
2018-07-31 15:09:57 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < PrinterTechnology >:: get_enum_values () {
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "FFF" ] = ptFFF ;
keys_map [ "SLA" ] = ptSLA ;
}
return keys_map ;
}
template <> inline const t_config_enum_values & ConfigOptionEnum < GCodeFlavor >:: get_enum_values () {
2017-10-17 16:01:18 +02:00
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
2020-08-21 14:07:50 +10:00
keys_map [ "reprap" ] = gcfRepRapSprinter ;
keys_map [ "reprapfirmware" ] = gcfRepRapFirmware ;
2017-10-17 16:01:18 +02:00
keys_map [ "repetier" ] = gcfRepetier ;
keys_map [ "teacup" ] = gcfTeacup ;
keys_map [ "makerware" ] = gcfMakerWare ;
2018-01-06 18:49:28 +01:00
keys_map [ "marlin" ] = gcfMarlin ;
2017-10-17 16:01:18 +02:00
keys_map [ "sailfish" ] = gcfSailfish ;
keys_map [ "smoothie" ] = gcfSmoothie ;
keys_map [ "mach3" ] = gcfMach3 ;
keys_map [ "machinekit" ] = gcfMachinekit ;
keys_map [ "no-extrusion" ] = gcfNoExtrusion ;
}
2013-12-21 16:15:41 +01:00
return keys_map ;
}
2020-10-02 17:31:55 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < MachineLimitsUsage >:: get_enum_values () {
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "emit_to_gcode" ] = int ( MachineLimitsUsage :: EmitToGCode );
keys_map [ "time_estimate_only" ] = int ( MachineLimitsUsage :: TimeEstimateOnly );
keys_map [ "ignore" ] = int ( MachineLimitsUsage :: Ignore );
}
return keys_map ;
}
2018-08-24 12:54:21 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < PrintHostType >:: get_enum_values () {
2018-07-08 14:32:48 +02:00
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "octoprint" ] = htOctoPrint ;
keys_map [ "duet" ] = htDuet ;
2019-05-07 19:51:14 +02:00
keys_map [ "flashair" ] = htFlashAir ;
2019-12-28 10:41:48 -07:00
keys_map [ "astrobox" ] = htAstroBox ;
2020-10-28 09:51:05 +01:00
keys_map [ "repetier" ] = htRepetier ;
2018-07-08 14:32:48 +02:00
}
return keys_map ;
}
2020-06-25 12:58:59 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < AuthorizationType >:: get_enum_values () {
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "key" ] = atKeyPassword ;
keys_map [ "user" ] = atUserPassword ;
}
return keys_map ;
}
2021-02-10 16:02:32 +01:00
template <> inline const t_config_enum_values & ConfigOptionEnum < FuzzySkinType >:: get_enum_values () {
2021-01-22 17:51:26 +01:00
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
2021-02-10 16:02:32 +01:00
keys_map [ "none" ] = int ( FuzzySkinType :: None );
keys_map [ "external" ] = int ( FuzzySkinType :: External );
keys_map [ "all" ] = int ( FuzzySkinType :: All );
2021-01-22 17:51:26 +01:00
}
return keys_map ;
}
2018-08-24 12:54:21 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < InfillPattern >:: get_enum_values () {
2017-10-17 16:01:18 +02:00
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "rectilinear" ] = ipRectilinear ;
2020-10-05 16:38:28 +02:00
keys_map [ "monotonic" ] = ipMonotonic ;
2020-11-21 14:10:10 +01:00
keys_map [ "alignedrectilinear" ] = ipAlignedRectilinear ;
2017-10-17 16:01:18 +02:00
keys_map [ "grid" ] = ipGrid ;
keys_map [ "triangles" ] = ipTriangles ;
keys_map [ "stars" ] = ipStars ;
keys_map [ "cubic" ] = ipCubic ;
keys_map [ "line" ] = ipLine ;
keys_map [ "concentric" ] = ipConcentric ;
keys_map [ "honeycomb" ] = ipHoneycomb ;
keys_map [ "3dhoneycomb" ] = ip3DHoneycomb ;
2018-02-22 09:56:05 +01:00
keys_map [ "gyroid" ] = ipGyroid ;
2017-10-17 16:01:18 +02:00
keys_map [ "hilbertcurve" ] = ipHilbertCurve ;
keys_map [ "archimedeanchords" ] = ipArchimedeanChords ;
keys_map [ "octagramspiral" ] = ipOctagramSpiral ;
2020-08-26 16:51:34 +02:00
keys_map [ "adaptivecubic" ] = ipAdaptiveCubic ;
2020-09-10 16:53:08 +02:00
keys_map [ "supportcubic" ] = ipSupportCubic ;
2017-10-17 16:01:18 +02:00
}
2013-12-22 00:39:03 +01:00
return keys_map ;
}
2020-04-14 11:53:28 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < IroningType >:: get_enum_values () {
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "top" ] = int ( IroningType :: TopSurfaces );
keys_map [ "topmost" ] = int ( IroningType :: TopmostOnly );
keys_map [ "solid" ] = int ( IroningType :: AllSolid );
}
return keys_map ;
}
2018-07-31 15:09:57 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < SupportMaterialPattern >:: get_enum_values () {
2017-10-17 16:01:18 +02:00
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "rectilinear" ] = smpRectilinear ;
keys_map [ "rectilinear-grid" ] = smpRectilinearGrid ;
keys_map [ "honeycomb" ] = smpHoneycomb ;
}
2014-01-05 16:51:16 +01:00
return keys_map ;
}
2021-02-24 15:59:09 +01:00
template <> inline const t_config_enum_values & ConfigOptionEnum < SupportMaterialInterfacePattern >:: get_enum_values () {
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "auto" ] = smipAuto ;
keys_map [ "rectilinear" ] = smipRectilinear ;
keys_map [ "concentric" ] = smipConcentric ;
}
return keys_map ;
}
2018-07-31 15:09:57 +02:00
template <> inline const t_config_enum_values & ConfigOptionEnum < SeamPosition >:: get_enum_values () {
2017-10-17 16:01:18 +02:00
static t_config_enum_values keys_map ;
if ( keys_map . empty ()) {
keys_map [ "random" ] = spRandom ;
keys_map [ "nearest" ] = spNearest ;
keys_map [ "aligned" ] = spAligned ;
keys_map [ "rear" ] = spRear ;
}
2014-05-22 19:34:49 +02:00
return keys_map ;
}
2018-12-13 12:42:45 +01:00
template <> inline const t_config_enum_values & ConfigOptionEnum < SLADisplayOrientation >:: get_enum_values () {
static const t_config_enum_values keys_map = {
2018-12-14 17:19:17 +01:00
{ "landscape" , sladoLandscape },
{ "portrait" , sladoPortrait }
2018-12-13 12:42:45 +01:00
};
return keys_map ;
}
2019-01-09 12:21:43 +01:00
template <> inline const t_config_enum_values & ConfigOptionEnum < SLAPillarConnectionMode >:: get_enum_values () {
static const t_config_enum_values keys_map = {
{ "zigzag" , slapcmZigZag },
{ "cross" , slapcmCross },
{ "dynamic" , slapcmDynamic }
};
return keys_map ;
}
2021-02-03 15:12:53 +01:00
template <> inline const t_config_enum_values & ConfigOptionEnum < BrimType >:: get_enum_values () {
static const t_config_enum_values keys_map = {
{ "no_brim" , btNoBrim },
{ "outer_only" , btOuterOnly },
{ "inner_only" , btInnerOnly },
{ "outer_and_inner" , btOuterAndInner }
};
return keys_map ;
}
2016-09-13 13:30:00 +02:00
// Defines each and every confiuration option of Slic3r, including the properties of the GUI dialogs.
// Does not store the actual values, but defines default values.
2015-12-07 19:39:49 +01:00
class PrintConfigDef : public ConfigDef
2013-12-21 16:15:41 +01:00
{
2017-10-17 16:01:18 +02:00
public :
2015-12-07 19:39:49 +01:00
PrintConfigDef ();
2017-10-17 16:01:18 +02:00
static void handle_legacy ( t_config_option_key & opt_key , std :: string & value );
2018-07-31 15:09:57 +02:00
2019-10-15 16:31:20 +02:00
// Array options growing with the number of extruders
const std :: vector < std :: string >& extruder_option_keys () const { return m_extruder_option_keys ; }
2019-07-25 14:39:19 +02:00
// Options defining the extruder retract properties. These keys are sorted lexicographically.
// The extruder retract keys could be overidden by the same values defined at the Filament level
// (then the key is further prefixed with the "filament_" prefix).
const std :: vector < std :: string >& extruder_retract_keys () const { return m_extruder_retract_keys ; }
2018-07-31 15:09:57 +02:00
private :
void init_common_params ();
void init_fff_params ();
2019-10-15 16:31:20 +02:00
void init_extruder_option_keys ();
2018-07-31 15:09:57 +02:00
void init_sla_params ();
2019-07-25 14:39:19 +02:00
2019-10-15 16:31:20 +02:00
std :: vector < std :: string > m_extruder_option_keys ;
2019-07-25 14:39:19 +02:00
std :: vector < std :: string > m_extruder_retract_keys ;
2013-12-21 16:15:41 +01:00
};
2016-09-13 13:30:00 +02:00
// The one and only global definition of SLic3r configuration options.
// This definition is constant.
2018-09-20 16:48:13 +02:00
extern const PrintConfigDef print_config_def ;
2015-12-07 19:39:49 +01:00
2019-10-16 11:16:50 +02:00
class StaticPrintConfig ;
2021-01-19 15:17:47 +01:00
// Minimum object distance for arrangement, based on printer technology.
2020-04-23 18:17:37 +02:00
double min_object_distance ( const ConfigBase & cfg );
2018-11-19 13:13:05 +01:00
// Slic3r dynamic configuration, used to override the configuration
2016-09-13 13:30:00 +02:00
// per object, per modification volume or per printing material.
// The dynamic configuration is also used to store user modifications of the print global parameters,
// so the modified configuration values may be diffed against the active configuration
// to invalidate the proper slicing resp. g-code generation processing steps.
// This object is mapped to Perl as Slic3r::Config.
2017-10-17 16:01:18 +02:00
class DynamicPrintConfig : public DynamicConfig
2015-12-07 19:39:49 +01:00
{
2017-10-17 16:01:18 +02:00
public :
DynamicPrintConfig () {}
2019-10-16 11:16:50 +02:00
DynamicPrintConfig ( const DynamicPrintConfig & rhs ) : DynamicConfig ( rhs ) {}
2020-08-26 21:51:50 +02:00
DynamicPrintConfig ( DynamicPrintConfig && rhs ) noexcept : DynamicConfig ( std :: move ( rhs )) {}
2019-10-16 11:16:50 +02:00
explicit DynamicPrintConfig ( const StaticPrintConfig & rhs );
explicit DynamicPrintConfig ( const ConfigBase & rhs ) : DynamicConfig ( rhs ) {}
2017-10-17 16:01:18 +02:00
2020-08-26 21:51:50 +02:00
DynamicPrintConfig & operator = ( const DynamicPrintConfig & rhs ) { DynamicConfig :: operator = ( rhs ); return * this ; }
DynamicPrintConfig & operator = ( DynamicPrintConfig && rhs ) noexcept { DynamicConfig :: operator = ( std :: move ( rhs )); return * this ; }
2019-10-16 11:16:50 +02:00
static DynamicPrintConfig full_print_config ();
2017-10-27 18:52:35 +02:00
static DynamicPrintConfig * new_from_defaults_keys ( const std :: vector < std :: string > & keys );
2017-10-17 16:01:18 +02:00
// Overrides ConfigBase::def(). Static configuration definition. Any value stored into this ConfigBase shall have its definition here.
const ConfigDef * def () const override { return & print_config_def ; }
2020-09-24 19:03:09 +02:00
void normalize_fdm ();
2017-10-17 16:01:18 +02:00
2019-10-15 16:31:20 +02:00
void set_num_extruders ( unsigned int num_extruders );
2017-10-17 16:01:18 +02:00
// Validate the PrintConfig. Returns an empty string on success, otherwise an error message is returned.
std :: string validate ();
2018-04-13 13:43:53 +02:00
// Verify whether the opt_key has not been obsoleted or renamed.
// Both opt_key and value may be modified by handle_legacy().
// If the opt_key is no more valid in this version of Slic3r, opt_key is cleared by handle_legacy().
// handle_legacy() is called internally by set_deserialize().
void handle_legacy ( t_config_option_key & opt_key , std :: string & value ) const override
{ PrintConfigDef :: handle_legacy ( opt_key , value ); }
2014-03-26 00:08:15 +01:00
};
2017-10-17 16:01:18 +02:00
class StaticPrintConfig : public StaticConfig
2014-03-26 00:08:15 +01:00
{
2017-10-17 16:01:18 +02:00
public :
StaticPrintConfig () {}
// Overrides ConfigBase::def(). Static configuration definition. Any value stored into this ConfigBase shall have its definition here.
const ConfigDef * def () const override { return & print_config_def ; }
2019-10-16 11:16:50 +02:00
// Reference to the cached list of keys.
virtual const t_config_option_keys & keys_ref () const = 0 ;
2017-10-17 16:01:18 +02:00
protected :
// Verify whether the opt_key has not been obsoleted or renamed.
// Both opt_key and value may be modified by handle_legacy().
// If the opt_key is no more valid in this version of Slic3r, opt_key is cleared by handle_legacy().
// handle_legacy() is called internally by set_deserialize().
void handle_legacy ( t_config_option_key & opt_key , std :: string & value ) const override
{ PrintConfigDef :: handle_legacy ( opt_key , value ); }
// Internal class for keeping a dynamic map to static options.
class StaticCacheBase
{
2014-03-26 00:08:15 +01:00
public :
2017-10-17 16:01:18 +02:00
// To be called during the StaticCache setup.
// Add one ConfigOption into m_map_name_to_offset.
template < typename T >
void opt_add ( const std :: string & name , const char * base_ptr , const T & opt )
{
assert ( m_map_name_to_offset . find ( name ) == m_map_name_to_offset . end ());
m_map_name_to_offset [ name ] = ( const char * ) & opt - base_ptr ;
}
protected :
std :: map < std :: string , ptrdiff_t > m_map_name_to_offset ;
};
// Parametrized by the type of the topmost class owning the options.
template < typename T >
class StaticCache : public StaticCacheBase
{
public :
// Calling the constructor of m_defaults with 0 forces m_defaults to not run the initialization.
StaticCache () : m_defaults ( nullptr ) {}
~ StaticCache () { delete m_defaults ; m_defaults = nullptr ; }
bool initialized () const { return ! m_keys . empty (); }
ConfigOption * optptr ( const std :: string & name , T * owner ) const
{
const auto it = m_map_name_to_offset . find ( name );
return ( it == m_map_name_to_offset . end ()) ? nullptr : reinterpret_cast < ConfigOption *> (( char * ) owner + it -> second );
}
const ConfigOption * optptr ( const std :: string & name , const T * owner ) const
{
const auto it = m_map_name_to_offset . find ( name );
return ( it == m_map_name_to_offset . end ()) ? nullptr : reinterpret_cast < const ConfigOption *> (( const char * ) owner + it -> second );
}
const std :: vector < std :: string >& keys () const { return m_keys ; }
const T & defaults () const { return * m_defaults ; }
// To be called during the StaticCache setup.
// Collect option keys from m_map_name_to_offset,
// assign default values to m_defaults.
void finalize ( T * defaults , const ConfigDef * defs )
{
assert ( defs != nullptr );
m_defaults = defaults ;
m_keys . clear ();
m_keys . reserve ( m_map_name_to_offset . size ());
2018-11-19 13:13:05 +01:00
for ( const auto & kvp : defs -> options ) {
// Find the option given the option name kvp.first by an offset from (char*)m_defaults.
ConfigOption * opt = this -> optptr ( kvp . first , m_defaults );
if ( opt == nullptr )
// This option is not defined by the ConfigBase of type T.
continue ;
2017-10-17 16:01:18 +02:00
m_keys . emplace_back ( kvp . first );
const ConfigOptionDef * def = defs -> get ( kvp . first );
assert ( def != nullptr );
2019-05-03 18:01:39 +02:00
if ( def -> default_value )
opt -> set ( def -> default_value . get ());
2017-10-17 16:01:18 +02:00
}
}
private :
T * m_defaults ;
std :: vector < std :: string > m_keys ;
};
2014-03-26 00:08:15 +01:00
};
2017-10-17 16:01:18 +02:00
#define STATIC_PRINT_CONFIG_CACHE_BASE(CLASS_NAME) \
public: \
/* Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. */ \
2020-02-04 14:43:58 +01:00
const ConfigOption* optptr(const t_config_option_key &opt_key) const override \
{ return s_cache_##CLASS_NAME.optptr(opt_key, this); } \
/* Overrides ConfigBase::optptr(). Find ando/or create a ConfigOption instance for a given name. */ \
2017-10-17 16:01:18 +02:00
ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) override \
2017-10-17 17:37:03 +02:00
{ return s_cache_##CLASS_NAME.optptr(opt_key, this); } \
2017-10-17 16:01:18 +02:00
/* Overrides ConfigBase::keys(). Collect names of all configuration values maintained by this configuration store. */ \
2017-10-17 17:37:03 +02:00
t_config_option_keys keys() const override { return s_cache_##CLASS_NAME.keys(); } \
2019-10-16 11:16:50 +02:00
const t_config_option_keys& keys_ref() const override { return s_cache_##CLASS_NAME.keys(); } \
2017-10-17 17:37:03 +02:00
static const CLASS_NAME& defaults() { initialize_cache(); return s_cache_##CLASS_NAME.defaults(); } \
private: \
2017-10-17 16:01:18 +02:00
static void initialize_cache() \
{ \
2017-10-17 17:37:03 +02:00
if (! s_cache_##CLASS_NAME.initialized()) { \
2017-10-17 16:01:18 +02:00
CLASS_NAME *inst = new CLASS_NAME(1); \
2017-10-17 17:37:03 +02:00
inst->initialize(s_cache_##CLASS_NAME, (const char*)inst); \
s_cache_##CLASS_NAME.finalize(inst, inst->def()); \
2017-10-17 16:01:18 +02:00
} \
} \
/* Cache object holding a key/option map, a list of option keys and a copy of this static config initialized with the defaults. */ \
2017-10-17 17:48:04 +02:00
static StaticPrintConfig::StaticCache<CLASS_NAME> s_cache_##CLASS_NAME;
2017-10-17 16:01:18 +02:00
#define STATIC_PRINT_CONFIG_CACHE(CLASS_NAME) \
STATIC_PRINT_CONFIG_CACHE_BASE(CLASS_NAME) \
public: \
/* Public default constructor will initialize the key/option cache and the default object copy if needed. */ \
2017-10-17 17:37:03 +02:00
CLASS_NAME() { initialize_cache(); *this = s_cache_##CLASS_NAME.defaults(); } \
2017-10-17 16:01:18 +02:00
protected: \
/* Protected constructor to be called when compounded. */ \
CLASS_NAME(int) {}
#define STATIC_PRINT_CONFIG_CACHE_DERIVED(CLASS_NAME) \
STATIC_PRINT_CONFIG_CACHE_BASE(CLASS_NAME) \
public: \
/* Overrides ConfigBase::def(). Static configuration definition. Any value stored into this ConfigBase shall have its definition here. */ \
const ConfigDef* def() const override { return &print_config_def; } \
/* Handle legacy and obsoleted config keys */ \
void handle_legacy(t_config_option_key &opt_key, std::string &value) const override \
{ PrintConfigDef::handle_legacy(opt_key, value); }
#define OPT_PTR(KEY) cache.opt_add(#KEY, base_ptr, this->KEY)
2016-09-13 13:30:00 +02:00
// This object is mapped to Perl as Slic3r::Config::PrintObject.
2017-10-17 16:01:18 +02:00
class PrintObjectConfig : public StaticPrintConfig
2013-12-31 15:52:37 +01:00
{
2017-10-17 16:01:18 +02:00
STATIC_PRINT_CONFIG_CACHE ( PrintObjectConfig )
2017-05-31 17:02:23 +02:00
public :
2021-02-03 15:12:53 +01:00
ConfigOptionFloat brim_offset ;
ConfigOptionEnum < BrimType > brim_type ;
ConfigOptionFloat brim_width ;
2017-02-14 12:36:04 +01:00
ConfigOptionBool clip_multipart_objects ;
2014-04-26 17:19:50 +02:00
ConfigOptionBool dont_support_bridges ;
2017-06-26 16:28:10 +02:00
ConfigOptionFloat elefant_foot_compensation ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloatOrPercent extrusion_width ;
ConfigOptionFloatOrPercent first_layer_height ;
2014-01-02 17:24:23 +01:00
ConfigOptionBool infill_only_where_needed ;
2018-09-17 15:12:13 +02:00
// Force the generation of solid shells between adjacent materials/volumes.
2014-03-25 01:11:28 +01:00
ConfigOptionBool interface_shells ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat layer_height ;
2021-02-24 09:22:31 +01:00
ConfigOptionFloat raft_contact_distance ;
ConfigOptionFloat raft_expansion ;
2021-02-24 08:48:33 +01:00
ConfigOptionPercent raft_first_layer_density ;
ConfigOptionFloat raft_first_layer_expansion ;
2013-12-31 15:52:37 +01:00
ConfigOptionInt raft_layers ;
2014-05-24 22:10:28 +02:00
ConfigOptionEnum < SeamPosition > seam_position ;
2016-09-13 13:30:00 +02:00
// ConfigOptionFloat seam_preferred_direction;
// ConfigOptionFloat seam_preferred_direction_jitter;
2019-03-01 17:53:02 +01:00
ConfigOptionFloat slice_closing_radius ;
2013-12-31 15:52:37 +01:00
ConfigOptionBool support_material ;
2018-09-17 15:12:13 +02:00
// Automatic supports (generated based on support_material_threshold).
ConfigOptionBool support_material_auto ;
// Direction of the support pattern (in XY plane).
2017-07-20 13:38:10 +02:00
ConfigOptionFloat support_material_angle ;
2016-10-04 13:54:10 +02:00
ConfigOptionBool support_material_buildplate_only ;
2015-01-19 09:52:24 +01:00
ConfigOptionFloat support_material_contact_distance ;
2013-12-31 15:52:37 +01:00
ConfigOptionInt support_material_enforce_layers ;
ConfigOptionInt support_material_extruder ;
ConfigOptionFloatOrPercent support_material_extrusion_width ;
2016-11-30 17:33:55 +01:00
ConfigOptionBool support_material_interface_contact_loops ;
2013-12-31 15:52:37 +01:00
ConfigOptionInt support_material_interface_extruder ;
ConfigOptionInt support_material_interface_layers ;
2018-09-17 15:12:13 +02:00
// Spacing between interface lines (the hatching distance). Set zero to get a solid interface.
2013-12-31 15:52:37 +01:00
ConfigOptionFloat support_material_interface_spacing ;
2014-05-21 15:21:20 +02:00
ConfigOptionFloatOrPercent support_material_interface_speed ;
2014-01-05 16:51:16 +01:00
ConfigOptionEnum < SupportMaterialPattern > support_material_pattern ;
2021-02-24 19:53:50 +01:00
ConfigOptionEnum < SupportMaterialInterfacePattern > support_material_interface_pattern ;
2018-09-17 15:12:13 +02:00
// Spacing between support material lines (the hatching distance).
2013-12-31 15:52:37 +01:00
ConfigOptionFloat support_material_spacing ;
ConfigOptionFloat support_material_speed ;
2016-11-30 16:04:15 +01:00
ConfigOptionBool support_material_synchronize_layers ;
2018-09-17 15:12:13 +02:00
// Overhang angle threshold.
2013-12-31 15:52:37 +01:00
ConfigOptionInt support_material_threshold ;
2016-10-04 14:38:13 +02:00
ConfigOptionBool support_material_with_sheath ;
2017-01-05 09:12:24 +01:00
ConfigOptionFloatOrPercent support_material_xy_spacing ;
2014-06-10 13:28:57 +02:00
ConfigOptionFloat xy_size_compensation ;
2018-06-06 18:24:42 +02:00
ConfigOptionBool wipe_into_objects ;
2017-10-17 16:01:18 +02:00
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
2021-02-03 15:12:53 +01:00
OPT_PTR ( brim_offset );
OPT_PTR ( brim_type );
OPT_PTR ( brim_width );
2017-02-14 12:36:04 +01:00
OPT_PTR ( clip_multipart_objects );
2015-07-02 14:35:21 +02:00
OPT_PTR ( dont_support_bridges );
2017-06-26 16:28:10 +02:00
OPT_PTR ( elefant_foot_compensation );
2015-07-02 14:35:21 +02:00
OPT_PTR ( extrusion_width );
OPT_PTR ( first_layer_height );
OPT_PTR ( infill_only_where_needed );
OPT_PTR ( interface_shells );
OPT_PTR ( layer_height );
2021-02-24 09:22:31 +01:00
OPT_PTR ( raft_contact_distance );
OPT_PTR ( raft_expansion );
2021-02-24 08:48:33 +01:00
OPT_PTR ( raft_first_layer_density );
OPT_PTR ( raft_first_layer_expansion );
2015-07-02 14:35:21 +02:00
OPT_PTR ( raft_layers );
OPT_PTR ( seam_position );
2019-03-01 17:53:02 +01:00
OPT_PTR ( slice_closing_radius );
2016-09-13 13:30:00 +02:00
// OPT_PTR(seam_preferred_direction);
// OPT_PTR(seam_preferred_direction_jitter);
2015-07-02 14:35:21 +02:00
OPT_PTR ( support_material );
2018-09-17 15:12:13 +02:00
OPT_PTR ( support_material_auto );
2015-07-02 14:35:21 +02:00
OPT_PTR ( support_material_angle );
2016-10-04 13:54:10 +02:00
OPT_PTR ( support_material_buildplate_only );
2015-07-02 14:35:21 +02:00
OPT_PTR ( support_material_contact_distance );
OPT_PTR ( support_material_enforce_layers );
2016-11-30 17:33:55 +01:00
OPT_PTR ( support_material_interface_contact_loops );
2015-07-02 14:35:21 +02:00
OPT_PTR ( support_material_extruder );
OPT_PTR ( support_material_extrusion_width );
OPT_PTR ( support_material_interface_extruder );
OPT_PTR ( support_material_interface_layers );
OPT_PTR ( support_material_interface_spacing );
OPT_PTR ( support_material_interface_speed );
OPT_PTR ( support_material_pattern );
2021-02-24 15:59:09 +01:00
OPT_PTR ( support_material_interface_pattern );
2015-07-02 14:35:21 +02:00
OPT_PTR ( support_material_spacing );
OPT_PTR ( support_material_speed );
2016-11-30 16:04:15 +01:00
OPT_PTR ( support_material_synchronize_layers );
2016-03-19 22:30:02 -05:00
OPT_PTR ( support_material_xy_spacing );
2015-07-02 14:35:21 +02:00
OPT_PTR ( support_material_threshold );
2016-10-04 14:38:13 +02:00
OPT_PTR ( support_material_with_sheath );
2015-07-02 14:35:21 +02:00
OPT_PTR ( xy_size_compensation );
2018-06-06 18:24:42 +02:00
OPT_PTR ( wipe_into_objects );
2017-10-17 16:01:18 +02:00
}
2013-12-31 15:52:37 +01:00
};
2016-09-13 13:30:00 +02:00
// This object is mapped to Perl as Slic3r::Config::PrintRegion.
2017-10-17 16:01:18 +02:00
class PrintRegionConfig : public StaticPrintConfig
2013-12-31 15:52:37 +01:00
{
2017-10-17 16:01:18 +02:00
STATIC_PRINT_CONFIG_CACHE ( PrintRegionConfig )
2017-07-31 16:23:52 +02:00
public :
ConfigOptionFloat bridge_angle ;
2013-12-31 15:52:37 +01:00
ConfigOptionInt bottom_solid_layers ;
2020-02-05 16:53:26 +01:00
ConfigOptionFloat bottom_solid_min_thickness ;
2014-06-11 22:10:33 +02:00
ConfigOptionFloat bridge_flow_ratio ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloat bridge_speed ;
2016-10-16 22:11:19 +02:00
ConfigOptionBool ensure_vertical_shell_thickness ;
2019-02-22 15:25:35 +01:00
ConfigOptionEnum < InfillPattern > top_fill_pattern ;
ConfigOptionEnum < InfillPattern > bottom_fill_pattern ;
2014-06-09 21:14:48 +02:00
ConfigOptionFloatOrPercent external_perimeter_extrusion_width ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloatOrPercent external_perimeter_speed ;
2014-06-11 22:15:28 +02:00
ConfigOptionBool external_perimeters_first ;
2013-12-31 15:52:37 +01:00
ConfigOptionBool extra_perimeters ;
2015-12-16 12:58:06 +01:00
ConfigOptionFloat fill_angle ;
2014-03-22 16:23:33 +01:00
ConfigOptionPercent fill_density ;
2013-12-31 15:52:37 +01:00
ConfigOptionEnum < InfillPattern > fill_pattern ;
2021-02-10 16:02:32 +01:00
ConfigOptionEnum < FuzzySkinType > fuzzy_skin ;
ConfigOptionFloat fuzzy_skin_thickness ;
ConfigOptionFloat fuzzy_skin_point_dist ;
2021-02-10 17:28:56 +01:00
ConfigOptionBool gap_fill_enabled ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloat gap_fill_speed ;
2020-11-16 10:54:00 +01:00
ConfigOptionFloatOrPercent infill_anchor ;
2020-11-24 16:00:46 +01:00
ConfigOptionFloatOrPercent infill_anchor_max ;
2013-12-31 15:52:37 +01:00
ConfigOptionInt infill_extruder ;
ConfigOptionFloatOrPercent infill_extrusion_width ;
ConfigOptionInt infill_every_layers ;
2015-02-01 12:08:25 +01:00
ConfigOptionFloatOrPercent infill_overlap ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloat infill_speed ;
2020-04-14 11:53:28 +02:00
// Ironing options
ConfigOptionBool ironing ;
ConfigOptionEnum < IroningType > ironing_type ;
ConfigOptionPercent ironing_flowrate ;
ConfigOptionFloat ironing_spacing ;
ConfigOptionFloat ironing_speed ;
2018-09-17 15:12:13 +02:00
// Detect bridging perimeters
2014-05-12 23:02:33 +02:00
ConfigOptionBool overhangs ;
2013-12-31 15:52:37 +01:00
ConfigOptionInt perimeter_extruder ;
ConfigOptionFloatOrPercent perimeter_extrusion_width ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloat perimeter_speed ;
2018-09-17 15:12:13 +02:00
// Total number of perimeters.
2013-12-31 15:52:37 +01:00
ConfigOptionInt perimeters ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloatOrPercent small_perimeter_speed ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat solid_infill_below_area ;
2014-12-17 00:34:00 +01:00
ConfigOptionInt solid_infill_extruder ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloatOrPercent solid_infill_extrusion_width ;
ConfigOptionInt solid_infill_every_layers ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloatOrPercent solid_infill_speed ;
2018-09-17 15:12:13 +02:00
// Detect thin walls.
2013-12-31 15:52:37 +01:00
ConfigOptionBool thin_walls ;
ConfigOptionFloatOrPercent top_infill_extrusion_width ;
ConfigOptionInt top_solid_layers ;
2020-02-05 16:53:26 +01:00
ConfigOptionFloat top_solid_min_thickness ;
2014-05-15 18:49:11 +02:00
ConfigOptionFloatOrPercent top_solid_infill_speed ;
2018-06-21 10:16:52 +02:00
ConfigOptionBool wipe_into_infill ;
2018-11-19 13:13:05 +01:00
2017-10-17 16:01:18 +02:00
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
2017-07-31 16:23:52 +02:00
OPT_PTR ( bridge_angle );
2015-07-02 14:35:21 +02:00
OPT_PTR ( bottom_solid_layers );
2020-02-05 16:53:26 +01:00
OPT_PTR ( bottom_solid_min_thickness );
2015-07-02 14:35:21 +02:00
OPT_PTR ( bridge_flow_ratio );
OPT_PTR ( bridge_speed );
2016-10-16 22:11:19 +02:00
OPT_PTR ( ensure_vertical_shell_thickness );
2019-02-22 15:25:35 +01:00
OPT_PTR ( top_fill_pattern );
OPT_PTR ( bottom_fill_pattern );
2015-07-02 14:35:21 +02:00
OPT_PTR ( external_perimeter_extrusion_width );
OPT_PTR ( external_perimeter_speed );
OPT_PTR ( external_perimeters_first );
OPT_PTR ( extra_perimeters );
OPT_PTR ( fill_angle );
OPT_PTR ( fill_density );
OPT_PTR ( fill_pattern );
2021-02-10 16:02:32 +01:00
OPT_PTR ( fuzzy_skin );
OPT_PTR ( fuzzy_skin_thickness );
OPT_PTR ( fuzzy_skin_point_dist );
2021-02-10 17:28:56 +01:00
OPT_PTR ( gap_fill_enabled );
2015-07-02 14:35:21 +02:00
OPT_PTR ( gap_fill_speed );
2020-11-16 10:54:00 +01:00
OPT_PTR ( infill_anchor );
2020-11-24 16:00:46 +01:00
OPT_PTR ( infill_anchor_max );
2015-07-02 14:35:21 +02:00
OPT_PTR ( infill_extruder );
OPT_PTR ( infill_extrusion_width );
OPT_PTR ( infill_every_layers );
OPT_PTR ( infill_overlap );
OPT_PTR ( infill_speed );
2020-04-14 11:53:28 +02:00
OPT_PTR ( ironing );
OPT_PTR ( ironing_type );
OPT_PTR ( ironing_flowrate );
OPT_PTR ( ironing_spacing );
OPT_PTR ( ironing_speed );
2015-07-02 14:35:21 +02:00
OPT_PTR ( overhangs );
OPT_PTR ( perimeter_extruder );
OPT_PTR ( perimeter_extrusion_width );
OPT_PTR ( perimeter_speed );
OPT_PTR ( perimeters );
OPT_PTR ( small_perimeter_speed );
OPT_PTR ( solid_infill_below_area );
OPT_PTR ( solid_infill_extruder );
OPT_PTR ( solid_infill_extrusion_width );
OPT_PTR ( solid_infill_every_layers );
OPT_PTR ( solid_infill_speed );
OPT_PTR ( thin_walls );
OPT_PTR ( top_infill_extrusion_width );
OPT_PTR ( top_solid_infill_speed );
OPT_PTR ( top_solid_layers );
2020-02-05 16:53:26 +01:00
OPT_PTR ( top_solid_min_thickness );
2018-06-21 10:16:52 +02:00
OPT_PTR ( wipe_into_infill );
2017-10-17 16:01:18 +02:00
}
2013-12-31 15:52:37 +01:00
};
2018-06-20 13:57:37 +02:00
class MachineEnvelopeConfig : public StaticPrintConfig
{
STATIC_PRINT_CONFIG_CACHE ( MachineEnvelopeConfig )
public :
2020-10-02 17:31:55 +02:00
// Allowing the machine limits to be completely ignored or used just for time estimator.
2020-10-06 13:18:25 +02:00
ConfigOptionEnum < MachineLimitsUsage > machine_limits_usage ;
2018-06-20 13:57:37 +02:00
// M201 X... Y... Z... E... [mm/sec^2]
ConfigOptionFloats machine_max_acceleration_x ;
ConfigOptionFloats machine_max_acceleration_y ;
ConfigOptionFloats machine_max_acceleration_z ;
ConfigOptionFloats machine_max_acceleration_e ;
// M203 X... Y... Z... E... [mm/sec]
ConfigOptionFloats machine_max_feedrate_x ;
ConfigOptionFloats machine_max_feedrate_y ;
ConfigOptionFloats machine_max_feedrate_z ;
ConfigOptionFloats machine_max_feedrate_e ;
// M204 S... [mm/sec^2]
ConfigOptionFloats machine_max_acceleration_extruding ;
// M204 T... [mm/sec^2]
ConfigOptionFloats machine_max_acceleration_retracting ;
// M205 X... Y... Z... E... [mm/sec]
ConfigOptionFloats machine_max_jerk_x ;
ConfigOptionFloats machine_max_jerk_y ;
ConfigOptionFloats machine_max_jerk_z ;
ConfigOptionFloats machine_max_jerk_e ;
// M205 T... [mm/sec]
ConfigOptionFloats machine_min_travel_rate ;
// M205 S... [mm/sec]
ConfigOptionFloats machine_min_extruding_rate ;
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
2020-10-06 13:18:25 +02:00
OPT_PTR ( machine_limits_usage );
2018-06-20 13:57:37 +02:00
OPT_PTR ( machine_max_acceleration_x );
OPT_PTR ( machine_max_acceleration_y );
OPT_PTR ( machine_max_acceleration_z );
OPT_PTR ( machine_max_acceleration_e );
OPT_PTR ( machine_max_feedrate_x );
OPT_PTR ( machine_max_feedrate_y );
OPT_PTR ( machine_max_feedrate_z );
OPT_PTR ( machine_max_feedrate_e );
OPT_PTR ( machine_max_acceleration_extruding );
OPT_PTR ( machine_max_acceleration_retracting );
OPT_PTR ( machine_max_jerk_x );
OPT_PTR ( machine_max_jerk_y );
OPT_PTR ( machine_max_jerk_z );
OPT_PTR ( machine_max_jerk_e );
OPT_PTR ( machine_min_travel_rate );
OPT_PTR ( machine_min_extruding_rate );
2017-10-17 16:01:18 +02:00
}
2013-12-31 15:52:37 +01:00
};
2016-09-13 13:30:00 +02:00
// This object is mapped to Perl as Slic3r::Config::GCode.
2017-10-17 16:01:18 +02:00
class GCodeConfig : public StaticPrintConfig
2014-10-18 17:41:21 +02:00
{
2017-10-17 16:01:18 +02:00
STATIC_PRINT_CONFIG_CACHE ( GCodeConfig )
2017-05-16 13:45:28 +02:00
public :
2015-01-30 20:08:00 +01:00
ConfigOptionString before_layer_gcode ;
2017-11-28 15:19:57 +01:00
ConfigOptionString between_objects_gcode ;
2017-05-19 19:24:21 +02:00
ConfigOptionFloats deretract_speed ;
2015-01-05 19:39:10 +01:00
ConfigOptionString end_gcode ;
2017-06-05 11:30:57 +02:00
ConfigOptionStrings end_filament_gcode ;
2014-10-18 17:41:21 +02:00
ConfigOptionString extrusion_axis ;
2014-10-25 10:42:07 +02:00
ConfigOptionFloats extrusion_multiplier ;
ConfigOptionFloats filament_diameter ;
2017-01-15 23:56:01 -06:00
ConfigOptionFloats filament_density ;
2017-05-16 13:45:28 +02:00
ConfigOptionStrings filament_type ;
ConfigOptionBools filament_soluble ;
2017-01-15 23:56:01 -06:00
ConfigOptionFloats filament_cost ;
2020-11-20 14:30:48 +01:00
ConfigOptionFloats filament_spool_weight ;
2016-11-01 13:41:24 +01:00
ConfigOptionFloats filament_max_volumetric_speed ;
2018-03-02 15:52:16 +01:00
ConfigOptionFloats filament_loading_speed ;
2018-08-21 14:36:24 +02:00
ConfigOptionFloats filament_loading_speed_start ;
2018-07-31 09:44:29 +02:00
ConfigOptionFloats filament_load_time ;
2018-03-02 15:52:16 +01:00
ConfigOptionFloats filament_unloading_speed ;
2018-08-14 16:23:23 +02:00
ConfigOptionFloats filament_unloading_speed_start ;
2018-03-02 15:52:16 +01:00
ConfigOptionFloats filament_toolchange_delay ;
2018-07-31 09:44:29 +02:00
ConfigOptionFloats filament_unload_time ;
2018-04-24 13:02:08 +02:00
ConfigOptionInts filament_cooling_moves ;
ConfigOptionFloats filament_cooling_initial_speed ;
2018-08-02 15:14:12 +02:00
ConfigOptionFloats filament_minimal_purge_on_wipe_tower ;
2018-04-24 13:02:08 +02:00
ConfigOptionFloats filament_cooling_final_speed ;
2018-03-14 15:48:37 +01:00
ConfigOptionStrings filament_ramming_parameters ;
2014-10-18 17:41:21 +02:00
ConfigOptionBool gcode_comments ;
ConfigOptionEnum < GCodeFlavor > gcode_flavor ;
2019-01-31 15:09:16 +01:00
ConfigOptionBool gcode_label_objects ;
2015-01-05 19:39:10 +01:00
ConfigOptionString layer_gcode ;
2015-05-31 22:04:32 +02:00
ConfigOptionFloat max_print_speed ;
ConfigOptionFloat max_volumetric_speed ;
2019-01-29 18:07:45 +01:00
#ifdef HAS_PRESSURE_EQUALIZER
2016-09-13 15:02:28 +02:00
ConfigOptionFloat max_volumetric_extrusion_rate_slope_positive ;
ConfigOptionFloat max_volumetric_extrusion_rate_slope_negative ;
2019-01-29 18:07:45 +01:00
#endif
2017-05-19 19:24:21 +02:00
ConfigOptionPercents retract_before_wipe ;
2014-10-21 20:16:45 +02:00
ConfigOptionFloats retract_length ;
ConfigOptionFloats retract_length_toolchange ;
ConfigOptionFloats retract_lift ;
2015-12-18 18:36:39 +01:00
ConfigOptionFloats retract_lift_above ;
ConfigOptionFloats retract_lift_below ;
2014-10-21 20:16:45 +02:00
ConfigOptionFloats retract_restart_extra ;
ConfigOptionFloats retract_restart_extra_toolchange ;
2015-12-07 19:39:49 +01:00
ConfigOptionFloats retract_speed ;
2015-01-05 19:39:10 +01:00
ConfigOptionString start_gcode ;
2017-06-05 11:30:57 +02:00
ConfigOptionStrings start_filament_gcode ;
2017-05-16 13:45:28 +02:00
ConfigOptionBool single_extruder_multi_material ;
2018-07-27 22:19:46 +02:00
ConfigOptionBool single_extruder_multi_material_priming ;
2019-09-19 16:30:01 +02:00
ConfigOptionBool wipe_tower_no_sparse_layers ;
2015-01-05 19:39:10 +01:00
ConfigOptionString toolchange_gcode ;
2014-10-21 20:16:45 +02:00
ConfigOptionFloat travel_speed ;
2014-10-18 17:41:21 +02:00
ConfigOptionBool use_firmware_retraction ;
ConfigOptionBool use_relative_e_distances ;
2015-01-05 19:39:10 +01:00
ConfigOptionBool use_volumetric_e ;
2016-07-16 09:52:11 -05:00
ConfigOptionBool variable_layer_height ;
2018-03-01 16:15:00 +01:00
ConfigOptionFloat cooling_tube_retraction ;
ConfigOptionFloat cooling_tube_length ;
2018-12-14 20:09:10 +01:00
ConfigOptionBool high_current_on_filament_swap ;
2018-03-01 16:15:00 +01:00
ConfigOptionFloat parking_pos_retraction ;
2018-08-04 17:38:25 +02:00
ConfigOptionBool remaining_times ;
2018-06-22 14:01:27 +02:00
ConfigOptionBool silent_mode ;
2018-04-16 14:26:57 +02:00
ConfigOptionFloat extra_loading_move ;
2020-06-03 10:42:47 +02:00
ConfigOptionString color_change_gcode ;
ConfigOptionString pause_print_gcode ;
ConfigOptionString template_custom_gcode ;
2018-03-16 13:58:58 +01:00
2017-10-17 16:01:18 +02:00
std :: string get_extrusion_axis () const
{
return
(( this -> gcode_flavor . value == gcfMach3 ) || ( this -> gcode_flavor . value == gcfMachinekit )) ? "A" :
( this -> gcode_flavor . value == gcfNoExtrusion ) ? "" : this -> extrusion_axis . value ;
2016-08-21 19:09:31 +02:00
}
2017-10-17 16:01:18 +02:00
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
2015-07-02 14:35:21 +02:00
OPT_PTR ( before_layer_gcode );
2017-11-28 15:19:57 +01:00
OPT_PTR ( between_objects_gcode );
2017-05-19 19:24:21 +02:00
OPT_PTR ( deretract_speed );
2015-07-02 14:35:21 +02:00
OPT_PTR ( end_gcode );
2017-06-05 11:30:57 +02:00
OPT_PTR ( end_filament_gcode );
2015-07-02 14:35:21 +02:00
OPT_PTR ( extrusion_axis );
OPT_PTR ( extrusion_multiplier );
OPT_PTR ( filament_diameter );
2017-01-15 23:56:01 -06:00
OPT_PTR ( filament_density );
2017-05-16 13:45:28 +02:00
OPT_PTR ( filament_type );
OPT_PTR ( filament_soluble );
2017-01-15 23:56:01 -06:00
OPT_PTR ( filament_cost );
2020-11-20 14:30:48 +01:00
OPT_PTR ( filament_spool_weight );
2016-11-01 13:41:24 +01:00
OPT_PTR ( filament_max_volumetric_speed );
2018-03-02 15:52:16 +01:00
OPT_PTR ( filament_loading_speed );
2018-08-21 14:36:24 +02:00
OPT_PTR ( filament_loading_speed_start );
2018-07-31 09:44:29 +02:00
OPT_PTR ( filament_load_time );
2018-03-02 15:52:16 +01:00
OPT_PTR ( filament_unloading_speed );
2018-08-14 16:23:23 +02:00
OPT_PTR ( filament_unloading_speed_start );
2018-07-31 09:44:29 +02:00
OPT_PTR ( filament_unload_time );
2018-03-02 15:52:16 +01:00
OPT_PTR ( filament_toolchange_delay );
2018-04-24 13:02:08 +02:00
OPT_PTR ( filament_cooling_moves );
OPT_PTR ( filament_cooling_initial_speed );
2018-08-02 15:14:12 +02:00
OPT_PTR ( filament_minimal_purge_on_wipe_tower );
2018-04-24 13:02:08 +02:00
OPT_PTR ( filament_cooling_final_speed );
2018-03-14 15:48:37 +01:00
OPT_PTR ( filament_ramming_parameters );
2015-07-02 14:35:21 +02:00
OPT_PTR ( gcode_comments );
OPT_PTR ( gcode_flavor );
2019-01-31 15:09:16 +01:00
OPT_PTR ( gcode_label_objects );
2015-07-02 14:35:21 +02:00
OPT_PTR ( layer_gcode );
OPT_PTR ( max_print_speed );
OPT_PTR ( max_volumetric_speed );
2019-01-29 18:07:45 +01:00
#ifdef HAS_PRESSURE_EQUALIZER
2016-09-13 15:02:28 +02:00
OPT_PTR ( max_volumetric_extrusion_rate_slope_positive );
OPT_PTR ( max_volumetric_extrusion_rate_slope_negative );
2019-01-29 18:07:45 +01:00
#endif /* HAS_PRESSURE_EQUALIZER */
2017-05-19 19:24:21 +02:00
OPT_PTR ( retract_before_wipe );
2015-07-02 14:35:21 +02:00
OPT_PTR ( retract_length );
OPT_PTR ( retract_length_toolchange );
OPT_PTR ( retract_lift );
2015-12-18 18:36:39 +01:00
OPT_PTR ( retract_lift_above );
OPT_PTR ( retract_lift_below );
2015-07-02 14:35:21 +02:00
OPT_PTR ( retract_restart_extra );
OPT_PTR ( retract_restart_extra_toolchange );
OPT_PTR ( retract_speed );
2017-05-16 13:45:28 +02:00
OPT_PTR ( single_extruder_multi_material );
2018-07-27 22:19:46 +02:00
OPT_PTR ( single_extruder_multi_material_priming );
2019-09-19 16:30:01 +02:00
OPT_PTR ( wipe_tower_no_sparse_layers );
2015-07-02 14:35:21 +02:00
OPT_PTR ( start_gcode );
2017-06-05 11:30:57 +02:00
OPT_PTR ( start_filament_gcode );
2015-07-02 14:35:21 +02:00
OPT_PTR ( toolchange_gcode );
OPT_PTR ( travel_speed );
OPT_PTR ( use_firmware_retraction );
OPT_PTR ( use_relative_e_distances );
OPT_PTR ( use_volumetric_e );
2016-07-16 09:52:11 -05:00
OPT_PTR ( variable_layer_height );
2018-03-01 16:15:00 +01:00
OPT_PTR ( cooling_tube_retraction );
OPT_PTR ( cooling_tube_length );
2018-12-14 20:09:10 +01:00
OPT_PTR ( high_current_on_filament_swap );
2018-03-01 16:15:00 +01:00
OPT_PTR ( parking_pos_retraction );
2018-08-04 17:38:25 +02:00
OPT_PTR ( remaining_times );
2018-06-22 14:01:27 +02:00
OPT_PTR ( silent_mode );
2018-04-16 14:26:57 +02:00
OPT_PTR ( extra_loading_move );
2020-06-03 10:42:47 +02:00
OPT_PTR ( color_change_gcode );
OPT_PTR ( pause_print_gcode );
OPT_PTR ( template_custom_gcode );
2017-10-17 16:01:18 +02:00
}
2014-10-18 17:41:21 +02:00
};
2016-09-13 13:30:00 +02:00
// This object is mapped to Perl as Slic3r::Config::Print.
2018-06-20 13:57:37 +02:00
class PrintConfig : public MachineEnvelopeConfig , public GCodeConfig
2013-12-31 15:52:37 +01:00
{
2017-10-17 16:01:18 +02:00
STATIC_PRINT_CONFIG_CACHE_DERIVED ( PrintConfig )
2019-08-06 16:51:32 +02:00
PrintConfig () : MachineEnvelopeConfig ( 0 ), GCodeConfig ( 0 ) { initialize_cache (); * this = s_cache_PrintConfig . defaults (); }
2017-05-24 15:20:20 +02:00
public :
2017-10-17 16:01:18 +02:00
2013-12-31 15:52:37 +01:00
ConfigOptionBool avoid_crossing_perimeters ;
2020-12-14 12:36:55 +01:00
ConfigOptionFloatOrPercent avoid_crossing_perimeters_max_detour ;
2014-06-16 01:49:49 +02:00
ConfigOptionPoints bed_shape ;
2017-06-21 16:15:39 +02:00
ConfigOptionInts bed_temperature ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat bridge_acceleration ;
2017-06-21 16:15:39 +02:00
ConfigOptionInts bridge_fan_speed ;
2013-12-31 15:52:37 +01:00
ConfigOptionBool complete_objects ;
2018-11-07 14:44:47 +01:00
ConfigOptionFloats colorprint_heights ;
2017-06-21 16:15:39 +02:00
ConfigOptionBools cooling ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat default_acceleration ;
2017-06-21 16:15:39 +02:00
ConfigOptionInts disable_fan_first_layers ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat duplicate_distance ;
ConfigOptionFloat extruder_clearance_height ;
ConfigOptionFloat extruder_clearance_radius ;
2017-05-24 15:20:20 +02:00
ConfigOptionStrings extruder_colour ;
2013-12-31 15:52:37 +01:00
ConfigOptionPoints extruder_offset ;
2017-06-21 16:15:39 +02:00
ConfigOptionBools fan_always_on ;
ConfigOptionInts fan_below_layer_time ;
2015-05-26 02:01:43 +02:00
ConfigOptionStrings filament_colour ;
2016-11-01 13:41:24 +01:00
ConfigOptionStrings filament_notes ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat first_layer_acceleration ;
2017-06-21 16:15:39 +02:00
ConfigOptionInts first_layer_bed_temperature ;
2014-01-03 00:34:30 +01:00
ConfigOptionFloatOrPercent first_layer_extrusion_width ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloatOrPercent first_layer_speed ;
ConfigOptionInts first_layer_temperature ;
2020-12-04 11:53:02 +01:00
ConfigOptionInts full_fan_speed_layer ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat infill_acceleration ;
ConfigOptionBool infill_first ;
2017-06-21 16:15:39 +02:00
ConfigOptionInts max_fan_speed ;
2017-02-07 18:46:02 +01:00
ConfigOptionFloats max_layer_height ;
2017-06-21 16:15:39 +02:00
ConfigOptionInts min_fan_speed ;
2017-02-07 18:46:02 +01:00
ConfigOptionFloats min_layer_height ;
2018-03-09 10:40:42 +01:00
ConfigOptionFloat max_print_height ;
2017-06-21 16:15:39 +02:00
ConfigOptionFloats min_print_speed ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat min_skirt_length ;
ConfigOptionString notes ;
ConfigOptionFloats nozzle_diameter ;
ConfigOptionBool only_retract_when_crossing_perimeters ;
ConfigOptionBool ooze_prevention ;
ConfigOptionString output_filename_format ;
ConfigOptionFloat perimeter_acceleration ;
ConfigOptionStrings post_process ;
2018-07-13 11:32:50 +02:00
ConfigOptionString printer_model ;
2017-05-05 11:59:51 +02:00
ConfigOptionString printer_notes ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat resolution ;
ConfigOptionFloats retract_before_travel ;
ConfigOptionBools retract_layer_change ;
ConfigOptionFloat skirt_distance ;
ConfigOptionInt skirt_height ;
2020-03-14 07:46:39 +01:00
ConfigOptionBool draft_shield ;
2013-12-31 15:52:37 +01:00
ConfigOptionInt skirts ;
2017-06-21 16:15:39 +02:00
ConfigOptionInts slowdown_below_layer_time ;
2013-12-31 15:52:37 +01:00
ConfigOptionBool spiral_vase ;
ConfigOptionInt standby_temperature_delta ;
ConfigOptionInts temperature ;
ConfigOptionInt threads ;
ConfigOptionBools wipe ;
2017-05-16 13:45:28 +02:00
ConfigOptionBool wipe_tower ;
ConfigOptionFloat wipe_tower_x ;
ConfigOptionFloat wipe_tower_y ;
ConfigOptionFloat wipe_tower_width ;
ConfigOptionFloat wipe_tower_per_color_wipe ;
2017-11-30 12:08:22 +01:00
ConfigOptionFloat wipe_tower_rotation_angle ;
2018-03-12 15:41:25 +01:00
ConfigOptionFloat wipe_tower_bridging ;
2018-03-19 15:30:54 +01:00
ConfigOptionFloats wiping_volumes_matrix ;
ConfigOptionFloats wiping_volumes_extruders ;
2013-12-31 15:52:37 +01:00
ConfigOptionFloat z_offset ;
2018-11-19 13:13:05 +01:00
2017-10-17 16:01:18 +02:00
protected :
2019-08-06 16:51:32 +02:00
PrintConfig ( int ) : MachineEnvelopeConfig ( 1 ), GCodeConfig ( 1 ) {}
2017-10-17 16:01:18 +02:00
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
2018-06-20 13:57:37 +02:00
this -> MachineEnvelopeConfig :: initialize ( cache , base_ptr );
2017-10-17 16:01:18 +02:00
this -> GCodeConfig :: initialize ( cache , base_ptr );
2015-07-02 14:35:21 +02:00
OPT_PTR ( avoid_crossing_perimeters );
2020-10-16 02:25:45 +02:00
OPT_PTR ( avoid_crossing_perimeters_max_detour );
2015-07-02 14:35:21 +02:00
OPT_PTR ( bed_shape );
OPT_PTR ( bed_temperature );
OPT_PTR ( bridge_acceleration );
OPT_PTR ( bridge_fan_speed );
OPT_PTR ( complete_objects );
2018-11-07 14:44:47 +01:00
OPT_PTR ( colorprint_heights );
2015-07-02 14:35:21 +02:00
OPT_PTR ( cooling );
OPT_PTR ( default_acceleration );
OPT_PTR ( disable_fan_first_layers );
OPT_PTR ( duplicate_distance );
OPT_PTR ( extruder_clearance_height );
OPT_PTR ( extruder_clearance_radius );
2017-05-24 15:20:20 +02:00
OPT_PTR ( extruder_colour );
2015-07-02 14:35:21 +02:00
OPT_PTR ( extruder_offset );
OPT_PTR ( fan_always_on );
OPT_PTR ( fan_below_layer_time );
OPT_PTR ( filament_colour );
2016-11-01 13:41:24 +01:00
OPT_PTR ( filament_notes );
2015-07-02 14:35:21 +02:00
OPT_PTR ( first_layer_acceleration );
OPT_PTR ( first_layer_bed_temperature );
OPT_PTR ( first_layer_extrusion_width );
OPT_PTR ( first_layer_speed );
OPT_PTR ( first_layer_temperature );
2020-12-04 11:53:02 +01:00
OPT_PTR ( full_fan_speed_layer );
2015-07-02 14:35:21 +02:00
OPT_PTR ( infill_acceleration );
OPT_PTR ( infill_first );
OPT_PTR ( max_fan_speed );
2017-02-07 18:46:02 +01:00
OPT_PTR ( max_layer_height );
2015-07-02 14:35:21 +02:00
OPT_PTR ( min_fan_speed );
2017-02-07 18:46:02 +01:00
OPT_PTR ( min_layer_height );
2018-03-09 10:40:42 +01:00
OPT_PTR ( max_print_height );
2015-07-02 14:35:21 +02:00
OPT_PTR ( min_print_speed );
OPT_PTR ( min_skirt_length );
OPT_PTR ( notes );
OPT_PTR ( nozzle_diameter );
OPT_PTR ( only_retract_when_crossing_perimeters );
OPT_PTR ( ooze_prevention );
OPT_PTR ( output_filename_format );
OPT_PTR ( perimeter_acceleration );
OPT_PTR ( post_process );
2018-07-13 11:32:50 +02:00
OPT_PTR ( printer_model );
2017-05-05 11:59:51 +02:00
OPT_PTR ( printer_notes );
2015-07-02 14:35:21 +02:00
OPT_PTR ( resolution );
OPT_PTR ( retract_before_travel );
OPT_PTR ( retract_layer_change );
OPT_PTR ( skirt_distance );
OPT_PTR ( skirt_height );
2020-03-14 07:46:39 +01:00
OPT_PTR ( draft_shield );
2015-07-02 14:35:21 +02:00
OPT_PTR ( skirts );
OPT_PTR ( slowdown_below_layer_time );
OPT_PTR ( spiral_vase );
OPT_PTR ( standby_temperature_delta );
OPT_PTR ( temperature );
OPT_PTR ( threads );
OPT_PTR ( wipe );
2017-05-16 13:45:28 +02:00
OPT_PTR ( wipe_tower );
OPT_PTR ( wipe_tower_x );
OPT_PTR ( wipe_tower_y );
OPT_PTR ( wipe_tower_width );
OPT_PTR ( wipe_tower_per_color_wipe );
2017-11-30 12:08:22 +01:00
OPT_PTR ( wipe_tower_rotation_angle );
2018-03-12 15:41:25 +01:00
OPT_PTR ( wipe_tower_bridging );
2018-03-19 15:30:54 +01:00
OPT_PTR ( wiping_volumes_matrix );
OPT_PTR ( wiping_volumes_extruders );
2015-07-02 14:35:21 +02:00
OPT_PTR ( z_offset );
2017-10-17 16:01:18 +02:00
}
2013-12-31 15:52:37 +01:00
};
2016-09-13 13:30:00 +02:00
// This object is mapped to Perl as Slic3r::Config::Full.
2018-11-19 13:13:05 +01:00
class FullPrintConfig :
public PrintObjectConfig ,
2017-10-17 16:01:18 +02:00
public PrintRegionConfig ,
2020-10-28 09:51:05 +01:00
public PrintConfig
2014-10-18 17:41:21 +02:00
{
2017-10-17 16:01:18 +02:00
STATIC_PRINT_CONFIG_CACHE_DERIVED ( FullPrintConfig )
2020-10-28 09:51:05 +01:00
FullPrintConfig () : PrintObjectConfig ( 0 ), PrintRegionConfig ( 0 ), PrintConfig ( 0 ) { initialize_cache (); * this = s_cache_FullPrintConfig . defaults (); }
2016-08-21 19:09:31 +02:00
2017-10-17 16:01:18 +02:00
public :
// Validate the FullPrintConfig. Returns an empty string on success, otherwise an error message is returned.
std :: string validate ();
2018-03-16 13:58:58 +01:00
2017-10-17 16:01:18 +02:00
protected :
// Protected constructor to be called to initialize ConfigCache::m_default.
2020-10-28 09:51:05 +01:00
FullPrintConfig ( int ) : PrintObjectConfig ( 0 ), PrintRegionConfig ( 0 ), PrintConfig ( 0 ) {}
2017-10-17 16:01:18 +02:00
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
this -> PrintObjectConfig :: initialize ( cache , base_ptr );
this -> PrintRegionConfig :: initialize ( cache , base_ptr );
this -> PrintConfig :: initialize ( cache , base_ptr );
}
2014-01-02 10:44:54 +01:00
};
2013-12-31 15:52:37 +01:00
2018-12-03 13:14:28 +01:00
// This object is mapped to Perl as Slic3r::Config::PrintRegion.
class SLAPrintConfig : public StaticPrintConfig
{
STATIC_PRINT_CONFIG_CACHE ( SLAPrintConfig )
public :
ConfigOptionString output_filename_format ;
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
OPT_PTR ( output_filename_format );
}
};
2018-11-09 12:02:42 +01:00
class SLAPrintObjectConfig : public StaticPrintConfig
{
STATIC_PRINT_CONFIG_CACHE ( SLAPrintObjectConfig )
public :
2018-11-21 17:35:35 +01:00
ConfigOptionFloat layer_height ;
2018-11-09 13:45:55 +01:00
2019-02-18 16:04:55 +01:00
//Number of the layers needed for the exposure time fade [3;20]
ConfigOptionInt faded_layers /*= 10*/ ;
2019-03-01 17:53:02 +01:00
ConfigOptionFloat slice_closing_radius ;
2018-11-22 18:02:05 +01:00
// Enabling or disabling support creation
ConfigOptionBool supports_enable ;
2018-11-23 13:03:07 +01:00
// Diameter in mm of the pointing side of the head.
ConfigOptionFloat support_head_front_diameter /*= 0.2*/ ;
2018-11-09 13:45:55 +01:00
// How much the pinhead has to penetrate the model surface
2018-11-16 17:36:23 +01:00
ConfigOptionFloat support_head_penetration /*= 0.2*/ ;
2018-11-09 13:45:55 +01:00
// Width in mm from the back sphere center to the front sphere center.
2018-11-19 13:13:05 +01:00
ConfigOptionFloat support_head_width /*= 1.0*/ ;
2018-11-09 13:45:55 +01:00
// Radius in mm of the support pillars.
2018-11-23 13:03:07 +01:00
ConfigOptionFloat support_pillar_diameter /*= 0.8*/ ;
2020-07-08 11:31:01 +02:00
// The percentage of smaller pillars compared to the normal pillar diameter
// which are used in problematic areas where a normal pilla cannot fit.
ConfigOptionPercent support_small_pillar_diameter_percent ;
2021-02-24 09:22:31 +01:00
2020-03-02 12:43:00 +01:00
// How much bridge (supporting another pinhead) can be placed on a pillar.
ConfigOptionInt support_max_bridges_on_pillar ;
2018-11-09 13:45:55 +01:00
2019-01-09 12:21:43 +01:00
// How the pillars are bridged together
ConfigOptionEnum < SLAPillarConnectionMode > support_pillar_connection_mode ;
2019-02-05 11:16:03 +01:00
// Generate only ground facing supports
ConfigOptionBool support_buildplate_only ;
2018-11-23 11:51:45 +01:00
// TODO: unimplemented at the moment. This coefficient will have an impact
// when bridges and pillars are merged. The resulting pillar should be a bit
// thicker than the ones merging into it. How much thicker? I don't know
// but it will be derived from this value.
ConfigOptionFloat support_pillar_widening_factor ;
2018-11-09 13:45:55 +01:00
// Radius in mm of the pillar base.
2018-11-23 13:03:07 +01:00
ConfigOptionFloat support_base_diameter /*= 2.0*/ ;
2018-11-09 13:45:55 +01:00
// The height of the pillar base cone in mm.
2018-11-19 13:13:05 +01:00
ConfigOptionFloat support_base_height /*= 1.0*/ ;
2019-08-06 16:51:32 +02:00
2019-06-11 17:57:39 +02:00
// The minimum distance of the pillar base from the model in mm.
2019-11-06 13:38:43 +01:00
ConfigOptionFloat support_base_safety_distance ; /*= 1.0*/
2018-11-09 13:45:55 +01:00
// The default angle for connecting support sticks and junctions.
2018-11-19 13:13:05 +01:00
ConfigOptionFloat support_critical_angle /*= 45*/ ;
2018-11-09 13:45:55 +01:00
// The max length of a bridge in mm
2018-11-19 13:13:05 +01:00
ConfigOptionFloat support_max_bridge_length /*= 15.0*/ ;
2018-11-09 13:45:55 +01:00
2019-03-08 11:39:34 +01:00
// The max distance of two pillars to get cross linked.
ConfigOptionFloat support_max_pillar_link_distance ;
2018-11-16 15:01:31 +01:00
// The elevation in Z direction upwards. This is the space between the pad
2018-11-19 11:17:51 +01:00
// and the model object's bounding box bottom. Units in mm.
2018-11-19 13:13:05 +01:00
ConfigOptionFloat support_object_elevation /*= 5.0*/ ;
2019-08-06 16:51:32 +02:00
2018-12-07 14:10:16 +01:00
/////// Following options influence automatic support points placement:
2019-02-19 16:34:52 +01:00
ConfigOptionInt support_points_density_relative ;
ConfigOptionFloat support_points_minimal_distance ;
2018-12-07 14:10:16 +01:00
2018-11-19 11:17:51 +01:00
// Now for the base pool (pad) /////////////////////////////////////////////
2018-11-09 13:45:55 +01:00
2018-11-22 18:02:05 +01:00
// Enabling or disabling support creation
2018-11-20 16:12:04 +01:00
ConfigOptionBool pad_enable ;
2018-11-22 18:02:05 +01:00
// The thickness of the pad walls
2018-11-19 13:13:05 +01:00
ConfigOptionFloat pad_wall_thickness /*= 2*/ ;
2018-11-22 18:02:05 +01:00
// The height of the pad from the bottom to the top not considering the pit
2018-11-19 13:13:05 +01:00
ConfigOptionFloat pad_wall_height /*= 5*/ ;
2021-02-24 09:22:31 +01:00
2019-09-24 15:15:49 +02:00
// How far should the pad extend around the contained geometry
ConfigOptionFloat pad_brim_size ;
2018-11-22 18:02:05 +01:00
// The greatest distance where two individual pads are merged into one. The
// distance is measured roughly from the centroids of the pads.
2018-11-19 13:13:05 +01:00
ConfigOptionFloat pad_max_merge_distance /*= 50*/ ;
2018-11-22 18:02:05 +01:00
// The smoothing radius of the pad edges
2019-08-06 16:51:32 +02:00
// ConfigOptionFloat pad_edge_radius /*= 1*/;
2018-11-09 18:31:36 +01:00
2019-02-25 16:04:46 +01:00
// The slope of the pad wall...
ConfigOptionFloat pad_wall_slope ;
2019-08-06 16:51:32 +02:00
2019-06-11 17:57:39 +02:00
// /////////////////////////////////////////////////////////////////////////
// Zero elevation mode parameters:
2019-11-06 13:38:43 +01:00
// - The object pad will be derived from the model geometry.
2019-06-11 17:57:39 +02:00
// - There will be a gap between the object pad and the generated pad
// according to the support_base_safety_distance parameter.
// - The two pads will be connected with tiny connector sticks
// /////////////////////////////////////////////////////////////////////////
2019-08-06 16:51:32 +02:00
// Disable the elevation (ignore its value) and use the zero elevation mode
2019-09-24 15:15:49 +02:00
ConfigOptionBool pad_around_object ;
2021-02-24 09:22:31 +01:00
2019-09-24 15:15:49 +02:00
ConfigOptionBool pad_around_object_everywhere ;
2019-08-06 16:51:32 +02:00
2019-06-12 13:15:42 +02:00
// This is the gap between the object bottom and the generated pad
ConfigOptionFloat pad_object_gap ;
2019-08-06 16:51:32 +02:00
2019-06-11 17:57:39 +02:00
// How far to place the connector sticks on the object pad perimeter
ConfigOptionFloat pad_object_connector_stride ;
2019-08-06 16:51:32 +02:00
2019-06-11 17:57:39 +02:00
// The width of the connectors sticks
ConfigOptionFloat pad_object_connector_width ;
2019-08-06 16:51:32 +02:00
2019-06-11 17:57:39 +02:00
// How much should the tiny connectors penetrate into the model body
ConfigOptionFloat pad_object_connector_penetration ;
2021-02-24 09:22:31 +01:00
2019-11-06 13:38:43 +01:00
// /////////////////////////////////////////////////////////////////////////
// Model hollowing parameters:
// - Models can be hollowed out as part of the SLA print process
// - Thickness of the hollowed model walls can be adjusted
// -
// - Additional holes will be drilled into the hollow model to allow for
// - resin removal.
// /////////////////////////////////////////////////////////////////////////
2021-02-24 09:22:31 +01:00
2019-11-06 13:38:43 +01:00
ConfigOptionBool hollowing_enable ;
2021-02-24 09:22:31 +01:00
// The minimum thickness of the model walls to maintain. Note that the
2019-11-06 13:38:43 +01:00
// resulting walls may be thicker due to smoothing out fine cavities where
// resin could stuck.
ConfigOptionFloat hollowing_min_thickness ;
2021-02-24 09:22:31 +01:00
2019-11-07 09:34:34 +01:00
// Indirectly controls the voxel size (resolution) used by openvdb
2019-11-08 09:21:30 +01:00
ConfigOptionFloat hollowing_quality ;
2021-02-24 09:22:31 +01:00
2019-11-08 16:51:43 +01:00
// Indirectly controls the minimum size of created cavities.
ConfigOptionFloat hollowing_closing_distance ;
2019-02-25 12:06:38 +01:00
2018-11-09 12:02:42 +01:00
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
OPT_PTR ( layer_height );
2019-02-18 16:04:55 +01:00
OPT_PTR ( faded_layers );
2019-03-01 17:53:02 +01:00
OPT_PTR ( slice_closing_radius );
2018-11-22 18:02:05 +01:00
OPT_PTR ( supports_enable );
2018-11-23 13:03:07 +01:00
OPT_PTR ( support_head_front_diameter );
2018-11-16 17:36:23 +01:00
OPT_PTR ( support_head_penetration );
2018-11-09 18:31:36 +01:00
OPT_PTR ( support_head_width );
2018-11-23 13:03:07 +01:00
OPT_PTR ( support_pillar_diameter );
2020-07-08 11:31:01 +02:00
OPT_PTR ( support_small_pillar_diameter_percent );
2020-03-02 12:43:00 +01:00
OPT_PTR ( support_max_bridges_on_pillar );
2019-01-09 12:21:43 +01:00
OPT_PTR ( support_pillar_connection_mode );
2019-02-05 11:16:03 +01:00
OPT_PTR ( support_buildplate_only );
2018-11-23 11:51:45 +01:00
OPT_PTR ( support_pillar_widening_factor );
2018-11-23 13:03:07 +01:00
OPT_PTR ( support_base_diameter );
2018-11-09 18:31:36 +01:00
OPT_PTR ( support_base_height );
2019-06-11 17:57:39 +02:00
OPT_PTR ( support_base_safety_distance );
2018-11-09 18:31:36 +01:00
OPT_PTR ( support_critical_angle );
OPT_PTR ( support_max_bridge_length );
2019-03-08 11:39:34 +01:00
OPT_PTR ( support_max_pillar_link_distance );
2019-02-19 16:34:52 +01:00
OPT_PTR ( support_points_density_relative );
OPT_PTR ( support_points_minimal_distance );
2018-11-19 17:58:08 +01:00
OPT_PTR ( support_object_elevation );
2018-11-20 16:12:04 +01:00
OPT_PTR ( pad_enable );
2018-11-09 18:31:36 +01:00
OPT_PTR ( pad_wall_thickness );
OPT_PTR ( pad_wall_height );
2019-09-24 15:15:49 +02:00
OPT_PTR ( pad_brim_size );
2018-11-09 18:31:36 +01:00
OPT_PTR ( pad_max_merge_distance );
2019-08-06 16:51:32 +02:00
// OPT_PTR(pad_edge_radius);
2019-02-25 16:04:46 +01:00
OPT_PTR ( pad_wall_slope );
2019-08-28 11:32:49 +02:00
OPT_PTR ( pad_around_object );
2019-09-24 15:15:49 +02:00
OPT_PTR ( pad_around_object_everywhere );
2019-06-12 13:15:42 +02:00
OPT_PTR ( pad_object_gap );
2019-06-11 17:57:39 +02:00
OPT_PTR ( pad_object_connector_stride );
OPT_PTR ( pad_object_connector_width );
OPT_PTR ( pad_object_connector_penetration );
2019-11-06 13:38:43 +01:00
OPT_PTR ( hollowing_enable );
OPT_PTR ( hollowing_min_thickness );
2019-11-08 09:21:30 +01:00
OPT_PTR ( hollowing_quality );
2019-11-08 16:51:43 +01:00
OPT_PTR ( hollowing_closing_distance );
2018-11-09 12:02:42 +01:00
}
};
2018-07-31 15:09:57 +02:00
class SLAMaterialConfig : public StaticPrintConfig
{
STATIC_PRINT_CONFIG_CACHE ( SLAMaterialConfig )
public :
ConfigOptionFloat initial_layer_height ;
2019-09-26 16:33:55 +02:00
ConfigOptionFloat bottle_cost ;
ConfigOptionFloat bottle_volume ;
ConfigOptionFloat bottle_weight ;
ConfigOptionFloat material_density ;
2018-07-31 15:09:57 +02:00
ConfigOptionFloat exposure_time ;
ConfigOptionFloat initial_exposure_time ;
2019-04-03 17:34:46 +02:00
ConfigOptionFloats material_correction ;
2018-07-31 15:09:57 +02:00
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
OPT_PTR ( initial_layer_height );
2019-09-26 16:33:55 +02:00
OPT_PTR ( bottle_cost );
OPT_PTR ( bottle_volume );
OPT_PTR ( bottle_weight );
OPT_PTR ( material_density );
2018-07-31 15:09:57 +02:00
OPT_PTR ( exposure_time );
OPT_PTR ( initial_exposure_time );
2019-04-03 17:34:46 +02:00
OPT_PTR ( material_correction );
2018-07-31 15:09:57 +02:00
}
};
class SLAPrinterConfig : public StaticPrintConfig
{
STATIC_PRINT_CONFIG_CACHE ( SLAPrinterConfig )
public :
ConfigOptionEnum < PrinterTechnology > printer_technology ;
ConfigOptionPoints bed_shape ;
ConfigOptionFloat max_print_height ;
ConfigOptionFloat display_width ;
ConfigOptionFloat display_height ;
ConfigOptionInt display_pixels_x ;
ConfigOptionInt display_pixels_y ;
2018-12-13 12:42:45 +01:00
ConfigOptionEnum < SLADisplayOrientation > display_orientation ;
2019-05-18 16:56:46 +02:00
ConfigOptionBool display_mirror_x ;
ConfigOptionBool display_mirror_y ;
2019-04-09 13:42:32 +02:00
ConfigOptionFloats relative_correction ;
ConfigOptionFloat absolute_correction ;
2020-02-06 14:09:48 +01:00
ConfigOptionFloat elefant_foot_compensation ;
2020-02-06 16:28:02 +01:00
ConfigOptionFloat elefant_foot_min_width ;
2019-04-09 13:42:32 +02:00
ConfigOptionFloat gamma_correction ;
2019-02-18 16:04:55 +01:00
ConfigOptionFloat fast_tilt_time ;
ConfigOptionFloat slow_tilt_time ;
ConfigOptionFloat area_fill ;
2019-08-20 17:24:48 +02:00
ConfigOptionFloat min_exposure_time ;
ConfigOptionFloat max_exposure_time ;
ConfigOptionFloat min_initial_exposure_time ;
ConfigOptionFloat max_initial_exposure_time ;
2018-07-31 15:09:57 +02:00
protected :
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
OPT_PTR ( printer_technology );
OPT_PTR ( bed_shape );
OPT_PTR ( max_print_height );
OPT_PTR ( display_width );
OPT_PTR ( display_height );
OPT_PTR ( display_pixels_x );
OPT_PTR ( display_pixels_y );
2019-05-18 16:56:46 +02:00
OPT_PTR ( display_mirror_x );
OPT_PTR ( display_mirror_y );
2018-12-13 12:42:45 +01:00
OPT_PTR ( display_orientation );
2019-04-09 13:42:32 +02:00
OPT_PTR ( relative_correction );
OPT_PTR ( absolute_correction );
2020-02-06 14:09:48 +01:00
OPT_PTR ( elefant_foot_compensation );
2020-02-06 16:28:02 +01:00
OPT_PTR ( elefant_foot_min_width );
2019-04-09 13:42:32 +02:00
OPT_PTR ( gamma_correction );
2019-02-18 16:04:55 +01:00
OPT_PTR ( fast_tilt_time );
OPT_PTR ( slow_tilt_time );
OPT_PTR ( area_fill );
2019-08-20 17:24:48 +02:00
OPT_PTR ( min_exposure_time );
OPT_PTR ( max_exposure_time );
OPT_PTR ( min_initial_exposure_time );
OPT_PTR ( max_initial_exposure_time );
2018-07-31 15:09:57 +02:00
}
};
2018-12-03 13:14:28 +01:00
class SLAFullPrintConfig : public SLAPrinterConfig , public SLAPrintConfig , public SLAPrintObjectConfig , public SLAMaterialConfig
2018-07-31 15:09:57 +02:00
{
STATIC_PRINT_CONFIG_CACHE_DERIVED ( SLAFullPrintConfig )
2018-12-03 13:14:28 +01:00
SLAFullPrintConfig () : SLAPrinterConfig ( 0 ), SLAPrintConfig ( 0 ), SLAPrintObjectConfig ( 0 ), SLAMaterialConfig ( 0 ) { initialize_cache (); * this = s_cache_SLAFullPrintConfig . defaults (); }
2018-07-31 15:09:57 +02:00
public :
// Validate the SLAFullPrintConfig. Returns an empty string on success, otherwise an error message is returned.
// std::string validate();
protected :
// Protected constructor to be called to initialize ConfigCache::m_default.
2018-12-03 13:14:28 +01:00
SLAFullPrintConfig ( int ) : SLAPrinterConfig ( 0 ), SLAPrintConfig ( 0 ), SLAPrintObjectConfig ( 0 ), SLAMaterialConfig ( 0 ) {}
2018-07-31 15:09:57 +02:00
void initialize ( StaticCacheBase & cache , const char * base_ptr )
{
2018-11-09 12:02:42 +01:00
this -> SLAPrinterConfig :: initialize ( cache , base_ptr );
2018-12-03 13:14:28 +01:00
this -> SLAPrintConfig :: initialize ( cache , base_ptr );
2018-11-09 12:02:42 +01:00
this -> SLAPrintObjectConfig :: initialize ( cache , base_ptr );
this -> SLAMaterialConfig :: initialize ( cache , base_ptr );
2018-07-31 15:09:57 +02:00
}
};
2017-10-17 16:01:18 +02:00
#undef STATIC_PRINT_CONFIG_CACHE
#undef STATIC_PRINT_CONFIG_CACHE_BASE
#undef STATIC_PRINT_CONFIG_CACHE_DERIVED
#undef OPT_PTR
2019-03-13 15:44:50 +01:00
class CLIActionsConfigDef : public ConfigDef
2018-09-20 16:48:13 +02:00
{
public :
2019-03-13 15:44:50 +01:00
CLIActionsConfigDef ();
2018-09-20 16:48:13 +02:00
};
2019-03-13 15:44:50 +01:00
class CLITransformConfigDef : public ConfigDef
2018-09-20 16:48:13 +02:00
{
public :
2019-03-13 15:44:50 +01:00
CLITransformConfigDef ();
2018-09-20 16:48:13 +02:00
};
2019-03-13 15:44:50 +01:00
class CLIMiscConfigDef : public ConfigDef
{
public :
CLIMiscConfigDef ();
};
// This class defines the command line options representing actions.
extern const CLIActionsConfigDef cli_actions_config_def ;
// This class defines the command line options representing transforms.
extern const CLITransformConfigDef cli_transform_config_def ;
// This class defines all command line options that are not actions or transforms.
extern const CLIMiscConfigDef cli_misc_config_def ;
2018-09-20 16:48:13 +02:00
class DynamicPrintAndCLIConfig : public DynamicPrintConfig
{
public :
2019-08-06 16:51:32 +02:00
DynamicPrintAndCLIConfig () {}
DynamicPrintAndCLIConfig ( const DynamicPrintAndCLIConfig & other ) : DynamicPrintConfig ( other ) {}
2018-09-20 16:48:13 +02:00
// Overrides ConfigBase::def(). Static configuration definition. Any value stored into this ConfigBase shall have its definition here.
2018-11-09 14:25:18 +01:00
const ConfigDef * def () const override { return & s_def ; }
2018-09-20 16:48:13 +02:00
2019-01-03 13:25:56 +01:00
// Verify whether the opt_key has not been obsoleted or renamed.
// Both opt_key and value may be modified by handle_legacy().
// If the opt_key is no more valid in this version of Slic3r, opt_key is cleared by handle_legacy().
// handle_legacy() is called internally by set_deserialize().
void handle_legacy ( t_config_option_key & opt_key , std :: string & value ) const override ;
2018-09-20 16:48:13 +02:00
private :
2018-10-30 15:24:36 +01:00
class PrintAndCLIConfigDef : public ConfigDef
2018-09-20 16:48:13 +02:00
{
public :
2018-11-19 13:13:05 +01:00
PrintAndCLIConfigDef () {
2018-10-30 15:24:36 +01:00
this -> options . insert ( print_config_def . options . begin (), print_config_def . options . end ());
2019-03-13 15:44:50 +01:00
this -> options . insert ( cli_actions_config_def . options . begin (), cli_actions_config_def . options . end ());
this -> options . insert ( cli_transform_config_def . options . begin (), cli_transform_config_def . options . end ());
this -> options . insert ( cli_misc_config_def . options . begin (), cli_misc_config_def . options . end ());
2019-06-26 13:26:49 +02:00
for ( const auto & kvp : this -> options )
2019-08-06 16:51:32 +02:00
this -> by_serialization_key_ordinal [ kvp . second . serialization_key_ordinal ] = & kvp . second ;
2018-10-30 15:24:36 +01:00
}
2019-03-13 15:44:50 +01:00
// Do not release the default values, they are handled by print_config_def & cli_actions_config_def / cli_transform_config_def / cli_misc_config_def.
2018-10-30 15:24:36 +01:00
~ PrintAndCLIConfigDef () { this -> options . clear (); }
2018-09-20 16:48:13 +02:00
};
static PrintAndCLIConfigDef s_def ;
};
2020-03-27 09:58:08 +01:00
Points get_bed_shape ( const DynamicPrintConfig & cfg );
Points get_bed_shape ( const PrintConfig & cfg );
Points get_bed_shape ( const SLAPrinterConfig & cfg );
2020-09-24 15:34:13 +02:00
// ModelConfig is a wrapper around DynamicPrintConfig with an addition of a timestamp.
// Each change of ModelConfig is tracked by assigning a new timestamp from a global counter.
// The counter is used for faster synchronization of the background slicing thread
2021-02-24 09:22:31 +01:00
// with the front end by skipping synchronization of equal config dictionaries.
// The global counter is also used for avoiding unnecessary serialization of config
2020-09-24 15:34:13 +02:00
// dictionaries when taking an Undo snapshot.
//
// The global counter is NOT thread safe, therefore it is recommended to use ModelConfig from
// the main thread only.
2021-02-24 09:22:31 +01:00
//
2020-09-24 15:34:13 +02:00
// As there is a global counter and it is being increased with each change to any ModelConfig,
// if two ModelConfig dictionaries differ, they should differ with their timestamp as well.
// Therefore copying the ModelConfig including its timestamp is safe as there is no harm
// in having multiple ModelConfig with equal timestamps as long as their dictionaries are equal.
//
// The timestamp is used by the Undo/Redo stack. As zero timestamp means invalid timestamp
// to the Undo/Redo stack (zero timestamp means the Undo/Redo stack needs to serialize and
// compare serialized data for differences), zero timestamp shall never be used.
// Timestamp==1 shall only be used for empty dictionaries.
class ModelConfig
{
public :
void clear () { m_data . clear (); m_timestamp = 1 ; }
void assign_config ( const ModelConfig & rhs ) {
if ( m_timestamp != rhs . m_timestamp ) {
m_data = rhs . m_data ;
m_timestamp = rhs . m_timestamp ;
}
}
void assign_config ( ModelConfig && rhs ) {
if ( m_timestamp != rhs . m_timestamp ) {
m_data = std :: move ( rhs . m_data );
m_timestamp = rhs . m_timestamp ;
rhs . clear ();
}
}
2020-10-15 17:29:42 +02:00
// Modification of the ModelConfig is not thread safe due to the global timestamp counter!
// Don't call modification methods from the back-end!
2020-09-24 15:34:13 +02:00
// Assign methods don't assign if src==dst to not having to bump the timestamp in case they are equal.
void assign_config ( const DynamicPrintConfig & rhs ) { if ( m_data != rhs ) { m_data = rhs ; this -> touch (); } }
void assign_config ( DynamicPrintConfig && rhs ) { if ( m_data != rhs ) { m_data = std :: move ( rhs ); this -> touch (); } }
void apply ( const ModelConfig & other , bool ignore_nonexistent = false ) { this -> apply ( other . get (), ignore_nonexistent ); }
void apply ( const ConfigBase & other , bool ignore_nonexistent = false ) { m_data . apply_only ( other , other . keys (), ignore_nonexistent ); this -> touch (); }
void apply_only ( const ModelConfig & other , const t_config_option_keys & keys , bool ignore_nonexistent = false ) { this -> apply_only ( other . get (), keys , ignore_nonexistent ); }
void apply_only ( const ConfigBase & other , const t_config_option_keys & keys , bool ignore_nonexistent = false ) { m_data . apply_only ( other , keys , ignore_nonexistent ); this -> touch (); }
bool set_key_value ( const std :: string & opt_key , ConfigOption * opt ) { bool out = m_data . set_key_value ( opt_key , opt ); this -> touch (); return out ; }
template < typename T >
void set ( const std :: string & opt_key , T value ) { m_data . set ( opt_key , value , true ); this -> touch (); }
void set_deserialize ( const t_config_option_key & opt_key , const std :: string & str , bool append = false )
{ m_data . set_deserialize ( opt_key , str , append ); this -> touch (); }
bool erase ( const t_config_option_key & opt_key ) { bool out = m_data . erase ( opt_key ); if ( out ) this -> touch (); return out ; }
// Getters are thread safe.
// The following implicit conversion breaks the Cereal serialization.
// operator const DynamicPrintConfig&() const throw() { return this->get(); }
const DynamicPrintConfig & get () const throw () { return m_data ; }
bool empty () const throw () { return m_data . empty (); }
size_t size () const throw () { return m_data . size (); }
auto cbegin () const { return m_data . cbegin (); }
auto cend () const { return m_data . cend (); }
t_config_option_keys keys () const { return m_data . keys (); }
bool has ( const t_config_option_key & opt_key ) const { return m_data . has ( opt_key ); }
const ConfigOption * option ( const t_config_option_key & opt_key ) const { return m_data . option ( opt_key ); }
int opt_int ( const t_config_option_key & opt_key ) const { return m_data . opt_int ( opt_key ); }
int extruder () const { return opt_int ( "extruder" ); }
double opt_float ( const t_config_option_key & opt_key ) const { return m_data . opt_float ( opt_key ); }
std :: string opt_serialize ( const t_config_option_key & opt_key ) const { return m_data . opt_serialize ( opt_key ); }
// Return an optional timestamp of this object.
// If the timestamp returned is non-zero, then the serialization framework will
// only save this object on the Undo/Redo stack if the timestamp is different
// from the timestmap of the object at the top of the Undo / Redo stack.
virtual uint64_t timestamp () const throw () { return m_timestamp ; }
bool timestamp_matches ( const ModelConfig & rhs ) const throw () { return m_timestamp == rhs . m_timestamp ; }
// Not thread safe! Should not be called from other than the main thread!
void touch () { m_timestamp = ++ s_last_timestamp ; }
private :
friend class cereal :: access ;
template < class Archive > void serialize ( Archive & ar ) { ar ( m_timestamp ); ar ( m_data ); }
uint64_t m_timestamp { 1 };
DynamicPrintConfig m_data ;
static uint64_t s_last_timestamp ;
};
2018-09-20 16:48:13 +02:00
} // namespace Slic3r
2013-12-21 16:15:41 +01:00
2019-06-26 13:26:49 +02:00
// Serialization through the Cereal library
namespace cereal {
2019-08-06 16:51:32 +02:00
// Let cereal know that there are load / save non-member functions declared for DynamicPrintConfig, ignore serialize / load / save from parent class DynamicConfig.
template < class Archive > struct specialize < Archive , Slic3r :: DynamicPrintConfig , cereal :: specialization :: non_member_load_save > {};
2019-06-26 13:26:49 +02:00
2019-08-06 16:51:32 +02:00
template < class Archive > void load ( Archive & archive , Slic3r :: DynamicPrintConfig & config )
{
size_t cnt ;
archive ( cnt );
config . clear ();
for ( size_t i = 0 ; i < cnt ; ++ i ) {
size_t serialization_key_ordinal ;
archive ( serialization_key_ordinal );
assert ( serialization_key_ordinal > 0 );
auto it = Slic3r :: print_config_def . by_serialization_key_ordinal . find ( serialization_key_ordinal );
assert ( it != Slic3r :: print_config_def . by_serialization_key_ordinal . end ());
config . set_key_value ( it -> second -> opt_key , it -> second -> load_option_from_archive ( archive ));
}
}
2019-06-26 13:26:49 +02:00
2019-08-06 16:51:32 +02:00
template < class Archive > void save ( Archive & archive , const Slic3r :: DynamicPrintConfig & config )
{
size_t cnt = config . size ();
archive ( cnt );
for ( auto it = config . cbegin (); it != config . cend (); ++ it ) {
const Slic3r :: ConfigOptionDef * optdef = Slic3r :: print_config_def . get ( it -> first );
assert ( optdef != nullptr );
assert ( optdef -> serialization_key_ordinal > 0 );
archive ( optdef -> serialization_key_ordinal );
optdef -> save_option_to_archive ( archive , it -> second . get ());
}
}
2019-06-26 13:26:49 +02:00
}
2013-12-21 16:15:41 +01:00
#endif