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.
94 lines
2.5 KiB
Plaintext
94 lines
2.5 KiB
Plaintext
%module{Slic3r::XS};
|
|
|
|
%{
|
|
#include <xsinit.h>
|
|
#include "libslic3r/BoundingBox.hpp"
|
|
#include "libslic3r/ClipperUtils.hpp"
|
|
#include "libslic3r/Polyline.hpp"
|
|
%}
|
|
|
|
%name{Slic3r::Polyline} class Polyline {
|
|
~Polyline();
|
|
Clone<Polyline> clone()
|
|
%code{% RETVAL = THIS; %};
|
|
SV* arrayref()
|
|
%code{% RETVAL = to_AV(THIS); %};
|
|
SV* pp()
|
|
%code{% RETVAL = to_SV_pureperl(THIS); %};
|
|
void scale(double factor);
|
|
void translate(double x, double y);
|
|
void pop_back()
|
|
%code{% THIS->points.pop_back(); %};
|
|
void reverse();
|
|
Lines lines();
|
|
Clone<Point> first_point();
|
|
Clone<Point> last_point();
|
|
Points equally_spaced_points(double distance);
|
|
double length();
|
|
bool is_valid();
|
|
void clip_end(double distance);
|
|
void clip_start(double distance);
|
|
void extend_end(double distance);
|
|
void extend_start(double distance);
|
|
void simplify(double tolerance);
|
|
void simplify_by_visibility(ExPolygon* expolygon)
|
|
%code{% THIS->simplify_by_visibility(*expolygon); %};
|
|
void split_at(Point* point, Polyline* p1, Polyline* p2)
|
|
%code{% THIS->split_at(*point, p1, p2); %};
|
|
bool is_straight();
|
|
Clone<BoundingBox> bounding_box();
|
|
void remove_duplicate_points();
|
|
std::string wkt();
|
|
%{
|
|
|
|
Polyline*
|
|
Polyline::new(...)
|
|
CODE:
|
|
RETVAL = new Polyline ();
|
|
// ST(0) is class name, ST(1) is first point
|
|
RETVAL->points.resize(items-1);
|
|
for (unsigned int i = 1; i < items; i++) {
|
|
from_SV_check(ST(i), &RETVAL->points[i-1]);
|
|
}
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
void
|
|
Polyline::append(...)
|
|
CODE:
|
|
for (unsigned int i = 1; i < items; i++) {
|
|
Point p;
|
|
from_SV_check(ST(i), &p);
|
|
THIS->points.push_back(p);
|
|
}
|
|
|
|
void
|
|
Polyline::append_polyline(polyline)
|
|
Polyline* polyline;
|
|
CODE:
|
|
for (Points::const_iterator it = polyline->points.begin(); it != polyline->points.end(); ++it) {
|
|
THIS->points.push_back((*it));
|
|
}
|
|
|
|
void
|
|
Polyline::rotate(angle, center_sv)
|
|
double angle;
|
|
SV* center_sv;
|
|
CODE:
|
|
Point center;
|
|
from_SV_check(center_sv, ¢er);
|
|
THIS->rotate(angle, center);
|
|
|
|
Polygons
|
|
Polyline::grow(delta, joinType = ClipperLib::jtSquare, miterLimit = 3)
|
|
const float delta
|
|
ClipperLib::JoinType joinType
|
|
double miterLimit
|
|
CODE:
|
|
offset(*THIS, &RETVAL, delta, joinType, miterLimit);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
%}
|
|
};
|