diff --git a/xs/src/libslic3r/Config.cpp b/xs/src/libslic3r/Config.cpp index 48d125cad..417054e18 100644 --- a/xs/src/libslic3r/Config.cpp +++ b/xs/src/libslic3r/Config.cpp @@ -209,7 +209,7 @@ ConfigBase::set(t_config_option_key opt_key, SV* value) { optv->values.push_back(std::string(SvPV_nolen(*elem), SvCUR(*elem))); } } else if (ConfigOptionPoint* optv = dynamic_cast(opt)) { - return optv->point.from_SV(value); + return optv->point.from_SV_check(value); } else if (ConfigOptionPoints* optv = dynamic_cast(opt)) { std::vector values; AV* av = (AV*)SvRV(value); @@ -217,7 +217,7 @@ ConfigBase::set(t_config_option_key opt_key, SV* value) { for (size_t i = 0; i < len; i++) { SV** elem = av_fetch(av, i, 0); Pointf point; - if (elem == NULL || !point.from_SV(*elem)) return false; + if (elem == NULL || !point.from_SV_check(*elem)) return false; values.push_back(point); } optv->values = values; diff --git a/xs/src/libslic3r/Point.cpp b/xs/src/libslic3r/Point.cpp index c04ff71b3..ec13eb951 100644 --- a/xs/src/libslic3r/Point.cpp +++ b/xs/src/libslic3r/Point.cpp @@ -306,15 +306,16 @@ Pointf::from_SV(SV* point_sv) return true; } -void +bool Pointf::from_SV_check(SV* point_sv) { if (sv_isobject(point_sv) && (SvTYPE(SvRV(point_sv)) == SVt_PVMG)) { if (!sv_isa(point_sv, perl_class_name(this)) && !sv_isa(point_sv, perl_class_name_ref(this))) CONFESS("Not a valid %s object (got %s)", perl_class_name(this), HvNAME(SvSTASH(SvRV(point_sv)))); *this = *(Pointf*)SvIV((SV*)SvRV( point_sv )); + return true; } else { - this->from_SV(point_sv); + return this->from_SV(point_sv); } } #endif diff --git a/xs/src/libslic3r/Point.hpp b/xs/src/libslic3r/Point.hpp index f23f14a90..d70a14093 100644 --- a/xs/src/libslic3r/Point.hpp +++ b/xs/src/libslic3r/Point.hpp @@ -75,7 +75,7 @@ class Pointf #ifdef SLIC3RXS bool from_SV(SV* point_sv); - void from_SV_check(SV* point_sv); + bool from_SV_check(SV* point_sv); SV* to_SV_pureperl() const; #endif }; diff --git a/xs/t/15_config.t b/xs/t/15_config.t index 9b2f16ce0..cd4dc2654 100644 --- a/xs/t/15_config.t +++ b/xs/t/15_config.t @@ -4,7 +4,7 @@ use strict; use warnings; use Slic3r::XS; -use Test::More tests => 105; +use Test::More tests => 107; foreach my $config (Slic3r::Config->new, Slic3r::Config::Full->new) { $config->set('layer_height', 0.3); @@ -60,6 +60,8 @@ foreach my $config (Slic3r::Config->new, Slic3r::Config::Full->new) { $config->set('extruder_offset', [[10,20],[30,45]]); is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[10,20],[30,45]], 'set/get points'; + $config->set('extruder_offset', [Slic3r::Pointf->new(10,20),Slic3r::Pointf->new(30,45)]); + is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[10,20],[30,45]], 'set/get points'; is $config->serialize('extruder_offset'), '10x20,30x45', 'serialize points'; $config->set_deserialize('extruder_offset', '20x10'); is_deeply [ map $_->pp, @{$config->get('extruder_offset')} ], [[20,10]], 'deserialize points';