159{
160 std::vector<NativeCommand> out;
161
162
163 auto add = [&](std::string key, std::string title, std::string group, std::function<
AppActionRunResult(
const std::string&)> runner,
164 std::string input = {}, std::string icon = {}) {
165 out.push_back({std::move(key), std::move(title), std::move(group), std::move(input), std::move(icon), std::move(runner)});
166 };
167
168 auto add_with_icon = [&](std::string key, std::string title, std::string group, std::string icon,
169 std::function<AppActionRunResult(const std::string&)> runner, std::string input = {}) {
170 add(std::move(key), std::move(title), std::move(group), std::move(runner), std::move(input), std::move(icon));
171 };
172
173
174 add_with_icon(
"slice_and_preview",
L(
"Slice and Preview"),
L(
"Slice & Export"),
"media_play", [](
const std::string&) {
179 if (MainFrame* mf = wxGetApp().mainframe; mf)
181 }
183 });
184
185 add_with_icon(
186 "go_to_layer",
L(
"Go to layer (percent)"),
L(
"Commands"),
"height_range_layer",
187 [](const std::string& param) {
191 if (MainFrame* mf = wxGetApp().mainframe; mf)
194 }
196 },
197 "percent");
198
199
200
202 "go_to_tab",
L(
"Go to tab..."),
L(
"Commands"),
203 [](const std::string& param) {
204 if (MainFrame* mf = wxGetApp().mainframe; mf && !param.empty())
205 mf->select_tab(
from_u8(param));
207 },
208 "tab");
209
210 add_with_icon(
"load_project",
L(
"Load Project"),
L(
"Commands"),
"menu_open", [](
const std::string&) {
214 });
215 add_with_icon(
"save_project",
L(
"Save Project"),
L(
"Commands"),
"menu_save", [](
const std::string&) {
219 });
220 add_with_icon(
"save_project_as",
L(
"Save Project As"),
L(
"Commands"),
"menu_save", [](
const std::string&) {
224 });
225 add_with_icon(
"open_preferences",
L(
"Preferences"),
L(
"Commands"),
"cog", [](
const std::string&) {
226 wxGetApp().open_preferences();
228 });
229
230
231 add_with_icon(
"mode_simple",
L(
"Mode: Simple"),
L(
"Mode"),
"advanced", [](
const std::string&) {
234 });
235 add_with_icon(
"mode_advanced",
L(
"Mode: Advanced"),
L(
"Mode"),
"advanced", [](
const std::string&) {
238 });
239 add_with_icon(
"mode_expert",
L(
"Mode: Expert"),
L(
"Mode"),
"advanced", [](
const std::string&) {
242 });
243
244 add_with_icon(
"toggle_developer_mode",
L(
"Toggle Developer Mode"),
L(
"Mode"),
"advanced", [](
const std::string&) {
245 GUI_App& app = wxGetApp();
246 const bool on = !app.app_config->get_bool("developer_mode");
247 app.app_config->set_bool("developer_mode", on);
248 app.app_config->save();
249 app.update_mode();
251 });
252
253
254 add_with_icon(
"export_gcode",
L(
"Export G-code"),
L(
"Slice & Export"),
"custom-gcode_gcode", [](
const std::string&) {
258 });
259 add_with_icon(
"export_stl",
L(
"Export STL"),
L(
"Slice & Export"),
"save", [](
const std::string&) {
263 });
264 add_with_icon(
"export_3mf",
L(
"Export 3MF"),
L(
"Slice & Export"),
"menu_save", [](
const std::string&) {
268 });
269 add_with_icon(
"export_sliced_file",
L(
"Export Sliced File"),
L(
"Slice & Export"),
"save", [](
const std::string&) {
273 });
274 add_with_icon(
"export_all_sliced_file",
L(
"Export All Sliced Files"),
L(
"Slice & Export"),
"save", [](
const std::string&) {
278 });
279
280
281
282
283 add_with_icon(
"calib_temperature",
L(
"Temperature Calibration"),
L(
"Calibration"),
"param_temperature",
285 add_with_icon(
"calib_max_volumetric",
L(
"Max Volumetric Speed Calibration"),
L(
"Calibration"),
"param_volumetric_speed",
287 add_with_icon(
"calib_pressure_advance",
L(
"Pressure Advance Calibration"),
L(
"Calibration"),
"param_flow_ratio_and_pressure_advance",
289 add_with_icon(
"calib_flow_ratio",
L(
"Flow Ratio Calibration"),
L(
"Calibration"),
"param_flow_ratio_and_pressure_advance",
291 add_with_icon(
"calib_retraction",
L(
"Retraction Calibration"),
L(
"Calibration"),
"param_retraction",
293 add_with_icon(
"calib_cornering",
L(
"Cornering Calibration"),
L(
"Calibration"),
"param_precision",
295 add_with_icon(
"calib_input_shaping_freq",
L(
"Input Shaping Frequency Calibration"),
L(
"Calibration"),
"param_resonance_avoidance",
297 add_with_icon(
"calib_input_shaping_damp",
L(
"Input Shaping Damping Calibration"),
L(
"Calibration"),
"param_resonance_avoidance",
299 add_with_icon(
"calib_vfa",
L(
"VFA Calibration"),
L(
"Calibration"),
"param_speed", [](
const std::string&) {
return calib_command(
CalibKind::VFA); });
300
301
302
303 for (auto [key, dir, title] :
304 std::initializer_list<std::tuple<const char*, const char*, std::string>>{{
"view_top",
"top",
L(
"View: Top")},
305 {
"view_bottom",
"bottom",
L(
"View: Bottom")},
306 {
"view_front",
"front",
L(
"View: Front")},
307 {
"view_rear",
"rear",
L(
"View: Rear")},
308 {
"view_left",
"left",
L(
"View: Left")},
309 {
"view_right",
"right",
L(
"View: Right")},
310 {
"view_iso",
"iso",
L(
"View: Isometric")}}) {
311 std::string k = key, d = dir;
312 add(k, title,
L(
"View"),
314 }
315 add(
"view_default",
L(
"View: Default"),
L(
"View"), [](
const std::string&) {
320 canvas->zoom_to_bed();
321 }
323 });
324 add(
"view_fit_bed",
L(
"Fit Bed to View"),
L(
"View"), [](
const std::string&) {
327 canvas->zoom_to_bed();
329 });
330 add(
"view_toggle_perspective",
L(
"Toggle Perspective"),
L(
"View"), [](
const std::string&) {
334 });
335 add_with_icon(
"reset_window_layout",
L(
"Reset Window Layout"),
L(
"View"),
"toolbar_reset", [](
const std::string&) {
339 });
340
341
342 add_with_icon(
"obj_delete",
L(
"Delete Selected"),
L(
"Object"),
"delete", [](
const std::string&) {
343 return object_op(wxGetApp().
plater(), [](
Plater* p) {
return !p->is_selection_empty(); }, [](
Plater* p) { p->remove_selected(); });
344 });
345 add_with_icon(
"obj_delete_all",
L(
"Delete All Objects"),
L(
"Object"),
"delete", [](
const std::string&) {
347 wxGetApp().
plater(), [](
Plater* p) {
return p->can_delete_all(); }, [](
Plater* p) { p->delete_all_objects_from_model(); });
348 });
349 add_with_icon(
"obj_mirror_x",
L(
"Mirror X"),
L(
"Object"),
"menu_mirror_x", [](
const std::string&) {
351 });
352 add_with_icon(
"obj_mirror_y",
L(
"Mirror Y"),
L(
"Object"),
"menu_mirror_y", [](
const std::string&) {
354 });
355 add_with_icon(
"obj_mirror_z",
L(
"Mirror Z"),
L(
"Object"),
"menu_mirror_z", [](
const std::string&) {
357 });
358 add_with_icon(
"obj_split_objects",
L(
"Split to Objects"),
L(
"Object"),
"menu_split_objects", [](
const std::string&) {
359 return object_op(wxGetApp().
plater(), [](
Plater* p) {
return p->can_split_to_objects(); }, [](
Plater* p) { p->split_object(
true); });
360 });
361 add_with_icon(
"obj_split_parts",
L(
"Split to Parts"),
L(
"Object"),
"menu_split_parts", [](
const std::string&) {
363 });
364 add(
"obj_center",
L(
"Center Selected on Plate"),
L(
"Object"), [](
const std::string&) {
365 return object_op(wxGetApp().
plater(), [](
Plater* p) {
return !p->is_selection_empty(); }, [](
Plater* p) { p->center_selection(); });
366 });
367 add_with_icon(
"obj_drop",
L(
"Drop to Bed"),
L(
"Object"),
"toolbar_flatten", [](
const std::string&) {
368 return object_op(wxGetApp().
plater(), [](
Plater* p) {
return p->get_selection().can_drop(); }, [](
Plater* p) { p->drop_selection(); });
369 });
370 add(
"obj_fit_volume",
L(
"Scale to Fit Print Volume"),
L(
"Object"), [](
const std::string&) {
372 wxGetApp().
plater(), [](
Plater* p) {
return p->can_scale_to_print_volume(); },
373 [](
Plater* p) { p->scale_selection_to_fit_print_volume(); });
374 });
375 add_with_icon(
"obj_instances_up",
L(
"Increase Instances"),
L(
"Object"),
"instance_add", [](
const std::string&) {
377 wxGetApp().
plater(), [](
Plater* p) {
return p->can_increase_instances(); }, [](
Plater* p) { p->increase_instances(); });
378 });
379 add_with_icon(
"obj_instances_down",
L(
"Decrease Instances"),
L(
"Object"),
"instance_remove", [](
const std::string&) {
381 wxGetApp().
plater(), [](
Plater* p) {
return p->can_decrease_instances(); }, [](
Plater* p) { p->decrease_instances(); });
382 });
383 add_with_icon(
"obj_arrange",
L(
"Auto-Arrange"),
L(
"Object"),
"toolbar_arrange", [](
const std::string&) {
385 });
386 add_with_icon(
"obj_orient",
L(
"Auto-Orient"),
L(
"Object"),
"toolbar_orient", [](
const std::string&) {
388 });
389
390
391 auto add_primitive = [&](std::string key, std::string title, std::string icon, const char* type_name) {
392 add_with_icon(std::move(key), std::move(title),
L(
"Add Primitive"), std::move(icon), [type_name](
const std::string&) {
398 }
400 });
401 };
402 add_primitive(
"add_primitive_cube",
L(
"Cube"),
"menu_obj_cube",
"Cube");
403 add_primitive(
"add_primitive_cylinder",
L(
"Cylinder"),
"menu_obj_cylinder",
"Cylinder");
404 add_primitive(
"add_primitive_sphere",
L(
"Sphere"),
"menu_obj_sphere",
"Sphere");
405 add_primitive(
"add_primitive_cone",
L(
"Cone"),
"menu_obj_cone",
"Cone");
406 add_primitive(
"add_primitive_disc",
L(
"Disc"),
"menu_obj_disc",
"Disc");
407 add_primitive(
"add_primitive_torus",
L(
"Torus"),
"menu_obj_torus",
"Torus");
408 add_with_icon(
"add_primitive_text",
L(
"Text"),
L(
"Add Primitive"),
"menu_obj_text", [](
const std::string&) {
413 canvas->clear_popup_menu_position();
415 }
417 });
418 add_with_icon(
"add_primitive_svg",
L(
"SVG"),
L(
"Add Primitive"),
"menu_obj_svg", [](
const std::string&) {
423 canvas->clear_popup_menu_position();
425 }
427 });
428
429
431 for (std::size_t i = 0; i < handy.size(); ++i) {
432 add(
"add_handy_" + std::string(handy[i].key), handy[i].label,
L(
"Add Handy models"),
433 [i](const std::string&) {
438 });
439 }
440
441
442 add_with_icon(
"plate_add",
L(
"Add Plate"),
L(
"Plate"),
"toolbar_add_plate", [](
const std::string&) {
450 });
451 add_with_icon(
"plate_duplicate",
L(
"Duplicate Plate"),
L(
"Plate"),
"menu_copy", [](
const std::string&) {
459 });
460 add_with_icon(
"plate_delete",
L(
"Delete Plate"),
L(
"Plate"),
"delete", [](
const std::string&) {
468 });
469 add_with_icon(
"plate_rename",
L(
"Rename Plate"),
L(
"Plate"),
"plate_name_edit", [](
const std::string&) {
474 PlateNameEditDialog dlg((wxWindow*) wxGetApp().mainframe, wxID_ANY,
_L(
"Edit Plate Name"));
475 dlg.set_plate_name(
from_u8(curr->get_plate_name()));
476 if (dlg.ShowModal() == wxID_YES)
477 curr->set_plate_name(dlg.get_plate_name().ToUTF8().data());
479 });
480 add_with_icon(
"plate_toggle_lock",
L(
"Toggle Plate Lock"),
L(
"Plate"),
"lock_normal", [](
const std::string&) {
487 plates.lock_plate(index, !plates.is_locked(index));
489 });
490 add_with_icon(
"plate_goto",
L(
"Go to Plate"),
L(
"Plate"),
"go_next_plate", [](
const std::string& param) {
498 int index = 0;
499 try {
500 index = std::stoi(param);
501 } catch (const std::exception&) {}
502 index = std::clamp(index, 0,
count - 1);
505 });
506
507
508 add_with_icon(
"sync_ams",
L(
"Synchronize Filament List from AMS"),
L(
"Printer"),
"ams_fila_sync", [](
const std::string&) {
510 DeviceManager* dev = wxGetApp().getDeviceManager();
511 if (dev && dev->get_selected_machine() &&
plater) {
514 }
516 });
517
518
519 add_with_icon(
"preset_bundle",
L(
"Open Preset Bundle"),
L(
"Presets"),
"menu_edit_preset", [](
const std::string&) {
520 wxGetApp().open_presetbundledialog();
522 });
523 add_with_icon(
"sync_presets",
L(
"Sync Presets"),
L(
"Presets"),
"printer_sync_ok", [](
const std::string&) {
524 if (!wxGetApp().is_user_login())
526 wxGetApp().restart_sync_user_preset();
528 });
529
530
531 add_with_icon(
"import_file",
L(
"Import 3MF/STL/STEP/SVG/OBJ/AMF"),
L(
"Import"),
"menu_open", [](
const std::string&) {
533#ifdef __APPLE__
535#else
537#endif
538 }
540 });
541 add_with_icon(
"import_zip_archive",
L(
"Import ZIP Archive"),
L(
"Import"),
"menu_open", [](
const std::string&) {
545 });
546 add_with_icon(
"import_configs",
L(
"Import Configs"),
L(
"Import"),
"menu_open", [](
const std::string&) {
547 if (MainFrame* mf = wxGetApp().mainframe)
548 mf->load_config_file();
550 });
551
552
553 add_with_icon(
"export_stl_multi",
L(
"Export All Objects as STLs"),
L(
"Export"),
"save", [](
const std::string&) {
557 });
558 add_with_icon(
"export_drc_single",
L(
"Export All Objects as DRC (one file)"),
L(
"Export"),
"save", [](
const std::string&) {
562 });
563 add_with_icon(
"export_drc_multi",
L(
"Export All Objects as DRCs"),
L(
"Export"),
"save", [](
const std::string&) {
567 });
568 add_with_icon(
"export_toolpaths_obj",
L(
"Export Toolpaths as OBJ"),
L(
"Export"),
"custom-gcode_gcode", [](
const std::string&) {
572 });
573 add_with_icon(
"export_config",
L(
"Export Preset Bundle"),
L(
"Export"),
"save", [](
const std::string&) {
574 if (MainFrame* mf = wxGetApp().mainframe)
575 mf->export_config();
577 });
578
579
580 add(
"help_keyboard_shortcuts",
L(
"Keyboard Shortcuts"),
L(
"Help"), [](
const std::string&) {
583 });
584 add(
"help_setup_wizard",
L(
"Setup Wizard"),
L(
"Help"), [](
const std::string&) {
585 wxGetApp().ShowUserGuide();
587 });
588 add_with_icon(
"help_open_config_folder",
L(
"Show Configuration Folder"),
L(
"Help"),
"open_project", [](
const std::string&) {
591 });
592 add(
"help_migrate_filament_presets",
L(
"Migrate Filament Presets"),
L(
"Help"), [](
const std::string&) {
593 wxGetApp().check_legacy_user_filament_presets(true);
595 });
596 add(
"help_troubleshoot",
L(
"Troubleshoot Center"),
L(
"Help"), [](
const std::string&) {
597 wxGetApp().troubleshoot();
599 });
600 add(
"help_network_test",
L(
"Open Network Test"),
L(
"Help"), [](
const std::string&) {
601 NetworkTestDialog dlg(wxGetApp().mainframe);
602 dlg.ShowModal();
604 });
605 add(
"help_benchmark_3d_scene",
L(
"Benchmark 3D Scene"),
L(
"Help"), [](
const std::string&) {
608 });
609 add_with_icon(
"help_tip_of_the_day",
L(
"Show Tip of the Day"),
L(
"Help"),
"info", [](
const std::string&) {
613 canvas->set_as_dirty();
614 }
616 });
617 add_with_icon(
"help_check_updates",
L(
"Check for Updates"),
L(
"Help"),
"refresh", [](
const std::string&) {
618 wxGetApp().check_new_version_sf(true, 1);
620 });
621 add_with_icon(
"help_about",
L(
"About OrcaSlicer"),
L(
"Help"),
"OrcaSlicer_gradient_circle", [](
const std::string&) {
624 });
625 add_with_icon(
"open_wiki",
L(
"Open Wiki"),
L(
"Help"),
"link_wiki_img", [](
const std::string&) {
626 wxLaunchDefaultBrowser("https://www.orcaslicer.com/wiki/", wxBROWSER_NEW_WINDOW);
628 });
629 add(
"open_youtube",
L(
"Open YouTube Channel"),
L(
"Help"), [](
const std::string&) {
630 wxLaunchDefaultBrowser("https://www.youtube.com/@OfficialOrcaSlicer/videos", wxBROWSER_NEW_WINDOW);
632 });
633
634
635 add(
"open_plugins",
L(
"Open Plugins"),
L(
"Plugins"), [](
const std::string&) {
636 wxGetApp().open_plugins_dialog();
638 });
639 add(
"refresh_plugins",
L(
"Refresh Plugins"),
L(
"Plugins"), [](
const std::string&) {
640 wxGetApp().refresh_plugins();
642 });
643 add(
"install_plugin",
L(
"Install Plugin"),
L(
"Plugins"), [](
const std::string&) {
646 });
647 add(
"install_local_plugin",
L(
"Install Local Plugin"),
L(
"Plugins"), [](
const std::string&) {
648 wxGetApp().install_local_plugin();
650 });
651
652 return out;
653}
static unsigned int count
Definition AuxiliaryDataViewModel.cpp:246
#define L(s)
Definition ExtrusionEntity.cpp:25
#define TAB_ID_PREVIEW
Definition MainFrame.hpp:61
#define _L(s)
Definition OBJ.cpp:34
void open()
Definition DailyTips.cpp:579
PartPlate * get_curr_plate()
Definition PartPlate.hpp:962
int get_curr_plate_index() const
Definition PartPlate.hpp:961
int get_plate_count() const
Definition PartPlate.cpp:7042
int duplicate_plate(int plate_index=-1)
Definition Plater.cpp:23538
bool can_delete_plate() const
Definition Plater.cpp:23883
void reslice()
Definition Plater.cpp:20752
int save_project(bool saveAs=false)
Definition Plater.cpp:16296
void add_file()
Definition Plater.cpp:18989
int select_plate(int plate_index, bool need_slice=false)
Definition Plater.cpp:22612
GLCanvas3D * get_current_canvas3D(bool exclude_preview=false)
Definition Plater.cpp:22126
PartPlateList & get_partplate_list()
Definition Plater.cpp:22578
void take_snapshot(const std::string &snapshot_name)
Definition Plater.cpp:21281
void export_gcode_3mf(bool export_all=false)
Definition Plater.cpp:19599
bool add_model(bool imperial_units=false, std::string fname="")
Definition Plater.cpp:16628
int add_plate()
Definition Plater.cpp:23521
int delete_plate(int plate_index=-1)
Definition Plater.cpp:23552
void export_core_3mf()
Definition Plater.cpp:19721
const Camera & get_camera() const
Definition Plater.cpp:22567
Sidebar & sidebar()
Definition Plater.cpp:16046
void export_stl(bool extended=false, bool selection_only=false, bool multi_stls=false, FileType file_type=FT_STL)
Definition Plater.cpp:20053
void load_project(wxString const &filename="", wxString const &originfile="-")
Definition Plater.cpp:16144
void reset_window_layout()
Definition Plater.cpp:19154
GLCanvas3D * canvas3D()
Definition Plater.cpp:22070
void export_gcode(bool prefer_removable)
Definition Plater.cpp:19493
void select_view(const std::string &direction)
Definition Plater.cpp:19116
void import_zip_archive()
Definition Plater.cpp:18109
bool can_add_plate() const
Definition Plater.cpp:23882
DailyTipsWindow * get_dailytips() const
Definition Plater.cpp:23858
void select_view_3D(const std::string &name, bool no_slice=true)
Definition Plater.cpp:19119
void export_toolpaths_to_obj() const
Definition Plater.cpp:20722
void ensure_3d_view(Plater *plater)
Definition NativeCommands.cpp:57
AppActionRunResult view_command(Plater *plater, const std::string &dir)
Definition NativeCommands.cpp:114
void go_to_layer(Plater *plater, const std::string ¶m)
Definition NativeCommands.cpp:82
AppActionRunResult plate_unavailable()
Definition NativeCommands.cpp:53
AppActionRunResult calib_command(CalibKind kind)
Definition NativeCommands.cpp:123
bool is_fff_plater(Plater *plater)
Definition NativeCommands.cpp:51
AppActionRunResult object_op(Plater *plater, bool(*ok)(Plater *), void(*op)(Plater *))
Definition NativeCommands.cpp:68
void about()
Definition GUI.cpp:574
@ Cornering
Definition MainFrame.hpp:140
@ MaxVolumetric
Definition MainFrame.hpp:136
@ VFA
Definition MainFrame.hpp:143
@ InputShapingFreq
Definition MainFrame.hpp:141
@ FlowRatio
Definition MainFrame.hpp:138
@ PressureAdvance
Definition MainFrame.hpp:137
@ InputShapingDamp
Definition MainFrame.hpp:142
@ Retraction
Definition MainFrame.hpp:139
@ Temperature
Definition MainFrame.hpp:135
void open_plugin_hub()
Definition PluginsDialog.cpp:468
static ObjectList * obj_list()
Definition GUI_Factories.cpp:405
static Plater * plater()
Definition GUI_Factories.cpp:400
@ FT_DRC
Definition GUI_App.hpp:139
void desktop_open_datadir_folder()
Definition GUI.cpp:580
void run_scene_benchmark()
Definition SceneBenchmark.cpp:547
@ ObjectList
Definition Shortcuts.hpp:21
@ Global
Definition Shortcuts.hpp:21
@ Plater
Definition Shortcuts.hpp:21
wxString from_u8(const std::string &str)
Definition GUI.cpp:544
SpiralVase::SpiralPoint add(SpiralVase::SpiralPoint a, SpiralVase::SpiralPoint b)
Definition SpiralVase.cpp:26
@ comSimple
Definition Config.hpp:222
@ comAdvanced
Definition Config.hpp:223
@ comExpert
Definition Config.hpp:224
@ INVALID
Definition Model.hpp:356
@ Y
Definition libslic3r.h:142
@ Z
Definition libslic3r.h:143
@ X
Definition libslic3r.h:141
Definition ActionRegistry.hpp:30
@ Info
Definition ActionRegistry.hpp:31
@ Success
Definition ActionRegistry.hpp:31
void select_next_type()
Definition Camera.cpp:62