The wipe tower now respects filament max volumetric flow
The odd commands that lowered the speed override values for PVA, FLEX etc. were removed Now the wipe tower backups user speed override, sets it to 100%, does what is needed and restores the old value when finished. There are no special cases - lowering the speed for certain materials can be achieved by lowering the volumetric flow.
This commit is contained in:
parent
6f7051c3b1
commit
079e63e190
@ -40,7 +40,7 @@ namespace PrusaMultiMaterial {
|
|||||||
class Writer
|
class Writer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Writer(float layer_height, float line_width, GCodeFlavor flavor) :
|
Writer(float layer_height, float line_width, GCodeFlavor flavor, const std::vector<WipeTowerPrusaMM::FilamentParameters>& filament_parameters) :
|
||||||
m_current_pos(std::numeric_limits<float>::max(), std::numeric_limits<float>::max()),
|
m_current_pos(std::numeric_limits<float>::max(), std::numeric_limits<float>::max()),
|
||||||
m_current_z(0.f),
|
m_current_z(0.f),
|
||||||
m_current_feedrate(0.f),
|
m_current_feedrate(0.f),
|
||||||
@ -49,7 +49,8 @@ public:
|
|||||||
m_preview_suppressed(false),
|
m_preview_suppressed(false),
|
||||||
m_elapsed_time(0.f),
|
m_elapsed_time(0.f),
|
||||||
m_default_analyzer_line_width(line_width),
|
m_default_analyzer_line_width(line_width),
|
||||||
m_gcode_flavor(flavor)
|
m_gcode_flavor(flavor),
|
||||||
|
m_filpar(filament_parameters)
|
||||||
{
|
{
|
||||||
// adds tag for analyzer:
|
// adds tag for analyzer:
|
||||||
char buf[64];
|
char buf[64];
|
||||||
@ -125,7 +126,7 @@ public:
|
|||||||
float get_and_reset_used_filament_length() { float temp = m_used_filament_length; m_used_filament_length = 0.f; return temp; }
|
float get_and_reset_used_filament_length() { float temp = m_used_filament_length; m_used_filament_length = 0.f; return temp; }
|
||||||
|
|
||||||
// Extrude with an explicitely provided amount of extrusion.
|
// Extrude with an explicitely provided amount of extrusion.
|
||||||
Writer& extrude_explicit(float x, float y, float e, float f = 0.f, bool record_length = false)
|
Writer& extrude_explicit(float x, float y, float e, float f = 0.f, bool record_length = false, bool limit_volumetric_flow = true)
|
||||||
{
|
{
|
||||||
if (x == m_current_pos.x && y == m_current_pos.y && e == 0.f && (f == 0.f || f == m_current_feedrate))
|
if (x == m_current_pos.x && y == m_current_pos.y && e == 0.f && (f == 0.f || f == m_current_feedrate))
|
||||||
// Neither extrusion nor a travel move.
|
// Neither extrusion nor a travel move.
|
||||||
@ -164,8 +165,13 @@ public:
|
|||||||
if (e != 0.f)
|
if (e != 0.f)
|
||||||
m_gcode += set_format_E(e);
|
m_gcode += set_format_E(e);
|
||||||
|
|
||||||
if (f != 0.f && f != m_current_feedrate)
|
if (f != 0.f && f != m_current_feedrate) {
|
||||||
m_gcode += set_format_F(f);
|
if (limit_volumetric_flow) {
|
||||||
|
float e_speed = e / (((len == 0) ? std::abs(e) : len) / f * 60.f);
|
||||||
|
f /= std::max(1.f, e_speed / m_filpar[m_current_tool].max_e_speed);
|
||||||
|
}
|
||||||
|
m_gcode += set_format_F(f);
|
||||||
|
}
|
||||||
|
|
||||||
m_current_pos.x = x;
|
m_current_pos.x = x;
|
||||||
m_current_pos.y = y;
|
m_current_pos.y = y;
|
||||||
@ -176,7 +182,7 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Writer& extrude_explicit(const WipeTower::xy &dest, float e, float f = 0.f, bool record_length = false)
|
Writer& extrude_explicit(const WipeTower::xy &dest, float e, float f = 0.f, bool record_length = false, bool limit_volumetric_flow = true)
|
||||||
{ return extrude_explicit(dest.x, dest.y, e, f, record_length); }
|
{ return extrude_explicit(dest.x, dest.y, e, f, record_length); }
|
||||||
|
|
||||||
// Travel to a new XY position. f=0 means use the current value.
|
// Travel to a new XY position. f=0 means use the current value.
|
||||||
@ -273,8 +279,8 @@ public:
|
|||||||
// extrude quickly amount e to x2 with feed f.
|
// extrude quickly amount e to x2 with feed f.
|
||||||
Writer& ram(float x1, float x2, float dy, float e0, float e, float f)
|
Writer& ram(float x1, float x2, float dy, float e0, float e, float f)
|
||||||
{
|
{
|
||||||
extrude_explicit(x1, m_current_pos.y + dy, e0, f, true);
|
extrude_explicit(x1, m_current_pos.y + dy, e0, f, true, false);
|
||||||
extrude_explicit(x2, m_current_pos.y, e, 0.f, true);
|
extrude_explicit(x2, m_current_pos.y, e, 0.f, true, false);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -422,6 +428,7 @@ private:
|
|||||||
const float m_default_analyzer_line_width;
|
const float m_default_analyzer_line_width;
|
||||||
float m_used_filament_length = 0.f;
|
float m_used_filament_length = 0.f;
|
||||||
GCodeFlavor m_gcode_flavor;
|
GCodeFlavor m_gcode_flavor;
|
||||||
|
const std::vector<WipeTowerPrusaMM::FilamentParameters>& m_filpar;
|
||||||
|
|
||||||
std::string set_format_X(float x)
|
std::string set_format_X(float x)
|
||||||
{
|
{
|
||||||
@ -528,15 +535,14 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::prime(
|
|||||||
const float prime_section_width = std::min(240.f / tools.size(), 60.f);
|
const float prime_section_width = std::min(240.f / tools.size(), 60.f);
|
||||||
box_coordinates cleaning_box(xy(5.f, 0.01f + m_perimeter_width/2.f), prime_section_width, 100.f);
|
box_coordinates cleaning_box(xy(5.f, 0.01f + m_perimeter_width/2.f), prime_section_width, 100.f);
|
||||||
|
|
||||||
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor);
|
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar);
|
||||||
writer.set_extrusion_flow(m_extrusion_flow)
|
writer.set_extrusion_flow(m_extrusion_flow)
|
||||||
.set_z(m_z_pos)
|
.set_z(m_z_pos)
|
||||||
.set_initial_tool(m_current_tool)
|
.set_initial_tool(m_current_tool)
|
||||||
.append(";--------------------\n"
|
.append(";--------------------\n"
|
||||||
"; CP PRIMING START\n")
|
"; CP PRIMING START\n")
|
||||||
.append(";--------------------\n");
|
.append(";--------------------\n");
|
||||||
if (m_retain_speed_override)
|
writer.speed_override_backup();
|
||||||
writer.speed_override_backup();
|
|
||||||
writer.speed_override(100);
|
writer.speed_override(100);
|
||||||
|
|
||||||
writer.set_initial_position(xy(0.f, 0.f)) // Always move to the starting position
|
writer.set_initial_position(xy(0.f, 0.f)) // Always move to the starting position
|
||||||
@ -571,8 +577,7 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::prime(
|
|||||||
// Reset the extruder current to a normal value.
|
// Reset the extruder current to a normal value.
|
||||||
if (m_set_extruder_trimpot)
|
if (m_set_extruder_trimpot)
|
||||||
writer.set_extruder_trimpot(550);
|
writer.set_extruder_trimpot(550);
|
||||||
if (m_retain_speed_override)
|
writer.speed_override_restore();
|
||||||
writer.speed_override_restore();
|
|
||||||
writer.feedrate(6000)
|
writer.feedrate(6000)
|
||||||
.flush_planner_queue()
|
.flush_planner_queue()
|
||||||
.reset_extruder()
|
.reset_extruder()
|
||||||
@ -630,7 +635,7 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::tool_change(unsigned int tool, boo
|
|||||||
(tool != (unsigned int)(-1) ? /*m_layer_info->depth*/wipe_area+m_depth_traversed-0.5*m_perimeter_width
|
(tool != (unsigned int)(-1) ? /*m_layer_info->depth*/wipe_area+m_depth_traversed-0.5*m_perimeter_width
|
||||||
: m_wipe_tower_depth-m_perimeter_width));
|
: m_wipe_tower_depth-m_perimeter_width));
|
||||||
|
|
||||||
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor);
|
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar);
|
||||||
writer.set_extrusion_flow(m_extrusion_flow)
|
writer.set_extrusion_flow(m_extrusion_flow)
|
||||||
.set_z(m_z_pos)
|
.set_z(m_z_pos)
|
||||||
.set_initial_tool(m_current_tool)
|
.set_initial_tool(m_current_tool)
|
||||||
@ -640,8 +645,7 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::tool_change(unsigned int tool, boo
|
|||||||
.comment_with_value(" toolchange #", m_num_tool_changes + 1) // the number is zero-based
|
.comment_with_value(" toolchange #", m_num_tool_changes + 1) // the number is zero-based
|
||||||
.comment_material(m_filpar[m_current_tool].material)
|
.comment_material(m_filpar[m_current_tool].material)
|
||||||
.append(";--------------------\n");
|
.append(";--------------------\n");
|
||||||
if (m_retain_speed_override)
|
writer.speed_override_backup();
|
||||||
writer.speed_override_backup();
|
|
||||||
writer.speed_override(100);
|
writer.speed_override(100);
|
||||||
|
|
||||||
xy initial_position = cleaning_box.ld + WipeTower::xy(0.f,m_depth_traversed);
|
xy initial_position = cleaning_box.ld + WipeTower::xy(0.f,m_depth_traversed);
|
||||||
@ -679,8 +683,7 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::tool_change(unsigned int tool, boo
|
|||||||
|
|
||||||
if (m_set_extruder_trimpot)
|
if (m_set_extruder_trimpot)
|
||||||
writer.set_extruder_trimpot(550); // Reset the extruder current to a normal value.
|
writer.set_extruder_trimpot(550); // Reset the extruder current to a normal value.
|
||||||
if (m_retain_speed_override)
|
writer.speed_override_restore();
|
||||||
writer.speed_override_restore();
|
|
||||||
writer.feedrate(6000)
|
writer.feedrate(6000)
|
||||||
.flush_planner_queue()
|
.flush_planner_queue()
|
||||||
.reset_extruder()
|
.reset_extruder()
|
||||||
@ -711,7 +714,7 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::toolchange_Brim(bool sideOnly, flo
|
|||||||
m_wipe_tower_width,
|
m_wipe_tower_width,
|
||||||
m_wipe_tower_depth);
|
m_wipe_tower_depth);
|
||||||
|
|
||||||
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor);
|
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar);
|
||||||
writer.set_extrusion_flow(m_extrusion_flow * 1.1f)
|
writer.set_extrusion_flow(m_extrusion_flow * 1.1f)
|
||||||
.set_z(m_z_pos) // Let the writer know the current Z position as a base for Z-hop.
|
.set_z(m_z_pos) // Let the writer know the current Z position as a base for Z-hop.
|
||||||
.set_initial_tool(m_current_tool)
|
.set_initial_tool(m_current_tool)
|
||||||
@ -917,19 +920,7 @@ void WipeTowerPrusaMM::toolchange_Change(
|
|||||||
if (m_current_tool < m_used_filament_length.size())
|
if (m_current_tool < m_used_filament_length.size())
|
||||||
m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length();
|
m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length();
|
||||||
|
|
||||||
// Speed override for the material. Go slow for flex and soluble materials.
|
|
||||||
int speed_override;
|
|
||||||
switch (new_material) {
|
|
||||||
case PVA: speed_override = (m_z_pos < 0.80f) ? 60 : 80; break;
|
|
||||||
case SCAFF: speed_override = 35; break;
|
|
||||||
case FLEX: speed_override = 35; break;
|
|
||||||
default: speed_override = 100;
|
|
||||||
}
|
|
||||||
writer.set_tool(new_tool);
|
writer.set_tool(new_tool);
|
||||||
if (m_retain_speed_override)
|
|
||||||
assert(speed_override == 100);
|
|
||||||
else
|
|
||||||
writer.speed_override(speed_override);
|
|
||||||
writer.flush_planner_queue();
|
writer.flush_planner_queue();
|
||||||
m_current_tool = new_tool;
|
m_current_tool = new_tool;
|
||||||
}
|
}
|
||||||
@ -1040,7 +1031,7 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::finish_layer()
|
|||||||
// Otherwise the caller would likely travel to the wipe tower in vain.
|
// Otherwise the caller would likely travel to the wipe tower in vain.
|
||||||
assert(! this->layer_finished());
|
assert(! this->layer_finished());
|
||||||
|
|
||||||
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor);
|
PrusaMultiMaterial::Writer writer(m_layer_height, m_perimeter_width, m_gcode_flavor, m_filpar);
|
||||||
writer.set_extrusion_flow(m_extrusion_flow)
|
writer.set_extrusion_flow(m_extrusion_flow)
|
||||||
.set_z(m_z_pos)
|
.set_z(m_z_pos)
|
||||||
.set_initial_tool(m_current_tool)
|
.set_initial_tool(m_current_tool)
|
||||||
|
@ -73,17 +73,12 @@ public:
|
|||||||
// Set the extruder properties.
|
// Set the extruder properties.
|
||||||
void set_extruder(size_t idx, material_type material, int temp, int first_layer_temp, float loading_speed, float loading_speed_start,
|
void set_extruder(size_t idx, material_type material, int temp, int first_layer_temp, float loading_speed, float loading_speed_start,
|
||||||
float unloading_speed, float unloading_speed_start, float delay, int cooling_moves,
|
float unloading_speed, float unloading_speed_start, float delay, int cooling_moves,
|
||||||
float cooling_initial_speed, float cooling_final_speed, std::string ramming_parameters, float nozzle_diameter)
|
float cooling_initial_speed, float cooling_final_speed, std::string ramming_parameters, float max_volumetric_speed, float nozzle_diameter)
|
||||||
{
|
{
|
||||||
//while (m_filpar.size() < idx+1) // makes sure the required element is in the vector
|
//while (m_filpar.size() < idx+1) // makes sure the required element is in the vector
|
||||||
m_filpar.push_back(FilamentParameters());
|
m_filpar.push_back(FilamentParameters());
|
||||||
|
|
||||||
m_filpar[idx].material = material;
|
m_filpar[idx].material = material;
|
||||||
if (material == FLEX || material == SCAFF || material == PVA) {
|
|
||||||
// MMU2 lowers the print speed using the speed override (M220) for printing of soluble PVA/BVOH and flex materials.
|
|
||||||
// Therefore it does not make sense to use the new M220 B and M220 R (backup / restore).
|
|
||||||
m_retain_speed_override = false;
|
|
||||||
}
|
|
||||||
m_filpar[idx].temperature = temp;
|
m_filpar[idx].temperature = temp;
|
||||||
m_filpar[idx].first_layer_temperature = first_layer_temp;
|
m_filpar[idx].first_layer_temperature = first_layer_temp;
|
||||||
m_filpar[idx].loading_speed = loading_speed;
|
m_filpar[idx].loading_speed = loading_speed;
|
||||||
@ -94,6 +89,8 @@ public:
|
|||||||
m_filpar[idx].cooling_moves = cooling_moves;
|
m_filpar[idx].cooling_moves = cooling_moves;
|
||||||
m_filpar[idx].cooling_initial_speed = cooling_initial_speed;
|
m_filpar[idx].cooling_initial_speed = cooling_initial_speed;
|
||||||
m_filpar[idx].cooling_final_speed = cooling_final_speed;
|
m_filpar[idx].cooling_final_speed = cooling_final_speed;
|
||||||
|
if (max_volumetric_speed != 0.f)
|
||||||
|
m_filpar[idx].max_e_speed = (max_volumetric_speed / Filament_Area);
|
||||||
m_filpar[idx].nozzle_diameter = nozzle_diameter; // to be used in future with (non-single) multiextruder MM
|
m_filpar[idx].nozzle_diameter = nozzle_diameter; // to be used in future with (non-single) multiextruder MM
|
||||||
|
|
||||||
m_perimeter_width = nozzle_diameter * Width_To_Nozzle_Ratio; // all extruders are now assumed to have the same diameter
|
m_perimeter_width = nozzle_diameter * Width_To_Nozzle_Ratio; // all extruders are now assumed to have the same diameter
|
||||||
@ -188,6 +185,24 @@ public:
|
|||||||
virtual std::vector<float> get_used_filament() const override { return m_used_filament_length; }
|
virtual std::vector<float> get_used_filament() const override { return m_used_filament_length; }
|
||||||
virtual int get_number_of_toolchanges() const override { return m_num_tool_changes; }
|
virtual int get_number_of_toolchanges() const override { return m_num_tool_changes; }
|
||||||
|
|
||||||
|
struct FilamentParameters {
|
||||||
|
material_type material = PLA;
|
||||||
|
int temperature = 0;
|
||||||
|
int first_layer_temperature = 0;
|
||||||
|
float loading_speed = 0.f;
|
||||||
|
float loading_speed_start = 0.f;
|
||||||
|
float unloading_speed = 0.f;
|
||||||
|
float unloading_speed_start = 0.f;
|
||||||
|
float delay = 0.f ;
|
||||||
|
int cooling_moves = 0;
|
||||||
|
float cooling_initial_speed = 0.f;
|
||||||
|
float cooling_final_speed = 0.f;
|
||||||
|
float ramming_line_width_multiplicator = 0.f;
|
||||||
|
float ramming_step_multiplicator = 0.f;
|
||||||
|
float max_e_speed = std::numeric_limits<float>::max();
|
||||||
|
std::vector<float> ramming_speed;
|
||||||
|
float nozzle_diameter;
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WipeTowerPrusaMM();
|
WipeTowerPrusaMM();
|
||||||
@ -224,32 +239,12 @@ private:
|
|||||||
float m_extra_loading_move = 0.f;
|
float m_extra_loading_move = 0.f;
|
||||||
float m_bridging = 0.f;
|
float m_bridging = 0.f;
|
||||||
bool m_set_extruder_trimpot = false;
|
bool m_set_extruder_trimpot = false;
|
||||||
bool m_retain_speed_override = true;
|
|
||||||
bool m_adhesion = true;
|
bool m_adhesion = true;
|
||||||
GCodeFlavor m_gcode_flavor;
|
GCodeFlavor m_gcode_flavor;
|
||||||
|
|
||||||
float m_perimeter_width = 0.4f * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill.
|
float m_perimeter_width = 0.4f * Width_To_Nozzle_Ratio; // Width of an extrusion line, also a perimeter spacing for 100% infill.
|
||||||
float m_extrusion_flow = 0.038f; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter.
|
float m_extrusion_flow = 0.038f; //0.029f;// Extrusion flow is derived from m_perimeter_width, layer height and filament diameter.
|
||||||
|
|
||||||
|
|
||||||
struct FilamentParameters {
|
|
||||||
material_type material = PLA;
|
|
||||||
int temperature = 0;
|
|
||||||
int first_layer_temperature = 0;
|
|
||||||
float loading_speed = 0.f;
|
|
||||||
float loading_speed_start = 0.f;
|
|
||||||
float unloading_speed = 0.f;
|
|
||||||
float unloading_speed_start = 0.f;
|
|
||||||
float delay = 0.f ;
|
|
||||||
int cooling_moves = 0;
|
|
||||||
float cooling_initial_speed = 0.f;
|
|
||||||
float cooling_final_speed = 0.f;
|
|
||||||
float ramming_line_width_multiplicator = 0.f;
|
|
||||||
float ramming_step_multiplicator = 0.f;
|
|
||||||
std::vector<float> ramming_speed;
|
|
||||||
float nozzle_diameter;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Extruder specific parameters.
|
// Extruder specific parameters.
|
||||||
std::vector<FilamentParameters> m_filpar;
|
std::vector<FilamentParameters> m_filpar;
|
||||||
|
|
||||||
|
@ -121,7 +121,6 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
|
|||||||
"filament_density",
|
"filament_density",
|
||||||
"filament_notes",
|
"filament_notes",
|
||||||
"filament_cost",
|
"filament_cost",
|
||||||
"filament_max_volumetric_speed",
|
|
||||||
"first_layer_acceleration",
|
"first_layer_acceleration",
|
||||||
"first_layer_bed_temperature",
|
"first_layer_bed_temperature",
|
||||||
"first_layer_speed",
|
"first_layer_speed",
|
||||||
@ -216,6 +215,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
|
|||||||
|| opt_key == "filament_cooling_initial_speed"
|
|| opt_key == "filament_cooling_initial_speed"
|
||||||
|| opt_key == "filament_cooling_final_speed"
|
|| opt_key == "filament_cooling_final_speed"
|
||||||
|| opt_key == "filament_ramming_parameters"
|
|| opt_key == "filament_ramming_parameters"
|
||||||
|
|| opt_key == "filament_max_volumetric_speed"
|
||||||
|| opt_key == "gcode_flavor"
|
|| opt_key == "gcode_flavor"
|
||||||
|| opt_key == "high_current_on_filament_swap"
|
|| opt_key == "high_current_on_filament_swap"
|
||||||
|| opt_key == "infill_first"
|
|| opt_key == "infill_first"
|
||||||
@ -1822,6 +1822,7 @@ void Print::_make_wipe_tower()
|
|||||||
m_config.filament_cooling_initial_speed.get_at(i),
|
m_config.filament_cooling_initial_speed.get_at(i),
|
||||||
m_config.filament_cooling_final_speed.get_at(i),
|
m_config.filament_cooling_final_speed.get_at(i),
|
||||||
m_config.filament_ramming_parameters.get_at(i),
|
m_config.filament_ramming_parameters.get_at(i),
|
||||||
|
m_config.filament_max_volumetric_speed.get_at(i),
|
||||||
m_config.nozzle_diameter.get_at(i));
|
m_config.nozzle_diameter.get_at(i));
|
||||||
|
|
||||||
m_wipe_tower_data.priming = Slic3r::make_unique<WipeTower::ToolChangeResult>(
|
m_wipe_tower_data.priming = Slic3r::make_unique<WipeTower::ToolChangeResult>(
|
||||||
|
Loading…
Reference in New Issue
Block a user