Implementation of "XY size Compensation for first layer"

https://github.com/prusa3d/Slic3r/issues/190
This commit is contained in:
bubnikv 2017-06-26 16:28:10 +02:00
parent 32fa84c5a5
commit 8160db23cc
5 changed files with 21 additions and 2 deletions

View File

@ -566,7 +566,7 @@ sub build {
external_perimeter_extrusion_width infill_extrusion_width solid_infill_extrusion_width
top_infill_extrusion_width support_material_extrusion_width
infill_overlap bridge_flow_ratio
clip_multipart_objects xy_size_compensation threads resolution
clip_multipart_objects elefant_foot_compensation xy_size_compensation threads resolution
wipe_tower wipe_tower_x wipe_tower_y wipe_tower_width wipe_tower_per_color_wipe
));
$self->{config}->set('print_settings_id', '');
@ -770,6 +770,7 @@ sub build {
{
my $optgroup = $page->new_optgroup('Other');
$optgroup->append_single_option_line('clip_multipart_objects');
$optgroup->append_single_option_line('elefant_foot_compensation');
$optgroup->append_single_option_line('xy_size_compensation');
$optgroup->append_single_option_line('threads') if $Slic3r::have_threads;
$optgroup->append_single_option_line('resolution');

View File

@ -495,9 +495,13 @@ $j
--dont-arrange Don't arrange the objects on the build plate. The model coordinates
define the absolute positions on the build plate.
The option --print-center will be ignored.
--clip_multipart_objects When printing multi-material objects, this settings will make slic3r to clip the overlapping
--clip_multipart_objects
When printing multi-material objects, this settings will make slic3r to clip the overlapping
object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped
by the 1st and 2nd etc). (default: $config->{clip_multipart_objects})";
--elefant-foot-compensation
Shrink the first layer by the configured value to compensate for the 1st layer squish
aka an Elefant Foot effect (mm, default: $config->{elefant_foot_compensation})
--xy-size-compensation
Grow/shrink objects by the configured absolute distance (mm, default: $config->{xy_size_compensation})

View File

@ -163,6 +163,15 @@ PrintConfigDef::PrintConfigDef()
def->min = 0;
def->default_value = new ConfigOptionFloat(6);
def = this->add("elefant_foot_compensation", coFloat);
def->label = "Elefant foot compensation";
def->category = "Advanced";
def->tooltip = "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elefant Foot effect.";
def->sidetext = "mm";
def->cli = "elefant-foot-compensation=f";
def->min = 0;
def->default_value = new ConfigOptionFloat(0);
def = this->add("end_gcode", coString);
def->label = "End G-code";
def->tooltip = "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all Slic3r settings.";

View File

@ -165,6 +165,7 @@ class PrintObjectConfig : public virtual StaticPrintConfig
public:
ConfigOptionBool clip_multipart_objects;
ConfigOptionBool dont_support_bridges;
ConfigOptionFloat elefant_foot_compensation;
ConfigOptionFloatOrPercent extrusion_width;
ConfigOptionFloatOrPercent first_layer_height;
ConfigOptionBool infill_only_where_needed;
@ -203,6 +204,7 @@ public:
virtual ConfigOption* optptr(const t_config_option_key &opt_key, bool create = false) {
OPT_PTR(clip_multipart_objects);
OPT_PTR(dont_support_bridges);
OPT_PTR(elefant_foot_compensation);
OPT_PTR(extrusion_width);
OPT_PTR(first_layer_height);
OPT_PTR(infill_only_where_needed);

View File

@ -160,6 +160,7 @@ bool PrintObject::invalidate_state_by_config_options(const std::vector<t_config_
}
else if (
opt_key == "clip_multipart_objects"
|| opt_key == "elefant_foot_compensation"
|| opt_key == "support_material_contact_distance"
|| opt_key == "xy_size_compensation") {
steps.emplace_back(posSlice);
@ -1164,6 +1165,8 @@ end:
Layer *layer = this->layers[layer_id];
// Apply size compensation and perform clipping of multi-part objects.
float delta = float(scale_(this->config.xy_size_compensation.value));
if (layer_id == 0)
delta -= float(scale_(this->config.elefant_foot_compensation.value));
bool scale = delta != 0.f;
bool clip = this->config.clip_multipart_objects.value || delta > 0.f;
if (layer->regions.size() == 1) {