diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index 44b44160ed..39a36990ec 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -46,13 +46,20 @@ double CalibPressureAdvance::e_per_mm( return line_flow.mm3_per_mm() * print_flow_ratio / filament_area ; } -std::string CalibPressureAdvance::convert_number_to_string(double num) const +std::string CalibPressureAdvance::convert_number_to_string(double num, unsigned int precision) const { - auto sNumber = std::to_string(num); - sNumber.erase(sNumber.find_last_not_of('0') + 1, std::string::npos); - sNumber.erase(sNumber.find_last_not_of('.') + 1, std::string::npos); + std::ostringstream stream; - return sNumber; + if (precision) { + /* if number is > 1000 then there are no way we'll fit fractional part into 5 glyphs, so + * in this case we keep full precision. + * Otherwise we reduce precision by 1 to accomodate decimal separator */ + stream << std::setprecision(num >= 1000 ? precision : precision - 1); + } + + stream << num; + + return stream.str(); } std::string CalibPressureAdvance::draw_digit( @@ -201,12 +208,12 @@ std::string CalibPressureAdvance::draw_number(double double speed, GCodeWriter &writer) { - auto sNumber = convert_number_to_string(value); + auto sNumber = convert_number_to_string(value, m_number_len); std::stringstream gcode; gcode << writer.set_speed(speed); for (std::string::size_type i = 0; i < sNumber.length(); ++i) { - if (i > m_max_number_len) { + if (i >= m_number_len) { break; } switch (mode) { @@ -537,6 +544,18 @@ CalibPressureAdvancePattern::CalibPressureAdvancePattern( this->m_draw_digit_mode = DrawDigitMode::Bottom_To_Top; refresh_setup(config, is_bbl_machine, model, origin); +} + +double CalibPressureAdvancePattern::flow_val() const +{ + double flow_mult = m_config.option("filament_flow_ratio")->get_at(0); + double nozzle_diameter = m_config.option("nozzle_diameter")->get_at(0); + double line_width = m_config.get_abs_value("line_width", nozzle_diameter); + double layer_height = m_config.get_abs_value("layer_height"); + double speed = m_config.opt_float("outer_wall_speed"); + Flow pattern_line = Flow(line_width, layer_height, m_config.option("nozzle_diameter")->get_at(0)); + + return speed * pattern_line.mm3_per_mm() * flow_mult; }; void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfig &config, @@ -564,7 +583,7 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi draw_box_opt_args.is_filled = true; draw_box_opt_args.num_perimeters = wall_count(); gcode << draw_box(m_writer, m_starting_point.x(), m_starting_point.y() + frame_size_y() + line_spacing_first_layer(), - glyph_tab_max_x() - m_starting_point.x(), + print_size_x(), max_numbering_height() + line_spacing_first_layer() + m_glyph_padding_vertical * 2, draw_box_opt_args); std::vector gcode_items; @@ -593,6 +612,8 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi // line numbering if (i == 1) { + m_number_len = max_numbering_length(); + gcode << m_writer.set_pressure_advance(m_params.start); double number_e_per_mm = e_per_mm(line_width(), height_layer(), @@ -606,6 +627,18 @@ void CalibPressureAdvancePattern::generate_custom_gcodes(const DynamicPrintConfi m_params.start + (j * m_params.step), m_draw_digit_mode, line_width(), number_e_per_mm, speed_first_layer(), m_writer); } + + // flow value + int line_num = num_patterns + 2; + gcode << draw_number(glyph_start_x(line_num), m_starting_point.y() + frame_size_y() + m_glyph_padding_vertical + line_width(), + flow_val(), m_draw_digit_mode, line_width(), number_e_per_mm, + speed_first_layer(), m_writer); + + // acceleration + line_num = num_patterns + 4; + gcode << draw_number(glyph_start_x(line_num), m_starting_point.y() + frame_size_y() + m_glyph_padding_vertical + line_width(), + m_config.opt_float("default_acceleration"), m_draw_digit_mode, line_width(), number_e_per_mm, + speed_first_layer(), m_writer); } @@ -790,7 +823,7 @@ double CalibPressureAdvancePattern::glyph_tab_max_x() const (glyph_length_x() - line_width() / 2) + padding; } -double CalibPressureAdvancePattern::max_numbering_height() const +size_t CalibPressureAdvancePattern::max_numbering_length() const { std::string::size_type most_characters = 0; const int num_patterns = get_num_patterns(); @@ -804,9 +837,18 @@ double CalibPressureAdvancePattern::max_numbering_height() const } } - most_characters = std::min(most_characters, m_max_number_len); + std::string sAccel = convert_number_to_string(m_config.opt_float("default_acceleration")); + most_characters = std::max(most_characters, sAccel.length()); - return (most_characters * m_digit_segment_len) + ((most_characters - 1) * m_digit_gap_len); + /* don't actually check flow value: we'll print as many fractional digits as fits */ + + return std::min(most_characters, m_max_number_len); +} + +double CalibPressureAdvancePattern::max_numbering_height() const +{ + std::string::size_type num_characters = max_numbering_length(); + return (num_characters * m_digit_segment_len) + ((num_characters - 1) * m_digit_gap_len); } double CalibPressureAdvancePattern::pattern_shift() const diff --git a/src/libslic3r/calib.hpp b/src/libslic3r/calib.hpp index e612c58026..b26a000790 100644 --- a/src/libslic3r/calib.hpp +++ b/src/libslic3r/calib.hpp @@ -155,7 +155,7 @@ protected: double e_per_mm(double line_width, double layer_height, float nozzle_diameter, float filament_diameter, float print_flow_ratio) const; double speed_adjust(int speed) const { return speed * 60; }; - std::string convert_number_to_string(double num) const; + std::string convert_number_to_string(double num, unsigned precision = 0) const; double number_spacing() const { return m_digit_segment_len + m_digit_gap_len; }; std::string draw_digit(double startx, double starty, @@ -188,6 +188,7 @@ protected: const double m_digit_segment_len{2}; const double m_digit_gap_len{1}; const std::string::size_type m_max_number_len{5}; + std::string::size_type m_number_len{m_max_number_len}; /* Current length of number labels */ }; class CalibPressureAdvanceLine : public CalibPressureAdvance @@ -255,6 +256,7 @@ public: double print_size_x() const { return object_size_x() + pattern_shift(); }; double print_size_y() const { return object_size_y(); }; double max_layer_z() const { return height_first_layer() + ((m_num_layers - 1) * height_layer()); }; + double flow_val() const; void generate_custom_gcodes(const DynamicPrintConfig &config, bool is_bbl_machine, Model &model, const Vec3d &origin); @@ -296,6 +298,7 @@ private: double glyph_length_x() const; double glyph_tab_max_x() const; double max_numbering_height() const; + size_t max_numbering_length() const; double pattern_shift() const;