FIX: fix serveral issues in multi-plate slicing

1. fix the thumbnail white issue in some random case
2. fix the thumbnail not update issue under preview panel
3. fix the previous panel's toolpath not clear issue while switch panel
   under preview
4. fix the toolpath not clear issue while switch from 3d to preview in
   some corner case

Change-Id: I158eba35e3b5d8a1e77f19ee9f86801e6a6dbd86
This commit is contained in:
lane.wei 2022-11-29 12:29:40 +08:00 committed by Lane.Wei
parent eb8c97f150
commit 45dd07cfe4
4 changed files with 89 additions and 29 deletions

View File

@ -12,6 +12,7 @@ void ThumbnailData::set(unsigned int w, unsigned int h)
width = w;
height = h;
// defaults to white texture
pixels.clear();
pixels = std::vector<unsigned char>(width * height * 4, 255);
}
}

View File

@ -4183,7 +4183,7 @@ void GLCanvas3D::on_set_focus(wxFocusEvent& evt)
m_tooltip_enabled = false;
if (m_canvas_type == ECanvasType::CanvasPreview) {
// update thumbnails and update plate toolbar
wxGetApp().plater()->update_platplate_thumbnails();
wxGetApp().plater()->update_all_plate_thumbnails();
_update_imgui_select_plate_toolbar();
}
_refresh_if_shown_on_screen();

View File

