OrcaSlicer latest
OrcaSlicer
Loading...
Searching...
No Matches
Slic3r::GUI::MenuFactory Class Reference

#include </home/runner/work/OrcaSlicer/OrcaSlicer/src/slic3r/GUI/GUI_Factories.hpp>

Collaboration diagram for Slic3r::GUI::MenuFactory:

Classes

struct  HandyModel

Public Member Functions

 MenuFactory ()
 ~MenuFactory ()=default
void init (wxWindow *parent)
void update ()
void update_object_menu ()
void update_default_menu ()
void msw_rescale ()
void sys_color_changed ()
wxMenu * default_menu ()
wxMenu * object_menu ()
wxMenu * sla_object_menu ()
wxMenu * part_menu ()
wxMenu * text_part_menu ()
wxMenu * svg_part_menu ()
wxMenu * instance_menu ()
wxMenu * layer_menu ()
wxMenu * multi_selection_menu ()
wxMenu * plate_menu ()
wxMenu * assemble_object_menu ()
wxMenu * assemble_part_menu ()
wxMenu * assemble_multi_selection_menu ()
wxMenu * filament_action_menu (int active_filament_menu_id)

Static Public Member Functions

static std::vector< wxBitmap > get_volume_bitmaps ()
static std::vector< wxBitmap > get_text_volume_bitmaps ()
static std::vector< wxBitmap > get_svg_volume_bitmaps ()
static const std::vector< HandyModel > & handy_models ()
static void load_handy_model (std::size_t index)
static void add_text_volume (ModelVolumeType type)
static void add_svg_volume (ModelVolumeType type)
static void sys_color_changed (wxMenuBar *menu_bar)

Private Types

enum  MenuType { mtObjectFFF = 0 , mtObjectSLA , mtCount }

Private Member Functions

size_t FindPositionById (wxMenu *menu, int id)
void create_default_menu ()
void create_common_object_menu (wxMenu *menu)
void create_object_menu ()
void create_sla_object_menu ()
void create_text_part_menu ()
void create_svg_part_menu ()
void create_plate_menu ()
void create_extra_object_menu ()
void create_bbl_part_menu ()
void create_bbl_assemble_object_menu ()
void create_bbl_assemble_part_menu ()
void create_filament_action_menu (bool init, int active_filament_menu_id)
wxMenu * append_submenu_add_generic (wxMenu *menu, ModelVolumeType type)
wxMenu * append_submenu_add_handy_model (wxMenu *menu, ModelVolumeType type)
void append_menu_item_add_text (wxMenu *menu, ModelVolumeType type, bool is_submenu_item=true)
void append_menu_item_add_svg (wxMenu *menu, ModelVolumeType type, bool is_submenu_item=true)
void append_menu_items_add_volume (wxMenu *menu)
wxMenuItem * append_menu_item_layers_editing (wxMenu *menu)
wxMenuItem * append_menu_item_settings (wxMenu *menu)
wxMenuItem * append_menu_item_change_type (wxMenu *menu)
wxMenuItem * append_menu_item_instance_to_object (wxMenu *menu)
wxMenuItem * append_menu_item_printable (wxMenu *menu)
wxMenuItem * append_menu_item_auto_drop (wxMenu *menu)
void append_menu_item_rename (wxMenu *menu)
wxMenuItem * append_menu_item_fix_through_cgal (wxMenu *menu)
void append_menu_item_export_stl (wxMenu *menu, bool is_mulity_menu=false)
void append_menu_item_export_drc (wxMenu *menu, bool is_mulity_menu=false)
void append_menu_item_reload_from_disk (wxMenu *menu)
void append_menu_item_replace_with_stl (wxMenu *menu)
void append_menu_item_replace_all_with_stl (wxMenu *menu)
void append_menu_item_change_extruder (wxMenu *menu)
void append_menu_item_set_visible (wxMenu *menu)
void append_menu_item_delete (wxMenu *menu)
void append_menu_item_scale_selection_to_fit_print_volume (wxMenu *menu)
void append_menu_items_convert_unit (wxMenu *menu)
void append_menu_items_flush_options (wxMenu *menu, size_t pos=-1)
void append_menu_item_merge_to_multipart_object (wxMenu *menu)
void append_menu_item_merge_to_single_object (wxMenu *menu)
void append_menu_item_align_distribute (wxMenu *menu)
void append_menu_item_precise_seam_submenu (wxMenu *menu)
void append_menu_item_invalidate_cut_info (wxMenu *menu, size_t pos=-1)
void append_menu_item_edit_text (wxMenu *menu, size_t pos=-1)
void append_menu_item_edit_svg (wxMenu *menu, size_t pos=-1)
void append_menu_items_instance_manipulation (wxMenu *menu)
void append_menu_item_clone (wxMenu *menu)
void append_menu_item_simplify (wxMenu *menu)
void append_menu_item_smooth_mesh (wxMenu *menu)
void append_menu_item_center (wxMenu *menu)
void append_menu_item_drop (wxMenu *menu)
void append_menu_item_per_object_process (wxMenu *menu)
void append_menu_item_per_object_settings (wxMenu *menu, size_t pos=-1)
void append_menu_item_change_filament (wxMenu *menu, size_t pos=-1)
void append_menu_item_set_printable (wxMenu *menu)
void append_menu_item_set_auto_drop (wxMenu *menu)
void append_menu_item_locked (wxMenu *menu, size_t pos=-1)
void append_menu_item_fill_bed (wxMenu *menu)
void append_menu_item_plate_name (wxMenu *menu, size_t pos=-1)
void append_menu_item_plate_delete (wxMenu *menu, size_t pos=-1)
wxMenu * append_menu_item_transform (wxMenu *menu, bool multi_selection, bool show_mirror, bool is_scalable)
wxMenu * append_menu_item_modify (wxMenu *menu, bool multi_selection, bool splittable, bool is_mesh, bool mesh_boolean)
wxMenu * append_menu_item_more (wxMenu *menu, bool multi_selection, bool disk_op, bool export_op)

Private Attributes

wxWindow * m_parent {nullptr}
MenuWithSeparators m_object_menu
wxMenu * m_object_transform_menu
size_t m_object_geometry_pos
int m_object_props_marker
MenuWithSeparators m_part_menu
wxMenu * m_part_transform_menu
int m_part_props_marker
int m_part_project_marker
MenuWithSeparators m_text_part_menu
int m_text_props_marker
int m_text_project_marker
MenuWithSeparators m_svg_part_menu
int m_svg_props_marker
int m_svg_project_marker
MenuWithSeparators m_sla_object_menu
MenuWithSeparators m_default_menu
MenuWithSeparators m_instance_menu
MenuWithSeparators m_plate_menu
size_t m_plate_mods_pos
MenuWithSeparators m_assemble_object_menu
MenuWithSeparators m_assemble_part_menu
wxMenu m_filament_action_menu
std::array< wxMenuItem *, mtCount > items_increase
std::array< wxMenuItem *, mtCount > items_decrease
std::array< wxMenuItem *, mtCount > items_set_number_of_copies

Detailed Description


Class Documentation

◆ Slic3r::GUI::MenuFactory::HandyModel

struct Slic3r::GUI::MenuFactory::HandyModel
Collaboration diagram for Slic3r::GUI::MenuFactory::HandyModel:
Class Members
bool arrange_after_import = false
vector< string > file_names
bool is_stringhell = false
const char * key
const char * label

Member Enumeration Documentation

◆ MenuType

Enumerator
mtObjectFFF 
mtObjectSLA 
mtCount 
103 {
104 mtObjectFFF = 0,
106 mtCount
107 };
@ mtCount
Definition GUI_Factories.hpp:106
@ mtObjectSLA
Definition GUI_Factories.hpp:105
@ mtObjectFFF
Definition GUI_Factories.hpp:104

Constructor & Destructor Documentation

◆ MenuFactory()

Slic3r::GUI::MenuFactory::MenuFactory ( )
1684{
1685 for (int i = 0; i < mtCount; i++) {
1686 items_increase[i] = nullptr;
1687 items_decrease[i] = nullptr;
1688 items_set_number_of_copies[i] = nullptr;
1689 }
1690}
std::array< wxMenuItem *, mtCount > items_decrease
Definition GUI_Factories.hpp:139
std::array< wxMenuItem *, mtCount > items_increase
Definition GUI_Factories.hpp:138
std::array< wxMenuItem *, mtCount > items_set_number_of_copies
Definition GUI_Factories.hpp:140

References MenuFactory(), items_decrease, items_increase, items_set_number_of_copies, and mtCount.

Referenced by MenuFactory().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ ~MenuFactory()

Slic3r::GUI::MenuFactory::~MenuFactory ( )
default

Member Function Documentation

◆ add_svg_volume()

void Slic3r::GUI::MenuFactory::add_svg_volume ( ModelVolumeType type)
static
@ Svg
Definition GLGizmosManager.hpp:100
static void add_volume_with_gizmo(GLGizmosManager::EType gizmo_type, ModelVolumeType type)
Definition GUI_Factories.cpp:714

References add_svg_volume(), Slic3r::GUI::add_volume_with_gizmo(), and Slic3r::GUI::GLGizmosManager::Svg.

Referenced by add_svg_volume(), and Slic3r::GUI::anonymous_namespace{NativeCommands.cpp}::build_command_catalog().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ add_text_volume()

void Slic3r::GUI::MenuFactory::add_text_volume ( ModelVolumeType type)
static
@ Emboss
Definition GLGizmosManager.hpp:99

References add_text_volume(), Slic3r::GUI::add_volume_with_gizmo(), and Slic3r::GUI::GLGizmosManager::Emboss.

Referenced by add_text_volume(), and Slic3r::GUI::anonymous_namespace{NativeCommands.cpp}::build_command_catalog().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_add_svg()

void Slic3r::GUI::MenuFactory::append_menu_item_add_svg ( wxMenu * menu,
ModelVolumeType type,
bool is_submenu_item = true )
private
772 {
773 append_menu_itemm_add_(_L("SVG"), GLGizmosManager::Svg, menu, type, is_submenu_item);
774}
#define _L(s)
Definition OBJ.cpp:34
static void append_menu_itemm_add_(const wxString &name, GLGizmosManager::EType gizmo_type, wxMenu *menu, ModelVolumeType type, bool is_submenu_item)
Definition GUI_Factories.cpp:754

References _L, append_menu_item_add_svg(), Slic3r::GUI::append_menu_itemm_add_(), and Slic3r::GUI::GLGizmosManager::Svg.

Referenced by append_menu_item_add_svg(), and append_submenu_add_generic().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_add_text()

void Slic3r::GUI::MenuFactory::append_menu_item_add_text ( wxMenu * menu,
ModelVolumeType type,
bool is_submenu_item = true )
private
768 {
769 append_menu_itemm_add_(_L("Text"), GLGizmosManager::Emboss, menu, type, is_submenu_item);
770}

References _L, append_menu_item_add_text(), Slic3r::GUI::append_menu_itemm_add_(), and Slic3r::GUI::GLGizmosManager::Emboss.

Referenced by append_menu_item_add_text(), and append_submenu_add_generic().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_align_distribute()

void Slic3r::GUI::MenuFactory::append_menu_item_align_distribute ( wxMenu * menu)
private
2400{
2401 using AlignType = GLGizmoAlignment::AlignType;
2402 auto can = [](AlignType type) {
2403 if (plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasView3D)
2404 return false;
2405 GLGizmoAlignment alignment_helper(*plater()->get_view3D_canvas3D());
2406 return type >= AlignType::DISTRIBUTE_X ? alignment_helper.can_distribute(type) : alignment_helper.can_align(type);
2407 };
2408 auto run = [](AlignType type) {
2409 GLGizmoAlignment alignment_helper(*plater()->get_view3D_canvas3D());
2410 if (type >= AlignType::DISTRIBUTE_X)
2411 alignment_helper.distribute_objects(type);
2412 else
2413 alignment_helper.align_objects(type);
2414 };
2415
2416 struct AlignMenuItem
2417 {
2418 wxString label;
2419 AlignType type;
2420 std::string icon;
2421 };
2422 const AlignMenuItem items[] = {
2423 // icons shared with caanvas. BitmapCache converts colors dark to light. so dark variations used for proper colors
2424 {_L("Distribute left-right") + " (X)" , AlignType::DISTRIBUTE_X, "distribute_x_dark"},
2425 {_L("Distribute front-back") + " (Y)" , AlignType::DISTRIBUTE_Y, "distribute_y_dark"},
2426 {_L("Distribute top-bottom") + " (Z)" , AlignType::DISTRIBUTE_Z, "distribute_z_dark"},
2427 {wxString(), AlignType::NONE, ""},
2428 {_L("Align left") + " (-X)", AlignType::X_MIN, "align_x_min_dark"},
2429 {_L("Align left-right center") + " (X)" , AlignType::CENTER_X, "align_x_center_dark"},
2430 {_L("Align right") + " (+X)", AlignType::X_MAX, "align_x_max_dark"},
2431 {wxString(), AlignType::NONE, ""},
2432 {_L("Align front") + " (-Y)", AlignType::Y_MIN, "align_y_min_dark"},
2433 {_L("Align front-back center") + " (Y)" , AlignType::CENTER_Y, "align_y_center_dark"},
2434 {_L("Align back") + " (+Y)", AlignType::Y_MAX, "align_y_max_dark"},
2435 {wxString(), AlignType::NONE, ""},
2436 {_L("Align bottom") + " (-Z)", AlignType::Z_MIN, "align_z_min_dark"},
2437 {_L("Align top-bottom center") + " (Z)" , AlignType::CENTER_Z, "align_z_center_dark"},
2438 {_L("Align top") + " (+Z)", AlignType::Z_MAX, "align_z_max_dark"},
2439 };
2440
2441 wxMenu* align_distribute_menu = new wxMenu();
2442 for (const AlignMenuItem &item : items) {
2443 const AlignType type = item.type;
2444 if (type == AlignType::NONE)
2445 align_distribute_menu->AppendSeparator();
2446 else
2448 align_distribute_menu, wxID_ANY, item.label, "", [run, type](wxCommandEvent &) { run(type); }, item.icon, nullptr,
2449 [can, type]() { return can(type); }, m_parent);
2450 }
2451
2452 // Anything that can be distributed can also be aligned, and aligning in X has no extra condition.
2453 append_submenu(menu, align_distribute_menu, wxID_ANY, _L("Align/Distribute"), _L("Align and distribute objects"), "",
2454 [can]() { return can(AlignType::X_MIN); }, m_parent);
2455}
@ CanvasView3D
Definition GLCanvas3D.hpp:626
AlignType
Definition GLGizmoAlignment.hpp:19
wxWindow * m_parent
Definition GUI_Factories.hpp:109
AppActionRunResult run(const std::string &key, const std::string &param={})
Definition NativeCommands.cpp:668
static Plater * plater()
Definition GUI_Factories.cpp:400
wxMenuItem * append_menu_item(wxMenu *menu, int id, const wxString &string, const wxString &description, std::function< void(wxCommandEvent &event)> cb, const wxBitmap &icon, wxEvtHandler *event_handler, std::function< bool()> const cb_condition, wxWindow *parent, int insert_pos)
Definition wxExtensions.cpp:89
wxMenuItem * append_submenu(wxMenu *menu, wxMenu *sub_menu, int id, const wxString &string, const wxString &description, const std::string &icon, std::function< bool()> const cb_condition, wxWindow *parent, int insert_pos)
Definition wxExtensions.cpp:137

References _L, Slic3r::GUI::GLGizmoAlignment::align_objects(), append_menu_item(), append_menu_item_align_distribute(), append_submenu(), Slic3r::GUI::GLGizmoAlignment::can_align(), Slic3r::GUI::GLGizmoAlignment::can_distribute(), Slic3r::GUI::GLCanvas3D::CanvasView3D, Slic3r::GUI::GLGizmoAlignment::distribute_objects(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_align_distribute(), create_bbl_part_menu(), create_extra_object_menu(), create_svg_part_menu(), create_text_part_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_auto_drop()

wxMenuItem * Slic3r::GUI::MenuFactory::append_menu_item_auto_drop ( wxMenu * menu)
private
1028{
1029 wxString menu_text = _L("Auto Drop");
1030 wxString menu_tooltip = _L("Automatically drops the selected object to the build plate.");
1031 wxMenuItem* menu_item_auto_drop = append_menu_check_item(
1032 menu, wxID_ANY, menu_text, menu_tooltip,
1033 [](wxCommandEvent&) { obj_list()->toggle_auto_drop(); }, menu);
1034
1035 m_parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) {
1036 bool check = wxGetApp().plater()->get_selection().get_auto_drop();
1037 evt.Check(check);
1038 },
1039 menu_item_auto_drop->GetId());
1040
1041 return menu_item_auto_drop;
1042}
void toggle_auto_drop()
Definition GUI_ObjectList.cpp:7081
static ObjectList * obj_list()
Definition GUI_Factories.cpp:405
bool check(ModelVolumeType volume_type)
Definition GLGizmoEmboss.cpp:515
wxMenuItem * append_menu_check_item(wxMenu *menu, int id, const wxString &string, const wxString &description, std::function< void(wxCommandEvent &event)> cb, wxEvtHandler *event_handler, std::function< bool()> const enable_condition, std::function< bool()> const check_condition, wxWindow *parent)
Definition wxExtensions.cpp:183

References _L, append_menu_check_item(), append_menu_item_auto_drop(), m_parent, and Slic3r::GUI::obj_list().

Referenced by append_menu_item_auto_drop(), and create_extra_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_center()

void Slic3r::GUI::MenuFactory::append_menu_item_center ( wxMenu * menu)
private
2381{
2382 append_menu_item(menu, wxID_ANY, _L("Center") , "",
2383 [](wxCommandEvent&) {
2385 }, "", nullptr,
2386 []() {
2387 if (plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasView3D)
2388 return false;
2389 else {
2391 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
2392 Vec3d model_pos = selection.get_bounding_box().center();
2393 Vec3d center_pos = plate->get_center_origin();
2394 return !( (model_pos.x() == center_pos.x()) && (model_pos.y() == center_pos.y()) );
2395 } //disable if model is at center / not in View3D
2396 }, m_parent);
2397}
PointType center() const
Definition BoundingBox.cpp:237
const Selection & get_selection() const
Definition GLCanvas3D.hpp:1028
PartPlate * get_selected_plate()
Definition PartPlate.cpp:6890
const BoundingBoxf3 & get_bounding_box(bool extended=false)
Definition PartPlate.hpp:595
PartPlateList & get_partplate_list()
Definition Plater.cpp:22578
void center_selection()
Definition Plater.cpp:22333
GLCanvas3D * get_view3D_canvas3D()
Definition Plater.cpp:22082
@ Selection
Definition Shortcuts.hpp:72
Eigen::Matrix< double, 3, 1, Eigen::DontAlign > Vec3d
Definition Point.hpp:68

References _L, append_menu_item(), append_menu_item_center(), Slic3r::GUI::GLCanvas3D::CanvasView3D, Slic3r::BoundingBox3Base< PointType >::center(), Slic3r::GUI::Selection::get_bounding_box(), Slic3r::GUI::PartPlate::get_center_origin(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_center(), create_bbl_part_menu(), create_extra_object_menu(), create_svg_part_menu(), create_text_part_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_change_extruder()

void Slic3r::GUI::MenuFactory::append_menu_item_change_extruder ( wxMenu * menu)
private
1125{
1126 // BBS
1127 const std::vector<wxString> names = { _L("Change filament"), _L("Set filament for selected items") };
1128 // Delete old menu item
1129 for (const wxString& name : names) {
1130 const int item_id = menu->FindItem(name);
1131 if (item_id != wxNOT_FOUND)
1132 menu->Destroy(item_id);
1133 }
1134
1135 const int filaments_cnt = filaments_count();
1136 if (filaments_cnt <= 1)
1137 return;
1138
1139 wxDataViewItemArray sels;
1140 obj_list()->GetSelections(sels);
1141 if (sels.IsEmpty())
1142 return;
1143
1144 std::vector<wxBitmap*> icons = get_extruder_color_icons(true);
1145 wxMenu* extruder_selection_menu = new wxMenu();
1146 const wxString& name = sels.Count() == 1 ? names[0] : names[1];
1147
1148 int initial_extruder = -1; // negative value for multiple object/part selection
1149 if (sels.Count() == 1) {
1150 const ModelConfig& config = obj_list()->get_item_config(sels[0]);
1151 // BBS: set default extruder to 1
1152 initial_extruder = config.has("extruder") ? config.extruder() : 1;
1153 }
1154
1155 for (int i = 0; i <= filaments_cnt; i++)
1156 {
1157 bool is_active_extruder = i == initial_extruder;
1158 int icon_idx = i == 0 ? 0 : i - 1;
1159
1160 wxString item_name = _L("Default");
1161
1162 if (i > 0) {
1163 auto preset = wxGetApp().preset_bundle->filaments.find_preset(wxGetApp().preset_bundle->filament_presets[i - 1]);
1164 if (preset == nullptr) {
1165 item_name = wxString::Format(_L("Filament %d"), i);
1166 } else {
1167 item_name = from_u8(preset->label(false));
1168 }
1169 }
1170
1171 if (is_active_extruder) {
1172 item_name << " (" + _L("current") + ")";
1173 }
1174
1175 if (icon_idx >= 0 && icon_idx < icons.size()) {
1177 extruder_selection_menu, wxID_ANY, item_name, "", [i](wxCommandEvent &) { obj_list()->set_extruder_for_selected_items(i); }, *icons[icon_idx], menu,
1178 [is_active_extruder]() { return !is_active_extruder; }, m_parent);
1179 } else {
1181 extruder_selection_menu, wxID_ANY, item_name, "", [i](wxCommandEvent &) { obj_list()->set_extruder_for_selected_items(i); }, "", menu,
1182 [is_active_extruder]() { return !is_active_extruder; }, m_parent);
1183 }
1184 }
1185
1186 menu->AppendSubMenu(extruder_selection_menu, name);
1187}
void set_extruder_for_selected_items(const int extruder)
Definition GUI_ObjectList.cpp:6812
ModelConfig & get_item_config(const wxDataViewItem &item) const
Definition GUI_ObjectList.cpp:735
bool has(const t_config_option_key &opt_key) const
Definition PrintConfig.hpp:2651
static int filaments_count()
Definition GUI_Factories.cpp:65
wxString from_u8(const std::string &str)
Definition GUI.cpp:544
std::vector< wxBitmap * > get_extruder_color_icons(bool thin_icon)
Definition wxExtensions.cpp:572

