zip file output dialog and status indication for sla in the statusbar.

This commit is contained in:
tamasmeszaros 2018-11-13 11:53:54 +01:00
parent 90c38daeae
commit 95419370e1
6 changed files with 104 additions and 29 deletions

View File

@ -154,6 +154,7 @@ void SLAPrint::process()
}; };
using slaposFn = std::function<void(const SLAPrintObject&)>; using slaposFn = std::function<void(const SLAPrintObject&)>;
using slapsFn = std::function<void(void)>;
std::array<SLAPrintObjectStep, slaposCount> objectsteps = { std::array<SLAPrintObjectStep, slaposCount> objectsteps = {
slaposObjectSlice, slaposObjectSlice,
@ -164,7 +165,7 @@ void SLAPrint::process()
slaposSliceSupports slaposSliceSupports
}; };
std::array<slaposFn, slaposCount> fullprogram = std::array<slaposFn, slaposCount> pobj_program =
{ {
slice_model, slice_model,
[](const SLAPrintObject&){}, // slaposSupportIslands now empty [](const SLAPrintObject&){}, // slaposSupportIslands now empty
@ -174,8 +175,14 @@ void SLAPrint::process()
slice_supports slice_supports
}; };
std::array<slapsFn, slapsCount> print_program =
{
rasterize,
[](){} // validate
};
for(SLAPrintObject * po : m_objects) { for(SLAPrintObject * po : m_objects) {
for(size_t s = 0; s < fullprogram.size(); ++s) { for(size_t s = 0; s < pobj_program.size(); ++s) {
auto currentstep = objectsteps[s]; auto currentstep = objectsteps[s];
// Cancellation checking. Each step will check for cancellation // Cancellation checking. Each step will check for cancellation
@ -188,11 +195,33 @@ void SLAPrint::process()
OBJ_STEP_LABELS[currentstep]); OBJ_STEP_LABELS[currentstep]);
po->set_started(currentstep); po->set_started(currentstep);
fullprogram[s](*po); pobj_program[s](*po);
po->set_done(currentstep); po->set_done(currentstep);
} }
} }
} }
std::array<SLAPrintStep, slapsCount> printsteps = {
slapsRasterize, slapsValidate
};
for(size_t s = 0; s < print_program.size(); ++s) {
auto currentstep = printsteps[s];
throw_if_canceled();
if(m_stepmask[s]) {
set_status(PRINT_STEP_LEVELS[currentstep],
PRINT_STEP_LABELS[currentstep]);
set_started(currentstep);
print_program[s]();
set_done(currentstep);
}
}
// If everything vent well
set_status(100, L("Slicing done"));
} }
void SLAPrint::render_supports(SLASupportRenderer &renderer) void SLAPrint::render_supports(SLASupportRenderer &renderer)
@ -200,6 +229,11 @@ void SLAPrint::render_supports(SLASupportRenderer &renderer)
std::cout << "Would show the SLA supports" << std::endl; std::cout << "Would show the SLA supports" << std::endl;
} }
void SLAPrint::export_raster(const std::string &fname)
{
std::cout << "Would export the SLA raster" << std::endl;
}
SLAPrintObject::SLAPrintObject(SLAPrint *print, ModelObject *model_object): SLAPrintObject::SLAPrintObject(SLAPrint *print, ModelObject *model_object):
Inherited(print), Inherited(print),
m_model_object(model_object), m_model_object(model_object),

View File

