diff options
author | Alessandro Ranellucci <aar@cpan.org> | 2015-07-03 23:58:29 +0300 |
---|---|---|
committer | Alessandro Ranellucci <aar@cpan.org> | 2015-07-03 23:58:29 +0300 |
commit | b8aecbd56c74aa658891cf78bed24f07605d30bb (patch) | |
tree | ae25590c7771eb22738ba075db1028156441a8d2 /xs | |
parent | 3e739b87da9f49b61a6dfc9aa99a06ba28ddfe39 (diff) |
Initial work for porting PerimeterGenerator to XS
Diffstat (limited to 'xs')
-rw-r--r-- | xs/src/libslic3r/PerimeterGenerator.cpp | 120 | ||||
-rw-r--r-- | xs/src/libslic3r/PerimeterGenerator.hpp | 64 | ||||
-rw-r--r-- | xs/src/libslic3r/libslic3r.h | 1 |
3 files changed, 185 insertions, 0 deletions
diff --git a/xs/src/libslic3r/PerimeterGenerator.cpp b/xs/src/libslic3r/PerimeterGenerator.cpp new file mode 100644 index 000000000..5c054aa6a --- /dev/null +++ b/xs/src/libslic3r/PerimeterGenerator.cpp @@ -0,0 +1,120 @@ +#include "PerimeterGenerator.hpp" + +namespace Slic3r { + +void +PerimeterGenerator::process() +{ + +} + +ExtrusionEntityCollection +PerimeterGenerator::_traverse_loops(const std::vector<PerimeterGeneratorLoop> &loops, + const Polylines &thin_walls) const +{ + +} + +ExtrusionEntityCollection +PerimeterGenerator::_fill_gaps(double min, double max, double w, + const Polygons &gaps) const +{ + ExtrusionEntityCollection coll; + + min *= (1 - INSET_OVERLAP_TOLERANCE); + + ExPolygon curr = diff( + offset2(gaps, -min/2, +min/2), + offset2(gaps, -max/2, +max/2), + true, + ); + + Polylines polylines; + for (ExPolygons::const_iterator ex = curr.begin(); ex != curr.end(); ++ex) + ex->medial_axis(max, min/2, &polylines); + if (polylines.empty()) + return coll; + + #ifdef SLIC3R_DEBUG + if (!curr.empty()) + printf(" %d gaps filled with extrusion width = %zu\n", curr.size(), w); + #endif + + //my $flow = $layerm->flow(FLOW_ROLE_SOLID_INFILL, 0, $w); + Flow flow( + w, this->layer_height, this->solid_infill_flow.nozzle_diameter + ); + + double mm3_per_mm = flow.mm3_per_mm(); + + /* + my %path_args = ( + role => EXTR_ROLE_GAPFILL, + mm3_per_mm => $flow->mm3_per_mm, + width => $flow->width, + height => $self->layer_height, + ); + */ + + for (Polylines::const_iterator p = polylines.begin(); p != polylines.end(); ++p) { + /* + #if ($polylines[$i]->isa('Slic3r::Polygon')) { + # my $loop = Slic3r::ExtrusionLoop->new; + # $loop->append(Slic3r::ExtrusionPath->new(polyline => $polylines[$i]->split_at_first_point, %path_args)); + # $polylines[$i] = $loop; + */ + if (p->is_valid() && p->first_point().coincides_with(p->last_point())) { + // since medial_axis() now returns only Polyline objects, detect loops here + + + ExtrusionLoop loop; + loop.paths.push_back(); + } else { + + } + } + + foreach my $polyline (@polylines) { + #if ($polylines[$i]->isa('Slic3r::Polygon')) { + # my $loop = Slic3r::ExtrusionLoop->new; + # $loop->append(Slic3r::ExtrusionPath->new(polyline => $polylines[$i]->split_at_first_point, %path_args)); + # $polylines[$i] = $loop; + if ($polyline->is_valid && $polyline->first_point->coincides_with($polyline->last_point)) { + # since medial_axis() now returns only Polyline objects, detect loops here + push @entities, my $loop = Slic3r::ExtrusionLoop->new; + $loop->append(Slic3r::ExtrusionPath->new(polyline => $polyline, %path_args)); + } else { + push @entities, Slic3r::ExtrusionPath->new(polyline => $polyline, %path_args); + } + } + + return coll; +} + +#ifdef SLIC3RXS +REGISTER_CLASS(PerimeterGenerator, "Layer::PerimeterGenerator"); +#endif + +bool +PerimeterGeneratorLoop::is_external() const +{ + return this->depth == 0; +} + +bool +PerimeterGeneratorLoop::is_internal_contour() const +{ + if (this->is_contour) { + // an internal contour is a contour containing no other contours + for (std::vector<PerimeterGeneratorLoop>::const_iterator loop = this->children.begin(); + loop != this->children.end(); ++loop) { + if (loop->is_contour) { + return false; + } + } + return true; + } + return false; +} + +} diff --git a/xs/src/libslic3r/PerimeterGenerator.hpp b/xs/src/libslic3r/PerimeterGenerator.hpp new file mode 100644 index 000000000..d896cd8da --- /dev/null +++ b/xs/src/libslic3r/PerimeterGenerator.hpp @@ -0,0 +1,64 @@ +#ifndef slic3r_PerimeterGenerator_hpp_ +#define slic3r_PerimeterGenerator_hpp_ + +#include <myinit.h> + +namespace Slic3r { + +class PerimeterGeneratorLoop; + +class PerimeterGeneratorLoop { + public: + Polygon polygon; + bool is_contour; + unsigned short depth; + std::vector<PerimeterGeneratorLoop> children; + + PerimeterGeneratorLoop(Polygon polygon, unsigned short depth) + : polygon(polygon), depth(depth) + {}; + bool is_external() const; + bool is_internal_contour() const; +}; + +class PerimeterGenerator { + public: + SurfaceCollection* slices; + SurfaceCollection* lower_slices; + double layer_height; + int layer_id; + Flow perimeter_flow; + Flow ext_perimeter_flow; + Flow overhang_flow; + Flow solid_infill_flow; + PrintRegionConfig* config; + PrintObjectConfig* object_config; + PrintConfig* print_config; + double _ext_mm3_per_mm; + double _mm3_per_mm; + double _mm3_per_mm_overhang; + ExtrusionEntityCollection* loops; + ExtrusionEntityCollection* gap_fill; + SurfaceCollection* fill_surfaces; + + PerimeterGenerator(SurfaceCollection* slices, double layer_height, + ExtrusionEntityCollection* loops, ExtrusionEntityCollection* gap_fill, + SurfaceCollection* fill_surfaces) + : slices(slices), layer_height(layer_height), layer_id(-1), + _ext_mm3_per_mm(-1), _mm3_per_mm(-1), _mm3_per_mm_overhang(-1), + loops(loops), gap_fill(gap_fill), fill_surfaces(fill_surfaces) + {}; + void process(); + + private: + Polygons _lower_slices_p; + + ExtrusionEntityCollection _traverse_loops(const std::vector<PerimeterGeneratorLoop> &loops, + const Polylines &thin_walls) const; + ExtrusionEntityCollection _fill_gaps(double min, double max, double w, + const Polygons &gaps) const; +}; + +} + +#endif diff --git a/xs/src/libslic3r/libslic3r.h b/xs/src/libslic3r/libslic3r.h index fcf90f133..87d98caf1 100644 --- a/xs/src/libslic3r/libslic3r.h +++ b/xs/src/libslic3r/libslic3r.h @@ -15,6 +15,7 @@ #define PI 3.141592653589793238 #define LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER 0.15 #define SMALL_PERIMETER_LENGTH (6.5 / SCALING_FACTOR) * 2 * PI +#define INSET_OVERLAP_TOLERANCE 0.4 #define scale_(val) (val / SCALING_FACTOR) #define unscale(val) (val * SCALING_FACTOR) #define SCALED_EPSILON scale_(EPSILON) |