Ported diff_ex, intersection_ex, union_ex, xor_ex

This commit is contained in:
Alessandro Ranellucci 2013-07-17 00:29:09 +02:00
parent f7ada2b5db
commit bf8c799685
9 changed files with 72 additions and 48 deletions

View file

@ -139,8 +139,8 @@ offset2_ex(Slic3r::Polygons &polygons, Slic3r::ExPolygons &retval, const float d
delete output2;
}
void
diff_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval, bool safety_offset)
inline void _clipper_ex(ClipperLib::ClipType clipType, Slic3r::Polygons &subject,
Slic3r::Polygons &clip, Slic3r::ExPolygons &retval, bool safety_offset)
{
// read input
ClipperLib::Polygons* input_subject = new ClipperLib::Polygons();
@ -150,7 +150,11 @@ diff_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &r
// perform safety offset
if (safety_offset) {
// SafetyOffset(*input_clip);
if (clipType == ClipperLib::ctUnion) {
// SafetyOffset(*input_subject);
} else {
// SafetyOffset(*input_clip);
}
}
// init Clipper
@ -165,13 +169,35 @@ diff_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &r
// perform operation
ClipperLib::PolyTree* polytree = new ClipperLib::PolyTree();
clipper.Execute(ClipperLib::ctDifference, *polytree, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
clipper.Execute(clipType, *polytree, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
// convert into ExPolygons
PolyTreeToExPolygons(*polytree, retval);
delete polytree;
}
void
diff_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval, bool safety_offset)
{
_clipper_ex(ClipperLib::ctDifference, subject, clip, retval, safety_offset);
}
void intersection_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval,
bool safety_offset)
{
_clipper_ex(ClipperLib::ctIntersection, subject, clip, retval, safety_offset);
}
void xor_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval,
bool safety_offset)
{
_clipper_ex(ClipperLib::ctXor, subject, clip, retval, safety_offset);
}
void union_ex(Slic3r::Polygons &subject, Slic3r::ExPolygons &retval, bool safety_offset)
{
Slic3r::Polygons p;
_clipper_ex(ClipperLib::ctUnion, subject, p, retval, safety_offset);
}
}

View file

@ -30,7 +30,15 @@ void offset2_ex(Slic3r::Polygons &polygons, Slic3r::ExPolygons &retval, const fl
const float delta2, double scale = 100000, ClipperLib::JoinType joinType = ClipperLib::jtMiter,
double miterLimit = 3);
void diff_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval, bool safety_offset);
inline void _clipper_ex(ClipperLib::ClipType clipType, Slic3r::Polygons &subject,
Slic3r::Polygons &clip, Slic3r::ExPolygons &retval,
bool safety_offset);
void diff_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval, bool safety_offset = false);
void intersection_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval,
bool safety_offset = false);
void xor_ex(Slic3r::Polygons &subject, Slic3r::Polygons &clip, Slic3r::ExPolygons &retval,
bool safety_offset = false);
void union_ex(Slic3r::Polygons &subject, Slic3r::ExPolygons &retval, bool safety_offset = false);
}

View file

@ -45,4 +45,33 @@ diff_ex(subject, clip, safety_offset = false)
OUTPUT:
RETVAL
ExPolygons
intersection_ex(subject, clip, safety_offset = false)
Polygons subject
Polygons clip
bool safety_offset
CODE:
intersection_ex(subject, clip, RETVAL, safety_offset);
OUTPUT:
RETVAL
ExPolygons
xor_ex(subject, clip, safety_offset = false)
Polygons subject
Polygons clip
bool safety_offset
CODE:
xor_ex(subject, clip, RETVAL, safety_offset);
OUTPUT:
RETVAL
ExPolygons
union_ex(subject, safety_offset = false)
Polygons subject
bool safety_offset
CODE:
union_ex(subject, RETVAL, safety_offset);
OUTPUT:
RETVAL
%}

View file

@ -14,6 +14,7 @@ SurfaceCollection* O_OBJECT
ExtrusionRole T_UV
SurfaceType T_UV
ClipperLib::JoinType T_UV
ClipperLib::PolyFillType T_UV
Lines T_ARRAYREF
Polygons T_ARRAYREF