ENH: fix the floating layer issue
Fix for floating layer under multi-color printing while z_hop is zero. Signed-off-by: salt.wei <salt.wei@bambulab.com> Change-Id: I8cc96bd18020cac8424fe4c3e62fb87da118b826
This commit is contained in:
parent
679ccb658b
commit
0b126dbed6
|
@ -520,9 +520,20 @@ static std::vector<Vec2d> get_path_of_change_filament(const Print& print)
|
||||||
|
|
||||||
// retract before toolchange
|
// retract before toolchange
|
||||||
toolchange_gcode_str = toolchange_retract_str + toolchange_gcode_str;
|
toolchange_gcode_str = toolchange_retract_str + toolchange_gcode_str;
|
||||||
|
//BBS
|
||||||
|
{
|
||||||
//BBS: current position and fan_speed is unclear after interting change_filament_gcode
|
//BBS: current position and fan_speed is unclear after interting change_filament_gcode
|
||||||
|
check_add_eol(toolchange_gcode_str);
|
||||||
toolchange_gcode_str += ";_FORCE_RESUME_FAN_SPEED\n";
|
toolchange_gcode_str += ";_FORCE_RESUME_FAN_SPEED\n";
|
||||||
gcodegen.writer().set_current_position_clear(false);
|
gcodegen.writer().set_current_position_clear(false);
|
||||||
|
//BBS: check whether custom gcode changes the z position. Update if changed
|
||||||
|
double temp_z_after_tool_change;
|
||||||
|
if (GCodeProcessor::get_last_z_from_gcode(toolchange_gcode_str, temp_z_after_tool_change)) {
|
||||||
|
Vec3d pos = gcodegen.writer().get_position();
|
||||||
|
pos(2) = temp_z_after_tool_change;
|
||||||
|
gcodegen.writer().set_position(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// move to start_pos for wiping after toolchange
|
// move to start_pos for wiping after toolchange
|
||||||
std::string start_pos_str;
|
std::string start_pos_str;
|
||||||
|
@ -4239,12 +4250,23 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
|
||||||
std::string toolchange_gcode_parsed;
|
std::string toolchange_gcode_parsed;
|
||||||
if (!change_filament_gcode.empty()) {
|
if (!change_filament_gcode.empty()) {
|
||||||
toolchange_gcode_parsed = placeholder_parser_process("change_filament_gcode", change_filament_gcode, extruder_id, &dyn_config);
|
toolchange_gcode_parsed = placeholder_parser_process("change_filament_gcode", change_filament_gcode, extruder_id, &dyn_config);
|
||||||
|
check_add_eol(toolchange_gcode_parsed);
|
||||||
gcode += toolchange_gcode_parsed;
|
gcode += toolchange_gcode_parsed;
|
||||||
check_add_eol(gcode);
|
|
||||||
|
//BBS
|
||||||
|
{
|
||||||
//BBS: gcode writer doesn't know where the extruder is and whether fan speed is changed after inserting tool change gcode
|
//BBS: gcode writer doesn't know where the extruder is and whether fan speed is changed after inserting tool change gcode
|
||||||
//Set this flag so that normal lift will be used the first time after tool change.
|
//Set this flag so that normal lift will be used the first time after tool change.
|
||||||
gcode += ";_FORCE_RESUME_FAN_SPEED\n";
|
gcode += ";_FORCE_RESUME_FAN_SPEED\n";
|
||||||
m_writer.set_current_position_clear(false);
|
m_writer.set_current_position_clear(false);
|
||||||
|
//BBS: check whether custom gcode changes the z position. Update if changed
|
||||||
|
double temp_z_after_tool_change;
|
||||||
|
if (GCodeProcessor::get_last_z_from_gcode(toolchange_gcode_parsed, temp_z_after_tool_change)) {
|
||||||
|
Vec3d pos = m_writer.get_position();
|
||||||
|
pos(2) = temp_z_after_tool_change;
|
||||||
|
m_writer.set_position(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// BBS. Reset old extruder E-value.
|
// BBS. Reset old extruder E-value.
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
#include <boost/nowide/cstdio.hpp>
|
#include <boost/nowide/cstdio.hpp>
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
|
#include <fast_float/fast_float.h>
|
||||||
|
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
@ -1921,6 +1923,61 @@ int GCodeProcessor::get_gcode_last_filament(const std::string& gcode_str)
|
||||||
return out_filament;
|
return out_filament;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//BBS: get last z position from gcode
|
||||||
|
bool GCodeProcessor::get_last_z_from_gcode(const std::string& gcode_str, double& z)
|
||||||
|
{
|
||||||
|
int str_size = gcode_str.size();
|
||||||
|
int start_index = 0;
|
||||||
|
int end_index = 0;
|
||||||
|
bool is_z_changed = false;
|
||||||
|
while (end_index < str_size) {
|
||||||
|
//find a full line
|
||||||
|
if (gcode_str[end_index] != '\n') {
|
||||||
|
end_index++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
//parse the line
|
||||||
|
if (end_index > start_index) {
|
||||||
|
std::string line_str = gcode_str.substr(start_index, end_index - start_index);
|
||||||
|
line_str.erase(0, line_str.find_first_not_of(" "));
|
||||||
|
line_str.erase(line_str.find_last_not_of(";") + 1);
|
||||||
|
line_str.erase(line_str.find_last_not_of(" ") + 1);
|
||||||
|
|
||||||
|
//command which may have z movement
|
||||||
|
if (line_str.size() > 5 && (line_str.find("G0 ") == 0
|
||||||
|
|| line_str.find("G1 ") == 0
|
||||||
|
|| line_str.find("G2 ") == 0
|
||||||
|
|| line_str.find("G3 ") == 0))
|
||||||
|
{
|
||||||
|
auto z_pos = line_str.find(" Z");
|
||||||
|
double temp_z = 0;
|
||||||
|
if (z_pos != line_str.npos
|
||||||
|
&& z_pos + 2 < line_str.size()) {
|
||||||
|
// Try to parse the numeric value.
|
||||||
|
std::string z_sub = line_str.substr(z_pos + 2);
|
||||||
|
char* c = &z_sub[0];
|
||||||
|
char* end = c + sizeof(z_sub.c_str());
|
||||||
|
|
||||||
|
auto is_end_of_word = [](char c) {
|
||||||
|
return c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == 0 || c == ';';
|
||||||
|
};
|
||||||
|
|
||||||
|
auto [pend, ec] = fast_float::from_chars(c, end, temp_z);
|
||||||
|
if (pend != c && is_end_of_word(*pend)) {
|
||||||
|
// The axis value has been parsed correctly.
|
||||||
|
z = temp_z;
|
||||||
|
is_z_changed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//loop to handle next line
|
||||||
|
start_index = end_index + 1;
|
||||||
|
end_index = start_index;
|
||||||
|
}
|
||||||
|
return is_z_changed;
|
||||||
|
}
|
||||||
|
|
||||||
void GCodeProcessor::process_tags(const std::string_view comment, bool producers_enabled)
|
void GCodeProcessor::process_tags(const std::string_view comment, bool producers_enabled)
|
||||||
{
|
{
|
||||||
// producers tags
|
// producers tags
|
||||||
|
|
|
@ -238,6 +238,7 @@ namespace Slic3r {
|
||||||
static bool contains_reserved_tags(const std::string& gcode, unsigned int max_count, std::vector<std::string>& found_tag);
|
static bool contains_reserved_tags(const std::string& gcode, unsigned int max_count, std::vector<std::string>& found_tag);
|
||||||
|
|
||||||
static int get_gcode_last_filament(const std::string &gcode_str);
|
static int get_gcode_last_filament(const std::string &gcode_str);
|
||||||
|
static bool get_last_z_from_gcode(const std::string& gcode_str, double& z);
|
||||||
|
|
||||||
static const float Wipe_Width;
|
static const float Wipe_Width;
|
||||||
static const float Wipe_Height;
|
static const float Wipe_Height;
|
||||||
|
|
|
@ -374,20 +374,30 @@ std::string GCodeWriter::travel_to_xyz(const Vec3d &point, const std::string &co
|
||||||
/* In all the other cases, we perform an actual XYZ move and cancel
|
/* In all the other cases, we perform an actual XYZ move and cancel
|
||||||
the lift. */
|
the lift. */
|
||||||
m_lifted = 0;
|
m_lifted = 0;
|
||||||
m_pos = point;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//BBS: take plate offset into consider
|
//BBS: take plate offset into consider
|
||||||
this->set_current_position_clear(true);
|
|
||||||
Vec3d point_on_plate = { dest_point(0) - m_x_offset, dest_point(1) - m_y_offset, dest_point(2) };
|
Vec3d point_on_plate = { dest_point(0) - m_x_offset, dest_point(1) - m_y_offset, dest_point(2) };
|
||||||
m_pos = dest_point;
|
std::string out_string;
|
||||||
|
GCodeG1Formatter w;
|
||||||
|
if (!this->is_current_position_clear())
|
||||||
|
{
|
||||||
|
//force to move xy first then z after filament change
|
||||||
|
w.emit_xy(Vec2d(point_on_plate.x(), point_on_plate.y()));
|
||||||
|
w.emit_f(this->config.travel_speed.value * 60.0);
|
||||||
|
w.emit_comment(GCodeWriter::full_gcode_comment, comment);
|
||||||
|
out_string = w.string() + _travel_to_z(point_on_plate.z(), comment);
|
||||||
|
} else {
|
||||||
GCodeG1Formatter w;
|
GCodeG1Formatter w;
|
||||||
w.emit_xyz(point_on_plate);
|
w.emit_xyz(point_on_plate);
|
||||||
w.emit_f(this->config.travel_speed.value * 60.0);
|
w.emit_f(this->config.travel_speed.value * 60.0);
|
||||||
//BBS
|
|
||||||
w.emit_comment(GCodeWriter::full_gcode_comment, comment);
|
w.emit_comment(GCodeWriter::full_gcode_comment, comment);
|
||||||
return w.string();
|
out_string = w.string();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_pos = dest_point;
|
||||||
|
this->set_current_position_clear(true);
|
||||||
|
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)
|
||||||
|
|
|
@ -76,6 +76,7 @@ public:
|
||||||
std::string lift(LiftType lift_type = LiftType::NormalLift);
|
std::string lift(LiftType lift_type = LiftType::NormalLift);
|
||||||
std::string unlift();
|
std::string unlift();
|
||||||
Vec3d get_position() const { return m_pos; }
|
Vec3d get_position() const { return m_pos; }
|
||||||
|
void set_position(Vec3d& in) { m_pos = in; }
|
||||||
|
|
||||||
//BBS: set offset for gcode writer
|
//BBS: set offset for gcode writer
|
||||||
void set_xy_offset(double x, double y) { m_x_offset = x; m_y_offset = y; }
|
void set_xy_offset(double x, double y) { m_x_offset = x; m_y_offset = y; }
|
||||||
|
|
Loading…
Reference in New Issue