The offset is applied after the elephant food compensation. The value of the brim offset is now also measured from the object after the elephant foot compensation. Thus, the brim offset set to zero means that the brim will touch the object even if elephant foot compensation is enabled.
This commit is contained in:
parent
04d6b17c57
commit
58f83b5e6a
2 changed files with 70 additions and 32 deletions
src/libslic3r
|
@ -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,15 +159,16 @@ 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 BrimType brim_type = object->config().brim_type.value;
|
const PrintObject *object = print.objects()[print_object_idx];
|
||||||
const float brim_offset = scale_(object->config().brim_offset.value);
|
const BrimType brim_type = object->config().brim_type.value;
|
||||||
const float brim_width = scale_(object->config().brim_width.value);
|
const float brim_offset = scale_(object->config().brim_offset.value);
|
||||||
const bool is_top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end();
|
const float brim_width = scale_(object->config().brim_width.value);
|
||||||
|
const bool is_top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end();
|
||||||
|
|
||||||
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,16 +207,17 @@ 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 BrimType brim_type = object->config().brim_type.value;
|
const PrintObject *object = print.objects()[print_object_idx];
|
||||||
const float brim_offset = scale_(object->config().brim_offset.value);
|
const BrimType brim_type = object->config().brim_type.value;
|
||||||
const float brim_width = scale_(object->config().brim_width.value);
|
const float brim_offset = scale_(object->config().brim_offset.value);
|
||||||
const bool top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end();
|
const float brim_width = scale_(object->config().brim_width.value);
|
||||||
|
const bool top_outer_brim = top_level_objects_idx.find(object->id().id) != top_level_objects_idx.end();
|
||||||
|
|
||||||
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) {
|
||||||
|
@ -334,11 +370,12 @@ static void make_inner_brim(const Print &print, const ConstPrintObjectPtrs &top_
|
||||||
// Collect islands_area to be merged into the final 1st layer convex hull.
|
// Collect islands_area to be merged into the final 1st layer convex hull.
|
||||||
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);
|
||||||
Polygons islands = top_level_outer_brim_islands(top_level_objects_with_brim);
|
ConstPrintObjectPtrs top_level_objects_with_brim = get_top_level_objects_with_brim(print, bottom_layers_expolygons);
|
||||||
ExPolygons islands_area_ex = top_level_outer_brim_area(print, top_level_objects_with_brim, float(flow.scaled_spacing()));
|
Polygons islands = top_level_outer_brim_islands(top_level_objects_with_brim);
|
||||||
islands_area = to_polygons(islands_area_ex);
|
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);
|
||||||
|
|
||||||
Polygons loops;
|
Polygons loops;
|
||||||
size_t num_loops = size_t(floor(max_brim_width(print.objects()) / flow.spacing()));
|
size_t num_loops = size_t(floor(max_brim_width(print.objects()) / flow.spacing()));
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 = comSimple;
|
def->mode = comSimple;
|
||||||
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");
|
||||||
|
|
Loading…
Add table
Reference in a new issue