From 97a25cf6080a18c6a25eb846411e1adb75568d7c Mon Sep 17 00:00:00 2001 From: YuSanka Date: Tue, 24 Jul 2018 12:15:36 +0200 Subject: [PATCH] Work with model objects like reference (from/to perl side) --- lib/Slic3r/GUI/Plater.pm | 1 + xs/src/slic3r/GUI/GUI.cpp | 2 ++ xs/src/slic3r/GUI/GUI.hpp | 1 + xs/src/slic3r/GUI/GUI_ObjectParts.cpp | 30 +++++++++++++++------------ xs/src/slic3r/GUI/GUI_ObjectParts.hpp | 2 ++ xs/xsp/GUI.xsp | 2 ++ 6 files changed, 25 insertions(+), 13 deletions(-) diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm index 661a81a64..ac54e67d8 100644 --- a/lib/Slic3r/GUI/Plater.pm +++ b/lib/Slic3r/GUI/Plater.pm @@ -449,6 +449,7 @@ sub new { my $expert_mode_part_sizer = Wx::BoxSizer->new(wxVERTICAL); Slic3r::GUI::add_expert_mode_part( $self->{right_panel}, $expert_mode_part_sizer, + $self->{model}, $self->{event_object_selection_changed}, $self->{event_object_settings_changed}, $self->{event_remove_object}); diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index 83c428ea1..72efd7f29 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -893,6 +893,7 @@ wxString from_u8(const std::string &str) } void add_expert_mode_part( wxWindow* parent, wxBoxSizer* sizer, + Model &model, int event_object_selection_changed, int event_object_settings_changed, int event_remove_object) @@ -900,6 +901,7 @@ void add_expert_mode_part( wxWindow* parent, wxBoxSizer* sizer, set_event_object_selection_changed(event_object_selection_changed); set_event_object_settings_changed(event_object_settings_changed); set_event_remove_object(event_remove_object); + set_objects_from_model(model); init_mesh_icons(); // wxWindowUpdateLocker noUpdates(parent); diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp index 58a927cf6..8199a1349 100644 --- a/xs/src/slic3r/GUI/GUI.hpp +++ b/xs/src/slic3r/GUI/GUI.hpp @@ -188,6 +188,7 @@ wxString L_str(const std::string &str); wxString from_u8(const std::string &str); void add_expert_mode_part( wxWindow* parent, wxBoxSizer* sizer, + Model &model, int event_object_selection_changed, int event_object_settings_changed, int event_remove_object); diff --git a/xs/src/slic3r/GUI/GUI_ObjectParts.cpp b/xs/src/slic3r/GUI/GUI_ObjectParts.cpp index 26e4fbbf7..4587de6ad 100644 --- a/xs/src/slic3r/GUI/GUI_ObjectParts.cpp +++ b/xs/src/slic3r/GUI/GUI_ObjectParts.cpp @@ -40,7 +40,7 @@ int m_selected_object_id = -1; bool g_prevent_list_events = false; // We use this flag to avoid circular event handling Select() // happens to fire a wxEVT_LIST_ITEM_SELECTED on OSX, whose event handler // calls this method again and again and again -ModelObjectPtrs m_objects; +ModelObjectPtrs* m_objects; int m_event_object_selection_changed = 0; int m_event_object_settings_changed = 0; @@ -124,6 +124,10 @@ void set_event_remove_object(const int& event){ m_event_remove_object = event; } +void set_objects_from_model(Model &model) { + m_objects = &(model.objects); +} + void init_mesh_icons(){ m_icon_modifiermesh = wxIcon(Slic3r::GUI::from_u8(Slic3r::var("plugin.png")), wxBITMAP_TYPE_PNG); m_icon_solidmesh = wxIcon(Slic3r::GUI::from_u8(Slic3r::var("package.png")), wxBITMAP_TYPE_PNG); @@ -297,7 +301,7 @@ void update_after_moving() Point3 l = m_last_coords; auto d = Pointf3(m.x - l.x, m.y - l.y, m.z - l.z); - auto volume = m_objects[m_selected_object_id]->volumes[volume_id]; + auto volume = (*m_objects)[m_selected_object_id]->volumes[volume_id]; volume->mesh.translate(d.x,d.y,d.z); m_last_coords = m; @@ -546,11 +550,11 @@ void add_object_to_list(const std::string &name, ModelObject* model_object) m_objects_model->SetValue(variant, item, 0); } + ModelObjectPtrs* objects = m_objects; // part_selection_changed(); #ifdef __WXMSW__ object_ctrl_selection_changed(); #endif //__WXMSW__ - m_objects.push_back(model_object); } void delete_object_from_list() @@ -856,9 +860,9 @@ void on_btn_load(wxWindow* parent, bool is_modifier /*= false*/, bool is_lambda/ if (obj_idx < 0) return; wxArrayString part_names; if (is_lambda) - load_lambda(parent, m_objects[obj_idx], part_names, is_modifier); + load_lambda(parent, (*m_objects)[obj_idx], part_names, is_modifier); else - load_part(parent, m_objects[obj_idx], part_names, is_modifier); + load_part(parent, (*m_objects)[obj_idx], part_names, is_modifier); parts_changed(obj_idx); @@ -879,11 +883,11 @@ void on_btn_del() auto volume_id = m_objects_model->GetVolumeIdByItem(item); if (volume_id < 0) return; - auto volume = m_objects[m_selected_object_id]->volumes[volume_id]; + auto volume = (*m_objects)[m_selected_object_id]->volumes[volume_id]; // if user is deleting the last solid part, throw error int solid_cnt = 0; - for (auto vol : m_objects[m_selected_object_id]->volumes) + for (auto vol : (*m_objects)[m_selected_object_id]->volumes) if (!vol->modifier) ++solid_cnt; if (!volume->modifier && solid_cnt == 1) { @@ -891,7 +895,7 @@ void on_btn_del() return; } - m_objects[m_selected_object_id]->delete_volume(volume_id); + (*m_objects)[m_selected_object_id]->delete_volume(volume_id); m_parts_changed = true; parts_changed(m_selected_object_id); @@ -912,7 +916,7 @@ void on_btn_split() if (volume_id < 0) return; - auto volume = m_objects[m_selected_object_id]->volumes[volume_id]; + auto volume = (*m_objects)[m_selected_object_id]->volumes[volume_id]; DynamicPrintConfig& config = get_preset_bundle()->prints.get_edited_preset().config; auto nozzle_dmrs_cnt = config.option("nozzle_diameter")->values.size(); if (volume->split(nozzle_dmrs_cnt) > 1) { @@ -929,7 +933,7 @@ void on_btn_move_up(){ auto volume_id = m_objects_model->GetVolumeIdByItem(item); if (volume_id < 0) return; - auto& volumes = m_objects[m_selected_object_id]->volumes; + auto& volumes = (*m_objects)[m_selected_object_id]->volumes; if (0 < volume_id && volume_id < volumes.size()) { std::swap(volumes[volume_id - 1], volumes[volume_id]); m_parts_changed = true; @@ -948,7 +952,7 @@ void on_btn_move_down(){ auto volume_id = m_objects_model->GetVolumeIdByItem(item); if (volume_id < 0) return; - auto& volumes = m_objects[m_selected_object_id]->volumes; + auto& volumes = (*m_objects)[m_selected_object_id]->volumes; if (0 <= volume_id && volume_id+1 < volumes.size()) { std::swap(volumes[volume_id + 1], volumes[volume_id]); m_parts_changed = true; @@ -975,13 +979,13 @@ void parts_changed(int obj_idx) void update_settings_value() { auto og = get_optgroup(ogFrequentlyObjectSettings); - if (m_selected_object_id < 0 || m_objects.size() <= m_selected_object_id) { + if (m_selected_object_id < 0 || m_objects->size() <= m_selected_object_id) { og->set_value("scale_x", 0); og->set_value("scale_y", 0); og->set_value("scale_z", 0); return; } - auto bb_size = m_objects[m_selected_object_id]->instance_bounding_box(0).size(); + auto bb_size = (*m_objects)[m_selected_object_id]->instance_bounding_box(0).size(); og->set_value("scale_x", int(bb_size.x+0.5)); og->set_value("scale_y", int(bb_size.y+0.5)); og->set_value("scale_z", int(bb_size.z+0.5)); diff --git a/xs/src/slic3r/GUI/GUI_ObjectParts.hpp b/xs/src/slic3r/GUI/GUI_ObjectParts.hpp index 532614cab..4f1c15e3a 100644 --- a/xs/src/slic3r/GUI/GUI_ObjectParts.hpp +++ b/xs/src/slic3r/GUI/GUI_ObjectParts.hpp @@ -10,6 +10,7 @@ class wxMenu; namespace Slic3r { class ModelObject; +class Model; namespace GUI { @@ -73,6 +74,7 @@ void init_mesh_icons(); void set_event_object_selection_changed(const int& event); void set_event_object_settings_changed(const int& event); void set_event_remove_object(const int& event); +void set_objects_from_model(Model &model); bool is_parts_changed(); bool is_part_settings_changed(); diff --git a/xs/xsp/GUI.xsp b/xs/xsp/GUI.xsp index 470bbcdd2..98d3169bd 100644 --- a/xs/xsp/GUI.xsp +++ b/xs/xsp/GUI.xsp @@ -88,11 +88,13 @@ void add_frequently_changed_parameters(SV *ui_parent, SV *ui_sizer, SV *ui_p_siz (wxFlexGridSizer*)wxPli_sv_2_object(aTHX_ ui_p_sizer, "Wx::FlexGridSizer")); %}; void add_expert_mode_part( SV *ui_parent, SV *ui_sizer, + Model *model, int event_object_selection_changed, int event_object_settings_changed, int event_remove_object) %code%{ Slic3r::GUI::add_expert_mode_part( (wxWindow*)wxPli_sv_2_object(aTHX_ ui_parent, "Wx::Window"), (wxBoxSizer*)wxPli_sv_2_object(aTHX_ ui_sizer, "Wx::BoxSizer"), + *model, event_object_selection_changed, event_object_settings_changed, event_remove_object); %};