mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-23 10:52:15 +00:00
Merge branch 'main' into zaa
This commit is contained in:
@@ -21,7 +21,6 @@
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
#include "slic3r/GUI/Tab.hpp"
|
||||
#include "slic3r/Utils/FixModelByWin10.hpp"
|
||||
#include "ParamsPanel.hpp"
|
||||
#include "MsgDialog.hpp"
|
||||
#include "wx/utils.h"
|
||||
@@ -85,19 +84,18 @@ std::map<std::string, std::vector<SimpleSettingData>> SettingsFactory::OBJECT_C
|
||||
{"xy_hole_compensation", "",5}, {"xy_contour_compensation", "",6}, {"elefant_foot_compensation", "",7},
|
||||
{"make_overhang_printable_angle","", 8},{"make_overhang_printable_hole_size","",9}, {"wall_sequence","",10},
|
||||
{"precise_z_height", "",10}
|
||||
|
||||
}},
|
||||
{ L("Support"), {{"brim_type", "",1},{"brim_width", "",2},{"brim_object_gap", "",3},{"brim_use_efc_outline", "",4},
|
||||
{"enable_support", "",5},{"support_type", "",6},{"support_threshold_angle", "",7}, {"support_threshold_overlap", "",8}, {"support_on_build_plate_only", "",9},
|
||||
{"support_filament", "",10},{"support_interface_filament", "",11},{"support_expansion", "",12},{"support_style", "",13},
|
||||
{"tree_support_brim_width", "",14}, {"tree_support_branch_angle", "",15},{"tree_support_branch_angle_organic","",16}, {"tree_support_wall_count", "",17},{"tree_support_branch_diameter_angle", "",18},//tree support
|
||||
{"support_bottom_z_distance", "",19},{"support_top_z_distance", "",20},{"support_base_pattern", "",21},{"support_base_pattern_spacing", "",22},
|
||||
{"support_interface_top_layers", "",23},{"support_interface_bottom_layers", "",24},{"support_interface_spacing", "",25},{"support_bottom_interface_spacing", "",26},
|
||||
{"support_object_xy_distance", "",27}, {"bridge_no_support", "",28},{"max_bridge_length", "",29},{"support_critical_regions_only", "",30},{"support_remove_small_overhang","",31},
|
||||
{"support_object_first_layer_gap","",32}
|
||||
}},
|
||||
{ L("Support"), {{"brim_type", "",1},{"brim_width", "",2},{"brim_object_gap", "",3},{"brim_flow_ratio", "",4},{"brim_use_efc_outline", "",5},
|
||||
{"enable_support", "",6},{"support_type", "",7},{"support_threshold_angle", "",8}, {"support_threshold_overlap", "",9}, {"support_on_build_plate_only", "",10},
|
||||
{"support_filament", "",11},{"support_interface_filament", "",12},{"support_expansion", "",13},{"support_style", "",14},
|
||||
{"tree_support_brim_width", "",15}, {"tree_support_branch_angle", "",16},{"tree_support_branch_angle_organic","",17}, {"tree_support_wall_count", "",18},{"tree_support_branch_diameter_angle", "",19},//tree support
|
||||
{"support_bottom_z_distance", "",20},{"support_top_z_distance", "",21},{"support_base_pattern", "",22},{"support_base_pattern_spacing", "",23},
|
||||
{"support_interface_top_layers", "",24},{"support_interface_bottom_layers", "",25},{"support_interface_spacing", "",26},{"support_bottom_interface_spacing", "",27},
|
||||
{"support_object_xy_distance", "",28}, {"bridge_no_support", "",29},{"max_bridge_length", "",30},{"support_critical_regions_only", "",31},{"support_remove_small_overhang","",32},
|
||||
{"support_object_first_layer_gap","",33}
|
||||
}},
|
||||
{ L("Speed"), {{"support_speed", "",12}, {"support_interface_speed", "",13}
|
||||
}}
|
||||
}}
|
||||
};
|
||||
|
||||
std::map<std::string, std::vector<SimpleSettingData>> SettingsFactory::PART_CATEGORY_SETTINGS =
|
||||
@@ -820,17 +818,37 @@ wxMenuItem* MenuFactory::append_menu_item_change_type(wxMenu* menu)
|
||||
|
||||
// Update checkmark dynamically when menu is shown - check all selected volumes
|
||||
m_parent->Bind(wxEVT_UPDATE_UI, [type = info.type](wxUpdateUIEvent& evt) {
|
||||
auto model = obj_list()->GetModel();
|
||||
auto objs = obj_list()->objects();
|
||||
bool has_type = false;
|
||||
wxDataViewItemArray sels;
|
||||
obj_list()->GetSelections(sels);
|
||||
for (auto item : sels) {
|
||||
ModelVolumeType vol_type = obj_list()->GetModel()->GetVolumeType(item);
|
||||
ModelVolumeType vol_type = model->GetVolumeType(item);
|
||||
if (vol_type == type) {
|
||||
has_type = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
evt.Check(has_type);
|
||||
|
||||
// ORCA Fix crash caused by SVG/TEXT volumes cant be Support Enforcer/Blocker type
|
||||
for (auto item : sels) {
|
||||
if (model->GetItemType(item) == itVolume){
|
||||
auto vol_idx = model->GetVolumeIdByItem(item);
|
||||
auto obj_idx = model->GetObjectIdByItem(item);
|
||||
if (vol_idx < 0 || obj_idx < 0)
|
||||
continue;
|
||||
|
||||
auto vol = (*objs)[obj_idx]->volumes[vol_idx];
|
||||
|
||||
// disable Support Enforcer/Blocker if selection contains svg or text
|
||||
if (vol != nullptr && (vol->is_svg() || vol->is_text()) && (type == ModelVolumeType::SUPPORT_BLOCKER || type == ModelVolumeType::SUPPORT_ENFORCER)){
|
||||
evt.Enable(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}, item->GetId());
|
||||
}
|
||||
|
||||
@@ -870,7 +888,7 @@ void MenuFactory::append_menu_item_fill_bed(wxMenu *menu)
|
||||
wxMenuItem* MenuFactory::append_menu_item_printable(wxMenu* menu)
|
||||
{
|
||||
// BBS: to be checked
|
||||
wxMenuItem* menu_item_printable = append_menu_check_item(menu, wxID_ANY, _L("Printable"), "",
|
||||
wxMenuItem* menu_item_printable = append_menu_check_item(menu, wxID_ANY, _L("Printable") + "\t" + "V", "",
|
||||
[](wxCommandEvent&) { obj_list()->toggle_printable_state(); }, menu);
|
||||
|
||||
m_parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) {
|
||||
@@ -896,6 +914,23 @@ wxMenuItem* MenuFactory::append_menu_item_printable(wxMenu* menu)
|
||||
return menu_item_printable;
|
||||
}
|
||||
|
||||
wxMenuItem* MenuFactory::append_menu_item_auto_drop(wxMenu* menu)
|
||||
{
|
||||
wxString menu_text = _L("Auto Drop");
|
||||
wxString menu_tooltip = _L("Automatically drops the selected object to the build plate");
|
||||
wxMenuItem* menu_item_auto_drop = append_menu_check_item(
|
||||
menu, wxID_ANY, menu_text, menu_tooltip,
|
||||
[](wxCommandEvent&) { obj_list()->toggle_auto_drop(); }, menu);
|
||||
|
||||
m_parent->Bind(wxEVT_UPDATE_UI, [](wxUpdateUIEvent& evt) {
|
||||
bool check = wxGetApp().plater()->get_selection().get_auto_drop();
|
||||
evt.Check(check);
|
||||
},
|
||||
menu_item_auto_drop->GetId());
|
||||
|
||||
return menu_item_auto_drop;
|
||||
}
|
||||
|
||||
void MenuFactory::append_menu_item_rename(wxMenu* menu)
|
||||
{
|
||||
append_menu_item(menu, wxID_ANY, _L("Rename"), "",
|
||||
@@ -904,14 +939,11 @@ void MenuFactory::append_menu_item_rename(wxMenu* menu)
|
||||
menu->AppendSeparator();
|
||||
}
|
||||
|
||||
wxMenuItem* MenuFactory::append_menu_item_fix_through_netfabb(wxMenu* menu)
|
||||
wxMenuItem* MenuFactory::append_menu_item_fix_through_cgal(wxMenu* menu)
|
||||
{
|
||||
if (!is_windows10())
|
||||
return nullptr;
|
||||
|
||||
wxMenuItem* menu_item = append_menu_item(menu, wxID_ANY, _L("Fix model"), "",
|
||||
[](wxCommandEvent&) { obj_list()->fix_through_netfabb(); }, "", menu,
|
||||
[]() {return plater()->can_fix_through_netfabb(); }, plater());
|
||||
[](wxCommandEvent&) { obj_list()->fix_through_cgal(); }, "", menu,
|
||||
[]() {return plater()->can_fix_through_cgal(); }, plater());
|
||||
|
||||
return menu_item;
|
||||
}
|
||||
@@ -1381,7 +1413,7 @@ void MenuFactory::create_common_object_menu(wxMenu* menu)
|
||||
// "Scale to print volume" makes a sense just for whole object
|
||||
append_menu_item_scale_selection_to_fit_print_volume(menu);
|
||||
|
||||
append_menu_item_fix_through_netfabb(menu);
|
||||
append_menu_item_fix_through_cgal(menu);
|
||||
append_menu_items_mirror(menu);
|
||||
}
|
||||
|
||||
@@ -1420,7 +1452,7 @@ void MenuFactory::create_extra_object_menu()
|
||||
// Object Clone
|
||||
append_menu_item_clone(&m_object_menu);
|
||||
// Object Repair
|
||||
append_menu_item_fix_through_netfabb(&m_object_menu);
|
||||
append_menu_item_fix_through_cgal(&m_object_menu);
|
||||
// Object Simplify
|
||||
append_menu_item_simplify(&m_object_menu);
|
||||
// Object Mesh Subdivision
|
||||
@@ -1457,6 +1489,10 @@ void MenuFactory::create_extra_object_menu()
|
||||
// Set filament insert menu item here
|
||||
// Set Printable
|
||||
wxMenuItem* menu_item_printable = append_menu_item_printable(&m_object_menu);
|
||||
m_object_menu.AppendSeparator();
|
||||
wxMenuItem* menu_item_auto_drop = append_menu_item_auto_drop(&m_object_menu);
|
||||
m_object_menu.AppendSeparator();
|
||||
|
||||
append_menu_item_per_object_process(&m_object_menu);
|
||||
// Enter per object parameters
|
||||
append_menu_item_per_object_settings(&m_object_menu);
|
||||
@@ -1473,7 +1509,7 @@ void MenuFactory::create_bbl_assemble_object_menu()
|
||||
// Delete
|
||||
append_menu_item_delete(&m_assemble_object_menu);
|
||||
// Object Repair
|
||||
append_menu_item_fix_through_netfabb(&m_assemble_object_menu);
|
||||
append_menu_item_fix_through_cgal(&m_assemble_object_menu);
|
||||
// Object Simplify
|
||||
append_menu_item_simplify(&m_assemble_object_menu);
|
||||
// Object Mesh Subdivision
|
||||
@@ -1503,7 +1539,7 @@ void MenuFactory::create_part_menu()
|
||||
append_menu_item_reload_from_disk(menu);
|
||||
append_menu_item_export_stl(menu);
|
||||
append_menu_item_export_drc(menu);
|
||||
append_menu_item_fix_through_netfabb(menu);
|
||||
append_menu_item_fix_through_cgal(menu);
|
||||
append_menu_items_mirror(menu);
|
||||
append_menu_item_merge_parts_to_single_part(menu);
|
||||
|
||||
@@ -1528,7 +1564,7 @@ void MenuFactory::create_text_part_menu()
|
||||
|
||||
append_menu_item_edit_text(menu);
|
||||
append_menu_item_delete(menu);
|
||||
append_menu_item_fix_through_netfabb(menu);
|
||||
append_menu_item_fix_through_cgal(menu);
|
||||
append_menu_item_simplify(menu);
|
||||
append_menu_item_center(menu);
|
||||
append_menu_items_mirror(menu);
|
||||
@@ -1544,7 +1580,7 @@ void MenuFactory::create_svg_part_menu()
|
||||
|
||||
append_menu_item_edit_svg(menu);
|
||||
append_menu_item_delete(menu);
|
||||
append_menu_item_fix_through_netfabb(menu);
|
||||
append_menu_item_fix_through_cgal(menu);
|
||||
append_menu_item_simplify(menu);
|
||||
append_menu_items_mirror(menu);
|
||||
menu->AppendSeparator();
|
||||
@@ -1559,7 +1595,7 @@ void MenuFactory::create_bbl_part_menu()
|
||||
|
||||
append_menu_item_delete(menu);
|
||||
append_menu_item_edit_text(menu);
|
||||
append_menu_item_fix_through_netfabb(menu);
|
||||
append_menu_item_fix_through_cgal(menu);
|
||||
append_menu_item_simplify(menu);
|
||||
append_menu_item_smooth_mesh(menu);
|
||||
append_menu_item_center(menu);
|
||||
@@ -1880,14 +1916,20 @@ wxMenu* MenuFactory::multi_selection_menu()
|
||||
}
|
||||
append_menu_item_center(menu);
|
||||
append_menu_item_drop(menu);
|
||||
append_menu_item_fix_through_netfabb(menu);
|
||||
append_menu_item_fix_through_cgal(menu);
|
||||
//append_menu_item_simplify(menu);
|
||||
append_menu_item_delete(menu);
|
||||
menu->AppendSeparator();
|
||||
|
||||
append_menu_item_set_printable(menu);
|
||||
menu->AppendSeparator();
|
||||
|
||||
append_menu_item_set_auto_drop(menu);
|
||||
menu->AppendSeparator();
|
||||
|
||||
append_menu_item_per_object_process(menu);
|
||||
menu->AppendSeparator();
|
||||
|
||||
append_menu_items_convert_unit(menu);
|
||||
append_menu_item_replace_all_with_stl(menu);
|
||||
//BBS
|
||||
@@ -1899,7 +1941,7 @@ wxMenu* MenuFactory::multi_selection_menu()
|
||||
else {
|
||||
append_menu_item_center(menu);
|
||||
append_menu_item_drop(menu);
|
||||
append_menu_item_fix_through_netfabb(menu);
|
||||
append_menu_item_fix_through_cgal(menu);
|
||||
//append_menu_item_simplify(menu);
|
||||
append_menu_item_delete(menu);
|
||||
append_menu_items_convert_unit(menu);
|
||||
@@ -1937,7 +1979,7 @@ wxMenu* MenuFactory::assemble_multi_selection_menu()
|
||||
|
||||
wxMenu* menu = new MenuWithSeparators();
|
||||
append_menu_item_set_visible(menu);
|
||||
//append_menu_item_fix_through_netfabb(menu);
|
||||
//append_menu_item_fix_through_cgal(menu);
|
||||
//append_menu_item_simplify(menu);
|
||||
append_menu_item_delete(menu);
|
||||
menu->AppendSeparator();
|
||||
@@ -1987,7 +2029,7 @@ wxMenu* MenuFactory::assemble_object_menu()
|
||||
// Delete
|
||||
append_menu_item_delete(menu);
|
||||
//// Object Repair
|
||||
//append_menu_item_fix_through_netfabb(menu);
|
||||
//append_menu_item_fix_through_cgal(menu);
|
||||
//// Object Simplify
|
||||
//append_menu_item_simplify(menu);
|
||||
menu->AppendSeparator();
|
||||
@@ -2073,7 +2115,7 @@ void MenuFactory::append_menu_item_drop(wxMenu* menu)
|
||||
if (plater()->canvas3D()->get_canvas_type() != GLCanvas3D::ECanvasType::CanvasView3D)
|
||||
return false;
|
||||
else {
|
||||
return (plater()->get_view3D_canvas3D()->get_selection().get_bounding_box().min.z() != 0);
|
||||
return (plater()->get_view3D_canvas3D()->get_selection().get_bounding_box().min.z() > SINKING_Z_THRESHOLD);
|
||||
} //disable if model is on the bed / not in View3D
|
||||
}, m_parent);
|
||||
}
|
||||
@@ -2225,7 +2267,7 @@ void MenuFactory::append_menu_item_change_filament(wxMenu* menu)
|
||||
void MenuFactory::append_menu_item_set_printable(wxMenu* menu)
|
||||
{
|
||||
const Selection& selection = plater()->canvas3D()->get_selection();
|
||||
bool all_printable = true;
|
||||
bool all_printable = true;
|
||||
ObjectList* list = obj_list();
|
||||
wxDataViewItemArray sels;
|
||||
list->GetSelections(sels);
|
||||
@@ -2241,8 +2283,7 @@ void MenuFactory::append_menu_item_set_printable(wxMenu* menu)
|
||||
}
|
||||
}
|
||||
|
||||
wxString menu_text = _L("Printable");
|
||||
wxMenuItem* menu_item_set_printable = append_menu_check_item(menu, wxID_ANY, menu_text, "", [this, all_printable](wxCommandEvent&) {
|
||||
wxMenuItem* menu_item_set_printable = append_menu_check_item(menu, wxID_ANY, _L("Printable") + "\t" + "V", "", [this, all_printable](wxCommandEvent&) {
|
||||
Selection& selection = plater()->canvas3D()->get_selection();
|
||||
selection.set_printable(!all_printable);
|
||||
}, menu);
|
||||
@@ -2253,6 +2294,29 @@ void MenuFactory::append_menu_item_set_printable(wxMenu* menu)
|
||||
}, menu_item_set_printable->GetId());
|
||||
}
|
||||
|
||||
void MenuFactory::append_menu_item_set_auto_drop(wxMenu* menu)
|
||||
{
|
||||
const Selection& selection = plater()->canvas3D()->get_selection();
|
||||
const bool current_auto_drop = selection.get_auto_drop();
|
||||
|
||||
wxString menu_text = _L("Auto Drop");
|
||||
wxString menu_tooltip = _L("Automatically snaps the selected object to the build plate");
|
||||
wxMenuItem* menu_item_set_auto_drop = append_menu_check_item(
|
||||
menu, wxID_ANY, menu_text, menu_tooltip,
|
||||
[this, current_auto_drop](wxCommandEvent&) {
|
||||
Selection& selection = plater()->canvas3D()->get_selection();
|
||||
selection.set_auto_drop(!current_auto_drop);
|
||||
},
|
||||
menu);
|
||||
m_parent->Bind(
|
||||
wxEVT_UPDATE_UI,
|
||||
[current_auto_drop](wxUpdateUIEvent& evt) {
|
||||
evt.Check(current_auto_drop);
|
||||
plater()->set_current_canvas_as_dirty();
|
||||
},
|
||||
menu_item_set_auto_drop->GetId());
|
||||
}
|
||||
|
||||
void MenuFactory::append_menu_item_locked(wxMenu* menu)
|
||||
{
|
||||
const std::vector<wxString> names = { _L("Unlock"), _L("Lock") };
|
||||
|
||||
Reference in New Issue
Block a user