References _L, append_menu_item(), append_menu_item_change_extruder(), Slic3r::ModelConfig::extruder(), Slic3r::GUI::filaments_count(), Slic3r::GUI::from_u8(), get_extruder_color_icons(), Slic3r::ModelConfig::has(), m_parent, and Slic3r::GUI::obj_list().

Referenced by append_menu_item_change_extruder(), assemble_multi_selection_menu(), assemble_object_menu(), and assemble_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_change_filament()

void Slic3r::GUI::MenuFactory::append_menu_item_change_filament ( wxMenu * menu,
size_t pos = -1 )
private
2533{
2534 const std::vector<wxString> names = { _L("Change Filament"), _L("Set Filament for selected items") };
2535 // Delete old menu item
2536 for (const wxString& name : names) {
2537 const int item_id = menu->FindItem(name);
2538 if (item_id != wxNOT_FOUND)
2539 menu->Destroy(item_id);
2540 }
2541
2542 int filaments_cnt = filaments_count();
2543 if (filaments_cnt <= 1)
2544 return;
2545
2546 wxDataViewItemArray sels;
2547 obj_list()->GetSelections(sels);
2548 if (sels.IsEmpty())
2549 return;
2550
2551 if (sels.Count() == 1) {
2552 const auto sel_vol = obj_list()->get_selected_model_volume();
2553 if (sel_vol && sel_vol->type() != ModelVolumeType::MODEL_PART && sel_vol->type() != ModelVolumeType::PARAMETER_MODIFIER)
2554 return;
2555 }
2556
2557 std::vector<wxBitmap*> icons = get_extruder_color_icons(true);
2558 if (icons.size() < filaments_cnt) {
2559 BOOST_LOG_TRIVIAL(warning) << boost::format("Warning: icons size %1%, filaments_cnt=%2%")%icons.size()%filaments_cnt;
2560 if (icons.size() <= 1)
2561 return;
2562 else
2563 filaments_cnt = icons.size();
2564 }
2565 wxMenu* extruder_selection_menu = new wxMenu();
2566 const wxString& name = sels.Count() == 1 ? names[0] : names[1];
2567
2568 int initial_extruder = -1; // negative value for multiple object/part selection
2569 if (sels.Count() == 1) {
2570 const ModelConfig& config = obj_list()->get_item_config(sels[0]);
2571 // BBS
2572 const auto sel_vol = obj_list()->get_selected_model_volume();
2573 if (sel_vol && sel_vol->type() == ModelVolumeType::PARAMETER_MODIFIER)
2574 initial_extruder = config.has("extruder") ? config.extruder() : 0;
2575 else
2576 initial_extruder = config.has("extruder") ? config.extruder() : 1;
2577 }
2578
2579 // BBS
2580 bool has_modifier = false;
2581 for (auto sel : sels) {
2582 if (obj_list()->GetModel()->GetVolumeType(sel) == ModelVolumeType::PARAMETER_MODIFIER) {
2583 has_modifier = true;
2584 break;
2585 }
2586 }
2587
2588 for (int i = has_modifier ? 0 : 1; i <= filaments_cnt; i++)
2589 {
2590 // BBS
2591 //bool is_active_extruder = i == initial_extruder;
2592 bool is_active_extruder = false;
2593
2594 wxString item_name = _L("Default");
2595
2596 if (i > 0) {
2597 auto preset = wxGetApp().preset_bundle->filaments.find_preset(wxGetApp().preset_bundle->filament_presets[i - 1]);
2598 if (preset == nullptr) {
2599 item_name = wxString::Format(_L("Filament %d"), i);
2600 } else {
2601 item_name = from_u8(preset->label(false));
2602 }
2603 }
2604
2605 if (is_active_extruder) {
2606 item_name << " (" + _L("current") + ")";
2607 }
2608
2609 append_menu_item(extruder_selection_menu, wxID_ANY, item_name, "",
2610 [i](wxCommandEvent&) { obj_list()->set_extruder_for_selected_items(i); }, i == 0 ? wxNullBitmap : *icons[i - 1], menu,
2611 [is_active_extruder]() { return !is_active_extruder; }, m_parent);
2612 }
2613 if (pos == wxNOT_FOUND)
2614 menu->Append(wxID_ANY, name, extruder_selection_menu);
2615 else
2616 menu->Insert(pos, wxID_ANY, name, extruder_selection_menu, _L("Change Filament"));
2617}
ModelVolume * get_selected_model_volume()
Definition GUI_ObjectList.cpp:5602
@ PARAMETER_MODIFIER
Definition Model.hpp:359
@ MODEL_PART
Definition Model.hpp:357

References _L, append_menu_item(), append_menu_item_change_filament(), Slic3r::ModelConfig::extruder(), Slic3r::GUI::filaments_count(), Slic3r::GUI::from_u8(), get_extruder_color_icons(), Slic3r::ModelConfig::has(), m_parent, Slic3r::MODEL_PART, Slic3r::GUI::obj_list(), and Slic3r::PARAMETER_MODIFIER.

Referenced by append_menu_item_change_filament(), multi_selection_menu(), object_menu(), part_menu(), svg_part_menu(), and text_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_change_type()

wxMenuItem * Slic3r::GUI::MenuFactory::append_menu_item_change_type ( wxMenu * menu)
private
888{
889 const wxString menu_name = _L("Change Type");
890
891 // Delete old menu item if exists
892 const int item_id = menu->FindItem(menu_name);
893 if (item_id != wxNOT_FOUND)
894 menu->Destroy(item_id);
895
896 // Create submenu
897 wxMenu* type_menu = new wxMenu();
898
899 struct TypeInfo {
900 ModelVolumeType type;
901 wxString label;
902 };
903
904 std::vector<TypeInfo> types = {
905 { ModelVolumeType::MODEL_PART, _L("Part") },
906 { ModelVolumeType::NEGATIVE_VOLUME, _L("Negative Part") },
908 { ModelVolumeType::SUPPORT_BLOCKER, _L("Support Blocker") },
909 { ModelVolumeType::SUPPORT_ENFORCER, _L("Support Enforcer") },
910 // Single "Precise Seam" entry that maps to PRECISE_SEAM_CENTER as the default subtype.
911 // set_volume_type() preserves the existing subtype (LEFT/RIGHT/etc.) for volumes that
912 // are already Precise Seam; subtype picking is done via the separate
913 // "Precise Seam Type" submenu (see append_menu_item_precise_seam_submenu).
914 { ModelVolumeType::PRECISE_SEAM_CENTER, _L("Precise Seam") }
915 };
916
917 for (const auto& info : types) {
918 wxMenuItem* item = append_menu_check_item(type_menu, wxID_ANY, info.label, "",
919 [type = info.type](wxCommandEvent&) { obj_list()->set_volume_type(type); }, type_menu);
920
921 // Update checkmark dynamically when menu is shown - check all selected volumes
922 m_parent->Bind(wxEVT_UPDATE_UI, [type = info.type](wxUpdateUIEvent& evt) {
923 auto model = obj_list()->GetModel();
924 auto objs = obj_list()->objects();
925 bool has_type = false;
926 wxDataViewItemArray sels;
927 obj_list()->GetSelections(sels);
928 for (auto item : sels) {
929 ModelVolumeType vol_type = model->GetVolumeType(item);
930 // The "Precise Seam" entry represents all six PS subtypes, so any subtype
931 // among selected volumes counts as a match (keeps the checkbox ticked when
932 // user has PS_LEFT/RIGHT/etc. selected, not only plain CENTER).
933 const bool match = (type == ModelVolumeType::PRECISE_SEAM_CENTER)
934 ? is_precise_seam(vol_type)
935 : (vol_type == type);
936 if (match) {
937 has_type = true;
938 break;
939 }
940 }
941 evt.Check(has_type);
942
943 // ORCA Fix crash caused by SVG/TEXT volumes cant be Support Enforcer/Blocker type
944 // The same applies to Precise Seam subtypes.
945 for (auto item : sels) {
946 if (model->GetItemType(item) == itVolume){
947 auto vol_idx = model->GetVolumeIdByItem(item);
948 auto obj_idx = model->GetObjectIdByItem(item);
949 if (vol_idx < 0 || obj_idx < 0)
950 continue;
951
952 auto vol = (*objs)[obj_idx]->volumes[vol_idx];
953
954 // disable Support Enforcer/Blocker if selection contains svg or text
955 // (same applies to Precise Seam)
956 if (vol != nullptr && (vol->is_svg() || vol->is_text()) && (type == ModelVolumeType::SUPPORT_BLOCKER || type == ModelVolumeType::SUPPORT_ENFORCER || is_precise_seam(type))){
957 evt.Enable(false);
958 break;
959 }
960 }
961 }
962 }, item->GetId());
963 }
964
965 menu->Append(wxID_ANY, menu_name, type_menu, _L("Change part type"));
966 return nullptr;
967}
@ itVolume
Definition ObjectDataViewModel.hpp:38
ModelVolumeType
Definition Model.hpp:355
@ SUPPORT_BLOCKER
Definition Model.hpp:360
@ PRECISE_SEAM_CENTER
Definition Model.hpp:364
@ NEGATIVE_VOLUME
Definition Model.hpp:358
@ SUPPORT_ENFORCER
Definition Model.hpp:361
bool is_precise_seam(ModelVolumeType t)
Definition Model.hpp:373

References _L, append_menu_check_item(), append_menu_item_change_type(), Slic3r::is_precise_seam(), Slic3r::GUI::itVolume, m_parent, Slic3r::MODEL_PART, Slic3r::NEGATIVE_VOLUME, Slic3r::PARAMETER_MODIFIER, Slic3r::PRECISE_SEAM_CENTER, Slic3r::SUPPORT_BLOCKER, and Slic3r::SUPPORT_ENFORCER.

Referenced by append_menu_item_change_type(), create_bbl_part_menu(), create_svg_part_menu(), create_text_part_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_clone()

void Slic3r::GUI::MenuFactory::append_menu_item_clone ( wxMenu * menu)
private
2355{
2356 const std::string accel = wxGetApp().shortcuts().accelerator(Shortcut::CloneSelected);
2357 append_menu_item(menu, wxID_ANY, _L("Clone") + (accel.empty() ? wxString() : "\t" + from_u8(accel)), "",
2358 [](wxCommandEvent&) {
2360 }, "", nullptr,
2361 []() {
2362 return true;
2363 }, m_parent);
2364}
void clone_selection()
Definition Plater.cpp:22454
@ CloneSelected
Definition Shortcuts.hpp:33

