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
@ -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…
Reference in New Issue
Block a user