Skip to content

Commit

Permalink
Use perimeter extruder for brim. #618
Browse files Browse the repository at this point in the history
  • Loading branch information
alranel committed Dec 16, 2014
1 parent e79aa2e commit c000616
Show file tree
Hide file tree
Showing 8 changed files with 39 additions and 11 deletions.
4 changes: 2 additions & 2 deletions README.md
Expand Up @@ -351,11 +351,11 @@ The author of the Silk icon set is Mark James.
--extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
(can be specified multiple times, default: 0x0)
--perimeter-extruder
Extruder to use for perimeters (1+, default: 1)
Extruder to use for perimeters and brim (1+, default: 1)
--infill-extruder Extruder to use for infill (1+, default: 1)
--solid-infill-extruder Extruder to use for solid infill (1+, default: 1)
--support-material-extruder
Extruder to use for support material (1+, default: 1)
Extruder to use for support material, raft and skirt (1+, default: 1)
--support-material-interface-extruder
Extruder to use for support material interface (1+, default: 1)
--ooze-prevention Drop temperature and park extruders outside a full skirt for automatic wiping
Expand Down
4 changes: 2 additions & 2 deletions lib/Slic3r/Print.pm
Expand Up @@ -332,9 +332,9 @@ sub make_brim {
}
$self->status_cb->(88, "Generating brim");

# brim is only printed on first layer and uses support material extruder
# brim is only printed on first layer and uses perimeter extruder
my $first_layer_height = $self->skirt_first_layer_height;
my $flow = $self->skirt_flow;
my $flow = $self->brim_flow;
my $mm3_per_mm = $flow->mm3_per_mm;

my $grow_distance = $flow->scaled_width / 2;
Expand Down
2 changes: 1 addition & 1 deletion lib/Slic3r/Print/GCode.pm
Expand Up @@ -348,7 +348,7 @@ sub process_layer {

# extrude brim
if (!$self->_brim_done) {
$gcode .= $self->_gcodegen->set_extruder($self->print->objects->[0]->config->support_material_extruder-1);
$gcode .= $self->_gcodegen->set_extruder($self->print->regions->[0]->config->perimeter_extruder-1);
$self->_gcodegen->set_origin(Slic3r::Pointf->new(0,0));
$self->_gcodegen->avoid_crossing_perimeters->use_external_mp(1);
$gcode .= $self->_gcodegen->extrude_loop($_, 'brim', $object->config->support_material_speed)
Expand Down
4 changes: 2 additions & 2 deletions slic3r.pl
Expand Up @@ -503,11 +503,11 @@ sub usage {
--extruder-offset Offset of each extruder, if firmware doesn't handle the displacement
(can be specified multiple times, default: 0x0)
--perimeter-extruder
Extruder to use for perimeters (1+, default: $config->{perimeter_extruder})
Extruder to use for perimeters and brim (1+, default: $config->{perimeter_extruder})
--infill-extruder Extruder to use for infill (1+, default: $config->{infill_extruder})
--solid-infill-extruder Extruder to use for solid infill (1+, default: $config->{solid_infill_extruder})
--support-material-extruder
Extruder to use for support material (1+, default: $config->{support_material_extruder})
Extruder to use for support material, raft and skirt (1+, default: $config->{support_material_extruder})
--support-material-interface-extruder
Extruder to use for support material interface (1+, default: $config->{support_material_interface_extruder})
--ooze-prevention Drop temperature and park extruders outside a full skirt for automatic wiping
Expand Down
30 changes: 28 additions & 2 deletions xs/src/libslic3r/Print.cpp
Expand Up @@ -669,11 +669,12 @@ Print::total_bounding_box() const
}

// consider brim and skirt
Flow skirt_flow = this->skirt_flow();
if (this->config.brim_width.value > 0) {
extra = std::max(extra, this->config.brim_width.value + skirt_flow.width/2);
Flow brim_flow = this->brim_flow();
extra = std::max(extra, this->config.brim_width.value + brim_flow.width/2);
}
if (this->config.skirts.value > 0) {
Flow skirt_flow = this->skirt_flow();
extra = std::max(
extra,
this->config.brim_width.value
Expand All @@ -696,12 +697,37 @@ Print::skirt_first_layer_height() const
return this->objects.front()->config.get_abs_value("first_layer_height");
}

Flow
Print::brim_flow() const
{
ConfigOptionFloatOrPercent width = this->config.first_layer_extrusion_width;
if (width.value == 0) width = this->regions.front()->config.perimeter_extrusion_width;

/* We currently use a random region's perimeter extruder.
While this works for most cases, we should probably consider all of the perimeter
extruders and take the one with, say, the smallest index.
The same logic should be applied to the code that selects the extruder during G-code
generation as well. */
return Flow::new_from_config_width(
frPerimeter,
width,
this->config.nozzle_diameter.get_at(this->regions.front()->config.perimeter_extruder-1),
this->skirt_first_layer_height(),
0
);
}

Flow
Print::skirt_flow() const
{
ConfigOptionFloatOrPercent width = this->config.first_layer_extrusion_width;
if (width.value == 0) width = this->regions.front()->config.perimeter_extrusion_width;

/* We currently use a random object's support material extruder.
While this works for most cases, we should probably consider all of the support material
extruders and take the one with, say, the smallest index;
The same logic should be applied to the code that selects the extruder during G-code
generation as well. */
return Flow::new_from_config_width(
frPerimeter,
width,
Expand Down
1 change: 1 addition & 0 deletions xs/src/libslic3r/Print.hpp
Expand Up @@ -188,6 +188,7 @@ class Print
BoundingBox bounding_box() const;
BoundingBox total_bounding_box() const;
double skirt_first_layer_height() const;
Flow brim_flow() const;
Flow skirt_flow() const;

std::set<size_t> extruders() const;
Expand Down
4 changes: 2 additions & 2 deletions xs/src/libslic3r/PrintConfig.cpp
Expand Up @@ -529,7 +529,7 @@ PrintConfigDef::build_def() {
Options["perimeter_extruder"].type = coInt;
Options["perimeter_extruder"].label = "Perimeter extruder";
Options["perimeter_extruder"].category = "Extruders";
Options["perimeter_extruder"].tooltip = "The extruder to use when printing perimeters. First extruder is 1.";
Options["perimeter_extruder"].tooltip = "The extruder to use when printing perimeters and brim. First extruder is 1.";
Options["perimeter_extruder"].cli = "perimeter-extruder=i";
Options["perimeter_extruder"].aliases.push_back("perimeters_extruder");
Options["perimeter_extruder"].min = 1;
Expand Down Expand Up @@ -781,7 +781,7 @@ PrintConfigDef::build_def() {
Options["support_material_extruder"].type = coInt;
Options["support_material_extruder"].label = "Support material extruder";
Options["support_material_extruder"].category = "Extruders";
Options["support_material_extruder"].tooltip = "The extruder to use when printing support material. This affects brim and raft too.";
Options["support_material_extruder"].tooltip = "The extruder to use when printing support material, raft and skirt.";
Options["support_material_extruder"].cli = "support-material-extruder=i";
Options["support_material_extruder"].min = 1;

Expand Down
1 change: 1 addition & 0 deletions xs/xsp/Print.xsp
Expand Up @@ -190,6 +190,7 @@ _constant()
Clone<BoundingBox> bounding_box();
Clone<BoundingBox> total_bounding_box();
double skirt_first_layer_height();
Clone<Flow> brim_flow();
Clone<Flow> skirt_flow();
%{

Expand Down

0 comments on commit c000616

Please sign in to comment.