diff --git a/xs/src/Line.hpp b/xs/src/Line.hpp index 94e400595..466f5efae 100644 --- a/xs/src/Line.hpp +++ b/xs/src/Line.hpp @@ -23,6 +23,7 @@ class Line void from_SV(SV* line_sv); void from_SV_check(SV* line_sv); SV* to_SV(); + SV* to_SV_ref(); SV* to_SV_pureperl(); void scale(double factor); void translate(double x, double y); @@ -93,6 +94,13 @@ Line::to_SV() { return newRV_noinc((SV*)av); } +SV* +Line::to_SV_ref() { + SV* sv = newSV(0); + sv_setref_pv( sv, "Slic3r::Line", new Line(*this) ); + return sv; +} + SV* Line::to_SV_pureperl() { AV* av = newAV(); @@ -102,6 +110,19 @@ Line::to_SV_pureperl() { return newRV_noinc((SV*)av); } +SV* +lines2perl(pTHX_ Lines& lines) +{ + AV* av = newAV(); + av_extend(av, lines.size()-1); + int i = 0; + for (Lines::iterator it = lines.begin(); it != lines.end(); ++it) { + SV* sv = (*it).to_SV_ref(); + av_store(av, i++, sv); + } + return (SV*)newRV_noinc((SV*)av); +} + } #endif diff --git a/xs/t/06_polygon.t b/xs/t/06_polygon.t index d024fd76c..566120021 100644 --- a/xs/t/06_polygon.t +++ b/xs/t/06_polygon.t @@ -14,7 +14,7 @@ my $square = [ # ccw ]; my $polygon = Slic3r::Polygon->new(@$square); -is_deeply [ @{$polygon->pp} ], [ @$square ], 'polygon roundtrip'; +is_deeply $polygon->pp, $square, 'polygon roundtrip'; is ref($polygon->arrayref), 'ARRAY', 'polygon arrayref is unblessed'; isa_ok $polygon->[0], 'Slic3r::Point', 'polygon point is blessed'; diff --git a/xs/xsp/Polyline.xsp b/xs/xsp/Polyline.xsp index 11e0500d5..acce6b560 100644 --- a/xs/xsp/Polyline.xsp +++ b/xs/xsp/Polyline.xsp @@ -16,6 +16,7 @@ void pop_back() %code{% THIS->points.pop_back(); %}; void reverse(); + Lines lines(); %{ Polyline* diff --git a/xs/xsp/my.map b/xs/xsp/my.map index a1f66e08e..c6c55c3d6 100644 --- a/xs/xsp/my.map +++ b/xs/xsp/my.map @@ -13,3 +13,17 @@ SurfaceCollection* O_OBJECT ExtrusionRole T_UV SurfaceType T_UV + +Lines T_LINES +Lines* T_LINES_PTR + +INPUT + +OUTPUT + +T_LINES + $arg = lines2perl(aTHX_ $var); + +T_LINES_PTR + $arg = lines2perl(aTHX_ *$var); + delete $var; diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt index 62c73e92b..2357bdf8e 100644 --- a/xs/xsp/typemap.xspt +++ b/xs/xsp/typemap.xspt @@ -6,6 +6,8 @@ %typemap{ExPolygon*}; %typemap{Polyline*}; %typemap{Polygon*}; +%typemap{Lines}; + %typemap{SurfaceType}{parsed}{ %cpp_type{SurfaceType}; %precall_code{%