Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Perform additional checks before merging solid surfaces (i.e. take fl…

…ow and fill pattern into account)
  • Loading branch information...
commit 3d483722c670cc675efa45add202c1a43157734f 1 parent 634ccb3
@alexrj authored
View
48 lib/Slic3r/Fill.pm
@@ -64,8 +64,54 @@ sub make_fill {
{
my @surfaces_with_bridge_angle = grep defined $_->bridge_angle, @{$layerm->fill_surfaces};
+ # group surfaces by distinct properties
+ my @groups = @{$layerm->fill_surfaces->group};
+
+ # merge compatible groups (we can generate continuous infill for them)
+ {
+ # cache flow widths and patterns used for all solid groups
+ # (we'll use them for comparing compatible groups)
+ my @is_solid = my @fw = my @pattern = ();
+ for (my $i = 0; $i <= $#groups; $i++) {
+ # we can only merge solid non-bridge surfaces, so discard
+ # non-solid surfaces
+ if ($groups[$i][0]->is_solid && (!$groups[$i][0]->is_bridge || $layerm->id == 0)) {
+ $is_solid[$i] = 1;
+ $fw[$i] = ($groups[$i][0]->surface_type == S_TYPE_TOP)
+ ? $layerm->flow(FLOW_ROLE_TOP_SOLID_INFILL)->width
+ : $solid_infill_flow->width;
+ $pattern[$i] = $groups[$i][0]->is_external
+ ? $layerm->config->solid_fill_pattern
+ : 'rectilinear';
+ } else {
+ $is_solid[$i] = 0;
+ $fw[$i] = 0;
+ $pattern[$i] = 'none';
+ }
+ }
+
+ # loop through solid groups
+ for (my $i = 0; $i <= $#groups; $i++) {
+ next if !$is_solid[$i];
+
+ # find compatible groups and append them to this one
+ for (my $j = $i+1; $j <= $#groups; $j++) {
+ next if !$is_solid[$j];
+
+ if ($fw[$i] == $fw[$j] && $pattern[$i] eq $pattern[$j]) {
+ # groups are compatible, merge them
+ push @{$groups[$i]}, @{$groups[$j]};
+ splice @groups, $j, 1;
+ splice @is_solid, $j, 1;
+ splice @fw, $j, 1;
+ splice @pattern, $j, 1;
+ }
+ }
+ }
+ }
+
# give priority to bridges
- my @groups = sort { defined $a->[0]->bridge_angle ? -1 : 0 } @{$layerm->fill_surfaces->group(1)};
+ @groups = sort { defined $a->[0]->bridge_angle ? -1 : 0 } @groups;
foreach my $group (@groups) {
my $union_p = union([ map $_->p, @$group ], 1);
View
7 xs/src/Surface.cpp
@@ -17,6 +17,13 @@ Surface::is_solid() const
}
bool
+Surface::is_external() const
+{
+ return this->surface_type == stTop
+ || this->surface_type == stBottom;
+}
+
+bool
Surface::is_bridge() const
{
return this->surface_type == stBottom
View
1  xs/src/Surface.hpp
@@ -18,6 +18,7 @@ class Surface
unsigned short extra_perimeters;
double area() const;
bool is_solid() const;
+ bool is_external() const;
bool is_bridge() const;
#ifdef SLIC3RXS
View
4 xs/src/SurfaceCollection.cpp
@@ -21,14 +21,14 @@ SurfaceCollection::simplify(double tolerance)
/* group surfaces by common properties */
void
-SurfaceCollection::group(std::vector<SurfacesPtr> *retval, bool merge_solid)
+SurfaceCollection::group(std::vector<SurfacesPtr> *retval)
{
for (Surfaces::iterator it = this->surfaces.begin(); it != this->surfaces.end(); ++it) {
// find a group with the same properties
SurfacesPtr* group = NULL;
for (std::vector<SurfacesPtr>::iterator git = retval->begin(); git != retval->end(); ++git) {
Surface* gkey = git->front();
- if ((gkey->surface_type == it->surface_type || (merge_solid && gkey->is_solid() && it->is_solid()))
+ if ( gkey->surface_type == it->surface_type
&& gkey->thickness == it->thickness
&& gkey->thickness_layers == it->thickness_layers
&& gkey->bridge_angle == it->bridge_angle) {
View
2  xs/src/SurfaceCollection.hpp
@@ -11,7 +11,7 @@ class SurfaceCollection
public:
Surfaces surfaces;
void simplify(double tolerance);
- void group(std::vector<SurfacesPtr> *retval, bool merge_solid = false);
+ void group(std::vector<SurfacesPtr> *retval);
};
}
View
3  xs/t/05_surface.t
@@ -4,7 +4,7 @@ use strict;
use warnings;
use Slic3r::XS;
-use Test::More tests => 16;
+use Test::More tests => 15;
my $square = [ # ccw
[100, 100],
@@ -71,7 +71,6 @@ is $surface->extra_perimeters, 2, 'extra_perimeters';
);
my $collection = Slic3r::Surface::Collection->new(@surfaces);
is scalar(@{$collection->group}), 2, 'group() returns correct number of groups';
- is scalar(@{$collection->group(1)}), 1, 'group() returns correct number of solid groups';
}
__END__
View
1  xs/xsp/Surface.xsp
@@ -16,6 +16,7 @@
%code{% RETVAL = THIS->thickness_layers; %};
double area();
bool is_solid() const;
+ bool is_external() const;
bool is_bridge() const;
%{
View
5 xs/xsp/SurfaceCollection.xsp
@@ -76,12 +76,11 @@ SurfaceCollection::set_surface_type(index, surface_type)
THIS->surfaces[index].surface_type = surface_type;
SV*
-SurfaceCollection::group(merge_solid = false)
- bool merge_solid
+SurfaceCollection::group()
CODE:
// perform grouping
std::vector<SurfacesPtr> groups;
- THIS->group(&groups, merge_solid);
+ THIS->group(&groups);
// build return arrayref
AV* av = newAV();
Please sign in to comment.
Something went wrong with that request. Please try again.