Skip to content

Commit

Permalink
Set a minimum length on extrusion. Also improve the comment with the …
Browse files Browse the repository at this point in the history
…type of extrusion.
  • Loading branch information
supermerill committed Aug 9, 2020
1 parent 6325a9e commit 75fd536
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 7 deletions.
1 change: 1 addition & 0 deletions resources/ui_layout/printer_fff.ui
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ group:Advanced
setting:use_relative_e_distances
setting:use_firmware_retraction
setting:use_volumetric_e
setting:min_length
setting:variable_layer_height

page:Custom G-code:cog
Expand Down
58 changes: 53 additions & 5 deletions src/libslic3r/GCode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3540,11 +3540,59 @@ void GCode::use(const ExtrusionEntityCollection &collection) {
}
}

std::string extrusion_role_2_string(const ExtrusionRole &er) {
switch (er) {
case erNone: return " none";
case erPerimeter: return " perimeter";
case erExternalPerimeter: return " external_perimeter";
case erOverhangPerimeter: return " overhang_perimeter";
case erInternalInfill: return " internal_infill";
case erSolidInfill: return " solid_infill";
case erTopSolidInfill: return " top_solid_infill";
case erBridgeInfill: return " bridge_infill";
case erThinWall: return " thin_wall";
case erGapFill: return " gap_fill";
case erSkirt: return " skirt";
case erSupportMaterial: return " support_material";
case erSupportMaterialInterface: return " support_material_interface";
case erWipeTower: return " wipe_tower";
case erMilling: return " milling";
case erCustom: return " custom";
case erMixed: return " mixed";
case erCount: return " count";
}
return " unkown";
}

