diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index 3e814e6526..d694c2e455 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -35,6 +35,13 @@ namespace Slic3r { Flow line_flow = Flow(lw, 0.2, mp_gcodegen->config().nozzle_diameter.get_at(0)); const double len = m_digit_len; const double gap = lw / 2.0; + + /* + filament diameter = 1.75 + area of a circle = PI * radius^2 + (1.75 / 2)^2 * PI = 2.40528 + */ + const double e = line_flow.mm3_per_mm() / 2.40528; // filament_mm/extrusion_mm const auto dE = e * len; const auto two_dE = dE * 2; @@ -355,5 +362,32 @@ namespace Slic3r { return (max_length * m_digit_len) + ((max_length - 1) * m_number_spacing); } + double get_distance(double cur_x, double cur_y, double to_x, double to_y) { + return std::hypot((to_x - cur_x), (to_y - cur_y)); + } + + std::string draw_line(double to_x, double to_y, double line_width, double layer_height, std::string comment = std::string()) { + std::stringstream gcode; + auto& config = mp_gcodegen.config(); + auto& writer = mp_gcodegen.writer(); + + Flow line_flow = Flow(line_width, layer_height, config.nozzle_diameter.get_at(0)); + const double filament_area = M_PI * std::pow(config.filament_diameter.value / 2, 2); + const double e_per_mm = line_flow.mm3_per_mm() / filament_area * config.print_flow_ratio; + + Point last_pos = mp_gcodegen.last_pos(); + const double length = get_distance(last_pos.x(), last_pos.y(), to_x, to_y); + + auto dE = e_per_mm * length; + + if (comment.empty()) { + gcode << writer.extrude_to_xy(Vec2d(to_x, to_y), dE); + } else { + gcode << writer.extrude_to_xy(Vec2d(to_x, to_y), dE, comment); + } + + return gcode.str(); + } + Calib_Params::Calib_Params() : mode(CalibMode::Calib_None) {} } // namespace Slic3r diff --git a/src/libslic3r/calib.hpp b/src/libslic3r/calib.hpp index c16d00c8d8..64edffbeae 100644 --- a/src/libslic3r/calib.hpp +++ b/src/libslic3r/calib.hpp @@ -94,7 +94,9 @@ class calib_pressure_advance_pattern: public calib_pressure_advance double object_size_y(double start_pa, double step_pa, int num_patterns); double max_numbering_height(); - double pattern_shift(); + + double get_distance(double cur_x, double cur_y, double to_x, double to_y); + std::string draw_line(double to_x, double to_y, double line_width, double layer_height, std::string comment = std::string()); private: int m_anchor_layer_line_ratio {140}; int m_anchor_perimeters {4};