Some cleanup for the plater code
This commit is contained in:
parent
def013ba91
commit
962a51cc80
@ -704,11 +704,6 @@ sub make_model {
|
|||||||
foreach my $plater_object (@{$self->{objects}}) {
|
foreach my $plater_object (@{$self->{objects}}) {
|
||||||
my $model_object = $plater_object->get_model_object;
|
my $model_object = $plater_object->get_model_object;
|
||||||
|
|
||||||
# if we need to alter the mesh, clone it first
|
|
||||||
if ($plater_object->scale != 1) {
|
|
||||||
$model_object = $model_object->clone;
|
|
||||||
}
|
|
||||||
|
|
||||||
my $new_model_object = $model->add_object(
|
my $new_model_object = $model->add_object(
|
||||||
vertices => $model_object->vertices,
|
vertices => $model_object->vertices,
|
||||||
input_file => $plater_object->input_file,
|
input_file => $plater_object->input_file,
|
||||||
@ -721,10 +716,10 @@ sub make_model {
|
|||||||
);
|
);
|
||||||
$model->set_material($volume->material_id || 0, {});
|
$model->set_material($volume->material_id || 0, {});
|
||||||
}
|
}
|
||||||
$new_model_object->scale($plater_object->scale);
|
|
||||||
$new_model_object->align_to_origin;
|
$new_model_object->align_to_origin;
|
||||||
$new_model_object->add_instance(
|
$new_model_object->add_instance(
|
||||||
rotation => $plater_object->rotate, # around center point
|
rotation => $plater_object->rotate, # around center point
|
||||||
|
scaling_factor => $plater_object->scale,
|
||||||
offset => Slic3r::Point->new($_),
|
offset => Slic3r::Point->new($_),
|
||||||
) for @{$plater_object->instances};
|
) for @{$plater_object->instances};
|
||||||
}
|
}
|
||||||
@ -778,9 +773,12 @@ sub recenter {
|
|||||||
map Slic3r::Geometry::move_points($_, @points), @{$obj->instances};
|
map Slic3r::Geometry::move_points($_, @points), @{$obj->instances};
|
||||||
} @{$self->{objects}},
|
} @{$self->{objects}},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
# $self->{shift} contains the offset in pixels to add to object instances in order to center them
|
||||||
|
# it is expressed in upwards Y
|
||||||
$self->{shift} = [
|
$self->{shift} = [
|
||||||
($self->{canvas}->GetSize->GetWidth - $self->to_pixel($print_bb[X2] + $print_bb[X1])) / 2,
|
$self->to_pixel(-$print_bb[X1]) + ($self->{canvas}->GetSize->GetWidth - $self->to_pixel($print_bb[X2] - $print_bb[X1])) / 2,
|
||||||
($self->{canvas}->GetSize->GetHeight - $self->to_pixel($print_bb[Y2] + $print_bb[Y1])) / 2,
|
$self->to_pixel(-$print_bb[Y1]) + ($self->{canvas}->GetSize->GetHeight - $self->to_pixel($print_bb[Y2] - $print_bb[Y1])) / 2,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -814,10 +812,8 @@ sub _update_bed_size {
|
|||||||
|
|
||||||
# supposing the preview canvas is square, calculate the scaling factor
|
# supposing the preview canvas is square, calculate the scaling factor
|
||||||
# to constrain print bed area inside preview
|
# to constrain print bed area inside preview
|
||||||
my $bed_size = $self->{config}->bed_size;
|
# when the canvas is not rendered yet, its GetSize() method returns 0,0
|
||||||
my $canvas_side = CANVAS_SIZE->[X]; # when the canvas is not rendered yet, its GetSize() method returns 0,0
|
$self->{scaling_factor} = CANVAS_SIZE->[X] / max(@{ $self->{config}->bed_size });
|
||||||
my $bed_largest_side = $bed_size->[X] > $bed_size->[Y] ? $bed_size->[X] : $bed_size->[Y];
|
|
||||||
$self->{scaling_factor} = $canvas_side / $bed_largest_side;
|
|
||||||
$_->change_thumbnail_scaling_factor($self->{scaling_factor}) for @{ $self->{objects} };
|
$_->change_thumbnail_scaling_factor($self->{scaling_factor}) for @{ $self->{objects} };
|
||||||
$self->recenter;
|
$self->recenter;
|
||||||
}
|
}
|
||||||
@ -949,7 +945,6 @@ sub mouse_event {
|
|||||||
my ($obj_idx, $instance_idx, $thumbnail) = @$preview;
|
my ($obj_idx, $instance_idx, $thumbnail) = @$preview;
|
||||||
my $instance = $parent->{objects}[$obj_idx]->instances->[$instance_idx];
|
my $instance = $parent->{objects}[$obj_idx]->instances->[$instance_idx];
|
||||||
$instance->[$_] = $parent->to_units($pos->[$_] - $self->{drag_start_pos}[$_] - $parent->{shift}[$_]) for X,Y;
|
$instance->[$_] = $parent->to_units($pos->[$_] - $self->{drag_start_pos}[$_] - $parent->{shift}[$_]) for X,Y;
|
||||||
$instance = $parent->_y([$instance])->[0];
|
|
||||||
$parent->Refresh;
|
$parent->Refresh;
|
||||||
}
|
}
|
||||||
} elsif ($event->Moving) {
|
} elsif ($event->Moving) {
|
||||||
@ -1098,10 +1093,12 @@ sub _trigger_model_object {
|
|||||||
my $self = shift;
|
my $self = shift;
|
||||||
if ($self->model_object) {
|
if ($self->model_object) {
|
||||||
$self->model_object->align_to_origin;
|
$self->model_object->align_to_origin;
|
||||||
|
$self->bounding_box($self->model_object->bounding_box);
|
||||||
|
|
||||||
my $mesh = $self->model_object->mesh;
|
my $mesh = $self->model_object->mesh;
|
||||||
$self->bounding_box($mesh->bounding_box);
|
|
||||||
$self->facets(scalar @{$mesh->facets});
|
$self->facets(scalar @{$mesh->facets});
|
||||||
$self->vertices(scalar @{$mesh->vertices});
|
$self->vertices(scalar @{$mesh->vertices});
|
||||||
|
|
||||||
$self->materials($self->model_object->materials_count);
|
$self->materials($self->model_object->materials_count);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1140,8 +1137,7 @@ sub instances_count {
|
|||||||
sub make_thumbnail {
|
sub make_thumbnail {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
my $mesh = $self->model_object->mesh;
|
my $mesh = $self->model_object->mesh; # $self->model_object is already aligned to origin
|
||||||
$mesh->align_to_origin;
|
|
||||||
my $thumbnail = Slic3r::ExPolygon::Collection->new(
|
my $thumbnail = Slic3r::ExPolygon::Collection->new(
|
||||||
expolygons => (@{$mesh->facets} <= 5000)
|
expolygons => (@{$mesh->facets} <= 5000)
|
||||||
? $mesh->horizontal_projection
|
? $mesh->horizontal_projection
|
||||||
|
@ -119,6 +119,7 @@ sub arrange_objects {
|
|||||||
$object->add_instance(
|
$object->add_instance(
|
||||||
offset => $_,
|
offset => $_,
|
||||||
rotation => $instance->rotation,
|
rotation => $instance->rotation,
|
||||||
|
scaling_factor => $instance->scaling_factor,
|
||||||
) for move_points($instance->offset, @positions);
|
) for move_points($instance->offset, @positions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -213,6 +214,7 @@ sub mesh {
|
|||||||
my $mesh = $object->mesh->clone;
|
my $mesh = $object->mesh->clone;
|
||||||
if ($instance) {
|
if ($instance) {
|
||||||
$mesh->rotate($instance->rotation);
|
$mesh->rotate($instance->rotation);
|
||||||
|
$mesh->scale($instance->scaling_factor);
|
||||||
$mesh->align_to_origin;
|
$mesh->align_to_origin;
|
||||||
$mesh->move(@{$instance->offset});
|
$mesh->move(@{$instance->offset});
|
||||||
}
|
}
|
||||||
@ -259,6 +261,7 @@ sub split_meshes {
|
|||||||
$new_object->add_instance(
|
$new_object->add_instance(
|
||||||
offset => [ $_->offset->[X] + $extents[X][MIN], $_->offset->[Y] + $extents[Y][MIN] ],
|
offset => [ $_->offset->[X] + $extents[X][MIN], $_->offset->[Y] + $extents[Y][MIN] ],
|
||||||
rotation => $_->rotation,
|
rotation => $_->rotation,
|
||||||
|
scaling_factor => $_->scaling_factor,
|
||||||
) for @{ $object->instances // [] };
|
) for @{ $object->instances // [] };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -274,7 +277,7 @@ package Slic3r::Model::Object;
|
|||||||
use Moo;
|
use Moo;
|
||||||
|
|
||||||
use List::Util qw(first);
|
use List::Util qw(first);
|
||||||
use Slic3r::Geometry qw(X Y Z MIN move_points move_points_3D);
|
use Slic3r::Geometry qw(X Y Z MIN MAX move_points move_points_3D);
|
||||||
use Storable qw(dclone);
|
use Storable qw(dclone);
|
||||||
|
|
||||||
has 'input_file' => (is => 'rw');
|
has 'input_file' => (is => 'rw');
|
||||||
@ -338,13 +341,27 @@ sub extents {
|
|||||||
return Slic3r::Geometry::bounding_box_3D($self->used_vertices);
|
return Slic3r::Geometry::bounding_box_3D($self->used_vertices);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub center {
|
||||||
|
my $self = shift;
|
||||||
|
|
||||||
|
my @extents = $self->extents;
|
||||||
|
return [ map +($extents[$_][MAX] + $extents[$_][MIN])/2, X,Y,Z ];
|
||||||
|
}
|
||||||
|
|
||||||
|
sub bounding_box {
|
||||||
|
my $self = shift;
|
||||||
|
return Slic3r::Geometry::BoundingBox->new(extents => [ $self->extents ]);
|
||||||
|
}
|
||||||
|
|
||||||
sub align_to_origin {
|
sub align_to_origin {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
|
|
||||||
# calculate the displacements needed to
|
# calculate the displacements needed to
|
||||||
# have lowest value for each axis at coordinate 0
|
# have lowest value for each axis at coordinate 0
|
||||||
my @extents = $self->extents;
|
my @extents = $self->extents;
|
||||||
$self->move(map -$extents[$_][MIN], X,Y,Z);
|
my @shift = map -$extents[$_][MIN], X,Y,Z;
|
||||||
|
$self->move(@shift);
|
||||||
|
return @shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub move {
|
sub move {
|
||||||
@ -410,6 +427,7 @@ use Moo;
|
|||||||
|
|
||||||
has 'object' => (is => 'ro', weak_ref => 1, required => 1);
|
has 'object' => (is => 'ro', weak_ref => 1, required => 1);
|
||||||
has 'rotation' => (is => 'rw', default => sub { 0 }); # around mesh center point
|
has 'rotation' => (is => 'rw', default => sub { 0 }); # around mesh center point
|
||||||
|
has 'scaling_factor' => (is => 'rw', default => sub { 1 });
|
||||||
has 'offset' => (is => 'rw'); # must be Slic3r::Point object
|
has 'offset' => (is => 'rw'); # must be Slic3r::Point object
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -106,6 +106,8 @@ sub add_model {
|
|||||||
$model->split_meshes if $Slic3r::Config->avoid_crossing_perimeters && !$Slic3r::Config->complete_objects;
|
$model->split_meshes if $Slic3r::Config->avoid_crossing_perimeters && !$Slic3r::Config->complete_objects;
|
||||||
|
|
||||||
foreach my $object (@{ $model->objects }) {
|
foreach my $object (@{ $model->objects }) {
|
||||||
|
my @align = $object->align_to_origin;
|
||||||
|
|
||||||
# extract meshes by material
|
# extract meshes by material
|
||||||
my @meshes = (); # by region_id
|
my @meshes = (); # by region_id
|
||||||
foreach my $volume (@{$object->volumes}) {
|
foreach my $volume (@{$object->volumes}) {
|
||||||
@ -123,21 +125,18 @@ sub add_model {
|
|||||||
# the order of these transformations must be the same as the one used in plater
|
# the order of these transformations must be the same as the one used in plater
|
||||||
# to make the object positioning consistent with the visual preview
|
# to make the object positioning consistent with the visual preview
|
||||||
|
|
||||||
# we ignore the per-instance rotation currently and only
|
# we ignore the per-instance transformations currently and only
|
||||||
# consider the first one
|
# consider the first one
|
||||||
$mesh->rotate($object->instances->[0]->rotation, $mesh->center)
|
if ($object->instances && @{$object->instances}) {
|
||||||
if @{ $object->instances // [] };
|
$mesh->rotate($object->instances->[0]->rotation, $object->center);
|
||||||
|
$mesh->scale($object->instances->[0]->scaling_factor);
|
||||||
|
}
|
||||||
|
|
||||||
$mesh->scale(1 / &Slic3r::SCALING_FACTOR);
|
$mesh->scale(1 / &Slic3r::SCALING_FACTOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
# align the object to origin; not sure this is required by the toolpath generation
|
# calculate transformed size
|
||||||
# algorithms, but it's good practice to avoid negative coordinates; it probably
|
my $size = [ Slic3r::Geometry::size_3D([ map @{$_->used_vertices}, grep $_, @meshes ]) ];
|
||||||
# provides also some better performance in infill generation
|
|
||||||
my @extents = Slic3r::Geometry::bounding_box_3D([ map @{$_->used_vertices}, grep $_, @meshes ]);
|
|
||||||
foreach my $mesh (grep $_, @meshes) {
|
|
||||||
$mesh->move(map -$extents[$_][MIN], X,Y,Z);
|
|
||||||
}
|
|
||||||
|
|
||||||
# initialize print object
|
# initialize print object
|
||||||
push @{$self->objects}, Slic3r::Print::Object->new(
|
push @{$self->objects}, Slic3r::Print::Object->new(
|
||||||
@ -145,10 +144,10 @@ sub add_model {
|
|||||||
meshes => [ @meshes ],
|
meshes => [ @meshes ],
|
||||||
copies => [
|
copies => [
|
||||||
$object->instances
|
$object->instances
|
||||||
? (map [ (scale $_->offset->[X]) + $extents[X][MIN], (scale $_->offset->[Y]) + $extents[Y][MIN] ], @{$object->instances})
|
? (map [ scale($_->offset->[X] - $align[X]), scale($_->offset->[Y] - $align[Y]) ], @{$object->instances})
|
||||||
: [0,0],
|
: [0,0],
|
||||||
],
|
],
|
||||||
size => [ map $extents[$_][MAX] - $extents[$_][MIN], (X,Y,Z) ],
|
size => $size,
|
||||||
input_file => $object->input_file,
|
input_file => $object->input_file,
|
||||||
layer_height_ranges => $object->layer_height_ranges,
|
layer_height_ranges => $object->layer_height_ranges,
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user