mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-16 03:07:55 -06:00
Make sure interface and base generation honor the gap between support material and object
This commit is contained in:
parent
ed1c6d1aaa
commit
ef2296dc8d
1 changed files with 16 additions and 5 deletions
|
@ -6,7 +6,7 @@ use Slic3r::ExtrusionPath ':roles';
|
||||||
use Slic3r::Flow ':roles';
|
use Slic3r::Flow ':roles';
|
||||||
use Slic3r::Geometry qw(scale scaled_epsilon PI rad2deg deg2rad convex_hull);
|
use Slic3r::Geometry qw(scale scaled_epsilon PI rad2deg deg2rad convex_hull);
|
||||||
use Slic3r::Geometry::Clipper qw(offset diff union union_ex intersection offset_ex offset2
|
use Slic3r::Geometry::Clipper qw(offset diff union union_ex intersection offset_ex offset2
|
||||||
intersection_pl);
|
intersection_pl offset2_ex);
|
||||||
use Slic3r::Surface ':types';
|
use Slic3r::Surface ':types';
|
||||||
|
|
||||||
has 'print_config' => (is => 'rw', required => 1);
|
has 'print_config' => (is => 'rw', required => 1);
|
||||||
|
@ -332,13 +332,13 @@ sub generate_interface_layers {
|
||||||
|
|
||||||
# let's now generate interface layers below contact areas
|
# let's now generate interface layers below contact areas
|
||||||
my %interface = (); # layer_id => [ polygons ]
|
my %interface = (); # layer_id => [ polygons ]
|
||||||
my $interface_layers = $self->object_config->support_material_interface_layers;
|
my $interface_layers_num = $self->object_config->support_material_interface_layers;
|
||||||
for my $layer_id (0 .. $#$support_z) {
|
for my $layer_id (0 .. $#$support_z) {
|
||||||
my $z = $support_z->[$layer_id];
|
my $z = $support_z->[$layer_id];
|
||||||
my $this = $contact->{$z} // next;
|
my $this = $contact->{$z} // next;
|
||||||
|
|
||||||
# count contact layer as interface layer
|
# count contact layer as interface layer
|
||||||
for (my $i = $layer_id-1; $i >= 0 && $i > $layer_id-$interface_layers; $i--) {
|
for (my $i = $layer_id-1; $i >= 0 && $i > $layer_id-$interface_layers_num; $i--) {
|
||||||
$z = $support_z->[$i];
|
$z = $support_z->[$i];
|
||||||
my @overlapping_layers = $self->overlapping_layers($i, $support_z);
|
my @overlapping_layers = $self->overlapping_layers($i, $support_z);
|
||||||
my @overlapping_z = map $support_z->[$_], @overlapping_layers;
|
my @overlapping_z = map $support_z->[$_], @overlapping_layers;
|
||||||
|
@ -403,6 +403,9 @@ sub generate_base_layers {
|
||||||
return $base;
|
return $base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# This method removes object silhouette from support material
|
||||||
|
# (it's used with interface and base only). It removes a bit more,
|
||||||
|
# leaving a thin gap between object and support in the XY plane.
|
||||||
sub clip_with_object {
|
sub clip_with_object {
|
||||||
my ($self, $support, $support_z, $object) = @_;
|
my ($self, $support, $support_z, $object) = @_;
|
||||||
|
|
||||||
|
@ -414,6 +417,10 @@ sub clip_with_object {
|
||||||
my @layers = grep { $_->print_z > $zmin && ($_->print_z - $_->height) < $zmax }
|
my @layers = grep { $_->print_z > $zmin && ($_->print_z - $_->height) < $zmax }
|
||||||
@{$object->layers};
|
@{$object->layers};
|
||||||
|
|
||||||
|
# $layer->slices contains the full shape of layer, thus including
|
||||||
|
# perimeter's width. $support contains the full shape of support
|
||||||
|
# material, thus including the width of its foremost extrusion.
|
||||||
|
# We leave a gap equal to a full extrusion width.
|
||||||
$support->{$i} = diff(
|
$support->{$i} = diff(
|
||||||
$support->{$i},
|
$support->{$i},
|
||||||
offset([ map @$_, map @{$_->slices}, @layers ], +$self->flow->scaled_width),
|
offset([ map @$_, map @{$_->slices}, @layers ], +$self->flow->scaled_width),
|
||||||
|
@ -555,6 +562,9 @@ sub generate_toolpaths {
|
||||||
if (@$interface || @$contact_infill) {
|
if (@$interface || @$contact_infill) {
|
||||||
$fillers{interface}->angle($interface_angle);
|
$fillers{interface}->angle($interface_angle);
|
||||||
|
|
||||||
|
# find centerline of the external loop
|
||||||
|
$interface = offset2($interface, +scaled_epsilon, -(scaled_epsilon + $interface_flow->scaled_width/2));
|
||||||
|
|
||||||
# join regions by offsetting them to ensure they're merged
|
# join regions by offsetting them to ensure they're merged
|
||||||
$interface = offset([ @$interface, @$contact_infill ], scaled_epsilon);
|
$interface = offset([ @$interface, @$contact_infill ], scaled_epsilon);
|
||||||
|
|
||||||
|
@ -604,8 +614,9 @@ sub generate_toolpaths {
|
||||||
my $density = $support_density;
|
my $density = $support_density;
|
||||||
my $base_flow = $flow;
|
my $base_flow = $flow;
|
||||||
|
|
||||||
# TODO: use offset2_ex()
|
# find centerline of the external loop/extrusions
|
||||||
my $to_infill = union_ex($base, 1);
|
my $to_infill = offset2_ex($base, +scaled_epsilon, -(scaled_epsilon + $flow->scaled_width/2));
|
||||||
|
|
||||||
my @paths = ();
|
my @paths = ();
|
||||||
|
|
||||||
# base flange
|
# base flange
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue