695c92fb00
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.
119 lines
2.9 KiB
Plaintext
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
|
|
|
|
%}
|
|
|