mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-25 15:44:12 -06:00
Bugfix: infill was clipped badly. Includes regression test. #1245
This commit is contained in:
parent
5fa49aad02
commit
a8981b8b35
4 changed files with 35 additions and 7 deletions
1
MANIFEST
1
MANIFEST
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
|
@ -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
20
t/print.t
Normal 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__
|
Loading…
Add table
Add a link
Reference in a new issue