References _L, append_menu_item(), append_menu_item_clone(), Slic3r::GUI::CloneSelected, Slic3r::GUI::from_u8(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_clone(), and create_extra_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_delete()

void Slic3r::GUI::MenuFactory::append_menu_item_delete ( wxMenu * menu)
private
585{
586#ifdef __WINDOWS__
587 append_menu_item(menu, wxID_ANY, _L("Delete") + "\t" + _L_CONTEXT("Del", "Keyboard Shortcut"), _L("Delete the selected object"),
588 [](wxCommandEvent&) { plater()->remove_selected(); }, "menu_delete", nullptr,
589 []() { return plater()->can_delete(); }, m_parent);
590#else
591 append_menu_item(menu, wxID_ANY, _L("Delete") + "\t" + _L_CONTEXT("Backspace", "Keyboard Shortcut"), _L("Delete the selected object"),
592 [](wxCommandEvent&) { plater()->remove_selected(); }, "", nullptr,
593 []() { return plater()->can_delete(); }, m_parent);
594#endif
595}
bool can_delete() const
Definition Plater.cpp:23879
void remove_selected()
Definition Plater.cpp:19267
#define _L_CONTEXT(s, ctx)
Definition I18N.hpp:15

References _L, _L_CONTEXT, append_menu_item(), append_menu_item_delete(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_delete(), assemble_multi_selection_menu(), assemble_object_menu(), assemble_part_menu(), create_bbl_assemble_object_menu(), create_bbl_assemble_part_menu(), create_bbl_part_menu(), create_common_object_menu(), create_extra_object_menu(), create_svg_part_menu(), create_text_part_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_drop()

void Slic3r::GUI::MenuFactory::append_menu_item_drop ( wxMenu * menu)
private
2458{
2459 append_menu_item(menu, wxID_ANY, _L("Drop") , "",
2460 [](wxCommandEvent&) {
2462 }, "", nullptr,
2463 []() {
2464 if (plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasView3D)
2465 return false;
2466 else {
2468 } //disable if model is on the bed / not in View3D
2469 }, m_parent);
2470}
void drop_selection()
Definition Plater.cpp:22334
bool can_drop() const
Definition Selection.cpp:570

References _L, append_menu_item(), append_menu_item_drop(), Slic3r::GUI::GLCanvas3D::CanvasView3D, m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_drop(), create_bbl_part_menu(), create_extra_object_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_edit_svg()

void Slic3r::GUI::MenuFactory::append_menu_item_edit_svg ( wxMenu * menu,
size_t pos = -1 )
private
1615{
1616 wxString name = _L("Edit SVG");
1617 auto can_edit_svg = []() {
1618 if (plater() == nullptr)
1619 return false;
1620 const Selection& selection = plater()->get_selection();
1621 if (selection.volumes_count() != 1)
1622 return false;
1623 const GLVolume* gl_volume = selection.get_first_volume();
1624 if (gl_volume == nullptr)
1625 return false;
1626 const ModelVolume *volume = get_model_volume(*gl_volume, selection.get_model()->objects);
1627 if (volume == nullptr)
1628 return false;
1629 return volume->is_svg();
1630 };
1631
1632 if (menu != &m_svg_part_menu) {
1633 const int menu_item_id = menu->FindItem(name);
1634 if (menu_item_id != wxNOT_FOUND) {
1635 // Delete old menu item and the separator placed right after it
1636 const size_t item_pos = FindPositionById(menu, menu_item_id);
1637 if (item_pos != size_t(wxNOT_FOUND) && item_pos + 1 < menu->GetMenuItemCount() && menu->FindItemByPosition(item_pos + 1)->IsSeparator())
1638 menu->Destroy(menu->FindItemByPosition(item_pos + 1));
1639 menu->Destroy(menu_item_id);
1640 }
1641 if (!can_edit_svg())
1642 return;
1643 }
1644
1645 wxString description = _L("Change SVG source file, projection, size, ...");
1646 std::string icon = "cog";
1647 auto open_svg = [](const wxCommandEvent &) {
1648 GLGizmosManager &mng = plater()->get_view3D_canvas3D()->get_gizmos_manager();
1649 if (mng.get_current_type() == GLGizmosManager::Svg)
1650 mng.open_gizmo(GLGizmosManager::Svg); // close() and reopen - move to be visible
1651 mng.open_gizmo(GLGizmosManager::Svg);
1652 };
1653 append_menu_item(menu, wxID_ANY, name, description, open_svg, icon, nullptr, can_edit_svg, m_parent, pos);
1654 if (pos == size_t(wxNOT_FOUND))
1655 menu->AppendSeparator();
1656 else
1657 menu->InsertSeparator(pos + 1);
1658}
const GLGizmosManager & get_gizmos_manager() const
Definition GLCanvas3D.hpp:1031
bool open_gizmo(EType type)
Definition GLGizmosManager.cpp:458
size_t FindPositionById(wxMenu *menu, int id)
Definition GUI_Factories.cpp:560
MenuWithSeparators m_svg_part_menu
Definition GUI_Factories.hpp:122
const Selection & get_selection() const
Definition Plater.cpp:22055
const GLVolume * get_first_volume() const
Definition Selection.hpp:317
static ModelVolume * get_model_volume(const Selection &selection, Model &model)
Definition GLGizmoBrimEars.cpp:66

References _L, append_menu_item(), append_menu_item_edit_svg(), FindPositionById(), Slic3r::GUI::GLGizmosManager::get_current_type(), Slic3r::GUI::Selection::get_first_volume(), Slic3r::GUI::Selection::get_model(), Slic3r::GUI::get_model_volume(), Slic3r::ModelVolume::is_svg(), m_parent, m_svg_part_menu, Slic3r::Model::objects, Slic3r::GUI::GLGizmosManager::open_gizmo(), Slic3r::GUI::plater(), Slic3r::GUI::GLGizmosManager::Svg, and Slic3r::GUI::Selection::volumes_count().

Referenced by append_menu_item_edit_svg(), create_svg_part_menu(), object_menu(), and sla_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_edit_text()

void Slic3r::GUI::MenuFactory::append_menu_item_edit_text ( wxMenu * menu,
size_t pos = -1 )
private
1568{
1569 wxString name = _L("Edit text");
1570
1571 auto can_edit_text = []() {
1572 if (plater() == nullptr)
1573 return false;
1574 const Selection& selection = plater()->get_selection();
1575 if (selection.volumes_count() != 1)
1576 return false;
1577 const GLVolume* gl_volume = selection.get_first_volume();
1578 if (gl_volume == nullptr)
1579 return false;
1580 const ModelVolume *volume = get_model_volume(*gl_volume, selection.get_model()->objects);
1581 if (volume == nullptr)
1582 return false;
1583 return volume->is_text();
1584 };
1585
1586 if (menu != &m_text_part_menu) {
1587 const int menu_item_id = menu->FindItem(name);
1588 if (menu_item_id != wxNOT_FOUND) {
1589 // Delete old menu item and the separator placed right after it
1590 const size_t item_pos = FindPositionById(menu, menu_item_id);
1591 if (item_pos != size_t(wxNOT_FOUND) && item_pos + 1 < menu->GetMenuItemCount() && menu->FindItemByPosition(item_pos + 1)->IsSeparator())
1592 menu->Destroy(menu->FindItemByPosition(item_pos + 1));
1593 menu->Destroy(menu_item_id);
1594 }
1595 if (!can_edit_text())
1596 return;
1597 }
1598
1599 wxString description = _L("Ability to change text, font, size, ...");
1600 std::string icon = "cog";
1601 auto open_emboss = [](const wxCommandEvent &) {
1602 GLGizmosManager &mng = plater()->get_view3D_canvas3D()->get_gizmos_manager();
1603 if (mng.get_current_type() == GLGizmosManager::Emboss)
1604 mng.open_gizmo(GLGizmosManager::Emboss); // close() and reopen - move to be visible
1605 mng.open_gizmo(GLGizmosManager::Emboss);
1606 };
1607 append_menu_item(menu, wxID_ANY, name, description, open_emboss, icon, nullptr, can_edit_text, m_parent, pos);
1608 if (pos == size_t(wxNOT_FOUND))
1609 menu->AppendSeparator();
1610 else
1611 menu->InsertSeparator(pos + 1);
1612}
MenuWithSeparators m_text_part_menu
Definition GUI_Factories.hpp:119

References _L, append_menu_item(), append_menu_item_edit_text(), Slic3r::GUI::GLGizmosManager::Emboss, FindPositionById(), Slic3r::GUI::GLGizmosManager::get_current_type(), Slic3r::GUI::Selection::get_first_volume(), Slic3r::GUI::Selection::get_model(), Slic3r::GUI::get_model_volume(), Slic3r::ModelVolume::is_text(), m_parent, m_text_part_menu, Slic3r::Model::objects, Slic3r::GUI::GLGizmosManager::open_gizmo(), Slic3r::GUI::plater(), and Slic3r::GUI::Selection::volumes_count().

Referenced by append_menu_item_edit_text(), create_bbl_part_menu(), create_text_part_menu(), object_menu(), and sla_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_export_drc()

void Slic3r::GUI::MenuFactory::append_menu_item_export_drc ( wxMenu * menu,
bool is_mulity_menu = false )
private
1083{
1084 append_menu_item(menu, wxID_ANY, _L("Export as one DRC") + dots, "",
1085 [](wxCommandEvent&) { plater()->export_stl(false, true, false, FT_DRC); }, "", nullptr,
1086 [is_mulity_menu]() {
1087 const Selection& selection = plater()->canvas3D()->get_selection();
1088 if (is_mulity_menu)
1089 return selection.is_multiple_full_instance() || selection.is_multiple_full_object();
1090 else
1091 return selection.is_single_full_instance() || selection.is_single_full_object();
1092 }, m_parent);
1093 if (!is_mulity_menu)
1094 return;
1095 append_menu_item(menu, wxID_ANY, _L("Export as DRCs") + dots, "",
1096 [](wxCommandEvent&) { plater()->export_stl(false, true, true, FT_DRC); }, "", nullptr,
1097 []() {
1098 const Selection& selection = plater()->canvas3D()->get_selection();
1099 return selection.is_multiple_full_instance() || selection.is_multiple_full_object();
1100 }, m_parent);
1101}
void export_stl(bool extended=false, bool selection_only=false, bool multi_stls=false, FileType file_type=FT_STL)
Definition Plater.cpp:20053
GLCanvas3D * canvas3D()
Definition Plater.cpp:22070
bool is_multiple_full_instance() const
Definition Selection.hpp:278
static wxString dots("...", wxConvUTF8)
@ FT_DRC
Definition GUI_App.hpp:139

References _L, append_menu_item(), append_menu_item_export_drc(), Slic3r::GUI::dots(), Slic3r::GUI::FT_DRC, Slic3r::GUI::Selection::is_multiple_full_instance(), Slic3r::GUI::Selection::is_multiple_full_object(), Slic3r::GUI::Selection::is_single_full_instance(), Slic3r::GUI::Selection::is_single_full_object(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_export_drc(), append_menu_item_more(), and create_common_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_export_stl()

void Slic3r::GUI::MenuFactory::append_menu_item_export_stl ( wxMenu * menu,
bool is_mulity_menu = false )
private
1062{
1063 append_menu_item(menu, wxID_ANY, _L("Export as one STL") + dots, "",
1064 [](wxCommandEvent&) { plater()->export_stl(false, true); }, "", nullptr,
1065 [is_mulity_menu]() {
1066 const Selection& selection = plater()->canvas3D()->get_selection();
1067 if (is_mulity_menu)
1068 return selection.is_multiple_full_instance() || selection.is_multiple_full_object();
1069 else
1070 return selection.is_single_full_instance() || selection.is_single_full_object();
1071 }, m_parent);
1072 if (!is_mulity_menu)
1073 return;
1074 append_menu_item(menu, wxID_ANY, _L("Export as STLs") + dots, "",
1075 [](wxCommandEvent&) { plater()->export_stl(false, true, true); }, "", nullptr,
1076 []() {
1077 const Selection& selection = plater()->canvas3D()->get_selection();
1078 return selection.is_multiple_full_instance() || selection.is_multiple_full_object();
1079 }, m_parent);
1080}

References _L, append_menu_item(), append_menu_item_export_stl(), Slic3r::GUI::dots(), Slic3r::GUI::Selection::is_multiple_full_instance(), Slic3r::GUI::Selection::is_multiple_full_object(), Slic3r::GUI::Selection::is_single_full_instance(), Slic3r::GUI::Selection::is_single_full_object(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_export_stl(), append_menu_item_more(), and create_common_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_fill_bed()

void Slic3r::GUI::MenuFactory::append_menu_item_fill_bed ( wxMenu * menu)
private
992{
994 menu, wxID_ANY, _L("Fill bed with copies"), _L("Fill the remaining area of bed with copies of the selected object"),
995 [](wxCommandEvent &) { plater()->fill_bed_with_copies(); }, "", nullptr, []() { return plater()->can_increase_instances(); }, m_parent);
996}
bool can_increase_instances() const
Definition Plater.cpp:23884
void fill_bed_with_copies()
Definition Plater.cpp:19405

References _L, append_menu_item(), append_menu_item_fill_bed(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_fill_bed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_fix_through_cgal()

wxMenuItem * Slic3r::GUI::MenuFactory::append_menu_item_fix_through_cgal ( wxMenu * menu)
private
1053{
1054 wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _L("Fix Model"), "",
1055 [](wxCommandEvent&) { obj_list()->fix_through_cgal(); }, "", menu,
1056 []() {return plater()->can_fix_through_cgal(); }, plater());
1057
1058 return menu_item;
1059}
void fix_through_cgal()
Definition GUI_ObjectList.cpp:6301
bool can_fix_through_cgal() const
Definition Plater.cpp:23887

References _L, append_menu_item(), append_menu_item_fix_through_cgal(), Slic3r::GUI::obj_list(), and Slic3r::GUI::plater().

Referenced by append_menu_item_fix_through_cgal(), append_menu_item_modify(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_instance_to_object()

wxMenuItem * Slic3r::GUI::MenuFactory::append_menu_item_instance_to_object ( wxMenu * menu)
private
970{
971 wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _L("Set as An Individual Object"), "",
972 [](wxCommandEvent&) { obj_list()->split_instances(); }, "", menu);
973
974 /* New behavior logic:
975 * 1. Split Object to several separated object, if ALL instances are selected
976 * 2. Separate selected instances from the initial object to the separated object,
977 * if some (not all) instances are selected
978 */
979 m_parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt)
980 {
981 const Selection& selection = plater()->canvas3D()->get_selection();
982 evt.SetText(selection.is_single_full_object() ?
983 _L("Set as Individual Objects") : _L("Set as An Individual Object"));
984
985 evt.Enable(plater()->can_set_instance_to_object());
986 }, menu_item->GetId());
987
988 return menu_item;
989}
void split_instances()
Definition GUI_ObjectList.cpp:6257

References _L, append_menu_item(), append_menu_item_instance_to_object(), Slic3r::GUI::Selection::is_single_full_object(), m_parent, Slic3r::GUI::obj_list(), and Slic3r::GUI::plater().

Referenced by append_menu_item_instance_to_object(), create_extra_object_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_invalidate_cut_info()

void Slic3r::GUI::MenuFactory::append_menu_item_invalidate_cut_info ( wxMenu * menu,
size_t pos = -1 )
private
1661{
1662 const wxString menu_name = _L("Invalidate cut info");
1663
1664 auto menu_item_id = menu->FindItem(menu_name);
1665 if (menu_item_id != wxNOT_FOUND) {
1666 // Delete old menu item (and the separator placed right after it) if selected object isn't cut
1667 const size_t item_pos = FindPositionById(menu, menu_item_id);
1668 if (item_pos != size_t(wxNOT_FOUND) && item_pos + 1 < menu->GetMenuItemCount() && menu->FindItemByPosition(item_pos + 1)->IsSeparator())
1669 menu->Destroy(menu->FindItemByPosition(item_pos + 1));
1670 menu->Destroy(menu_item_id);
1671 }
1672
1673 if (obj_list()->has_selected_cut_object()) {
1674 append_menu_item(menu, wxID_ANY, menu_name, "", [](wxCommandEvent &) { obj_list()->invalidate_cut_info_for_selection(); },
1675 "cut_", menu, []() { return true; }, m_parent, pos);
1676 if (pos == size_t(wxNOT_FOUND))
1677 menu->AppendSeparator();
1678 else
1679 menu->InsertSeparator(pos + 1);
1680 }
1681}
void invalidate_cut_info_for_selection()
Definition GUI_ObjectList.cpp:3598
Vec3d pos(const Pt &p)
Definition ReprojectPointsOnMesh.hpp:16

References _L, append_menu_item(), append_menu_item_invalidate_cut_info(), FindPositionById(), m_parent, and Slic3r::GUI::obj_list().

Referenced by append_menu_item_invalidate_cut_info(), and object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_layers_editing()

wxMenuItem * Slic3r::GUI::MenuFactory::append_menu_item_layers_editing ( wxMenu * menu)
private
813{
814 return append_menu_item(menu, wxID_ANY, _L("Height Range Modifier"), "",
815 [](wxCommandEvent&) { obj_list()->layers_editing(); wxGetApp().params_panel()->switch_to_object(); }, "height_range_modifier", menu,
816 []() { return obj_list()->is_instance_or_object_selected(); }, m_parent);
817}
void layers_editing()
Definition GUI_ObjectList.cpp:3337
bool is_instance_or_object_selected()
Definition GUI_ObjectList.cpp:2238

References _L, append_menu_item(), append_menu_item_layers_editing(), m_parent, and Slic3r::GUI::obj_list().

Referenced by append_menu_item_layers_editing(), and append_menu_items_add_volume().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_locked()

void Slic3r::GUI::MenuFactory::append_menu_item_locked ( wxMenu * menu,
size_t pos = -1 )
private
2673{
2674 const std::vector<wxString> names = { _L("Unlock"), _L("Lock") };
2675 // Delete old menu item
2676 for (const wxString& name : names) {
2677 const int item_id = menu->FindItem(name);
2678 if (item_id != wxNOT_FOUND)
2679 menu->Destroy(item_id);
2680 }
2681
2682 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
2683 assert(plate);
2684 wxString lock_text = plate->is_locked() ? names[0] : names[1];
2685
2686 auto item = append_menu_item(menu, wxID_ANY, lock_text, "",
2687 [plate](wxCommandEvent&) {
2688 bool lock = plate->is_locked();
2689 plate->lock(!lock);
2690 }, "", nullptr, []() { return true; }, m_parent, pos);
2691
2692 m_parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) {
2693 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
2694 assert(plate);
2695 //bool check = plate->is_locked();
2696 //evt.Check(check);
2698 }, item->GetId());
2699}
void set_current_canvas_as_dirty()
Definition Plater.cpp:22140
@ lock
Definition GLGizmoEmboss.cpp:209

References _L, append_menu_item(), append_menu_item_locked(), Slic3r::GUI::PartPlate::is_locked(), Slic3r::GUI::PartPlate::lock(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_locked(), and plate_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_merge_to_multipart_object()

void Slic3r::GUI::MenuFactory::append_menu_item_merge_to_multipart_object ( wxMenu * menu)
private
1337{
1338 append_menu_item(menu, wxID_ANY, _L("Assemble"), _L("Assemble the selected objects into an object with multiple parts"),
1339 [](wxCommandEvent&) { obj_list()->merge(true); }, "", menu,
1340 []() { return obj_list()->can_merge_to_multipart_object(); }, m_parent);
1341}
bool can_merge_to_multipart_object() const
Definition GUI_ObjectList.cpp:3674
void merge(bool to_multipart_object)
Definition GUI_ObjectList.cpp:3050

References _L, append_menu_item(), append_menu_item_merge_to_multipart_object(), m_parent, and Slic3r::GUI::obj_list().

Referenced by append_menu_item_merge_to_multipart_object(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_merge_to_single_object()

void Slic3r::GUI::MenuFactory::append_menu_item_merge_to_single_object ( wxMenu * menu)
private
1344{
1345 menu->AppendSeparator();
1346 append_menu_item(menu, wxID_ANY, _L("Assemble"), _L("Assemble the selected objects into an object with single part"),
1347 [](wxCommandEvent&) { obj_list()->merge(false); }, "", menu,
1348 []() { return obj_list()->can_merge_to_single_object(); }, m_parent);
1349}
bool can_merge_to_single_object() const
Definition GUI_ObjectList.cpp:3695

References _L, append_menu_item(), append_menu_item_merge_to_single_object(), m_parent, and Slic3r::GUI::obj_list().

Referenced by append_menu_item_merge_to_single_object().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_modify()

wxMenu * Slic3r::GUI::MenuFactory::append_menu_item_modify ( wxMenu * menu,
bool multi_selection,
bool splittable,
bool is_mesh,
bool mesh_boolean )
private
1378{
1379 wxMenu* sub_menu = new wxMenu();
1380
1381 if(splittable){
1382 // Object Split
1383 append_menu_item(sub_menu, wxID_ANY, _L("Split") + ":", "", [](wxCommandEvent&){}, "", menu, [](){return false;}, m_parent);
1384 append_menu_item(sub_menu, wxID_ANY, _L("To Objects"), _L("Split the selected object into multiple objects"),
1385 [](wxCommandEvent&) { plater()->split_object(); }, "menu_split_objects", menu,
1386 []() { return plater()->can_split(true); }, m_parent);
1387 append_menu_item(sub_menu, wxID_ANY, _L("To Parts"), _L("Split the selected object into multiple parts"),
1388 [](wxCommandEvent&) { plater()->split_volume(); }, "menu_split_parts", menu,
1389 []() { return plater()->can_split(false); }, m_parent);
1390 }
1391
1392 if(mesh_boolean){
1393 if(sub_menu->GetMenuItemCount() > 0)
1394 sub_menu->AppendSeparator();
1395 // Mesh Boolean
1396 append_menu_item(sub_menu, wxID_ANY, _L("Mesh boolean"), _L("Mesh boolean operations including union and subtraction"),
1397 [](wxCommandEvent&) { obj_list()->boolean/*merge_volumes*/(); }, "", menu,
1398 []() { return obj_list()->can_mesh_boolean(); }, m_parent);
1399
1400 }
1401
1402 if(is_mesh){
1403 if(sub_menu->GetMenuItemCount() > 0)
1404 sub_menu->AppendSeparator();
1405 if(!multi_selection){ // these doesnt support multiple items
1406 // Object Simplify
1407 append_menu_item_simplify(sub_menu);
1408 // Mesh Smooth / Subdivision
1410 sub_menu->AppendSeparator();
1411 }
1412 // Object Repair
1414 }
1415
1416 append_submenu(menu, sub_menu, wxID_ANY, _L("Modify"), "", "", [](){return true;}, m_parent);
1417 return sub_menu;
1418}
void append_menu_item_smooth_mesh(wxMenu *menu)
Definition GUI_Factories.cpp:2373
wxMenuItem * append_menu_item_fix_through_cgal(wxMenu *menu)
Definition GUI_Factories.cpp:1052
void append_menu_item_simplify(wxMenu *menu)
Definition GUI_Factories.cpp:2366
void boolean()
Definition GUI_ObjectList.cpp:3397
bool can_mesh_boolean() const
Definition GUI_ObjectList.cpp:3705
bool can_split(bool to_objects) const
Definition Plater.cpp:23950
void split_object(bool auto_drop=true)
Definition Plater.cpp:22336
void split_volume()
Definition Plater.cpp:22337

References _L, append_menu_item(), append_menu_item_fix_through_cgal(), append_menu_item_modify(), append_menu_item_simplify(), append_menu_item_smooth_mesh(), append_submenu(), m_parent, Slic3r::GUI::obj_list(), and Slic3r::GUI::plater().

Referenced by append_menu_item_modify(), create_bbl_assemble_object_menu(), create_bbl_part_menu(), create_common_object_menu(), create_extra_object_menu(), create_svg_part_menu(), create_text_part_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_more()

wxMenu * Slic3r::GUI::MenuFactory::append_menu_item_more ( wxMenu * menu,
bool multi_selection,
bool disk_op,
bool export_op )
private
1421{
1422 wxMenu* sub_menu = new wxMenu();
1423
1424 if(disk_op){
1425 // Reload from disk supports multi selection too (#16589)
1427 sub_menu->AppendSeparator();
1428 if(!multi_selection) // "Replace with STL" only works on a single item
1431 }
1432 if(export_op){
1433 sub_menu->AppendSeparator();
1434 append_menu_item_export_stl(sub_menu, multi_selection);
1435 append_menu_item_export_drc(sub_menu, multi_selection);
1436 }
1437 append_submenu(menu, sub_menu, wxID_ANY, _L("More"), "", "",[](){return true;}, m_parent);
1438
1439 return sub_menu;
1440}
void append_menu_item_reload_from_disk(wxMenu *menu)
Definition GUI_Factories.cpp:1103
void append_menu_item_replace_all_with_stl(wxMenu *menu)
Definition GUI_Factories.cpp:1117
void append_menu_item_replace_with_stl(wxMenu *menu)
Definition GUI_Factories.cpp:1110
void append_menu_item_export_drc(wxMenu *menu, bool is_mulity_menu=false)
Definition GUI_Factories.cpp:1082
void append_menu_item_export_stl(wxMenu *menu, bool is_mulity_menu=false)
Definition GUI_Factories.cpp:1061

References _L, append_menu_item_export_drc(), append_menu_item_export_stl(), append_menu_item_more(), append_menu_item_reload_from_disk(), append_menu_item_replace_all_with_stl(), append_menu_item_replace_with_stl(), append_submenu(), and m_parent.

Referenced by append_menu_item_more(), create_bbl_part_menu(), create_extra_object_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_per_object_process()

void Slic3r::GUI::MenuFactory::append_menu_item_per_object_process ( wxMenu * menu)
private
2473{
2474 const std::vector<wxString> names = { _L("Edit Process Settings"), _L("Edit Process Settings") };
2475 append_menu_item(menu, wxID_ANY, names[0], names[1],
2476 [](wxCommandEvent&) {
2477 wxGetApp().obj_list()->switch_to_object_process();
2478 }, "", nullptr,
2479 []() {
2480 Selection& selection = plater()->canvas3D()->get_selection();
2481 return selection.is_single_full_object() ||
2482 selection.is_multiple_full_object() ||
2483 selection.is_single_full_instance() ||
2484 selection.is_multiple_full_instance() ||
2485 selection.is_single_volume() ||
2486 selection.is_multiple_volume();
2487 }, m_parent);
2488
2489 const std::vector<wxString> names2 = {_L("Copy Process Settings"), _L("Copy Process Settings")};
2491 menu, wxID_ANY, names2[0], names2[1], [](wxCommandEvent &) {
2492 wxGetApp().obj_list()->copy_settings_to_clipboard();
2493 }, "", nullptr,
2494 []() {
2495 Selection &selection = plater()->canvas3D()->get_selection();
2496 return selection.is_single_full_object() || selection.is_single_full_instance() ||
2497 selection.is_single_volume_or_modifier();
2498 },
2499 m_parent);
2500
2501 const std::vector<wxString> names3 = {_L("Paste Process Settings"), _L("Paste Process Settings")};
2503 menu, wxID_ANY, names3[0], names3[1], [](wxCommandEvent &) {
2504 wxGetApp().obj_list()->paste_settings_into_list();
2505 }, "", nullptr,
2506 []() {
2507 return wxGetApp().obj_list()->can_paste_settings_into_list();
2508 },
2509 m_parent);
2510}
bool is_single_full_object() const
Definition Selection.hpp:279

