added max merge distance parameter

This commit is contained in:
tamasmeszaros 2018-08-28 10:52:18 +02:00
parent 6ce686aff8
commit 7cee4d53f9
2 changed files with 18 additions and 12 deletions

View File

@ -294,6 +294,8 @@ inline Contour3D inner_bed(const ExPolygon& poly, double depth_mm,
/// Unification of polygons (with clipper) preserving holes as well. /// Unification of polygons (with clipper) preserving holes as well.
inline ExPolygons unify(const ExPolygons& shapes) { inline ExPolygons unify(const ExPolygons& shapes) {
using ClipperLib::ptSubject;
ExPolygons retv; ExPolygons retv;
bool closed = true; bool closed = true;
@ -303,11 +305,15 @@ inline ExPolygons unify(const ExPolygons& shapes) {
for(auto& path : shapes) { for(auto& path : shapes) {
auto clipperpath = Slic3rMultiPoint_to_ClipperPath(path.contour); 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); auto clipperholes = Slic3rMultiPoints_to_ClipperPaths(path.holes);
for(auto& hole : clipperholes) { 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 /// 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 /// to the center of the "scene" which is the centroid calculated from the shape
/// centroids (a star is created...) /// 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(); 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 dx = x(c) - x(cc), dy = y(c) - y(cc);
double l = std::sqrt(dx * dx + dy * dy); double l = std::sqrt(dx * dx + dy * dy);
double nx = dx / l, ny = dy / l; 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; ExPolygon r;
auto& ctour = r.contour.points; auto& ctour = r.contour.points;
@ -427,9 +434,6 @@ inline ExPolygons concave_hull(const ExPolygons& polys, double max_dist_mm = 0)
punion = unify(punion); punion = unify(punion);
if(punion.size() != 1)
BOOST_LOG_TRIVIAL(error) << "Cannot generate correct SLA base pool!";
return punion; 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, void create_base_pool(const ExPolygons &ground_layer, TriangleMesh& out,
double min_wall_thickness_mm, 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) { for(ExPolygon& concaveh : concavehs) {
if(concaveh.contour.points.empty()) return; if(concaveh.contour.points.empty()) return;
concaveh.holes.clear(); 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 w = x(bb.max) - x(bb.min);
coord_t h = y(bb.max) - y(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) + const coord_t WALL_THICKNESS = mm(min_wall_thickness_mm) +
wall_thickness; wall_thickness;

View File

@ -20,8 +20,9 @@ void ground_layer(const TriangleMesh& mesh,
/// Calculate the pool for the mesh for SLA printing /// Calculate the pool for the mesh for SLA printing
void create_base_pool(const ExPolygons& ground_layer, void create_base_pool(const ExPolygons& ground_layer,
TriangleMesh& output_mesh, TriangleMesh& output_mesh,
double min_wall_thickness_mm = 4, double min_wall_thickness_mm = 2,
double min_wall_height_mm = 5 double min_wall_height_mm = 5,
double max_merge_distance_mm = 50
); );
} }