mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 12:11:15 -06:00 
			
		
		
		
	World / local coordinates: Fixed wrong scaling of a group selection,
changed the "anisotropic scaling" - "embed vertices" message, fixed scaling in the world coordinate system, so it does not count the modifiers into the bounding box size.
This commit is contained in:
		
							parent
							
								
									a351e99bac
								
							
						
					
					
						commit
						6881911411
					
				
					 4 changed files with 40 additions and 16 deletions
				
			
		|  | @ -37,8 +37,8 @@ static wxBitmapComboBox* create_word_local_combo(wxWindow *parent) | |||
|     temp->SetFont(Slic3r::GUI::wxGetApp().normal_font()); | ||||
|     temp->SetBackgroundStyle(wxBG_STYLE_PAINT); | ||||
| 
 | ||||
|     temp->Append(_(L("World"))); | ||||
|     temp->Append(_(L("Local"))); | ||||
|     temp->Append(_(L("World coordinates"))); | ||||
|     temp->Append(_(L("Local coordinates"))); | ||||
|     temp->SetSelection(0); | ||||
|     temp->SetValue(temp->GetString(0)); | ||||
| 
 | ||||
|  | @ -228,7 +228,7 @@ void ObjectManipulation::Show(const bool show) | |||
| 
 | ||||
| bool ObjectManipulation::IsShown() | ||||
| { | ||||
|     return m_og->get_grid_sizer()->IsShown(2); | ||||
| 	return dynamic_cast<const wxStaticBoxSizer*>(m_og->sizer)->GetStaticBox()->IsShown(); //  m_og->get_grid_sizer()->IsShown(2);
 | ||||
| } | ||||
| 
 | ||||