References _L, append_menu_item(), append_menu_item_per_object_process(), Slic3r::GUI::Selection::is_multiple_full_instance(), Slic3r::GUI::Selection::is_multiple_full_object(), Slic3r::GUI::Selection::is_multiple_volume(), Slic3r::GUI::Selection::is_single_full_instance(), Slic3r::GUI::Selection::is_single_full_object(), Slic3r::GUI::Selection::is_single_volume(), Slic3r::GUI::Selection::is_single_volume_or_modifier(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_per_object_process(), create_bbl_part_menu(), create_extra_object_menu(), create_svg_part_menu(), create_text_part_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_per_object_settings()

void Slic3r::GUI::MenuFactory::append_menu_item_per_object_settings ( wxMenu * menu,
size_t pos = -1 )
private
2513{
2514 const std::vector<wxString> names = { _L("Edit in Parameter Table"), _L("Edit print parameters for a single object") };
2515 // Delete old menu item
2516 for (const wxString& name : names) {
2517 const int item_id = menu->FindItem(name);
2518 if (item_id != wxNOT_FOUND)
2519 menu->Destroy(item_id);
2520 }
2521
2522 append_menu_item(menu, wxID_ANY, names[0], names[1],
2523 [](wxCommandEvent&) {
2525 }, "", nullptr,
2526 []() {
2527 Selection& selection = plater()->canvas3D()->get_selection();
2528 return selection.is_single_full_object() || selection.is_single_full_instance() || selection.is_single_volume();
2529 }, m_parent, pos);
2530}
bool PopupObjectTableBySelection()
Definition Plater.cpp:24053

References _L, append_menu_item(), append_menu_item_per_object_settings(), Slic3r::GUI::Selection::is_single_full_instance(), Slic3r::GUI::Selection::is_single_full_object(), Slic3r::GUI::Selection::is_single_volume(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_per_object_settings(), create_extra_object_menu(), part_menu(), svg_part_menu(), and text_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_plate_delete()

void Slic3r::GUI::MenuFactory::append_menu_item_plate_delete ( wxMenu * menu,
size_t pos = -1 )
private
2738{
2739 wxString name= _L("Delete Plate");
2740 // Delete old menu item and the separator placed right before it
2741 const int item_id = menu->FindItem(name);
2742 if (item_id != wxNOT_FOUND) {
2743 const size_t item_pos = FindPositionById(menu, item_id);
2744 if (item_pos != size_t(wxNOT_FOUND) && item_pos > 0 && menu->FindItemByPosition(item_pos - 1)->IsSeparator())
2745 menu->Destroy(menu->FindItemByPosition(item_pos - 1));
2746 menu->Destroy(item_id);
2747 }
2748
2749 menu->InsertSeparator(pos);
2750
2751 PartPlate *plate = plater()->get_partplate_list().get_selected_plate();
2752 assert(plate);
2753
2754 // delete current plate
2755 auto item = append_menu_item(menu, wxID_ANY, name, _L("Remove the selected plate"),
2756 [](wxCommandEvent&) { plater()->delete_plate(); }, "", nullptr,
2757 []() { return plater()->can_delete_plate(); }, m_parent, pos + 1);
2758
2759 // no extra wxEVT_UPDATE_UI handler here: a second handler on the same id runs before the one bound
2760 // by append_menu_item() and, without evt.Skip(), swallows the enable/disable condition
2761}
bool can_delete_plate() const
Definition Plater.cpp:23883
int delete_plate(int plate_index=-1)
Definition Plater.cpp:23552

References _L, append_menu_item(), append_menu_item_plate_delete(), FindPositionById(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_plate_delete(), and plate_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_plate_name()

void Slic3r::GUI::MenuFactory::append_menu_item_plate_name ( wxMenu * menu,
size_t pos = -1 )
private
2702{
2703 wxString name= _L("Edit Plate Name");
2704 // Delete old menu item
2705 const int item_id = menu->FindItem(name);
2706 if (item_id != wxNOT_FOUND) menu->Destroy(item_id);
2707
2708 PartPlate *plate = plater()->get_partplate_list().get_selected_plate();
2709 assert(plate);
2710
2711 auto item = append_menu_item(
2712 menu, wxID_ANY, name, "",
2713 [](wxCommandEvent &e) {
2714 int hover_idx =plater()->canvas3D()->GetHoverId();
2715 if (hover_idx == -1) {
2716 int plate_idx=plater()->GetPlateIndexByRightMenuInLeftUI();
2717 plater()->select_plate_by_hover_id(plate_idx * PartPlate::GRABBER_COUNT, false, true);
2718 }
2719 else
2720 {
2721 plater()->select_plate_by_hover_id(hover_idx, false, true);
2722 }
2723 plater()->get_current_canvas3D()->post_event(SimpleEvent(EVT_GLCANVAS_PLATE_NAME_CHANGE));
2724 },
2725 "", nullptr, []() { return true; }, m_parent, pos);
2726
2727 m_parent->Bind(
2728 wxEVT_UPDATE_UI,
2729 [](wxUpdateUIEvent &evt) {
2730 PartPlate *plate = plater()->get_partplate_list().get_selected_plate();
2731 assert(plate);
2733 },
2734 item->GetId());
2735}
void post_event(wxEvent &&event)
Definition GLCanvas3D.cpp:1691
int GetHoverId()
Definition GLCanvas3D.cpp:1582
static constexpr unsigned int GRABBER_COUNT
Definition PartPlate.hpp:288
GLCanvas3D * get_current_canvas3D(bool exclude_preview=false)
Definition Plater.cpp:22126
int select_plate_by_hover_id(int hover_id, bool right_click=false, bool isModidyPlateName=false)
Definition Plater.cpp:23251
int GetPlateIndexByRightMenuInLeftUI()
Definition Plater.cpp:24133

References _L, append_menu_item(), append_menu_item_plate_name(), Slic3r::GUI::PartPlate::GRABBER_COUNT, m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_plate_name(), and plate_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_precise_seam_submenu()

void Slic3r::GUI::MenuFactory::append_menu_item_precise_seam_submenu ( wxMenu * menu)
private
1443{
1444 wxString submenu_name = _L("Precise Seam Type");
1445
1446 // Remove existing submenu if present (menu is rebuilt on every right-click)
1447 const int menu_item_id = menu->FindItem(submenu_name);
1448 if (menu_item_id != wxNOT_FOUND)
1449 menu->Destroy(menu_item_id);
1450
1451 // --- Precondition: ALL selected volumes must be Precise Seam ---
1452 // Mixed selections (PS + non-PS) are ambiguous for subtype switching: applying a subtype
1453 // would implicitly convert the non-PS volumes to PS, which is not what the user expects
1454 // from a subtype picker. For mixed selections the user should first use
1455 // "Change type → Precise Seam" to unify them, then come back to this submenu.
1456 wxDataViewItemArray sels;
1457 obj_list()->GetSelections(sels);
1458 if (sels.IsEmpty())
1459 return;
1460
1461 // A right-click on a volume in the 3D view routes through Plater::show_context_menu
1462 // → ObjectList::update_selections(), which intentionally preserves a pre-existing
1463 // settings-row selection alongside the clicked volume. As a result GetSelections()
1464 // may return settings-row items that are children of a volume. Treat each settings
1465 // row as selecting its parent volume (same pattern used by set_volume_type()
1466 // internally). Without this resolution, GetVolumeType(settings_row) returns INVALID
1467 // and the submenu would hide even when a valid PS volume is in the selection.
1468 //
1469 // Precomputing the resolved PS types once here also lets the checkmark loop below
1470 // display checks correctly for selections that contain settings rows.
1471 std::vector<ModelVolumeType> selected_ps_types;
1472 selected_ps_types.reserve(sels.size());
1473
1474 auto* model = obj_list()->GetModel();
1475 for (const auto& sel_item : sels) {
1476 wxDataViewItem vol_item = sel_item;
1477 const ItemType type_mask = model->GetItemType(sel_item);
1478 if (!(type_mask & itVolume)) {
1479 // Only settings rows whose parent is a volume map to "selecting that volume".
1480 // Any other non-volume item (object, instance, etc.) means the selection is
1481 // not purely PS-volume-based — hide the submenu.
1482 if ((type_mask & itSettings) && (model->GetItemType(model->GetParent(sel_item)) & itVolume))
1483 vol_item = model->GetParent(sel_item);
1484 else
1485 return;
1486 }
1487 const ModelVolumeType vol_type = model->GetVolumeType(vol_item);
1488 if (!is_precise_seam(vol_type))
1489 return;
1490 selected_ps_types.push_back(vol_type);
1491 }
1492
1493 // Match the label used by append_menu_item_change_type, including its translation.
1494 int insert_pos = wxNOT_FOUND;
1495 int change_type_id = menu->FindItem(_L("Change Type"));
1496 if (change_type_id != wxNOT_FOUND) {
1497 for (size_t i = 0; i < menu->GetMenuItemCount(); i++) {
1498 wxMenuItem* item = menu->FindItemByPosition(i);
1499 if (item && item->GetId() == change_type_id) {
1500 insert_pos = i + 1; // insert directly after the Change Type entry
1501 break;
1502 }
1503 }
1504 }
1505
1506 // --- Build the subtype submenu ---
1507 wxMenu* ps_menu = new wxMenu();
1508
1509 // Array of all 6 Precise Seam subtypes with labels.
1510 // "Seam ..." prefix disambiguates from other i18n contexts (extruder Left/Right, "Center on bed", etc.)
1511 static const std::array<std::pair<const char*, ModelVolumeType>, 6> PS_TYPES = {{
1512 {L("Seam Center"), ModelVolumeType::PRECISE_SEAM_CENTER},
1513 {L("Seam Left"), ModelVolumeType::PRECISE_SEAM_LEFT},
1514 {L("Seam Right"), ModelVolumeType::PRECISE_SEAM_RIGHT},
1515 {L("Seam Enforced"), ModelVolumeType::PRECISE_SEAM_ENFORCED},
1516 {L("Seam Blocked"), ModelVolumeType::PRECISE_SEAM_BLOCKED},
1517 {L("Seam Neutral"), ModelVolumeType::PRECISE_SEAM_NEUTRAL},
1518 }};
1519
1520 for (const auto& ps_type : PS_TYPES) {
1521 wxString label = _(ps_type.first);
1522
1523 // Check-items (not radio): radio groups in wxWidgets auto-select the first item when
1524 // no item is explicitly checked, which misleads the user into seeing "Seam Center"
1525 // as the active subtype for mixed-subtype selections. With check-items we can leave
1526 // every item unchecked in that case, and the menu matches the pattern of the
1527 // neighbouring "Change type" submenu (see append_menu_item_change_type).
1528 //
1529 // Handler: delegate to set_volume_type() with preserve_ps_subtype=false. The user
1530 // explicitly picked a subtype here, so "Seam Center" must set every selected PS
1531 // volume to CENTER verbatim — preservation (the default for "Change type") would
1532 // keep existing subtypes and make CENTER unreachable on mixed-subtype selections.
1533 // set_volume_type() already handles multi-select iteration, the last-solid-part
1534 // guard, and the PS group-change reordering via move_volume_to_end().
1535 wxMenuItem* item = append_menu_check_item(ps_menu, wxID_ANY, label, "",
1536 [ps_type](wxCommandEvent&) {
1537 obj_list()->set_volume_type(ps_type.second, /*preserve_ps_subtype=*/false);
1538 },
1539 ps_menu);
1540
1541 // Tick every subtype that is present in the current selection. Same pattern as the
1542 // neighbouring "Change type" submenu (where selecting [Part + Modifier] ticks both
1543 // "Part" and "Modifier" boxes). For homogeneous selections exactly one checkbox is
1544 // ticked; for mixed subtype selections (e.g. PS_LEFT + PS_RIGHT) both "Seam Left"
1545 // and "Seam Right" appear checked, so the user sees at a glance which subtypes are
1546 // currently in the selection.
1547 //
1548 // Uses the precomputed selected_ps_types (which resolved settings rows to their
1549 // parent volumes); iterating sels directly would miss subtypes for selections that
1550 // arrive via settings rows from right-click-in-3D-view.
1551 const bool is_present = std::find(selected_ps_types.begin(), selected_ps_types.end(),
1552 ps_type.second) != selected_ps_types.end();
1553 if (is_present && item)
1554 item->Check(true);
1555 }
1556
1557 // Add submenu to parent menu
1558 append_submenu(menu, ps_menu, wxID_ANY,
1559 submenu_name,
1560 _L("Choose precise seam subtype"),
1561 "menu_precise_seam_type",
1562 []() { return true; },
1563 m_parent,
1564 insert_pos);
1565}
#define _(s)
Definition 3mf.cpp:306
#define L(s)
Definition ExtrusionEntity.cpp:25
void set_volume_type(ModelVolumeType new_type, bool preserve_ps_subtype=true)
Definition GUI_ObjectList.cpp:5868
ObjectDataViewModel * GetModel() const
Definition GUI_ObjectList.hpp:233
ItemType
Definition ObjectDataViewModel.hpp:34
@ itSettings
Definition ObjectDataViewModel.hpp:41
@ PRECISE_SEAM_BLOCKED
Definition Model.hpp:368
@ PRECISE_SEAM_LEFT
Definition Model.hpp:365
@ PRECISE_SEAM_ENFORCED
Definition Model.hpp:367
@ PRECISE_SEAM_NEUTRAL
Definition Model.hpp:369
@ PRECISE_SEAM_RIGHT
Definition Model.hpp:366

References _, _L, append_menu_check_item(), append_menu_item_precise_seam_submenu(), append_submenu(), Slic3r::is_precise_seam(), Slic3r::GUI::itSettings, Slic3r::GUI::itVolume, L, m_parent, Slic3r::GUI::obj_list(), Slic3r::PRECISE_SEAM_BLOCKED, Slic3r::PRECISE_SEAM_CENTER, Slic3r::PRECISE_SEAM_ENFORCED, Slic3r::PRECISE_SEAM_LEFT, Slic3r::PRECISE_SEAM_NEUTRAL, and Slic3r::PRECISE_SEAM_RIGHT.

Referenced by append_menu_item_precise_seam_submenu(), multi_selection_menu(), and part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_printable()

wxMenuItem * Slic3r::GUI::MenuFactory::append_menu_item_printable ( wxMenu * menu)
private
999{
1000 // BBS: to be checked
1001 wxMenuItem* menu_item_printable = append_menu_check_item(menu, wxID_ANY, _L("Printable") + "\t" + "V", "",
1002 [](wxCommandEvent&) { obj_list()->toggle_printable_state(); }, menu);
1003
1004 m_parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) {
1005 ObjectList* list = obj_list();
1006 wxDataViewItemArray sels;
1007 list->GetSelections(sels);
1008 wxDataViewItem frst_item = sels[0];
1009 ItemType type = list->GetModel()->GetItemType(frst_item);
1010 bool check;
1011 if (type != itInstance && type != itObject)
1012 check = false;
1013 else {
1014 int obj_idx = list->GetModel()->GetObjectIdByItem(frst_item);
1015 int inst_idx = type == itObject ? 0 : list->GetModel()->GetInstanceIdByItem(frst_item);
1016 check = list->object(obj_idx)->instances[inst_idx]->printable;
1017 }
1018
1019 evt.Check(check);
1021
1022 }, menu_item_printable->GetId());
1023
1024 return menu_item_printable;
1025}
void toggle_printable_state()
Definition GUI_ObjectList.cpp:7024
@ itObject
Definition ObjectDataViewModel.hpp:37
@ itInstance
Definition ObjectDataViewModel.hpp:40
@ ObjectList
Definition Shortcuts.hpp:21

References _L, append_menu_check_item(), append_menu_item_printable(), Slic3r::GUI::ObjectDataViewModel::GetInstanceIdByItem(), Slic3r::GUI::ObjectDataViewModel::GetItemType(), Slic3r::GUI::ObjectList::GetModel(), Slic3r::GUI::ObjectDataViewModel::GetObjectIdByItem(), Slic3r::ModelObject::instances, Slic3r::GUI::itInstance, Slic3r::GUI::itObject, m_parent, Slic3r::GUI::obj_list(), Slic3r::GUI::ObjectList::object(), and Slic3r::GUI::plater().

Referenced by append_menu_item_printable(), and create_extra_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_reload_from_disk()

void Slic3r::GUI::MenuFactory::append_menu_item_reload_from_disk ( wxMenu * menu)
private
1104{
1105 append_menu_item(menu, wxID_ANY, _L("Reload from disk"), _L("Reload the selected parts from disk"),
1106 [](wxCommandEvent&) { plater()->reload_from_disk(); }, "", menu,
1107 []() { return plater()->can_reload_from_disk(); }, m_parent);
1108}
void reload_from_disk()
Definition Plater.cpp:20697
bool can_reload_from_disk() const
Definition Plater.cpp:23943

References _L, append_menu_item(), append_menu_item_reload_from_disk(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_more(), append_menu_item_reload_from_disk(), and create_common_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_rename()

void Slic3r::GUI::MenuFactory::append_menu_item_rename ( wxMenu * menu)
private
1045{
1046 append_menu_item(menu, wxID_ANY, _L("Rename"), "",
1047 [](wxCommandEvent&) { obj_list()->rename_item(); }, "", menu);
1048
1049 menu->AppendSeparator();
1050}
void rename_item()
Definition GUI_ObjectList.cpp:6280

References _L, append_menu_item(), append_menu_item_rename(), and Slic3r::GUI::obj_list().

Referenced by append_menu_item_rename(), and create_common_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_replace_all_with_stl()

void Slic3r::GUI::MenuFactory::append_menu_item_replace_all_with_stl ( wxMenu * menu)
private
1118{
1119 append_menu_item(menu, wxID_ANY, _L("Replace all with 3D files") + dots, _L("Replace all selected parts with 3D files from folder"),
1120 [](wxCommandEvent &) { plater()->replace_all_with_stl(); }, "", menu,
1121 []() { return plater()->can_replace_all_with_stl(); }, m_parent);
1122}
void replace_all_with_stl()
Definition Plater.cpp:20707
bool can_replace_all_with_stl() const
Definition Plater.cpp:23948

References _L, append_menu_item(), append_menu_item_replace_all_with_stl(), Slic3r::GUI::dots(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_more(), append_menu_item_replace_all_with_stl(), create_plate_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_replace_with_stl()

void Slic3r::GUI::MenuFactory::append_menu_item_replace_with_stl ( wxMenu * menu)
private
1111{
1112 append_menu_item(menu, wxID_ANY, _L("Replace 3D file") + dots, _L("Replace the selected part with a new 3D file"),
1113 [](wxCommandEvent &) { plater()->replace_with_stl(); }, "", menu,
1114 []() { return plater()->can_replace_with_stl(); }, m_parent);
1115}
bool can_replace_with_stl() const
Definition Plater.cpp:23947
void replace_with_stl()
Definition Plater.cpp:20702

References _L, append_menu_item(), append_menu_item_replace_with_stl(), Slic3r::GUI::dots(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_more(), and append_menu_item_replace_with_stl().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_scale_selection_to_fit_print_volume()

void Slic3r::GUI::MenuFactory::append_menu_item_scale_selection_to_fit_print_volume ( wxMenu * menu)
private
1190{
1191 append_menu_item(menu, wxID_ANY, _L("Scale to build volume"), _L("Scale an object to fit the build volume"),
1192 [](wxCommandEvent&) { plater()->scale_selection_to_fit_print_volume(); }, "", menu);
1193}
void scale_selection_to_fit_print_volume()
Definition Plater.cpp:19428

References _L, append_menu_item(), append_menu_item_scale_selection_to_fit_print_volume(), and Slic3r::GUI::plater().

Referenced by append_menu_item_scale_selection_to_fit_print_volume(), append_menu_item_transform(), and create_common_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_set_auto_drop()

void Slic3r::GUI::MenuFactory::append_menu_item_set_auto_drop ( wxMenu * menu)
private
2650{
2651 const Selection& selection = plater()->canvas3D()->get_selection();
2652 const bool current_auto_drop = selection.get_auto_drop();
2653
2654 wxString menu_text = _L("Auto Drop");
2655 wxString menu_tooltip = _L("Automatically snaps the selected object to the build plate.");
2656 wxMenuItem* menu_item_set_auto_drop = append_menu_check_item(
2657 menu, wxID_ANY, menu_text, menu_tooltip,
2658 [current_auto_drop](wxCommandEvent&) {
2659 Selection& selection = plater()->canvas3D()->get_selection();
2660 selection.set_auto_drop(!current_auto_drop);
2661 },
2662 menu);
2663 m_parent->Bind(
2664 wxEVT_UPDATE_UI,
2665 [current_auto_drop](wxUpdateUIEvent& evt) {
2666 evt.Check(current_auto_drop);
2668 },
2669 menu_item_set_auto_drop->GetId());
2670}
bool get_auto_drop() const
Definition Selection.cpp:637
void set_auto_drop(bool enabled)
Definition Selection.cpp:658

References _L, append_menu_check_item(), append_menu_item_set_auto_drop(), Slic3r::GUI::Selection::get_auto_drop(), m_parent, Slic3r::GUI::plater(), and Slic3r::GUI::Selection::set_auto_drop().

Referenced by append_menu_item_set_auto_drop(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_set_printable()

void Slic3r::GUI::MenuFactory::append_menu_item_set_printable ( wxMenu * menu)
private
2620{
2621 const Selection& selection = plater()->canvas3D()->get_selection();
2622 bool all_printable = true;
2623 ObjectList* list = obj_list();
2624 wxDataViewItemArray sels;
2625 list->GetSelections(sels);
2626
2627 for (wxDataViewItem item : sels) {
2628 ItemType type = list->GetModel()->GetItemType(item);
2629 if (type != itInstance && type != itObject)
2630 continue;
2631 else {
2632 int obj_idx = list->GetModel()->GetObjectIdByItem(item);
2633 int inst_idx = type == itObject ? 0 : list->GetModel()->GetInstanceIdByItem(item);
2634 all_printable &= list->object(obj_idx)->instances[inst_idx]->printable;
2635 }
2636 }
2637
2638 wxMenuItem* menu_item_set_printable = append_menu_check_item(menu, wxID_ANY, _L("Printable") + "\t" + "V", "", [all_printable](wxCommandEvent&) {
2639 Selection& selection = plater()->canvas3D()->get_selection();
2640 selection.set_printable(!all_printable);
2641 }, menu);
2642 m_parent->Bind(wxEVT_UPDATE_UI, [all_printable](wxUpdateUIEvent& evt) {
2643 evt.Check(all_printable);
2645
2646 }, menu_item_set_printable->GetId());
2647}
void set_printable(bool printable)
Definition Selection.cpp:606

References _L, append_menu_check_item(), append_menu_item_set_printable(), Slic3r::GUI::ObjectDataViewModel::GetInstanceIdByItem(), Slic3r::GUI::ObjectDataViewModel::GetItemType(), Slic3r::GUI::ObjectList::GetModel(), Slic3r::GUI::ObjectDataViewModel::GetObjectIdByItem(), Slic3r::ModelObject::instances, Slic3r::GUI::itInstance, Slic3r::GUI::itObject, m_parent, Slic3r::GUI::obj_list(), Slic3r::GUI::ObjectList::object(), Slic3r::GUI::plater(), and Slic3r::GUI::Selection::set_printable().

Referenced by append_menu_item_set_printable(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_set_visible()

void Slic3r::GUI::MenuFactory::append_menu_item_set_visible ( wxMenu * menu)
private
572{
573 bool has_one_shown = false;
574 const Selection& selection = plater()->canvas3D()->get_selection();
575 for (unsigned int i : selection.get_volume_idxs()) {
576 has_one_shown |= selection.get_volume(i)->visible;
577 }
578
579 append_menu_item(menu, wxID_ANY, has_one_shown ?_L("Hide") : _L("Show"), "",
580 [has_one_shown](wxCommandEvent&) { plater()->set_selected_visible(!has_one_shown); }, "", nullptr,
581 []() { return true; }, m_parent);
582}
void set_selected_visible(bool visible)
Definition Plater.cpp:19255

References _L, append_menu_item(), append_menu_item_set_visible(), Slic3r::GUI::Selection::get_volume(), Slic3r::GUI::Selection::get_volume_idxs(), m_parent, and Slic3r::GUI::plater().

Referenced by append_menu_item_set_visible(), assemble_multi_selection_menu(), assemble_object_menu(), and assemble_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_settings()

wxMenuItem * Slic3r::GUI::MenuFactory::append_menu_item_settings ( wxMenu * menu)
private
820{
821 MenuWithSeparators* menu = dynamic_cast<MenuWithSeparators*>(menu_);
822
823 const wxString menu_name = _L("Add Settings");
824 // Delete old items from settings popupmenu
825 auto settings_id = menu->FindItem(menu_name);
826 if (settings_id != wxNOT_FOUND)
827 menu->Destroy(settings_id);
828
829 for (auto& it : FREQ_SETTINGS_BUNDLE_FFF)
830 {
831 settings_id = menu->FindItem(_(it.first));
832 if (settings_id != wxNOT_FOUND)
833 menu->Destroy(settings_id);
834 }
835 for (auto& it : FREQ_SETTINGS_BUNDLE_SLA)
836 {
837 settings_id = menu->FindItem(_(it.first));
838 if (settings_id != wxNOT_FOUND)
839 menu->Destroy(settings_id);
840 }
841
842 menu->DestroySeparators(); // delete old separators
843
844 // If there are selected more then one instance but not all of them
845 // don't add settings menu items
846 const Selection& selection = get_selection();
847 if ((selection.is_multiple_full_instance() && !selection.is_single_full_object()) ||
848 selection.is_multiple_volume() || selection.is_mixed()) // more than one volume(part) is selected on the scene
849 return nullptr;
850
851 const auto sel_vol = obj_list()->get_selected_model_volume();
852 if (sel_vol && sel_vol->type() >= ModelVolumeType::SUPPORT_ENFORCER)
853 return nullptr;
854
855 // detect itemm for adding of the setting
856 ObjectList* object_list = obj_list();
857 ObjectDataViewModel* obj_model = list_model();
858
859 const wxDataViewItem sel_item = // when all instances in object are selected
860 object_list->GetSelectedItemsCount() > 1 && selection.is_single_full_object() ?
861 obj_model->GetItemById(selection.get_object_idx()) :
862 object_list->GetSelection();
863 if (!sel_item)
864 return nullptr;
865
866 // If we try to add settings for object/part from 3Dscene,
867 // for the second try there is selected ItemSettings in ObjectList.
868 // So, check if selected item isn't SettingsItem. And get a SettingsItem's parent item, if yes
869 wxDataViewItem item = obj_model->GetItemType(sel_item) & itSettings ? obj_model->GetParent(sel_item) : sel_item;
870 const ItemType item_type = obj_model->GetItemType(item);
871 const bool is_object_settings = !(item_type& itVolume || item_type & itLayer);
872
873 // Add frequently settings
874 // BBS remvoe freq setting popupmenu
875 // create_freq_settings_popupmenu(menu, is_object_settings, item);
876
877 //menu->SetSecondSeparator();
878
879 // Add full settings list
880 auto menu_item = new wxMenuItem(menu, wxID_ANY, menu_name);
881 menu_item->SetBitmap(create_scaled_bitmap("cog"));
882 menu_item->SetSubMenu(create_settings_popupmenu(menu, is_object_settings, item));
883
884 return menu->Append(menu_item);
885}
void DestroySeparators()
Definition wxExtensions.cpp:914
@ itLayer
Definition ObjectDataViewModel.hpp:43
static SettingsFactory::Bundle FREQ_SETTINGS_BUNDLE_FFF
Definition GUI_Factories.cpp:83
static const Selection & get_selection()
Definition GUI_Factories.cpp:415
static ObjectDataViewModel * list_model()
Definition GUI_Factories.cpp:410
static SettingsFactory::Bundle FREQ_SETTINGS_BUNDLE_SLA
Definition GUI_Factories.cpp:99
static wxMenu * create_settings_popupmenu(wxMenu *parent_menu, const bool is_object_settings, wxDataViewItem item)
Definition GUI_Factories.cpp:446
wxBitmap create_scaled_bitmap(const std::string &bmp_name_in, wxWindow *win, const int px_cnt, const bool grayscale, const std::string &new_color, const bool menu_bitmap, const bool resize, const bool bitmap2, const std::vector< std::string > &array_new_color)
Definition wxExtensions.cpp:448

References _, _L, append_menu_item_settings(), create_scaled_bitmap(), Slic3r::GUI::create_settings_popupmenu(), MenuWithSeparators::DestroySeparators(), Slic3r::GUI::FREQ_SETTINGS_BUNDLE_FFF, Slic3r::GUI::FREQ_SETTINGS_BUNDLE_SLA, Slic3r::GUI::Selection::get_object_idx(), Slic3r::GUI::get_selection(), Slic3r::GUI::ObjectDataViewModel::GetItemById(), Slic3r::GUI::ObjectDataViewModel::GetItemType(), Slic3r::GUI::ObjectDataViewModel::GetParent(), Slic3r::GUI::Selection::is_mixed(), Slic3r::GUI::Selection::is_multiple_full_instance(), Slic3r::GUI::Selection::is_multiple_volume(), Slic3r::GUI::Selection::is_single_full_object(), Slic3r::GUI::itLayer, Slic3r::GUI::itSettings, Slic3r::GUI::itVolume, Slic3r::GUI::list_model(), Slic3r::GUI::obj_list(), and Slic3r::SUPPORT_ENFORCER.

Referenced by append_menu_item_settings(), layer_menu(), and sla_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_simplify()

void Slic3r::GUI::MenuFactory::append_menu_item_simplify ( wxMenu * menu)
private
2367{
2368 wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _L("Simplify Model"), "",
2369 [](wxCommandEvent&) { obj_list()->simplify(); }, "", menu,
2370 []() {return plater()->can_simplify(); }, m_parent);
2371}
void simplify()
Definition GUI_ObjectList.cpp:6453
bool can_simplify() const
Definition Plater.cpp:23888

References _L, append_menu_item(), append_menu_item_simplify(), m_parent, Slic3r::GUI::obj_list(), and Slic3r::GUI::plater().

Referenced by append_menu_item_modify(), append_menu_item_simplify(), and create_bbl_assemble_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_smooth_mesh()

void Slic3r::GUI::MenuFactory::append_menu_item_smooth_mesh ( wxMenu * menu)
private
2374{
2375 wxMenuItem *menu_item = append_menu_item(
2376 menu, wxID_ANY, _L("Subdivision mesh (Lost color)"), "", [](wxCommandEvent &) { obj_list()->smooth_mesh(); }, "", menu, []() { return plater()->can_smooth_mesh(); },
2377 m_parent);
2378}
void smooth_mesh()
Definition GUI_ObjectList.cpp:6470
bool can_smooth_mesh() const
Definition Plater.cpp:23889

References _L, append_menu_item(), append_menu_item_smooth_mesh(), m_parent, Slic3r::GUI::obj_list(), and Slic3r::GUI::plater().

Referenced by append_menu_item_modify(), append_menu_item_smooth_mesh(), and create_bbl_assemble_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_item_transform()

wxMenu * Slic3r::GUI::MenuFactory::append_menu_item_transform ( wxMenu * menu,
bool multi_selection,
bool show_mirror,
bool is_scalable )
private
1352{
1353 wxMenu* sub_menu = new wxMenu();
1354
1355 if(show_mirror){
1356 // Mirror
1357 append_menu_item(sub_menu, wxID_ANY, _L("Mirror") + ":", "", [](wxCommandEvent&){}, "", menu, [](){return false;}, m_parent);
1358 append_menu_item(sub_menu, wxID_ANY, _L("Along X Axis"), _L("Mirror along the X axis"),
1359 [](wxCommandEvent&) { plater()->mirror(X); }, "menu_mirror_x", m_parent);
1360 append_menu_item(sub_menu, wxID_ANY, _L("Along Y Axis"), _L("Mirror along the Y axis"),
1361 [](wxCommandEvent&) { plater()->mirror(Y); }, "menu_mirror_y", m_parent);
1362 append_menu_item(sub_menu, wxID_ANY, _L("Along Z Axis"), _L("Mirror along the Z axis"),
1363 [](wxCommandEvent&) { plater()->mirror(Z); }, "menu_mirror_z", m_parent);
1364 }
1365
1366 if(is_scalable){
1367 if(sub_menu->GetMenuItemCount() > 0)
1368 sub_menu->AppendSeparator();
1370 sub_menu->AppendSeparator(); // Convert units will be added later
1371 }
1372
1373 append_submenu(menu, sub_menu, wxID_ANY, _L("Transform"), "", "", [](){return true;}, m_parent);
1374 return sub_menu;
1375}
void append_menu_item_scale_selection_to_fit_print_volume(wxMenu *menu)
Definition GUI_Factories.cpp:1189
void mirror(Axis axis)
Definition Plater.cpp:22335
@ Y
Definition libslic3r.h:142
@ Z
Definition libslic3r.h:143
@ X
Definition libslic3r.h:141

References _L, append_menu_item(), append_menu_item_scale_selection_to_fit_print_volume(), append_menu_item_transform(), append_submenu(), m_parent, Slic3r::GUI::plater(), Slic3r::X, Slic3r::Y, and Slic3r::Z.

Referenced by append_menu_item_transform(), create_bbl_part_menu(), create_common_object_menu(), create_extra_object_menu(), create_svg_part_menu(), create_text_part_menu(), and multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_items_add_volume()

void Slic3r::GUI::MenuFactory::append_menu_items_add_volume ( wxMenu * menu)
private
777{
778 // Update "add" items(delete old & create new) settings popupmenu
779 for (auto& item : ADD_VOLUME_MENU_ITEMS) {
780 const wxString item_name = _(item.first);
781 int item_id = menu->FindItem(item_name);
782 if (item_id != wxNOT_FOUND)
783 menu->Destroy(item_id);
784
785 item_id = menu->FindItem(item_name + ": " + _L("Text"));
786 if (item_id != wxNOT_FOUND)
787 menu->Destroy(item_id);
788 }
789
790 for (size_t type = 0; type < ADD_VOLUME_MENU_ITEMS.size(); type++)
791 {
792 // Skip Precise Seam subtypes except the first one (CENTER) - they are only used for tree icons
793 if (type >= int(ModelVolumeType::PRECISE_SEAM_LEFT) &&
795 continue;
796
797 auto& item = ADD_VOLUME_MENU_ITEMS[type];
798
799 // Use special icon for "Add Precise Seam" menu (different from tree icon)
800 std::string icon_name = item.second;
802 icon_name = "menu_precise_seam_add";
803
804 wxMenu* sub_menu = append_submenu_add_generic(menu, ModelVolumeType(type));
805 append_submenu(menu, sub_menu, wxID_ANY, _(item.first), "", icon_name,
806 []() { return obj_list()->is_instance_or_object_selected(); }, m_parent);
807 }
808
810}
wxMenu * append_submenu_add_generic(wxMenu *menu, ModelVolumeType type)
Definition GUI_Factories.cpp:597
wxMenuItem * append_menu_item_layers_editing(wxMenu *menu)
Definition GUI_Factories.cpp:812
static const constexpr std::array< std::pair< const char *, const char * >, 11 > ADD_VOLUME_MENU_ITEMS
Definition GUI_Factories.cpp:370

References _, _L, Slic3r::GUI::ADD_VOLUME_MENU_ITEMS, append_menu_item_layers_editing(), append_menu_items_add_volume(), append_submenu(), append_submenu_add_generic(), m_parent, Slic3r::PRECISE_SEAM_CENTER, Slic3r::PRECISE_SEAM_LEFT, and Slic3r::PRECISE_SEAM_NEUTRAL.

Referenced by append_menu_items_add_volume(), create_extra_object_menu(), and update_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_items_convert_unit()

void Slic3r::GUI::MenuFactory::append_menu_items_convert_unit ( wxMenu * menu)
private
1281{
1282 std::vector<int> obj_idxs, vol_idxs;
1283 obj_list()->get_selection_indexes(obj_idxs, vol_idxs);
1284 if (obj_idxs.empty() && vol_idxs.empty())
1285 return;
1286
1287 auto volume_respects_conversion = [](ModelVolume* volume, ConversionType conver_type)
1288 {
1289 return (conver_type == ConversionType::CONV_FROM_INCH && volume->source.is_converted_from_inches) ||
1290 (conver_type == ConversionType::CONV_TO_INCH && !volume->source.is_converted_from_inches) ||
1291 (conver_type == ConversionType::CONV_FROM_METER && volume->source.is_converted_from_meters) ||
1292 (conver_type == ConversionType::CONV_TO_METER && !volume->source.is_converted_from_meters);
1293 };
1294
1295 auto can_append = [obj_idxs, vol_idxs, volume_respects_conversion](ConversionType conver_type)
1296 {
1297 ModelObjectPtrs objects;
1298 for (int obj_idx : obj_idxs) {
1299 ModelObject* object = obj_list()->object(obj_idx);
1300 if (vol_idxs.empty()) {
1301 for (ModelVolume* volume : object->volumes)
1302 if (volume_respects_conversion(volume, conver_type))
1303 return false;
1304 }
1305 else {
1306 for (int vol_idx : vol_idxs)
1307 if (volume_respects_conversion(object->volumes[vol_idx], conver_type))
1308 return false;
1309 }
1310 }
1311 return true;
1312 };
1313
1314 std::vector<std::pair<ConversionType, wxString>> items = {
1315 {ConversionType::CONV_FROM_INCH , _L("Convert from Inches") },
1316 {ConversionType::CONV_TO_INCH , _L("Restore to Inch") },
1317 {ConversionType::CONV_FROM_METER, _L("Convert from Meters") },
1318 {ConversionType::CONV_TO_METER , _L("Restore to Meter") } };
1319
1320 for (auto item : items) {
1321 int menu_id = menu->FindItem(item.second);
1322 if (can_append(item.first)) {
1323 // Add menu item if it doesn't exist
1324 if (menu_id == wxNOT_FOUND)
1325 append_menu_item(menu, wxID_ANY, item.second, item.second,
1326 [item](wxCommandEvent&) { plater()->convert_unit(item.first); }, "", menu,
1327 []() { return true; }, m_parent);
1328 }
1329 else if (menu_id != wxNOT_FOUND) {
1330 // Delete menu item
1331 menu->Destroy(menu_id);
1332 }
1333 }
1334}
void get_selection_indexes(std::vector< int > &obj_idxs, std::vector< int > &vol_idxs)
Definition GUI_ObjectList.cpp:564
ModelObject * object(const int obj_idx) const
Definition GUI_ObjectList.cpp:7139
ConversionType
Definition Model.hpp:744
@ CONV_TO_METER
Definition Model.hpp:747
@ CONV_TO_INCH
Definition Model.hpp:745
@ CONV_FROM_METER
Definition Model.hpp:748
@ CONV_FROM_INCH
Definition Model.hpp:746
std::vector< ModelObject * > ModelObjectPtrs
Definition CutUtils.hpp:13

References _L, append_menu_item(), append_menu_items_convert_unit(), Slic3r::CONV_FROM_INCH, Slic3r::CONV_FROM_METER, Slic3r::CONV_TO_INCH, Slic3r::CONV_TO_METER, Slic3r::ModelVolume::Source::is_converted_from_inches, Slic3r::ModelVolume::Source::is_converted_from_meters, m_parent, Slic3r::GUI::obj_list(), Slic3r::ModelVolume::source, and Slic3r::ModelObject::volumes.

Referenced by append_menu_items_convert_unit(), multi_selection_menu(), object_menu(), part_menu(), and sla_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_items_flush_options()

void Slic3r::GUI::MenuFactory::append_menu_items_flush_options ( wxMenu * menu,
size_t pos = -1 )
private
1196{
1197 const wxString name = _L("Flush Options");
1198 // Delete old menu item
1199 const int item_id = menu->FindItem(name);
1200 if (item_id != wxNOT_FOUND)
1201 menu->Destroy(item_id);
1202
1203 bool show_flush_option_menu = false;
1204 ObjectList* object_list = obj_list();
1205 const Selection& selection = get_selection();
1206 if (selection.get_object_idx() < 0)
1207 return;
1208 if (wxGetApp().plater()->get_partplate_list().get_curr_plate()->contains(selection.get_bounding_box())) {
1209 auto plate_extruders = wxGetApp().plater()->get_partplate_list().get_curr_plate()->get_extruders();
1210 for (auto extruder : plate_extruders) {
1211 if (extruder != plate_extruders[0])
1212 show_flush_option_menu = true;
1213 }
1214 }
1215 if (!show_flush_option_menu)
1216 return;
1217
1218 DynamicPrintConfig& global_config = wxGetApp().preset_bundle->prints.get_edited_preset().config;
1219 ModelConfig& select_object_config = object_list->object(selection.get_object_idx())->config;
1220
1221 wxMenu* flush_options_menu = new wxMenu();
1222 auto can_flush = [&global_config]() {
1223 auto option = global_config.option("enable_prime_tower");
1224 return option ? option->getBool() : false;
1225 };
1226 append_menu_check_item(flush_options_menu, wxID_ANY, _L("Flush into objects' infill"), "",
1227 [&select_object_config, &global_config](wxCommandEvent&) {
1228 const ConfigOption* option = select_object_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][0]);
1229 if (!option) {
1230 option = global_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][0]);
1231 }
1232 select_object_config.set_key_value(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][0], new ConfigOptionBool(!option->getBool()));
1233 wxGetApp().obj_settings()->UpdateAndShow(true);
1234 }, menu, can_flush,
1235 [&select_object_config, &global_config]() {
1236 const ConfigOption* option = select_object_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][0]);
1237 if (!option) {
1238 option = global_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][0]);
1239 }
1240 return option->getBool();
1241 }, m_parent);
1242
1243 append_menu_check_item(flush_options_menu, wxID_ANY, _L("Flush into this object"), "",
1244 [&select_object_config, &global_config](wxCommandEvent&) {
1245 const ConfigOption* option = select_object_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][1]);
1246 if (!option) {
1247 option = global_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][1]);
1248 }
1249 select_object_config.set_key_value(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][1], new ConfigOptionBool(!option->getBool()));
1250 wxGetApp().obj_settings()->UpdateAndShow(true);
1251 }, menu, can_flush,
1252 [&select_object_config, &global_config]() {
1253 const ConfigOption* option = select_object_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][1]);
1254 if (!option) {
1255 option = global_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][1]);
1256 }
1257 return option->getBool();
1258 }, m_parent);
1259
1260 append_menu_check_item(flush_options_menu, wxID_ANY, _L("Flush into objects' support"), "",
1261 [&select_object_config, &global_config](wxCommandEvent&) {
1262 const ConfigOption* option = select_object_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][2]);
1263 if (!option) {
1264 option = global_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][2]);
1265 }
1266 select_object_config.set_key_value(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][2], new ConfigOptionBool(!option->getBool()));
1267 wxGetApp().obj_settings()->UpdateAndShow(true);
1268 }, menu, can_flush,
1269 [&select_object_config, &global_config]() {
1270 const ConfigOption* option = select_object_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][2]);
1271 if (!option) {
1272 option = global_config.option(FREQ_SETTINGS_BUNDLE_FFF["Flush options"][2]);
1273 }
1274 return option->getBool();
1275 }, m_parent);
1276
1277 menu->Insert(pos, wxID_ANY, _L("Flush Options"), flush_options_menu);
1278}
bool contains(const std::vector< T > &vector, const Point &point)
Definition Geometry.cpp:55