@ -131,7 +131,7 @@ private: // Prevents erroneous use by other classes.
typedef PrintBaseWithState<SLAPrintStep, slapsCount> Inherited; typedef PrintBaseWithState<SLAPrintStep, slapsCount> Inherited;
public: public:
SLAPrint() {} SLAPrint(): m_stepmask(slapsCount, true) {}
virtual ~SLAPrint() { this->clear(); } virtual ~SLAPrint() { this->clear(); }
PrinterTechnology technology() const noexcept { return ptSLA; } PrinterTechnology technology() const noexcept { return ptSLA; }
@ -143,11 +143,14 @@ public:
void render_supports(SLASupportRenderer& renderer); void render_supports(SLASupportRenderer& renderer);
void export_raster(const std::string& fname);
private: private:
Model m_model; Model m_model;
SLAPrinterConfig m_printer_config; SLAPrinterConfig m_printer_config;
SLAMaterialConfig m_material_config; SLAMaterialConfig m_material_config;
PrintObjects m_objects; PrintObjects m_objects;
std::vector<bool> m_stepmask;
friend SLAPrintObject; friend SLAPrintObject;
}; };

View File

@ -75,6 +75,19 @@ void BackgroundSlicingProcess::process_fff()
} }
} }
void BackgroundSlicingProcess::process_sla() {
assert(m_print == m_sla_print);
m_print->process();
if(!m_print->canceled() && ! this->is_step_done(bspsGCodeFinalize)) {
this->set_step_started(bspsGCodeFinalize);
if (! m_export_path.empty()) {
m_sla_print->export_raster(m_export_path);
m_print->set_status(100, "Zip file exported to " + m_export_path);
}
this->set_step_done(bspsGCodeFinalize);
}
}
void BackgroundSlicingProcess::thread_proc() void BackgroundSlicingProcess::thread_proc()
{ {
assert(m_print != nullptr); assert(m_print != nullptr);
@ -100,6 +113,7 @@ void BackgroundSlicingProcess::thread_proc()
assert(m_print != nullptr); assert(m_print != nullptr);
switch(m_print->technology()) { switch(m_print->technology()) {
case ptFFF: this->process_fff(); break; case ptFFF: this->process_fff(); break;
case ptSLA: this->process_sla(); break;
default: m_print->process(); break; default: m_print->process(); break;
} }
} catch (CanceledException & /* ex */) { } catch (CanceledException & /* ex */) {

View File

@ -96,6 +96,9 @@ private:
// Helper to wrap the FFF slicing & G-code generation. // Helper to wrap the FFF slicing & G-code generation.
void process_fff(); void process_fff();
// Temporary: for mimicking the fff file export behavior with the raster output
void process_sla();
// Currently active print. It is one of m_fff_print and m_sla_print. // Currently active print. It is one of m_fff_print and m_sla_print.
PrintBase *m_print = nullptr; PrintBase *m_print = nullptr;
// Non-owned pointers to Print instances. // Non-owned pointers to Print instances.

View File

@ -1683,7 +1683,7 @@ void GLGizmoSlaSupports::clicked_on_object(const Vec2d& mouse_position)
m_model_object->sla_support_points.push_back(new_pos); m_model_object->sla_support_points.push_back(new_pos);
// This should trigger the support generation // This should trigger the support generation
wxGetApp().plater()->reslice(); // wxGetApp().plater()->reslice();
} }
catch (...) {} catch (...) {}
} }
@ -1695,7 +1695,7 @@ void GLGizmoSlaSupports::delete_current_grabber(bool delete_all)
m_model_object->sla_support_points.clear(); m_model_object->sla_support_points.clear();
// This should trigger the support generation // This should trigger the support generation
wxGetApp().plater()->reslice(); // wxGetApp().plater()->reslice();
} }
else else
if (m_hover_id != -1) { if (m_hover_id != -1) {
@ -1704,7 +1704,7 @@ void GLGizmoSlaSupports::delete_current_grabber(bool delete_all)
m_hover_id = -1; m_hover_id = -1;
// This should trigger the support generation // This should trigger the support generation
wxGetApp().plater()->reslice(); // wxGetApp().plater()->reslice();
} }
} }

View File

