2013-12-07 16:14:30 +01:00
#ifndef slic3r_Config_hpp_
#define slic3r_Config_hpp_
#include <myinit.h>
#include <map>
#include <string>
#include <vector>
2013-12-20 16:37:28 +01:00
namespace Slic3r {
2013-12-07 16:14:30 +01:00
typedef std :: string t_config_option_key ;
typedef std :: vector < std :: string > t_config_option_keys ;
2013-12-20 16:37:28 +01:00
class ConfigOption {
public :
virtual ~ ConfigOption () {};
};
class ConfigOptionFloat : public ConfigOption
2013-12-07 16:14:30 +01:00
{
public :
2013-12-20 16:37:28 +01:00
float value ;
operator float () const { return this -> value ; };
};
class ConfigOptionInt : public ConfigOption
{
public :
int value ;
operator int () const { return this -> value ; };
};
class ConfigOptionString : public ConfigOption
{
public :
std :: string value ;
operator std :: string () const { return this -> value ; };
};
class ConfigOptionFloatOrPercent : public ConfigOption
{
public :
float value ;
bool percent ;
2013-12-07 16:14:30 +01:00
};
enum ConfigOptionType {
coFloat ,
coInt ,
coString ,
2013-12-20 16:37:28 +01:00
coFloatOrPercent ,
2013-12-07 16:14:30 +01:00
};
class ConfigOptionDef
{
public :
ConfigOptionType type ;
std :: string label ;
std :: string tooltip ;
};
typedef std :: map < t_config_option_key , ConfigOptionDef > t_optiondef_map ;
class ConfigBase
{
public :
virtual ConfigOption * option ( const t_config_option_key opt_key ) = 0 ;
virtual void keys ( t_config_option_keys * keys ) = 0 ;
2013-12-20 16:37:28 +01:00
void apply ( ConfigBase & other , bool ignore_nonexistent = false );
2013-12-07 16:14:30 +01:00
2013-12-20 16:37:28 +01:00
#ifdef SLIC3RXS
SV * get ( t_config_option_key opt_key );
#endif
2013-12-07 16:14:30 +01:00
};
class DynamicConfig : public ConfigBase
{
public :
2013-12-20 16:37:28 +01:00
ConfigOption * option ( const t_config_option_key opt_key );
void keys ( t_config_option_keys * keys );
bool has ( const t_config_option_key opt_key ) const ;
private :
typedef std :: map < t_config_option_key , ConfigOption *> t_options_map ;
2013-12-07 16:14:30 +01:00
t_options_map options ;
};
class StaticConfig : public ConfigBase
{
public :
2013-12-20 16:37:28 +01:00
void keys ( t_config_option_keys * keys );
2013-12-07 16:14:30 +01:00
};
class FullConfig : public StaticConfig
{
public :
2013-12-20 16:37:28 +01:00
ConfigOptionFloat layer_height ;
ConfigOptionFloatOrPercent first_layer_height ;
2013-12-07 16:14:30 +01:00
ConfigOption * option ( const t_config_option_key opt_key ) {
if ( opt_key == "layer_height" ) return & this -> layer_height ;
if ( opt_key == "first_layer_height" ) return & this -> first_layer_height ;
return NULL ;
};
};
2013-12-20 16:37:28 +01:00
static t_optiondef_map _build_optiondef_map () {
t_optiondef_map Options ;
Options [ "layer_height" ]. type = coFloat ;
Options [ "layer_height" ]. label = "Layer height" ;
Options [ "layer_height" ]. tooltip = "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print." ;
Options [ "first_layer_height" ]. type = coFloatOrPercent ;
return Options ;
}
static FullConfig _build_default_config () {
FullConfig defconf ;
defconf . layer_height . value = 0.4 ;
defconf . first_layer_height . value = 0.35 ;
defconf . first_layer_height . percent = false ;
return defconf ;
}
2013-12-07 16:14:30 +01:00
}
#endif