| void ObjectManipulation::UpdateAndShow(const bool show) | ||||
|  | @ -265,7 +265,7 @@ void ObjectManipulation::update_settings_value(const Selection& selection) | |||
|         if (m_world_coordinates) { | ||||
| 			m_new_rotate_label_string = L("Rotate"); | ||||
| 			m_new_rotation = Vec3d::Zero(); | ||||
| 			m_new_size     = selection.get_bounding_box().size(); | ||||
| 			m_new_size     = selection.get_scaled_instance_bounding_box().size(); | ||||
| 			m_new_scale    = m_new_size.cwiseProduct(selection.get_unscaled_instance_bounding_box().size().cwiseInverse()) * 100.; | ||||
| 		} else { | ||||
| 			m_new_rotation = volume->get_instance_rotation() * (180. / M_PI); | ||||
|  | @ -399,7 +399,7 @@ void ObjectManipulation::reset_settings_value() | |||
| { | ||||
|     m_new_position = Vec3d::Zero(); | ||||
|     m_new_rotation = Vec3d::Zero(); | ||||
|     m_new_scale = Vec3d::Ones(); | ||||
|     m_new_scale = Vec3d::Ones() * 100.; | ||||
|     m_new_size = Vec3d::Zero(); | ||||
|     m_new_enabled = false; | ||||
|     // no need to set the dirty flag here as this method is called from update_settings_value(),
 | ||||
|  | @ -590,10 +590,11 @@ void ObjectManipulation::set_uniform_scaling(const bool new_value) | |||
| 			wxMessageDialog dlg(GUI::wxGetApp().mainframe, | ||||
|                 _(L("The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n" | ||||
|                     "Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n" | ||||
|                     "once the rotation is embedded into the object coordinates.\n" | ||||
|                     "once the rotation is embedded into the object coordinates.")) + "\n" + | ||||
|                 _(L("This operation is irreversible.\n" | ||||
|                     "Do you want to proceed?")), | ||||
|                 SLIC3R_APP_NAME, | ||||
|                 wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION); | ||||
| 				wxYES_NO | wxCANCEL | wxCANCEL_DEFAULT | wxICON_QUESTION); | ||||
|             if (dlg.ShowModal() != wxID_YES) { | ||||
|                 // Enforce uniform scaling.
 | ||||
|                 m_lock_bnt->SetLock(true); | ||||
|  |  | |||
|  | @ -1,17 +1,14 @@ | |||
| #ifndef slic3r_OptionsGroup_hpp_ | ||||
| #define slic3r_OptionsGroup_hpp_ | ||||
| 
 | ||||
| //#include <wx/wx.h>
 | ||||
| #include <wx/stattext.h> | ||||
| #include <wx/settings.h> | ||||
| //#include <wx/window.h>
 | ||||
| 
 | ||||
| #include <map> | ||||
| #include <functional> | ||||
| 
 | ||||
| #include "libslic3r/Config.hpp" | ||||
| #include "libslic3r/PrintConfig.hpp" | ||||
| // #include "libslic3r/libslic3r.h"
 | ||||
| 
 | ||||
| #include "Field.hpp" | ||||
| #include "GUI_App.hpp" | ||||
|  |  | |||
|  | @ -430,10 +430,16 @@ const BoundingBoxf3& Selection::get_unscaled_instance_bounding_box() const | |||
| { | ||||
|     if (m_unscaled_instance_bounding_box_dirty) | ||||
|         calc_unscaled_instance_bounding_box(); | ||||
| 
 | ||||
|     return m_unscaled_instance_bounding_box; | ||||
| } | ||||
| 
 | ||||
| const BoundingBoxf3& Selection::get_scaled_instance_bounding_box() const | ||||
| { | ||||
|     if (m_scaled_instance_bounding_box_dirty) | ||||
|         calc_scaled_instance_bounding_box(); | ||||
|     return m_scaled_instance_bounding_box; | ||||
| } | ||||
| 
 | ||||
| void Selection::start_dragging() | ||||
| { | ||||
|     if (!m_valid) | ||||
|  | @ -1416,11 +1422,11 @@ void Selection::calc_bounding_box() const | |||
| void Selection::calc_unscaled_instance_bounding_box() const | ||||
| { | ||||
| 	m_unscaled_instance_bounding_box = BoundingBoxf3(); | ||||
| 	if (m_valid) | ||||
| 	{ | ||||
| 		for (unsigned int i : m_list) | ||||
| 		{ | ||||
| 	if (m_valid) { | ||||
| 		for (unsigned int i : m_list) { | ||||
| 			const GLVolume &volume = *(*m_volumes)[i]; | ||||
|             if (volume.is_modifier) | ||||
|                 continue; | ||||
| 			Transform3d trafo = volume.get_instance_transformation().get_matrix(false, false, true, false) * volume.get_volume_transformation().get_matrix(); | ||||
| 			trafo.translation()(2) += volume.get_sla_shift_z(); | ||||
| 			m_unscaled_instance_bounding_box.merge(volume.transformed_convex_hull_bounding_box(trafo)); | ||||
|  | @ -1429,6 +1435,22 @@ void Selection::calc_unscaled_instance_bounding_box() const | |||
| 	m_unscaled_instance_bounding_box_dirty = false; | ||||
| } | ||||
| 
 | ||||
| void Selection::calc_scaled_instance_bounding_box() const | ||||
| { | ||||
|     m_scaled_instance_bounding_box = BoundingBoxf3(); | ||||
|     if (m_valid) { | ||||
|         for (unsigned int i : m_list) { | ||||
|             const GLVolume &volume = *(*m_volumes)[i]; | ||||
|             if (volume.is_modifier) | ||||
|                 continue; | ||||
|             Transform3d trafo = volume.get_instance_transformation().get_matrix(false, false, false, false) * volume.get_volume_transformation().get_matrix(); | ||||
|             trafo.translation()(2) += volume.get_sla_shift_z(); | ||||
|             m_scaled_instance_bounding_box.merge(volume.transformed_convex_hull_bounding_box(trafo)); | ||||
|         } | ||||
|     } | ||||
|     m_scaled_instance_bounding_box_dirty = false; | ||||
| } | ||||
| 
 | ||||
| void Selection::render_selected_volumes() const | ||||
| { | ||||
|     float color[3] = { 1.0f, 1.0f, 1.0f }; | ||||
|  |  | |||
|  | @ -187,6 +187,8 @@ private: | |||
|     // is useful for absolute scaling of tilted objects in world coordinate space.
 | ||||
|     mutable BoundingBoxf3 m_unscaled_instance_bounding_box; | ||||
|     mutable bool m_unscaled_instance_bounding_box_dirty; | ||||
|     mutable BoundingBoxf3 m_scaled_instance_bounding_box; | ||||
|     mutable bool m_scaled_instance_bounding_box_dirty; | ||||
| 
 | ||||
| #if ENABLE_RENDER_SELECTION_CENTER | ||||
|     GLUquadricObj* m_quadric; | ||||
|  | @ -272,6 +274,7 @@ public: | |||
|     // Bounding box of a selection, with no instance scaling applied. This bounding box
 | ||||
|     // is useful for absolute scaling of tilted objects in world coordinate space.
 | ||||
|     const BoundingBoxf3& get_unscaled_instance_bounding_box() const; | ||||
|     const BoundingBoxf3& get_scaled_instance_bounding_box() const; | ||||
| 
 | ||||
|     void start_dragging(); | ||||
| 
 | ||||
|  | @ -311,7 +314,8 @@ private: | |||
|     void do_remove_object(unsigned int object_idx); | ||||
|     void calc_bounding_box() const; | ||||
|     void calc_unscaled_instance_bounding_box() const; | ||||
|     void set_bounding_boxes_dirty() { m_bounding_box_dirty = true; m_unscaled_instance_bounding_box_dirty = true; } | ||||
|     void calc_scaled_instance_bounding_box() const; | ||||
|     void set_bounding_boxes_dirty() { m_bounding_box_dirty = true; m_unscaled_instance_bounding_box_dirty = true; m_scaled_instance_bounding_box_dirty = true; } | ||||
|     void render_selected_volumes() const; | ||||
|     void render_synchronized_volumes() const; | ||||
|     void render_bounding_box(const BoundingBoxf3& box, float* color) const; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 bubnikv
						bubnikv