Merge remote-tracking branch 'origin/supports-synchronize-layers'

This commit is contained in:
bubnikv 2017-01-03 10:51:23 +01:00
commit 07dd06c53c
7 changed files with 75 additions and 34 deletions

View File

@ -532,8 +532,8 @@ sub build {
brim_width brim_width
support_material support_material_threshold support_material_enforce_layers support_material support_material_threshold support_material_enforce_layers
raft_layers raft_layers
support_material_pattern support_material_with_sheath support_material_spacing support_material_angle support_material_pattern support_material_with_sheath support_material_spacing support_material_synchronize_layers support_material_angle
support_material_interface_layers support_material_interface_spacing support_material_interface_layers support_material_interface_spacing support_material_interface_contact_loops
support_material_contact_distance support_material_buildplate_only dont_support_bridges support_material_contact_distance support_material_buildplate_only dont_support_bridges
notes notes
complete_objects extruder_clearance_radius extruder_clearance_height complete_objects extruder_clearance_radius extruder_clearance_height
@ -646,8 +646,10 @@ sub build {
$optgroup->append_single_option_line('support_material_angle'); $optgroup->append_single_option_line('support_material_angle');
$optgroup->append_single_option_line('support_material_interface_layers'); $optgroup->append_single_option_line('support_material_interface_layers');
$optgroup->append_single_option_line('support_material_interface_spacing'); $optgroup->append_single_option_line('support_material_interface_spacing');
$optgroup->append_single_option_line('support_material_interface_contact_loops');
$optgroup->append_single_option_line('support_material_buildplate_only'); $optgroup->append_single_option_line('support_material_buildplate_only');
$optgroup->append_single_option_line('dont_support_bridges'); $optgroup->append_single_option_line('dont_support_bridges');
$optgroup->append_single_option_line('support_material_synchronize_layers');
} }
} }
@ -910,12 +912,12 @@ sub _update {
my $have_support_interface = $config->support_material_interface_layers > 0; my $have_support_interface = $config->support_material_interface_layers > 0;
$self->get_field($_)->toggle($have_support_material) $self->get_field($_)->toggle($have_support_material)
for qw(support_material_threshold support_material_pattern support_material_with_sheath for qw(support_material_threshold support_material_pattern support_material_with_sheath
support_material_spacing support_material_angle support_material_spacing support_material_synchronize_layers support_material_angle
support_material_interface_layers dont_support_bridges support_material_interface_layers dont_support_bridges
support_material_extrusion_width support_material_contact_distance); support_material_extrusion_width support_material_contact_distance);
$self->get_field($_)->toggle($have_support_material && $have_support_interface) $self->get_field($_)->toggle($have_support_material && $have_support_interface)
for qw(support_material_interface_spacing support_material_interface_extruder for qw(support_material_interface_spacing support_material_interface_extruder
support_material_interface_speed); support_material_interface_speed support_material_interface_contact_loops);
$self->get_field('perimeter_extrusion_width')->toggle($have_perimeters || $have_skirt || $have_brim); $self->get_field('perimeter_extrusion_width')->toggle($have_perimeters || $have_skirt || $have_brim);
$self->get_field('support_material_extruder')->toggle($have_support_material || $have_skirt); $self->get_field('support_material_extruder')->toggle($have_support_material || $have_skirt);

View File

@ -262,7 +262,10 @@ sub export {
$gcodegen->avoid_crossing_perimeters->set_disable_once(1); $gcodegen->avoid_crossing_perimeters->set_disable_once(1);
} }
my @layers = sort { $a->print_z <=> $b->print_z } @{$object->layers}, @{$object->support_layers}; # Order layers by print_z, support layers preceding the object layers.
my @layers = sort
{ ($a->print_z == $b->print_z) ? ($a->isa('Slic3r::Layer::Support') ? -1 : 0) : $a->print_z <=> $b->print_z }
@{$object->layers}, @{$object->support_layers};
for my $layer (@layers) { for my $layer (@layers) {
# if we are printing the bottom layer of an object, and we have already finished # if we are printing the bottom layer of an object, and we have already finished
# another one, set first layer temperatures. this happens before the Z move # another one, set first layer temperatures. this happens before the Z move
@ -289,7 +292,8 @@ sub export {
my %layers = (); # print_z => [ [layers], [layers], [layers] ] by obj_idx my %layers = (); # print_z => [ [layers], [layers], [layers] ] by obj_idx
foreach my $obj_idx (0 .. ($self->print->object_count - 1)) { foreach my $obj_idx (0 .. ($self->print->object_count - 1)) {
my $object = $self->objects->[$obj_idx]; my $object = $self->objects->[$obj_idx];
foreach my $layer (@{$object->layers}, @{$object->support_layers}) { # Collect the object layers by z, support layers first, object layers second.
foreach my $layer (@{$object->support_layers}, @{$object->layers}) {
$layers{ $layer->print_z } ||= []; $layers{ $layer->print_z } ||= [];
$layers{ $layer->print_z }[$obj_idx] ||= []; $layers{ $layer->print_z }[$obj_idx] ||= [];
push @{$layers{ $layer->print_z }[$obj_idx]}, $layer; push @{$layers{ $layer->print_z }[$obj_idx]}, $layer;

View File

@ -46,6 +46,7 @@ sub generate {
# We now know the upper and lower boundaries for our support material object # We now know the upper and lower boundaries for our support material object
# (@$contact_z and @$top_z), so we can generate intermediate layers. # (@$contact_z and @$top_z), so we can generate intermediate layers.
my $support_z = $self->support_layers_z( my $support_z = $self->support_layers_z(
$object,
[ sort keys %$contact ], [ sort keys %$contact ],
[ sort keys %$top ], [ sort keys %$top ],
max(map $_->height, @{$object->layers}) max(map $_->height, @{$object->layers})
@ -384,7 +385,7 @@ sub object_top {
} }
sub support_layers_z { sub support_layers_z {
my ($self, $contact_z, $top_z, $max_object_layer_height) = @_; my ($self, $object, $contact_z, $top_z, $max_object_layer_height) = @_;
# quick table to check whether a given Z is a top surface # quick table to check whether a given Z is a top surface
my %top = map { $_ => 1 } @$top_z; my %top = map { $_ => 1 } @$top_z;
@ -397,13 +398,18 @@ sub support_layers_z {
my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter); my $contact_distance = $self->contact_distance($support_material_height, $nozzle_diameter);
# initialize known, fixed, support layers # initialize known, fixed, support layers
my @z = sort { $a <=> $b } my @z = @$contact_z;
@$contact_z, my $synchronize = $self->object_config->support_material_synchronize_layers;
# TODO: why we have this? if (! $synchronize) {
# Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z. push @z,
@$top_z, # TODO: why we have this?
# Top surfaces of the bottom interface layers. # Vojtech: To detect the bottom interface layers by finding a Z value in the $top_z.
(map $_ + $contact_distance, @$top_z); @$top_z;
push @z,
# Top surfaces of the bottom interface layers.
(map $_ + $contact_distance, @$top_z);
}
@z = sort { $a <=> $b } @z;
# enforce first layer height # enforce first layer height
my $first_layer_height = $self->object_config->get_value('first_layer_height'); my $first_layer_height = $self->object_config->get_value('first_layer_height');
@ -423,23 +429,29 @@ sub support_layers_z {
1..($self->object_config->raft_layers - 2); 1..($self->object_config->raft_layers - 2);
} }
# create other layers (skip raft layers as they're already done and use thicker layers) if ($synchronize) {
for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) { @z = splice @z, $self->object_config->raft_layers;
my $target_height = $support_material_height; # if ($self->object_config->raft_layers > scalar(@z));
if ($i > 0 && $top{ $z[$i-1] }) { push @z, map $_->print_z, @{$object->layers};
# Bridge flow? } else {
#FIXME We want to enforce not only the bridge flow height, but also the interface gap! # create other layers (skip raft layers as they're already done and use thicker layers)
# This will introduce an additional layer if the gap is set to an extreme value! for (my $i = $#z; $i >= $self->object_config->raft_layers; $i--) {
$target_height = $nozzle_diameter; my $target_height = $support_material_height;
} if ($i > 0 && $top{ $z[$i-1] }) {
# Bridge flow?
# enforce first layer height #FIXME We want to enforce not only the bridge flow height, but also the interface gap!
#FIXME better to split the layers regularly, than to bite a constant height one at a time, # This will introduce an additional layer if the gap is set to an extreme value!
# and then be left with a very thin layer at the end. $target_height = $nozzle_diameter;
if (($i == 0 && $z[$i] > $target_height + $first_layer_height) }
|| ($z[$i] - $z[$i-1] > $target_height + Slic3r::Geometry::epsilon)) {
splice @z, $i, 0, ($z[$i] - $target_height); # enforce first layer height
$i++; #FIXME better to split the layers regularly, than to bite a constant height one at a time,
# and then be left with a very thin layer at the end.
if (($i == 0 && $z[$i] > $target_height + $first_layer_height)
|| ($z[$i] - $z[$i-1] > $target_height + Slic3r::Geometry::epsilon)) {
splice @z, $i, 0, ($z[$i] - $target_height);
$i++;
}
} }
} }
@ -627,7 +639,7 @@ sub generate_toolpaths {
my $interface_flow = $self->interface_flow; my $interface_flow = $self->interface_flow;
# shape of contact area # shape of contact area
my $contact_loops = 1; my $contact_loops = $self->object_config->support_material_interface_contact_loops ? 1 : 0;
my $circle_radius = 1.5 * $interface_flow->scaled_width; my $circle_radius = 1.5 * $interface_flow->scaled_width;
my $circle_distance = 3 * $circle_radius; my $circle_distance = 3 * $circle_radius;
my $circle = Slic3r::Polygon->new(map [ $circle_radius * cos $_, $circle_radius * sin $_ ], my $circle = Slic3r::Polygon->new(map [ $circle_radius * cos $_, $circle_radius * sin $_ ],
@ -691,7 +703,10 @@ sub generate_toolpaths {
# if no interface layers were requested we treat the contact layer # if no interface layers were requested we treat the contact layer
# exactly as a generic base layer # exactly as a generic base layer
push @$base, @$contact; push @$base, @$contact;
} elsif (@$contact && $contact_loops > 0) { } elsif ($contact_loops == 0) {
# No contact loops, but some interface layers. Print the contact layer as a normal interface layer.
push @$interface, @$contact;
} elsif (@$contact) {
# generate the outermost loop # generate the outermost loop
# find centerline of the external loop (or any other kind of extrusions should the loop be skipped) # find centerline of the external loop (or any other kind of extrusions should the loop be skipped)

View File

@ -28,7 +28,7 @@ use Slic3r::Test;
interface_flow => $flow, interface_flow => $flow,
first_layer_flow => $flow, first_layer_flow => $flow,
); );
my $support_z = $support->support_layers_z(\@contact_z, \@top_z, $config->layer_height); my $support_z = $support->support_layers_z($print->print->objects->[0], \@contact_z, \@top_z, $config->layer_height);
my $expected_top_spacing = $support->contact_distance($config->layer_height, $config->nozzle_diameter->[0]); my $expected_top_spacing = $support->contact_distance($config->layer_height, $config->nozzle_diameter->[0]);
is $support_z->[0], $config->first_layer_height, is $support_z->[0], $config->first_layer_height,

View File

@ -1178,6 +1178,13 @@ PrintConfigDef::PrintConfigDef()
def->cli = "support-material-extrusion-width=s"; def->cli = "support-material-extrusion-width=s";
def->default_value = new ConfigOptionFloatOrPercent(0, false); def->default_value = new ConfigOptionFloatOrPercent(0, false);
def = this->add("support_material_interface_contact_loops", coBool);
def->label = "Interface circles";
def->category = "Support material";
def->tooltip = "Cover the top most interface layer with contact loops";
def->cli = "support-material-interface-contact-loops!";
def->default_value = new ConfigOptionBool(true);
def = this->add("support_material_interface_extruder", coInt); def = this->add("support_material_interface_extruder", coInt);
def->label = "Support material/raft interface extruder"; def->label = "Support material/raft interface extruder";
def->category = "Extruders"; def->category = "Extruders";
@ -1248,6 +1255,13 @@ PrintConfigDef::PrintConfigDef()
def->min = 0; def->min = 0;
def->default_value = new ConfigOptionFloat(60); def->default_value = new ConfigOptionFloat(60);
def = this->add("support_material_synchronize_layers", coBool);
def->label = "Synchronize with object layers";
def->category = "Support material";
def->tooltip = "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive.";
def->cli = "support-material-synchronize-layers!";
def->default_value = new ConfigOptionBool(false);
def = this->add("support_material_threshold", coInt); def = this->add("support_material_threshold", coInt);
def->label = "Overhang threshold"; def->label = "Overhang threshold";
def->category = "Support material"; def->category = "Support material";

View File

@ -153,6 +153,7 @@ class PrintObjectConfig : public virtual StaticPrintConfig
ConfigOptionInt support_material_enforce_layers; ConfigOptionInt support_material_enforce_layers;
ConfigOptionInt support_material_extruder; ConfigOptionInt support_material_extruder;
ConfigOptionFloatOrPercent support_material_extrusion_width; ConfigOptionFloatOrPercent support_material_extrusion_width;
ConfigOptionBool support_material_interface_contact_loops;
ConfigOptionInt support_material_interface_extruder; ConfigOptionInt support_material_interface_extruder;
ConfigOptionInt support_material_interface_layers; ConfigOptionInt support_material_interface_layers;
ConfigOptionFloat support_material_interface_spacing; ConfigOptionFloat support_material_interface_spacing;
@ -160,6 +161,7 @@ class PrintObjectConfig : public virtual StaticPrintConfig
ConfigOptionEnum<SupportMaterialPattern> support_material_pattern; ConfigOptionEnum<SupportMaterialPattern> support_material_pattern;
ConfigOptionFloat support_material_spacing; ConfigOptionFloat support_material_spacing;
ConfigOptionFloat support_material_speed; ConfigOptionFloat support_material_speed;
ConfigOptionBool support_material_synchronize_layers;
ConfigOptionInt support_material_threshold; ConfigOptionInt support_material_threshold;
ConfigOptionBool support_material_with_sheath; ConfigOptionBool support_material_with_sheath;
ConfigOptionFloat xy_size_compensation; ConfigOptionFloat xy_size_compensation;
@ -185,6 +187,7 @@ class PrintObjectConfig : public virtual StaticPrintConfig
OPT_PTR(support_material_buildplate_only); OPT_PTR(support_material_buildplate_only);
OPT_PTR(support_material_contact_distance); OPT_PTR(support_material_contact_distance);
OPT_PTR(support_material_enforce_layers); OPT_PTR(support_material_enforce_layers);
OPT_PTR(support_material_interface_contact_loops);
OPT_PTR(support_material_extruder); OPT_PTR(support_material_extruder);
OPT_PTR(support_material_extrusion_width); OPT_PTR(support_material_extrusion_width);
OPT_PTR(support_material_interface_extruder); OPT_PTR(support_material_interface_extruder);
@ -194,6 +197,7 @@ class PrintObjectConfig : public virtual StaticPrintConfig
OPT_PTR(support_material_pattern); OPT_PTR(support_material_pattern);
OPT_PTR(support_material_spacing); OPT_PTR(support_material_spacing);
OPT_PTR(support_material_speed); OPT_PTR(support_material_speed);
OPT_PTR(support_material_synchronize_layers);
OPT_PTR(support_material_threshold); OPT_PTR(support_material_threshold);
OPT_PTR(support_material_with_sheath); OPT_PTR(support_material_with_sheath);
OPT_PTR(xy_size_compensation); OPT_PTR(xy_size_compensation);

View File

@ -215,12 +215,14 @@ PrintObject::invalidate_state_by_config_options(const std::vector<t_config_optio
|| *opt_key == "support_material_extruder" || *opt_key == "support_material_extruder"
|| *opt_key == "support_material_extrusion_width" || *opt_key == "support_material_extrusion_width"
|| *opt_key == "support_material_interface_layers" || *opt_key == "support_material_interface_layers"
|| *opt_key == "support_material_interface_contact_loops"
|| *opt_key == "support_material_interface_extruder" || *opt_key == "support_material_interface_extruder"
|| *opt_key == "support_material_interface_spacing" || *opt_key == "support_material_interface_spacing"
|| *opt_key == "support_material_interface_speed" || *opt_key == "support_material_interface_speed"
|| *opt_key == "support_material_buildplate_only" || *opt_key == "support_material_buildplate_only"
|| *opt_key == "support_material_pattern" || *opt_key == "support_material_pattern"
|| *opt_key == "support_material_spacing" || *opt_key == "support_material_spacing"
|| *opt_key == "support_material_synchronize_layers"
|| *opt_key == "support_material_threshold" || *opt_key == "support_material_threshold"
|| *opt_key == "support_material_with_sheath" || *opt_key == "support_material_with_sheath"
|| *opt_key == "dont_support_bridges" || *opt_key == "dont_support_bridges"