References _L, append_menu_check_item(), append_menu_items_flush_options(), Slic3r::ModelObject::config, Slic3r::Geometry::contains(), Slic3r::GUI::FREQ_SETTINGS_BUNDLE_FFF, Slic3r::GUI::Selection::get_bounding_box(), Slic3r::GUI::Selection::get_object_idx(), Slic3r::GUI::get_selection(), Slic3r::ConfigOption::getBool(), m_parent, Slic3r::GUI::obj_list(), Slic3r::GUI::ObjectList::object(), Slic3r::ConfigBase::option(), Slic3r::ModelConfig::option(), Slic3r::GUI::plater(), and Slic3r::ModelConfig::set_key_value().

Referenced by append_menu_items_flush_options(), and object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_menu_items_instance_manipulation()

void Slic3r::GUI::MenuFactory::append_menu_items_instance_manipulation ( wxMenu * menu)
private
2286{
2287 MenuType type = menu == &m_object_menu ? mtObjectFFF : mtObjectSLA;
2288
2289 items_increase[type] = append_menu_item(menu, wxID_ANY, _L("Add instance") + "\t+", _L("Add one more instance of the selected object"),
2290 [](wxCommandEvent&) { plater()->increase_instances(); }, "", nullptr,
2291 []() { return plater()->can_increase_instances(); }, m_parent);
2292 items_decrease[type] = append_menu_item(menu, wxID_ANY, _L("Remove instance") + "\t-", _L("Remove one instance of the selected object"),
2293 [](wxCommandEvent&) { plater()->decrease_instances(); }, "", nullptr,
2294 []() { return plater()->can_decrease_instances(); }, m_parent);
2295 items_set_number_of_copies[type] = append_menu_item(menu, wxID_ANY, _L("Set number of instances") + dots, _L("Change the number of instances of the selected object"),
2296 [](wxCommandEvent&) { plater()->set_number_of_copies(); }, "", nullptr,
2297 []() { return plater()->can_increase_instances(); }, m_parent);
2298 append_menu_item(menu, wxID_ANY, _L("Fill bed with instances") + dots, _L("Fill the remaining area of bed with instances of the selected object"),
2299 [](wxCommandEvent&) { plater()->fill_bed_with_instances(); }, "", nullptr,
2300 []() { return plater()->can_increase_instances(); }, m_parent);
2301}
MenuType
Definition GUI_Factories.hpp:103
MenuWithSeparators m_object_menu
Definition GUI_Factories.hpp:111
void set_number_of_copies()
Definition Plater.cpp:19383
void increase_instances(size_t num=1)
Definition Plater.cpp:19286
bool can_decrease_instances() const
Definition Plater.cpp:23885
void decrease_instances(size_t num=1)
Definition Plater.cpp:19330
void fill_bed_with_instances()
Definition Plater.cpp:19414

