Refactoring: use Slic3r::Geometry::BoundingBox objects everywhere

This commit is contained in:
Alessandro Ranellucci 2013-06-16 12:21:25 +02:00
parent 07407e5dbd
commit ac4a0bcdd8
20 changed files with 105 additions and 127 deletions

View file

@ -142,18 +142,7 @@ sub point_on_segment {
sub bounding_box { sub bounding_box {
my $self = shift; my $self = shift;
return Slic3r::Geometry::bounding_box($self->contour); return $self->contour->bounding_box;
}
sub bounding_box_polygon {
my $self = shift;
my @bb = $self->bounding_box;
return Slic3r::Polygon->new([
[ $bb[0], $bb[1] ],
[ $bb[2], $bb[1] ],
[ $bb[2], $bb[3] ],
[ $bb[0], $bb[3] ],
]);
} }
sub clip_line { sub clip_line {

View file

@ -40,7 +40,7 @@ sub filler {
} }
$self->fillers->{$filler} ||= $FillTypes{$filler}->new( $self->fillers->{$filler} ||= $FillTypes{$filler}->new(
bounding_box => [ $self->object->bounding_box ], bounding_box => $self->object->bounding_box,
); );
return $self->fillers->{$filler}; return $self->fillers->{$filler};
} }

View file

