mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Merge branch 'master' of https://github.com/prusa3d/Slic3r
This commit is contained in:
		
						commit
						728e053a7f
					
				
					 7 changed files with 101 additions and 50 deletions
				
			
		|  | @ -361,6 +361,14 @@ int CLI::run(int argc, char **argv) | ||||||
|                 std::string outfile = m_config.opt_string("output"); |                 std::string outfile = m_config.opt_string("output"); | ||||||
|                 Print       fff_print; |                 Print       fff_print; | ||||||
|                 SLAPrint    sla_print; |                 SLAPrint    sla_print; | ||||||
|  | 
 | ||||||
|  |                 sla_print.set_status_callback( | ||||||
|  |                             [](const PrintBase::SlicingStatus& s) | ||||||
|  |                 { | ||||||
|  |                     if(s.percent >= 0) // FIXME: is this sufficient?
 | ||||||
|  |                         printf("%3d%s %s\n", s.percent, "% =>", s.text.c_str()); | ||||||
|  |                 }); | ||||||
|  | 
 | ||||||
|                 PrintBase  *print = (printer_technology == ptFFF) ? static_cast<PrintBase*>(&fff_print) : static_cast<PrintBase*>(&sla_print); |                 PrintBase  *print = (printer_technology == ptFFF) ? static_cast<PrintBase*>(&fff_print) : static_cast<PrintBase*>(&sla_print); | ||||||
|                 if (! m_config.opt_bool("dont_arrange")) { |                 if (! m_config.opt_bool("dont_arrange")) { | ||||||
|                     //FIXME make the min_object_distance configurable.
 |                     //FIXME make the min_object_distance configurable.
 | ||||||
|  |  | ||||||
|  | @ -4403,11 +4403,13 @@ void GLCanvas3D::_resize(unsigned int w, unsigned int h) | ||||||
|     if ((m_canvas == nullptr) && (m_context == nullptr)) |     if ((m_canvas == nullptr) && (m_context == nullptr)) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|     wxGetApp().imgui()->set_display_size((float)w, (float)h); |     auto *imgui = wxGetApp().imgui(); | ||||||
|  |     imgui->set_display_size((float)w, (float)h); | ||||||
|  |     imgui->set_font_size(m_canvas->GetFont().GetPixelSize().y); | ||||||
| #if ENABLE_RETINA_GL | #if ENABLE_RETINA_GL | ||||||
|     wxGetApp().imgui()->set_style_scaling(m_retina_helper->get_scale_factor()); |     imgui->set_style_scaling(m_retina_helper->get_scale_factor()); | ||||||
| #else | #else | ||||||
|     wxGetApp().imgui()->set_style_scaling(m_canvas->GetContentScaleFactor()); |     imgui->set_style_scaling(m_canvas->GetContentScaleFactor()); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     // ensures that this canvas is current
 |     // ensures that this canvas is current
 | ||||||
|  |  | ||||||
|  | @ -81,7 +81,7 @@ IMPLEMENT_APP(GUI_App) | ||||||
| GUI_App::GUI_App() | GUI_App::GUI_App() | ||||||
|     : wxApp() |     : wxApp() | ||||||
|     , m_em_unit(10) |     , m_em_unit(10) | ||||||
|     , m_imgui(nullptr) |     , m_imgui(new ImGuiWrapper()) | ||||||
| {} | {} | ||||||
| 
 | 
 | ||||||
| bool GUI_App::OnInit() | bool GUI_App::OnInit() | ||||||
|  | @ -138,7 +138,6 @@ bool GUI_App::OnInit() | ||||||
|     // initialize label colors and fonts
 |     // initialize label colors and fonts
 | ||||||
|     init_label_colours(); |     init_label_colours(); | ||||||
|     init_fonts(); |     init_fonts(); | ||||||
|     m_imgui.reset(new ImGuiWrapper(m_normal_font.GetPixelSize().y)); |  | ||||||
| 
 | 
 | ||||||
|     load_language(); |     load_language(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -25,9 +25,9 @@ namespace Slic3r { | ||||||
| namespace GUI { | namespace GUI { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ImGuiWrapper::ImGuiWrapper(float font_size) | ImGuiWrapper::ImGuiWrapper() | ||||||
|     : m_glyph_ranges(nullptr) |     : m_glyph_ranges(nullptr) | ||||||
|     , m_font_size(font_size) |     , m_font_size(18.0) | ||||||
|     , m_font_texture(0) |     , m_font_texture(0) | ||||||
|     , m_style_scaling(1.0) |     , m_style_scaling(1.0) | ||||||
|     , m_mouse_buttons(0) |     , m_mouse_buttons(0) | ||||||
|  | @ -36,7 +36,6 @@ ImGuiWrapper::ImGuiWrapper(float font_size) | ||||||
| { | { | ||||||
|     ImGui::CreateContext(); |     ImGui::CreateContext(); | ||||||
| 
 | 
 | ||||||
|     init_default_font(); |  | ||||||
|     init_input(); |     init_input(); | ||||||
|     init_style(); |     init_style(); | ||||||
| 
 | 
 | ||||||
|  | @ -45,7 +44,7 @@ ImGuiWrapper::ImGuiWrapper(float font_size) | ||||||
| 
 | 
 | ||||||
| ImGuiWrapper::~ImGuiWrapper() | ImGuiWrapper::~ImGuiWrapper() | ||||||
| { | { | ||||||
|     destroy_device_objects(); |     destroy_font(); | ||||||
|     ImGui::DestroyContext(); |     ImGui::DestroyContext(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -82,7 +81,7 @@ void ImGuiWrapper::set_language(const std::string &language) | ||||||
| 
 | 
 | ||||||
|     if (ranges != m_glyph_ranges) { |     if (ranges != m_glyph_ranges) { | ||||||
|         m_glyph_ranges = ranges; |         m_glyph_ranges = ranges; | ||||||
|         init_default_font(); |         destroy_font(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -93,12 +92,20 @@ void ImGuiWrapper::set_display_size(float w, float h) | ||||||
|     io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f); |     io.DisplayFramebufferScale = ImVec2(1.0f, 1.0f); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void ImGuiWrapper::set_font_size(float font_size) | ||||||
|  | { | ||||||
|  |     if (m_font_size != font_size) { | ||||||
|  |         m_font_size = font_size; | ||||||
|  |         destroy_font(); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void ImGuiWrapper::set_style_scaling(float scaling) | void ImGuiWrapper::set_style_scaling(float scaling) | ||||||
| { | { | ||||||
|     if (!std::isnan(scaling) && !std::isinf(scaling) && scaling != m_style_scaling) { |     if (!std::isnan(scaling) && !std::isinf(scaling) && scaling != m_style_scaling) { | ||||||
|         ImGui::GetStyle().ScaleAllSizes(scaling / m_style_scaling); |         ImGui::GetStyle().ScaleAllSizes(scaling / m_style_scaling); | ||||||
|         m_style_scaling = scaling; |         m_style_scaling = scaling; | ||||||
|         init_default_font(); |         destroy_font(); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -156,12 +163,15 @@ bool ImGuiWrapper::update_key_data(wxKeyEvent &evt) | ||||||
| 
 | 
 | ||||||
| void ImGuiWrapper::new_frame() | void ImGuiWrapper::new_frame() | ||||||
| { | { | ||||||
|  |     printf("ImGuiWrapper: new_frame()\n"); | ||||||
|  | 
 | ||||||
|     if (m_new_frame_open) { |     if (m_new_frame_open) { | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (m_font_texture == 0) |     if (m_font_texture == 0) { | ||||||
|         create_device_objects(); |         init_font(); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     ImGui::NewFrame(); |     ImGui::NewFrame(); | ||||||
|     m_new_frame_open = true; |     m_new_frame_open = true; | ||||||
|  | @ -254,7 +264,8 @@ void ImGuiWrapper::text(const std::string &label) | ||||||
| 
 | 
 | ||||||
| void ImGuiWrapper::text(const wxString &label) | void ImGuiWrapper::text(const wxString &label) | ||||||
| { | { | ||||||
|     this->text(into_u8(label).c_str()); |     auto label_utf8 = into_u8(label); | ||||||
|  |     this->text(label_utf8.c_str()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool ImGuiWrapper::combo(const wxString& label, const std::vector<std::string>& options, int& selection) | bool ImGuiWrapper::combo(const wxString& label, const std::vector<std::string>& options, int& selection) | ||||||
|  | @ -282,6 +293,12 @@ bool ImGuiWrapper::combo(const wxString& label, const std::vector<std::string>& | ||||||
|     return res; |     return res; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | ImVec2 ImGuiWrapper::calc_text_size(const wxString &text) | ||||||
|  | { | ||||||
|  |     auto text_utf8 = into_u8(text); | ||||||
|  |     return ImGui::CalcTextSize(text_utf8.c_str()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void ImGuiWrapper::disabled_begin(bool disabled) | void ImGuiWrapper::disabled_begin(bool disabled) | ||||||
| { | { | ||||||
|     wxCHECK_RET(!m_disabled, "ImGUI: Unbalanced disabled_begin() call"); |     wxCHECK_RET(!m_disabled, "ImGUI: Unbalanced disabled_begin() call"); | ||||||
|  | @ -323,11 +340,13 @@ bool ImGuiWrapper::want_any_input() const | ||||||
|     return io.WantCaptureMouse || io.WantCaptureKeyboard || io.WantTextInput; |     return io.WantCaptureMouse || io.WantCaptureKeyboard || io.WantTextInput; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ImGuiWrapper::init_default_font() | void ImGuiWrapper::init_font() | ||||||
| { | { | ||||||
|  |     printf("ImGuiWrapper: init_font()\n"); | ||||||
|  | 
 | ||||||
|     const float font_size = m_font_size * m_style_scaling; |     const float font_size = m_font_size * m_style_scaling; | ||||||
| 
 | 
 | ||||||
|     destroy_fonts_texture(); |     destroy_font(); | ||||||
| 
 | 
 | ||||||
|     ImGuiIO& io = ImGui::GetIO(); |     ImGuiIO& io = ImGui::GetIO(); | ||||||
|     io.Fonts->Clear(); |     io.Fonts->Clear(); | ||||||
|  | @ -338,17 +357,8 @@ void ImGuiWrapper::init_default_font() | ||||||
|             throw std::runtime_error("ImGui: Could not load deafult font"); |             throw std::runtime_error("ImGui: Could not load deafult font"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| void ImGuiWrapper::create_device_objects() |  | ||||||
| { |  | ||||||
|     create_fonts_texture(); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void ImGuiWrapper::create_fonts_texture() |  | ||||||
| { |  | ||||||
|     // Build texture atlas
 |     // Build texture atlas
 | ||||||
|     ImGuiIO& io = ImGui::GetIO(); |  | ||||||
|     unsigned char* pixels; |     unsigned char* pixels; | ||||||
|     int width, height; |     int width, height; | ||||||
|     io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);   // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
 |     io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height);   // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
 | ||||||
|  | @ -554,14 +564,9 @@ bool ImGuiWrapper::display_initialized() const | ||||||
|     return io.DisplaySize.x >= 0.0f && io.DisplaySize.y >= 0.0f; |     return io.DisplaySize.x >= 0.0f && io.DisplaySize.y >= 0.0f; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ImGuiWrapper::destroy_device_objects() | void ImGuiWrapper::destroy_font() | ||||||
| { | { | ||||||
|     destroy_fonts_texture(); |     if (m_font_texture != 0) { | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void ImGuiWrapper::destroy_fonts_texture() |  | ||||||
| { |  | ||||||
|     if (m_font_texture) { |  | ||||||
|         ImGuiIO& io = ImGui::GetIO(); |         ImGuiIO& io = ImGui::GetIO(); | ||||||
|         io.Fonts->TexID = 0; |         io.Fonts->TexID = 0; | ||||||
|         glDeleteTextures(1, &m_font_texture); |         glDeleteTextures(1, &m_font_texture); | ||||||
|  |  | ||||||
|  | @ -18,9 +18,6 @@ namespace GUI { | ||||||
| 
 | 
 | ||||||
| class ImGuiWrapper | class ImGuiWrapper | ||||||
| { | { | ||||||
|     typedef std::map<std::string, ImFont*> FontsMap; |  | ||||||
| 
 |  | ||||||
|     FontsMap m_fonts; |  | ||||||
|     const ImWchar *m_glyph_ranges; |     const ImWchar *m_glyph_ranges; | ||||||
|     float m_font_size; |     float m_font_size; | ||||||
|     unsigned m_font_texture; |     unsigned m_font_texture; | ||||||
|  | @ -31,22 +28,27 @@ class ImGuiWrapper | ||||||
|     std::string m_clipboard_text; |     std::string m_clipboard_text; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|     ImGuiWrapper(float font_size); |     ImGuiWrapper(); | ||||||
|     ~ImGuiWrapper(); |     ~ImGuiWrapper(); | ||||||
| 
 | 
 | ||||||
|     void read_glsl_version(); |     void read_glsl_version(); | ||||||
| 
 | 
 | ||||||
|     void set_language(const std::string &language); |     void set_language(const std::string &language); | ||||||
|     void set_display_size(float w, float h); |     void set_display_size(float w, float h); | ||||||
|  |     void set_font_size(float font_size); | ||||||
|     void set_style_scaling(float scaling); |     void set_style_scaling(float scaling); | ||||||
|     bool update_mouse_data(wxMouseEvent &evt); |     bool update_mouse_data(wxMouseEvent &evt); | ||||||
|     bool update_key_data(wxKeyEvent &evt); |     bool update_key_data(wxKeyEvent &evt); | ||||||
| 
 | 
 | ||||||
|  |     float get_font_size() const { return m_font_size; } | ||||||
|     float get_style_scaling() const { return m_style_scaling; } |     float get_style_scaling() const { return m_style_scaling; } | ||||||
| 
 | 
 | ||||||
|     void new_frame(); |     void new_frame(); | ||||||
|     void render(); |     void render(); | ||||||
| 
 | 
 | ||||||
|  |     float scaled(float x) const { return x * m_font_size * m_style_scaling; } | ||||||
|  |     ImVec2 scaled_vec(float x, float y) const { return ImVec2(x * m_font_size * m_style_scaling, y * m_font_size * m_style_scaling); } | ||||||
|  | 
 | ||||||
|     void set_next_window_pos(float x, float y, int flag); |     void set_next_window_pos(float x, float y, int flag); | ||||||
|     void set_next_window_bg_alpha(float alpha); |     void set_next_window_bg_alpha(float alpha); | ||||||
| 
 | 
 | ||||||
|  | @ -64,6 +66,8 @@ public: | ||||||
|     void text(const wxString &label); |     void text(const wxString &label); | ||||||
|     bool combo(const wxString& label, const std::vector<std::string>& options, int& selection);   // Use -1 to not mark any option as selected
 |     bool combo(const wxString& label, const std::vector<std::string>& options, int& selection);   // Use -1 to not mark any option as selected
 | ||||||
| 
 | 
 | ||||||
|  |     ImVec2 calc_text_size(const wxString &text); | ||||||
|  | 
 | ||||||
|     void disabled_begin(bool disabled); |     void disabled_begin(bool disabled); | ||||||
|     void disabled_end(); |     void disabled_end(); | ||||||
| 
 | 
 | ||||||
|  | @ -73,15 +77,12 @@ public: | ||||||
|     bool want_any_input() const; |     bool want_any_input() const; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     void init_default_font(); |     void init_font(); | ||||||
|     void create_device_objects(); |  | ||||||
|     void create_fonts_texture(); |  | ||||||
|     void init_input(); |     void init_input(); | ||||||
|     void init_style(); |     void init_style(); | ||||||
|     void render_draw_data(ImDrawData *draw_data); |     void render_draw_data(ImDrawData *draw_data); | ||||||
|     bool display_initialized() const; |     bool display_initialized() const; | ||||||
|     void destroy_device_objects(); |     void destroy_font(); | ||||||
|     void destroy_fonts_texture(); |  | ||||||
| 
 | 
 | ||||||
|     static const char* clipboard_get(void* user_data); |     static const char* clipboard_get(void* user_data); | ||||||
|     static void clipboard_set(void* user_data, const char* text); |     static void clipboard_set(void* user_data, const char* text); | ||||||
|  |  | ||||||
|  | @ -118,17 +118,17 @@ void Selection::add(unsigned int volume_idx, bool as_single_selection) | ||||||
|     if (needs_reset) |     if (needs_reset) | ||||||
|         clear(); |         clear(); | ||||||
| 
 | 
 | ||||||
|     if (volume->is_modifier) |     if (!contains_volume(volume_idx)) | ||||||
|         m_mode = Volume; |         m_mode = volume->is_modifier ? Volume : Instance; | ||||||
|     else if (!contains_volume(volume_idx)) |     else | ||||||
|         m_mode = Instance; |         // keep current mode
 | ||||||
|     // else -> keep current mode
 |         return; | ||||||
| 
 | 
 | ||||||
|     switch (m_mode) |     switch (m_mode) | ||||||
|     { |     { | ||||||
|     case Volume: |     case Volume: | ||||||
|     { |     { | ||||||
|         if (volume->volume_idx() >= 0 && (is_empty() || (volume->instance_idx() == get_instance_idx()))) |         if ((volume->volume_idx() >= 0) && (is_empty() || (volume->instance_idx() == get_instance_idx()))) | ||||||
|             _add_volume(volume_idx); |             _add_volume(volume_idx); | ||||||
| 
 | 
 | ||||||
|         break; |         break; | ||||||
|  | @ -439,6 +439,8 @@ void Selection::translate(const Vec3d& displacement, bool local) | ||||||
|     if (!m_valid) |     if (!m_valid) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|  |     EMode translation_type = m_mode; | ||||||
|  | 
 | ||||||
|     for (unsigned int i : m_list) |     for (unsigned int i : m_list) | ||||||
|     { |     { | ||||||
|         if ((m_mode == Volume) || (*m_volumes)[i]->is_wipe_tower) |         if ((m_mode == Volume) || (*m_volumes)[i]->is_wipe_tower) | ||||||
|  | @ -452,13 +454,22 @@ void Selection::translate(const Vec3d& displacement, bool local) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         else if (m_mode == Instance) |         else if (m_mode == Instance) | ||||||
|  |         { | ||||||
|  |             if (_is_from_fully_selected_instance(i)) | ||||||
|                 (*m_volumes)[i]->set_instance_offset(m_cache.volumes_data[i].get_instance_position() + displacement); |                 (*m_volumes)[i]->set_instance_offset(m_cache.volumes_data[i].get_instance_position() + displacement); | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 Vec3d local_displacement = (m_cache.volumes_data[i].get_instance_rotation_matrix() * m_cache.volumes_data[i].get_instance_scale_matrix() * m_cache.volumes_data[i].get_instance_mirror_matrix()).inverse() * displacement; | ||||||
|  |                 (*m_volumes)[i]->set_volume_offset(m_cache.volumes_data[i].get_volume_position() + local_displacement); | ||||||
|  |                 translation_type = Volume; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #if !DISABLE_INSTANCES_SYNCH | #if !DISABLE_INSTANCES_SYNCH | ||||||
|     if (m_mode == Instance) |     if (translation_type == Instance) | ||||||
|         _synchronize_unselected_instances(SYNC_ROTATION_NONE); |         _synchronize_unselected_instances(SYNC_ROTATION_NONE); | ||||||
|     else if (m_mode == Volume) |     else if (translation_type == Volume) | ||||||
|         _synchronize_unselected_volumes(); |         _synchronize_unselected_volumes(); | ||||||
| #endif // !DISABLE_INSTANCES_SYNCH
 | #endif // !DISABLE_INSTANCES_SYNCH
 | ||||||
| 
 | 
 | ||||||
|  | @ -1683,5 +1694,29 @@ void Selection::_ensure_on_bed() | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool Selection::_is_from_fully_selected_instance(unsigned int volume_idx) const | ||||||
|  | { | ||||||
|  |     struct SameInstance | ||||||
|  |     { | ||||||
|  |         int obj_idx; | ||||||
|  |         int inst_idx; | ||||||
|  |         GLVolumePtrs& volumes; | ||||||
|  | 
 | ||||||
|  |         SameInstance(int obj_idx, int inst_idx, GLVolumePtrs& volumes) : obj_idx(obj_idx), inst_idx(inst_idx), volumes(volumes) {} | ||||||
|  |         bool operator () (unsigned int i) { return (volumes[i]->object_idx() == obj_idx) && (volumes[i]->instance_idx() == inst_idx); } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     if ((unsigned int)m_volumes->size() <= volume_idx) | ||||||
|  |         return false; | ||||||
|  | 
 | ||||||
|  |     GLVolume* volume = (*m_volumes)[volume_idx]; | ||||||
|  |     int object_idx = volume->object_idx(); | ||||||
|  |     if ((int)m_model->objects.size() <= object_idx) | ||||||
|  |         return false; | ||||||
|  | 
 | ||||||
|  |     unsigned int count = (unsigned int)std::count_if(m_list.begin(), m_list.end(), SameInstance(object_idx, volume->instance_idx(), *m_volumes)); | ||||||
|  |     return count == (unsigned int)m_model->objects[object_idx]->volumes.size(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace GUI
 | } // namespace GUI
 | ||||||
| } // namespace Slic3r
 | } // namespace Slic3r
 | ||||||
|  |  | ||||||
|  | @ -297,6 +297,7 @@ private: | ||||||
|     void _synchronize_unselected_instances(SyncRotationType sync_rotation_type); |     void _synchronize_unselected_instances(SyncRotationType sync_rotation_type); | ||||||
|     void _synchronize_unselected_volumes(); |     void _synchronize_unselected_volumes(); | ||||||
|     void _ensure_on_bed(); |     void _ensure_on_bed(); | ||||||
|  |     bool _is_from_fully_selected_instance(unsigned int volume_idx) const; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| } // namespace GUI
 | } // namespace GUI
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv