Do not allow to copy/paste volumes when using sla printer
This commit is contained in:
parent
fab3634931
commit
7aaba25520
6 changed files with 79 additions and 29 deletions
|
@ -3488,7 +3488,7 @@ bool GLCanvas3D::_init_toolbar()
|
||||||
item.tooltip = _utf8(L("Copy")) + " [" + GUI::shortkey_ctrl_prefix() + "C]";
|
item.tooltip = _utf8(L("Copy")) + " [" + GUI::shortkey_ctrl_prefix() + "C]";
|
||||||
item.sprite_id = 4;
|
item.sprite_id = 4;
|
||||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_COPY)); };
|
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_COPY)); };
|
||||||
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_copy(); };
|
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_copy_to_clipboard(); };
|
||||||
if (!m_toolbar.add_item(item))
|
if (!m_toolbar.add_item(item))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -3499,7 +3499,7 @@ bool GLCanvas3D::_init_toolbar()
|
||||||
item.tooltip = _utf8(L("Paste")) + " [" + GUI::shortkey_ctrl_prefix() + "V]";
|
item.tooltip = _utf8(L("Paste")) + " [" + GUI::shortkey_ctrl_prefix() + "V]";
|
||||||
item.sprite_id = 5;
|
item.sprite_id = 5;
|
||||||
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_PASTE)); };
|
item.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_PASTE)); };
|
||||||
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_paste(); };
|
item.enabled_state_callback = []()->bool { return wxGetApp().plater()->can_paste_from_clipboard(); };
|
||||||
if (!m_toolbar.add_item(item))
|
if (!m_toolbar.add_item(item))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
@ -505,10 +505,10 @@ void MainFrame::init_menubar()
|
||||||
editMenu->AppendSeparator();
|
editMenu->AppendSeparator();
|
||||||
append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C",
|
append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C",
|
||||||
_(L("Copy selection to clipboard")), [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); },
|
_(L("Copy selection to clipboard")), [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); },
|
||||||
menu_icon("copy_menu"), nullptr, [this](){return m_plater->can_copy(); }, this);
|
menu_icon("copy_menu"), nullptr, [this](){return m_plater->can_copy_to_clipboard(); }, this);
|
||||||
append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V",
|
append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V",
|
||||||
_(L("Paste clipboard")), [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); },
|
_(L("Paste clipboard")), [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); },
|
||||||
menu_icon("paste_menu"), nullptr, [this](){return m_plater->can_paste(); }, this);
|
menu_icon("paste_menu"), nullptr, [this](){return m_plater->can_paste_from_clipboard(); }, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Window menu
|
// Window menu
|
||||||
|
|
|
@ -4187,30 +4187,14 @@ void Plater::update_object_menu() { p->update_object_menu(); }
|
||||||
|
|
||||||
void Plater::copy_selection_to_clipboard()
|
void Plater::copy_selection_to_clipboard()
|
||||||
{
|
{
|
||||||
p->view3D->get_canvas3d()->get_selection().copy_to_clipboard();
|
if (can_copy_to_clipboard())
|
||||||
|
p->view3D->get_canvas3d()->get_selection().copy_to_clipboard();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::paste_from_clipboard()
|
void Plater::paste_from_clipboard()
|
||||||
{
|
{
|
||||||
p->view3D->get_canvas3d()->get_selection().paste_from_clipboard();
|
if (can_paste_from_clipboard())
|
||||||
}
|
p->view3D->get_canvas3d()->get_selection().paste_from_clipboard();
|
||||||
|
|
||||||
bool Plater::can_paste_from_clipboard() const
|
|
||||||
{
|
|
||||||
const Selection& selection = p->view3D->get_canvas3d()->get_selection();
|
|
||||||
const Selection::Clipboard& clipboard = selection.get_clipboard();
|
|
||||||
Selection::EMode mode = clipboard.get_mode();
|
|
||||||
|
|
||||||
if (clipboard.is_empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ((mode == Selection::Volume) && !selection.is_from_single_instance())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if ((mode == Selection::Instance) && (selection.get_mode() != Selection::Instance))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Plater::msw_rescale()
|
void Plater::msw_rescale()
|
||||||
|
@ -4237,7 +4221,37 @@ bool Plater::can_split_to_objects() const { return p->can_split_to_objects(); }
|
||||||
bool Plater::can_split_to_volumes() const { return p->can_split_to_volumes(); }
|
bool Plater::can_split_to_volumes() const { return p->can_split_to_volumes(); }
|
||||||
bool Plater::can_arrange() const { return p->can_arrange(); }
|
bool Plater::can_arrange() const { return p->can_arrange(); }
|
||||||
bool Plater::can_layers_editing() const { return p->can_layers_editing(); }
|
bool Plater::can_layers_editing() const { return p->can_layers_editing(); }
|
||||||
bool Plater::can_copy() const { return !is_selection_empty(); }
|
bool Plater::can_paste_from_clipboard() const
|
||||||
bool Plater::can_paste() const { return can_paste_from_clipboard(); }
|
{
|
||||||
|
const Selection& selection = p->view3D->get_canvas3d()->get_selection();
|
||||||
|
const Selection::Clipboard& clipboard = selection.get_clipboard();
|
||||||
|
|
||||||
|
if (clipboard.is_empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) && !clipboard.is_sla_compliant())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
Selection::EMode mode = clipboard.get_mode();
|
||||||
|
if ((mode == Selection::Volume) && !selection.is_from_single_instance())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if ((mode == Selection::Instance) && (selection.get_mode() != Selection::Instance))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Plater::can_copy_to_clipboard() const
|
||||||
|
{
|
||||||
|
if (is_selection_empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const Selection& selection = p->view3D->get_canvas3d()->get_selection();
|
||||||
|
if ((wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) && !selection.is_sla_compliant())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}} // namespace Slic3r::GUI
|
}} // namespace Slic3r::GUI
|
||||||
|
|
|
@ -200,7 +200,6 @@ public:
|
||||||
|
|
||||||
void copy_selection_to_clipboard();
|
void copy_selection_to_clipboard();
|
||||||
void paste_from_clipboard();
|
void paste_from_clipboard();
|
||||||
bool can_paste_from_clipboard() const;
|
|
||||||
|
|
||||||
bool can_delete() const;
|
bool can_delete() const;
|
||||||
bool can_delete_all() const;
|
bool can_delete_all() const;
|
||||||
|
@ -212,8 +211,8 @@ public:
|
||||||
bool can_split_to_volumes() const;
|
bool can_split_to_volumes() const;
|
||||||
bool can_arrange() const;
|
bool can_arrange() const;
|
||||||
bool can_layers_editing() const;
|
bool can_layers_editing() const;
|
||||||
bool can_copy() const;
|
bool can_paste_from_clipboard() const;
|
||||||
bool can_paste() const;
|
bool can_copy_to_clipboard() const;
|
||||||
|
|
||||||
void msw_rescale();
|
void msw_rescale();
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,26 @@ Selection::VolumeCache::VolumeCache(const Geometry::Transformation& volume_trans
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Selection::Clipboard::is_sla_compliant() const
|
||||||
|
{
|
||||||
|
if (m_mode == Selection::Volume)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (const ModelObject* o : m_model.objects)
|
||||||
|
{
|
||||||
|
if (o->is_multiparts())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (const ModelVolume* v : o->volumes)
|
||||||
|
{
|
||||||
|
if (v->is_modifier())
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Selection::Selection()
|
Selection::Selection()
|
||||||
: m_volumes(nullptr)
|
: m_volumes(nullptr)
|
||||||
, m_model(nullptr)
|
, m_model(nullptr)
|
||||||
|
@ -385,6 +405,20 @@ bool Selection::is_from_single_object() const
|
||||||
return (0 <= idx) && (idx < 1000);
|
return (0 <= idx) && (idx < 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Selection::is_sla_compliant() const
|
||||||
|
{
|
||||||
|
if (m_mode == Volume)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
for (unsigned int i : m_list)
|
||||||
|
{
|
||||||
|
if ((*m_volumes)[i]->is_modifier)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Selection::requires_uniform_scale() const
|
bool Selection::requires_uniform_scale() const
|
||||||
{
|
{
|
||||||
if (is_single_full_instance() || is_single_modifier() || is_single_volume())
|
if (is_single_full_instance() || is_single_modifier() || is_single_volume())
|
||||||
|
|
|
@ -152,6 +152,8 @@ public:
|
||||||
void reset() { m_model.clear_objects(); }
|
void reset() { m_model.clear_objects(); }
|
||||||
bool is_empty() const { return m_model.objects.empty(); }
|
bool is_empty() const { return m_model.objects.empty(); }
|
||||||
|
|
||||||
|
bool is_sla_compliant() const;
|
||||||
|
|
||||||
ModelObject* add_object() { return m_model.add_object(); }
|
ModelObject* add_object() { return m_model.add_object(); }
|
||||||
ModelObject* get_object(unsigned int id) { return (id < (unsigned int)m_model.objects.size()) ? m_model.objects[id] : nullptr; }
|
ModelObject* get_object(unsigned int id) { return (id < (unsigned int)m_model.objects.size()) ? m_model.objects[id] : nullptr; }
|
||||||
const ModelObjectPtrs& get_objects() const { return m_model.objects; }
|
const ModelObjectPtrs& get_objects() const { return m_model.objects; }
|
||||||
|
@ -257,6 +259,7 @@ public:
|
||||||
bool is_mixed() const { return m_type == Mixed; }
|
bool is_mixed() const { return m_type == Mixed; }
|
||||||
bool is_from_single_instance() const { return get_instance_idx() != -1; }
|
bool is_from_single_instance() const { return get_instance_idx() != -1; }
|
||||||
bool is_from_single_object() const;
|
bool is_from_single_object() const;
|
||||||
|
bool is_sla_compliant() const;
|
||||||
|
|
||||||
bool contains_volume(unsigned int volume_idx) const { return m_list.find(volume_idx) != m_list.end(); }
|
bool contains_volume(unsigned int volume_idx) const { return m_list.find(volume_idx) != m_list.end(); }
|
||||||
bool requires_uniform_scale() const;
|
bool requires_uniform_scale() const;
|
||||||
|
|
Loading…
Reference in a new issue