Add Lift Z only Above/Below, On Surface (e.g. Only on Top) (#1562)

* Added config options for Enforce Lift Z (from SS, doesn't affect Gcode
yet)

* working, minus first layer override; also fixed m_last_extrusion_role not being set

* fixed logic to match SS

* minimize to just one config

* removed first layer override

* Cleaned up logic, working as intended

* added lift above z, lift below z; somehow broke filament overrides

* fixed overrides not working, but lift above/below and enforce don't override

* fixed filament overrides

---------

Co-authored-by: SoftFever <softfeverever@gmail.com>
This commit is contained in:
Jason M-H 2023-07-22 09:07:13 -04:00 committed by GitHub
parent 777c7c68f9
commit 7a3971eca5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 127 additions and 22 deletions

View file

@ -4057,19 +4057,15 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
double F = speed * 60; // convert mm/sec to mm/min
// extrude arc or line
if (m_enable_extrusion_role_markers)
{
if (path.role() != m_last_extrusion_role)
{
m_last_extrusion_role = path.role();
if (m_enable_extrusion_role_markers)
{
if (m_enable_extrusion_role_markers) {
if (path.role() != m_last_extrusion_role) {
char buf[32];
sprintf(buf, ";_EXTRUSION_ROLE:%d\n", int(m_last_extrusion_role));
sprintf(buf, ";_EXTRUSION_ROLE:%d\n", int(path.role()));
gcode += buf;
}
}
}
m_last_extrusion_role = path.role();
// adds processor tags and updates processor tracking data
// PrusaMultiMaterial::Writer may generate GCodeProcessor::Height_Tag lines without updating m_last_height
@ -4288,6 +4284,11 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
if (m_enable_cooling_markers) {
gcode += ";_EXTRUDE_END\n";
}
if (path.role() != ExtrusionRole::erGapFill) {
m_last_notgapfill_extrusion_role = path.role();
}
this->set_last_pos(path.last_point());
return gcode;
}
@ -4519,8 +4520,34 @@ std::string GCode::retract(bool toolchange, bool is_last_retraction, LiftType li
gcode += toolchange ? m_writer.retract_for_toolchange() : m_writer.retract();
gcode += m_writer.reset_e();
// check if should + can lift (roughly from SuperSlicer)
RetractLiftEnforceType retract_lift_type = RetractLiftEnforceType(EXTRUDER_CONFIG(retract_lift_enforce));
bool needs_lift = toolchange
|| m_writer.extruder()->retraction_length() > 0
|| m_config.use_firmware_retraction;
bool last_fill_extrusion_role_top_infill = (this->m_last_notgapfill_extrusion_role == ExtrusionRole::erTopSolidInfill || this->m_last_notgapfill_extrusion_role == ExtrusionRole::erIroning);
// assume we can lift on retraction; conditions left explicit
bool can_lift = true;
if (retract_lift_type == RetractLiftEnforceType::rletAllSurfaces) {
can_lift = true;
}
else if (this->m_layer_index == 0 && (retract_lift_type == RetractLiftEnforceType::rletBottomOnly || retract_lift_type == RetractLiftEnforceType::rletTopAndBottom)) {
can_lift = true;
}
else if (retract_lift_type == RetractLiftEnforceType::rletTopOnly || retract_lift_type == RetractLiftEnforceType::rletTopAndBottom) {
can_lift = last_fill_extrusion_role_top_infill;
}
else {
can_lift = false;
}
//BBS
if (m_writer.extruder()->retraction_length() > 0 || m_config.use_firmware_retraction) {
if (needs_lift && can_lift) {
// BBS: don't do lazy_lift when enable spiral vase
size_t extruder_id = m_writer.extruder()->id();
gcode += m_writer.lift(!m_spiral_vase ? lift_type : LiftType::NormalLift);

View file

@ -459,6 +459,8 @@ private:
//double m_volumetric_speed;
// Support for the extrusion role markers. Which marker is active?
ExtrusionRole m_last_extrusion_role;
// To ignore gapfill role for retract_lift_enforce
ExtrusionRole m_last_notgapfill_extrusion_role;
// Support for G-Code Processor
float m_last_height{ 0.0f };
float m_last_layer_z{ 0.0f };

View file

@ -691,6 +691,9 @@ std::string GCodeWriter::lift(LiftType lift_type)
double target_lift = 0;
{
//BBS
double above = this->config.retract_lift_above.get_at(m_extruder->id());
double below = this->config.retract_lift_below.get_at(m_extruder->id());
if (m_pos(2) >= above && (below == 0 || m_pos(2) <= below))
target_lift = this->config.z_hop.get_at(m_extruder->id());
}
// BBS

View file

@ -773,7 +773,7 @@ static std::vector<std::string> s_Preset_filament_options {
"fan_max_speed", "enable_overhang_bridge_fan", "overhang_fan_speed", "overhang_fan_threshold", "close_fan_the_first_x_layers", "full_fan_speed_layer", "fan_cooling_layer_time", "slow_down_layer_time", "slow_down_min_speed",
"filament_start_gcode", "filament_end_gcode",
// Retract overrides
"filament_retraction_length", "filament_z_hop", "filament_z_hop_types", "filament_retraction_speed", "filament_deretraction_speed", "filament_retract_restart_extra", "filament_retraction_minimum_travel",
"filament_retraction_length", "filament_z_hop", "filament_z_hop_types", "filament_retract_lift_above", "filament_retract_lift_below", "filament_retract_lift_enforce", "filament_retraction_speed", "filament_deretraction_speed", "filament_retract_restart_extra", "filament_retraction_minimum_travel",
"filament_retract_when_changing_layer", "filament_wipe", "filament_retract_before_wipe",
// Profile compatibility
"filament_vendor", "compatible_prints", "compatible_prints_condition", "compatible_printers", "compatible_printers_condition", "inherits",
@ -802,7 +802,7 @@ static std::vector<std::string> s_Preset_printer_options {
"silent_mode",
// BBS
"scan_first_layer", "machine_load_filament_time", "machine_unload_filament_time", "machine_pause_gcode", "template_custom_gcode",
"nozzle_type", "nozzle_hrc","auxiliary_fan", "nozzle_volume","upward_compatible_machine", "z_hop_types",
"nozzle_type", "nozzle_hrc","auxiliary_fan", "nozzle_volume","upward_compatible_machine", "z_hop_types", "retract_lift_enforce",
//SoftFever
"host_type", "print_host", "printhost_apikey",
"print_host_webui",

View file

@ -137,6 +137,9 @@ bool Print::invalidate_state_by_config_options(const ConfigOptionResolver & /* n
"retraction_length",
"retract_length_toolchange",
"z_hop",
"retract_lift_above",
"retract_lift_below",
"retract_lift_enforce",
"retract_restart_extra",
"retract_restart_extra_toolchange",
"retraction_speed",

View file

@ -307,6 +307,14 @@ static const t_config_enum_values s_keys_map_ZHopType = {
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(ZHopType)
static const t_config_enum_values s_keys_map_RetractLiftEnforceType = {
{"All Surfaces", rletAllSurfaces},
{"Top Only", rletTopOnly},
{"Bottom Only", rletBottomOnly},
{"Top and Bottom", rletTopAndBottom}
};
CONFIG_OPTION_ENUM_DEFINE_STATIC_MAPS(RetractLiftEnforceType)
static void assign_printer_technology_to_unknown(t_optiondef_map &options, PrinterTechnology printer_technology)
{
for (std::pair<const t_config_option_key, ConfigOptionDef> &kvp : options)
@ -2553,6 +2561,35 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionEnumsGeneric{ ZHopType::zhtNormal });
def = this->add("retract_lift_above", coFloats);
def->label = L("Only lift Z above");
def->tooltip = L("If you set this to a positive value, Z lift will only take place above the specified absolute Z.");
def->sidetext = L("mm");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloats{0.});
def = this->add("retract_lift_below", coFloats);
def->label = L("Only lift Z below");
def->tooltip = L("If you set this to a positive value, Z lift will only take place below the specified absolute Z.");
def->sidetext = L("mm");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloats{0.});
def = this->add("retract_lift_enforce", coEnums);
def->label = L("On surfaces");
def->tooltip = L("Enforce Z Hop behavior. This setting is impacted by the above settings (Only lift Z above/below).");
def->enum_keys_map = &ConfigOptionEnum<RetractLiftEnforceType>::get_enum_values();
def->enum_values.push_back("All Surfaces");
def->enum_values.push_back("Top Only");
def->enum_values.push_back("Bottom Only");
def->enum_values.push_back("Top and Bottom");
def->enum_labels.push_back(L("All Surfaces"));
def->enum_labels.push_back(L("Top Only"));
def->enum_labels.push_back(L("Bottom Only"));
def->enum_labels.push_back(L("Top and Bottom"));
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionEnumsGeneric{RetractLiftEnforceType ::rletAllSurfaces});
def = this->add("retract_restart_extra", coFloats);
def->label = L("Extra length on restart");
def->tooltip = L("When the retraction is compensated after the travel move, the extruder will push "
@ -3592,7 +3629,7 @@ void PrintConfigDef::init_fff_params()
// Declare retract values for filament profile, overriding the printer's extruder profile.
for (const char *opt_key : {
// floats
"retraction_length", "z_hop", "z_hop_types", "retraction_speed", "deretraction_speed", "retract_restart_extra", "retraction_minimum_travel",
"retraction_length", "z_hop", "z_hop_types", "retract_lift_above", "retract_lift_below", "retract_lift_enforce", "retraction_speed", "deretraction_speed", "retract_restart_extra", "retraction_minimum_travel",
// BBS: floats
"wipe_distance",
// bools
@ -3639,7 +3676,7 @@ void PrintConfigDef::init_extruder_option_keys()
// ConfigOptionFloats, ConfigOptionPercents, ConfigOptionBools, ConfigOptionStrings
m_extruder_option_keys = {
"nozzle_diameter", "min_layer_height", "max_layer_height", "extruder_offset",
"retraction_length", "z_hop", "z_hop_types", "retraction_speed", "deretraction_speed",
"retraction_length", "z_hop", "z_hop_types", "retract_lift_above", "retract_lift_below", "retract_lift_enforce", "retraction_speed", "deretraction_speed",
"retract_before_wipe", "retract_restart_extra", "retraction_minimum_travel", "wipe", "wipe_distance",
"retract_when_changing_layer", "retract_length_toolchange", "retract_restart_extra_toolchange", "extruder_colour",
"default_filament_profile"
@ -3648,6 +3685,9 @@ void PrintConfigDef::init_extruder_option_keys()
m_extruder_retract_keys = {
"deretraction_speed",
"retract_before_wipe",
"retract_lift_above",
"retract_lift_below",
"retract_lift_enforce",
"retract_restart_extra",
"retract_when_changing_layer",
"retraction_length",
@ -3665,7 +3705,7 @@ void PrintConfigDef::init_filament_option_keys()
{
m_filament_option_keys = {
"filament_diameter", "min_layer_height", "max_layer_height",
"retraction_length", "z_hop", "z_hop_types", "retraction_speed", "deretraction_speed",
"retraction_length", "z_hop", "z_hop_types", "retract_lift_above", "retract_lift_below", "retract_lift_enforce", "retraction_speed", "deretraction_speed",
"retract_before_wipe", "retract_restart_extra", "retraction_minimum_travel", "wipe", "wipe_distance",
"retract_when_changing_layer", "retract_length_toolchange", "retract_restart_extra_toolchange", "filament_colour",
"default_filament_profile"/*,"filament_seam_gap"*/
@ -3674,6 +3714,9 @@ void PrintConfigDef::init_filament_option_keys()
m_filament_retract_keys = {
"deretraction_speed",
"retract_before_wipe",
"retract_lift_above",
"retract_lift_below",
"retract_lift_enforce",
"retract_restart_extra",
"retract_when_changing_layer",
"retraction_length",

View file

@ -218,6 +218,13 @@ enum ZHopType {
zhtCount
};
enum RetractLiftEnforceType {
rletAllSurfaces = 0,
rletTopOnly,
rletBottomOnly,
rletTopAndBottom
};
static std::string bed_type_to_gcode_string(const BedType type)
{
std::string type_str;
@ -863,6 +870,9 @@ PRINT_CONFIG_CLASS_DEFINE(
((ConfigOptionFloats, z_hop))
// BBS
((ConfigOptionEnumsGeneric, z_hop_types))
((ConfigOptionFloats, retract_lift_above))
((ConfigOptionFloats, retract_lift_below))
((ConfigOptionEnumsGeneric, retract_lift_enforce))
((ConfigOptionFloats, retract_restart_extra))
((ConfigOptionFloats, retract_restart_extra_toolchange))
((ConfigOptionFloats, retraction_speed))

View file

@ -2561,6 +2561,9 @@ void TabFilament::add_filament_overrides_page()
for (const std::string opt_key : { "filament_retraction_length",
"filament_z_hop",
"filament_z_hop_types",
"filament_retract_lift_above",
"filament_retract_lift_below",
"filament_retract_lift_enforce",
"filament_retraction_speed",
"filament_deretraction_speed",
"filament_retract_restart_extra",
@ -2595,6 +2598,9 @@ void TabFilament::update_filament_overrides_page()
std::vector<std::string> opt_keys = { "filament_retraction_length",
"filament_z_hop",
"filament_z_hop_types",
"filament_retract_lift_above",
"filament_retract_lift_below",
"filament_retract_lift_enforce",
"filament_retraction_speed",
"filament_deretraction_speed",
"filament_retract_restart_extra",
@ -3507,6 +3513,11 @@ void TabPrinter::build_unregular_pages(bool from_initial_build/* = false*/)
optgroup->append_single_option_line("wipe_distance", "", extruder_idx);
optgroup->append_single_option_line("retract_before_wipe", "", extruder_idx);
optgroup = page->new_optgroup(L("Lift Z Enforcement"), L"param_retraction", -1, true);
optgroup->append_single_option_line("retract_lift_above", "", extruder_idx);
optgroup->append_single_option_line("retract_lift_below", "", extruder_idx);
optgroup->append_single_option_line("retract_lift_enforce", "", extruder_idx);
optgroup = page->new_optgroup(L("Retraction when switching material"), L"param_retraction", -1, true);
optgroup->append_single_option_line("retract_length_toolchange", "", extruder_idx);
optgroup->append_single_option_line("retract_restart_extra_toolchange", "", extruder_idx);
@ -3707,6 +3718,12 @@ void TabPrinter::toggle_options()
for (auto el : vec)
toggle_option(el, retraction, i);
// retract lift above / below + enforce only applies if using retract lift
vec.resize(0);
vec = {"retract_lift_above", "retract_lift_below", "retract_lift_enforce"};
for (auto el : vec)
toggle_option(el, retraction && (m_config->opt_float("z_hop", i) > 0), i);
// some options only apply when not using firmware retraction
vec.resize(0);
vec = { "retraction_speed", "deretraction_speed", "retract_before_wipe", "retract_restart_extra", "wipe", "wipe_distance" };