@ -5,7 +5,7 @@ use Slic3r::Geometry qw(PI);
has 'layer_id' => (is => 'rw'); has 'layer_id' => (is => 'rw');
has 'angle' => (is => 'rw', default => sub { $Slic3r::Config->fill_angle }); has 'angle' => (is => 'rw', default => sub { $Slic3r::Config->fill_angle });
has 'bounding_box' => (is => 'ro', required => 1); has 'bounding_box' => (is => 'ro', required => 1); # Slic3r::Geometry::BoundingBox object
sub angles () { [0, PI/2] } sub angles () { [0, PI/2] }
@ -16,7 +16,7 @@ sub infill_direction {
# set infill angle # set infill angle
my (@rotate, @shift); my (@rotate, @shift);
$rotate[0] = Slic3r::Geometry::deg2rad($self->angle); $rotate[0] = Slic3r::Geometry::deg2rad($self->angle);
$rotate[1] = Slic3r::Geometry::bounding_box_center($self->bounding_box); $rotate[1] = $self->bounding_box->center_2D;
@shift = @{$rotate[1]}; @shift = @{$rotate[1]};
if (defined $self->layer_id) { if (defined $self->layer_id) {

View file

@ -3,7 +3,7 @@ use Moo;
extends 'Slic3r::Fill::Base'; extends 'Slic3r::Fill::Base';
use Slic3r::Geometry qw(scale unscale X1 X2); use Slic3r::Geometry qw(scale unscale X);
use Slic3r::Geometry::Clipper qw(offset2 union_pt traverse_pt PFT_EVENODD); use Slic3r::Geometry::Clipper qw(offset2 union_pt traverse_pt PFT_EVENODD);
sub fill_surface { sub fill_surface {
@ -13,7 +13,7 @@ sub fill_surface {
# no rotation is supported for this infill pattern # no rotation is supported for this infill pattern
my $expolygon = $surface->expolygon; my $expolygon = $surface->expolygon;
my $bounding_box = [ $expolygon->bounding_box ]; my $bounding_box = $expolygon->bounding_box;
my $min_spacing = scale $params{flow_spacing}; my $min_spacing = scale $params{flow_spacing};
my $distance = $min_spacing / $params{density}; my $distance = $min_spacing / $params{density};
@ -21,7 +21,7 @@ sub fill_surface {
my $flow_spacing = $params{flow_spacing}; my $flow_spacing = $params{flow_spacing};
if ($params{density} == 1 && !$params{dont_adjust}) { if ($params{density} == 1 && !$params{dont_adjust}) {
$distance = $self->adjust_solid_spacing( $distance = $self->adjust_solid_spacing(
width => $bounding_box->[X2] - $bounding_box->[X1], width => $bounding_box->size->[X],
distance => $distance, distance => $distance,
); );
$flow_spacing = unscale $distance; $flow_spacing = unscale $distance;

View file

@ -4,7 +4,7 @@ use Moo;
extends 'Slic3r::Fill::PlanePath'; extends 'Slic3r::Fill::PlanePath';
use Math::PlanePath::Flowsnake; use Math::PlanePath::Flowsnake;
use Slic3r::Geometry qw(X X1 X2); use Slic3r::Geometry qw(X);
# Sorry, this fill is currently broken. # Sorry, this fill is currently broken.
@ -12,7 +12,7 @@ sub process_polyline {
my $self = shift; my $self = shift;
my ($polyline, $bounding_box) = @_; my ($polyline, $bounding_box) = @_;
$_->[X] += ($bounding_box->[X1] + $bounding_box->[X2]/2) for @$polyline; $_->[X] += $bounding_box->center_2D->[X] for @$polyline;
} }
1; 1;

View file

@ -5,7 +5,7 @@ extends 'Slic3r::Fill::Base';
has 'cache' => (is => 'rw', default => sub {{}}); has 'cache' => (is => 'rw', default => sub {{}});
use Slic3r::Geometry qw(PI X1 Y1 X2 Y2 X Y scale); use Slic3r::Geometry qw(PI X Y MIN MAX scale);
use Slic3r::Geometry::Clipper qw(intersection_ex); use Slic3r::Geometry::Clipper qw(intersection_ex);
sub angles () { [0, PI/3, PI/3*2] } sub angles () { [0, PI/3, PI/3*2] }
@ -39,28 +39,28 @@ sub fill_surface {
# adjust actual bounding box to the nearest multiple of our hex pattern # adjust actual bounding box to the nearest multiple of our hex pattern
# and align it so that it matches across layers # and align it so that it matches across layers
my $bounding_box = [ @{$self->bounding_box} ]; # clone my $bounding_box = $self->bounding_box->clone;
$bounding_box->[$_] = 0 for X1, Y1; $bounding_box->extents->[$_][MIN] = 0 for X, Y;
{ {
my $bb_polygon = Slic3r::Polygon->new_from_bounding_box($bounding_box); my $bb_polygon = $bounding_box->polygon;
$bb_polygon->scale(sqrt 2); $bb_polygon->scale(sqrt 2);
$bb_polygon->rotate($rotate_vector->[0][0], $hex_center); $bb_polygon->rotate($rotate_vector->[0][0], $hex_center);
$bounding_box = [ Slic3r::Geometry::bounding_box($bb_polygon) ]; $bounding_box = $bb_polygon->bounding_box;
# $bounding_box->[X1] and [Y1] represent the displacement between new bounding box offset and old one # $bounding_box->y_min and $bounding_box->y_max represent the displacement between new bounding box offset and old one
$bounding_box->[X1] -= $bounding_box->[X1] % $hex_width; $bounding_box->extents->[X][MIN] -= $bounding_box->x_min % $hex_width;
$bounding_box->[Y1] -= $bounding_box->[Y1] % $pattern_height; $bounding_box->extents->[Y][MAX] -= $bounding_box->y_min % $pattern_height;
} }
my @polygons = (); my @polygons = ();
my $x = $bounding_box->[X1]; my $x = $bounding_box->x_min;
while ($x <= $bounding_box->[X2]) { while ($x <= $bounding_box->x_max) {
my $p = []; my $p = [];
my @x = ($x + $x_offset, $x + $distance - $x_offset); my @x = ($x + $x_offset, $x + $distance - $x_offset);
for (1..2) { for (1..2) {
@$p = reverse @$p; # turn first half upside down @$p = reverse @$p; # turn first half upside down
my @p = (); my @p = ();
for (my $y = $bounding_box->[Y1]; $y <= $bounding_box->[Y2]; $y += $y_short + $hex_side + $y_short + $hex_side) { for (my $y = $bounding_box->x_min; $y <= $bounding_box->y_max; $y += $y_short + $hex_side + $y_short + $hex_side) {
push @$p, push @$p,
[ $x[1], $y + $y_offset ], [ $x[1], $y + $y_offset ],
[ $x[0], $y + $y_short - $y_offset ], [ $x[0], $y + $y_short - $y_offset ],

View file

@ -27,17 +27,11 @@ sub fill_surface {
$self->rotate_points($expolygon, $rotate_vector); $self->rotate_points($expolygon, $rotate_vector);
my $distance_between_lines = scale $params{flow_spacing} / $params{density} * $self->multiplier; my $distance_between_lines = scale $params{flow_spacing} / $params{density} * $self->multiplier;
my $bounding_box = [ Slic3r::Geometry::bounding_box([map @$_, @$expolygon]) ]; my $bounding_box = $expolygon->bounding_box;
my $bounding_box_polygon = Slic3r::Polygon->new([
[ $bounding_box->[X1], $bounding_box->[Y1] ],
[ $bounding_box->[X2], $bounding_box->[Y1] ],
[ $bounding_box->[X2], $bounding_box->[Y2] ],
[ $bounding_box->[X1], $bounding_box->[Y2] ],
]);
(ref $self) =~ /::([^:]+)$/; (ref $self) =~ /::([^:]+)$/;
my $path = "Math::PlanePath::$1"->new; my $path = "Math::PlanePath::$1"->new;
my @n = $self->get_n($path, [map +($_ / $distance_between_lines), @$bounding_box]); my @n = $self->get_n($path, [ map +($_ / $distance_between_lines), @{$bounding_box->bb} ]);
my $polyline = Slic3r::Polyline->new([ my $polyline = Slic3r::Polyline->new([
map [ map {$_*$distance_between_lines} $path->n_to_xy($_) ], @n, map [ map {$_*$distance_between_lines} $path->n_to_xy($_) ], @n,
@ -47,7 +41,7 @@ sub fill_surface {
$self->process_polyline($polyline, $bounding_box); $self->process_polyline($polyline, $bounding_box);
my @paths = map $_->clip_with_expolygon($expolygon), my @paths = map $_->clip_with_expolygon($expolygon),
$polyline->clip_with_polygon($bounding_box_polygon); $polyline->clip_with_polygon($bounding_box->polygon);
if (0) { if (0) {
require "Slic3r/SVG.pm"; require "Slic3r/SVG.pm";

View file

@ -5,7 +5,7 @@ extends 'Slic3r::Fill::Base';
has 'cache' => (is => 'rw', default => sub {{}}); has 'cache' => (is => 'rw', default => sub {{}});
use Slic3r::Geometry qw(X1 Y1 X2 Y2 A B X Y scale unscale scaled_epsilon); use Slic3r::Geometry qw(A B X Y scale unscale scaled_epsilon);
sub fill_surface { sub fill_surface {
my $self = shift; my $self = shift;
@ -32,26 +32,26 @@ sub fill_surface {
# compute bounding box # compute bounding box
my $bounding_box; my $bounding_box;
{ {
my $bb_polygon = Slic3r::Polygon->new_from_bounding_box($self->bounding_box); my $bb_polygon = $self->bounding_box->polygon;
$bb_polygon->scale(sqrt 2); $bb_polygon->scale(sqrt 2);
$self->rotate_points($bb_polygon, $rotate_vector); $self->rotate_points($bb_polygon, $rotate_vector);
$bounding_box = [ $bb_polygon->bounding_box ]; $bounding_box = $bb_polygon->bounding_box;
} }
# define flow spacing according to requested density # define flow spacing according to requested density
if ($params{density} == 1 && !$params{dont_adjust}) { if ($params{density} == 1 && !$params{dont_adjust}) {
$distance_between_lines = $self->adjust_solid_spacing( $distance_between_lines = $self->adjust_solid_spacing(
width => $bounding_box->[X2] - $bounding_box->[X1], width => $bounding_box->size->[X],
distance => $distance_between_lines, distance => $distance_between_lines,
); );
$flow_spacing = unscale $distance_between_lines; $flow_spacing = unscale $distance_between_lines;
} }
# generate the basic pattern # generate the basic pattern
my $x = $bounding_box->[X1]; my $x = $bounding_box->x_min;
my @vertical_lines = (); my @vertical_lines = ();
for (my $i = 0; $x <= $bounding_box->[X2] + scaled_epsilon; $i++) { for (my $i = 0; $x <= $bounding_box->x_max + scaled_epsilon; $i++) {
my $vertical_line = Slic3r::Line->new([$x, $bounding_box->[Y2]], [$x, $bounding_box->[Y1]]); my $vertical_line = Slic3r::Line->new([$x, $bounding_box->y_max], [$x, $bounding_box->y_min]);
if ($is_line_pattern && $i % 2) { if ($is_line_pattern && $i % 2) {
$vertical_line->[A][X] += $line_oscillation; $vertical_line->[A][X] += $line_oscillation;
$vertical_line->[B][X] -= $line_oscillation; $vertical_line->[B][X] -= $line_oscillation;

View file

@ -7,7 +7,7 @@ use File::Basename qw(basename dirname);
use List::Util qw(max sum first); use List::Util qw(max sum first);
use Math::Clipper qw(offset JT_ROUND); use Math::Clipper qw(offset JT_ROUND);
use Math::ConvexHull::MonotoneChain qw(convex_hull); use Math::ConvexHull::MonotoneChain qw(convex_hull);
use Slic3r::Geometry qw(X Y Z X1 Y1 X2 Y2 MIN MAX); use Slic3r::Geometry qw(X Y Z MIN MAX);
use threads::shared qw(shared_clone); use threads::shared qw(shared_clone);
use Wx qw(:bitmap :brush :button :cursor :dialog :filedialog :font :keycode :icon :id :listctrl :misc :panel :pen :sizer :toolbar :window); use Wx qw(:bitmap :brush :button :cursor :dialog :filedialog :font :keycode :icon :id :listctrl :misc :panel :pen :sizer :toolbar :window);
use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_LIST_ITEM_ACTIVATED EVT_LIST_ITEM_DESELECTED EVT_LIST_ITEM_SELECTED EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL EVT_CHOICE); use Wx::Event qw(EVT_BUTTON EVT_COMMAND EVT_KEY_DOWN EVT_LIST_ITEM_ACTIVATED EVT_LIST_ITEM_DESELECTED EVT_LIST_ITEM_SELECTED EVT_MOUSE_EVENTS EVT_PAINT EVT_TOOL EVT_CHOICE);
@ -765,7 +765,7 @@ sub recenter {
return unless @{$self->{objects}}; return unless @{$self->{objects}};
# calculate displacement needed to center the print # calculate displacement needed to center the print
my @print_bb = Slic3r::Geometry::bounding_box([ my $print_bb = Slic3r::Geometry::BoundingBox->new_from_points([
map { map {
my $obj = $_; my $obj = $_;
my $bb = $obj->transformed_bounding_box; my $bb = $obj->transformed_bounding_box;
@ -776,9 +776,10 @@ sub recenter {
# $self->{shift} contains the offset in pixels to add to object instances in order to center them # $self->{shift} contains the offset in pixels to add to object instances in order to center them
# it is expressed in upwards Y # it is expressed in upwards Y
my $print_size = $print_bb->size;
$self->{shift} = [ $self->{shift} = [
$self->to_pixel(-$print_bb[X1]) + ($self->{canvas}->GetSize->GetWidth - $self->to_pixel($print_bb[X2] - $print_bb[X1])) / 2, $self->to_pixel(-$print_bb->x_min) + ($self->{canvas}->GetSize->GetWidth - $self->to_pixel($print_size->[X])) / 2,
$self->to_pixel(-$print_bb[Y1]) + ($self->{canvas}->GetSize->GetHeight - $self->to_pixel($print_bb[Y2] - $print_bb[Y1])) / 2, $self->to_pixel(-$print_bb->y_min) + ($self->{canvas}->GetSize->GetHeight - $self->to_pixel($print_size->[Y])) / 2,
]; ];
} }

View file

@ -36,7 +36,14 @@ sub bb {
sub polygon { sub polygon {
my $self = shift; my $self = shift;
return Slic3r::Polygon->new_from_bounding_box($self->bb);
my $e = $self->extents;
return Slic3r::Polygon->new([
[ $e->[X][MIN], $e->[Y][MIN] ],
[ $e->[X][MAX], $e->[Y][MIN] ],
[ $e->[X][MAX], $e->[Y][MAX] ],
[ $e->[X][MIN], $e->[Y][MAX] ],
]);
} }
# note to $self # note to $self
@ -84,4 +91,24 @@ sub max_point {
return Slic3r::Point->new($self->extents->[X][MAX], $self->extents->[Y][MAX]); return Slic3r::Point->new($self->extents->[X][MAX], $self->extents->[Y][MAX]);
} }
sub x_min {
my $self = shift;
return $self->extents->[X][MIN];
}
sub x_max {
my $self = shift;
return $self->extents->[X][MAX];
}
sub y_min {
my $self = shift;
return $self->extents->[Y][MIN];
}
sub y_max {
my $self = shift;
return $self->extents->[Y][MAX];
}
1; 1;

View file

@ -3,7 +3,7 @@ use Moo;
use List::Util qw(sum first); use List::Util qw(sum first);
use Slic3r::ExtrusionPath ':roles'; use Slic3r::ExtrusionPath ':roles';
use Slic3r::Geometry qw(PI X1 X2 Y1 Y2 A B scale chained_path_items points_coincide); use Slic3r::Geometry qw(PI A B scale chained_path_items points_coincide);
use Slic3r::Geometry::Clipper qw(safety_offset union_ex diff_ex intersection_ex use Slic3r::Geometry::Clipper qw(safety_offset union_ex diff_ex intersection_ex
offset offset2_ex PFT_EVENODD union_pt traverse_pt diff intersection); offset offset2_ex PFT_EVENODD union_pt traverse_pt diff intersection);
use Slic3r::Surface ':types'; use Slic3r::Surface ':types';
@ -557,10 +557,10 @@ sub _detect_bridges {
$_->rotate($angle, [0,0]) for @$inset, @$anchors; $_->rotate($angle, [0,0]) for @$inset, @$anchors;
# generate lines in this direction # generate lines in this direction
my $bounding_box = [ Slic3r::Geometry::bounding_box([ map @$_, map @$_, @$anchors ]) ]; my $bounding_box = Slic3r::Geometry::BoundingBox->new_from_points([ map @$_, map @$_, @$anchors ]);
my @lines = (); my @lines = ();
for (my $x = $bounding_box->[X1]; $x <= $bounding_box->[X2]; $x += $line_increment) { for (my $x = $bounding_box->x_min; $x <= $bounding_box->x_max; $x += $line_increment) {
push @lines, [ [$x, $bounding_box->[Y1]], [$x, $bounding_box->[Y2]] ]; push @lines, [ [$x, $bounding_box->y_min], [$x, $bounding_box->y_max] ];
} }
# TODO: use a multi_polygon_multi_linestring_intersection() call # TODO: use a multi_polygon_multi_linestring_intersection() call

View file

@ -175,9 +175,9 @@ sub size {
return [ Slic3r::Geometry::size_3D($self->used_vertices) ]; return [ Slic3r::Geometry::size_3D($self->used_vertices) ];
} }
sub extents { sub bounding_box {
my $self = shift; my $self = shift;
return Slic3r::Geometry::bounding_box_3D($self->used_vertices); return Slic3r::Geometry::BoundingBox->new_from_points_3D($self->used_vertices);
} }
sub align_to_origin { sub align_to_origin {
@ -186,8 +186,8 @@ sub align_to_origin {
# 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 $bb = $self->bounding_box;
$self->move(map -$extents[$_][MIN], X,Y,Z); $self->move(map -$bb->extents->[$_][MIN], X,Y,Z);
} }
# align all instances to 0,0 as well # align all instances to 0,0 as well
@ -254,12 +254,12 @@ sub split_meshes {
# let's now align the new object to the origin and put its displacement # let's now align the new object to the origin and put its displacement
# (extents) in the instances info # (extents) in the instances info
my @extents = $mesh->extents; my $bb = $mesh->bounding_box;
$new_object->align_to_origin; $new_object->align_to_origin;
# add one instance per original instance applying the displacement # add one instance per original instance applying the displacement
$new_object->add_instance( $new_object->add_instance(
offset => [ $_->offset->[X] + $extents[X][MIN], $_->offset->[Y] + $extents[Y][MIN] ], offset => [ $_->offset->[X] + $bb->x_min, $_->offset->[Y] + $bb->y_min ],
rotation => $_->rotation, rotation => $_->rotation,
scaling_factor => $_->scaling_factor, scaling_factor => $_->scaling_factor,
) for @{ $object->instances // [] }; ) for @{ $object->instances // [] };
@ -336,21 +336,14 @@ sub size {
return [ Slic3r::Geometry::size_3D($self->used_vertices) ]; return [ Slic3r::Geometry::size_3D($self->used_vertices) ];
} }
sub extents {
my $self = shift;
return Slic3r::Geometry::bounding_box_3D($self->used_vertices);
}
sub center { sub center {
my $self = shift; my $self = shift;
return $self->bounding_box->center;
my @extents = $self->extents;
return [ map +($extents[$_][MAX] + $extents[$_][MIN])/2, X,Y,Z ];
} }
sub bounding_box { sub bounding_box {
my $self = shift; my $self = shift;
return Slic3r::Geometry::BoundingBox->new(extents => [ $self->extents ]); return Slic3r::Geometry::BoundingBox->new_from_points_3D($self->used_vertices);
} }
sub align_to_origin { sub align_to_origin {
@ -358,8 +351,8 @@ sub align_to_origin {
# 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 $bb = $self->bounding_box;
my @shift = map -$extents[$_][MIN], X,Y,Z; my @shift = map -$bb->extents->[$_][MIN], X,Y,Z;
$self->move(@shift); $self->move(@shift);
return @shift; return @shift;
} }

View file

@ -10,18 +10,6 @@ use Slic3r::Geometry qw(polygon_lines polygon_remove_parallel_continuous_edges
X1 X2 Y1 Y2); X1 X2 Y1 Y2);
use Slic3r::Geometry::Clipper qw(JT_MITER); use Slic3r::Geometry::Clipper qw(JT_MITER);
sub new_from_bounding_box {
my $class = shift;
my ($bounding_box) = @_;
return $class->new([
[ $bounding_box->[X1], $bounding_box->[Y1] ],
[ $bounding_box->[X2], $bounding_box->[Y1] ],
[ $bounding_box->[X2], $bounding_box->[Y2] ],
[ $bounding_box->[X1], $bounding_box->[Y2] ],
]);
}
sub lines { sub lines {
my $self = shift; my $self = shift;
return polygon_lines($self); return polygon_lines($self);

View file

@ -123,7 +123,7 @@ sub clip_with_expolygon {
sub bounding_box { sub bounding_box {
my $self = shift; my $self = shift;
return Slic3r::Geometry::bounding_box($self); return Slic3r::Geometry::BoundingBox->new_from_points($self);
} }
sub size { sub size {
@ -133,8 +133,8 @@ sub size {
sub align_to_origin { sub align_to_origin {
my $self = shift; my $self = shift;
my @bb = $self->bounding_box; my $bb = $self->bounding_box;
return $self->translate(-$bb[X1], -$bb[Y1]); return $self->translate(-$bb->x_min, -$bb->y_min);
} }
sub rotate { sub rotate {

View file

@ -291,19 +291,15 @@ sub bounding_box {
foreach my $copy (@{$object->copies}) { foreach my $copy (@{$object->copies}) {
push @points, push @points,
[ $copy->[X], $copy->[Y] ], [ $copy->[X], $copy->[Y] ],
[ $copy->[X] + $object->size->[X], $copy->[Y] ], [ $copy->[X] + $object->size->[X], $copy->[Y] + $object->size->[Y] ];
[ $copy->[X] + $object->size->[X], $copy->[Y] + $object->size->[Y] ],
[ $copy->[X], $copy->[Y] + $object->size->[Y] ];
} }
} }
return Slic3r::Geometry::bounding_box(\@points); return Slic3r::Geometry::BoundingBox->new_from_points(\@points);
} }
sub size { sub size {
my $self = shift; my $self = shift;
return $self->bounding_box->size;
my @bb = $self->bounding_box;
return [ $bb[X2] - $bb[X1], $bb[Y2] - $bb[Y1] ];
} }
sub _simplify_slices { sub _simplify_slices {
@ -749,10 +745,11 @@ sub write_gcode {
} }
# calculate X,Y shift to center print around specified origin # calculate X,Y shift to center print around specified origin
my @print_bb = $self->bounding_box; my $print_bb = $self->bounding_box;
my $print_size = $print_bb->size;
my @shift = ( my @shift = (
$Slic3r::Config->print_center->[X] - (unscale ($print_bb[X2] - $print_bb[X1]) / 2) - unscale $print_bb[X1], $Slic3r::Config->print_center->[X] - unscale($print_size->[X]/2 - $print_bb->x_min),
$Slic3r::Config->print_center->[Y] - (unscale ($print_bb[Y2] - $print_bb[Y1]) / 2) - unscale $print_bb[Y1], $Slic3r::Config->print_center->[Y] - unscale($print_size->[Y]/2 - $print_bb->y_min),
); );
# initialize a motion planner for object-to-object travel moves # initialize a motion planner for object-to-object travel moves

View file

@ -138,7 +138,7 @@ sub bounding_box {
my $self = shift; my $self = shift;
# since the object is aligned to origin, bounding box coincides with size # since the object is aligned to origin, bounding box coincides with size
return Slic3r::Geometry::bounding_box([ [0,0], $self->size ]); return Slic3r::Geometry::BoundingBox->new_from_points([ [0,0], $self->size ]);
} }
sub slice { sub slice {
@ -1001,7 +1001,7 @@ sub generate_support_material {
$_; $_;
} }
map $_->clip_with_expolygon($expolygon), map $_->clip_with_expolygon($expolygon),
###map $_->clip_with_polygon($expolygon->bounding_box_polygon), # currently disabled as a workaround for Boost failing at being idempotent ###map $_->clip_with_polygon($expolygon->bounding_box->polygon), # currently disabled as a workaround for Boost failing at being idempotent
($is_interface && @$support_interface_patterns) ($is_interface && @$support_interface_patterns)
? @{$support_interface_patterns->[ $layer_id % @$support_interface_patterns ]} ? @{$support_interface_patterns->[ $layer_id % @$support_interface_patterns ]}
: @{$support_patterns->[ $layer_id % @$support_patterns ]}; : @{$support_patterns->[ $layer_id % @$support_patterns ]};

View file

@ -15,9 +15,9 @@ has 'height' => (is => 'rw');
sub _build_line { sub _build_line {
my $self = shift; my $self = shift;
my @bb = $self->print->bounding_box; my $bb = $self->print->bounding_box;
my $y = ($bb[Y2]-$bb[Y1]) * $self->y_percent; my $y = $bb->size->[Y] * $self->y_percent;
return [ [ $bb[X1], $y ], [ $bb[X2], $y ] ] return [ [ $bb->x_min, $y ], [ $bb->x_max, $y ] ]
} }
sub export_svg { sub export_svg {

View file

@ -361,8 +361,8 @@ sub align_to_origin {
# 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 $bb = $self->bounding_box;
$self->move(map -$extents[$_][MIN], X,Y,Z); $self->move(map -$bb->extents->[$_][MIN], X,Y,Z);
} }
sub center_around_origin { sub center_around_origin {
@ -373,9 +373,7 @@ sub center_around_origin {
sub center { sub center {
my $self = shift; my $self = shift;
return $self->bounding_box->center;
my @extents = $self->extents;
return [ map +($extents[$_][MAX] + $extents[$_][MIN])/2, X,Y,Z ];
} }
sub duplicate { sub duplicate {
@ -403,19 +401,14 @@ sub used_vertices {
return [ map $self->vertices->[$_], map @$_, @{$self->facets} ]; return [ map $self->vertices->[$_], map @$_, @{$self->facets} ];
} }
sub extents {
my $self = shift;
return Slic3r::Geometry::bounding_box_3D($self->used_vertices);
}
sub bounding_box { sub bounding_box {
my $self = shift; my $self = shift;
return Slic3r::Geometry::BoundingBox->new(extents => [ $self->extents ]); return Slic3r::Geometry::BoundingBox->new_from_points_3D($self->used_vertices);
} }
sub size { sub size {
my $self = shift; my $self = shift;
return Slic3r::Geometry::size_3D($self->used_vertices); return $self->bounding_box->size;
} }
sub slice_facet { sub slice_facet {

View file

@ -21,7 +21,7 @@ sub scale_points (@) { map [scale $_->[X], scale $_->[Y]], @_ }
$print->init_extruders; $print->init_extruders;
my $filler = Slic3r::Fill::Rectilinear->new( my $filler = Slic3r::Fill::Rectilinear->new(
print => $print, print => $print,
bounding_box => [ 0, 0, 10, 10 ], bounding_box => Slic3r::Geometry::BoundingBox->new_from_points([ [0, 0], [10, 10] ]),
); );
my $surface_width = 250; my $surface_width = 250;
my $distance = $filler->adjust_solid_spacing( my $distance = $filler->adjust_solid_spacing(
@ -35,7 +35,7 @@ sub scale_points (@) { map [scale $_->[X], scale $_->[Y]], @_ }
{ {
my $expolygon = Slic3r::ExPolygon->new([ scale_points [0,0], [50,0], [50,50], [0,50] ]); my $expolygon = Slic3r::ExPolygon->new([ scale_points [0,0], [50,0], [50,50], [0,50] ]);
my $filler = Slic3r::Fill::Rectilinear->new( my $filler = Slic3r::Fill::Rectilinear->new(
bounding_box => [ $expolygon->bounding_box ], bounding_box => $expolygon->bounding_box,
); );
my $surface = Slic3r::Surface->new( my $surface = Slic3r::Surface->new(
surface_type => S_TYPE_TOP, surface_type => S_TYPE_TOP,

View file

@ -54,23 +54,19 @@ my %opt = (
}); });
# calculate print extents # calculate print extents
my @bounding_box = Slic3r::Geometry::bounding_box([ map @$_, map @$_, values %paths ]); my $bounding_box = Slic3r::Geometry::BoundingBox->new_from_points([ map @$_, map @$_, values %paths ]);
my @size = (
($bounding_box[X2] - $bounding_box[X1]),
($bounding_box[Y2] - $bounding_box[Y1]),
);
# calculate section line # calculate section line
my $section_y = ($bounding_box[Y2] + $bounding_box[Y1]) / 2; my $section_y = $bounding_box->center->[Y];
my $section_line = [ my $section_line = [
[ $bounding_box[X1], $section_y ], [ $bounding_box->x_min, $section_y ],
[ $bounding_box[X2], $section_y ], [ $bounding_box->x_max, $section_y ],
]; ];
# initialize output # initialize output
my $max_z = max(keys %paths); my $max_z = max(keys %paths);
my $svg = SVG->new( my $svg = SVG->new(
width => $opt{scale} * $size[X], width => $opt{scale} * $bounding_box->size->[X],
height => $opt{scale} * $max_z, height => $opt{scale} * $max_z,
); );
@ -90,7 +86,7 @@ my %opt = (
) }; ) };
$g->rectangle( $g->rectangle(
'x' => $opt{scale} * ($_->[A][X] - $bounding_box[X1]), 'x' => $opt{scale} * ($_->[A][X] - $bounding_box->x_min),
'y' => $opt{scale} * ($max_z - $z), 'y' => $opt{scale} * ($max_z - $z),
'width' => $opt{scale} * abs($_->[B][X] - $_->[A][X]), 'width' => $opt{scale} * abs($_->[B][X] - $_->[A][X]),
'height' => $opt{scale} * $opt{layer_height}, 'height' => $opt{scale} * $opt{layer_height},