@ -991,12 +991,15 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame) :
// Default printer technology for default config. // Default printer technology for default config.
background_process.select_technology(q->printer_technology()); background_process.select_technology(q->printer_technology());
// Register progress callback from the Print class to the Platter. // Register progress callback from the Print class to the Platter.
print.set_status_callback([this](int percent, const std::string &message) {
auto statuscb = [this](int percent, const std::string &message) {
wxCommandEvent event(EVT_PROGRESS_BAR); wxCommandEvent event(EVT_PROGRESS_BAR);
event.SetInt(percent); event.SetInt(percent);
event.SetString(message); event.SetString(message);
wxQueueEvent(this->q, event.Clone()); wxQueueEvent(this->q, event.Clone());
}); };
print.set_status_callback(statuscb);
sla_print.set_status_callback(statuscb);
this->q->Bind(EVT_PROGRESS_BAR, &priv::on_progress_event, this); this->q->Bind(EVT_PROGRESS_BAR, &priv::on_progress_event, this);
_3DScene::add_canvas(canvas3D); _3DScene::add_canvas(canvas3D);
@ -2171,28 +2174,44 @@ void Plater::export_gcode(fs::path output_path)
return; return;
} }
// Copy the names of active presets into the placeholder parser. std::string final_path;
wxGetApp().preset_bundle->export_selections(p->print.placeholder_parser()); if(printer_technology() == ptFFF) { // TODO: custom button for SLA export
// select output file // Copy the names of active presets into the placeholder parser.
if (output_path.empty()) { wxGetApp().preset_bundle->export_selections(p->print.placeholder_parser());
// XXX: take output path from CLI opts? Ancient Slic3r versions used to do that...
// If possible, remove accents from accented latin characters. // select output file
// This function is useful for generating file names to be processed by legacy firmwares. if (output_path.empty()) {
auto default_output_file = fs::path(Slic3r::fold_utf8_to_ascii( // XXX: take output path from CLI opts? Ancient Slic3r versions used to do that...
p->print.output_filepath(output_path.string())
// FIXME: ^ errors to handle?
));
auto start_dir = wxGetApp().app_config->get_last_output_dir(default_output_file.parent_path().string());
auto fileType = printer_technology() == ptFFF ? FT_GCODE : FT_PNGZIP; // If possible, remove accents from accented latin characters.
std::string dtitle = printer_technology() == ptFFF ? L("Save G-code file as:") // This function is useful for generating file names to be processed by legacy firmwares.
: L("Save Zip file as:"); auto default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(
wxFileDialog dlg(this, _(dtitle), p->print.output_filepath(output_path.string())
start_dir, // FIXME: ^ errors to handle?
default_output_file.filename().string(), ));
GUI::file_wildcards[fileType], auto start_dir = wxGetApp().app_config->get_last_output_dir(default_output_file.parent_path().string());
wxFileDialog dlg(this, _(L("Save G-code file as:")),
start_dir,
default_output_file.filename().string(),
GUI::file_wildcards[FT_GCODE],
wxFD_SAVE | wxFD_OVERWRITE_PROMPT
);
if (dlg.ShowModal() == wxID_OK) {
fs::path path(dlg.GetPath());
wxGetApp().app_config->update_last_output_dir(path.parent_path().string());
output_path = path;
}
}
final_path = p->print.output_filepath(output_path.string());
} else {
wxFileDialog dlg(this, _(L("Save Zip file as:")),
wxGetApp().app_config->get_last_output_dir(""),
"out.zip",
GUI::file_wildcards[FT_PNGZIP],
wxFD_SAVE | wxFD_OVERWRITE_PROMPT wxFD_SAVE | wxFD_OVERWRITE_PROMPT
); );
@ -2201,10 +2220,12 @@ void Plater::export_gcode(fs::path output_path)
wxGetApp().app_config->update_last_output_dir(path.parent_path().string()); wxGetApp().app_config->update_last_output_dir(path.parent_path().string());
output_path = path; output_path = path;
} }
final_path = output_path.string();
} }
if (! output_path.empty()) { if (! output_path.empty()) {
this->p->background_process.schedule_export(p->print.output_filepath(output_path.string())); this->p->background_process.schedule_export(final_path);
this->p->background_process.start(); this->p->background_process.start();
} }
} }