PrusaSlicer-NonPlainar/xs/xsp/Surface.xsp
bubnikv 695c92fb00 CLIPPER_OFFSET_SCALE was made a power of two, the scaling functions
inside ClipperUtils are now using bit shifts instead of multiplication
by doubles, which makes the scaling precise.

Removed the scale parameter from all offset functions.

Modified the safety offset to calculate offset per polygon instead
of over all polygons at once. The old way was not safe and very slow,
sometimes this meant a kiss of death for supports for example.
2016-11-28 17:33:17 +01:00

119 lines
2.9 KiB
Plaintext

%module{Slic3r::XS};
%{
#include <xsinit.h>
#include "libslic3r/Surface.hpp"
#include "libslic3r/ClipperUtils.hpp"
%}
%name{Slic3r::Surface} class Surface {
~Surface();
Ref<ExPolygon> expolygon()
%code{% RETVAL = &(THIS->expolygon); %};
double thickness()
%code{% RETVAL = THIS->thickness; %};
unsigned short thickness_layers()
%code{% RETVAL = THIS->thickness_layers; %};
double area();
bool is_solid() const;
bool is_external() const;
bool is_internal() const;
bool is_bottom() const;
bool is_bridge() const;
%{
Surface*
_new(CLASS, expolygon, surface_type, thickness, thickness_layers, bridge_angle, extra_perimeters)
char* CLASS;
ExPolygon* expolygon;
SurfaceType surface_type;
double thickness;
unsigned short thickness_layers;
double bridge_angle;
unsigned short extra_perimeters;
CODE:
RETVAL = new Surface (surface_type, *expolygon);
RETVAL->thickness = thickness;
RETVAL->thickness_layers = thickness_layers;
RETVAL->bridge_angle = bridge_angle;
RETVAL->extra_perimeters = extra_perimeters;
// we don't delete expolygon here because it's referenced by a Perl SV
// whose DESTROY will take care of destruction
OUTPUT:
RETVAL
SurfaceType
Surface::surface_type(...)
CODE:
if (items > 1) {
THIS->surface_type = (SurfaceType)SvUV(ST(1));
}
RETVAL = THIS->surface_type;
OUTPUT:
RETVAL
double
Surface::bridge_angle(...)
CODE:
if (items > 1) {
THIS->bridge_angle = (double)SvNV(ST(1));
}
RETVAL = THIS->bridge_angle;
OUTPUT:
RETVAL
unsigned short
Surface::extra_perimeters(...)
CODE:
if (items > 1) {
THIS->extra_perimeters = (double)SvUV(ST(1));
}
RETVAL = THIS->extra_perimeters;
OUTPUT:
RETVAL
Polygons
Surface::polygons()
CODE:
RETVAL.push_back(THIS->expolygon.contour);
for (Polygons::iterator it = THIS->expolygon.holes.begin(); it != THIS->expolygon.holes.end(); ++it) {
RETVAL.push_back((*it));
}
OUTPUT:
RETVAL
Surfaces
Surface::offset(delta, joinType = ClipperLib::jtMiter, miterLimit = 3)
const float delta
ClipperLib::JoinType joinType
double miterLimit
CODE:
offset(*THIS, &RETVAL, delta, joinType, miterLimit);
OUTPUT:
RETVAL
%}
};
%package{Slic3r::Surface};
%{
IV
_constant()
ALIAS:
S_TYPE_TOP = stTop
S_TYPE_BOTTOM = stBottom
S_TYPE_BOTTOMBRIDGE = stBottomBridge
S_TYPE_INTERNAL = stInternal
S_TYPE_INTERNALSOLID = stInternalSolid
S_TYPE_INTERNALBRIDGE = stInternalBridge
S_TYPE_INTERNALVOID = stInternalVoid
S_TYPW_PERIMETER = stPerimeter
PROTOTYPE:
CODE:
RETVAL = ix;
OUTPUT: RETVAL
%}