mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-11 16:57:53 -06:00
Rethought sla status indication.
This commit is contained in:
parent
c542413962
commit
a3dcb6863e
4 changed files with 78 additions and 57 deletions
|
@ -49,8 +49,8 @@ float SLAAutoSupports::distance_limit(float angle) const
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
SLAAutoSupports::SLAAutoSupports(const TriangleMesh& mesh, const sla::EigenMesh3D& emesh, const std::vector<ExPolygons>& slices, const std::vector<float>& heights,
|
SLAAutoSupports::SLAAutoSupports(const TriangleMesh& mesh, const sla::EigenMesh3D& emesh, const std::vector<ExPolygons>& slices, const std::vector<float>& heights,
|
||||||
const Config& config, std::function<void(void)> throw_on_cancel)
|
const Config& config, std::function<void(void)> throw_on_cancel, std::function<void(int)> statusfn)
|
||||||
: m_config(config), m_emesh(emesh), m_throw_on_cancel(throw_on_cancel)
|
: m_config(config), m_emesh(emesh), m_throw_on_cancel(throw_on_cancel), m_statusfn(statusfn)
|
||||||
{
|
{
|
||||||
process(slices, heights);
|
process(slices, heights);
|
||||||
project_onto_mesh(m_output);
|
project_onto_mesh(m_output);
|
||||||
|
@ -197,6 +197,9 @@ void SLAAutoSupports::process(const std::vector<ExPolygons>& slices, const std::
|
||||||
PointGrid3D point_grid;
|
PointGrid3D point_grid;
|
||||||
point_grid.cell_size = Vec3f(10.f, 10.f, 10.f);
|
point_grid.cell_size = Vec3f(10.f, 10.f, 10.f);
|
||||||
|
|
||||||
|
double increment = 100.0 / layers.size();
|
||||||
|
double status = 0;
|
||||||
|
|
||||||
for (unsigned int layer_id = 0; layer_id < layers.size(); ++ layer_id) {
|
for (unsigned int layer_id = 0; layer_id < layers.size(); ++ layer_id) {
|
||||||
SLAAutoSupports::MyLayer *layer_top = &layers[layer_id];
|
SLAAutoSupports::MyLayer *layer_top = &layers[layer_id];
|
||||||
SLAAutoSupports::MyLayer *layer_bottom = (layer_id > 0) ? &layers[layer_id - 1] : nullptr;
|
SLAAutoSupports::MyLayer *layer_bottom = (layer_id > 0) ? &layers[layer_id - 1] : nullptr;
|
||||||
|
@ -252,6 +255,9 @@ void SLAAutoSupports::process(const std::vector<ExPolygons>& slices, const std::
|
||||||
|
|
||||||
m_throw_on_cancel();
|
m_throw_on_cancel();
|
||||||
|
|
||||||
|
status += increment;
|
||||||
|
m_statusfn(int(std::round(status)));
|
||||||
|
|
||||||
#ifdef SLA_AUTOSUPPORTS_DEBUG
|
#ifdef SLA_AUTOSUPPORTS_DEBUG
|
||||||
/*std::string layer_num_str = std::string((i<10 ? "0" : "")) + std::string((i<100 ? "0" : "")) + std::to_string(i);
|
/*std::string layer_num_str = std::string((i<10 ? "0" : "")) + std::string((i<100 ? "0" : "")) + std::to_string(i);
|
||||||
output_expolygons(expolys_top, "top" + layer_num_str + ".svg");
|
output_expolygons(expolys_top, "top" + layer_num_str + ".svg");
|
||||||
|
|
|
@ -24,7 +24,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
SLAAutoSupports(const TriangleMesh& mesh, const sla::EigenMesh3D& emesh, const std::vector<ExPolygons>& slices,
|
SLAAutoSupports(const TriangleMesh& mesh, const sla::EigenMesh3D& emesh, const std::vector<ExPolygons>& slices,
|
||||||
const std::vector<float>& heights, const Config& config, std::function<void(void)> throw_on_cancel);
|
const std::vector<float>& heights, const Config& config, std::function<void(void)> throw_on_cancel, std::function<void(int)> statusfn);
|
||||||
const std::vector<sla::SupportPoint>& output() { return m_output; }
|
const std::vector<sla::SupportPoint>& output() { return m_output; }
|
||||||
|
|
||||||
struct MyLayer;
|
struct MyLayer;
|
||||||
|
@ -196,8 +196,9 @@ private:
|
||||||
static void output_structures(const std::vector<Structure> &structures);
|
static void output_structures(const std::vector<Structure> &structures);
|
||||||
#endif // SLA_AUTOSUPPORTS_DEBUG
|
#endif // SLA_AUTOSUPPORTS_DEBUG
|
||||||
|
|
||||||
std::function<void(void)> m_throw_on_cancel;
|
|
||||||
const sla::EigenMesh3D& m_emesh;
|
const sla::EigenMesh3D& m_emesh;
|
||||||
|
std::function<void(void)> m_throw_on_cancel;
|
||||||
|
std::function<void(int)> m_statusfn;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -619,14 +619,6 @@ bool SLAPrint::invalidate_step(SLAPrintStep step)
|
||||||
return invalidated;
|
return invalidated;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class...Args>
|
|
||||||
void report_status(SLAPrint& p, int st, const std::string& msg, Args&&...args)
|
|
||||||
{
|
|
||||||
BOOST_LOG_TRIVIAL(info) << st << "% " << msg;
|
|
||||||
p.set_status(st, msg, std::forward<Args>(args)...);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SLAPrint::process()
|
void SLAPrint::process()
|
||||||
{
|
{
|
||||||
using namespace sla;
|
using namespace sla;
|
||||||
|
@ -720,7 +712,7 @@ void SLAPrint::process()
|
||||||
|
|
||||||
// In this step we check the slices, identify island and cover them with
|
// In this step we check the slices, identify island and cover them with
|
||||||
// support points. Then we sprinkle the rest of the mesh.
|
// support points. Then we sprinkle the rest of the mesh.
|
||||||
auto support_points = [this](SLAPrintObject& po) {
|
auto support_points = [this, ostepd](SLAPrintObject& po) {
|
||||||
const ModelObject& mo = *po.m_model_object;
|
const ModelObject& mo = *po.m_model_object;
|
||||||
po.m_supportdata.reset(
|
po.m_supportdata.reset(
|
||||||
new SLAPrintObject::SupportData(po.transformed_mesh()) );
|
new SLAPrintObject::SupportData(po.transformed_mesh()) );
|
||||||
|
@ -754,6 +746,19 @@ void SLAPrint::process()
|
||||||
config.minimal_distance = float(cfg.support_points_minimal_distance);
|
config.minimal_distance = float(cfg.support_points_minimal_distance);
|
||||||
config.head_diameter = float(cfg.support_head_front_diameter);
|
config.head_diameter = float(cfg.support_head_front_diameter);
|
||||||
|
|
||||||
|
// scaling for the sub operations
|
||||||
|
double d = ostepd * OBJ_STEP_LEVELS[slaposSupportPoints] / 100.0;
|
||||||
|
double init = m_report_status.status();
|
||||||
|
|
||||||
|
auto statuscb = [this, d, init](unsigned st)
|
||||||
|
{
|
||||||
|
double current = init + st * d;
|
||||||
|
if(std::round(m_report_status.status()) < std::round(current))
|
||||||
|
m_report_status(*this, current,
|
||||||
|
OBJ_STEP_LABELS[slaposSupportPoints]);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
// Construction of this object does the calculation.
|
// Construction of this object does the calculation.
|
||||||
this->throw_if_canceled();
|
this->throw_if_canceled();
|
||||||
SLAAutoSupports auto_supports(po.transformed_mesh(),
|
SLAAutoSupports auto_supports(po.transformed_mesh(),
|
||||||
|
@ -761,7 +766,8 @@ void SLAPrint::process()
|
||||||
po.get_model_slices(),
|
po.get_model_slices(),
|
||||||
heights,
|
heights,
|
||||||
config,
|
config,
|
||||||
[this]() { throw_if_canceled(); });
|
[this]() { throw_if_canceled(); },
|
||||||
|
statuscb);
|
||||||
|
|
||||||
// Now let's extract the result.
|
// Now let's extract the result.
|
||||||
const std::vector<sla::SupportPoint>& points = auto_supports.output();
|
const std::vector<sla::SupportPoint>& points = auto_supports.output();
|
||||||
|
@ -772,7 +778,7 @@ void SLAPrint::process()
|
||||||
<< po.m_supportdata->support_points.size();
|
<< po.m_supportdata->support_points.size();
|
||||||
|
|
||||||
// Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass the update status to GLGizmoSlaSupports
|
// Using RELOAD_SLA_SUPPORT_POINTS to tell the Plater to pass the update status to GLGizmoSlaSupports
|
||||||
report_status(*this, -1, L("Generating support points"), SlicingStatus::RELOAD_SLA_SUPPORT_POINTS);
|
m_report_status(*this, -1, L("Generating support points"), SlicingStatus::RELOAD_SLA_SUPPORT_POINTS);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// There are either some points on the front-end, or the user removed them on purpose. No calculation will be done.
|
// There are either some points on the front-end, or the user removed them on purpose. No calculation will be done.
|
||||||
|
@ -781,7 +787,8 @@ void SLAPrint::process()
|
||||||
};
|
};
|
||||||
|
|
||||||
// In this step we create the supports
|
// In this step we create the supports
|
||||||
auto support_tree = [this, objcount, ostepd](SLAPrintObject& po) {
|
auto support_tree = [this, ostepd](SLAPrintObject& po)
|
||||||
|
{
|
||||||
if(!po.m_supportdata) return;
|
if(!po.m_supportdata) return;
|
||||||
|
|
||||||
if(!po.m_config.supports_enable.getBool()) {
|
if(!po.m_config.supports_enable.getBool()) {
|
||||||
|
@ -793,22 +800,17 @@ void SLAPrint::process()
|
||||||
sla::SupportConfig scfg = make_support_cfg(po.m_config);
|
sla::SupportConfig scfg = make_support_cfg(po.m_config);
|
||||||
sla::Controller ctl;
|
sla::Controller ctl;
|
||||||
|
|
||||||
// some magic to scale the status values coming from the support
|
|
||||||
// tree creation into the whole print process
|
|
||||||
auto stfirst = OBJ_STEP_LEVELS.begin();
|
|
||||||
auto stthis = stfirst + slaposSupportTree;
|
|
||||||
// we need to add up the status portions until this operation
|
|
||||||
int init = std::accumulate(stfirst, stthis, 0);
|
|
||||||
init = int(init * ostepd); // scale the init portion
|
|
||||||
|
|
||||||
// scaling for the sub operations
|
// scaling for the sub operations
|
||||||
double d = *stthis / 100.0;
|
double d = ostepd * OBJ_STEP_LEVELS[slaposSupportTree] / 100.0;
|
||||||
|
double init = m_report_status.status();
|
||||||
|
|
||||||
ctl.statuscb = [this, init, d, ostepd](unsigned st, const std::string& /*msg*/)
|
ctl.statuscb = [this, d, init](unsigned st, const std::string&)
|
||||||
{
|
{
|
||||||
//FIXME this status line scaling does not seem to be correct.
|
double current = init + st * d;
|
||||||
// How does it account for an increasing object index?
|
if(std::round(m_report_status.status()) < std::round(current))
|
||||||
report_status(*this, int(init + st*d*ostepd), OBJ_STEP_LABELS[slaposSupportTree]);
|
m_report_status(*this, current,
|
||||||
|
OBJ_STEP_LABELS[slaposSupportTree]);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ctl.stopcondition = [this](){ return canceled(); };
|
ctl.stopcondition = [this](){ return canceled(); };
|
||||||
|
@ -824,7 +826,7 @@ void SLAPrint::process()
|
||||||
auto rc = SlicingStatus::RELOAD_SCENE;
|
auto rc = SlicingStatus::RELOAD_SCENE;
|
||||||
|
|
||||||
// This is to prevent "Done." being displayed during merged_mesh()
|
// This is to prevent "Done." being displayed during merged_mesh()
|
||||||
report_status(*this, -1, L("Visualizing supports"));
|
m_report_status(*this, -1, L("Visualizing supports"));
|
||||||
po.m_supportdata->support_tree_ptr->merged_mesh();
|
po.m_supportdata->support_tree_ptr->merged_mesh();
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(debug) << "Processed support point count "
|
BOOST_LOG_TRIVIAL(debug) << "Processed support point count "
|
||||||
|
@ -834,8 +836,7 @@ void SLAPrint::process()
|
||||||
if(po.support_mesh().empty())
|
if(po.support_mesh().empty())
|
||||||
BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty";
|
BOOST_LOG_TRIVIAL(warning) << "Support mesh is empty";
|
||||||
|
|
||||||
report_status(*this, -1, L("Visualizing supports"), rc);
|
m_report_status(*this, -1, L("Visualizing supports"), rc);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// This step generates the sla base pad
|
// This step generates the sla base pad
|
||||||
|
@ -883,7 +884,7 @@ void SLAPrint::process()
|
||||||
|
|
||||||
po.throw_if_canceled();
|
po.throw_if_canceled();
|
||||||
auto rc = SlicingStatus::RELOAD_SCENE;
|
auto rc = SlicingStatus::RELOAD_SCENE;
|
||||||
report_status(*this, -1, L("Visualizing supports"), rc);
|
m_report_status(*this, -1, L("Visualizing supports"), rc);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Slicing the support geometries similarly to the model slicing procedure.
|
// Slicing the support geometries similarly to the model slicing procedure.
|
||||||
|
@ -914,7 +915,7 @@ void SLAPrint::process()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update status to the 3D preview to load the SLA slices.
|
// Using RELOAD_SLA_PREVIEW to tell the Plater to pass the update status to the 3D preview to load the SLA slices.
|
||||||
report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW);
|
m_report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Merging the slices from all the print objects into one slice grid and
|
// Merging the slices from all the print objects into one slice grid and
|
||||||
|
@ -1213,7 +1214,7 @@ void SLAPrint::process()
|
||||||
m_print_statistics.fast_layers_count = fast_layers;
|
m_print_statistics.fast_layers_count = fast_layers;
|
||||||
m_print_statistics.slow_layers_count = slow_layers;
|
m_print_statistics.slow_layers_count = slow_layers;
|
||||||
|
|
||||||
report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW);
|
m_report_status(*this, -2, "", SlicingStatus::RELOAD_SLA_PREVIEW);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Rasterizing the model objects, and their supports
|
// Rasterizing the model objects, and their supports
|
||||||
|
@ -1259,16 +1260,11 @@ void SLAPrint::process()
|
||||||
// slot is the portion of 100% that is realted to rasterization
|
// slot is the portion of 100% that is realted to rasterization
|
||||||
unsigned slot = PRINT_STEP_LEVELS[slapsRasterize];
|
unsigned slot = PRINT_STEP_LEVELS[slapsRasterize];
|
||||||
|
|
||||||
// ist: initial state; pst: previous state
|
// pst: previous state
|
||||||
unsigned ist = std::accumulate(PRINT_STEP_LEVELS.begin(),
|
double pst = m_report_status.status();
|
||||||
PRINT_STEP_LEVELS.begin()+slapsRasterize,
|
|
||||||
0u);
|
|
||||||
|
|
||||||
ist = max_objstatus + unsigned(ist * sd);
|
|
||||||
unsigned pst = ist;
|
|
||||||
|
|
||||||
double increment = (slot * sd) / m_printer_input.size();
|
double increment = (slot * sd) / m_printer_input.size();
|
||||||
double dstatus = double(ist);
|
double dstatus = m_report_status.status();
|
||||||
|
|
||||||
SpinMutex slck;
|
SpinMutex slck;
|
||||||
|
|
||||||
|
@ -1294,10 +1290,10 @@ void SLAPrint::process()
|
||||||
{
|
{
|
||||||
std::lock_guard<SpinMutex> lck(slck);
|
std::lock_guard<SpinMutex> lck(slck);
|
||||||
dstatus += increment;
|
dstatus += increment;
|
||||||
auto st = unsigned(dstatus);
|
double st = std::round(dstatus);
|
||||||
if( st > pst) {
|
if(st > pst) {
|
||||||
report_status(*this, int(st),
|
m_report_status(*this, st,
|
||||||
PRINT_STEP_LABELS[slapsRasterize]);
|
PRINT_STEP_LABELS[slapsRasterize]);
|
||||||
pst = st;
|
pst = st;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1338,7 +1334,7 @@ void SLAPrint::process()
|
||||||
rasterize
|
rasterize
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned st = min_objstatus;
|
double st = min_objstatus;
|
||||||
unsigned incr = 0;
|
unsigned incr = 0;
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "Start slicing process.";
|
BOOST_LOG_TRIVIAL(info) << "Start slicing process.";
|
||||||
|
@ -1352,18 +1348,18 @@ void SLAPrint::process()
|
||||||
|
|
||||||
BOOST_LOG_TRIVIAL(info) << "Slicing object " << po->model_object()->name;
|
BOOST_LOG_TRIVIAL(info) << "Slicing object " << po->model_object()->name;
|
||||||
|
|
||||||
for (int s = (int)step_ranges[idx_range]; s < (int)step_ranges[idx_range + 1]; ++s) {
|
for (int s = int(step_ranges[idx_range]); s < int(step_ranges[idx_range + 1]); ++s) {
|
||||||
auto currentstep = (SLAPrintObjectStep)s;
|
auto currentstep = static_cast<SLAPrintObjectStep>(s);
|
||||||
|
|
||||||
// Cancellation checking. Each step will check for cancellation
|
// Cancellation checking. Each step will check for cancellation
|
||||||
// on its own and return earlier gracefully. Just after it returns
|
// on its own and return earlier gracefully. Just after it returns
|
||||||
// execution gets to this point and throws the canceled signal.
|
// execution gets to this point and throws the canceled signal.
|
||||||
throw_if_canceled();
|
throw_if_canceled();
|
||||||
|
|
||||||
st += unsigned(incr * ostepd);
|
st += incr * ostepd;
|
||||||
|
|
||||||
if(po->m_stepmask[currentstep] && po->set_started(currentstep)) {
|
if(po->m_stepmask[currentstep] && po->set_started(currentstep)) {
|
||||||
report_status(*this, int(st), OBJ_STEP_LABELS[currentstep]);
|
m_report_status(*this, st, OBJ_STEP_LABELS[currentstep]);
|
||||||
pobj_program[currentstep](*po);
|
pobj_program[currentstep](*po);
|
||||||
throw_if_canceled();
|
throw_if_canceled();
|
||||||
po->set_done(currentstep);
|
po->set_done(currentstep);
|
||||||
|
@ -1390,17 +1386,17 @@ void SLAPrint::process()
|
||||||
|
|
||||||
if(m_stepmask[currentstep] && set_started(currentstep))
|
if(m_stepmask[currentstep] && set_started(currentstep))
|
||||||
{
|
{
|
||||||
report_status(*this, int(st), PRINT_STEP_LABELS[currentstep]);
|
m_report_status(*this, st, PRINT_STEP_LABELS[currentstep]);
|
||||||
print_program[currentstep]();
|
print_program[currentstep]();
|
||||||
throw_if_canceled();
|
throw_if_canceled();
|
||||||
set_done(currentstep);
|
set_done(currentstep);
|
||||||
}
|
}
|
||||||
|
|
||||||
st += unsigned(PRINT_STEP_LEVELS[currentstep] * pstd);
|
st += PRINT_STEP_LEVELS[currentstep] * pstd;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If everything vent well
|
// If everything vent well
|
||||||
report_status(*this, 100, L("Slicing done"));
|
m_report_status(*this, 100, L("Slicing done"));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SLAPrint::invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys)
|
bool SLAPrint::invalidate_state_by_config_options(const std::vector<t_config_option_key> &opt_keys)
|
||||||
|
@ -1724,7 +1720,8 @@ DynamicConfig SLAPrintStatistics::placeholders()
|
||||||
"print_time", "total_cost", "total_weight",
|
"print_time", "total_cost", "total_weight",
|
||||||
"objects_used_material", "support_used_material" })
|
"objects_used_material", "support_used_material" })
|
||||||
config.set_key_value(key, new ConfigOptionString(std::string("{") + key + "}"));
|
config.set_key_value(key, new ConfigOptionString(std::string("{") + key + "}"));
|
||||||
return config;
|
|
||||||
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string SLAPrintStatistics::finalize_output_path(const std::string &path_in) const
|
std::string SLAPrintStatistics::finalize_output_path(const std::string &path_in) const
|
||||||
|
@ -1744,4 +1741,12 @@ std::string SLAPrintStatistics::finalize_output_path(const std::string &path_in)
|
||||||
return final_path;
|
return final_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SLAPrint::StatusReporter::operator()(
|
||||||
|
SLAPrint &p, double st, const std::string &msg, unsigned flags)
|
||||||
|
{
|
||||||
|
m_st = st;
|
||||||
|
BOOST_LOG_TRIVIAL(info) << st << "% " << msg;
|
||||||
|
p.set_status(int(std::round(st)), msg, flags);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Slic3r
|
} // namespace Slic3r
|
||||||
|
|
|
@ -471,6 +471,15 @@ private:
|
||||||
// Estimated print time, material consumed.
|
// Estimated print time, material consumed.
|
||||||
SLAPrintStatistics m_print_statistics;
|
SLAPrintStatistics m_print_statistics;
|
||||||
|
|
||||||
|
class StatusReporter {
|
||||||
|
double m_st = 0;
|
||||||
|
public:
|
||||||
|
void operator() (SLAPrint& p, double st, const std::string& msg,
|
||||||
|
unsigned flags = SlicingStatus::DEFAULT);
|
||||||
|
double status() const { return m_st; }
|
||||||
|
} m_report_status;
|
||||||
|
|
||||||
|
|
||||||
friend SLAPrintObject;
|
friend SLAPrintObject;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue