Base plate creation improvements. Added sla parameter for support elevation.

This commit is contained in:
tamasmeszaros 2018-11-16 15:01:31 +01:00
parent a94c604423
commit 1e0d8b245c
5 changed files with 35 additions and 12 deletions

View file

@ -935,6 +935,10 @@ public:
// The max length of a bridge in mm // The max length of a bridge in mm
ConfigOptionFloat support_max_bridge_length /*= 15.0*/; ConfigOptionFloat support_max_bridge_length /*= 15.0*/;
// The elevation in Z direction upwards. This is the space between the pad
// and the model object's bounding box bottom.
ConfigOptionFloat support_object_elevation;
// Now for the base pool (plate) /////////////////////////////////////////// // Now for the base pool (plate) ///////////////////////////////////////////
ConfigOptionFloat pad_wall_thickness /*= 2*/; ConfigOptionFloat pad_wall_thickness /*= 2*/;

View file

@ -418,17 +418,32 @@ ExPolygons concave_hull(const ExPolygons& polys, double max_dist_mm = 50)
return punion; return punion;
} }
void base_plate(const TriangleMesh &mesh, ExPolygons &output, float h) void base_plate(const TriangleMesh &mesh, ExPolygons &output, float h,
float layerh)
{ {
TriangleMesh m = mesh; TriangleMesh m = mesh;
TriangleMeshSlicer slicer(&m); TriangleMeshSlicer slicer(&m);
TriangleMesh upper, lower; // TriangleMesh upper, lower;
slicer.cut(h, &upper, &lower); // slicer.cut(h, &upper, &lower);
// TODO: this might be slow // TODO: this might be slow (in fact it was)
output = lower.horizontal_projection(); // output = lower.horizontal_projection();
auto bb = mesh.bounding_box();
float gnd = float(bb.min(Z));
std::vector<float> heights = {float(bb.min(Z))};
for(float hi = gnd + layerh; hi <= gnd + h; hi += layerh)
heights.emplace_back(hi);
std::vector<ExPolygons> out; out.reserve(size_t(std::ceil(h/layerh)));
slicer.slice(heights, &out, [](){});
size_t count = 0; for(auto& o : out) count += o.size();
ExPolygons tmp; tmp.reserve(count);
for(auto& o : out) for(auto& e : o) tmp.emplace_back(std::move(e));
output = unify(tmp);
for(auto& o : output) o = o.simplify(0.1/SCALING_FACTOR).front(); for(auto& o : output) o = o.simplify(0.1/SCALING_FACTOR).front();
} }

View file

@ -15,7 +15,8 @@ using ExPolygons = std::vector<ExPolygon>;
/// Calculate the polygon representing the silhouette from the specified height /// Calculate the polygon representing the silhouette from the specified height
void base_plate(const TriangleMesh& mesh, void base_plate(const TriangleMesh& mesh,
ExPolygons& output, ExPolygons& output,
float height = 0.1f); float zlevel = 0.1f,
float layerheight = 0.05f);
struct PoolConfig { struct PoolConfig {
double min_wall_thickness_mm = 2; double min_wall_thickness_mm = 2;

View file

@ -510,9 +510,9 @@ struct Pad {
const PoolConfig& cfg) : zlevel(ground_level + cfg.min_wall_height_mm/2) const PoolConfig& cfg) : zlevel(ground_level + cfg.min_wall_height_mm/2)
{ {
ExPolygons basep; ExPolygons basep;
base_plate(object_support_mesh, basep); base_plate(object_support_mesh, basep, cfg.min_wall_height_mm/*,layer_height*/);
for(auto& bp : baseplate) basep.emplace_back(bp); for(auto& bp : baseplate) basep.emplace_back(bp);
union_ex(basep);
create_base_pool(basep, tmesh, cfg); create_base_pool(basep, tmesh, cfg);
tmesh.translate(0, 0, float(zlevel)); tmesh.translate(0, 0, float(zlevel));
} }
@ -1275,8 +1275,6 @@ bool SLASupportTree::generate(const PointSet &points,
ClusterEl cl_centroids; ClusterEl cl_centroids;
cl_centroids.reserve(gnd_clusters.size()); cl_centroids.reserve(gnd_clusters.size());
std::cout << "gnd_clusters size: " << gnd_clusters.size() << std::endl;
SpatIndex pheadindex; // spatial index for the junctions SpatIndex pheadindex; // spatial index for the junctions
for(auto cl : gnd_clusters) { for(auto cl : gnd_clusters) {
// place all the centroid head positions into the index. We will // place all the centroid head positions into the index. We will

View file

@ -200,9 +200,14 @@ void SLAPrint::process()
double h = po.m_config.pad_wall_height.getFloat(); double h = po.m_config.pad_wall_height.getFloat();
double md = po.m_config.pad_max_merge_distance.getFloat(); double md = po.m_config.pad_max_merge_distance.getFloat();
double er = po.m_config.pad_edge_radius.getFloat(); double er = po.m_config.pad_edge_radius.getFloat();
double lh = po.m_config.layer_height.getFloat();
double elevation = po.m_config.support_object_elevation.getFloat();
sla::ExPolygons bp; sla::ExPolygons bp;
sla::base_plate(po.transformed_mesh(), bp); if(elevation < h/2)
sla::base_plate(po.transformed_mesh(), bp,
float(h/2), float(lh));
po.m_supportdata->support_tree_ptr->add_pad(bp, wt, h, md, er); po.m_supportdata->support_tree_ptr->add_pad(bp, wt, h, md, er);
} }
}; };
@ -387,7 +392,7 @@ void SLAPrint::process()
}; };
// this would disable the rasterization step // this would disable the rasterization step
// m_stepmask[slapsRasterize] = false; m_stepmask[slapsRasterize] = false;
for(size_t s = 0; s < print_program.size(); ++s) { for(size_t s = 0; s < print_program.size(); ++s) {
auto currentstep = printsteps[s]; auto currentstep = printsteps[s];