mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-05-20 03:43:52 +00:00
Enhance GCode handling for Z-axis movements (#10803)
* Enhance GCode handling for Z-axis movements - Updated `travel_to_z` method to include a `force` parameter, allowing forced Z movements. - Modified GCode generation logic to ensure Z position is restored after unknown last positions. - Enforce z restoreation after tool changer * Improve filament_multitool_ramming logic * fix indent
This commit is contained in:
@@ -769,7 +769,7 @@ static std::vector<Vec2d> get_path_of_change_filament(const Print& print)
|
|||||||
gcodegen.m_wipe.reset_path(); // We don't want wiping on the ramming lines.
|
gcodegen.m_wipe.reset_path(); // We don't want wiping on the ramming lines.
|
||||||
toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z); // TODO: toolchange_z vs print_z
|
toolchange_gcode_str = gcodegen.set_extruder(new_extruder_id, tcr.print_z); // TODO: toolchange_z vs print_z
|
||||||
if (gcodegen.config().enable_prime_tower) {
|
if (gcodegen.config().enable_prime_tower) {
|
||||||
deretraction_str += gcodegen.writer().travel_to_z(z, "restore layer Z");
|
deretraction_str += gcodegen.writer().travel_to_z(z, "Force restore layer Z", true);
|
||||||
Vec3d position{gcodegen.writer().get_position()};
|
Vec3d position{gcodegen.writer().get_position()};
|
||||||
position.z() = z;
|
position.z() = z;
|
||||||
gcodegen.writer().set_position(position);
|
gcodegen.writer().set_position(position);
|
||||||
@@ -5210,10 +5210,11 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
|
|||||||
auto target_z = get_sloped_z(sloped->slope_begin.z_ratio);
|
auto target_z = get_sloped_z(sloped->slope_begin.z_ratio);
|
||||||
slope_need_z_travel = m_writer.will_move_z(target_z);
|
slope_need_z_travel = m_writer.will_move_z(target_z);
|
||||||
}
|
}
|
||||||
// go to first point of extrusion path
|
// Move to first point of extrusion path
|
||||||
//BBS: path.first_point is 2D point. But in lazy raise case, lift z is done in travel_to function.
|
// path is 2D. But in slope lift case, lift z is done in travel_to function.
|
||||||
//Add m_need_change_layer_lift_z when change_layer in case of no lift if m_last_pos is equal to path.first_point() by chance
|
// Add m_need_change_layer_lift_z when change_layer in case of no lift if m_last_pos is equal to path.first_point() by chance
|
||||||
if (!m_last_pos_defined || m_last_pos != path.first_point() || m_need_change_layer_lift_z || slope_need_z_travel) {
|
if (!m_last_pos_defined || m_last_pos != path.first_point() || m_need_change_layer_lift_z || slope_need_z_travel) {
|
||||||
|
const bool _last_pos_undefined = !m_last_pos_defined;
|
||||||
gcode += this->travel_to(
|
gcode += this->travel_to(
|
||||||
path.first_point(),
|
path.first_point(),
|
||||||
path.role(),
|
path.role(),
|
||||||
@@ -5221,8 +5222,13 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
|
|||||||
sloped == nullptr ? DBL_MAX : get_sloped_z(sloped->slope_begin.z_ratio)
|
sloped == nullptr ? DBL_MAX : get_sloped_z(sloped->slope_begin.z_ratio)
|
||||||
);
|
);
|
||||||
m_need_change_layer_lift_z = false;
|
m_need_change_layer_lift_z = false;
|
||||||
|
// Orca: force restore Z after unknown last pos
|
||||||
|
if (_last_pos_undefined && !slope_need_z_travel) {
|
||||||
|
gcode += this->writer().travel_to_z(m_last_layer_z, "force restore Z after unknown last pos", true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// if needed, write the gcode_label_objects_end then gcode_label_objects_start
|
// if needed, write the gcode_label_objects_end then gcode_label_objects_start
|
||||||
// should be already done by travel_to, but just in case
|
// should be already done by travel_to, but just in case
|
||||||
m_writer.add_object_change_labels(gcode);
|
m_writer.add_object_change_labels(gcode);
|
||||||
@@ -6612,6 +6618,8 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z, bool b
|
|||||||
if (m_config.enable_pressure_advance.get_at(extruder_id)) {
|
if (m_config.enable_pressure_advance.get_at(extruder_id)) {
|
||||||
gcode += m_writer.set_pressure_advance(m_config.pressure_advance.get_at(extruder_id));
|
gcode += m_writer.set_pressure_advance(m_config.pressure_advance.get_at(extruder_id));
|
||||||
}
|
}
|
||||||
|
//Orca: tool changer or IDEX's firmware may change Z position, so we set it to unknown/undefined
|
||||||
|
m_last_pos_defined = false;
|
||||||
|
|
||||||
return gcode;
|
return gcode;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1350,7 +1350,7 @@ void WipeTower2::set_extruder(size_t idx, const PrintConfig& config)
|
|||||||
// We will use the same variables internally, but the correspondence to the configuration options will be different.
|
// We will use the same variables internally, but the correspondence to the configuration options will be different.
|
||||||
float vol = config.filament_multitool_ramming_volume.get_at(idx);
|
float vol = config.filament_multitool_ramming_volume.get_at(idx);
|
||||||
float flow = config.filament_multitool_ramming_flow.get_at(idx);
|
float flow = config.filament_multitool_ramming_flow.get_at(idx);
|
||||||
m_filpar[idx].multitool_ramming = config.filament_multitool_ramming.get_at(idx);
|
m_filpar[idx].multitool_ramming = config.filament_multitool_ramming.get_at(idx) && vol > 0.f && flow > 0.f;
|
||||||
m_filpar[idx].ramming_line_width_multiplicator = 2.;
|
m_filpar[idx].ramming_line_width_multiplicator = 2.;
|
||||||
m_filpar[idx].ramming_step_multiplicator = 1.;
|
m_filpar[idx].ramming_step_multiplicator = 1.;
|
||||||
|
|
||||||
@@ -1360,7 +1360,7 @@ void WipeTower2::set_extruder(size_t idx, const PrintConfig& config)
|
|||||||
// ramming_speed vector that would respect both the volume and flow (because of
|
// ramming_speed vector that would respect both the volume and flow (because of
|
||||||
// rounding issues with small volumes and high flow).
|
// rounding issues with small volumes and high flow).
|
||||||
m_filpar[idx].ramming_speed.push_back(flow);
|
m_filpar[idx].ramming_speed.push_back(flow);
|
||||||
m_filpar[idx].multitool_ramming_time = vol/flow;
|
m_filpar[idx].multitool_ramming_time = flow > 0.f ? vol/flow : 0.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_used_filament_length.resize(std::max(m_used_filament_length.size(), idx + 1)); // makes sure that the vector is big enough so we don't have to check later
|
m_used_filament_length.resize(std::max(m_used_filament_length.size(), idx + 1)); // makes sure that the vector is big enough so we don't have to check later
|
||||||
|
|||||||
@@ -633,12 +633,12 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co
|
|||||||
return out_string;
|
return out_string;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GCodeWriter::travel_to_z(double z, const std::string &comment)
|
std::string GCodeWriter::travel_to_z(double z, const std::string &comment, bool force)
|
||||||
{
|
{
|
||||||
/* If target Z is lower than current Z but higher than nominal Z
|
/* If target Z is lower than current Z but higher than nominal Z
|
||||||
we don't perform the move but we only adjust the nominal Z by
|
we don't perform the move but we only adjust the nominal Z by
|
||||||
reducing the lift amount that will be used for unlift. */
|
reducing the lift amount that will be used for unlift. */
|
||||||
if (!this->will_move_z(z)) {
|
if (!force && !this->will_move_z(z)) {
|
||||||
double nominal_z = m_pos(2) - m_lifted;
|
double nominal_z = m_pos(2) - m_lifted;
|
||||||
m_lifted -= (z - nominal_z);
|
m_lifted -= (z - nominal_z);
|
||||||
if (std::abs(m_lifted) < EPSILON)
|
if (std::abs(m_lifted) < EPSILON)
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public:
|
|||||||
double get_current_speed() const { return m_current_speed;}
|
double get_current_speed() const { return m_current_speed;}
|
||||||
std::string travel_to_xy(const Vec2d &point, const std::string &comment = std::string());
|
std::string travel_to_xy(const Vec2d &point, const std::string &comment = std::string());
|
||||||
std::string travel_to_xyz(const Vec3d &point, const std::string &comment = std::string(), bool force_z = false);
|
std::string travel_to_xyz(const Vec3d &point, const std::string &comment = std::string(), bool force_z = false);
|
||||||
std::string travel_to_z(double z, const std::string &comment = std::string());
|
std::string travel_to_z(double z, const std::string &comment = std::string(), bool force = false);
|
||||||
bool will_move_z(double z) const;
|
bool will_move_z(double z) const;
|
||||||
std::string extrude_to_xy(const Vec2d &point, double dE, const std::string &comment = std::string(), bool force_no_extrusion = false);
|
std::string extrude_to_xy(const Vec2d &point, double dE, const std::string &comment = std::string(), bool force_no_extrusion = false);
|
||||||
//BBS: generate G2 or G3 extrude which moves by arc
|
//BBS: generate G2 or G3 extrude which moves by arc
|
||||||
|
|||||||
@@ -3809,6 +3809,10 @@ void TabFilament::toggle_options()
|
|||||||
"filament_unloading_speed_start", "filament_unloading_speed", "filament_toolchange_delay", "filament_cooling_moves",
|
"filament_unloading_speed_start", "filament_unloading_speed", "filament_toolchange_delay", "filament_cooling_moves",
|
||||||
"filament_cooling_initial_speed", "filament_cooling_final_speed"})
|
"filament_cooling_initial_speed", "filament_cooling_final_speed"})
|
||||||
toggle_option(el, !is_BBL_printer);
|
toggle_option(el, !is_BBL_printer);
|
||||||
|
|
||||||
|
bool multitool_ramming = m_config->opt_bool("filament_multitool_ramming", 0);
|
||||||
|
toggle_option("filament_multitool_ramming_volume", multitool_ramming);
|
||||||
|
toggle_option("filament_multitool_ramming_flow", multitool_ramming);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user