mirror of
				https://github.com/SoftFever/OrcaSlicer.git
				synced 2025-10-31 04:31:15 -06:00 
			
		
		
		
	Bugfix: early object destruction caused a segfault when splitting. Also fixed a memory leak and restore background processing when split only detected one part. #2466 #2398
This commit is contained in:
		
							parent
							
								
									494efe65b2
								
							
						
					
					
						commit
						c4832c5342
					
				
					 3 changed files with 12 additions and 9 deletions
				
			
		|  | @ -774,18 +774,20 @@ sub split_object { | |||
|     my ($obj_idx, $current_object)  = $self->selected_object; | ||||
|      | ||||
|     # we clone model object because split_object() adds the split volumes | ||||
|     # into the same model object, thus causing duplicated when we call load_model_objects() | ||||
|     my $current_model_object        = $self->{model}->clone->objects->[$obj_idx]; | ||||
|     # into the same model object, thus causing duplicates when we call load_model_objects() | ||||
|     my $new_model = $self->{model}->clone;  # store this before calling get_object() | ||||
|     my $current_model_object = $new_model->get_object($obj_idx); | ||||
|      | ||||
|     if (@{$current_model_object->volumes} > 1) { | ||||
|     if ($current_model_object->volumes_count > 1) { | ||||
|         Slic3r::GUI::warning_catcher($self)->("The selected object can't be split because it contains more than one volume/material."); | ||||
|         return; | ||||
|     } | ||||
|      | ||||
|     $self->stop_background_process; | ||||
|     $self->pause_background_process; | ||||
|      | ||||
|     my @model_objects = @{$current_model_object->split_object}; | ||||
|     if (@model_objects == 1) { | ||||
|         $self->resume_background_process; | ||||
|         Slic3r::GUI::warning_catcher($self)->("The selected object couldn't be split because it contains only one part."); | ||||
|         return; | ||||
|     } | ||||
|  |  | |||
|  | @ -13,7 +13,7 @@ Model::Model(const Model &other) | |||
|     // copy objects
 | ||||
|     this->objects.reserve(other.objects.size()); | ||||
|     for (ModelObjectPtrs::const_iterator i = other.objects.begin(); i != other.objects.end(); ++i) | ||||
|         this->add_object(**i); | ||||
|         this->add_object(**i, true); | ||||
| } | ||||
| 
 | ||||
| Model& Model::operator= (Model other) | ||||
|  | @ -618,6 +618,7 @@ ModelObject::split(ModelObjectPtrs* new_objects) | |||
|         new_volume->material_id(volume->material_id()); | ||||
|          | ||||
|         new_objects->push_back(new_object); | ||||
|         delete *mesh; | ||||
|     } | ||||
|      | ||||
|     return; | ||||
|  |  | |||
|  | @ -42,9 +42,9 @@ template <class T> | |||
| class Ref { | ||||
|     T* val; | ||||
| public: | ||||
|     Ref() {} | ||||
|     Ref() : val(NULL) {} | ||||
|     Ref(T* t) : val(t) {} | ||||
|     operator T*() const {return val; } | ||||
|     operator T*() const { return val; } | ||||
|     static const char* CLASS() { return ClassTraits<T>::name_ref; } | ||||
| }; | ||||
|    | ||||
|  | @ -52,10 +52,10 @@ template <class T> | |||
| class Clone { | ||||
|     T* val; | ||||
| public: | ||||
|     Clone() : val() {} | ||||
|     Clone() : val(NULL) {} | ||||
|     Clone(T* t) : val(new T(*t)) {} | ||||
|     Clone(const T& t) : val(new T(t)) {} | ||||
|     operator T*() const {return val; } | ||||
|     operator T*() const { return val; } | ||||
|     static const char* CLASS() { return ClassTraits<T>::name; } | ||||
| }; | ||||
| }; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Alessandro Ranellucci
						Alessandro Ranellucci