diff options
author | supermerill <merill@free.fr> | 2021-11-22 01:53:08 +0300 |
---|---|---|
committer | supermerill <merill@free.fr> | 2021-11-22 01:53:08 +0300 |
commit | d49193dcca8f14701ea1c2d9a9214a638b58f641 (patch) | |
tree | d92a13c6f9f90928d2e943f180db3261371189f1 /src | |
parent | 7c59e501f1b0ec4f5d36221767d281433d22ea52 (diff) |
Fix brim-raft bug. The behaviour isn't correct yet, but at least it's now useable.
supermerill/SuperSlicer#1927
Diffstat (limited to 'src')
-rw-r--r-- | src/libslic3r/Print.cpp | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp index 87c2cc2b3..41b52b78a 100644 --- a/src/libslic3r/Print.cpp +++ b/src/libslic3r/Print.cpp @@ -2193,13 +2193,20 @@ void Print::_extrude_brim_from_tree(std::vector<std::vector<BrimLoop>>& loops, c //def //cut loops if they go inside a forbidden region - std::function<void(BrimLoop&)> cut_loop = [&frontiers, reversed](BrimLoop& to_cut) { + std::function<void(BrimLoop&)> cut_loop = [&frontiers, &flow, reversed](BrimLoop& to_cut) { Polylines result; if (to_cut.is_loop) { result = intersection_pl(Polygons{ to_cut.polygon() }, frontiers, true); } else { result = intersection_pl(to_cut.lines, frontiers, true); } + //remove too small segments + for (int i = 0; i < result.size(); i++) { + if (result[i].length() < flow.scaled_width() * 2) { + result.erase(result.begin() + i); + i--; + } + } if (result.empty()) { to_cut.lines.clear(); } else { @@ -2268,6 +2275,14 @@ void Print::_extrude_brim_from_tree(std::vector<std::vector<BrimLoop>>& loops, c parent->entities.push_back(mycoll); for (BrimLoop& child : to_cut.children) (*extrude_ptr)(child, mycoll); + //remove un-needed collection if possible + if (mycoll->entities.size() == 1) { + parent->entities.back() = mycoll->entities.front(); + mycoll->entities.clear(); + delete mycoll; + } else if (mycoll->entities.size() == 0) { + parent->remove(parent->entities.size() - 1); + } } } else { ExtrusionEntityCollection* print_me_first = new ExtrusionEntityCollection(); @@ -2291,6 +2306,14 @@ void Print::_extrude_brim_from_tree(std::vector<std::vector<BrimLoop>>& loops, c print_me_first->entities.push_back(children); for (BrimLoop& child : to_cut.children) (*extrude_ptr)(child, children); + //remove un-needed collection if possible + if (children->entities.size() == 1) { + print_me_first->entities.back() = children->entities.front(); + children->entities.clear(); + delete children; + } else if (children->entities.size() == 0) { + print_me_first->remove(parent->entities.size() - 1); + } } } }; @@ -2310,6 +2333,7 @@ void Print::_extrude_brim_from_tree(std::vector<std::vector<BrimLoop>>& loops, c //TODO: test if no regression vs old _make_brim. // this new one can extrude brim for an object inside an other object. void Print::_make_brim(const Flow &flow, const PrintObjectPtrs &objects, ExPolygons &unbrimmable, ExtrusionEntityCollection &out) { + const coord_t scaled_spacing = flow.scaled_spacing(); const PrintObjectConfig &brim_config = objects.front()->config(); coord_t brim_offset = scale_(brim_config.brim_offset.value); ExPolygons islands; @@ -2349,7 +2373,7 @@ void Print::_make_brim(const Flow &flow, const PrintObjectPtrs &objects, ExPolyg const size_t num_loops = size_t(floor(std::max(0.,(brim_config.brim_width.value - brim_config.brim_offset.value)) / flow.spacing())); ExPolygons brimmable_areas; for (ExPolygon &expoly : islands) { - for (Polygon poly : offset(expoly.contour, num_loops * flow.scaled_spacing(), jtSquare)) { + for (Polygon poly : offset(expoly.contour, num_loops * scaled_spacing, jtSquare)) { brimmable_areas.emplace_back(); brimmable_areas.back().contour = poly; brimmable_areas.back().contour.make_counter_clockwise(); @@ -2374,7 +2398,7 @@ void Print::_make_brim(const Flow &flow, const PrintObjectPtrs &objects, ExPolyg for (ExPolygon &expoly : islands) { unbrimmable_polygons.push_back(expoly.contour); //do it separately because we don't want to union them - for (ExPolygon &big_expoly : offset_ex(expoly, double(flow.scaled_spacing()) * 0.5, jtSquare)) { + for (ExPolygon &big_expoly : offset_ex(expoly, double(scaled_spacing) * 0.5, jtSquare)) { bigger_islands.emplace_back(big_expoly); unbrimmable_polygons.insert(unbrimmable_polygons.end(), big_expoly.holes.begin(), big_expoly.holes.end()); } @@ -2387,7 +2411,7 @@ void Print::_make_brim(const Flow &flow, const PrintObjectPtrs &objects, ExPolyg bigger_islands.clear(); if (i > 0) { for (ExPolygon &expoly : islands) { - for (Polygon &big_contour : offset(expoly.contour, double(flow.scaled_spacing()) * i, jtSquare)) { + for (Polygon &big_contour : offset(expoly.contour, double(scaled_spacing) * i, jtSquare)) { bigger_islands.emplace_back(expoly); bigger_islands.back().contour = big_contour; } @@ -2396,11 +2420,12 @@ void Print::_make_brim(const Flow &flow, const PrintObjectPtrs &objects, ExPolyg bigger_islands = union_ex(bigger_islands); for (ExPolygon &expoly : bigger_islands) { loops[i].emplace_back(expoly.contour); - //also add hole, in case of it's merged with a contour. <= HOW? if there's an island inside a hole! (in the same object) - for (Polygon &hole : expoly.holes) - //but remove the points that are inside the holes of islands - for (Polyline& pl : diff_pl(Polygons{ hole }, unbrimmable_polygons, true)) - loops[i].emplace_back(pl); + // buggy + ////also add hole, in case of it's merged with a contour. <= HOW? if there's an island inside a hole! (in the same object) + //for (Polygon &hole : expoly.holes) + // //but remove the points that are inside the holes of islands + // for (Polyline& pl : diff_pl(Polygons{ hole }, unbrimmable_polygons, true)) + // loops[i].emplace_back(pl); } } |