Bugfix: support material was generated under most bridges

This commit is contained in:
Alessandro Ranellucci 2012-02-25 21:39:01 +01:00
parent 1d0a852679
commit 70e69be60a
3 changed files with 41 additions and 32 deletions

View File

@ -332,8 +332,15 @@ sub process_bridges {
my $line_between_midpoints = Slic3r::Line->new(@midpoints); my $line_between_midpoints = Slic3r::Line->new(@midpoints);
$bridge_angle = rad2deg_dir($line_between_midpoints->direction); $bridge_angle = rad2deg_dir($line_between_midpoints->direction);
} elsif (@edges == 1) { } elsif (@edges == 1) {
my $line = Slic3r::Line->new($edges[0]->[0], $edges[0]->[-1]); # TODO: this case includes both U-shaped bridges and plain overhangs;
$bridge_angle = rad2deg_dir($line->direction); # we need a trapezoidation algorithm to detect the actual bridged area
# and separate it from the overhang area.
# in the mean time, we're treating as overhangs all cases where
# 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);
}
} else { } else {
my $center = bounding_box_center([ map @$_, @edges ]); my $center = bounding_box_center([ map @$_, @edges ]);
my $x = my $y = 0; my $x = my $y = 0;

View File

@ -446,14 +446,38 @@ sub infill_every_layers {
sub generate_support_material { sub generate_support_material {
my $self = shift; my $self = shift;
# determine unsupported surfaces
my %layers = ();
my @unsupported_expolygons = ();
{
my (@a, @b) = ();
for (my $i = $#{$self->layers}; $i >=0; $i--) {
my $layer = $self->layers->[$i];
my @c = ();
if (@b) {
@c = @{diff_ex(
[ map @$_, @b ],
[ map @$_, map $_->expolygon->offset_ex(scale $Slic3r::flow_width), @{$layer->slices} ],
)};
$layers{$i} = [@c];
}
@b = @{union_ex([ map @$_, @c, @a ])};
# get unsupported surfaces for current layer
@a = map $_->expolygon->offset_ex(scale $Slic3r::flow_spacing * $Slic3r::perimeters),
grep $_->surface_type eq 'bottom' && !defined $_->bridge_angle,
@{$layer->fill_surfaces};
$_->simplify(scale $Slic3r::flow_spacing * 3) for @a;
push @unsupported_expolygons, @a;
}
}
return if !@unsupported_expolygons;
# generate paths for the pattern that we're going to use # generate paths for the pattern that we're going to use
my $support_pattern = []; my $support_pattern = [];
{ {
# get all surfaces needing support material my @support_material_areas = @{union_ex([ map @$_, @unsupported_expolygons ])};
my @surfaces = grep $_->surface_type eq 'bottom' && !defined $_->bridge_angle,
map @{$_->slices}, grep $_->id > 0, @{$self->layers} or return;
my @support_material_areas = @{union_ex([ map $_->p, @surfaces ])};
for (1..$Slic3r::perimeters+1) { for (1..$Slic3r::perimeters+1) {
foreach my $expolygon (@support_material_areas) { foreach my $expolygon (@support_material_areas) {
@ -497,28 +521,6 @@ sub generate_support_material {
); );
} }
# now determine where to apply the pattern below unsupported surfaces
my %layers = ();
{
my (@a, @b) = ();
for (my $i = $#{$self->layers}; $i >=0; $i--) {
my $layer = $self->layers->[$i];
my @c = ();
if (@b) {
@c = @{diff_ex(
[ map @$_, @b ],
[ map @$_, map $_->expolygon->offset_ex(scale $Slic3r::flow_width), @{$layer->slices} ],
)};
$layers{$i} = [@c];
}
@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;
}
}
# apply the pattern to layers # apply the pattern to layers
{ {
my $clip_pattern = sub { my $clip_pattern = sub {

View File

@ -114,15 +114,15 @@ sub go {
} }
} }
# free memory
@{$_->fill_surfaces} = () for @{$print->layers};
# generate support material # generate support material
if ($Slic3r::support_material) { if ($Slic3r::support_material) {
$self->status_cb->(85, "Generating support material"); $self->status_cb->(85, "Generating support material");
$print->generate_support_material; $print->generate_support_material;
} }
# free memory (note that support material needs fill_surfaces)
@{$_->fill_surfaces} = () for @{$print->layers};
# make skirt # make skirt
$self->status_cb->(88, "Generating skirt"); $self->status_cb->(88, "Generating skirt");
$print->extrude_skirt; $print->extrude_skirt;