References _L, append_menu_item(), append_menu_items_instance_manipulation(), Slic3r::GUI::dots(), items_decrease, items_increase, items_set_number_of_copies, m_object_menu, m_parent, mtObjectFFF, mtObjectSLA, and Slic3r::GUI::plater().

Referenced by append_menu_items_instance_manipulation(), create_common_object_menu(), and create_extra_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_submenu_add_generic()

wxMenu * Slic3r::GUI::MenuFactory::append_submenu_add_generic ( wxMenu * menu,
ModelVolumeType type )
private
597 {
598 auto sub_menu = new wxMenu;
599
600 if (type != ModelVolumeType::INVALID) {
601 append_menu_item(sub_menu, wxID_ANY, _L("Load..."), "",
602 [type](wxCommandEvent&) { obj_list()->load_subobject(type); }, "menu_load", menu);
603 sub_menu->AppendSeparator();
604 }
605
606 append_menu_item(sub_menu, wxID_ANY, _L("Cube"), "",
607 [type](wxCommandEvent&) { obj_list()->load_generic_subobject(L("Cube") ,type); },"menu_obj_cube", menu);
608
609 append_menu_item(sub_menu, wxID_ANY, _L("Cylinder"), "",
610 [type](wxCommandEvent&) { obj_list()->load_generic_subobject(L("Cylinder"), type); },"menu_obj_cylinder", menu);
611
612 append_menu_item(sub_menu, wxID_ANY, _L("Sphere"), "",
613 [type](wxCommandEvent&) { obj_list()->load_generic_subobject(L("Sphere"), type); },"menu_obj_sphere", menu);
614
615 append_menu_item(sub_menu, wxID_ANY, _L("Cone"), "",
616 [type](wxCommandEvent&) { obj_list()->load_generic_subobject(L("Cone"), type); },"menu_obj_cone", menu);
617
618 append_menu_item(sub_menu, wxID_ANY, _L("Disc"), "",
619 [type](wxCommandEvent&) { obj_list()->load_generic_subobject(L("Disc"), type); },"menu_obj_disc", menu);
620
621 append_menu_item(sub_menu, wxID_ANY, _L("Torus"), "",
622 [type](wxCommandEvent&) { obj_list()->load_generic_subobject(L("Torus"), type); },"menu_obj_torus", menu);
623
624
625 append_menu_item_add_text(sub_menu, type);
626 append_menu_item_add_svg(sub_menu, type);
627
628 return sub_menu;
629}
void append_menu_item_add_text(wxMenu *menu, ModelVolumeType type, bool is_submenu_item=true)
Definition GUI_Factories.cpp:768
void append_menu_item_add_svg(wxMenu *menu, ModelVolumeType type, bool is_submenu_item=true)
Definition GUI_Factories.cpp:772
void load_subobject(ModelVolumeType type, bool from_galery=false)
Definition GUI_ObjectList.cpp:2244
void load_generic_subobject(const std::string &type_name, const ModelVolumeType type)
Definition GUI_ObjectList.cpp:2532
@ INVALID
Definition Model.hpp:356

References _L, append_menu_item(), append_menu_item_add_svg(), append_menu_item_add_text(), append_submenu_add_generic(), Slic3r::INVALID, L, and Slic3r::GUI::obj_list().

Referenced by append_menu_items_add_volume(), append_submenu_add_generic(), create_default_menu(), and create_plate_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_submenu_add_handy_model()

wxMenu * Slic3r::GUI::MenuFactory::append_submenu_add_handy_model ( wxMenu * menu,
ModelVolumeType type )
private
700 {
701 auto sub_menu = new wxMenu;
702
703 const std::vector<HandyModel>& models = handy_models();
704 for (std::size_t i = 0; i < models.size(); ++i) {
705 append_menu_item(sub_menu, wxID_ANY, _(models[i].label), "",
706 [i](wxCommandEvent&) { MenuFactory::load_handy_model(i); }, "", menu);
707 }
708
709 return sub_menu;
710}
static const std::vector< HandyModel > & handy_models()
Definition GUI_Factories.cpp:634
static void load_handy_model(std::size_t index)
Definition GUI_Factories.cpp:651

References _, append_menu_item(), append_submenu_add_handy_model(), handy_models(), and load_handy_model().

Referenced by append_submenu_add_handy_model(), create_default_menu(), and create_plate_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ assemble_multi_selection_menu()

wxMenu * Slic3r::GUI::MenuFactory::assemble_multi_selection_menu ( )
2263{
2264 wxDataViewItemArray sels;
2265 obj_list()->GetSelections(sels);
2266
2267 for (const wxDataViewItem& item : sels)
2268 if (!(list_model()->GetItemType(item) & (itVolume | itObject | itInstance)))
2269 // show this menu only for Objects(Instances mixed with Objects)/Volumes selection
2270 return nullptr;
2271
2272 wxMenu* menu = new MenuWithSeparators();
2274 //append_menu_item_fix_through_cgal(menu);
2275 //append_menu_item_simplify(menu);
2276 menu->AppendSeparator();
2278 menu->AppendSeparator();
2280 return menu;
2281}
void append_menu_item_change_extruder(wxMenu *menu)
Definition GUI_Factories.cpp:1124
void append_menu_item_delete(wxMenu *menu)
Definition GUI_Factories.cpp:584
void append_menu_item_set_visible(wxMenu *menu)
Definition GUI_Factories.cpp:571

References append_menu_item_change_extruder(), append_menu_item_delete(), append_menu_item_set_visible(), assemble_multi_selection_menu(), Slic3r::GUI::itInstance, Slic3r::GUI::itObject, Slic3r::GUI::itVolume, Slic3r::GUI::list_model(), and Slic3r::GUI::obj_list().

Referenced by assemble_multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ assemble_object_menu()

wxMenu * Slic3r::GUI::MenuFactory::assemble_object_menu ( )
2319{
2320 wxMenu* menu = new MenuWithSeparators();
2321 // Set Visible
2323 // Delete
2324 menu->AppendSeparator();
2327 //append_menu_item_fix_through_cgal(menu);
2329 //append_menu_item_simplify(menu);
2330 menu->AppendSeparator();
2331
2332 // Set filament
2335 //append_menu_item_per_object_settings(menu);
2336 return menu;
2337}

References append_menu_item_change_extruder(), append_menu_item_delete(), append_menu_item_set_visible(), and assemble_object_menu().

Referenced by assemble_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ assemble_part_menu()

wxMenu * Slic3r::GUI::MenuFactory::assemble_part_menu ( )
2340{
2341 wxMenu* menu = new MenuWithSeparators();
2342
2344 menu->AppendSeparator();
2346 //append_menu_item_simplify(menu);
2347 menu->AppendSeparator();
2348
2350 //append_menu_item_per_object_settings(menu);
2351 return menu;
2352}

References append_menu_item_change_extruder(), append_menu_item_delete(), append_menu_item_set_visible(), and assemble_part_menu().

Referenced by assemble_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_bbl_assemble_object_menu()

void Slic3r::GUI::MenuFactory::create_bbl_assemble_object_menu ( )
private
1798{
1799 // Delete
1801 m_assemble_object_menu.AppendSeparator();
1802
1803 append_menu_item_modify(&m_assemble_object_menu, false /*multi_selection*/, false /*splittable*/, true /*mesh*/, false /*mesh_boolean*/);
1804 m_assemble_object_menu.AppendSeparator();
1805}
wxMenu * append_menu_item_modify(wxMenu *menu, bool multi_selection, bool splittable, bool is_mesh, bool mesh_boolean)
Definition GUI_Factories.cpp:1377
MenuWithSeparators m_assemble_object_menu
Definition GUI_Factories.hpp:131

References append_menu_item_delete(), append_menu_item_modify(), create_bbl_assemble_object_menu(), and m_assemble_object_menu.

Referenced by create_bbl_assemble_object_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_bbl_assemble_part_menu()

void Slic3r::GUI::MenuFactory::create_bbl_assemble_part_menu ( )
private
1897{
1898 wxMenu* menu = &m_assemble_part_menu;
1899
1903 menu->AppendSeparator();
1904}
MenuWithSeparators m_assemble_part_menu
Definition GUI_Factories.hpp:132

References append_menu_item_delete(), append_menu_item_simplify(), append_menu_item_smooth_mesh(), create_bbl_assemble_part_menu(), and m_assemble_part_menu.

Referenced by create_bbl_assemble_part_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_bbl_part_menu()

void Slic3r::GUI::MenuFactory::create_bbl_part_menu ( )
private
1869{
1870 wxMenu* menu = &m_part_menu;
1871
1874
1875 m_part_transform_menu = append_menu_item_transform(&m_part_menu, false /*multi_selection*/, true /*mirror*/, true /*is_scalable*/);
1877 append_menu_item_modify(&m_part_menu, false /*multi_selection*/, true /*splittable*/, true /*mesh*/, false /*mesh_boolean*/);
1879 //m_part_geometry_pos = m_part_menu.GetMenuItemCount(); // pos for geometry related items
1880
1881 menu->AppendSeparator();
1883 menu->AppendSeparator();
1884
1886 m_part_props_marker = menu->FindItem(_L("Change Type")); // dynamic property items are inserted after this item
1887 menu->AppendSeparator();
1888
1890 m_part_project_marker = menu->FindItem(_L("Paste Process Settings")); // append_menu_item_per_object_settings() is inserted after this item
1891
1892 menu->AppendSeparator();
1893 append_menu_item_more(&m_part_menu, false /*multi_selection*/, true /*disk_op*/, false /*export_op*/);
1894}
int m_part_props_marker
Definition GUI_Factories.hpp:117
wxMenu * append_menu_item_more(wxMenu *menu, bool multi_selection, bool disk_op, bool export_op)
Definition GUI_Factories.cpp:1420
int m_part_project_marker
Definition GUI_Factories.hpp:118
wxMenu * m_part_transform_menu
Definition GUI_Factories.hpp:116
MenuWithSeparators m_part_menu
Definition GUI_Factories.hpp:115
void append_menu_item_center(wxMenu *menu)
Definition GUI_Factories.cpp:2380
wxMenu * append_menu_item_transform(wxMenu *menu, bool multi_selection, bool show_mirror, bool is_scalable)
Definition GUI_Factories.cpp:1351
void append_menu_item_per_object_process(wxMenu *menu)
Definition GUI_Factories.cpp:2472
void append_menu_item_drop(wxMenu *menu)
Definition GUI_Factories.cpp:2457
void append_menu_item_edit_text(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:1567
wxMenuItem * append_menu_item_change_type(wxMenu *menu)
Definition GUI_Factories.cpp:887
void append_menu_item_align_distribute(wxMenu *menu)
Definition GUI_Factories.cpp:2399

References _L, append_menu_item_align_distribute(), append_menu_item_center(), append_menu_item_change_type(), append_menu_item_delete(), append_menu_item_drop(), append_menu_item_edit_text(), append_menu_item_modify(), append_menu_item_more(), append_menu_item_per_object_process(), append_menu_item_transform(), create_bbl_part_menu(), m_part_menu, m_part_project_marker, m_part_props_marker, and m_part_transform_menu.

Referenced by create_bbl_part_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_common_object_menu()

void Slic3r::GUI::MenuFactory::create_common_object_menu ( wxMenu * menu)
private
1713{
1715 menu->AppendSeparator();
1716
1718
1719 // Object Split / Mirror / Mesh Tools
1720 append_menu_item_transform(menu, false /*multi_selection*/, true /*mirror*/, false /*is_scalable*/);
1721 append_menu_item_modify(menu, false /*multi_selection*/, true /*splittable*/, true /*mesh*/, false /*mesh_boolean*/);
1722
1723 // Delete menu was moved to be after +/- instace to make it more difficult to be selected by mistake.
1724 menu->AppendSeparator();
1726 menu->AppendSeparator();
1727
1731 // "Scale to print volume" makes a sense just for whole object
1733}
void append_menu_item_rename(wxMenu *menu)
Definition GUI_Factories.cpp:1044
void append_menu_items_instance_manipulation(wxMenu *menu)
Definition GUI_Factories.cpp:2285

References append_menu_item_delete(), append_menu_item_export_drc(), append_menu_item_export_stl(), append_menu_item_modify(), append_menu_item_reload_from_disk(), append_menu_item_rename(), append_menu_item_scale_selection_to_fit_print_volume(), append_menu_item_transform(), append_menu_items_instance_manipulation(), and create_common_object_menu().

Referenced by create_common_object_menu(), create_object_menu(), and create_sla_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_default_menu()

void Slic3r::GUI::MenuFactory::create_default_menu ( )
private
1693{
1696
1697 append_submenu(&m_default_menu, sub_menu_primitives, wxID_ANY, _L("Add Primitive"), "", "menu_add_part",
1698 []() {return true; }, m_parent);
1699 append_submenu(&m_default_menu, sub_menu_handy, wxID_ANY, _L("Add Handy models"), "", "menu_add_part",
1700 []() {return true; }, m_parent);
1701 append_menu_item(&m_default_menu, wxID_ANY, _L("Add Models"), "", // ORCA: Add Models
1702 [](wxCommandEvent&) { plater()->add_file(); }, "menu_add_part", &m_default_menu,
1703 []() {return wxGetApp().plater()->can_add_model(); }, m_parent);
1704
1705 m_default_menu.AppendSeparator();
1706
1707 append_menu_check_item(&m_default_menu, wxID_ANY, _L("Show Labels"), "",
1708 [](wxCommandEvent&) { plater()->show_view3D_labels(!plater()->are_view3D_labels_shown()); plater()->get_current_canvas3D()->post_event(SimpleEvent(wxEVT_PAINT)); }, &m_default_menu,
1709 []() { return plater()->is_view3D_shown(); }, []() { return plater()->are_view3D_labels_shown(); }, m_parent);
1710}
wxMenu * append_submenu_add_handy_model(wxMenu *menu, ModelVolumeType type)
Definition GUI_Factories.cpp:700
MenuWithSeparators m_default_menu
Definition GUI_Factories.hpp:126
void show_view3D_labels(bool show)
Definition Plater.cpp:19130
void add_file()
Definition Plater.cpp:18989
bool are_view3D_labels_shown() const
Definition Plater.cpp:19129
bool is_view3D_shown() const
Definition Plater.cpp:19127

References _L, append_menu_check_item(), append_menu_item(), append_submenu(), append_submenu_add_generic(), append_submenu_add_handy_model(), create_default_menu(), Slic3r::INVALID, m_default_menu, m_parent, and Slic3r::GUI::plater().

Referenced by create_default_menu(), init(), and update_default_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_extra_object_menu()

void Slic3r::GUI::MenuFactory::create_extra_object_menu ( )
private
1746{
1747 // Object Clone
1749
1750 // Instances
1751 auto instances = new wxMenu();
1752 if (!instances) return;
1754 instances->AppendSeparator();
1756 append_submenu(&m_object_menu, instances, wxID_ANY, _L("Instances"), "", "",[](){return true;}, m_parent);
1757
1758 m_object_menu.AppendSeparator();
1759
1760 // Object Center
1762
1764
1765 m_object_transform_menu = append_menu_item_transform(&m_object_menu, false /*multi_selection*/, true /*mirror*/, true /*is_scalable*/);
1766 // Object Align/Distribute
1768 append_menu_item_modify(&m_object_menu, false /*multi_selection*/, true /*splittable*/, true /*mesh*/, true /*mesh_boolean*/);
1769 m_object_geometry_pos = m_object_menu.GetMenuItemCount(); // pos for property related items
1770 // Delete
1771 m_object_menu.AppendSeparator();
1773 m_object_menu.AppendSeparator();
1774
1775 // Modifier Part
1776 // BBS
1778
1779 wxMenuItem* props_marker = m_object_menu.Append(wxID_ANY, "", "", wxITEM_SEPARATOR); // AppendSeparator() not assigns an id to item
1780 m_object_props_marker = props_marker->GetId();
1781
1782 // Set filament insert menu item here
1783 // Set Printable
1784 wxMenuItem* menu_item_printable = append_menu_item_printable(&m_object_menu);
1785 wxMenuItem* menu_item_auto_drop = append_menu_item_auto_drop(&m_object_menu);
1786 m_object_menu.AppendSeparator();
1787
1789 // Enter per object parameters
1791
1792 // ORCA Utilities menu
1793 m_object_menu.AppendSeparator();
1794 append_menu_item_more(&m_object_menu, false /*multi_selection*/, true /*disk_op*/, true/*export_op*/);
1795}
void append_menu_item_clone(wxMenu *menu)
Definition GUI_Factories.cpp:2354
size_t m_object_geometry_pos
Definition GUI_Factories.hpp:113
wxMenuItem * append_menu_item_instance_to_object(wxMenu *menu)
Definition GUI_Factories.cpp:969
wxMenu * m_object_transform_menu
Definition GUI_Factories.hpp:112
wxMenuItem * append_menu_item_printable(wxMenu *menu)
Definition GUI_Factories.cpp:998
int m_object_props_marker
Definition GUI_Factories.hpp:114
wxMenuItem * append_menu_item_auto_drop(wxMenu *menu)
Definition GUI_Factories.cpp:1027
void append_menu_items_add_volume(wxMenu *menu)
Definition GUI_Factories.cpp:776
void append_menu_item_per_object_settings(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:2512

References _L, append_menu_item_align_distribute(), append_menu_item_auto_drop(), append_menu_item_center(), append_menu_item_clone(), append_menu_item_delete(), append_menu_item_drop(), append_menu_item_instance_to_object(), append_menu_item_modify(), append_menu_item_more(), append_menu_item_per_object_process(), append_menu_item_per_object_settings(), append_menu_item_printable(), append_menu_item_transform(), append_menu_items_add_volume(), append_menu_items_instance_manipulation(), append_submenu(), create_extra_object_menu(), m_object_geometry_pos, m_object_menu, m_object_props_marker, m_object_transform_menu, and m_parent.

Referenced by create_extra_object_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_filament_action_menu()

void Slic3r::GUI::MenuFactory::create_filament_action_menu ( bool init,
int active_filament_menu_id )
private
1907{
1908 wxMenu *menu = &m_filament_action_menu;
1909
1910 // ORCA rebuild menu everytime instead checking existing of every item then deleting
1911 while (menu->GetMenuItemCount() > 0)
1912 menu->Destroy(menu->FindItemByPosition(0));
1913
1914 //if (init) { //
1916 menu, wxID_ANY, _L("Edit"), "", [](wxCommandEvent&) {
1917 plater()->sidebar().edit_filament(); }, "", nullptr,
1918 []() { return true; }, m_parent);
1919 //}
1920
1921 wxMenu* sub_menu = new wxMenu();
1922 std::vector<wxBitmap*> icons = get_extruder_color_icons(true);
1923 int filaments_cnt = Sidebar::should_show_SEMM_buttons() ? icons.size() : 0;
1924 for (int i = 0; i < filaments_cnt; i++) {
1925 if (i == active_filament_menu_id)
1926 continue;
1927
1928 auto preset = wxGetApp().preset_bundle->filaments.find_preset(wxGetApp().preset_bundle->filament_presets[i]);
1929 wxString item_name = preset ? from_u8(preset->label(false)) : wxString::Format(_L("Filament %d"), i + 1);
1930
1931 append_menu_item(sub_menu, wxID_ANY, item_name, "",
1932 [i](wxCommandEvent&) { plater()->sidebar().change_filament(-2, i); }, *icons[i], menu,
1933 []() { return true; }, m_parent);
1934 }
1935 append_submenu(menu, sub_menu, wxID_ANY, _L("Merge with"), "", "",
1936 [filaments_cnt]() { return filaments_cnt > 1; }, m_parent);
1937
1938 // Decompose a target colour into a printable mix of the loaded filaments. Placed before the
1940 menu, wxID_ANY, _L("Decompose Color"), "", [](wxCommandEvent&) {
1942 []() { return plater()->sidebar().combos_filament().size() >= 2; }, m_parent);
1943
1944 menu->AppendSeparator(); // ORCA use seperator for reducing accidental clicks to delete
1945
1946 // ORCA use delete item on end of menu to prevent accidental clicks. clicking to submenus(merge) already not allowed by OS
1948 menu, wxID_ANY, _L("Delete"), _L("Delete this filament"), [](wxCommandEvent&) {
1949 plater()->sidebar().delete_filament(-2); }, "", nullptr,
1950 []() {
1951 return plater()->sidebar().combos_filament().size() > 1
1952 // Orca: only show delete filament option for SEMM machines unless is BBL
1954 }, m_parent);
1955}
wxMenu m_filament_action_menu
Definition GUI_Factories.hpp:134
Sidebar & sidebar()
Definition Plater.cpp:16046
std::vector< PlaterPresetComboBox * > & combos_filament()
Definition Plater.cpp:6891
void change_filament(size_t from_id, size_t to_id)
Definition Plater.cpp:5892
void delete_filament(size_t filament_id=size_t(-1), int replace_filament_id=-1)
Definition Plater.cpp:5834
void edit_filament()
Definition Plater.cpp:5927
static bool should_show_SEMM_buttons()
Definition Plater.cpp:6559
void decompose_filament_color(int filament_idx)
Definition Plater.cpp:5371
constexpr int kSidebarContextMenuFilamentId
Definition Plater.hpp:117

