Bugfix: infill was clipped badly. Includes regression test. #1245

This commit is contained in:
Alessandro Ranellucci 2013-06-15 12:10:57 +02:00
parent 5fa49aad02
commit a8981b8b35
4 changed files with 35 additions and 7 deletions

View file

@ -76,6 +76,7 @@ t/geometry.t
t/layers.t t/layers.t
t/loops.t t/loops.t
t/polyclip.t t/polyclip.t
t/print.t
t/retraction.t t/retraction.t
t/serialize.t t/serialize.t
t/shells.t t/shells.t

View file

@ -106,6 +106,7 @@ 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 }) {
# we align object to origin before applying transformations
my @align = $object->align_to_origin; my @align = $object->align_to_origin;
# extract meshes by material # extract meshes by material
@ -135,8 +136,11 @@ sub add_model {
$mesh->scale(1 / &Slic3r::SCALING_FACTOR); $mesh->scale(1 / &Slic3r::SCALING_FACTOR);
} }
# calculate transformed size # we also align object after transformations so that we only work with positive coordinates
my $size = [ Slic3r::Geometry::size_3D([ map @{$_->used_vertices}, grep $_, @meshes ]) ]; # and the assumption that bounding_box === size works
my $bb = Slic3r::Geometry::BoundingBox->new_from_points_3D([ map @{$_->used_vertices}, grep $_, @meshes ]);
my @align2 = map -$bb->extents->[$_][MIN], (X,Y,Z);
$_->move(@align2) for grep $_, @meshes;
# initialize print object # initialize print object
push @{$self->objects}, Slic3r::Print::Object->new( push @{$self->objects}, Slic3r::Print::Object->new(
@ -144,10 +148,10 @@ sub add_model {
meshes => [ @meshes ], meshes => [ @meshes ],
copies => [ copies => [
$object->instances $object->instances
? (map [ scale($_->offset->[X] - $align[X]), scale($_->offset->[Y] - $align[Y]) ], @{$object->instances}) ? (map [ scale($_->offset->[X] - $align[X]) - $align2[X], scale($_->offset->[Y] - $align[Y]) - $align2[Y] ], @{$object->instances})
: [0,0], : [0,0],
], ],
size => $size, size => $bb->size, # transformed 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,
); );

View file

@ -16,7 +16,7 @@ my %cuboids = (
); );
sub model { sub model {
my ($model_name) = @_; my ($model_name, %params) = @_;
my ($vertices, $facets); my ($vertices, $facets);
if ($cuboids{$model_name}) { if ($cuboids{$model_name}) {
@ -32,7 +32,10 @@ sub model {
my $model = Slic3r::Model->new; my $model = Slic3r::Model->new;
my $object = $model->add_object(vertices => $vertices); my $object = $model->add_object(vertices => $vertices);
$object->add_volume(facets => $facets); $object->add_volume(facets => $facets);
$object->add_instance(offset => [0,0]); $object->add_instance(
offset => [0,0],
rotation => $params{rotation},
);
return $model; return $model;
} }
@ -46,7 +49,7 @@ sub init_print {
my $print = Slic3r::Print->new(config => $config); my $print = Slic3r::Print->new(config => $config);
$model_name = [$model_name] if ref($model_name) ne 'ARRAY'; $model_name = [$model_name] if ref($model_name) ne 'ARRAY';
$print->add_model(model($_)) for @$model_name; $print->add_model(model($_, %params)) for @$model_name;
$print->validate; $print->validate;
return $print; return $print;

20
t/print.t Normal file
View file

@ -0,0 +1,20 @@
use Test::More tests => 1;
use strict;
use warnings;
BEGIN {
use FindBin;
use lib "$FindBin::Bin/../lib";
}
use List::Util qw(first);
use Slic3r;
use Slic3r::Test;
{
my $print = Slic3r::Test::init_print('20mm_cube', rotation => 45);
ok !(first { $_ < 0 } map @$_, map @{$_->used_vertices}, grep $_, map @{$_->meshes}, @{$print->objects}),
"object is still in positive coordinate space even after rotation";
}
__END__