Merge branch 'lh_lightning_infill_fix'
This commit is contained in:
commit
7cfb086cd2
@ -63,7 +63,7 @@ void Generator::generateInitialInternalOverhangs(const PrintObject &print_object
|
|||||||
Polygons infill_area_here;
|
Polygons infill_area_here;
|
||||||
for (const LayerRegion* layerm : print_object.get_layer(layer_nr)->regions())
|
for (const LayerRegion* layerm : print_object.get_layer(layer_nr)->regions())
|
||||||
for (const Surface& surface : layerm->fill_surfaces.surfaces)
|
for (const Surface& surface : layerm->fill_surfaces.surfaces)
|
||||||
if (surface.surface_type == stInternal)
|
if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid)
|
||||||
append(infill_area_here, infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset));
|
append(infill_area_here, infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset));
|
||||||
|
|
||||||
//Remove the part of the infill area that is already supported by the walls.
|
//Remove the part of the infill area that is already supported by the walls.
|
||||||
@ -92,7 +92,7 @@ void Generator::generateTrees(const PrintObject &print_object)
|
|||||||
for (int layer_id = int(print_object.layers().size()) - 1; layer_id >= 0; layer_id--)
|
for (int layer_id = int(print_object.layers().size()) - 1; layer_id >= 0; layer_id--)
|
||||||
for (const LayerRegion *layerm : print_object.get_layer(layer_id)->regions())
|
for (const LayerRegion *layerm : print_object.get_layer(layer_id)->regions())
|
||||||
for (const Surface &surface : layerm->fill_surfaces.surfaces)
|
for (const Surface &surface : layerm->fill_surfaces.surfaces)
|
||||||
if (surface.surface_type == stInternal)
|
if (surface.surface_type == stInternal || surface.surface_type == stInternalVoid)
|
||||||
append(infill_outlines[layer_id], infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset));
|
append(infill_outlines[layer_id], infill_wall_offset == 0 ? surface.expolygon : offset(surface.expolygon, infill_wall_offset));
|
||||||
|
|
||||||
// For various operations its beneficial to quickly locate nearby features on the polygon:
|
// For various operations its beneficial to quickly locate nearby features on the polygon:
|
||||||
@ -116,8 +116,12 @@ void Generator::generateTrees(const PrintObject &print_object)
|
|||||||
if (layer_id == 0)
|
if (layer_id == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const Polygons& below_outlines = infill_outlines[layer_id - 1];
|
const Polygons &below_outlines = infill_outlines[layer_id - 1];
|
||||||
outlines_locator.set_bbox(get_extents(below_outlines).inflated(SCALED_EPSILON));
|
BoundingBox below_outlines_bbox = get_extents(below_outlines).inflated(SCALED_EPSILON);
|
||||||
|
if (const BoundingBox &outlines_locator_bbox = outlines_locator.bbox(); outlines_locator_bbox.defined)
|
||||||
|
below_outlines_bbox.merge(outlines_locator_bbox);
|
||||||
|
|
||||||
|
outlines_locator.set_bbox(below_outlines_bbox);
|
||||||
outlines_locator.create(below_outlines, locator_cell_size);
|
outlines_locator.create(below_outlines, locator_cell_size);
|
||||||
|
|
||||||
std::vector<NodeSPtr>& lower_trees = m_lightning_layers[layer_id - 1].tree_roots;
|
std::vector<NodeSPtr>& lower_trees = m_lightning_layers[layer_id - 1].tree_roots;
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "DistanceField.hpp"
|
#include "DistanceField.hpp"
|
||||||
#include "TreeNode.hpp"
|
#include "TreeNode.hpp"
|
||||||
|
|
||||||
|
#include "../../ClipperUtils.hpp"
|
||||||
#include "../../Geometry.hpp"
|
#include "../../Geometry.hpp"
|
||||||
#include "Utils.hpp"
|
#include "Utils.hpp"
|
||||||
|
|
||||||
@ -271,6 +272,7 @@ void Layer::reconnectRoots
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
/*!
|
/*!
|
||||||
* Moves the point \p from onto the nearest polygon or leaves the point as-is, when the comb boundary is not within the root of \p max_dist2 distance.
|
* Moves the point \p from onto the nearest polygon or leaves the point as-is, when the comb boundary is not within the root of \p max_dist2 distance.
|
||||||
* Given a \p distance more than zero, the point will end up inside, and conversely outside.
|
* Given a \p distance more than zero, the point will end up inside, and conversely outside.
|
||||||
@ -398,6 +400,7 @@ static unsigned int moveInside(const Polygons& polygons, Point& from, int distan
|
|||||||
}
|
}
|
||||||
return static_cast<unsigned int>(-1);
|
return static_cast<unsigned int>(-1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Returns 'added someting'.
|
// Returns 'added someting'.
|
||||||
Polylines Layer::convertToLines(const Polygons& limit_to_outline, const coord_t line_width) const
|
Polylines Layer::convertToLines(const Polygons& limit_to_outline, const coord_t line_width) const
|
||||||
@ -405,31 +408,11 @@ Polylines Layer::convertToLines(const Polygons& limit_to_outline, const coord_t
|
|||||||
if (tree_roots.empty())
|
if (tree_roots.empty())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
Polygons result_lines;
|
Polylines result_lines;
|
||||||
for (const auto& tree : tree_roots) {
|
for (const auto &tree : tree_roots)
|
||||||
// If even the furthest location in the tree is inside the polygon, the entire tree must be inside of the polygon.
|
tree->convertToPolylines(result_lines, line_width);
|
||||||
// (Don't take the root as that may be on the edge and cause rounding errors to register as 'outside'.)
|
|
||||||
constexpr coord_t epsilon = 5;
|
|
||||||
Point should_be_inside = tree->getLocation();
|
|
||||||
moveInside(limit_to_outline, should_be_inside, epsilon, epsilon * epsilon);
|
|
||||||
if (inside(limit_to_outline, should_be_inside))
|
|
||||||
tree->convertToPolylines(result_lines, line_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: allow for polylines!
|
return intersection_pl(result_lines, limit_to_outline);
|
||||||
Polylines split_lines;
|
|
||||||
for (Polygon &line : result_lines) {
|
|
||||||
if (line.size() <= 1)
|
|
||||||
continue;
|
|
||||||
Point last = line[0];
|
|
||||||
for (size_t point_idx = 1; point_idx < line.size(); point_idx++) {
|
|
||||||
Point here = line[point_idx];
|
|
||||||
split_lines.push_back({ last, here });
|
|
||||||
last = here;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return split_lines;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Slic3r::Lightning
|
} // namespace Slic3r::Lightning
|
||||||
|
@ -343,16 +343,16 @@ coord_t Node::prune(const coord_t& pruning_distance)
|
|||||||
return max_distance_pruned;
|
return max_distance_pruned;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::convertToPolylines(Polygons& output, const coord_t line_width) const
|
void Node::convertToPolylines(Polylines &output, const coord_t line_width) const
|
||||||
{
|
{
|
||||||
Polygons result;
|
Polylines result;
|
||||||
result.emplace_back();
|
result.emplace_back();
|
||||||
convertToPolylines(0, result);
|
convertToPolylines(0, result);
|
||||||
removeJunctionOverlap(result, line_width);
|
removeJunctionOverlap(result, line_width);
|
||||||
append(output, std::move(result));
|
append(output, std::move(result));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::convertToPolylines(size_t long_line_idx, Polygons& output) const
|
void Node::convertToPolylines(size_t long_line_idx, Polylines &output) const
|
||||||
{
|
{
|
||||||
if (m_children.empty()) {
|
if (m_children.empty()) {
|
||||||
output[long_line_idx].points.push_back(m_p);
|
output[long_line_idx].points.push_back(m_p);
|
||||||
@ -372,12 +372,12 @@ void Node::convertToPolylines(size_t long_line_idx, Polygons& output) const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Node::removeJunctionOverlap(Polygons& result_lines, const coord_t line_width) const
|
void Node::removeJunctionOverlap(Polylines &result_lines, const coord_t line_width) const
|
||||||
{
|
{
|
||||||
const coord_t reduction = line_width / 2; // TODO make configurable?
|
const coord_t reduction = line_width / 2; // TODO make configurable?
|
||||||
size_t res_line_idx = 0;
|
size_t res_line_idx = 0;
|
||||||
while (res_line_idx < result_lines.size()) {
|
while (res_line_idx < result_lines.size()) {
|
||||||
Polygon &polyline = result_lines[res_line_idx];
|
Polyline &polyline = result_lines[res_line_idx];
|
||||||
if (polyline.size() <= 1) {
|
if (polyline.size() <= 1) {
|
||||||
polyline = std::move(result_lines.back());
|
polyline = std::move(result_lines.back());
|
||||||
result_lines.pop_back();
|
result_lines.pop_back();
|
||||||
@ -387,7 +387,7 @@ void Node::removeJunctionOverlap(Polygons& result_lines, const coord_t line_widt
|
|||||||
coord_t to_be_reduced = reduction;
|
coord_t to_be_reduced = reduction;
|
||||||
Point a = polyline.back();
|
Point a = polyline.back();
|
||||||
for (int point_idx = int(polyline.size()) - 2; point_idx >= 0; point_idx--) {
|
for (int point_idx = int(polyline.size()) - 2; point_idx >= 0; point_idx--) {
|
||||||
const Point b = polyline[point_idx];
|
const Point b = polyline.points[point_idx];
|
||||||
const Point ab = b - a;
|
const Point ab = b - a;
|
||||||
const auto ab_len = coord_t(ab.cast<double>().norm());
|
const auto ab_len = coord_t(ab.cast<double>().norm());
|
||||||
if (ab_len >= to_be_reduced) {
|
if (ab_len >= to_be_reduced) {
|
||||||
|
@ -239,7 +239,7 @@ public:
|
|||||||
*
|
*
|
||||||
* \param output all branches in this tree connected into polylines
|
* \param output all branches in this tree connected into polylines
|
||||||
*/
|
*/
|
||||||
void convertToPolylines(Polygons& output, coord_t line_width) const;
|
void convertToPolylines(Polylines &output, coord_t line_width) const;
|
||||||
|
|
||||||
/*! If this was ever a direct child of the root, it'll have a previous grounding location.
|
/*! If this was ever a direct child of the root, it'll have a previous grounding location.
|
||||||
*
|
*
|
||||||
@ -258,9 +258,9 @@ protected:
|
|||||||
* \param long_line a reference to a polyline in \p output which to continue building on in the recursion
|
* \param long_line a reference to a polyline in \p output which to continue building on in the recursion
|
||||||
* \param output all branches in this tree connected into polylines
|
* \param output all branches in this tree connected into polylines
|
||||||
*/
|
*/
|
||||||
void convertToPolylines(size_t long_line_idx, Polygons& output) const;
|
void convertToPolylines(size_t long_line_idx, Polylines &output) const;
|
||||||
|
|
||||||
void removeJunctionOverlap(Polygons& polylines, coord_t line_width) const;
|
void removeJunctionOverlap(Polylines &polylines, coord_t line_width) const;
|
||||||
|
|
||||||
bool m_is_root;
|
bool m_is_root;
|
||||||
Point m_p;
|
Point m_p;
|
||||||
|
Loading…
Reference in New Issue
Block a user