mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-30 20:21:12 -06:00 
			
		
		
		
	FIX: the assemble view is not correct after cutting or splitting
STUDIO-2934 Change-Id: Ia77b8704d65fad09103a42f1c56191928eff8cb0
This commit is contained in:
		
							parent
							
								
									ec7306e3cb
								
							
						
					
					
						commit
						1a9b82cf1a
					
				
					 1 changed files with 25 additions and 8 deletions
				
			
		|  | @ -1969,6 +1969,16 @@ static void reset_instance_transformation(ModelObject* object, size_t src_instan | |||
| 
 | ||||
|     for (size_t i = 0; i < object->instances.size(); ++i) { | ||||
|         auto& obj_instance = object->instances[i]; | ||||
| 
 | ||||
|         Geometry::Transformation instance_transformation_copy = obj_instance->get_transformation(); | ||||
|         instance_transformation_copy.set_offset(Vec3d(0, 0, 0)); | ||||
|         if (object->volumes.size() == 1) { | ||||
|             instance_transformation_copy.set_offset(-object->volumes[0]->get_offset()); | ||||
|         } | ||||
| 
 | ||||
|         if (i == src_instance_idx && object->volumes.size() == 1) | ||||
|             invalidate_translations(object, obj_instance); | ||||
| 
 | ||||
|         const Vec3d offset = obj_instance->get_offset(); | ||||
|         const double rot_z = obj_instance->get_rotation().z(); | ||||
| 
 | ||||
|  | @ -1998,6 +2008,13 @@ static void reset_instance_transformation(ModelObject* object, size_t src_instan | |||
|         } | ||||
| 
 | ||||
|         obj_instance->set_rotation(rotation); | ||||
| 
 | ||||
|         // update the assemble matrix
 | ||||
|         const Transform3d &assemble_matrix = obj_instance->get_assemble_transformation().get_matrix(); | ||||
|         const Transform3d &instance_inverse_matrix = instance_transformation_copy.get_matrix().inverse(); | ||||
|         Transform3d new_instance_inverse_matrix = instance_inverse_matrix * obj_instance->get_transformation().get_matrix(true).inverse(); | ||||
|         Transform3d new_assemble_transform = assemble_matrix * new_instance_inverse_matrix; | ||||
|         obj_instance->set_assemble_from_transform(new_assemble_transform); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -2077,16 +2094,12 @@ ModelObjectPtrs ModelObject::cut(size_t instance, std::array<Vec3d, 4> plane_poi | |||
|     } | ||||
|     else { | ||||
|         if (attributes.has(ModelObjectCutAttribute::KeepUpper) && upper->volumes.size() > 0) { | ||||
|             invalidate_translations(upper, instances[instance]); | ||||
| 
 | ||||
|             reset_instance_transformation(upper, instance, cut_matrix, attributes.has(ModelObjectCutAttribute::PlaceOnCutUpper), | ||||
|                                           attributes.has(ModelObjectCutAttribute::FlipUpper), local_displace); | ||||
| 
 | ||||
|             res.push_back(upper); | ||||
|         } | ||||
|         if (attributes.has(ModelObjectCutAttribute::KeepLower) && lower->volumes.size() > 0) { | ||||
|             invalidate_translations(lower, instances[instance]); | ||||
| 
 | ||||
|             reset_instance_transformation(lower, instance, cut_matrix, attributes.has(ModelObjectCutAttribute::PlaceOnCutLower), | ||||
|                                           attributes.has(ModelObjectCutAttribute::PlaceOnCutLower) ? true : attributes.has(ModelObjectCutAttribute::FlipLower)); | ||||
| 
 | ||||
|  | @ -2095,8 +2108,6 @@ ModelObjectPtrs ModelObject::cut(size_t instance, std::array<Vec3d, 4> plane_poi | |||
| 
 | ||||
|         if (attributes.has(ModelObjectCutAttribute::CreateDowels) && !dowels.empty()) { | ||||
|             for (auto dowel : dowels) { | ||||
|                 invalidate_translations(dowel, instances[instance]); | ||||
| 
 | ||||
|                 reset_instance_transformation(dowel, instance, Transform3d::Identity(), false, false, local_dowels_displace); | ||||
| 
 | ||||
|                 local_dowels_displace += dowel->full_raw_mesh_bounding_box().size().cwiseProduct(Vec3d(-1.5, -1.5, 0.0)); | ||||
|  | @ -2310,9 +2321,15 @@ void ModelObject::split(ModelObjectPtrs* new_objects) | |||
|             { | ||||
|                 Vec3d shift = model_instance->get_transformation().get_matrix(true) * new_vol->get_offset(); | ||||
|                 model_instance->set_offset(model_instance->get_offset() + shift); | ||||
|                  | ||||
|                 //BBS: add assemble_view related logic
 | ||||
|                 model_instance->set_assemble_transformation(model_instance->get_transformation()); | ||||
|                 model_instance->set_offset_to_assembly(new_vol->get_offset()); | ||||
|                 Geometry::Transformation instance_transformation_copy = model_instance->get_transformation(); | ||||
|                 instance_transformation_copy.set_offset(-new_vol->get_offset()); | ||||
|                 const Transform3d &assemble_matrix = model_instance->get_assemble_transformation().get_matrix(); | ||||
|                 const Transform3d &instance_inverse_matrix = instance_transformation_copy.get_matrix().inverse(); | ||||
|                 Transform3d new_instance_inverse_matrix = instance_inverse_matrix * model_instance->get_transformation().get_matrix(true).inverse(); | ||||
|                 Transform3d new_assemble_transform      = assemble_matrix * new_instance_inverse_matrix; | ||||
|                 model_instance->set_assemble_from_transform(new_assemble_transform); | ||||
|             } | ||||
| 
 | ||||
|             new_vol->set_offset(Vec3d::Zero()); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 zhimin.zeng
						zhimin.zeng