diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp index 4401dcd7c9..86c27d88be 100644 --- a/src/slic3r/GUI/GCodeViewer.cpp +++ b/src/slic3r/GUI/GCodeViewer.cpp @@ -1605,7 +1605,7 @@ void GCodeViewer::render(int canvas_width, int canvas_height, int right_margin) float bed_x_min, bed_x_max, bed_y_min, bed_y_max; { PartPlate* curr_plate = wxGetApp().plater()->get_partplate_list().get_curr_plate(); - const Pointfs& plate_shape = curr_plate->get_shape(); + const Pointfs& plate_shape = curr_plate ? curr_plate->get_shape() : Pointfs{}; if (!plate_shape.empty()) { bed_x_min = (float)plate_shape[0].x(); bed_x_max = bed_x_min; diff --git a/src/slic3r/GUI/PartPlate.cpp b/src/slic3r/GUI/PartPlate.cpp index badc0a4c92..e44b177cd0 100644 --- a/src/slic3r/GUI/PartPlate.cpp +++ b/src/slic3r/GUI/PartPlate.cpp @@ -933,8 +933,8 @@ std::string PartPlate::build_imex_cache_key() const return active_mode + "|" + std::to_string(n_col_opt ? n_col_opt->value : 2) + "x" + std::to_string(n_row_opt ? n_row_opt->value : 1) - + "|cw" + std::to_string(cw_opt ? (int)cw_opt->value : 0) - + "|ch" + std::to_string(ch_opt ? (int)ch_opt->value : 0) + + "|cw" + std::to_string(cw_opt ? (int)(cw_opt->value * 10) : 0) + + "|ch" + std::to_string(ch_opt ? (int)(ch_opt->value * 10) : 0) + "|mg" + std::to_string(mgn_opt ? (int)(mgn_opt->value * 10) : 0); } diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 09ec8f8ef3..9cda807d8c 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -17984,20 +17984,24 @@ int Plater::select_plate_by_hover_id(int hover_id, bool right_click, bool isModi // Show a popup menu with all modes. wxMenu menu; std::string current = curr_plate->get_imex_mode(); + std::vector mode_ids; + mode_ids.reserve(modes.size()); for (size_t i = 0; i < modes.size(); ++i) { - wxMenuItem* item = menu.AppendRadioItem(wxID_HIGHEST + (int)i, from_u8(modes[i])); + int id = wxNewId(); + mode_ids.push_back(id); + wxMenuItem* item = menu.AppendRadioItem(id, from_u8(modes[i])); if (modes[i] == current) item->Check(true); } - menu.Bind(wxEVT_MENU, [this, curr_plate, &modes](wxCommandEvent& e) { - int idx = e.GetId() - wxID_HIGHEST; - if (idx >= 0 && idx < (int)modes.size()) { - take_snapshot("set imex mode"); - curr_plate->set_imex_mode(modes[idx]); - update_project_dirty_from_presets(); - set_plater_dirty(true); - update(); - } + menu.Bind(wxEVT_MENU, [this, curr_plate, modes, mode_ids](wxCommandEvent& e) { + auto it = std::find(mode_ids.begin(), mode_ids.end(), e.GetId()); + if (it == mode_ids.end()) return; + const size_t idx = std::distance(mode_ids.begin(), it); + take_snapshot("set imex mode"); + curr_plate->set_imex_mode(modes[idx]); + update_project_dirty_from_presets(); + set_plater_dirty(true); + update(); }); p->view3D->get_canvas3d()->get_wxglcanvas()->PopupMenu(&menu); ret = 1; // signal to caller: popup was shown, suppress plate context menu