From e0c0a42a8b81c71d894cfb9a442769953f878290 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sat, 21 Dec 2013 16:32:11 +0100 Subject: [PATCH] Expose static PrintConfig objects to Perl and test apply() --- xs/src/Config.cpp | 9 +++++++-- xs/t/15_config.t | 15 +++++++++++---- xs/xsp/Config.xsp | 15 +++++++++++++++ xs/xsp/my.map | 1 + xs/xsp/typemap.xspt | 1 + 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/xs/src/Config.cpp b/xs/src/Config.cpp index be816670c..5c63a8c5c 100644 --- a/xs/src/Config.cpp +++ b/xs/src/Config.cpp @@ -11,8 +11,13 @@ ConfigBase::apply(ConfigBase &other, bool ignore_nonexistent) { // loop through options and apply them for (t_config_option_keys::const_iterator it = opt_keys.begin(); it != opt_keys.end(); ++it) { ConfigOption* my_opt = this->option(*it); - if (my_opt == NULL && ignore_nonexistent == false) throw "Attempt to apply non-existent option"; - *my_opt = *(other.option(*it)); + if (my_opt == NULL) { + if (ignore_nonexistent == false) throw "Attempt to apply non-existent option"; + continue; + } + + // not the most efficient way, but easier than casting pointers to subclasses + my_opt->deserialize( other.option(*it)->serialize() ); } } diff --git a/xs/t/15_config.t b/xs/t/15_config.t index 2a5b4d497..5e4719824 100644 --- a/xs/t/15_config.t +++ b/xs/t/15_config.t @@ -4,11 +4,9 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 33; +use Test::More tests => 67; -{ - my $config = Slic3r::Config->new; - +foreach my $config (Slic3r::Config->new, Slic3r::Config::Print->new) { $config->set('layer_height', 0.3); ok abs($config->get('layer_height') - 0.3) < 1e-4, 'set/get float'; is $config->serialize('layer_height'), '0.3', 'serialize float'; @@ -77,4 +75,13 @@ use Test::More tests => 33; is_deeply $config->get('wipe'), [0,1,1], 'deserialize bools'; } +{ + my $config = Slic3r::Config->new; + $config->set('perimeters', 2); + + my $config2 = Slic3r::Config::Print->new; + $config2->apply_dynamic($config); + is $config2->get('perimeters'), 2, 'apply (dynamic -> static)'; +} + __END__ diff --git a/xs/xsp/Config.xsp b/xs/xsp/Config.xsp index f4608a784..da8925cfd 100644 --- a/xs/xsp/Config.xsp +++ b/xs/xsp/Config.xsp @@ -17,3 +17,18 @@ %} }; + +%name{Slic3r::Config::Print} class PrintConfig { + PrintConfig(); + ~PrintConfig(); + SV* get(t_config_option_key opt_key); + void set(t_config_option_key opt_key, SV* value); + void set_deserialize(t_config_option_key opt_key, std::string str); + std::string serialize(t_config_option_key opt_key); + float get_abs_value(t_config_option_key opt_key); + void apply_dynamic(DynamicPrintConfig* other, bool ignore_nonexistent = false) + %code{% THIS->apply(*other, ignore_nonexistent); %}; +%{ + +%} +}; diff --git a/xs/xsp/my.map b/xs/xsp/my.map index bd7abe043..9eac43f0e 100644 --- a/xs/xsp/my.map +++ b/xs/xsp/my.map @@ -2,6 +2,7 @@ std::vector T_STD_VECTOR_INT t_config_option_key T_STD_STRING DynamicPrintConfig* O_OBJECT +PrintConfig* O_OBJECT ZTable* O_OBJECT TriangleMesh* O_OBJECT Point* O_OBJECT diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt index 5ff11b6af..67a16b654 100644 --- a/xs/xsp/typemap.xspt +++ b/xs/xsp/typemap.xspt @@ -8,6 +8,7 @@ %typemap{AV*}; %typemap{Point*}; %typemap{DynamicPrintConfig*}; +%typemap{PrintConfig*}; %typemap{ExPolygon*}; %typemap{ExPolygonCollection*}; %typemap{Line*};