@ -1997,7 +1997,7 @@ struct Plater::priv
void init_notification_manager();
// Caching last value of show_action_buttons parameter for show_action_buttons(), so that a callback which does not know this state will not override it.
mutable bool ready_to_slice = { false };
//mutable bool ready_to_slice = { false };
// Flag indicating that the G-code export targets a removable device, therefore the show_action_buttons() needs to be called at any case when the background processing finishes.
ExportingStatus exporting_status { NOT_EXPORTING };
std::string last_output_path;
@ -2503,6 +2503,12 @@ void Plater::priv::update(unsigned int flags)
this->preview->reload_print();
//BBS assemble view
this->assemble_view->reload_scene(false, flags);
if (current_panel && q->is_preview_shown()) {
q->force_update_all_plate_thumbnails();
//update_fff_scene_only_shells(true);
}
if (force_background_processing_restart)
this->restart_background_process(update_status);
else
@ -4224,7 +4230,7 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool
PartPlate* cur_plate = background_process.get_current_plate();
if (background_process.finished() && cur_plate && cur_plate->is_slice_result_valid())
{
ready_to_slice = false;
//ready_to_slice = false;
this->main_frame->update_slice_print_status(MainFrame::eEventSliceUpdate, false);
}
else if (!background_process.empty() &&
@ -4233,8 +4239,16 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool
* when this function is called several times during calculations
* */
{
ready_to_slice = true;
this->main_frame->update_slice_print_status(MainFrame::eEventSliceUpdate, true);
if (cur_plate->can_slice()) {
//ready_to_slice = true;
this->main_frame->update_slice_print_status(MainFrame::eEventSliceUpdate, true);
process_completed_with_error = -1;
}
else {
//ready_to_slice = false;
this->main_frame->update_slice_print_status(MainFrame::eEventSliceUpdate, false);
process_completed_with_error = partplate_list.get_curr_plate_index();
}
}
#if 0
//sidebar->set_btn_label(ActionButtonType::abExport, _(label_btn_export));
@ -5055,7 +5069,10 @@ void Plater::priv::set_current_panel(wxPanel* panel, bool no_slice)
}
else {
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": single slice, reload print");
this->preview->reload_print(true);
if (model_fits)
this->preview->reload_print(true);
else
this->update_fff_scene_only_shells();
}
preview->set_as_dirty();
@ -5160,6 +5177,7 @@ void Plater::priv::set_current_panel(wxPanel* panel, bool no_slice)
notification_manager->set_in_preview(false);
}
else if (current_panel == preview) {
q->invalid_all_plate_thumbnails();
if (old_panel == view3D)
view3D->get_canvas3d()->unbind_event_handlers();
else if (old_panel == assemble_view)
@ -5880,7 +5898,7 @@ void Plater::priv::on_action_send_to_printer(bool isall)
else {
m_send_to_sdcard_dlg->prepare(partplate_list.get_curr_plate_index());
}
m_send_to_sdcard_dlg->ShowModal();
}
@ -6016,8 +6034,8 @@ void Plater::priv::on_repair_model(wxCommandEvent &event)
void Plater::priv::on_filament_color_changed(wxCommandEvent &event)
{
q->update_platplate_thumbnails(true);
q->get_preview_canvas3D()->update_plate_thumbnails();
//q->update_all_plate_thumbnails(true);
//q->get_preview_canvas3D()->update_plate_thumbnails();
}
void Plater::priv::install_network_plugin(wxCommandEvent &event)
@ -7742,17 +7760,33 @@ wxString Plater::get_project_name()
return p->get_project_name();
}
void Plater::update_platplate_thumbnails(bool force_update)
void Plater::update_all_plate_thumbnails(bool force_update)
{
for (int i = 0; i < get_partplate_list().get_plate_count(); i++) {
PartPlate* plate = get_partplate_list().get_plate(i);
ThumbnailsParams thumbnail_params = { {}, false, true, true, true, i};
if (force_update || !plate->is_valid_gcode_file()) {
if (force_update || !plate->thumbnail_data.is_valid()) {
get_view3D_canvas3D()->render_thumbnail(plate->thumbnail_data, plate->plate_thumbnail_width, plate->plate_thumbnail_height, thumbnail_params, Camera::EType::Ortho);
}
}
}
//invalid all plate's thumbnails
void Plater::invalid_all_plate_thumbnails()
{
for (int i = 0; i < get_partplate_list().get_plate_count(); i++) {
PartPlate* plate = get_partplate_list().get_plate(i);
plate->thumbnail_data.reset();
}
}
void Plater::force_update_all_plate_thumbnails()
{
invalid_all_plate_thumbnails();
update_all_plate_thumbnails(true);
get_preview_canvas3D()->update_plate_thumbnails();
}
// BBS: backup
std::vector<size_t> Plater::load_files(const std::vector<fs::path>& input_files, LoadStrategy strategy, bool ask_multi) { return p->load_files(input_files, strategy, ask_multi); }
@ -9388,13 +9422,13 @@ void Plater::reslice()
// BBS
if (p->background_process.running())
{
p->ready_to_slice = false;
//p->ready_to_slice = false;
p->main_frame->update_slice_print_status(MainFrame::eEventSliceUpdate, false);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": background process is running, m_is_slicing is true");
}
else if (!p->background_process.empty() && !p->background_process.idle()) {
//p->show_action_buttons(true);
p->ready_to_slice = true;
//p->ready_to_slice = true;
p->main_frame->update_slice_print_status(MainFrame::eEventSliceUpdate, true);
BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << boost::format(": background process changes to not_idle, set ready_to_slice back to true");
}
@ -10349,7 +10383,7 @@ void Plater::apply_background_progress()
if (invalidated & PrintBase::APPLY_STATUS_INVALIDATED)
{
part_plate->update_slice_result_valid_state(false);
p->ready_to_slice = true;
//p->ready_to_slice = true;
p->main_frame->update_slice_print_status(MainFrame::eEventPlateUpdate, true);
}
}
@ -10417,14 +10451,14 @@ int Plater::select_plate(int plate_index, bool need_slice)
part_plate->update_slice_result_valid_state(false);
// BBS
//p->show_action_buttons(true);
p->ready_to_slice = true;
//p->ready_to_slice = true;
p->main_frame->update_slice_print_status(MainFrame::eEventPlateUpdate, true);
}
else
{
// BBS
//p->show_action_buttons(false);
p->ready_to_slice = false;
//p->ready_to_slice = false;
p->main_frame->update_slice_print_status(MainFrame::eEventPlateUpdate, false);
refresh_print();
@ -10434,38 +10468,52 @@ int Plater::select_plate(int plate_index, bool need_slice)
else
{
//check inside status
bool model_fits = p->view3D->get_canvas3d()->check_volumes_outside_state() != ModelInstancePVS_Partly_Outside;
//model_fits = p->view3D->get_canvas3d()->check_volumes_outside_state() != ModelInstancePVS_Partly_Outside;
//bool validate_err = false;
validate_current_plate(model_fits, validate_err);
if (model_fits && !validate_err) {
p->process_completed_with_error = -1;
}
else {
p->process_completed_with_error = p->partplate_list.get_curr_plate_index();
}
if (is_preview_shown())
{
if (need_slice)
{
p->process_completed_with_error = -1;
//p->process_completed_with_error = -1;
p->m_slice_all = false;
reset_gcode_toolpaths();
if (model_fits)
if (model_fits && !validate_err)
reslice();
else {
p->ready_to_slice = false;
p->main_frame->update_slice_print_status(MainFrame::eEventPlateUpdate, false);
refresh_print();
//sometimes the previous print's sliced result is still valid, but the newly added object is laid over the boundary
//then the print toolpath will be shown, so we should not refresh print here, only onload shell
//refresh_print();
p->update_fff_scene_only_shells();
}
}
else {
//p->ready_to_slice = false;
p->main_frame->update_slice_print_status(MainFrame::eEventPlateUpdate, false);
refresh_print();
}
}
else
{
validate_current_plate(model_fits, validate_err);
//validate_current_plate(model_fits, validate_err);
//check inside status
if (model_fits && !validate_err){
/*if (model_fits && !validate_err){
p->process_completed_with_error = -1;
}
else {
p->process_completed_with_error = p->partplate_list.get_curr_plate_index();
}
}*/
// BBS: don't show action buttons
//p->show_action_buttons(true);
p->ready_to_slice = true;
//p->ready_to_slice = true;
if (model_fits && part_plate->has_printable_instances())
{
//p->view3D->get_canvas3d()->post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, true));
@ -10511,6 +10559,8 @@ void Plater::validate_current_plate(bool& model_fits, bool& validate_error)
model_fits = p->view3D->get_canvas3d()->check_volumes_outside_state() != ModelInstancePVS_Partly_Outside;
validate_error = false;
if (p->printer_technology == ptFFF) {
std::string plater_text = _u8L("An object is laid over the boundary of plate or exceeds the height limit.\n"
"Please solve the problem by moving it totally on or off the plate, and confirming that the height is within the build volume.");;
StringObjectException warning;
Polygons polygons;
std::vector<std::pair<Polygon, float>> height_polygons;
@ -10543,6 +10593,13 @@ void Plater::validate_current_plate(bool& model_fits, bool& validate_error)
p->view3D->get_canvas3d()->set_sequential_print_clearance_render_fill(true);
p->view3D->get_canvas3d()->set_sequential_print_clearance_polygons(polygons, height_polygons);
}
if (!model_fits) {
p->notification_manager->push_plater_error_notification(plater_text);
}
else {
p->notification_manager->close_plater_error_notification(plater_text);
}
}
PartPlate* part_plate = p->partplate_list.get_curr_plate();
@ -10596,7 +10653,7 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click)
// BBS
//p->show_action_buttons(true);
p->ready_to_slice = true;
//p->ready_to_slice = true;
p->main_frame->update_slice_print_status(MainFrame::eEventPlateUpdate, true);
}
else
@ -10604,7 +10661,7 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click)
// BBS
//p->show_action_buttons(false);
//validate_current_plate(model_fits, validate_err);
p->ready_to_slice = false;
//p->ready_to_slice = false;
p->main_frame->update_slice_print_status(MainFrame::eEventPlateUpdate, false);
refresh_print();
@ -10622,7 +10679,7 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click)
// BBS: don't show action buttons
//p->show_action_buttons(true);
p->ready_to_slice = true;
//p->ready_to_slice = true;
if (model_fits && part_plate->has_printable_instances())
{
//p->view3D->get_canvas3d()->post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, true));

View File

@ -233,7 +233,9 @@ public:
// BBS
wxString get_project_name();
void update_platplate_thumbnails(bool force_update = false);
void update_all_plate_thumbnails(bool force_update = false);
void invalid_all_plate_thumbnails();
void force_update_all_plate_thumbnails();
//BBS static functions that update extruder params and speed table
static void setPrintSpeedTable(Slic3r::GlobalSpeedMap& printSpeedMap);
static void setExtruderParams(std::map<size_t, Slic3r::ExtruderParams>& extParas);