mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-10-25 01:31:14 -06:00
SPE-1103 Added menu items for the conversation of the volumes from/to meters
Related to #4521
This commit is contained in:
parent
8049dd1f72
commit
e664100bf6
8 changed files with 84 additions and 42 deletions
|
|
@ -1023,7 +1023,7 @@ void ObjectList::show_context_menu(const bool evt_context_menu)
|
|||
printer_technology() == ptFFF ? &m_menu_object : &m_menu_sla_object;
|
||||
|
||||
if (type & (itObject | itVolume))
|
||||
append_menu_item_convert_unit(menu);
|
||||
append_menu_items_convert_unit(menu);
|
||||
if (!(type & itInstance))
|
||||
append_menu_item_settings(menu);
|
||||
}
|
||||
|
|
@ -1906,56 +1906,59 @@ void ObjectList::append_menu_item_scale_selection_to_fit_print_volume(wxMenu* me
|
|||
[](wxCommandEvent&) { wxGetApp().plater()->scale_selection_to_fit_print_volume(); }, "", menu);
|
||||
}
|
||||
|
||||
void ObjectList::append_menu_item_convert_unit(wxMenu* menu, int insert_pos/* = 1*/)
|
||||
void ObjectList::append_menu_items_convert_unit(wxMenu* menu, int insert_pos/* = 1*/)
|
||||
{
|
||||
std::vector<int> obj_idxs, vol_idxs;
|
||||
get_selection_indexes(obj_idxs, vol_idxs);
|
||||
if (obj_idxs.empty() && vol_idxs.empty())
|
||||
return;
|
||||
|
||||
auto can_append = [this, obj_idxs, vol_idxs](bool from_imperial_unit) {
|
||||
auto volume_respects_conversion = [](ModelVolume* volume, ConversionType conver_type)
|
||||
{
|
||||
return (conver_type == ConversionType::CONV_FROM_INCH && volume->source.is_converted_from_inches) ||
|
||||
(conver_type == ConversionType::CONV_TO_INCH && !volume->source.is_converted_from_inches) ||
|
||||
(conver_type == ConversionType::CONV_FROM_METER && volume->source.is_converted_from_meters) ||
|
||||
(conver_type == ConversionType::CONV_TO_METER && !volume->source.is_converted_from_meters);
|
||||
};
|
||||
|
||||
auto can_append = [this, obj_idxs, vol_idxs, volume_respects_conversion](ConversionType conver_type)
|
||||
{
|
||||
ModelObjectPtrs objects;
|
||||
for (int obj_idx : obj_idxs) {
|
||||
ModelObject* object = (*m_objects)[obj_idx];
|
||||
if (vol_idxs.empty()) {
|
||||
for (ModelVolume* volume : object->volumes)
|
||||
if (volume->source.is_converted_from_inches == from_imperial_unit)
|
||||
if (volume_respects_conversion(volume, conver_type))
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
for (int vol_idx : vol_idxs)
|
||||
if (object->volumes[vol_idx]->source.is_converted_from_inches == from_imperial_unit)
|
||||
if (volume_respects_conversion(object->volumes[vol_idx], conver_type))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
wxString convert_menu_name = _L("Convert from imperial units");
|
||||
int convert_menu_id = menu->FindItem(convert_menu_name);
|
||||
wxString revert_menu_name = _L("Revert conversion from imperial units");
|
||||
int revert_menu_id = menu->FindItem(revert_menu_name);
|
||||
std::vector<std::pair<ConversionType, wxString>> items = {
|
||||
{ConversionType::CONV_FROM_INCH , _L("Convert from imperial units") },
|
||||
{ConversionType::CONV_TO_INCH , _L("Revert conversion from imperial units") },
|
||||
{ConversionType::CONV_FROM_METER, _L("Convert from meters") },
|
||||
{ConversionType::CONV_TO_METER , _L("Revert conversion from meters") } };
|
||||
|
||||
if (can_append(true)) {
|
||||
// Delete revert menu item
|
||||
if (revert_menu_id != wxNOT_FOUND)
|
||||
menu->Destroy(revert_menu_id);
|
||||
// Add convert menu item if it doesn't exist
|
||||
if (convert_menu_id == wxNOT_FOUND)
|
||||
append_menu_item(menu, wxID_ANY, convert_menu_name, convert_menu_name,
|
||||
[](wxCommandEvent&) { wxGetApp().plater()->convert_unit(true); }, "", menu,
|
||||
[]() {return true;}, nullptr, insert_pos);
|
||||
}
|
||||
|
||||
if (can_append(false)) {
|
||||
// Delete convert menu item
|
||||
if (convert_menu_id != wxNOT_FOUND)
|
||||
menu->Destroy(convert_menu_id);
|
||||
// Add convert menu item if it doesn't exist
|
||||
if (revert_menu_id == wxNOT_FOUND)
|
||||
append_menu_item(menu, wxID_ANY, revert_menu_name, revert_menu_name,
|
||||
[](wxCommandEvent&) { wxGetApp().plater()->convert_unit(false); }, "", menu,
|
||||
[]() {return true;}, nullptr, insert_pos);
|
||||
for (auto item : items) {
|
||||
int menu_id = menu->FindItem(item.second);
|
||||
if (can_append(item.first)) {
|
||||
// Add menu item if it doesn't exist
|
||||
if (menu_id == wxNOT_FOUND)
|
||||
append_menu_item(menu, wxID_ANY, item.second, item.second,
|
||||
[item](wxCommandEvent&) { wxGetApp().plater()->convert_unit(item.first); }, "", menu,
|
||||
[]() {return true; }, nullptr, insert_pos);
|
||||
}
|
||||
else if (menu_id != wxNOT_FOUND) {
|
||||
// Delete menu item
|
||||
menu->Destroy(menu_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -4606,7 +4609,7 @@ void ObjectList::show_multi_selection_menu()
|
|||
return wxGetApp().plater()->can_reload_from_disk();
|
||||
}, wxGetApp().plater());
|
||||
|
||||
append_menu_item_convert_unit(menu);
|
||||
append_menu_items_convert_unit(menu);
|
||||
if (can_merge_to_multipart_object())
|
||||
append_menu_item_merge_to_multipart_object(menu);
|
||||
|
||||
|
|
|
|||
|
|
@ -284,7 +284,7 @@ public:
|
|||
void append_menu_item_change_extruder(wxMenu* menu);
|
||||
void append_menu_item_delete(wxMenu* menu);
|
||||
void append_menu_item_scale_selection_to_fit_print_volume(wxMenu* menu);
|
||||
void append_menu_item_convert_unit(wxMenu* menu, int insert_pos = 1); // Add "Conver/Revert..." menu item after "Reload From Disk"
|
||||
void append_menu_items_convert_unit(wxMenu* menu, int insert_pos = 1); // Add "Conver/Revert..." menu items (from/to inches/meters) after "Reload From Disk"
|
||||
void append_menu_item_merge_to_multipart_object(wxMenu *menu);
|
||||
void append_menu_item_merge_to_single_object(wxMenu *menu);
|
||||
void create_object_popupmenu(wxMenu *menu);
|
||||
|
|
|
|||
|
|
@ -3329,6 +3329,8 @@ void Plater::priv::reload_from_disk()
|
|||
new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset));
|
||||
if (old_volume->source.is_converted_from_inches)
|
||||
new_volume->convert_from_imperial_units();
|
||||
if (old_volume->source.is_converted_from_meters)
|
||||
new_volume->convert_from_meters();
|
||||
new_volume->supported_facets.assign(old_volume->supported_facets);
|
||||
new_volume->seam_facets.assign(old_volume->seam_facets);
|
||||
std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back());
|
||||
|
|
@ -3871,7 +3873,7 @@ void Plater::priv::on_right_click(RBtnEvent& evt)
|
|||
menu_item_convert_unit_position = 2;
|
||||
}
|
||||
|
||||
sidebar->obj_list()->append_menu_item_convert_unit(menu, menu_item_convert_unit_position);
|
||||
sidebar->obj_list()->append_menu_items_convert_unit(menu, menu_item_convert_unit_position);
|
||||
sidebar->obj_list()->append_menu_item_settings(menu);
|
||||
|
||||
if (printer_technology != ptSLA)
|
||||
|
|
@ -5246,20 +5248,22 @@ void Plater::scale_selection_to_fit_print_volume()
|
|||
p->scale_selection_to_fit_print_volume();
|
||||
}
|
||||
|
||||
void Plater::convert_unit(bool from_imperial_unit)
|
||||
void Plater::convert_unit(ConversionType conv_type)
|
||||
{
|
||||
std::vector<int> obj_idxs, volume_idxs;
|
||||
wxGetApp().obj_list()->get_selection_indexes(obj_idxs, volume_idxs);
|
||||
if (obj_idxs.empty() && volume_idxs.empty())
|
||||
return;
|
||||
|
||||
TakeSnapshot snapshot(this, from_imperial_unit ? _L("Convert from imperial units") : _L("Revert conversion from imperial units"));
|
||||
TakeSnapshot snapshot(this, conv_type == ConversionType::CONV_FROM_INCH ? _L("Convert from imperial units") :
|
||||
conv_type == ConversionType::CONV_TO_INCH ? _L("Revert conversion from imperial units") :
|
||||
conv_type == ConversionType::CONV_FROM_METER ? _L("Convert from meters") : _L("Revert conversion from meters"));
|
||||
wxBusyCursor wait;
|
||||
|
||||
ModelObjectPtrs objects;
|
||||
for (int obj_idx : obj_idxs) {
|
||||
ModelObject *object = p->model.objects[obj_idx];
|
||||
object->convert_units(objects, from_imperial_unit, volume_idxs);
|
||||
object->convert_units(objects, conv_type, volume_idxs);
|
||||
remove(obj_idx);
|
||||
}
|
||||
p->load_model_objects(objects);
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ class ModelInstance;
|
|||
class Print;
|
||||
class SLAPrint;
|
||||
enum SLAPrintObjectStep : unsigned int;
|
||||
enum class ConversionType : int;
|
||||
|
||||
using ModelInstancePtrs = std::vector<ModelInstance*>;
|
||||
|
||||
|
|
@ -191,7 +192,7 @@ public:
|
|||
void fill_bed_with_instances();
|
||||
bool is_selection_empty() const;
|
||||
void scale_selection_to_fit_print_volume();
|
||||
void convert_unit(bool from_imperial_unit);
|
||||
void convert_unit(ConversionType conv_type);
|
||||
|
||||
void cut(size_t obj_idx, size_t instance_idx, coordf_t z, bool keep_upper = true, bool keep_lower = true, bool rotate_lower = false);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue