mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-11 16:57:53 -06:00
Corrected height levels at rasterization.
This commit is contained in:
parent
ab597f3c12
commit
4c007a410c
3 changed files with 53 additions and 59 deletions
|
@ -510,7 +510,8 @@ 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, cfg.min_wall_height_mm/*,layer_height*/);
|
base_plate(object_support_mesh, basep,
|
||||||
|
float(cfg.min_wall_height_mm)/*,layer_height*/);
|
||||||
for(auto& bp : baseplate) basep.emplace_back(bp);
|
for(auto& bp : baseplate) basep.emplace_back(bp);
|
||||||
|
|
||||||
create_base_pool(basep, tmesh, cfg);
|
create_base_pool(basep, tmesh, cfg);
|
||||||
|
@ -796,10 +797,19 @@ public:
|
||||||
return meshcache;
|
return meshcache;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WITH THE PAD
|
||||||
double full_height() const {
|
double full_height() const {
|
||||||
|
double h = mesh_height();
|
||||||
|
if(!pad().empty()) h += pad().cfg.min_wall_height_mm / 2;
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
|
// WITHOUT THE PAD!!!
|
||||||
|
double mesh_height() const {
|
||||||
if(!meshcache_valid) merged_mesh();
|
if(!meshcache_valid) merged_mesh();
|
||||||
return model_height;
|
return model_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class DistFn>
|
template<class DistFn>
|
||||||
|
@ -1674,37 +1684,16 @@ void SLASupportTree::merged_mesh_with_pad(TriangleMesh &outmesh) const {
|
||||||
outmesh.merge(get_pad());
|
outmesh.merge(get_pad());
|
||||||
}
|
}
|
||||||
|
|
||||||
//void slice_mesh(const Contour3D& cntr,
|
|
||||||
// std::vector<SlicedSupports>& mergev,
|
|
||||||
// const std::vector<float>& heights)
|
|
||||||
//{
|
|
||||||
// TriangleMesh&& m = mesh(cntr);
|
|
||||||
// TriangleMeshSlicer slicer(&m);
|
|
||||||
// SlicedSupports slout;
|
|
||||||
// slicer.slice(heights, &slout, [](){});
|
|
||||||
|
|
||||||
// for(size_t i = 0; i < slout.size(); i++) {
|
|
||||||
// // move the layers obtained from this mesh to the merge area
|
|
||||||
// mergev[i].emplace_back(std::move(slout[i]));
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//template<class T> void slice_part(const T& inp,
|
|
||||||
// std::vector<SlicedSupports>& mergev,
|
|
||||||
// const std::vector<float>& heights)
|
|
||||||
//{
|
|
||||||
// for(auto& part : inp) {
|
|
||||||
// slice_mesh(part.mesh, mergev, heights);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
SlicedSupports SLASupportTree::slice(float layerh, float init_layerh) const
|
SlicedSupports SLASupportTree::slice(float layerh, float init_layerh) const
|
||||||
{
|
{
|
||||||
if(init_layerh < 0) init_layerh = layerh;
|
if(init_layerh < 0) init_layerh = layerh;
|
||||||
auto& stree = get();
|
auto& stree = get();
|
||||||
const auto modelh = float(stree.full_height());
|
|
||||||
|
|
||||||
|
const auto modelh = float(stree.full_height());
|
||||||
auto gndlvl = float(this->m_impl->ground_level);
|
auto gndlvl = float(this->m_impl->ground_level);
|
||||||
|
const Pad& pad = m_impl->pad();
|
||||||
|
if(!pad.empty()) gndlvl -= float(pad.cfg.min_wall_height_mm/2);
|
||||||
|
|
||||||
std::vector<float> heights = {gndlvl};
|
std::vector<float> heights = {gndlvl};
|
||||||
heights.reserve(size_t(modelh/layerh) + 1);
|
heights.reserve(size_t(modelh/layerh) + 1);
|
||||||
|
|
||||||
|
@ -1713,33 +1702,10 @@ SlicedSupports SLASupportTree::slice(float layerh, float init_layerh) const
|
||||||
}
|
}
|
||||||
|
|
||||||
TriangleMesh fullmesh = m_impl->merged_mesh();
|
TriangleMesh fullmesh = m_impl->merged_mesh();
|
||||||
|
fullmesh.merge(get_pad());
|
||||||
TriangleMeshSlicer slicer(&fullmesh);
|
TriangleMeshSlicer slicer(&fullmesh);
|
||||||
SlicedSupports ret;
|
SlicedSupports ret;
|
||||||
slicer.slice(heights, &ret, [](){});
|
slicer.slice(heights, &ret, m_ctl.cancelfn);
|
||||||
|
|
||||||
// std::vector<SlicedSupports> mergev(heights.size());
|
|
||||||
|
|
||||||
// slice_part(stree.heads(), mergev, heights);
|
|
||||||
// slice_part(stree.pillars(), mergev, heights);
|
|
||||||
// for(auto& pillar : stree.pillars()) slice_mesh(pillar.base, mergev, heights);
|
|
||||||
// slice_part(stree.junctions(), mergev, heights);
|
|
||||||
//// slice_part(stree.bridges(), mergev, heights);
|
|
||||||
//// slice_part(stree.compact_bridges(), mergev, heights);
|
|
||||||
|
|
||||||
// // TODO: slicing base pool geometry
|
|
||||||
|
|
||||||
// // We could make a union of the slices at the same height level but at the
|
|
||||||
// // end they will be loaded into the rasterizer and it will unite them
|
|
||||||
// // anyway.
|
|
||||||
|
|
||||||
// SlicedSupports ret; ret.reserve(mergev.size());
|
|
||||||
// for(SlicedSupports& level : mergev) {
|
|
||||||
// size_t count = 0;
|
|
||||||
// for(auto& v : level) count += v.size();
|
|
||||||
// ret.emplace_back(); auto& merg = ret.back(); merg.reserve(count);
|
|
||||||
// for(ExPolygons& v : level)
|
|
||||||
// for(ExPolygon& ex : v) merg.emplace_back(ex);
|
|
||||||
// }
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1774,7 +1740,8 @@ double SLASupportTree::get_elevation() const
|
||||||
|
|
||||||
SLASupportTree::SLASupportTree(const Model& model,
|
SLASupportTree::SLASupportTree(const Model& model,
|
||||||
const SupportConfig& cfg,
|
const SupportConfig& cfg,
|
||||||
const Controller& ctl): m_impl(new Impl())
|
const Controller& ctl):
|
||||||
|
m_impl(new Impl()), m_ctl(ctl)
|
||||||
{
|
{
|
||||||
generate(support_points(model), to_eigenmesh(model), cfg, ctl);
|
generate(support_points(model), to_eigenmesh(model), cfg, ctl);
|
||||||
}
|
}
|
||||||
|
@ -1782,14 +1749,15 @@ SLASupportTree::SLASupportTree(const Model& model,
|
||||||
SLASupportTree::SLASupportTree(const PointSet &points,
|
SLASupportTree::SLASupportTree(const PointSet &points,
|
||||||
const EigenMesh3D& emesh,
|
const EigenMesh3D& emesh,
|
||||||
const SupportConfig &cfg,
|
const SupportConfig &cfg,
|
||||||
const Controller &ctl): m_impl(new Impl())
|
const Controller &ctl):
|
||||||
|
m_impl(new Impl()), m_ctl(ctl)
|
||||||
{
|
{
|
||||||
m_impl->ground_level = emesh.ground_level - cfg.object_elevation_mm;
|
m_impl->ground_level = emesh.ground_level - cfg.object_elevation_mm;
|
||||||
generate(points, emesh, cfg, ctl);
|
generate(points, emesh, cfg, ctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
SLASupportTree::SLASupportTree(const SLASupportTree &c):
|
SLASupportTree::SLASupportTree(const SLASupportTree &c):
|
||||||
m_impl( new Impl(*c.m_impl)) {}
|
m_impl(new Impl(*c.m_impl)), m_ctl(c.m_ctl) {}
|
||||||
|
|
||||||
SLASupportTree &SLASupportTree::operator=(const SLASupportTree &c)
|
SLASupportTree &SLASupportTree::operator=(const SLASupportTree &c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -69,10 +69,19 @@ struct SupportConfig {
|
||||||
/// A Control structure for the support calculation. Consists of the status
|
/// A Control structure for the support calculation. Consists of the status
|
||||||
/// indicator callback and the stop condition predicate.
|
/// indicator callback and the stop condition predicate.
|
||||||
struct Controller {
|
struct Controller {
|
||||||
|
|
||||||
|
// This will signal the status of the calculation to the front-end
|
||||||
std::function<void(unsigned, const std::string&)> statuscb =
|
std::function<void(unsigned, const std::string&)> statuscb =
|
||||||
[](unsigned, const std::string&){};
|
[](unsigned, const std::string&){};
|
||||||
|
|
||||||
|
// Returns true if the calculation should be aborted.
|
||||||
std::function<bool(void)> stopcondition = [](){ return false; };
|
std::function<bool(void)> stopcondition = [](){ return false; };
|
||||||
|
|
||||||
|
// Similar to cancel callback. This should check the stop condition and
|
||||||
|
// if true, throw an appropriate exception. (TriangleMeshSlicer needs this)
|
||||||
|
// consider it a hard abort. stopcondition is permits the algorithm to
|
||||||
|
// terminate itself
|
||||||
|
std::function<void(void)> cancelfn = [](){};
|
||||||
};
|
};
|
||||||
|
|
||||||
/// An index-triangle structure for libIGL functions. Also serves as an
|
/// An index-triangle structure for libIGL functions. Also serves as an
|
||||||
|
@ -124,6 +133,7 @@ public:
|
||||||
class SLASupportTree {
|
class SLASupportTree {
|
||||||
class Impl;
|
class Impl;
|
||||||
std::unique_ptr<Impl> m_impl;
|
std::unique_ptr<Impl> m_impl;
|
||||||
|
Controller m_ctl;
|
||||||
|
|
||||||
Impl& get() { return *m_impl; }
|
Impl& get() { return *m_impl; }
|
||||||
const Impl& get() const { return *m_impl; }
|
const Impl& get() const { return *m_impl; }
|
||||||
|
|
|
@ -128,7 +128,7 @@ void SLAPrint::process()
|
||||||
|
|
||||||
// Slicing the model object. This method is oversimplified and needs to
|
// Slicing the model object. This method is oversimplified and needs to
|
||||||
// be compared with the fff slicing algorithm for verification
|
// be compared with the fff slicing algorithm for verification
|
||||||
auto slice_model = [ilh](SLAPrintObject& po) {
|
auto slice_model = [this, ilh](SLAPrintObject& po) {
|
||||||
auto lh = float(po.m_config.layer_height.getFloat());
|
auto lh = float(po.m_config.layer_height.getFloat());
|
||||||
|
|
||||||
TriangleMesh mesh = po.transformed_mesh();
|
TriangleMesh mesh = po.transformed_mesh();
|
||||||
|
@ -141,7 +141,9 @@ void SLAPrint::process()
|
||||||
for(float h = gnd + ilh; h < gnd + H; h += lh) heights.emplace_back(h);
|
for(float h = gnd + ilh; h < gnd + H; h += lh) heights.emplace_back(h);
|
||||||
|
|
||||||
auto& layers = po.m_model_slices;
|
auto& layers = po.m_model_slices;
|
||||||
slicer.slice(heights, &layers, [](){});
|
slicer.slice(heights, &layers, [this](){
|
||||||
|
throw_if_canceled();
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
auto support_points = [](SLAPrintObject& po) {
|
auto support_points = [](SLAPrintObject& po) {
|
||||||
|
@ -176,6 +178,7 @@ void SLAPrint::process()
|
||||||
set_status(unsigned(stinit + st*d), msg);
|
set_status(unsigned(stinit + st*d), msg);
|
||||||
};
|
};
|
||||||
ctl.stopcondition = [this](){ return canceled(); };
|
ctl.stopcondition = [this](){ return canceled(); };
|
||||||
|
ctl.cancelfn = [this]() { throw_if_canceled(); };
|
||||||
|
|
||||||
po.m_supportdata->support_tree_ptr.reset(
|
po.m_supportdata->support_tree_ptr.reset(
|
||||||
new SLASupportTree(pts, emesh, scfg, ctl));
|
new SLASupportTree(pts, emesh, scfg, ctl));
|
||||||
|
@ -242,10 +245,16 @@ void SLAPrint::process()
|
||||||
// For all print objects, go through its initial layers and place them
|
// For all print objects, go through its initial layers and place them
|
||||||
// into the layers hash
|
// into the layers hash
|
||||||
for(SLAPrintObject *o : m_objects) {
|
for(SLAPrintObject *o : m_objects) {
|
||||||
|
|
||||||
|
double gndlvl = o->transformed_mesh().bounding_box().min(Z);
|
||||||
|
|
||||||
double lh = o->m_config.layer_height.getFloat();
|
double lh = o->m_config.layer_height.getFloat();
|
||||||
SlicedModel & oslices = o->m_model_slices;
|
SlicedModel & oslices = o->m_model_slices;
|
||||||
for(int i = 0; i < oslices.size(); ++i) {
|
for(int i = 0; i < oslices.size(); ++i) {
|
||||||
double h = ilh + i * lh;
|
int a = i == 0 ? 0 : 1;
|
||||||
|
int b = i == 0 ? 0 : i - 1;
|
||||||
|
|
||||||
|
double h = gndlvl + ilh * a + b * lh;
|
||||||
long long lyridx = static_cast<long long>(scale_(h));
|
long long lyridx = static_cast<long long>(scale_(h));
|
||||||
auto& lyrs = levels[lyridx]; // this initializes a new record
|
auto& lyrs = levels[lyridx]; // this initializes a new record
|
||||||
lyrs.emplace_back(oslices[i], o->m_instances);
|
lyrs.emplace_back(oslices[i], o->m_instances);
|
||||||
|
@ -253,9 +262,16 @@ void SLAPrint::process()
|
||||||
|
|
||||||
if(o->m_supportdata) { // deal with the support slices if present
|
if(o->m_supportdata) { // deal with the support slices if present
|
||||||
auto& sslices = o->m_supportdata->support_slices;
|
auto& sslices = o->m_supportdata->support_slices;
|
||||||
|
double el = o->m_config.support_object_elevation.getFloat();
|
||||||
|
//TODO: remove next line:
|
||||||
|
el = SupportConfig().object_elevation_mm;
|
||||||
|
|
||||||
for(int i = 0; i < sslices.size(); ++i) {
|
for(int i = 0; i < sslices.size(); ++i) {
|
||||||
double h = ilh + i * lh;
|
int a = i == 0 ? 0 : 1;
|
||||||
|
int b = i == 0 ? 0 : i - 1;
|
||||||
|
|
||||||
|
double h = gndlvl - el + ilh * a + b * lh;
|
||||||
|
|
||||||
long long lyridx = static_cast<long long>(scale_(h));
|
long long lyridx = static_cast<long long>(scale_(h));
|
||||||
auto& lyrs = levels[lyridx];
|
auto& lyrs = levels[lyridx];
|
||||||
lyrs.emplace_back(sslices[i], o->m_instances);
|
lyrs.emplace_back(sslices[i], o->m_instances);
|
||||||
|
@ -392,7 +408,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];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue