Refactoring: move split logic in a single place (ModelObject class)
This commit is contained in:
parent
e5cce32302
commit
9a4e8f39af
2 changed files with 49 additions and 75 deletions
|
@ -751,49 +751,24 @@ sub split_object {
|
||||||
my $current_model_object = $self->{model}->objects->[$obj_idx];
|
my $current_model_object = $self->{model}->objects->[$obj_idx];
|
||||||
|
|
||||||
if (@{$current_model_object->volumes} > 1) {
|
if (@{$current_model_object->volumes} > 1) {
|
||||||
Slic3r::GUI::warning_catcher($self)->("The selected object couldn't be split because it contains more than one volume/material.");
|
Slic3r::GUI::warning_catcher($self)->("The selected object can't be split because it contains more than one volume/material.");
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
my @new_meshes = @{$current_model_object->volumes->[0]->mesh->split};
|
|
||||||
if (@new_meshes == 1) {
|
|
||||||
Slic3r::GUI::warning_catcher($self)->("The selected object couldn't be split because it already contains a single part.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$self->stop_background_process;
|
$self->stop_background_process;
|
||||||
|
|
||||||
# create a bogus Model object, we only need to instantiate the new Model::Object objects
|
my @model_objects = @{$current_model_object->split_object};
|
||||||
my $new_model = Slic3r::Model->new;
|
if (@model_objects == 1) {
|
||||||
|
Slic3r::GUI::warning_catcher($self)->("The selected object couldn't be split because it already contains a single part.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
my @model_objects = ();
|
foreach my $object (@model_objects) {
|
||||||
foreach my $mesh (@new_meshes) {
|
$object->instances->[$_]->offset->translate($_ * 10, $_ * 10)
|
||||||
$mesh->repair;
|
for 1..$#{ $object->instances };
|
||||||
|
|
||||||
my $model_object = $new_model->add_object(
|
|
||||||
input_file => $current_model_object->input_file,
|
|
||||||
config => $current_model_object->config->clone,
|
|
||||||
layer_height_ranges => $current_model_object->layer_height_ranges, # TODO: clone this
|
|
||||||
);
|
|
||||||
$model_object->add_volume(
|
|
||||||
mesh => $mesh,
|
|
||||||
material_id => $current_model_object->volumes->[0]->material_id,
|
|
||||||
);
|
|
||||||
|
|
||||||
for my $instance_idx (0..$#{ $current_model_object->instances }) {
|
|
||||||
my $current_instance = $current_model_object->instances->[$instance_idx];
|
|
||||||
$model_object->add_instance(
|
|
||||||
offset => Slic3r::Pointf->new(
|
|
||||||
$current_instance->offset->[X] + ($instance_idx * 10),
|
|
||||||
$current_instance->offset->[Y] + ($instance_idx * 10),
|
|
||||||
),
|
|
||||||
rotation => $current_instance->rotation,
|
|
||||||
scaling_factor => $current_instance->scaling_factor,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
# we need to center this single object around origin
|
# we need to center this single object around origin
|
||||||
$model_object->center_around_origin;
|
$object->center_around_origin;
|
||||||
push @model_objects, $model_object;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# remove the original object before spawning the object_loaded event, otherwise
|
# remove the original object before spawning the object_loaded event, otherwise
|
||||||
|
|
|
@ -158,46 +158,6 @@ sub _arrange {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
# this method splits objects into multiple distinct objects by walking their meshes
|
|
||||||
sub split_meshes {
|
|
||||||
my $self = shift;
|
|
||||||
|
|
||||||
my @objects = @{$self->objects};
|
|
||||||
@{$self->objects} = ();
|
|
||||||
|
|
||||||
foreach my $object (@objects) {
|
|
||||||
if (@{$object->volumes} > 1) {
|
|
||||||
# We can't split meshes if there's more than one material, because
|
|
||||||
# we can't group the resulting meshes by object afterwards
|
|
||||||
$self->_add_object($object);
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $volume = $object->volumes->[0];
|
|
||||||
foreach my $mesh (@{$volume->mesh->split}) {
|
|
||||||
my $new_object = $self->add_object(
|
|
||||||
input_file => $object->input_file,
|
|
||||||
config => $object->config->clone,
|
|
||||||
layer_height_ranges => $object->layer_height_ranges, # TODO: this needs to be cloned
|
|
||||||
origin_translation => $object->origin_translation,
|
|
||||||
);
|
|
||||||
$new_object->add_volume(
|
|
||||||
mesh => $mesh,
|
|
||||||
name => $volume->name,
|
|
||||||
material_id => $volume->material_id,
|
|
||||||
config => $volume->config,
|
|
||||||
);
|
|
||||||
|
|
||||||
# add one instance per original instance
|
|
||||||
$new_object->add_instance(
|
|
||||||
offset => Slic3r::Pointf->new(@{$_->offset}),
|
|
||||||
rotation => $_->rotation,
|
|
||||||
scaling_factor => $_->scaling_factor,
|
|
||||||
) for @{ $object->instances // [] };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub print_info {
|
sub print_info {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
$_->print_info for @{$self->objects};
|
$_->print_info for @{$self->objects};
|
||||||
|
@ -299,6 +259,45 @@ sub add_instance {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub split_object {
|
||||||
|
my ($self) = @_;
|
||||||
|
|
||||||
|
if (@{$self->volumes} > 1) {
|
||||||
|
# We can't split meshes if there's more than one volume, because
|
||||||
|
# we can't group the resulting meshes by object afterwards
|
||||||
|
my $o = $self->model->_add_object($self);
|
||||||
|
return [$o];
|
||||||
|
}
|
||||||
|
|
||||||
|
my @new_objects = ();
|
||||||
|
my $volume = $self->volumes->[0];
|
||||||
|
foreach my $mesh (@{$volume->mesh->split}) {
|
||||||
|
$mesh->repair;
|
||||||
|
|
||||||
|
push @new_objects, my $new_object = $self->model->add_object(
|
||||||
|
input_file => $self->input_file,
|
||||||
|
config => $self->config->clone,
|
||||||
|
layer_height_ranges => $self->layer_height_ranges, # TODO: this needs to be cloned
|
||||||
|
origin_translation => $self->origin_translation,
|
||||||
|
);
|
||||||
|
$new_object->add_volume(
|
||||||
|
mesh => $mesh,
|
||||||
|
name => $volume->name,
|
||||||
|
material_id => $volume->material_id,
|
||||||
|
config => $volume->config,
|
||||||
|
);
|
||||||
|
|
||||||
|
# add one instance per original instance
|
||||||
|
$new_object->add_instance(
|
||||||
|
offset => Slic3r::Pointf->new(@{$_->offset}),
|
||||||
|
rotation => $_->rotation,
|
||||||
|
scaling_factor => $_->scaling_factor,
|
||||||
|
) for @{ $self->instances };
|
||||||
|
}
|
||||||
|
|
||||||
|
return [@new_objects];
|
||||||
|
}
|
||||||
|
|
||||||
sub rotate {
|
sub rotate {
|
||||||
my ($self, $angle, $axis) = @_;
|
my ($self, $angle, $axis) = @_;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue