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"
2021-04-26 18:37:10 +02:00
#include <boost/preprocessor/facilities/empty.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/to_seq.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 {
2021-03-30 13:30:18 +02:00
gcfRepRapSprinter , gcfRepRapFirmware , gcfRepetier , gcfTeacup , gcfMakerWare , gcfMarlinLegacy , gcfMarlinFirmware , 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 {
2021-04-26 18:37:10 +02:00
EmitToGCode ,
TimeEstimateOnly ,
Ignore ,
Count ,
2020-10-02 17:31:55 +02:00
};
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 ,
2021-04-08 15:29:40 +02:00
ipGyroid , ipHilbertCurve , ipArchimedeanChords , ipOctagramSpiral , ipAdaptiveCubic , ipSupportCubic , ipSupportBase , ipCount ,
2013-12-22 00:39:03 +01:00
};
2020-04-14 11:53:28 +02:00
enum class IroningType {
2021-04-26 18:37:10 +02:00
TopSurfaces ,
TopmostOnly ,
AllSolid ,
Count ,
2020-04-14 11:53:28 +02:00
};
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-03-23 11:06:31 +01:00
enum SupportMaterialStyle {
smsGrid , smsSnug ,
};
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 ,
};
2021-05-04 11:03:18 +02:00
#define CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS(NAME) \
template<> const t_config_enum_names& ConfigOptionEnum<NAME>::get_enum_names(); \
template<> const t_config_enum_values& ConfigOptionEnum<NAME>::get_enum_values();
2018-07-31 15:09:57 +02:00
2021-05-04 11:03:18 +02:00
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( PrinterTechnology )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( GCodeFlavor )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( MachineLimitsUsage )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( PrintHostType )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( AuthorizationType )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( FuzzySkinType )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( InfillPattern )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( IroningType )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( SupportMaterialPattern )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( SupportMaterialStyle )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( SupportMaterialInterfacePattern )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( SeamPosition )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( SLADisplayOrientation )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( SLAPillarConnectionMode )
CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS ( BrimType )
2013-12-21 16:15:41 +01:00
2021-05-04 11:03:18 +02:00
#undef CONFIG_OPTION_ENUM_DECLARE_STATIC_MAPS
2021-02-03 15:12:53 +01:00
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
2021-04-26 18:37:10 +02:00
std :: vector < std :: string > m_extruder_option_keys ;
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
2021-04-26 18:37:10 +02:00
void set_num_extruders ( unsigned int num_extruders );
2019-10-15 16:31:20 +02:00
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.
2021-04-26 18:37:10 +02:00
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(); } \
2021-05-04 11:03:18 +02:00
static const CLASS_NAME& defaults() { assert(s_cache_##CLASS_NAME.initialized()); return s_cache_##CLASS_NAME.defaults(); } \
2017-10-17 17:37:03 +02:00
private: \
2021-05-04 11:03:18 +02:00
friend int print_config_static_initializer(); \
2017-10-17 16:01:18 +02:00
static void initialize_cache() \
{ \
2021-05-04 11:03:18 +02:00
assert(! s_cache_##CLASS_NAME.initialized()); \
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. */ \
2021-05-04 11:03:18 +02:00
CLASS_NAME() { assert(s_cache_##CLASS_NAME.initialized()); *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); }
2021-04-26 18:37:10 +02:00
#define PRINT_CONFIG_CLASS_ELEMENT_DEFINITION(r, data, elem) BOOST_PP_TUPLE_ELEM(0, elem) BOOST_PP_TUPLE_ELEM(1, elem);
#define PRINT_CONFIG_CLASS_ELEMENT_INITIALIZATION2(KEY) cache.opt_add(BOOST_PP_STRINGIZE(KEY), base_ptr, this->KEY);
#define PRINT_CONFIG_CLASS_ELEMENT_INITIALIZATION(r, data, elem) PRINT_CONFIG_CLASS_ELEMENT_INITIALIZATION2(BOOST_PP_TUPLE_ELEM(1, elem))
#define PRINT_CONFIG_CLASS_ELEMENT_HASH(r, data, elem) boost::hash_combine(seed, BOOST_PP_TUPLE_ELEM(1, elem).hash());
#define PRINT_CONFIG_CLASS_ELEMENT_EQUAL(r, data, elem) if (! (BOOST_PP_TUPLE_ELEM(1, elem) == rhs.BOOST_PP_TUPLE_ELEM(1, elem))) return false;
#define PRINT_CONFIG_CLASS_DEFINE(CLASS_NAME, PARAMETER_DEFINITION_SEQ) \
class CLASS_NAME : public StaticPrintConfig { \
STATIC_PRINT_CONFIG_CACHE(CLASS_NAME) \
public: \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_DEFINITION, _, PARAMETER_DEFINITION_SEQ) \
size_t hash() const throw() \
{ \
size_t seed = 0; \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_HASH, _, PARAMETER_DEFINITION_SEQ) \
return seed; \
} \
bool operator==(const CLASS_NAME &rhs) const throw() \
{ \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_EQUAL, _, PARAMETER_DEFINITION_SEQ) \
return true; \
} \
bool operator!=(const CLASS_NAME &rhs) const throw() { return ! (*this == rhs); } \
protected: \
void initialize(StaticCacheBase &cache, const char *base_ptr) \
{ \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_INITIALIZATION, _, PARAMETER_DEFINITION_SEQ) \
} \
};
#define PRINT_CONFIG_CLASS_DERIVED_CLASS_LIST_ITEM(r, data, i, elem) BOOST_PP_COMMA_IF(i) public elem
#define PRINT_CONFIG_CLASS_DERIVED_CLASS_LIST(CLASSES_PARENTS_TUPLE) BOOST_PP_SEQ_FOR_EACH_I(PRINT_CONFIG_CLASS_DERIVED_CLASS_LIST_ITEM, _, BOOST_PP_TUPLE_TO_SEQ(CLASSES_PARENTS_TUPLE))
#define PRINT_CONFIG_CLASS_DERIVED_INITIALIZER_ITEM(r, VALUE, i, elem) BOOST_PP_COMMA_IF(i) elem(VALUE)
#define PRINT_CONFIG_CLASS_DERIVED_INITIALIZER(CLASSES_PARENTS_TUPLE, VALUE) BOOST_PP_SEQ_FOR_EACH_I(PRINT_CONFIG_CLASS_DERIVED_INITIALIZER_ITEM, VALUE, BOOST_PP_TUPLE_TO_SEQ(CLASSES_PARENTS_TUPLE))
#define PRINT_CONFIG_CLASS_DERIVED_INITCACHE_ITEM(r, data, elem) this->elem::initialize(cache, base_ptr);
#define PRINT_CONFIG_CLASS_DERIVED_INITCACHE(CLASSES_PARENTS_TUPLE) BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_DERIVED_INITCACHE_ITEM, _, BOOST_PP_TUPLE_TO_SEQ(CLASSES_PARENTS_TUPLE))
#define PRINT_CONFIG_CLASS_DERIVED_HASH(r, data, elem) boost::hash_combine(seed, static_cast<const elem*>(this)->hash());
#define PRINT_CONFIG_CLASS_DERIVED_EQUAL(r, data, elem) \
if (! (*static_cast<const elem*>(this) == static_cast<const elem&>(rhs))) return false;
// Generic version, with or without new parameters. Don't use this directly.
#define PRINT_CONFIG_CLASS_DERIVED_DEFINE1(CLASS_NAME, CLASSES_PARENTS_TUPLE, PARAMETER_DEFINITION, PARAMETER_REGISTRATION, PARAMETER_HASHES, PARAMETER_EQUALS) \
class CLASS_NAME : PRINT_CONFIG_CLASS_DERIVED_CLASS_LIST(CLASSES_PARENTS_TUPLE) { \
STATIC_PRINT_CONFIG_CACHE_DERIVED(CLASS_NAME) \
2021-05-04 11:03:18 +02:00
CLASS_NAME() : PRINT_CONFIG_CLASS_DERIVED_INITIALIZER(CLASSES_PARENTS_TUPLE, 0) { assert(s_cache_##CLASS_NAME.initialized()); *this = s_cache_##CLASS_NAME.defaults(); } \
2021-04-26 18:37:10 +02:00
public: \
PARAMETER_DEFINITION \
size_t hash() const throw() \
{ \
size_t seed = 0; \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_DERIVED_HASH, _, BOOST_PP_TUPLE_TO_SEQ(CLASSES_PARENTS_TUPLE)) \
PARAMETER_HASHES \
return seed; \
} \
bool operator==(const CLASS_NAME &rhs) const throw() \
{ \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_DERIVED_EQUAL, _, BOOST_PP_TUPLE_TO_SEQ(CLASSES_PARENTS_TUPLE)) \
PARAMETER_EQUALS \
return true; \
} \
bool operator!=(const CLASS_NAME &rhs) const throw() { return ! (*this == rhs); } \
protected: \
CLASS_NAME(int) : PRINT_CONFIG_CLASS_DERIVED_INITIALIZER(CLASSES_PARENTS_TUPLE, 1) {} \
void initialize(StaticCacheBase &cache, const char* base_ptr) { \
PRINT_CONFIG_CLASS_DERIVED_INITCACHE(CLASSES_PARENTS_TUPLE) \
PARAMETER_REGISTRATION \
} \
};
// Variant without adding new parameters.
#define PRINT_CONFIG_CLASS_DERIVED_DEFINE0(CLASS_NAME, CLASSES_PARENTS_TUPLE) \
PRINT_CONFIG_CLASS_DERIVED_DEFINE1(CLASS_NAME, CLASSES_PARENTS_TUPLE, BOOST_PP_EMPTY(), BOOST_PP_EMPTY(), BOOST_PP_EMPTY(), BOOST_PP_EMPTY())
// Variant with adding new parameters.
#define PRINT_CONFIG_CLASS_DERIVED_DEFINE(CLASS_NAME, CLASSES_PARENTS_TUPLE, PARAMETER_DEFINITION_SEQ) \
PRINT_CONFIG_CLASS_DERIVED_DEFINE1(CLASS_NAME, CLASSES_PARENTS_TUPLE, \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_DEFINITION, _, PARAMETER_DEFINITION_SEQ), \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_INITIALIZATION, _, PARAMETER_DEFINITION_SEQ), \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_HASH, _, PARAMETER_DEFINITION_SEQ), \
BOOST_PP_SEQ_FOR_EACH(PRINT_CONFIG_CLASS_ELEMENT_EQUAL, _, PARAMETER_DEFINITION_SEQ))
2017-10-17 16:01:18 +02:00
2016-09-13 13:30:00 +02:00
// This object is mapped to Perl as Slic3r::Config::PrintObject.
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
PrintObjectConfig ,
2018-06-06 18:24:42 +02:00
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , brim_offset ))
(( ConfigOptionEnum < BrimType > , brim_type ))
(( ConfigOptionFloat , brim_width ))
(( ConfigOptionBool , clip_multipart_objects ))
(( ConfigOptionBool , dont_support_bridges ))
(( ConfigOptionFloat , elefant_foot_compensation ))
(( ConfigOptionFloatOrPercent , extrusion_width ))
(( ConfigOptionBool , infill_only_where_needed ))
// Force the generation of solid shells between adjacent materials/volumes.
(( ConfigOptionBool , interface_shells ))
(( ConfigOptionFloat , layer_height ))
(( ConfigOptionFloat , raft_contact_distance ))
(( ConfigOptionFloat , raft_expansion ))
(( ConfigOptionPercent , raft_first_layer_density ))
(( ConfigOptionFloat , raft_first_layer_expansion ))
(( ConfigOptionInt , raft_layers ))
(( ConfigOptionEnum < SeamPosition > , seam_position ))
// ((ConfigOptionFloat, seam_preferred_direction))
// ((ConfigOptionFloat, seam_preferred_direction_jitter))
(( ConfigOptionFloat , slice_closing_radius ))
(( ConfigOptionBool , support_material ))
// Automatic supports (generated based on support_material_threshold).
(( ConfigOptionBool , support_material_auto ))
// Direction of the support pattern (in XY plane).`
(( ConfigOptionFloat , support_material_angle ))
(( ConfigOptionBool , support_material_buildplate_only ))
(( ConfigOptionFloat , support_material_contact_distance ))
(( ConfigOptionFloat , support_material_bottom_contact_distance ))
(( ConfigOptionInt , support_material_enforce_layers ))
(( ConfigOptionInt , support_material_extruder ))
(( ConfigOptionFloatOrPercent , support_material_extrusion_width ))
(( ConfigOptionBool , support_material_interface_contact_loops ))
(( ConfigOptionInt , support_material_interface_extruder ))
(( ConfigOptionInt , support_material_interface_layers ))
(( ConfigOptionInt , support_material_bottom_interface_layers ))
// Spacing between interface lines (the hatching distance). Set zero to get a solid interface.
(( ConfigOptionFloat , support_material_interface_spacing ))
(( ConfigOptionFloatOrPercent , support_material_interface_speed ))
(( ConfigOptionEnum < SupportMaterialPattern > , support_material_pattern ))
(( ConfigOptionEnum < SupportMaterialInterfacePattern > , support_material_interface_pattern ))
// Morphological closing of support areas. Only used for "sung" supports.
(( ConfigOptionFloat , support_material_closing_radius ))
// Spacing between support material lines (the hatching distance).
(( ConfigOptionFloat , support_material_spacing ))
(( ConfigOptionFloat , support_material_speed ))
(( ConfigOptionEnum < SupportMaterialStyle > , support_material_style ))
(( ConfigOptionBool , support_material_synchronize_layers ))
// Overhang angle threshold.
(( ConfigOptionInt , support_material_threshold ))
(( ConfigOptionBool , support_material_with_sheath ))
(( ConfigOptionFloatOrPercent , support_material_xy_spacing ))
(( ConfigOptionBool , thick_bridges ))
(( ConfigOptionFloat , xy_size_compensation ))
(( ConfigOptionBool , wipe_into_objects ))
)
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.
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
PrintRegionConfig ,
(( ConfigOptionFloat , bridge_angle ))
(( ConfigOptionInt , bottom_solid_layers ))
(( ConfigOptionFloat , bottom_solid_min_thickness ))
(( ConfigOptionFloat , bridge_flow_ratio ))
(( ConfigOptionFloat , bridge_speed ))
(( ConfigOptionBool , ensure_vertical_shell_thickness ))
(( ConfigOptionEnum < InfillPattern > , top_fill_pattern ))
(( ConfigOptionEnum < InfillPattern > , bottom_fill_pattern ))
(( ConfigOptionFloatOrPercent , external_perimeter_extrusion_width ))
(( ConfigOptionFloatOrPercent , external_perimeter_speed ))
(( ConfigOptionBool , external_perimeters_first ))
(( ConfigOptionBool , extra_perimeters ))
(( ConfigOptionFloat , fill_angle ))
(( ConfigOptionPercent , fill_density ))
(( ConfigOptionEnum < InfillPattern > , fill_pattern ))
(( ConfigOptionEnum < FuzzySkinType > , fuzzy_skin ))
(( ConfigOptionFloat , fuzzy_skin_thickness ))
(( ConfigOptionFloat , fuzzy_skin_point_dist ))
(( ConfigOptionBool , gap_fill_enabled ))
(( ConfigOptionFloat , gap_fill_speed ))
(( ConfigOptionFloatOrPercent , infill_anchor ))
(( ConfigOptionFloatOrPercent , infill_anchor_max ))
(( ConfigOptionInt , infill_extruder ))
(( ConfigOptionFloatOrPercent , infill_extrusion_width ))
(( ConfigOptionInt , infill_every_layers ))
(( ConfigOptionFloatOrPercent , infill_overlap ))
(( ConfigOptionFloat , infill_speed ))
2020-04-14 11:53:28 +02:00
// Ironing options
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02:00
(( ConfigOptionBool , overhangs ))
(( ConfigOptionInt , perimeter_extruder ))
(( ConfigOptionFloatOrPercent , perimeter_extrusion_width ))
(( ConfigOptionFloat , perimeter_speed ))
2018-09-17 15:12:13 +02:00
// Total number of perimeters.
2021-04-26 18:37:10 +02:00
(( ConfigOptionInt , perimeters ))
(( ConfigOptionFloatOrPercent , small_perimeter_speed ))
(( ConfigOptionFloat , solid_infill_below_area ))
(( ConfigOptionInt , solid_infill_extruder ))
(( ConfigOptionFloatOrPercent , solid_infill_extrusion_width ))
(( ConfigOptionInt , solid_infill_every_layers ))
(( ConfigOptionFloatOrPercent , solid_infill_speed ))
2018-09-17 15:12:13 +02:00
// Detect thin walls.
2021-04-26 18:37:10 +02:00
(( ConfigOptionBool , thin_walls ))
(( ConfigOptionFloatOrPercent , top_infill_extrusion_width ))
(( ConfigOptionInt , top_solid_layers ))
(( ConfigOptionFloat , top_solid_min_thickness ))
(( ConfigOptionFloatOrPercent , top_solid_infill_speed ))
(( ConfigOptionBool , wipe_into_infill ))
)
2018-11-19 13:13:05 +01:00
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
MachineEnvelopeConfig ,
2013-12-31 15:52:37 +01:00
2021-04-26 18:37:10 +02:00
// Allowing the machine limits to be completely ignored or used just for time estimator.
(( ConfigOptionEnum < MachineLimitsUsage > , machine_limits_usage ))
2018-06-20 13:57:37 +02:00
// M201 X... Y... Z... E... [mm/sec^2]
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloats , machine_max_acceleration_x ))
(( ConfigOptionFloats , machine_max_acceleration_y ))
(( ConfigOptionFloats , machine_max_acceleration_z ))
(( ConfigOptionFloats , machine_max_acceleration_e ))
2018-06-20 13:57:37 +02:00
// M203 X... Y... Z... E... [mm/sec]
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloats , machine_max_feedrate_x ))
(( ConfigOptionFloats , machine_max_feedrate_y ))
(( ConfigOptionFloats , machine_max_feedrate_z ))
(( ConfigOptionFloats , machine_max_feedrate_e ))
2021-03-30 13:37:49 +02:00
// M204 P... R... T...[mm/sec^2]
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloats , machine_max_acceleration_extruding ))
(( ConfigOptionFloats , machine_max_acceleration_retracting ))
(( ConfigOptionFloats , machine_max_acceleration_travel ))
2021-03-30 13:37:49 +02:00
2018-06-20 13:57:37 +02:00
// M205 X... Y... Z... E... [mm/sec]
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloats , machine_max_jerk_x ))
(( ConfigOptionFloats , machine_max_jerk_y ))
(( ConfigOptionFloats , machine_max_jerk_z ))
(( ConfigOptionFloats , machine_max_jerk_e ))
2018-06-20 13:57:37 +02:00
// M205 T... [mm/sec]
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloats , machine_min_travel_rate ))
2018-06-20 13:57:37 +02:00
// M205 S... [mm/sec]
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloats , machine_min_extruding_rate ))
)
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.
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
GCodeConfig ,
(( ConfigOptionString , before_layer_gcode ))
(( ConfigOptionString , between_objects_gcode ))
(( ConfigOptionFloats , deretract_speed ))
(( ConfigOptionString , end_gcode ))
(( ConfigOptionStrings , end_filament_gcode ))
(( ConfigOptionString , extrusion_axis ))
(( ConfigOptionFloats , extrusion_multiplier ))
(( ConfigOptionFloats , filament_diameter ))
(( ConfigOptionFloats , filament_density ))
(( ConfigOptionStrings , filament_type ))
(( ConfigOptionBools , filament_soluble ))
(( ConfigOptionFloats , filament_cost ))
(( ConfigOptionFloats , filament_spool_weight ))
(( ConfigOptionFloats , filament_max_volumetric_speed ))
(( ConfigOptionFloats , filament_loading_speed ))
(( ConfigOptionFloats , filament_loading_speed_start ))
(( ConfigOptionFloats , filament_load_time ))
(( ConfigOptionFloats , filament_unloading_speed ))
(( ConfigOptionFloats , filament_unloading_speed_start ))
(( ConfigOptionFloats , filament_toolchange_delay ))
(( ConfigOptionFloats , filament_unload_time ))
(( ConfigOptionInts , filament_cooling_moves ))
(( ConfigOptionFloats , filament_cooling_initial_speed ))
(( ConfigOptionFloats , filament_minimal_purge_on_wipe_tower ))
(( ConfigOptionFloats , filament_cooling_final_speed ))
(( ConfigOptionStrings , filament_ramming_parameters ))
(( ConfigOptionBool , gcode_comments ))
(( ConfigOptionEnum < GCodeFlavor > , gcode_flavor ))
(( ConfigOptionBool , gcode_label_objects ))
(( ConfigOptionString , layer_gcode ))
(( ConfigOptionFloat , max_print_speed ))
(( ConfigOptionFloat , max_volumetric_speed ))
//#ifdef HAS_PRESSURE_EQUALIZER
// ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope_positive))
// ((ConfigOptionFloat, max_volumetric_extrusion_rate_slope_negative))
//#endif
(( ConfigOptionPercents , retract_before_wipe ))
(( ConfigOptionFloats , retract_length ))
(( ConfigOptionFloats , retract_length_toolchange ))
(( ConfigOptionFloats , retract_lift ))
(( ConfigOptionFloats , retract_lift_above ))
(( ConfigOptionFloats , retract_lift_below ))
(( ConfigOptionFloats , retract_restart_extra ))
(( ConfigOptionFloats , retract_restart_extra_toolchange ))
(( ConfigOptionFloats , retract_speed ))
(( ConfigOptionString , start_gcode ))
(( ConfigOptionStrings , start_filament_gcode ))
(( ConfigOptionBool , single_extruder_multi_material ))
(( ConfigOptionBool , single_extruder_multi_material_priming ))
(( ConfigOptionBool , wipe_tower_no_sparse_layers ))
(( ConfigOptionString , toolchange_gcode ))
(( ConfigOptionFloat , travel_speed ))
(( ConfigOptionBool , use_firmware_retraction ))
(( ConfigOptionBool , use_relative_e_distances ))
(( ConfigOptionBool , use_volumetric_e ))
(( ConfigOptionBool , variable_layer_height ))
(( ConfigOptionFloat , cooling_tube_retraction ))
(( ConfigOptionFloat , cooling_tube_length ))
(( ConfigOptionBool , high_current_on_filament_swap ))
(( ConfigOptionFloat , parking_pos_retraction ))
(( ConfigOptionBool , remaining_times ))
(( ConfigOptionBool , silent_mode ))
(( ConfigOptionFloat , extra_loading_move ))
(( ConfigOptionString , color_change_gcode ))
(( ConfigOptionString , pause_print_gcode ))
(( ConfigOptionString , template_custom_gcode ))
)
static inline std :: string get_extrusion_axis ( const GCodeConfig & cfg )
2014-10-18 17:41:21 +02:00
{
2021-04-26 18:37:10 +02:00
return
(( cfg . gcode_flavor . value == gcfMach3 ) || ( cfg . gcode_flavor . value == gcfMachinekit )) ? "A" :
( cfg . gcode_flavor . value == gcfNoExtrusion ) ? "" : cfg . extrusion_axis . value ;
}
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.
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DERIVED_DEFINE (
PrintConfig ,
( MachineEnvelopeConfig , GCodeConfig ),
2017-10-17 16:01:18 +02:00
2021-04-26 18:37:10 +02:00
(( ConfigOptionBool , avoid_crossing_perimeters ))
(( ConfigOptionFloatOrPercent , avoid_crossing_perimeters_max_detour ))
(( ConfigOptionPoints , bed_shape ))
(( ConfigOptionInts , bed_temperature ))
(( ConfigOptionFloat , bridge_acceleration ))
(( ConfigOptionInts , bridge_fan_speed ))
(( ConfigOptionBool , complete_objects ))
(( ConfigOptionFloats , colorprint_heights ))
(( ConfigOptionBools , cooling ))
(( ConfigOptionFloat , default_acceleration ))
(( ConfigOptionInts , disable_fan_first_layers ))
(( ConfigOptionFloat , duplicate_distance ))
(( ConfigOptionFloat , extruder_clearance_height ))
(( ConfigOptionFloat , extruder_clearance_radius ))
(( ConfigOptionStrings , extruder_colour ))
(( ConfigOptionPoints , extruder_offset ))
(( ConfigOptionBools , fan_always_on ))
(( ConfigOptionInts , fan_below_layer_time ))
(( ConfigOptionStrings , filament_colour ))
(( ConfigOptionStrings , filament_notes ))
(( ConfigOptionFloat , first_layer_acceleration ))
(( ConfigOptionInts , first_layer_bed_temperature ))
(( ConfigOptionFloatOrPercent , first_layer_extrusion_width ))
(( ConfigOptionFloatOrPercent , first_layer_height ))
(( ConfigOptionFloatOrPercent , first_layer_speed ))
(( ConfigOptionInts , first_layer_temperature ))
(( ConfigOptionInts , full_fan_speed_layer ))
(( ConfigOptionFloat , infill_acceleration ))
(( ConfigOptionBool , infill_first ))
(( ConfigOptionInts , max_fan_speed ))
(( ConfigOptionFloats , max_layer_height ))
(( ConfigOptionInts , min_fan_speed ))
(( ConfigOptionFloats , min_layer_height ))
(( ConfigOptionFloat , max_print_height ))
(( ConfigOptionFloats , min_print_speed ))
(( 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 ))
(( ConfigOptionString , printer_model ))
(( ConfigOptionString , printer_notes ))
(( ConfigOptionFloat , resolution ))
(( ConfigOptionFloats , retract_before_travel ))
(( ConfigOptionBools , retract_layer_change ))
(( ConfigOptionFloat , skirt_distance ))
(( ConfigOptionInt , skirt_height ))
(( ConfigOptionBool , draft_shield ))
(( ConfigOptionInt , skirts ))
(( ConfigOptionInts , slowdown_below_layer_time ))
(( ConfigOptionBool , spiral_vase ))
(( ConfigOptionInt , standby_temperature_delta ))
(( ConfigOptionInts , temperature ))
(( ConfigOptionInt , threads ))
(( ConfigOptionBools , wipe ))
(( ConfigOptionBool , wipe_tower ))
(( ConfigOptionFloat , wipe_tower_x ))
(( ConfigOptionFloat , wipe_tower_y ))
(( ConfigOptionFloat , wipe_tower_width ))
(( ConfigOptionFloat , wipe_tower_per_color_wipe ))
(( ConfigOptionFloat , wipe_tower_rotation_angle ))
(( ConfigOptionFloat , wipe_tower_brim_width ))
(( ConfigOptionFloat , wipe_tower_bridging ))
(( ConfigOptionFloats , wiping_volumes_matrix ))
(( ConfigOptionFloats , wiping_volumes_extruders ))
(( ConfigOptionFloat , z_offset ))
)
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.
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DERIVED_DEFINE0 (
FullPrintConfig ,
( PrintObjectConfig , PrintRegionConfig , PrintConfig )
)
2016-08-21 19:09:31 +02:00
2021-04-26 18:37:10 +02:00
// Validate the FullPrintConfig. Returns an empty string on success, otherwise an error message is returned.
std :: string validate ( const FullPrintConfig & config );
2018-03-16 13:58:58 +01:00
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
SLAPrintConfig ,
(( ConfigOptionString , output_filename_format ))
)
2013-12-31 15:52:37 +01:00
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
SLAPrintObjectConfig ,
2018-12-03 13:14:28 +01:00
2021-04-26 18:37:10 +02: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]
2021-04-26 18:37:10 +02:00
(( ConfigOptionInt , faded_layers )) /*= 10*/
2019-02-18 16:04:55 +01:00
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , slice_closing_radius ))
2019-03-01 17:53:02 +01:00
2018-11-22 18:02:05 +01:00
// Enabling or disabling support creation
2021-04-26 18:37:10 +02:00
(( ConfigOptionBool , supports_enable ))
2018-11-22 18:02:05 +01:00
2018-11-23 13:03:07 +01:00
// Diameter in mm of the pointing side of the head.
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02: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.
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , support_head_width )) /*= 1.0*/
2018-11-09 13:45:55 +01:00
// Radius in mm of the support pillars.
2021-04-26 18:37:10 +02: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.
2021-04-26 18:37:10 +02:00
(( 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.
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02:00
(( ConfigOptionEnum < SLAPillarConnectionMode > , support_pillar_connection_mode ))
2019-01-09 12:21:43 +01:00
2019-02-05 11:16:03 +01:00
// Generate only ground facing supports
2021-04-26 18:37:10 +02:00
(( ConfigOptionBool , support_buildplate_only ))
2019-02-05 11:16:03 +01:00
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.
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , support_pillar_widening_factor ))
2018-11-23 11:51:45 +01:00
2018-11-09 13:45:55 +01:00
// Radius in mm of the pillar base.
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , support_base_diameter )) /*= 2.0*/
2018-11-09 13:45:55 +01:00
// The height of the pillar base cone in mm.
2021-04-26 18:37:10 +02: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.
2021-04-26 18:37:10 +02: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.
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , support_critical_angle )) /*= 45*/
2018-11-09 13:45:55 +01:00
// The max length of a bridge in mm
2021-04-26 18:37:10 +02: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.
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , support_max_pillar_link_distance ))
2019-03-08 11:39:34 +01:00
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.
2021-04-26 18:37:10 +02: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:
2021-04-26 18:37:10 +02: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
2021-04-26 18:37:10 +02:00
(( ConfigOptionBool , pad_enable ))
2018-11-22 18:02:05 +01:00
// The thickness of the pad walls
2021-04-26 18:37:10 +02: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
2021-04-26 18:37:10 +02: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
2021-04-26 18:37:10 +02:00
(( 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.
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , pad_max_merge_distance )) /*= 50*/
2018-11-22 18:02:05 +01:00
// The smoothing radius of the pad edges
2021-04-26 18:37:10 +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...
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02:00
(( ConfigOptionBool , pad_around_object ))
2021-02-24 09:22:31 +01:00
2021-04-26 18:37:10 +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
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02: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.
2021-04-26 18:37:10 +02:00
(( 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
2021-04-26 18:37:10 +02: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.
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , hollowing_closing_distance ))
)
2019-02-25 12:06:38 +01:00
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
SLAMaterialConfig ,
2018-11-09 12:02:42 +01:00
2021-04-26 18:37:10 +02:00
(( ConfigOptionFloat , initial_layer_height ))
(( ConfigOptionFloat , bottle_cost ))
(( ConfigOptionFloat , bottle_volume ))
(( ConfigOptionFloat , bottle_weight ))
(( ConfigOptionFloat , material_density ))
(( ConfigOptionFloat , exposure_time ))
(( ConfigOptionFloat , initial_exposure_time ))
(( ConfigOptionFloats , material_correction ))
)
2018-07-31 15:09:57 +02:00
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DEFINE (
SLAPrinterConfig ,
2018-07-31 15:09:57 +02:00
2021-04-26 18:37:10 +02:00
(( 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 ))
(( ConfigOptionEnum < SLADisplayOrientation > , display_orientation ))
(( ConfigOptionBool , display_mirror_x ))
(( ConfigOptionBool , display_mirror_y ))
(( ConfigOptionFloats , relative_correction ))
(( ConfigOptionFloat , absolute_correction ))
(( ConfigOptionFloat , elefant_foot_compensation ))
(( ConfigOptionFloat , elefant_foot_min_width ))
(( ConfigOptionFloat , gamma_correction ))
(( ConfigOptionFloat , fast_tilt_time ))
(( ConfigOptionFloat , slow_tilt_time ))
(( ConfigOptionFloat , area_fill ))
(( 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
2021-04-26 18:37:10 +02:00
PRINT_CONFIG_CLASS_DERIVED_DEFINE0 (
SLAFullPrintConfig ,
( SLAPrinterConfig , SLAPrintConfig , SLAPrintObjectConfig , SLAMaterialConfig )
)
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
2021-04-26 18:37:10 +02:00
#undef PRINT_CONFIG_CLASS_ELEMENT_DEFINITION
#undef PRINT_CONFIG_CLASS_ELEMENT_EQUAL
#undef PRINT_CONFIG_CLASS_ELEMENT_HASH
#undef PRINT_CONFIG_CLASS_ELEMENT_INITIALIZATION
#undef PRINT_CONFIG_CLASS_ELEMENT_INITIALIZATION2
#undef PRINT_CONFIG_CLASS_DEFINE
#undef PRINT_CONFIG_CLASS_DERIVED_CLASS_LIST
#undef PRINT_CONFIG_CLASS_DERIVED_CLASS_LIST_ITEM
#undef PRINT_CONFIG_CLASS_DERIVED_DEFINE
#undef PRINT_CONFIG_CLASS_DERIVED_DEFINE0
#undef PRINT_CONFIG_CLASS_DERIVED_DEFINE1
#undef PRINT_CONFIG_CLASS_DERIVED_HASH
#undef PRINT_CONFIG_CLASS_DERIVED_EQUAL
#undef PRINT_CONFIG_CLASS_DERIVED_INITCACHE_ITEM
#undef PRINT_CONFIG_CLASS_DERIVED_INITCACHE
#undef PRINT_CONFIG_CLASS_DERIVED_INITIALIZER
#undef PRINT_CONFIG_CLASS_DERIVED_INITIALIZER_ITEM
2017-10-17 16:01:18 +02:00
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