Merge remote-tracking branch 'origin/lh_brim_offset'

This commit is contained in:
Lukas Matena 2021-08-17 15:02:41 +02:00
commit 82373334bc
2 changed files with 70 additions and 32 deletions

View File

@ -45,16 +45,38 @@ static float max_brim_width(const ConstPrintObjectPtrsAdaptor &objects)
})); }));
} }
static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print) // Returns ExPolygons of the bottom layer of the print object after elephant foot compensation.
static ExPolygons get_print_object_bottom_layer_expolygons(const PrintObject &print_object)
{ {
ExPolygons ex_polygons;
for (LayerRegion *region : print_object.layers().front()->regions())
Slic3r::append(ex_polygons, offset_ex(offset_ex(region->slices.surfaces, float(SCALED_EPSILON)), -float(SCALED_EPSILON)));
return ex_polygons;
}
// Returns ExPolygons of bottom layer for every print object in Print after elephant foot compensation.
static std::vector<ExPolygons> get_print_bottom_layers_expolygons(const Print &print)
{
std::vector<ExPolygons> bottom_layers_expolygons;
bottom_layers_expolygons.reserve(print.objects().size());
for (const PrintObject *object : print.objects())
bottom_layers_expolygons.emplace_back(get_print_object_bottom_layer_expolygons(*object));
return bottom_layers_expolygons;
}
static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print, const std::vector<ExPolygons> &bottom_layers_expolygons)
{
assert(print.objects().size() == bottom_layers_expolygons.size());
Polygons islands; Polygons islands;
ConstPrintObjectPtrs island_to_object; ConstPrintObjectPtrs island_to_object;
for (const PrintObject *object : print.objects()) { for(size_t print_object_idx = 0; print_object_idx < print.objects().size(); ++print_object_idx) {
Polygons islands_object; Polygons islands_object;
islands_object.reserve(object->layers().front()->lslices.size()); islands_object.reserve(bottom_layers_expolygons[print_object_idx].size());
for (const ExPolygon &ex_poly : object->layers().front()->lslices) for (const ExPolygon &ex_poly : bottom_layers_expolygons[print_object_idx])
islands_object.emplace_back(ex_poly.contour); islands_object.emplace_back(ex_poly.contour);
const PrintObject *object = print.objects()[print_object_idx];
islands.reserve(islands.size() + object->instances().size() * islands_object.size()); islands.reserve(islands.size() + object->instances().size() * islands_object.size());
for (const PrintInstance &instance : object->instances()) for (const PrintInstance &instance : object->instances())
for (Polygon &poly : islands_object) { for (Polygon &poly : islands_object) {
@ -110,7 +132,7 @@ static Polygons top_level_outer_brim_islands(const ConstPrintObjectPtrs &top_lev
//FIXME how about the brim type? //FIXME how about the brim type?
auto brim_offset = float(scale_(object->config().brim_offset.value)); auto brim_offset = float(scale_(object->config().brim_offset.value));
Polygons islands_object; Polygons islands_object;
for (const ExPolygon &ex_poly : object->layers().front()->lslices) { for (const ExPolygon &ex_poly : get_print_object_bottom_layer_expolygons(*object)) {
Polygons contour_offset = offset(ex_poly.contour, brim_offset); Polygons contour_offset = offset(ex_poly.contour, brim_offset);
for (Polygon &poly : contour_offset) for (Polygon &poly : contour_offset)
poly.douglas_peucker(SCALED_RESOLUTION); poly.douglas_peucker(SCALED_RESOLUTION);
@ -124,8 +146,12 @@ static Polygons top_level_outer_brim_islands(const ConstPrintObjectPtrs &top_lev
return islands; return islands;
} }
static ExPolygons top_level_outer_brim_area(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, const float no_brim_offset) static ExPolygons top_level_outer_brim_area(const Print &print,
const ConstPrintObjectPtrs &top_level_objects_with_brim,
const std::vector<ExPolygons> &bottom_layers_expolygons,
const float no_brim_offset)
{ {
assert(print.objects().size() == bottom_layers_expolygons.size());
std::unordered_set<size_t> top_level_objects_idx; std::unordered_set<size_t> top_level_objects_idx;
top_level_objects_idx.reserve(top_level_objects_with_brim.size()); top_level_objects_idx.reserve(top_level_objects_with_brim.size());
for (const PrintObject *object : top_level_objects_with_brim) for (const PrintObject *object : top_level_objects_with_brim)
@ -133,7 +159,8 @@ static ExPolygons top_level_outer_brim_area(const Print &print, const ConstPrint
ExPolygons brim_area; ExPolygons brim_area;
ExPolygons no_brim_area; ExPolygons no_brim_area;
for (const PrintObject *object : print.objects()) { for(size_t print_object_idx = 0; print_object_idx < print.objects().size(); ++print_object_idx) {
const PrintObject *object = print.objects()[print_object_idx];
const BrimType brim_type = object->config().brim_type.value; const BrimType brim_type = object->config().brim_type.value;
const float brim_offset = scale_(object->config().brim_offset.value); const float brim_offset = scale_(object->config().brim_offset.value);
const float brim_width = scale_(object->config().brim_width.value); const float brim_width = scale_(object->config().brim_width.value);
@ -141,7 +168,7 @@ static ExPolygons top_level_outer_brim_area(const Print &print, const ConstPrint
ExPolygons brim_area_object; ExPolygons brim_area_object;
ExPolygons no_brim_area_object; ExPolygons no_brim_area_object;
for (const ExPolygon &ex_poly : object->layers().front()->lslices) { for (const ExPolygon &ex_poly : bottom_layers_expolygons[print_object_idx]) {
if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) && is_top_outer_brim) if ((brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) && is_top_outer_brim)
append(brim_area_object, diff_ex(offset(ex_poly.contour, brim_width + brim_offset), offset(ex_poly.contour, brim_offset))); append(brim_area_object, diff_ex(offset(ex_poly.contour, brim_width + brim_offset), offset(ex_poly.contour, brim_offset)));
@ -166,8 +193,12 @@ static ExPolygons top_level_outer_brim_area(const Print &print, const ConstPrint
return diff_ex(brim_area, no_brim_area); return diff_ex(brim_area, no_brim_area);
} }
static ExPolygons inner_brim_area(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, const float no_brim_offset) static ExPolygons inner_brim_area(const Print &print,
const ConstPrintObjectPtrs &top_level_objects_with_brim,
const std::vector<ExPolygons> &bottom_layers_expolygons,
const float no_brim_offset)
{ {
assert(print.objects().size() == bottom_layers_expolygons.size());
std::unordered_set<size_t> top_level_objects_idx; std::unordered_set<size_t> top_level_objects_idx;
top_level_objects_idx.reserve(top_level_objects_with_brim.size()); top_level_objects_idx.reserve(top_level_objects_with_brim.size());
for (const PrintObject *object : top_level_objects_with_brim) for (const PrintObject *object : top_level_objects_with_brim)
@ -176,7 +207,8 @@ static ExPolygons inner_brim_area(const Print &print, const ConstPrintObjectPtrs
ExPolygons brim_area; ExPolygons brim_area;
ExPolygons no_brim_area; ExPolygons no_brim_area;
Polygons holes; Polygons holes;
for (const PrintObject *object : print.objects()) { for(size_t print_object_idx = 0; print_object_idx < print.objects().size(); ++print_object_idx) {
const PrintObject *object = print.objects()[print_object_idx];
const BrimType brim_type = object->config().brim_type.value; const BrimType brim_type = object->config().brim_type.value;
const float brim_offset = scale_(object->config().brim_offset.value); const float brim_offset = scale_(object->config().brim_offset.value);
const float brim_width = scale_(object->config().brim_width.value); const float brim_width = scale_(object->config().brim_width.value);
@ -185,7 +217,7 @@ static ExPolygons inner_brim_area(const Print &print, const ConstPrintObjectPtrs
ExPolygons brim_area_object; ExPolygons brim_area_object;
ExPolygons no_brim_area_object; ExPolygons no_brim_area_object;
Polygons holes_object; Polygons holes_object;
for (const ExPolygon &ex_poly : object->layers().front()->lslices) { for (const ExPolygon &ex_poly : bottom_layers_expolygons[print_object_idx]) {
if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) { if (brim_type == BrimType::btOuterOnly || brim_type == BrimType::btOuterAndInner) {
if (top_outer_brim) if (top_outer_brim)
no_brim_area_object.emplace_back(ex_poly); no_brim_area_object.emplace_back(ex_poly);
@ -204,7 +236,7 @@ static ExPolygons inner_brim_area(const Print &print, const ConstPrintObjectPtrs
append(holes_object, ex_poly.holes); append(holes_object, ex_poly.holes);
} }
append(no_brim_area_object, offset_ex(object->layers().front()->lslices, brim_offset)); append(no_brim_area_object, offset_ex(bottom_layers_expolygons[print_object_idx], brim_offset));
for (const PrintInstance &instance : object->instances()) { for (const PrintInstance &instance : object->instances()) {
append_and_translate(brim_area, brim_area_object, instance); append_and_translate(brim_area, brim_area_object, instance);
@ -236,7 +268,7 @@ static void optimize_polylines_by_reversing(Polylines *polylines)
static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_area, float max_connection_length) static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_area, float max_connection_length)
{ {
if (polylines.empty()) if (polylines.empty())
return Polylines(); return {};
BoundingBox bbox = get_extents(polylines); BoundingBox bbox = get_extents(polylines);
bbox.merge(get_extents(brim_area)); bbox.merge(get_extents(brim_area));
@ -305,16 +337,20 @@ static Polylines connect_brim_lines(Polylines &&polylines, const Polygons &brim_
} }
} }
if (end < polylines.size()) if (end < polylines.size())
polylines.erase(polylines.begin() + end, polylines.end()); polylines.erase(polylines.begin() + int(end), polylines.end());
} }
return std::move(polylines); return std::move(polylines);
} }
static void make_inner_brim(const Print &print, const ConstPrintObjectPtrs &top_level_objects_with_brim, ExtrusionEntityCollection &brim) static void make_inner_brim(const Print &print,
const ConstPrintObjectPtrs &top_level_objects_with_brim,
const std::vector<ExPolygons> &bottom_layers_expolygons,
ExtrusionEntityCollection &brim)
{ {
assert(print.objects().size() == bottom_layers_expolygons.size());
Flow flow = print.brim_flow(); Flow flow = print.brim_flow();
ExPolygons islands_ex = inner_brim_area(print, top_level_objects_with_brim, float(flow.scaled_spacing())); ExPolygons islands_ex = inner_brim_area(print, top_level_objects_with_brim, bottom_layers_expolygons, float(flow.scaled_spacing()));
Polygons loops; Polygons loops;
islands_ex = offset_ex(islands_ex, -0.5f * float(flow.scaled_spacing()), jtSquare); islands_ex = offset_ex(islands_ex, -0.5f * float(flow.scaled_spacing()), jtSquare);
for (size_t i = 0; !islands_ex.empty(); ++i) { for (size_t i = 0; !islands_ex.empty(); ++i) {
@ -335,9 +371,10 @@ static void make_inner_brim(const Print &print, const ConstPrintObjectPtrs &top_
ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area) ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cancel, Polygons &islands_area)
{ {
Flow flow = print.brim_flow(); Flow flow = print.brim_flow();
ConstPrintObjectPtrs top_level_objects_with_brim = get_top_level_objects_with_brim(print); std::vector<ExPolygons> bottom_layers_expolygons = get_print_bottom_layers_expolygons(print);
ConstPrintObjectPtrs top_level_objects_with_brim = get_top_level_objects_with_brim(print, bottom_layers_expolygons);
Polygons islands = top_level_outer_brim_islands(top_level_objects_with_brim); Polygons islands = top_level_outer_brim_islands(top_level_objects_with_brim);
ExPolygons islands_area_ex = top_level_outer_brim_area(print, top_level_objects_with_brim, float(flow.scaled_spacing())); ExPolygons islands_area_ex = top_level_outer_brim_area(print, top_level_objects_with_brim, bottom_layers_expolygons, float(flow.scaled_spacing()));
islands_area = to_polygons(islands_area_ex); islands_area = to_polygons(islands_area_ex);
Polygons loops; Polygons loops;
@ -536,7 +573,7 @@ ExtrusionEntityCollection make_brim(const Print &print, PrintTryCancel try_cance
extrusion_entities_append_loops_and_paths(brim.entities, std::move(all_loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height())); extrusion_entities_append_loops_and_paths(brim.entities, std::move(all_loops), erSkirt, float(flow.mm3_per_mm()), float(flow.width()), float(print.skirt_first_layer_height()));
} }
make_inner_brim(print, top_level_objects_with_brim, brim); make_inner_brim(print, top_level_objects_with_brim, bottom_layers_expolygons, brim);
return brim; return brim;
} }

View File

@ -491,10 +491,11 @@ void PrintConfigDef::init_fff_params()
def = this->add("brim_offset", coFloat); def = this->add("brim_offset", coFloat);
def->label = L("Brim offset"); def->label = L("Brim offset");
def->category = L("Skirt and brim"); def->category = L("Skirt and brim");
def->tooltip = L("The offset of the brim from the printed object."); def->tooltip = L("The offset of the brim from the printed object. The offset is applied after the elephant foot compensation.");
def->sidetext = L("mm"); def->sidetext = L("mm");
def->min = 0;
def->mode = comAdvanced; def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(0)); def->set_default_value(new ConfigOptionFloat(0.1f));
def = this->add("clip_multipart_objects", coBool); def = this->add("clip_multipart_objects", coBool);
def->label = L("Clip multi-part objects"); def->label = L("Clip multi-part objects");