Parallelized detection of extra perimeters.

This commit is contained in:
bubnikv 2017-03-08 22:38:08 +01:00
parent a956186c76
commit 720459183e

View file

@ -1336,14 +1336,17 @@ PrintObject::_make_perimeters()
if (!region.config.extra_perimeters if (!region.config.extra_perimeters
|| region.config.perimeters == 0 || region.config.perimeters == 0
|| region.config.fill_density == 0 || region.config.fill_density == 0
|| this->layer_count() < 2) continue; || this->layer_count() < 2)
continue;
BOOST_LOG_TRIVIAL(debug) << "Generating extra perimeters for region " << region_id; BOOST_LOG_TRIVIAL(debug) << "Generating extra perimeters for region " << region_id << " in parallel - start";
for (size_t i = 0; i < this->layer_count() - 1; ++ i) { tbb::parallel_for(
LayerRegion &layerm = *this->get_layer(i)->get_region(region_id); tbb::blocked_range<size_t>(0, this->layers.size() - 1),
const LayerRegion &upper_layerm = *this->get_layer(i+1)->get_region(region_id); [this, &region, region_id](const tbb::blocked_range<size_t>& range) {
for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) {
LayerRegion &layerm = *this->layers[layer_idx]->regions[region_id];
const LayerRegion &upper_layerm = *this->layers[layer_idx+1]->regions[region_id];
const Polygons upper_layerm_polygons = upper_layerm.slices; const Polygons upper_layerm_polygons = upper_layerm.slices;
// Filter upper layer polygons in intersection_ppl by their bounding boxes? // Filter upper layer polygons in intersection_ppl by their bounding boxes?
// my $upper_layerm_poly_bboxes= [ map $_->bounding_box, @{$upper_layerm_polygons} ]; // my $upper_layerm_poly_bboxes= [ map $_->bounding_box, @{$upper_layerm_polygons} ];
const double total_loop_length = total_length(upper_layerm_polygons); const double total_loop_length = total_length(upper_layerm_polygons);
@ -1352,31 +1355,23 @@ PrintObject::_make_perimeters()
const coord_t ext_perimeter_width = ext_perimeter_flow.scaled_width(); const coord_t ext_perimeter_width = ext_perimeter_flow.scaled_width();
const coord_t ext_perimeter_spacing = ext_perimeter_flow.scaled_spacing(); const coord_t ext_perimeter_spacing = ext_perimeter_flow.scaled_spacing();
for (Surfaces::iterator slice = layerm.slices.surfaces.begin(); for (Surface &slice : layerm.slices.surfaces) {
slice != layerm.slices.surfaces.end(); ++slice) { for (;;) {
while (true) {
// compute the total thickness of perimeters // compute the total thickness of perimeters
const coord_t perimeters_thickness = ext_perimeter_width/2 + ext_perimeter_spacing/2 const coord_t perimeters_thickness = ext_perimeter_width/2 + ext_perimeter_spacing/2
+ (region.config.perimeters-1 + slice->extra_perimeters) * perimeter_spacing; + (region.config.perimeters-1 + slice.extra_perimeters) * perimeter_spacing;
// define a critical area where we don't want the upper slice to fall into // define a critical area where we don't want the upper slice to fall into
// (it should either lay over our perimeters or outside this area) // (it should either lay over our perimeters or outside this area)
const coord_t critical_area_depth = perimeter_spacing * 1.5; const coord_t critical_area_depth = coord_t(perimeter_spacing * 1.5);
const Polygons critical_area = diff( const Polygons critical_area = diff(
offset(slice->expolygon, -perimeters_thickness), offset(slice.expolygon, float(- perimeters_thickness)),
offset(slice->expolygon, -(perimeters_thickness + critical_area_depth)) offset(slice.expolygon, float(- perimeters_thickness - critical_area_depth))
); );
// check whether a portion of the upper slices falls inside the critical area // check whether a portion of the upper slices falls inside the critical area
const Polylines intersection = intersection_pl( const Polylines intersection = intersection_pl(to_polylines(upper_layerm_polygons), critical_area);
to_polylines(upper_layerm_polygons),
critical_area
);
// only add an additional loop if at least 30% of the slice loop would benefit from it // only add an additional loop if at least 30% of the slice loop would benefit from it
if (total_length(intersection) <= total_loop_length*0.3) if (total_length(intersection) <= total_loop_length*0.3)
break; break;
/* /*
if (0) { if (0) {
require "Slic3r/SVG.pm"; require "Slic3r/SVG.pm";
@ -1388,16 +1383,16 @@ PrintObject::_make_perimeters()
); );
} }
*/ */
++ slice.extra_perimeters;
slice->extra_perimeters++;
} }
#ifdef DEBUG #ifdef DEBUG
if (slice->extra_perimeters > 0) if (slice.extra_perimeters > 0)
printf(" adding %d more perimeter(s) at layer %zu\n", slice->extra_perimeters, i); printf(" adding %d more perimeter(s) at layer %zu\n", slice.extra_perimeters, i);
#endif #endif
} }
} }
});
BOOST_LOG_TRIVIAL(debug) << "Generating extra perimeters for region " << region_id << " in parallel - end";
} }
BOOST_LOG_TRIVIAL(debug) << "Generating perimeters in parallel - start"; BOOST_LOG_TRIVIAL(debug) << "Generating perimeters in parallel - start";