References _L, append_menu_item(), append_submenu(), create_filament_action_menu(), Slic3r::GUI::from_u8(), get_extruder_color_icons(), init(), Slic3r::GUI::kSidebarContextMenuFilamentId, m_filament_action_menu, m_parent, Slic3r::GUI::plater(), and Slic3r::GUI::Sidebar::should_show_SEMM_buttons().

Referenced by create_filament_action_menu(), filament_action_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_object_menu()

void Slic3r::GUI::MenuFactory::create_object_menu ( )
private
1736{
1738
1739 // BBS: remove Layers Editing
1740 m_object_menu.AppendSeparator();
1741
1742 // "Add (volumes)" popupmenu will be added later in append_menu_items_add_volume()
1743}
void create_common_object_menu(wxMenu *menu)
Definition GUI_Factories.cpp:1712

References create_common_object_menu(), create_object_menu(), and m_object_menu.

Referenced by create_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_plate_menu()

void Slic3r::GUI::MenuFactory::create_plate_menu ( )
private
1959{
1960 wxMenu* menu = &m_plate_menu;
1961 // select objects on current plate
1962 append_menu_item(menu, wxID_ANY, _L("Select All"), _L("Select all objects on the current plate"),
1963 [](wxCommandEvent&) {
1965 }, "", nullptr, []() {
1966 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
1967 assert(plate);
1968 return !plate->get_objects().empty();
1969 }, m_parent);
1970
1971 // select objects on all plates
1972 append_menu_item(menu, wxID_ANY, _L("Select All Plates"), _L("Select all objects on all plates"),
1973 [](wxCommandEvent&) {
1974 plater()->select_all();
1975 }, "", nullptr, []() {
1976 return !plater()->model().objects.empty() && plater()->can_delete_plate(); // also disable when only one plate exist
1977 }, m_parent);
1978
1979 menu->AppendSeparator();
1980 // delete objects on current plate
1981 append_menu_item(menu, wxID_ANY, _L("Delete All"), _L("Delete all objects on the current plate"),
1982 [](wxCommandEvent&) {
1984 }, "", nullptr, []() {
1985 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
1986 assert(plate);
1987 return !plate->get_objects().empty();
1988 }, m_parent);
1989
1990 menu->AppendSeparator();
1991
1992 // arrange objects on current plate
1993 append_menu_item(menu, wxID_ANY, _L("Arrange"), _L("Arrange current plate"),
1994 [](wxCommandEvent&) {
1995 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
1996 assert(plate);
1998 plater()->arrange();
1999 }, "", nullptr,
2000 []() {
2001 return !plater()->get_partplate_list().get_selected_plate()->get_objects().empty();
2002 },
2003 m_parent);
2004
2005 // orient objects on current plate
2006 append_menu_item(menu, wxID_ANY, _L("Auto Rotate"), _L("Auto rotate current plate"),
2007 [](wxCommandEvent&) {
2008 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
2009 assert(plate);
2011 plater()->orient();
2012 }, "", nullptr,
2013 []() {
2014 return !plater()->get_partplate_list().get_selected_plate()->get_objects().empty();
2015 }, m_parent);
2016
2017 wxMenu* modify_menu = new wxMenu();
2018
2019 // fix objects on current plate
2020 append_menu_item(modify_menu, wxID_ANY, _L("Fix All"), _L("Fix all models on the current plate"),
2021 [](wxCommandEvent&) { obj_list()->fix_all_through_cgal(false); }, "", nullptr,
2022 []() { return !plater()->get_partplate_list().get_selected_plate()->empty(); }, m_parent);
2023
2024 // fix objects on all plates
2025 append_menu_item(modify_menu, wxID_ANY, _L("Fix All Plates"), _L("Fix all models on all plates"),
2026 [](wxCommandEvent&) { obj_list()->fix_all_through_cgal(true); }, "", nullptr,
2027 []() { return !plater()->model().objects.empty(); }, m_parent);
2028
2029 append_submenu(menu, modify_menu, wxID_ANY, _L("Modify"), "", "",
2030 [](){ return !plater()->model().objects.empty(); }, m_parent);
2031
2032 menu->AppendSeparator();
2033
2034 m_plate_mods_pos = menu->GetMenuItemCount(); // pos for dynamic plate items (Edit Plate Name / Lock / Delete Plate)
2035
2036 // add shapes
2037 menu->AppendSeparator();
2038 wxMenu* sub_menu_primitives = append_submenu_add_generic(menu, ModelVolumeType::INVALID);
2039 wxMenu* sub_menu_handy = append_submenu_add_handy_model(menu, ModelVolumeType::INVALID);
2040
2041 append_submenu(menu, sub_menu_primitives, wxID_ANY, _L("Add Primitive"), "", "menu_add_part",
2042 []() {return true; }, m_parent);
2043 append_submenu(menu, sub_menu_handy, wxID_ANY, _L("Add Handy models"), "", "menu_add_part",
2044 []() {return true; }, m_parent);
2045 append_menu_item(menu, wxID_ANY, _L("Add Models"), "", // ORCA: Add Models
2046 [](wxCommandEvent&) { plater()->add_file(); }, "menu_add_part", menu,
2047 []() {return wxGetApp().plater()->can_add_model(); }, m_parent);
2048
2049 menu->AppendSeparator();
2050 // reload all objects on current plate
2052 menu, wxID_ANY, _L("Reload All"), _L("Reload all from disk"),
2053 [](wxCommandEvent&) {
2054 PartPlate* plate = plater()->get_partplate_list().get_selected_plate();
2055 assert(plate);
2058 },
2059 "", nullptr, []() { return !plater()->get_partplate_list().get_selected_plate()->get_objects().empty(); }, m_parent);
2060 menu->AppendSeparator();
2062
2063 return;
2064}
@ PREPARE_STATE_MENU
Definition Job.hpp:24
MenuWithSeparators m_plate_menu
Definition GUI_Factories.hpp:129
size_t m_plate_mods_pos
Definition GUI_Factories.hpp:130
void fix_all_through_cgal(bool all_plates)
Definition GUI_ObjectList.cpp:6308
bool empty()
Definition PartPlate.hpp:565
ModelObjectPtrs get_objects()
Definition PartPlate.hpp:474
void select_all()
Definition Plater.cpp:19181
void arrange()
Definition Plater.cpp:22131
const Model & model() const
Definition Plater.cpp:16047
void select_curr_plate_all()
Definition Plater.cpp:19178
void remove_curr_plate_all()
Definition Plater.cpp:19179
void orient()
Definition Plater.cpp:14538
void set_prepare_state(int state)
Definition Plater.cpp:14548
void reload_all_from_disk()
Definition Plater.cpp:20712
ModelObjectPtrs objects
Definition Model.hpp:1702

References _L, append_menu_item(), append_menu_item_replace_all_with_stl(), append_submenu(), append_submenu_add_generic(), append_submenu_add_handy_model(), create_plate_menu(), Slic3r::GUI::PartPlate::get_objects(), Slic3r::INVALID, m_parent, m_plate_menu, m_plate_mods_pos, Slic3r::GUI::obj_list(), Slic3r::GUI::plater(), and Slic3r::GUI::Job::PREPARE_STATE_MENU.

Referenced by create_plate_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_sla_object_menu()

void Slic3r::GUI::MenuFactory::create_sla_object_menu ( )
private
1808{
1810
1811 m_sla_object_menu.AppendSeparator();
1812
1813 // Add the automatic rotation sub-menu
1814 append_menu_item(&m_sla_object_menu, wxID_ANY, _L("Auto orientation"), _L("Auto orient the object to improve print quality"),
1815 [](wxCommandEvent&) { plater()->optimize_rotation(); });
1816}
MenuWithSeparators m_sla_object_menu
Definition GUI_Factories.hpp:125
void optimize_rotation()
Definition Plater.cpp:22338

References _L, append_menu_item(), create_common_object_menu(), create_sla_object_menu(), m_sla_object_menu, and Slic3r::GUI::plater().

Referenced by create_sla_object_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_svg_part_menu()

