Correction of wipe tower brim generation

This commit is contained in:
Lukas Matena 2017-12-22 11:26:43 +01:00
parent c6718c94bf
commit 180967484e
3 changed files with 37 additions and 26 deletions

View File

@ -92,7 +92,7 @@ public:
if (! m_preview_suppressed && e > 0.f && len > 0.) { if (! m_preview_suppressed && e > 0.f && len > 0.) {
// Width of a squished extrusion, corrected for the roundings of the squished extrusions. // Width of a squished extrusion, corrected for the roundings of the squished extrusions.
// This is left zero if it is a travel move. // This is left zero if it is a travel move.
float width = float(double(e) * m_filament_area / (len * m_layer_height)); float width = float(double(e) * Filament_Area / (len * m_layer_height));
// Correct for the roundings of a squished extrusion. // Correct for the roundings of a squished extrusion.
width += m_layer_height * float(1. - M_PI / 4.); width += m_layer_height * float(1. - M_PI / 4.);
if (m_extrusions.empty() || m_extrusions.back().pos != rotated_current_pos) if (m_extrusions.empty() || m_extrusions.back().pos != rotated_current_pos)
@ -258,6 +258,25 @@ public:
return *this; return *this;
}; };
Writer& set_fan(unsigned int speed)
{
if (speed == m_last_fan_speed)
return *this;
if (speed == 0)
m_gcode += "M107\n";
else
{
m_gcode += "M106 S";
char buf[128];
sprintf(buf,"%u\n",(unsigned int)(255.0 * speed / 100.0));
m_gcode += buf;
}
m_last_fan_speed = speed;
return *this;
}
Writer& comment_material(WipeTowerPrusaMM::material_type material) Writer& comment_material(WipeTowerPrusaMM::material_type material)
{ {
m_gcode += "; material : "; m_gcode += "; material : ";
@ -294,13 +313,15 @@ private:
std::string m_gcode; std::string m_gcode;
std::vector<WipeTower::Extrusion> m_extrusions; std::vector<WipeTower::Extrusion> m_extrusions;
float m_elapsed_time; float m_elapsed_time;
const double m_filament_area = 0.25*M_PI*1.75*1.75;
float m_angle_deg = 0; float m_angle_deg = 0;
WipeTower::xy m_wipe_tower_pos; WipeTower::xy m_wipe_tower_pos;
float m_wipe_tower_width; float m_wipe_tower_width;
float m_wipe_tower_depth; float m_wipe_tower_depth;
float m_last_fan_speed = 0.f;
std::string set_format_X(float x) { std::string
set_format_X(float x)
{
char buf[64]; char buf[64];
sprintf(buf, " X%.3f", x); sprintf(buf, " X%.3f", x);
m_current_pos.x = x; m_current_pos.x = x;
@ -1116,7 +1137,7 @@ WipeTower::ToolChangeResult WipeTowerPrusaMM::finish_layer(Purpose purpose)
// Appends a toolchange into m_plan and calculates neccessary depth of the corresponding box // Appends a toolchange into m_plan and calculates neccessary depth of the corresponding box
void WipeTowerPrusaMM::plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool, unsigned int new_tool) void WipeTowerPrusaMM::plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool, unsigned int new_tool,bool brim)
{ {
assert(m_plan.back().z <= z_par); // refuse to add a layer below the last one assert(m_plan.back().z <= z_par); // refuse to add a layer below the last one
@ -1131,20 +1152,18 @@ void WipeTowerPrusaMM::plan_toolchange(float z_par, float layer_height_par, unsi
{ 60, 40, 60, 0}}; { 60, 40, 60, 0}};
float depth = (wipe_volumes[old_tool][new_tool]) / (m_extrusion_flow * Filament_Area); // length of extrusion float depth = (wipe_volumes[old_tool][new_tool]) / (m_extrusion_flow * Filament_Area); // length of extrusion
depth += 6 * 59; // reserved for ramming
depth += 2 * 59; // reserved for loading
depth -= 2 * 59; // we will also print borders
depth = floor(depth / m_wipe_tower_width + 1); // number of lines to extrude depth = floor(depth / m_wipe_tower_width + 1); // number of lines to extrude
depth += 6; // reserved for ramming
depth += 2; // reserved for loading
depth -= 2; // we will also print borders
depth *= m_perimeter_width; // conversion to distance depth *= m_perimeter_width; // conversion to distance
if (m_plan.empty() || m_plan.back().z + WT_EPSILON < z_par) // if we moved to a new layer, we'll add it to m_plan along with the first toolchange if (m_plan.empty() || m_plan.back().z + WT_EPSILON < z_par) // if we moved to a new layer, we'll add it to m_plan along with the first toolchange
m_plan.push_back(WipeTowerInfo(z_par, layer_height_par)); m_plan.push_back(WipeTowerInfo(z_par, layer_height_par));
if ( old_tool != new_tool ) { if ( brim || old_tool != new_tool ) {
if (!m_plan_brim_finished) { // this toolchange prints brim, we need it in m_plan, but not to count its depth if (brim) // this toolchange prints brim, we need it in m_plan, but not to count its depth
m_plan_brim_finished = true;
depth = 0.f; depth = 0.f;
}
m_plan.back().tool_changes.push_back(WipeTowerInfo::ToolChange(old_tool, new_tool, depth)); m_plan.back().tool_changes.push_back(WipeTowerInfo::ToolChange(old_tool, new_tool, depth));
} }
@ -1173,7 +1192,6 @@ void WipeTowerPrusaMM::generate(std::vector<std::vector<WipeTower::ToolChangeRes
for (auto layer : m_plan) for (auto layer : m_plan)
{ {
set_layer(layer.z,layer.height,0,layer.z == m_plan.front().z,layer.z == m_plan.back().z); set_layer(layer.z,layer.height,0,layer.z == m_plan.front().z,layer.z == m_plan.back().z);
for (const auto &toolchange : layer.tool_changes) for (const auto &toolchange : layer.tool_changes)

View File

@ -92,7 +92,7 @@ public:
// Setter for internal structure m_plan containing info about the future wipe tower // Setter for internal structure m_plan containing info about the future wipe tower
// to be used before building begins. The entries must be added ordered in z. // to be used before building begins. The entries must be added ordered in z.
void plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool, unsigned int new_tool); void plan_toolchange(float z_par, float layer_height_par, unsigned int old_tool, unsigned int new_tool, bool brim);
void generate(std::vector<std::vector<WipeTower::ToolChangeResult>> &result); void generate(std::vector<std::vector<WipeTower::ToolChangeResult>> &result);
@ -131,6 +131,7 @@ public:
// Calculates extrusion flow from desired line width, nozzle diameter, filament diameter and layer_height // Calculates extrusion flow from desired line width, nozzle diameter, filament diameter and layer_height
m_extrusion_flow = extrusion_flow(layer_height); m_extrusion_flow = extrusion_flow(layer_height);
// FIXME - ideally get rid of set_layer altogether and iterate through m_plan in generate(...)
m_layer_info = nullptr; m_layer_info = nullptr;
for (auto &a : m_plan) for (auto &a : m_plan)
if ( a.z > print_z - WT_EPSILON && a.z < print_z + WT_EPSILON ) { if ( a.z > print_z - WT_EPSILON && a.z < print_z + WT_EPSILON ) {
@ -170,12 +171,7 @@ public:
// the wipe tower has been completely covered by the tool change extrusions, // the wipe tower has been completely covered by the tool change extrusions,
// or the rest of the tower has been filled by a sparse infill with the finish_layer() method. // or the rest of the tower has been filled by a sparse infill with the finish_layer() method.
virtual bool layer_finished() const { virtual bool layer_finished() const {
return ( (m_is_first_layer ? m_wipe_tower_depth : m_layer_info->depth) - WT_EPSILON < m_current_wipe_start_y);
if (m_is_first_layer) {
return (m_wipe_tower_depth - WT_EPSILON < m_current_wipe_start_y);
}
else
return (m_layer_info->depth - WT_EPSILON < m_current_wipe_start_y);
} }
@ -241,10 +237,8 @@ private:
// after the wipe tower brim has been extruded? // after the wipe tower brim has been extruded?
float m_initial_extra_wipe = 0.f; float m_initial_extra_wipe = 0.f;
float m_last_infill_tan = 1000.f; // impossibly high value float m_last_infill_tan = 1000.f; // impossibly high value
bool m_plan_brim_finished = false;
float float extrusion_flow(float layer_height = -1.f) const
extrusion_flow(float layer_height = -1.f)
{ {
if ( layer_height < 0 ) if ( layer_height < 0 )
return m_extrusion_flow; return m_extrusion_flow;

View File

@ -1050,10 +1050,10 @@ void Print::_make_wipe_tower()
for (const auto &layer_tools : m_tool_ordering.layer_tools()) { // for all layers for (const auto &layer_tools : m_tool_ordering.layer_tools()) { // for all layers
if (!layer_tools.has_wipe_tower) continue; if (!layer_tools.has_wipe_tower) continue;
bool first_layer = &layer_tools == &m_tool_ordering.front(); bool first_layer = &layer_tools == &m_tool_ordering.front();
wipe_tower.plan_toolchange(layer_tools.print_z, layer_tools.wipe_tower_layer_height, current_extruder_id, current_extruder_id); wipe_tower.plan_toolchange(layer_tools.print_z, layer_tools.wipe_tower_layer_height, current_extruder_id, current_extruder_id,false);
for (const auto extruder_id : layer_tools.extruders) { for (const auto extruder_id : layer_tools.extruders) {
if ((first_layer && extruder_id == m_tool_ordering.all_extruders().back()) || extruder_id != current_extruder_id) { if ((first_layer && extruder_id == m_tool_ordering.all_extruders().back()) || extruder_id != current_extruder_id) {
wipe_tower.plan_toolchange(layer_tools.print_z, layer_tools.wipe_tower_layer_height, current_extruder_id, extruder_id); wipe_tower.plan_toolchange(layer_tools.print_z, layer_tools.wipe_tower_layer_height, current_extruder_id, extruder_id, first_layer && extruder_id == m_tool_ordering.all_extruders().back());
current_extruder_id = extruder_id; current_extruder_id = extruder_id;
} }
} }
@ -1066,7 +1066,6 @@ void Print::_make_wipe_tower()
// Generate the wipe tower layers. // Generate the wipe tower layers.
m_wipe_tower_tool_changes.reserve(m_tool_ordering.layer_tools().size()); m_wipe_tower_tool_changes.reserve(m_tool_ordering.layer_tools().size());
wipe_tower.generate(m_wipe_tower_tool_changes); wipe_tower.generate(m_wipe_tower_tool_changes);
// Set current_extruder_id to the last extruder primed. // Set current_extruder_id to the last extruder primed.