added max merge distance parameter
This commit is contained in:
parent
6ce686aff8
commit
7cee4d53f9
@ -294,6 +294,8 @@ inline Contour3D inner_bed(const ExPolygon& poly, double depth_mm,
|
||||
|
||||
/// Unification of polygons (with clipper) preserving holes as well.
|
||||
inline ExPolygons unify(const ExPolygons& shapes) {
|
||||
using ClipperLib::ptSubject;
|
||||
|
||||
ExPolygons retv;
|
||||
|
||||
bool closed = true;
|
||||
@ -303,11 +305,15 @@ inline ExPolygons unify(const ExPolygons& shapes) {
|
||||
|
||||
for(auto& path : shapes) {
|
||||
auto clipperpath = Slic3rMultiPoint_to_ClipperPath(path.contour);
|
||||
valid &= clipper.AddPath(clipperpath, ClipperLib::ptSubject, closed);
|
||||
|
||||
if(!clipperpath.empty())
|
||||
valid &= clipper.AddPath(clipperpath, ptSubject, closed);
|
||||
|
||||
auto clipperholes = Slic3rMultiPoints_to_ClipperPaths(path.holes);
|
||||
|
||||
for(auto& hole : clipperholes) {
|
||||
valid &= clipper.AddPath(hole, ClipperLib::ptSubject, closed);
|
||||
if(!hole.empty())
|
||||
valid &= clipper.AddPath(hole, ptSubject, closed);
|
||||
}
|
||||
}
|
||||
|
||||
@ -382,7 +388,7 @@ inline Point centroid(const ExPolygon& poly) {
|
||||
/// with explicit bridges. Bridges are generated from each shape's centroid
|
||||
/// to the center of the "scene" which is the centroid calculated from the shape
|
||||
/// centroids (a star is created...)
|
||||
inline ExPolygons concave_hull(const ExPolygons& polys, double max_dist_mm = 0)
|
||||
inline ExPolygons concave_hull(const ExPolygons& polys, double max_dist_mm = 50)
|
||||
{
|
||||
if(polys.empty()) return ExPolygons();
|
||||
|
||||
@ -408,8 +414,9 @@ inline ExPolygons concave_hull(const ExPolygons& polys, double max_dist_mm = 0)
|
||||
double dx = x(c) - x(cc), dy = y(c) - y(cc);
|
||||
double l = std::sqrt(dx * dx + dy * dy);
|
||||
double nx = dx / l, ny = dy / l;
|
||||
double max_dist = mm(max_dist_mm);
|
||||
|
||||
if(l < max_dist_mm) return ExPolygon();
|
||||
if(l > max_dist) return ExPolygon();
|
||||
|
||||
ExPolygon r;
|
||||
auto& ctour = r.contour.points;
|
||||
@ -427,9 +434,6 @@ inline ExPolygons concave_hull(const ExPolygons& polys, double max_dist_mm = 0)
|
||||
|
||||
punion = unify(punion);
|
||||
|
||||
if(punion.size() != 1)
|
||||
BOOST_LOG_TRIVIAL(error) << "Cannot generate correct SLA base pool!";
|
||||
|
||||
return punion;
|
||||
}
|
||||
|
||||
@ -449,9 +453,10 @@ void ground_layer(const TriangleMesh &mesh, ExPolygons &output, float h)
|
||||
|
||||
void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
||||
double min_wall_thickness_mm,
|
||||
double min_wall_height_mm)
|
||||
double min_wall_height_mm,
|
||||
double max_merge_distance_mm)
|
||||
{
|
||||
auto concavehs = concave_hull(ground_layer);
|
||||
auto concavehs = concave_hull(ground_layer, max_merge_distance_mm);
|
||||
for(ExPolygon& concaveh : concavehs) {
|
||||
if(concaveh.contour.points.empty()) return;
|
||||
concaveh.holes.clear();
|
||||
@ -460,7 +465,7 @@ void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
|
||||
coord_t w = x(bb.max) - x(bb.min);
|
||||
coord_t h = y(bb.max) - y(bb.min);
|
||||
|
||||
auto wall_thickness = coord_t(std::pow((w+h)*0.1, 0.8));
|
||||
auto wall_thickness = coord_t((w+h)*0.01);
|
||||
|
||||
const coord_t WALL_THICKNESS = mm(min_wall_thickness_mm) +
|
||||
wall_thickness;
|
||||
|
@ -20,8 +20,9 @@ void ground_layer(const TriangleMesh& mesh,
|
||||
/// Calculate the pool for the mesh for SLA printing
|
||||
void create_base_pool(const ExPolygons& ground_layer,
|
||||
TriangleMesh& output_mesh,
|
||||
double min_wall_thickness_mm = 4,
|
||||
double min_wall_height_mm = 5
|
||||
double min_wall_thickness_mm = 2,
|
||||
double min_wall_height_mm = 5,
|
||||
double max_merge_distance_mm = 50
|
||||
);
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user