void Slic3r::GUI::MenuFactory::create_svg_part_menu ( )
private
1844{
1845 wxMenu* menu = &m_svg_part_menu;
1846
1848
1851 append_menu_item_transform(&m_svg_part_menu, false /*multi_selection*/, true /*mirror*/, false /*is_scalable*/);
1852 append_menu_item_modify(&m_svg_part_menu, false /*multi_selection*/, false /*splittable*/, true /*mesh*/, false /*mesh_boolean*/);
1853
1854 //m_svg_geometry_pos = m_svg_part_menu.GetMenuItemCount(); // pos for geometry related items
1855
1856 menu->AppendSeparator();
1858 menu->AppendSeparator();
1859
1861 m_svg_props_marker = menu->FindItem(_L("Change Type")); // dynamic property items are inserted after this item
1862 menu->AppendSeparator();
1863
1865 m_svg_project_marker = menu->FindItem(_L("Paste Process Settings")); // append_menu_item_per_object_settings() is inserted after this item
1866}
int m_svg_project_marker
Definition GUI_Factories.hpp:124
int m_svg_props_marker
Definition GUI_Factories.hpp:123
void append_menu_item_edit_svg(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:1614

References _L, append_menu_item_align_distribute(), append_menu_item_center(), append_menu_item_change_type(), append_menu_item_delete(), append_menu_item_edit_svg(), append_menu_item_modify(), append_menu_item_per_object_process(), append_menu_item_transform(), create_svg_part_menu(), m_svg_part_menu, m_svg_project_marker, and m_svg_props_marker.

Referenced by create_svg_part_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ create_text_part_menu()

void Slic3r::GUI::MenuFactory::create_text_part_menu ( )
private
1819{
1820 wxMenu* menu = &m_text_part_menu;
1821
1823
1826 append_menu_item_transform(&m_text_part_menu, false /*multi_selection*/, true /*mirror*/, false /*is_scalable*/);
1827 append_menu_item_modify(&m_text_part_menu, false /*multi_selection*/, false /*splittable*/, true /*mesh*/, false /*mesh_boolean*/);
1828
1829 //m_text_geometry_pos = m_text_part_menu.GetMenuItemCount(); // pos for geometry related items
1830
1831 menu->AppendSeparator();
1833 menu->AppendSeparator();
1834
1836 m_text_props_marker = menu->FindItem(_L("Change Type")); // dynamic property items are inserted after this item
1837 menu->AppendSeparator();
1838
1840 m_text_project_marker = menu->FindItem(_L("Paste Process Settings")); // append_menu_item_per_object_settings() is inserted after this item
1841}
int m_text_project_marker
Definition GUI_Factories.hpp:121
int m_text_props_marker
Definition GUI_Factories.hpp:120

References _L, append_menu_item_align_distribute(), append_menu_item_center(), append_menu_item_change_type(), append_menu_item_delete(), append_menu_item_edit_text(), append_menu_item_modify(), append_menu_item_per_object_process(), append_menu_item_transform(), create_text_part_menu(), m_text_part_menu, m_text_project_marker, and m_text_props_marker.

Referenced by create_text_part_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ default_menu()

wxMenu * Slic3r::GUI::MenuFactory::default_menu ( )
2097{
2098 return &m_default_menu;
2099}

References default_menu(), and m_default_menu.

Referenced by default_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ filament_action_menu()

wxMenu * Slic3r::GUI::MenuFactory::filament_action_menu ( int active_filament_menu_id)
2303 {
2304 create_filament_action_menu(false, active_filament_menu_id);
2305 return &m_filament_action_menu;
2306}
void create_filament_action_menu(bool init, int active_filament_menu_id)
Definition GUI_Factories.cpp:1906

References create_filament_action_menu(), filament_action_menu(), and m_filament_action_menu.

Referenced by filament_action_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ FindPositionById()

size_t Slic3r::GUI::MenuFactory::FindPositionById ( wxMenu * menu,
int id )
private
561{
562 const wxMenuItemList& list = menu->GetMenuItems();
563 size_t idx = 0;
564 for (auto node = list.GetFirst(); node; node = node->GetNext(), ++idx) {
565 if (node->GetData()->GetId() == id)
566 return idx;
567 }
568 return wxNOT_FOUND; // or list.GetCount()
569}

References FindPositionById().

Referenced by append_menu_item_edit_svg(), append_menu_item_edit_text(), append_menu_item_invalidate_cut_info(), append_menu_item_plate_delete(), FindPositionById(), object_menu(), part_menu(), svg_part_menu(), and text_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_svg_volume_bitmaps()

std::vector< wxBitmap > Slic3r::GUI::MenuFactory::get_svg_volume_bitmaps ( )
static
552{
553 std::vector<wxBitmap> volume_bmps;
554 volume_bmps.reserve(SVG_VOLUME_ICONS.size());
555 for (const auto &item : SVG_VOLUME_ICONS)
556 volume_bmps.push_back(create_scaled_bitmap(item.second));
557 return volume_bmps;
558}
static const constexpr std::array< std::pair< const char *, const char * >, 3 > SVG_VOLUME_ICONS
Definition GUI_Factories.cpp:394

References create_scaled_bitmap(), get_svg_volume_bitmaps(), and Slic3r::GUI::SVG_VOLUME_ICONS.

Referenced by Slic3r::GUI::ObjectDataViewModel::ObjectDataViewModel(), get_svg_volume_bitmaps(), and Slic3r::GUI::ObjectDataViewModel::Rescale().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_text_volume_bitmaps()

std::vector< wxBitmap > Slic3r::GUI::MenuFactory::get_text_volume_bitmaps ( )
static
543{
544 std::vector<wxBitmap> volume_bmps;
545 volume_bmps.reserve(TEXT_VOLUME_ICONS.size());
546 for (const auto& item : TEXT_VOLUME_ICONS)
547 volume_bmps.push_back(create_scaled_bitmap(item.second));
548 return volume_bmps;
549}
static const constexpr std::array< std::pair< const char *, const char * >, 3 > TEXT_VOLUME_ICONS
Definition GUI_Factories.cpp:387

References create_scaled_bitmap(), get_text_volume_bitmaps(), and Slic3r::GUI::TEXT_VOLUME_ICONS.

Referenced by Slic3r::GUI::ObjectDataViewModel::ObjectDataViewModel(), get_text_volume_bitmaps(), and Slic3r::GUI::ObjectDataViewModel::Rescale().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_volume_bitmaps()

std::vector< wxBitmap > Slic3r::GUI::MenuFactory::get_volume_bitmaps ( )
static
533{
534 std::vector<wxBitmap> volume_bmps;
535 volume_bmps.reserve(ADD_VOLUME_MENU_ITEMS.size());
536 for (const auto& item : ADD_VOLUME_MENU_ITEMS) {
537 volume_bmps.push_back(create_scaled_bitmap(item.second));
538 }
539 return volume_bmps;
540}

References Slic3r::GUI::ADD_VOLUME_MENU_ITEMS, create_scaled_bitmap(), and get_volume_bitmaps().

Referenced by Slic3r::GUI::ObjectDataViewModel::ObjectDataViewModel(), get_volume_bitmaps(), and Slic3r::GUI::ObjectDataViewModel::Rescale().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handy_models()

const std::vector< MenuFactory::HandyModel > & Slic3r::GUI::MenuFactory::handy_models ( )
static
635{
636 static const std::vector<HandyModel> models = {
637 {"orca_cube", L("Orca Cube"), {"OrcaCube_v2.drc", "OrcaPlug_v2.drc"}, true},
638 {"orcasliced_combo", L("OrcaSliced Combo"), {"OrcaSliced.3mf", "OrcaCube_v2.drc", "OrcaPlug_v2.drc"}, true},
639 {"orca_badge", L("Orca Badge"), {"OrcaBadge.3mf"}},
640 {"orca_tolerance_test", L("Orca Tolerance Test"), {"OrcaToleranceTest.drc"}},
641 {"3dbenchy", L("3DBenchy"), {"3DBenchy.drc"}},
642 {"cali_cat", L("Cali Cat"), {"calicat.drc"}},
643 {"autodesk_fdm_test", L("Autodesk FDM Test"), {"ksr_fdmtest_v4.drc"}},
644 {"voron_cube", L("Voron Cube"), {"Voron_Design_Cube_v7.drc"}},
645 {"stanford_bunny", L("Stanford Bunny"), {"Stanford_Bunny.drc"}},
646 {"orca_string_hell", L("Orca String Hell"), {"Orca_stringhell.drc"}, false, true},
647 };
648 return models;
649}

References handy_models(), and L.

Referenced by append_submenu_add_handy_model(), Slic3r::GUI::anonymous_namespace{NativeCommands.cpp}::build_command_catalog(), handy_models(), load_handy_model(), and Slic3r::GUI::run_scene_benchmark().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ init()

void Slic3r::GUI::MenuFactory::init ( wxWindow * parent)
2067{
2068 m_parent = parent;
2069
2071 //BBS
2072 //create_object_menu();
2080
2081 //BBS: add part plate related logic
2083
2085
2086 // create "Instance to Object" menu item
2088}
void create_bbl_assemble_object_menu()
Definition GUI_Factories.cpp:1797
void create_text_part_menu()
Definition GUI_Factories.cpp:1818
void create_bbl_assemble_part_menu()
Definition GUI_Factories.cpp:1896
void create_default_menu()
Definition GUI_Factories.cpp:1692
void create_svg_part_menu()
Definition GUI_Factories.cpp:1843
void create_sla_object_menu()
Definition GUI_Factories.cpp:1807
void create_bbl_part_menu()
Definition GUI_Factories.cpp:1868
MenuWithSeparators m_instance_menu
Definition GUI_Factories.hpp:127
void create_extra_object_menu()
Definition GUI_Factories.cpp:1745
void create_plate_menu()
Definition GUI_Factories.cpp:1958

References append_menu_item_instance_to_object(), create_bbl_assemble_object_menu(), create_bbl_assemble_part_menu(), create_bbl_part_menu(), create_default_menu(), create_extra_object_menu(), create_filament_action_menu(), create_plate_menu(), create_sla_object_menu(), create_svg_part_menu(), create_text_part_menu(), init(), m_instance_menu, and m_parent.

Referenced by create_filament_action_menu(), and init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ instance_menu()

wxMenu * Slic3r::GUI::MenuFactory::instance_menu ( )
2157{
2158 return &m_instance_menu;
2159}

References instance_menu(), and m_instance_menu.

Referenced by instance_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ layer_menu()

wxMenu * Slic3r::GUI::MenuFactory::layer_menu ( )
2162{
2163 MenuWithSeparators* menu = new MenuWithSeparators();
2165
2166 return menu;
2167}
wxMenuItem * append_menu_item_settings(wxMenu *menu)
Definition GUI_Factories.cpp:819

References append_menu_item_settings(), and layer_menu().

Referenced by layer_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ load_handy_model()

void Slic3r::GUI::MenuFactory::load_handy_model ( std::size_t index)
static
652{
653 const std::vector<HandyModel>& models = handy_models();
654 if (index >= models.size())
655 return;
656 const HandyModel& model = models[index];
657
658 std::vector<boost::filesystem::path> input_files;
659 input_files.reserve(model.file_names.size());
660 for (const auto& file_name : model.file_names)
661 input_files.push_back((boost::filesystem::path(Slic3r::resources_dir()) / "handy_models" / file_name));
662
663 Plater* pl = plater();
664 if (!pl)
665 return;
666 pl->load_files(input_files, LoadStrategy::LoadModel);
667 if (model.arrange_after_import) {
668 pl->set_prepare_state(Job::PREPARE_STATE_DEFAULT);
669 pl->arrange();
670 }
671
672 // Suggest to change settings for stringhell
673 // This serves as mini tutorial for new users
674 if (model.is_stringhell) {
675 wxGetApp().CallAfter([=] {
676 DynamicPrintConfig* m_config = &wxGetApp().preset_bundle->prints.get_edited_preset().config;
677
678 bool is_only_one_wall_top = m_config->opt_bool("only_one_wall_top");
679 auto min_width_top_surface = m_config->option<ConfigOptionFloatOrPercent>("min_width_top_surface")->value;
680 if (is_only_one_wall_top && min_width_top_surface > 0) {
681 wxString msg_text = _L("This model features text embossment on the top surface. For optimal results, it is "
682 "advisable to set the 'One Wall Threshold (min_width_top_surface)' "
683 "to 0 for the 'Only One Wall on Top Surfaces' to work best.\n"
684 "Yes - Change these settings automatically\n"
685 "No - Do not change these settings for me");
686
687 MessageDialog dialog(wxGetApp().plater(), msg_text, _L("Suggestion"), wxICON_WARNING | wxYES | wxNO);
688 if (dialog.ShowModal() == wxID_YES) {
689 m_config->set_key_value("min_width_top_surface", new ConfigOptionFloatOrPercent(0, false));
690 wxGetApp().get_tab(Preset::TYPE_PRINT)->update_dirty();
691 wxGetApp().get_tab(Preset::TYPE_PRINT)->reload_config();
692 }
693 wxGetApp().plater()->update();
694 }
695 });
696 }
697}
@ PREPARE_STATE_DEFAULT
Definition Job.hpp:23
Definition GUI_Factories.hpp:59
@ TYPE_PRINT
Definition Preset.hpp:246
@ Plater
Definition Shortcuts.hpp:21
min_width_top_surface((ConfigOptionBool, only_one_wall_first_layer))((ConfigOptionFloat
const std::string & resources_dir()
Definition utils.cpp:296
@ LoadModel
Definition bbs_3mf.hpp:222

References _L, Slic3r::GUI::Plater::arrange(), Slic3r::GUI::MenuFactory::HandyModel::arrange_after_import, Slic3r::GUI::MenuFactory::HandyModel::file_names, handy_models(), Slic3r::GUI::MenuFactory::HandyModel::is_stringhell, Slic3r::GUI::Plater::load_files(), load_handy_model(), Slic3r::LoadModel, Slic3r::min_width_top_surface(), Slic3r::DynamicConfig::opt_bool(), Slic3r::ConfigBase::option(), Slic3r::GUI::plater(), Slic3r::GUI::Job::PREPARE_STATE_DEFAULT, Slic3r::resources_dir(), Slic3r::DynamicConfig::set_key_value(), Slic3r::GUI::Plater::set_prepare_state(), Slic3r::GUI::DPIAware< P >::ShowModal(), and Slic3r::Preset::TYPE_PRINT.

Referenced by append_submenu_add_handy_model(), Slic3r::GUI::anonymous_namespace{NativeCommands.cpp}::build_command_catalog(), load_handy_model(), and Slic3r::GUI::run_scene_benchmark().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ msw_rescale()

void Slic3r::GUI::MenuFactory::msw_rescale ( )
2779{
2780 for (MenuWithSeparators* menu : { &m_object_menu, &m_sla_object_menu, &m_part_menu, &m_default_menu })
2781 msw_rescale_menu(dynamic_cast<wxMenu*>(menu));
2782}
void msw_rescale_menu(wxMenu *)
Definition wxExtensions.hpp:33

References m_default_menu, m_object_menu, m_part_menu, m_sla_object_menu, msw_rescale(), and msw_rescale_menu().

Referenced by msw_rescale().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ multi_selection_menu()

wxMenu * Slic3r::GUI::MenuFactory::multi_selection_menu ( )
2170{
2171 //BBS
2172 wxDataViewItemArray sels;
2173 obj_list()->GetSelections(sels);
2174 bool multi_volume = true;
2175 bool undefined_type = false;
2176 bool all_plates = true;
2177
2178 for (const wxDataViewItem& item : sels) {
2179 Slic3r::GUI::ItemType item_type = list_model()->GetItemType(item);
2180 if ((item_type & itPlate) == 0)
2181 all_plates = false;
2182 multi_volume = item_type & itVolume;
2183 if (!(item_type & (itVolume | itObject | itInstance)))
2184 // show this menu only for Objects(Instances mixed with Objects)/Volumes selection
2185 undefined_type = true;
2186 }
2187
2188 if (all_plates) {
2189 wxMenu* menu = new MenuWithSeparators();
2191 return menu;
2192 }
2193 if (undefined_type)
2194 return nullptr;
2195 wxMenu* menu = new MenuWithSeparators();
2196 if (!multi_volume) {
2197 int index = 0;
2198 if (obj_list()->can_merge_to_multipart_object()) {
2200 menu->AppendSeparator();
2201 index++;
2202 }
2205
2206 auto transform_menu = append_menu_item_transform(menu, true /*multi_selection*/, false /*mirror*/, true /*is_scalable*/);
2207 append_menu_items_convert_unit(transform_menu);
2209 //ORCA switch to sub menus if new items added
2210 //append_menu_item_modify(menu, true /*multi_selection*/, false /*splittable*/, true /*is_mesh*/, false /*mesh_boolean*/);
2212 //append_menu_item_simplify(menu);
2213 menu->AppendSeparator();
2215 menu->AppendSeparator();
2216
2220 menu->AppendSeparator();
2221
2223 menu->AppendSeparator();
2224
2225 // Reload from disk / Replace all with STL / Export STL / Export DRC
2226 append_menu_item_more(menu, true /*multi_selection*/, true /*disk_op*/, true /*export_op*/);
2227 }
2228 else {
2231
2232 //ORCA switch to sub menus if new items added
2233 auto transform_menu = append_menu_item_transform(menu, true /*multi_selection*/, false /*mirror*/, true /*is_scalable*/);
2235 append_menu_item_modify(menu, true /*multi_selection*/, true /*splittable*/, true /*is_mesh*/, false /*mesh_boolean*/);
2236 //append_menu_item_drop(menu);
2237 //append_menu_item_fix_through_cgal(menu);
2238 append_menu_items_convert_unit(transform_menu);
2239 //append_menu_item_simplify(menu);
2240 menu->AppendSeparator();
2242 menu->AppendSeparator();
2243
2246 // Subtype picker for Precise Seam — shown only when all selected volumes are PS.
2247 // Must be paired with Change Type here (as in single-volume part_menu), otherwise
2248 // the user cannot switch PS subtypes (LEFT/RIGHT/etc.) on multi-selection.
2249 append_menu_item_precise_seam_submenu(menu); // inserts itself right after "Change Type"
2251 menu->AppendSeparator();
2252
2254 menu->AppendSeparator();
2255
2256 // Reload from disk / Replace all with STL
2257 append_menu_item_more(menu, true /*multi_selection*/, true /*disk_op*/, false /*export_op*/);
2258 }
2259 return menu;
2260}
void append_menu_item_merge_to_multipart_object(wxMenu *menu)
Definition GUI_Factories.cpp:1336
void append_menu_items_convert_unit(wxMenu *menu)
Definition GUI_Factories.cpp:1280
void append_menu_item_set_auto_drop(wxMenu *menu)
Definition GUI_Factories.cpp:2649
void append_menu_item_precise_seam_submenu(wxMenu *menu)
Definition GUI_Factories.cpp:1442
void append_menu_item_set_printable(wxMenu *menu)
Definition GUI_Factories.cpp:2619
void append_menu_item_change_filament(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:2532
ItemType GetItemType(const wxDataViewItem &item) const
Definition ObjectDataViewModel.cpp:2148
@ itPlate
Definition ObjectDataViewModel.hpp:36

References append_menu_item_align_distribute(), append_menu_item_center(), append_menu_item_change_filament(), append_menu_item_change_type(), append_menu_item_delete(), append_menu_item_drop(), append_menu_item_fix_through_cgal(), append_menu_item_merge_to_multipart_object(), append_menu_item_modify(), append_menu_item_more(), append_menu_item_per_object_process(), append_menu_item_precise_seam_submenu(), append_menu_item_replace_all_with_stl(), append_menu_item_set_auto_drop(), append_menu_item_set_printable(), append_menu_item_transform(), append_menu_items_convert_unit(), Slic3r::GUI::itInstance, Slic3r::GUI::itObject, Slic3r::GUI::itPlate, Slic3r::GUI::itVolume, Slic3r::GUI::list_model(), multi_selection_menu(), and Slic3r::GUI::obj_list().

Referenced by multi_selection_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ object_menu()

wxMenu * Slic3r::GUI::MenuFactory::object_menu ( )
2102{
2104
2105 // GEOMETRY
2106 append_menu_item_invalidate_cut_info(&m_object_menu, 0); // inserts itself to top of menu
2107 append_menu_item_edit_text( &m_object_menu, 0); // inserts itself to top of menu
2108 append_menu_item_edit_svg( &m_object_menu, 0); // inserts itself to top of menu
2109
2110 // PROPS > Place items above printable
2111 size_t props_pos = FindPositionById(&m_object_menu, m_object_props_marker); // stored positions not works as expected since menu has multiple dynamic sections
2114
2115 return &m_object_menu;
2116}
void append_menu_items_flush_options(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:1195
void append_menu_item_invalidate_cut_info(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:1660

References append_menu_item_change_filament(), append_menu_item_edit_svg(), append_menu_item_edit_text(), append_menu_item_invalidate_cut_info(), append_menu_items_convert_unit(), append_menu_items_flush_options(), FindPositionById(), m_object_menu, m_object_props_marker, m_object_transform_menu, and object_menu().

Referenced by object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ part_menu()

wxMenu * Slic3r::GUI::MenuFactory::part_menu ( )

References append_menu_item_change_filament(), append_menu_item_per_object_settings(), append_menu_item_precise_seam_submenu(), append_menu_items_convert_unit(), FindPositionById(), m_part_menu, m_part_project_marker, m_part_props_marker, m_part_transform_menu, and part_menu().

Referenced by part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ plate_menu()

wxMenu * Slic3r::GUI::MenuFactory::plate_menu ( )
2311{
2315 return &m_plate_menu;
2316}
void append_menu_item_locked(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:2672
void append_menu_item_plate_delete(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:2737
void append_menu_item_plate_name(wxMenu *menu, size_t pos=-1)
Definition GUI_Factories.cpp:2701

References append_menu_item_locked(), append_menu_item_plate_delete(), append_menu_item_plate_name(), m_plate_menu, m_plate_mods_pos, and plate_menu().

Referenced by plate_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sla_object_menu()

wxMenu * Slic3r::GUI::MenuFactory::sla_object_menu ( )
2119{
2122 //update_menu_items_instance_manipulation(mtObjectSLA);
2123 append_menu_item_edit_text(&m_sla_object_menu, 0); // inserts itself to top of menu
2124 append_menu_item_edit_svg(&m_sla_object_menu, 0); // inserts itself to top of menu
2125
2126 return &m_sla_object_menu;
2127}

References append_menu_item_edit_svg(), append_menu_item_edit_text(), append_menu_item_settings(), append_menu_items_convert_unit(), m_sla_object_menu, and sla_object_menu().

Referenced by sla_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ svg_part_menu()

wxMenu * Slic3r::GUI::MenuFactory::svg_part_menu ( )

References append_menu_item_change_filament(), append_menu_item_per_object_settings(), FindPositionById(), m_svg_part_menu, m_svg_project_marker, m_svg_props_marker, and svg_part_menu().

Referenced by svg_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sys_color_changed() [1/2]

void Slic3r::GUI::MenuFactory::sys_color_changed ( )
2811{
2812 for (MenuWithSeparators* menu : { &m_object_menu, &m_sla_object_menu, &m_part_menu, &m_default_menu }) {
2813 msw_rescale_menu(dynamic_cast<wxMenu*>(menu));// msw_rescale_menu updates just icons, so use it
2814#ifdef _WIN32
2815 // but under MSW we have to update item's bachground color
2816 for (wxMenuItem* item : menu->GetMenuItems())
2817 update_menu_item_def_colors(item);
2818#endif
2819 }
2820}

References m_default_menu, m_object_menu, m_part_menu, m_sla_object_menu, msw_rescale_menu(), and sys_color_changed().

Referenced by Slic3r::GUI::MainFrame::on_sys_color_changed(), sys_color_changed(), and sys_color_changed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ sys_color_changed() [2/2]

void Slic3r::GUI::MenuFactory::sys_color_changed ( wxMenuBar * menu_bar)
static
2823{
2824 // BBS: fix
2825#if 0
2826 for (size_t id = 0; id < menubar->GetMenuCount(); id++) {
2827 wxMenu* menu = menubar->GetMenu(id);
2828 msw_rescale_menu(menu);
2829#ifdef _WIN32
2830 // but under MSW we have to update item's bachground color
2831 for (wxMenuItem* item : menu->GetMenuItems())
2832 update_menu_item_def_colors(item);
2833#endif
2834 }
2835 menubar->Refresh();
2836#endif
2837}

References msw_rescale_menu(), and sys_color_changed().

Here is the call graph for this function:

◆ text_part_menu()

wxMenu * Slic3r::GUI::MenuFactory::text_part_menu ( )

References append_menu_item_change_filament(), append_menu_item_per_object_settings(), FindPositionById(), m_text_part_menu, m_text_project_marker, m_text_props_marker, and text_part_menu().

Referenced by text_part_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update()

void Slic3r::GUI::MenuFactory::update ( )
2091{
2094}
void update_default_menu()
Definition GUI_Factories.cpp:2768
void update_object_menu()
Definition GUI_Factories.cpp:2763

References update(), update_default_menu(), and update_object_menu().

Referenced by update().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_default_menu()

void Slic3r::GUI::MenuFactory::update_default_menu ( )
2769{
2770 for (auto& name : { _L("Add Primitive") , _L("Add Handy models"), _L("Show Labels") }) {
2771 const auto menu_item_id = m_default_menu.FindItem(name);
2772 if (menu_item_id != wxNOT_FOUND)
2773 m_default_menu.Destroy(menu_item_id);
2774 }
2776}

References _L, create_default_menu(), m_default_menu, and update_default_menu().

Referenced by update(), and update_default_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_object_menu()

void Slic3r::GUI::MenuFactory::update_object_menu ( )

References append_menu_items_add_volume(), m_object_menu, and update_object_menu().

Referenced by update(), and update_object_menu().

Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ items_decrease

std::array<wxMenuItem*, mtCount> Slic3r::GUI::MenuFactory::items_decrease
private

◆ items_increase

std::array<wxMenuItem*, mtCount> Slic3r::GUI::MenuFactory::items_increase
private

◆ items_set_number_of_copies

std::array<wxMenuItem*, mtCount> Slic3r::GUI::MenuFactory::items_set_number_of_copies
private

◆ m_assemble_object_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_assemble_object_menu
private

◆ m_assemble_part_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_assemble_part_menu
private

◆ m_default_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_default_menu
private

◆ m_filament_action_menu

wxMenu Slic3r::GUI::MenuFactory::m_filament_action_menu
private

◆ m_instance_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_instance_menu
private

Referenced by init(), and instance_menu().

◆ m_object_geometry_pos

size_t Slic3r::GUI::MenuFactory::m_object_geometry_pos
private

◆ m_object_menu

◆ m_object_props_marker

int Slic3r::GUI::MenuFactory::m_object_props_marker
private

◆ m_object_transform_menu

wxMenu* Slic3r::GUI::MenuFactory::m_object_transform_menu
private

◆ m_parent

wxWindow* Slic3r::GUI::MenuFactory::m_parent {nullptr}
private
109{nullptr};

Referenced by append_menu_item_align_distribute(), append_menu_item_auto_drop(), append_menu_item_center(), append_menu_item_change_extruder(), append_menu_item_change_filament(), append_menu_item_change_type(), append_menu_item_clone(), append_menu_item_delete(), append_menu_item_drop(), append_menu_item_edit_svg(), append_menu_item_edit_text(), append_menu_item_export_drc(), append_menu_item_export_stl(), append_menu_item_fill_bed(), append_menu_item_instance_to_object(), append_menu_item_invalidate_cut_info(), append_menu_item_layers_editing(), append_menu_item_locked(), append_menu_item_merge_to_multipart_object(), append_menu_item_merge_to_single_object(), append_menu_item_modify(), append_menu_item_more(), append_menu_item_per_object_process(), append_menu_item_per_object_settings(), append_menu_item_plate_delete(), append_menu_item_plate_name(), append_menu_item_precise_seam_submenu(), append_menu_item_printable(), append_menu_item_reload_from_disk(), append_menu_item_replace_all_with_stl(), append_menu_item_replace_with_stl(), append_menu_item_set_auto_drop(), append_menu_item_set_printable(), append_menu_item_set_visible(), append_menu_item_simplify(), append_menu_item_smooth_mesh(), append_menu_item_transform(), append_menu_items_add_volume(), append_menu_items_convert_unit(), append_menu_items_flush_options(), append_menu_items_instance_manipulation(), create_default_menu(), create_extra_object_menu(), create_filament_action_menu(), create_plate_menu(), and init().

◆ m_part_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_part_menu
private

◆ m_part_project_marker

int Slic3r::GUI::MenuFactory::m_part_project_marker
private

Referenced by create_bbl_part_menu(), and part_menu().

◆ m_part_props_marker

int Slic3r::GUI::MenuFactory::m_part_props_marker
private

Referenced by create_bbl_part_menu(), and part_menu().

◆ m_part_transform_menu

wxMenu* Slic3r::GUI::MenuFactory::m_part_transform_menu
private

Referenced by create_bbl_part_menu(), and part_menu().

◆ m_plate_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_plate_menu
private

Referenced by create_plate_menu(), and plate_menu().

◆ m_plate_mods_pos

size_t Slic3r::GUI::MenuFactory::m_plate_mods_pos
private

Referenced by create_plate_menu(), and plate_menu().

◆ m_sla_object_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_sla_object_menu
private

◆ m_svg_part_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_svg_part_menu
private

◆ m_svg_project_marker

int Slic3r::GUI::MenuFactory::m_svg_project_marker
private

◆ m_svg_props_marker

int Slic3r::GUI::MenuFactory::m_svg_props_marker
private

◆ m_text_part_menu

MenuWithSeparators Slic3r::GUI::MenuFactory::m_text_part_menu
private

◆ m_text_project_marker

int Slic3r::GUI::MenuFactory::m_text_project_marker
private

◆ m_text_props_marker

int Slic3r::GUI::MenuFactory::m_text_props_marker
private

The documentation for this class was generated from the following files: