Rename shortest_path to chained_path, which reflects its algorithm more correctly
This commit is contained in:
parent
11637d527a
commit
090e3b1fe3
10 changed files with 19 additions and 19 deletions
|
@ -8,19 +8,19 @@ sub endpoints {
|
||||||
return [ map $_->endpoints, @{$self->paths} ];
|
return [ map $_->endpoints, @{$self->paths} ];
|
||||||
}
|
}
|
||||||
|
|
||||||
sub shortest_path {
|
sub chained_path {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my ($start_near) = @_;
|
my ($start_near) = @_;
|
||||||
|
|
||||||
# make sure we pass the same path objects to the Collection constructor
|
# make sure we pass the same path objects to the Collection constructor
|
||||||
# and the ->shortest_path() method because the latter will reverse the
|
# and the ->chained_path() method because the latter will reverse the
|
||||||
# paths in-place when needed and we need to return them that way
|
# paths in-place when needed and we need to return them that way
|
||||||
my @paths = map $_->unpack, @{$self->paths};
|
my @paths = map $_->unpack, @{$self->paths};
|
||||||
my $collection = Slic3r::Polyline::Collection->new(
|
my $collection = Slic3r::Polyline::Collection->new(
|
||||||
polylines => [ map $_->polyline, @paths ],
|
polylines => [ map $_->polyline, @paths ],
|
||||||
);
|
);
|
||||||
|
|
||||||
return $collection->shortest_path($start_near, \@paths);
|
return $collection->chained_path($start_near, \@paths);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub cleanup {
|
sub cleanup {
|
||||||
|
|
|
@ -12,7 +12,7 @@ use Slic3r::Fill::OctagramSpiral;
|
||||||
use Slic3r::Fill::PlanePath;
|
use Slic3r::Fill::PlanePath;
|
||||||
use Slic3r::Fill::Rectilinear;
|
use Slic3r::Fill::Rectilinear;
|
||||||
use Slic3r::ExtrusionPath ':roles';
|
use Slic3r::ExtrusionPath ':roles';
|
||||||
use Slic3r::Geometry qw(X Y PI scale shortest_path);
|
use Slic3r::Geometry qw(X Y PI scale chained_path);
|
||||||
use Slic3r::Geometry::Clipper qw(union_ex diff_ex);
|
use Slic3r::Geometry::Clipper qw(union_ex diff_ex);
|
||||||
use Slic3r::Surface ':types';
|
use Slic3r::Surface ':types';
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ sub make_fill {
|
||||||
push @fills_ordering_points, map $_->unpack->points->[0], @{$layer->thin_fills};
|
push @fills_ordering_points, map $_->unpack->points->[0], @{$layer->thin_fills};
|
||||||
|
|
||||||
# organize infill paths using a shortest path search
|
# organize infill paths using a shortest path search
|
||||||
@fills = @{shortest_path([
|
@fills = @{chained_path([
|
||||||
map [ $fills_ordering_points[$_], $fills[$_] ], 0..$#fills,
|
map [ $fills_ordering_points[$_], $fills[$_] ], 0..$#fills,
|
||||||
])};
|
])};
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ sub fill_surface {
|
||||||
)};
|
)};
|
||||||
|
|
||||||
return { flow_spacing => $params{flow_spacing} },
|
return { flow_spacing => $params{flow_spacing} },
|
||||||
Slic3r::Polyline::Collection->new(polylines => \@paths)->shortest_path;
|
Slic3r::Polyline::Collection->new(polylines => \@paths)->chained_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
|
|
@ -73,7 +73,7 @@ sub fill_surface {
|
||||||
}
|
}
|
||||||
: sub { abs($_[X] - $distance_between_lines) <= $tolerance && $_[Y] <= $diagonal_distance };
|
: sub { abs($_[X] - $distance_between_lines) <= $tolerance && $_[Y] <= $diagonal_distance };
|
||||||
|
|
||||||
foreach my $path ($collection->shortest_path) {
|
foreach my $path ($collection->chained_path) {
|
||||||
if (@paths) {
|
if (@paths) {
|
||||||
my @distance = map abs($path->[0][$_] - $paths[-1][-1][$_]), (X,Y);
|
my @distance = map abs($path->[0][$_] - $paths[-1][-1][$_]), (X,Y);
|
||||||
|
|
||||||
|
|
|
@ -270,7 +270,7 @@ sub travel_to {
|
||||||
my $mp = shift;
|
my $mp = shift;
|
||||||
return join '',
|
return join '',
|
||||||
map $self->G0($_->[B], undef, 0, $comment || ""),
|
map $self->G0($_->[B], undef, 0, $comment || ""),
|
||||||
$mp->shortest_path($self->last_pos, $point)->lines;
|
$mp->chained_path($self->last_pos, $point)->lines;
|
||||||
};
|
};
|
||||||
|
|
||||||
if ($self->new_object) {
|
if ($self->new_object) {
|
||||||
|
|
|
@ -217,7 +217,7 @@ sub find_node {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub shortest_path {
|
sub chained_path {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my ($from, $to) = @_;
|
my ($from, $to) = @_;
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ our @EXPORT_OK = qw(
|
||||||
longest_segment angle3points three_points_aligned line_direction
|
longest_segment angle3points three_points_aligned line_direction
|
||||||
polyline_remove_parallel_continuous_edges polyline_remove_acute_vertices
|
polyline_remove_parallel_continuous_edges polyline_remove_acute_vertices
|
||||||
polygon_remove_acute_vertices polygon_remove_parallel_continuous_edges
|
polygon_remove_acute_vertices polygon_remove_parallel_continuous_edges
|
||||||
shortest_path collinear scale unscale merge_collinear_lines
|
chained_path collinear scale unscale merge_collinear_lines
|
||||||
rad2deg_dir bounding_box_center line_intersects_any douglas_peucker
|
rad2deg_dir bounding_box_center line_intersects_any douglas_peucker
|
||||||
polyline_remove_short_segments normal triangle_normal polygon_is_convex
|
polyline_remove_short_segments normal triangle_normal polygon_is_convex
|
||||||
scaled_epsilon bounding_box_3D size_3D size_2D
|
scaled_epsilon bounding_box_3D size_3D size_2D
|
||||||
|
@ -803,7 +803,7 @@ sub polyline_remove_short_segments {
|
||||||
# item is the point to be used for the shortest path, and the second
|
# item is the point to be used for the shortest path, and the second
|
||||||
# one is the value to be returned in output (if the second item
|
# one is the value to be returned in output (if the second item
|
||||||
# is not provided, the point will be returned)
|
# is not provided, the point will be returned)
|
||||||
sub shortest_path {
|
sub chained_path {
|
||||||
my ($items, $start_near) = @_;
|
my ($items, $start_near) = @_;
|
||||||
|
|
||||||
my %values = map +($_->[0] => $_->[1] || $_->[0]), @$items;
|
my %values = map +($_->[0] => $_->[1] || $_->[0]), @$items;
|
||||||
|
|
|
@ -2,7 +2,7 @@ package Slic3r::Layer::Region;
|
||||||
use Moo;
|
use Moo;
|
||||||
|
|
||||||
use Slic3r::ExtrusionPath ':roles';
|
use Slic3r::ExtrusionPath ':roles';
|
||||||
use Slic3r::Geometry qw(scale shortest_path);
|
use Slic3r::Geometry qw(scale chained_path);
|
||||||
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);
|
||||||
use Slic3r::Surface ':types';
|
use Slic3r::Surface ':types';
|
||||||
|
|
||||||
|
@ -167,7 +167,7 @@ sub make_perimeters {
|
||||||
my @perimeters = (); # one item per depth; each item
|
my @perimeters = (); # one item per depth; each item
|
||||||
|
|
||||||
# organize islands using a shortest path search
|
# organize islands using a shortest path search
|
||||||
my @surfaces = @{shortest_path([
|
my @surfaces = @{chained_path([
|
||||||
map [ $_->contour->[0], $_ ], @{$self->slices},
|
map [ $_->contour->[0], $_ ], @{$self->slices},
|
||||||
])};
|
])};
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ sub make_perimeters {
|
||||||
my @hole_depths = map [ map $_->holes, @$_ ], @$island;
|
my @hole_depths = map [ map $_->holes, @$_ ], @$island;
|
||||||
|
|
||||||
# organize the outermost hole loops using a shortest path search
|
# organize the outermost hole loops using a shortest path search
|
||||||
@{$hole_depths[0]} = @{shortest_path([
|
@{$hole_depths[0]} = @{chained_path([
|
||||||
map [ $_->[0], $_ ], @{$hole_depths[0]},
|
map [ $_->[0], $_ ], @{$hole_depths[0]},
|
||||||
])};
|
])};
|
||||||
|
|
||||||
|
@ -391,7 +391,7 @@ sub make_perimeters {
|
||||||
flow_spacing => $self->perimeter_flow->spacing,
|
flow_spacing => $self->perimeter_flow->spacing,
|
||||||
);
|
);
|
||||||
} @{ $self->thin_walls }
|
} @{ $self->thin_walls }
|
||||||
])->shortest_path;
|
])->chained_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub _add_perimeter {
|
sub _add_perimeter {
|
||||||
|
|
|
@ -193,7 +193,7 @@ has 'polylines' => (is => 'ro', default => sub { [] });
|
||||||
# If the second argument is provided, this method will return its items sorted
|
# If the second argument is provided, this method will return its items sorted
|
||||||
# instead of returning the actual sorted polylines.
|
# instead of returning the actual sorted polylines.
|
||||||
# Note that our polylines will be reversed in place when necessary.
|
# Note that our polylines will be reversed in place when necessary.
|
||||||
sub shortest_path {
|
sub chained_path {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
my ($start_near, $items) = @_;
|
my ($start_near, $items) = @_;
|
||||||
|
|
||||||
|
|
|
@ -821,13 +821,13 @@ sub write_gcode {
|
||||||
$gcode .= $gcodegen->set_extruder($self->extruders->[$Slic3r::Config->support_material_extruder-1]);
|
$gcode .= $gcodegen->set_extruder($self->extruders->[$Slic3r::Config->support_material_extruder-1]);
|
||||||
if ($layer->support_contact_fills) {
|
if ($layer->support_contact_fills) {
|
||||||
$gcode .= $gcodegen->extrude_path($_, 'support material contact area')
|
$gcode .= $gcodegen->extrude_path($_, 'support material contact area')
|
||||||
for $layer->support_contact_fills->shortest_path($gcodegen->last_pos);
|
for $layer->support_contact_fills->chained_path($gcodegen->last_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
$gcode .= $gcodegen->move_z($layer->print_z);
|
$gcode .= $gcodegen->move_z($layer->print_z);
|
||||||
if ($layer->support_fills) {
|
if ($layer->support_fills) {
|
||||||
$gcode .= $gcodegen->extrude_path($_, 'support material')
|
$gcode .= $gcodegen->extrude_path($_, 'support material')
|
||||||
for $layer->support_fills->shortest_path($gcodegen->last_pos);
|
for $layer->support_fills->chained_path($gcodegen->last_pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -854,7 +854,7 @@ sub write_gcode {
|
||||||
for my $fill (@{ $layerm->fills }) {
|
for my $fill (@{ $layerm->fills }) {
|
||||||
if ($fill->isa('Slic3r::ExtrusionPath::Collection')) {
|
if ($fill->isa('Slic3r::ExtrusionPath::Collection')) {
|
||||||
$gcode .= $gcodegen->extrude($_, 'fill')
|
$gcode .= $gcodegen->extrude($_, 'fill')
|
||||||
for $fill->shortest_path($gcodegen->last_pos);
|
for $fill->chained_path($gcodegen->last_pos);
|
||||||
} else {
|
} else {
|
||||||
$gcode .= $gcodegen->extrude($fill, 'fill') ;
|
$gcode .= $gcodegen->extrude($fill, 'fill') ;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue