mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-14 02:07:54 -06:00
Copy and paste -> Clipboard refactored to accept more than one object
This commit is contained in:
parent
a80978f84a
commit
7a1fab09d4
3 changed files with 38 additions and 61 deletions
|
@ -2167,6 +2167,7 @@ void ObjectList::update_selections_on_canvas()
|
||||||
add_to_selection(item, selection, instance_idx, false);
|
add_to_selection(item, selection, instance_idx, false);
|
||||||
|
|
||||||
wxGetApp().plater()->canvas3D()->update_gizmos_on_off_state();
|
wxGetApp().plater()->canvas3D()->update_gizmos_on_off_state();
|
||||||
|
wxGetApp().plater()->canvas3D()->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectList::select_item(const wxDataViewItem& item)
|
void ObjectList::select_item(const wxDataViewItem& item)
|
||||||
|
|
|
@ -47,23 +47,6 @@ Selection::VolumeCache::VolumeCache(const Geometry::Transformation& volume_trans
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Selection::Clipboard::Clipboard()
|
|
||||||
: m_object(nullptr)
|
|
||||||
{
|
|
||||||
m_object = m_model.add_object();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Selection::Clipboard::add_volume(const ModelVolume& volume)
|
|
||||||
{
|
|
||||||
ModelVolume* v = m_object->add_volume(volume);
|
|
||||||
v->config = volume.config;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ModelVolume* Selection::Clipboard::get_volume(unsigned int id) const
|
|
||||||
{
|
|
||||||
return (id < (unsigned int)m_object->volumes.size()) ? m_object->volumes[id] : nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
Selection::Selection()
|
Selection::Selection()
|
||||||
: m_volumes(nullptr)
|
: m_volumes(nullptr)
|
||||||
, m_model(nullptr)
|
, m_model(nullptr)
|
||||||
|
@ -1046,33 +1029,36 @@ void Selection::copy_to_clipboard()
|
||||||
|
|
||||||
m_clipboard.reset();
|
m_clipboard.reset();
|
||||||
|
|
||||||
|
for (const ObjectIdxsToInstanceIdxsMap::value_type& object : m_cache.content)
|
||||||
|
{
|
||||||
|
ModelObject* src_object = m_model->objects[object.first];
|
||||||
|
ModelObject* dst_object = m_clipboard.add_object();
|
||||||
|
|
||||||
|
for (int i : object.second)
|
||||||
|
{
|
||||||
|
dst_object->add_instance(*src_object->instances[i]);
|
||||||
|
}
|
||||||
|
|
||||||
for (unsigned int i : m_list)
|
for (unsigned int i : m_list)
|
||||||
{
|
{
|
||||||
const GLVolume* volume = (*m_volumes)[i];
|
const GLVolume* volume = (*m_volumes)[i];
|
||||||
int obj_idx = volume->object_idx();
|
if (volume->object_idx() == object.first)
|
||||||
if ((0 <= obj_idx) && (obj_idx < (int)m_model->objects.size()))
|
|
||||||
{
|
{
|
||||||
const ModelObject* model_object = m_model->objects[obj_idx];
|
ModelVolume* src_volume = src_object->volumes[i];
|
||||||
int vol_idx = volume->volume_idx();
|
ModelVolume* dst_volume = dst_object->add_volume(*src_volume);
|
||||||
if ((0 <= vol_idx) && (vol_idx < (int)model_object->volumes.size()))
|
dst_volume->set_new_unique_id();
|
||||||
m_clipboard.add_volume(*model_object->volumes[vol_idx]);
|
dst_volume->config = src_volume->config;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dst_object->config = src_object->config;
|
||||||
int obj_idx = get_object_idx();
|
}
|
||||||
if ((0 <= obj_idx) && (obj_idx < (int)m_model->objects.size()))
|
|
||||||
m_clipboard.get_object()->config = m_model->objects[obj_idx]->config;
|
|
||||||
|
|
||||||
m_clipboard.set_mode(m_mode);
|
m_clipboard.set_mode(m_mode);
|
||||||
m_clipboard.set_type(m_type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Selection::paste_from_clipboard()
|
void Selection::paste_from_clipboard()
|
||||||
{
|
{
|
||||||
if (!m_valid)
|
if (!m_valid || m_clipboard.is_empty())
|
||||||
return;
|
|
||||||
|
|
||||||
if (m_clipboard.is_empty())
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ((m_clipboard.get_mode() == Volume) && is_from_single_instance())
|
if ((m_clipboard.get_mode() == Volume) && is_from_single_instance())
|
||||||
|
@ -1767,26 +1753,25 @@ void Selection::paste_volumes_from_clipboard()
|
||||||
if ((obj_idx < 0) || ((int)m_model->objects.size() <= obj_idx))
|
if ((obj_idx < 0) || ((int)m_model->objects.size() <= obj_idx))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ModelObject& model_object = *m_model->objects[obj_idx];
|
ModelObject* src_object = m_clipboard.get_object(0);
|
||||||
unsigned int count = m_clipboard.get_volumes_count();
|
if (src_object != nullptr)
|
||||||
ModelVolumePtrs volumes;
|
|
||||||
for (unsigned int i = 0; i < count; ++i)
|
|
||||||
{
|
{
|
||||||
const ModelVolume* volume = m_clipboard.get_volume(i);
|
ModelObject* dst_object = m_model->objects[obj_idx];
|
||||||
ModelVolume* new_volume = model_object.add_volume(*volume);
|
|
||||||
new_volume->config = volume->config;
|
ModelVolumePtrs volumes;
|
||||||
new_volume->set_new_unique_id();
|
for (ModelVolume* src_volume : src_object->volumes)
|
||||||
volumes.push_back(new_volume);
|
{
|
||||||
|
ModelVolume* dst_volume = dst_object->add_volume(*src_volume);
|
||||||
|
dst_volume->config = src_volume->config;
|
||||||
|
dst_volume->set_new_unique_id();
|
||||||
|
volumes.push_back(dst_volume);
|
||||||
}
|
}
|
||||||
wxGetApp().obj_list()->paste_volumes_into_list(obj_idx, volumes);
|
wxGetApp().obj_list()->paste_volumes_into_list(obj_idx, volumes);
|
||||||
int a = 0;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Selection::paste_object_from_clipboard()
|
void Selection::paste_object_from_clipboard()
|
||||||
{
|
{
|
||||||
ModelObject* model_object = m_clipboard.get_object();
|
|
||||||
if (model_object != nullptr)
|
|
||||||
wxGetApp().obj_list()->paste_object_into_list(*model_object);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace GUI
|
} // namespace GUI
|
||||||
|
|
|
@ -154,26 +154,17 @@ private:
|
||||||
class Clipboard
|
class Clipboard
|
||||||
{
|
{
|
||||||
Model m_model;
|
Model m_model;
|
||||||
ModelObject* m_object;
|
|
||||||
Selection::EMode m_mode;
|
Selection::EMode m_mode;
|
||||||
Selection::EType m_type;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Clipboard();
|
void reset() { m_model.clear_objects(); }
|
||||||
|
bool is_empty() const { return m_model.objects.empty(); }
|
||||||
|
|
||||||
void reset() { if (m_object != nullptr) m_object->clear_volumes(); }
|
ModelObject* add_object() { return m_model.add_object(); }
|
||||||
void add_volume(const ModelVolume& volume);
|
ModelObject* get_object(unsigned int id) { return (id < (unsigned int)m_model.objects.size()) ? m_model.objects[id] : nullptr; }
|
||||||
const ModelVolume* get_volume(unsigned int id) const;
|
|
||||||
ModelObject* get_object() { return m_object; }
|
|
||||||
const ModelObject* get_object() const { return m_object; }
|
|
||||||
const unsigned int get_volumes_count() const { return (unsigned int)m_object->volumes.size(); }
|
|
||||||
|
|
||||||
bool is_empty() const { return (m_object == nullptr) || m_object->volumes.empty(); }
|
|
||||||
|
|
||||||
Selection::EMode get_mode() const { return m_mode; }
|
Selection::EMode get_mode() const { return m_mode; }
|
||||||
void set_mode(Selection::EMode mode) { m_mode = mode; }
|
void set_mode(Selection::EMode mode) { m_mode = mode; }
|
||||||
Selection::EType get_type() const { return m_type; }
|
|
||||||
void set_type(Selection::EType type) { m_type = type; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Volumes owned by GLCanvas3D.
|
// Volumes owned by GLCanvas3D.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue