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:
Lukas Matena 2019-06-10 12:26:47 +02:00
parent 6f7051c3b1
commit 079e63e190
3 changed files with 46 additions and 59 deletions

View File

@ -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)

View File

@ -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;

View File

@ -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>(