std::string GCode::extrude_path(const ExtrusionPath &path, const std::string &description, double speed) {
// description += ExtrusionRole2String(path.role());

std::string descr = extrusion_role_2_string(path.role());
ExtrusionPath simplifed_path = path;
simplifed_path.simplify(SCALED_RESOLUTION);
std::string gcode = this->_extrude(simplifed_path, description, speed);
if (this->config().min_length.value != 0 && !m_last_too_small.empty()) {
//descr += " trys fusion " + std::to_string(unscaled(m_last_too_small.last_point().x())) + " , " + std::to_string(unscaled(path.first_point().x()));
//ensure that it's a continous thing
if (m_last_too_small.last_point().distance_to_square(path.first_point()) < scale_(this->config().min_length)) {
//descr += " ! fusion " + std::to_string(simplifed_path.polyline.points.size());
simplifed_path.height = (m_last_too_small.height * m_last_too_small.length() + path.height * path.length()) / (m_last_too_small.length() + path.length());
simplifed_path.mm3_per_mm = (m_last_too_small.mm3_per_mm * m_last_too_small.length() + path.mm3_per_mm * path.length()) / (m_last_too_small.length() + path.length());
simplifed_path.polyline.points.insert(simplifed_path.polyline.points.begin(), m_last_too_small.polyline.points.begin(), m_last_too_small.polyline.points.end()-1);
}
m_last_too_small.polyline.points.clear();
}
simplifed_path.simplify(this->config().min_length.value != 0 ? scale_(this->config().min_length) : SCALED_RESOLUTION);
if (this->config().min_length.value != 0 && simplifed_path.length() < scale_(this->config().min_length)) {
m_last_too_small = simplifed_path;
return "";
//"; "+ descr+" .... too small for extrude: "+std::to_string(simplifed_path.length())+" < "+ std::to_string(scale_(this->config().min_length))
//+ " ; " + std::to_string(unscaled(path.first_point().x())) + " : " + std::to_string(unscaled(path.last_point().x()))
//+" =;=> " + std::to_string(unscaled(simplifed_path.first_point().x())) + " : " + std::to_string(unscaled(simplifed_path.last_point().x()))
//+ "\n";
}

std::string gcode = this->_extrude(simplifed_path, description + descr, speed);

//gcode += " ; " + std::to_string(unscaled(path.first_point().x())) + " : " + std::to_string(unscaled(path.last_point().x()));
//gcode += " =;=> " + std::to_string(unscaled(simplifed_path.first_point().x())) + " : " + std::to_string(unscaled(simplifed_path.last_point().x()));

if (m_wipe.enable) {
m_wipe.path = std::move(simplifed_path.polyline);
Expand All @@ -3556,9 +3604,9 @@ std::string GCode::extrude_path(const ExtrusionPath &path, const std::string &de
}

std::string GCode::extrude_path_3D(const ExtrusionPath3D &path, const std::string &description, double speed) {
// description += ExtrusionRole2String(path.role());
std::string descr = extrusion_role_2_string(path.role());
//path.simplify(SCALED_RESOLUTION);
std::string gcode = this->_before_extrude(path, description, speed);
std::string gcode = this->_before_extrude(path, description + descr, speed);

// calculate extrusion length per distance unit
double e_per_mm = path.mm3_per_mm
Expand Down
6 changes: 5 additions & 1 deletion src/libslic3r/GCode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ class GCode : ExtrusionVisitorConst {
m_normal_time_estimator(GCodeTimeEstimator::Normal),
m_silent_time_estimator(GCodeTimeEstimator::Silent),
m_silent_time_estimator_enabled(false),
m_last_obj_copy(nullptr, Point(std::numeric_limits<coord_t>::max(), std::numeric_limits<coord_t>::max()))
m_last_obj_copy(nullptr, Point(std::numeric_limits<coord_t>::max(), std::numeric_limits<coord_t>::max())),
m_last_too_small(ExtrusionRole::erNone)
{}
~GCode() {}

Expand Down Expand Up @@ -380,6 +381,9 @@ class GCode : ExtrusionVisitorConst {
Point m_last_pos;
bool m_last_pos_defined;

// a previous extrusion path that is too small to be extruded, have to fusion it into the next call.
ExtrusionPath m_last_too_small;

std::unique_ptr<CoolingBuffer> m_cooling_buffer;
std::unique_ptr<SpiralVase> m_spiral_vase;
#ifdef HAS_PRESSURE_EQUALIZER
Expand Down
10 changes: 10 additions & 0 deletions src/libslic3r/PrintConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2061,6 +2061,16 @@ void PrintConfigDef::init_fff_params()
def->mode = comSimple;
def->set_default_value(new ConfigOptionFloats { 0.07 });

def = this->add("min_length", coFloat);
def->label = L("minimum extrusion length");
def->category = OptionCategory::speed;
def->tooltip = L("Too many too small commands may overload the firmware / connection. Put a higher value here if you see strange slowdown."
"\n0 to disable.");
def->sidetext = L("mm");
def->min = 0;
def->mode = comExpert;
def->set_default_value(new ConfigOptionFloat(0.035));

def = this->add("min_width_top_surface", coFloatOrPercent);
def->label = L("minimum top width for infill");
def->category = OptionCategory::speed;
Expand Down
4 changes: 3 additions & 1 deletion src/libslic3r/PrintConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -886,11 +886,12 @@ class GCodeConfig : public StaticPrintConfig
ConfigOptionString feature_gcode;
ConfigOptionFloat max_print_speed;
ConfigOptionFloat max_volumetric_speed;
ConfigOptionFloats milling_z_lift;
#ifdef HAS_PRESSURE_EQUALIZER
ConfigOptionFloat max_volumetric_extrusion_rate_slope_positive;
ConfigOptionFloat max_volumetric_extrusion_rate_slope_negative;
#endif
ConfigOptionFloats milling_z_lift;
ConfigOptionFloat min_length;
ConfigOptionPercents retract_before_wipe;
ConfigOptionFloats retract_length;
ConfigOptionFloats retract_length_toolchange;
Expand Down Expand Up @@ -983,6 +984,7 @@ class GCodeConfig : public StaticPrintConfig
OPT_PTR(max_print_speed);
OPT_PTR(max_volumetric_speed);
OPT_PTR(milling_z_lift);
OPT_PTR(min_length);
#ifdef HAS_PRESSURE_EQUALIZER
OPT_PTR(max_volumetric_extrusion_rate_slope_positive);
OPT_PTR(max_volumetric_extrusion_rate_slope_negative);
Expand Down
1 change: 1 addition & 0 deletions src/slic3r/GUI/Preset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,7 @@ const std::vector<std::string>& Preset::printer_options()
"printer_technology",
"bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed",
"use_firmware_retraction", "use_volumetric_e", "variable_layer_height",
"min_length",
"host_type", "print_host", "printhost_apikey", "printhost_cafile",
"single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode",
"feature_gcode",
Expand Down

0 comments on commit 75fd536

Please sign in to comment.