Merge remote-tracking branch 'origin/supports-synchronize-layers'
This commit is contained in:
commit
07dd06c53c
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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)
|
||||||
|
@ -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,
|
||||||
|
@ -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";
|
||||||
|
@ -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);
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user