Ported prepare_fill_surfaces() to XS/C++
This commit is contained in:
parent
97b5d76d50
commit
bb3bf28e59
@ -53,30 +53,6 @@ sub make_perimeters {
|
|||||||
$generator->process;
|
$generator->process;
|
||||||
}
|
}
|
||||||
|
|
||||||
sub prepare_fill_surfaces {
|
|
||||||
my $self = shift;
|
|
||||||
|
|
||||||
# Note: in order to make the psPrepareInfill step idempotent, we should never
|
|
||||||
# alter fill_surfaces boundaries on which our idempotency relies since that's
|
|
||||||
# the only meaningful information returned by psPerimeters.
|
|
||||||
|
|
||||||
# if no solid layers are requested, turn top/bottom surfaces to internal
|
|
||||||
if ($self->config->top_solid_layers == 0) {
|
|
||||||
$_->surface_type(S_TYPE_INTERNAL) for @{$self->fill_surfaces->filter_by_type(S_TYPE_TOP)};
|
|
||||||
}
|
|
||||||
if ($self->config->bottom_solid_layers == 0) {
|
|
||||||
$_->surface_type(S_TYPE_INTERNAL)
|
|
||||||
for @{$self->fill_surfaces->filter_by_type(S_TYPE_BOTTOM)}, @{$self->fill_surfaces->filter_by_type(S_TYPE_BOTTOMBRIDGE)};
|
|
||||||
}
|
|
||||||
|
|
||||||
# turn too small internal regions into solid regions according to the user setting
|
|
||||||
if ($self->config->fill_density > 0) {
|
|
||||||
my $min_area = scale scale $self->config->solid_infill_below_area; # scaling an area requires two calls!
|
|
||||||
$_->surface_type(S_TYPE_INTERNALSOLID)
|
|
||||||
for grep { $_->area <= $min_area } @{$self->fill_surfaces->filter_by_type(S_TYPE_INTERNAL)};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sub process_external_surfaces {
|
sub process_external_surfaces {
|
||||||
my ($self, $lower_layer) = @_;
|
my ($self, $lower_layer) = @_;
|
||||||
|
|
||||||
|
@ -56,6 +56,7 @@ class LayerRegion
|
|||||||
|
|
||||||
Flow flow(FlowRole role, bool bridge = false, double width = -1) const;
|
Flow flow(FlowRole role, bool bridge = false, double width = -1) const;
|
||||||
void merge_slices();
|
void merge_slices();
|
||||||
|
void prepare_fill_surfaces();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Layer *_layer;
|
Layer *_layer;
|
||||||
|
@ -53,6 +53,38 @@ LayerRegion::merge_slices()
|
|||||||
this->slices.surfaces.push_back(Surface(stInternal, *expoly));
|
this->slices.surfaces.push_back(Surface(stInternal, *expoly));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
LayerRegion::prepare_fill_surfaces()
|
||||||
|
{
|
||||||
|
/* Note: in order to make the psPrepareInfill step idempotent, we should never
|
||||||
|
alter fill_surfaces boundaries on which our idempotency relies since that's
|
||||||
|
the only meaningful information returned by psPerimeters. */
|
||||||
|
|
||||||
|
// if no solid layers are requested, turn top/bottom surfaces to internal
|
||||||
|
if (this->_region->config.top_solid_layers == 0) {
|
||||||
|
for (Surfaces::iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
|
||||||
|
if (surface->surface_type == stTop)
|
||||||
|
surface->surface_type = stInternal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this->_region->config.bottom_solid_layers == 0) {
|
||||||
|
for (Surfaces::iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
|
||||||
|
if (surface->surface_type == stBottom || surface->surface_type == stBottomBridge)
|
||||||
|
surface->surface_type = stInternal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// turn too small internal regions into solid regions according to the user setting
|
||||||
|
if (this->_region->config.fill_density.value > 0) {
|
||||||
|
// scaling an area requires two calls!
|
||||||
|
double min_area = scale_(scale_(this->_region->config.solid_infill_below_area.value));
|
||||||
|
for (Surfaces::iterator surface = this->fill_surfaces.surfaces.begin(); surface != this->fill_surfaces.surfaces.end(); ++surface) {
|
||||||
|
if (surface->surface_type == stInternal && surface->area() <= min_area)
|
||||||
|
surface->surface_type = stInternalSolid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SLIC3RXS
|
#ifdef SLIC3RXS
|
||||||
REGISTER_CLASS(LayerRegion, "Layer::Region");
|
REGISTER_CLASS(LayerRegion, "Layer::Region");
|
||||||
#endif
|
#endif
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
Clone<Flow> flow(FlowRole role, bool bridge = false, double width = -1)
|
Clone<Flow> flow(FlowRole role, bool bridge = false, double width = -1)
|
||||||
%code%{ RETVAL = THIS->flow(role, bridge, width); %};
|
%code%{ RETVAL = THIS->flow(role, bridge, width); %};
|
||||||
void merge_slices();
|
void merge_slices();
|
||||||
|
void prepare_fill_surfaces();
|
||||||
};
|
};
|
||||||
|
|
||||||
%name{Slic3r::Layer} class Layer {
|
%name{Slic3r::Layer} class Layer {
|
||||||
|
Loading…
Reference in New Issue
Block a user