diff --git a/lib/Slic3r/Layer/Material.pm b/lib/Slic3r/Layer/Material.pm index 924a1fc8..389c5618 100644 --- a/lib/Slic3r/Layer/Material.pm +++ b/lib/Slic3r/Layer/Material.pm @@ -409,7 +409,7 @@ sub process_bridges { my @chords = map Slic3r::Line->new($_->[0], $_->[-1]), @edges; my @midpoints = map $_->midpoint, @chords; my $line_between_midpoints = Slic3r::Line->new(@midpoints); - $bridge_angle = rad2deg_dir($line_between_midpoints->direction); + $bridge_angle = Slic3r::Geometry::rad2deg_dir($line_between_midpoints->direction); } elsif (@edges == 1) { # TODO: this case includes both U-shaped bridges and plain overhangs; # we need a trapezoidation algorithm to detect the actual bridged area @@ -418,10 +418,10 @@ sub process_bridges { # our supporting edge is a straight line if (@{$edges[0]} > 2) { my $line = Slic3r::Line->new($edges[0]->[0], $edges[0]->[-1]); - $bridge_angle = rad2deg_dir($line->direction); + $bridge_angle = Slic3r::Geometry::rad2deg_dir($line->direction); } } elsif (@edges) { - my $center = bounding_box_center([ map @$_, @edges ]); + my $center = Slic3r::Geometry::bounding_box_center([ map @$_, @edges ]); my $x = my $y = 0; foreach my $point (map @$, @edges) { my $line = Slic3r::Line->new($center, $point); @@ -430,7 +430,7 @@ sub process_bridges { $x += cos($dir) * $len; $y += sin($dir) * $len; } - $bridge_angle = rad2deg_dir(atan2($y, $x)); + $bridge_angle = Slic3r::Geometry::rad2deg_dir(atan2($y, $x)); } Slic3r::debugf " Optimal infill angle of bridge on layer %d is %d degrees\n", diff --git a/lib/Slic3r/Print.pm b/lib/Slic3r/Print.pm index eae844b5..8304357d 100644 --- a/lib/Slic3r/Print.pm +++ b/lib/Slic3r/Print.pm @@ -6,7 +6,7 @@ use File::Spec; use List::Util qw(max); use Math::ConvexHull 1.0.4 qw(convex_hull); use Slic3r::ExtrusionPath ':roles'; -use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 PI scale unscale move_points nearest_point); +use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 MIN PI scale unscale move_points nearest_point); use Slic3r::Geometry::Clipper qw(diff_ex union_ex intersection_ex offset JT_ROUND JT_SQUARE); use Time::HiRes qw(gettimeofday tv_interval); @@ -115,20 +115,30 @@ sub add_model { $mesh->rotate($Slic3r::Config->rotate); $mesh->scale($Slic3r::Config->scale / &Slic3r::SCALING_FACTOR); - $mesh->align_to_origin; } - + + my $complete_mesh = Slic3r::TriangleMesh->merge(grep defined $_, @meshes); + # initialize print object - push @{$self->objects}, Slic3r::Print::Object->new( + my $print_object = Slic3r::Print::Object->new( print => $self, meshes => [ @meshes ], - size => [ $object->mesh->size ], + size => [ $complete_mesh->size ], input_file => $object->input_file ); + push @{$self->objects}, $print_object; + + # align object to origin + { + my @extents = $complete_mesh->extents; + foreach my $mesh (grep defined $_, @meshes) { + $mesh->move(map -$extents[$_][MIN], X,Y,Z); + } + } if ($object->instances) { # replace the default [0,0] instance with the custom ones - @{$self->objects->[-1]->copies} = map [ scale $_->offset->[X], scale $_->offset->[Y] ], @{$object->instances}; + @{$print_object->copies} = map [ scale $_->offset->[X], scale $_->offset->[Y] ], @{$object->instances}; } } } diff --git a/lib/Slic3r/Print/Object.pm b/lib/Slic3r/Print/Object.pm index 9cedc3a7..a1ebbc3d 100644 --- a/lib/Slic3r/Print/Object.pm +++ b/lib/Slic3r/Print/Object.pm @@ -529,12 +529,12 @@ sub generate_support_material { @current_support_regions = @{diff_ex( [ map @$_, @current_support_regions ], - [ map @{$_->expolygon}, @{$layer->slices} ], + [ map @$_, @{$layer->slices} ], )}; $layers{$i} = diff_ex( [ map @$_, @current_support_regions ], - [ map @$_, map $_->expolygon->offset_ex($distance_from_object), @{$layer->slices} ], + [ map @$_, map $_->offset_ex($distance_from_object), @{$layer->slices} ], ); $_->simplify(scale $Slic3r::support_material_flow->spacing * 2) for @{$layers{$i}}; @@ -543,8 +543,8 @@ sub generate_support_material { my @overhangs = (); if ($lower_layer) { @overhangs = map $_->offset_ex(2 * $overhang_width), @{diff_ex( - [ map @$_, map $_->expolygon->offset_ex(-$overhang_width), @{$layer->slices} ], - [ map @{$_->expolygon}, @{$lower_layer->slices} ], + [ map @$_, map $_->offset_ex(-$overhang_width), @{$layer->slices} ], + [ map @$_, @{$lower_layer->slices} ], 1, )}; }