Fill gaps using medial axis detection
This commit is contained in:
parent
a3a9cf5749
commit
90d10b24a8
@ -49,14 +49,14 @@ Roadmap includes the following goals:
|
|||||||
* support material for internal perimeters;
|
* support material for internal perimeters;
|
||||||
* new and better GUI;
|
* new and better GUI;
|
||||||
* cool;
|
* cool;
|
||||||
* other fill patterns.
|
* more fill patterns.
|
||||||
|
|
||||||
## Is it usable already? Any known limitation?
|
## Is it usable already? Any known limitation?
|
||||||
|
|
||||||
Sure, it's very usable. Remember that:
|
Sure, it's very usable. Remember that:
|
||||||
|
|
||||||
* it doesn't generate support material;
|
* it doesn't generate support material;
|
||||||
* it only works well with manifold models (check them with Meshlab or Netfabb or http://cloud.netfabb.com/).
|
* it only works well with manifold and clean models (check them with Meshlab or Netfabb or http://cloud.netfabb.com/).
|
||||||
|
|
||||||
## How to install?
|
## How to install?
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ sub split_at {
|
|||||||
|
|
||||||
# find index of point
|
# find index of point
|
||||||
my $i = -1;
|
my $i = -1;
|
||||||
for (my $n = 0; $n <= $#{$self->polygon}; $n++) {ZZZ "here" if ref $self->polygon->[$n] eq 'ARRAY';
|
for (my $n = 0; $n <= $#{$self->polygon}; $n++) {
|
||||||
if ($point->id eq $self->polygon->[$n]->id) {
|
if ($point->id eq $self->polygon->[$n]->id) {
|
||||||
$i = $n;
|
$i = $n;
|
||||||
last;
|
last;
|
||||||
|
@ -161,6 +161,17 @@ sub make_fill {
|
|||||||
],
|
],
|
||||||
) if @paths;
|
) if @paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# add thin fill regions
|
||||||
|
push @{ $layer->fills }, Slic3r::ExtrusionPath::Collection->new(
|
||||||
|
paths => [
|
||||||
|
map {
|
||||||
|
$_->isa('Slic3r::Polygon')
|
||||||
|
? Slic3r::ExtrusionLoop->new(polygon => $_, role => 'solid-fill')->split_at($_->[0])
|
||||||
|
: Slic3r::ExtrusionPath->new(polyline => $_, role => 'solid-fill')
|
||||||
|
} @{$layer->thin_fills},
|
||||||
|
],
|
||||||
|
) if @{$layer->thin_fills};
|
||||||
}
|
}
|
||||||
|
|
||||||
1;
|
1;
|
||||||
|
@ -34,6 +34,10 @@ has 'thin_walls' => (is => 'ro', default => sub { [] });
|
|||||||
# they represent boundaries of areas to fill
|
# they represent boundaries of areas to fill
|
||||||
has 'fill_boundaries' => (is => 'ro', default => sub { [] });
|
has 'fill_boundaries' => (is => 'ro', default => sub { [] });
|
||||||
|
|
||||||
|
# collection of polygons or polylines representing thin infill regions that
|
||||||
|
# need to be filled with a medial axis
|
||||||
|
has 'thin_fills' => (is => 'ro', default => sub { [] });
|
||||||
|
|
||||||
# collection of surfaces generated by clipping the slices to the fill boundaries
|
# collection of surfaces generated by clipping the slices to the fill boundaries
|
||||||
has 'surfaces' => (
|
has 'surfaces' => (
|
||||||
is => 'rw',
|
is => 'rw',
|
||||||
|
@ -3,6 +3,7 @@ use Moo;
|
|||||||
|
|
||||||
use Math::Clipper ':all';
|
use Math::Clipper ':all';
|
||||||
use Slic3r::Geometry qw(X Y shortest_path scale);
|
use Slic3r::Geometry qw(X Y shortest_path scale);
|
||||||
|
use Slic3r::Geometry::Clipper qw(diff_ex);
|
||||||
use XXX;
|
use XXX;
|
||||||
|
|
||||||
sub make_perimeter {
|
sub make_perimeter {
|
||||||
@ -42,6 +43,7 @@ sub make_perimeter {
|
|||||||
for (my $loop = 0; $loop < $Slic3r::perimeters; $loop++) {
|
for (my $loop = 0; $loop < $Slic3r::perimeters; $loop++) {
|
||||||
# offsetting a polygon can result in one or many offset polygons
|
# offsetting a polygon can result in one or many offset polygons
|
||||||
@last_offsets = map $_->offset_ex(-$distance), @last_offsets if $distance;
|
@last_offsets = map $_->offset_ex(-$distance), @last_offsets if $distance;
|
||||||
|
last if !@last_offsets;
|
||||||
push @{ $perimeters[-1] }, [@last_offsets];
|
push @{ $perimeters[-1] }, [@last_offsets];
|
||||||
|
|
||||||
# offset distance for inner loops
|
# offset distance for inner loops
|
||||||
@ -51,12 +53,18 @@ sub make_perimeter {
|
|||||||
# create one more offset to be used as boundary for fill
|
# create one more offset to be used as boundary for fill
|
||||||
{
|
{
|
||||||
my @fill_boundaries = map $_->offset_ex(-$distance), @last_offsets;
|
my @fill_boundaries = map $_->offset_ex(-$distance), @last_offsets;
|
||||||
|
push @{ $layer->fill_boundaries }, @fill_boundaries;
|
||||||
|
|
||||||
# TODO: diff(offset(@last_offsets, -$distance/2), offset(@fill_boundaries, +$distance/2))
|
# detect the small gaps that we need to treat like thin polygons,
|
||||||
# this represents the small gaps that we need to treat like thin polygons,
|
|
||||||
# thus generating the skeleton and using it to fill them
|
# thus generating the skeleton and using it to fill them
|
||||||
|
my $small_gaps = diff_ex(
|
||||||
push @{ $layer->fill_boundaries }, @fill_boundaries if @fill_boundaries;
|
[ map @$_, map $_->offset_ex(-$distance/2), map @$_, @{$perimeters[-1]} ],
|
||||||
|
[ map @$_, map $_->offset_ex(+$distance/2), @fill_boundaries ],
|
||||||
|
);
|
||||||
|
push @{ $layer->thin_fills },
|
||||||
|
grep $_,
|
||||||
|
map $_->medial_axis(scale $Slic3r::flow_width),
|
||||||
|
@$small_gaps;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,8 +12,6 @@ sub new {
|
|||||||
} elsif ($_[0]->isa(__PACKAGE__)) {
|
} elsif ($_[0]->isa(__PACKAGE__)) {
|
||||||
return $_[0];
|
return $_[0];
|
||||||
} else {
|
} else {
|
||||||
use XXX;
|
|
||||||
ZZZ \@_;
|
|
||||||
die "Invalid arguments for ${class}->new";
|
die "Invalid arguments for ${class}->new";
|
||||||
}
|
}
|
||||||
bless $self, $class;
|
bless $self, $class;
|
||||||
|
@ -61,7 +61,7 @@ sub clipper_polygon {
|
|||||||
}
|
}
|
||||||
|
|
||||||
sub p {
|
sub p {
|
||||||
my $self = shift;use XXX; ZZZ $self->expolygon if !eval { 1 if @{$self->expolygon}; 1 };
|
my $self = shift;
|
||||||
return @{$self->expolygon};
|
return @{$self->expolygon};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user