Support material: refactoring

This commit is contained in:
Alessandro Ranellucci 2012-02-25 16:23:41 +01:00
parent a24ffee2aa
commit cc695c6c22
2 changed files with 29 additions and 19 deletions

View File

@ -295,6 +295,7 @@ sub polygon_has_vertex {
return 0; return 0;
} }
# polygon must be simple (non complex) and ccw
sub polygon_is_convex { sub polygon_is_convex {
my ($points) = @_; my ($points) = @_;
for (my $i = 0; $i <= $#$points; $i++) { for (my $i = 0; $i <= $#$points; $i++) {

View File

@ -496,27 +496,36 @@ sub generate_support_material {
); );
} }
# now apply the pattern to layers below unsupported surfaces # now determine where to apply the pattern below unsupported surfaces
my (@a, @b) = (); my %layers = ();
for (my $i = $#{$self->layers}; $i >=0; $i--) { {
my $layer = $self->layers->[$i]; my (@a, @b) = ();
my @c = (); for (my $i = $#{$self->layers}; $i >=0; $i--) {
if (@b) { my $layer = $self->layers->[$i];
@c = @{diff_ex( my @c = ();
[ map @$_, @b ], if (@b) {
[ map @$_, map $_->expolygon->offset_ex(scale $Slic3r::flow_width), @{$layer->slices} ], @c = @{diff_ex(
)}; [ map @$_, @b ],
$layer->support_fills(Slic3r::ExtrusionPath::Collection->new); [ map @$_, map $_->expolygon->offset_ex(scale $Slic3r::flow_width), @{$layer->slices} ],
foreach my $expolygon (@c) { )};
push @{$layer->support_fills->paths}, map $_->clip_with_expolygon($expolygon), $layers{$i} = [@c];
map $_->clip_with_polygon($expolygon->bounding_box_polygon), @$support_pattern;
} }
@b = @{union_ex([ map @$_, @c, @a ])};
@a = map $_->expolygon->offset_ex(scale 2),
grep $_->surface_type eq 'bottom' && !defined $_->bridge_angle,
@{$layer->slices};
$_->simplify(scale $Slic3r::flow_spacing * 3) for @a;
} }
@b = @{union_ex([ map @$_, @c, @a ])}; }
@a = map $_->expolygon->offset_ex(scale 2),
grep $_->surface_type eq 'bottom' && !defined $_->bridge_angle, # apply the pattern to layers
@{$layer->slices}; foreach my $layer_id (keys %layers) {
$_->simplify(scale $Slic3r::flow_spacing * 3) for @a; my $layer = $self->layers->[$layer_id];
$layer->support_fills(Slic3r::ExtrusionPath::Collection->new);
foreach my $expolygon (@{ $layers{$layer_id} }) {
push @{$layer->support_fills->paths}, map $_->clip_with_expolygon($expolygon),
map $_->clip_with_polygon($expolygon->bounding_box_polygon), @$support_pattern;
};
} }
} }