From 94ef3986f2a89f7323d970d81b79deb03f0c19bf Mon Sep 17 00:00:00 2001 From: thewildmage Date: Sat, 27 May 2023 17:25:48 -0600 Subject: [PATCH] Add directionality to draw_digit --- src/libslic3r/calib.cpp | 272 +++++++++++++++++++++++----------------- src/libslic3r/calib.hpp | 14 ++- 2 files changed, 166 insertions(+), 120 deletions(-) diff --git a/src/libslic3r/calib.cpp b/src/libslic3r/calib.cpp index 4a77f986af..f97db88211 100644 --- a/src/libslic3r/calib.cpp +++ b/src/libslic3r/calib.cpp @@ -20,6 +20,162 @@ namespace Slic3r { return calib_pressure_advance::move_to(Vec3d(pt.x(), pt.y(), 0.2)); } + std::string calib_pressure_advance::draw_digit(double startx, double starty, char c, calib_pressure_advance::DrawDigitMode mode) { + auto& writer = mp_gcodegen->writer(); + std::stringstream gcode; + const double lw = 0.48; + Flow line_flow = Flow(lw, 0.2, mp_gcodegen->config().nozzle_diameter.get_at(0)); + const double len = 2; + const double gap = lw / 2.0; + 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; + + Vec2d p0, p1, p2, p3, p4, p5; + Vec2d p0_5, p4_5; + Vec2d gap_p0_toward_p3, gap_p2_toward_p3; + Vec2d dot_direction; + + if (mode == calib_pressure_advance::DrawDigitMode::Vertical) { + // 1-------2-------5 + // | | | + // | | | + // 0-------3-------4 + p0 = Vec2d(startx, starty); + p0_5 = Vec2d(startx, starty - len / 2); + p1 = Vec2d(startx, starty - len); + p2 = Vec2d(startx + len, starty - len); + p3 = Vec2d(startx + len, starty); + p4 = Vec2d(startx + len * 2, starty); + p4_5 = Vec2d(startx + len * 2, starty - len / 2); + p5 = Vec2d(startx + len * 2, starty - len); + + gap_p0_toward_p3 = p0 + Vec2d(gap, 0); + gap_p2_toward_p3 = p2 + Vec2d(0, gap); + + dot_direction = Vec2d(-len / 2, 0); + } else { + // 0-------1 + // | | + // 3-------2 + // | | + // 4-------5 + p0 = Vec2d(startx, starty); + p0_5 = Vec2d(startx + len / 2, starty); + p1 = Vec2d(startx + len, starty); + p2 = Vec2d(startx + len, starty - len); + p3 = Vec2d(startx, starty - len); + p4 = Vec2d(startx, starty - len * 2); + p4_5 = Vec2d(startx + len / 2, starty - len * 2); + p5 = Vec2d(startx + len, starty - len * 2); + + gap_p0_toward_p3 = p0 - Vec2d(0, gap); + gap_p2_toward_p3 = p2 - Vec2d(gap, 0); + + dot_direction = Vec2d(0, -len / 2); + } + + switch (c) { + case '0': + gcode << move_to(p0); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p5, two_dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << writer.extrude_to_xy(gap_p0_toward_p3, two_dE); + break; + case '1': + gcode << move_to(p0_5); + gcode << writer.extrude_to_xy(p4_5, two_dE); + break; + case '2': + gcode << move_to(p0); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << writer.extrude_to_xy(p5, dE); + break; + case '3': + gcode << move_to(p0); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p5, two_dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << move_to(gap_p2_toward_p3); + gcode << writer.extrude_to_xy(p3, dE); + break; + case '4': + gcode << move_to(p0); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << move_to(p1); + gcode << writer.extrude_to_xy(p5, two_dE); + break; + case '5': + gcode << move_to(p1); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << writer.extrude_to_xy(p5, dE); + gcode << writer.extrude_to_xy(p4, dE); + break; + case '6': + gcode << move_to(p1); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p4, two_dE); + gcode << writer.extrude_to_xy(p5, dE); + gcode << writer.extrude_to_xy(p2, dE); + gcode << writer.extrude_to_xy(p3, dE); + break; + case '7': + gcode << move_to(p0); + gcode << writer.extrude_to_xy(p1, dE); + gcode << writer.extrude_to_xy(p5, two_dE); + break; + case '8': + gcode << move_to(p2); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p4, dE); + gcode << writer.extrude_to_xy(p5, dE); + gcode << writer.extrude_to_xy(p1, two_dE); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p3, dE); + break; + case '9': + gcode << move_to(p5); + gcode << writer.extrude_to_xy(p1, two_dE); + gcode << writer.extrude_to_xy(p0, dE); + gcode << writer.extrude_to_xy(p3, dE); + gcode << writer.extrude_to_xy(p2, dE); + break; + case '.': + gcode << move_to(p4_5); + gcode << writer.extrude_to_xy(p4_5 + dot_direction, dE); + break; + default: + break; + } + + return gcode.str(); + } + + std::string calib_pressure_advance::draw_number(double startx, double starty, double value, calib_pressure_advance::DrawDigitMode mode) { + double spacing = 3.0; + auto sNumber = std::to_string(value); + sNumber.erase(sNumber.find_last_not_of('0') + 1, std::string::npos); + sNumber.erase(sNumber.find_last_not_of('.') + 1, std::string::npos); + std::stringstream gcode; + gcode << mp_gcodegen->writer().set_speed(3600); + + for (int i = 0; i < sNumber.length(); ++i) { + if (i > 5) + break; + gcode << draw_digit(startx + i * spacing, starty, sNumber[i], mode); + + } + + return gcode.str(); + } + calib_pressure_advance_line::calib_pressure_advance_line(GCode* gcodegen) :mp_gcodegen(gcodegen), m_length_short(20.0), m_length_long(40.0), m_space_y(3.5), m_line_width(0.6), m_draw_numbers(true) {} std::string calib_pressure_advance_line::generate_test(double start_pa /*= 0*/, double step_pa /*= 0.002*/, @@ -99,128 +255,12 @@ namespace Slic3r { } - std::string calib_pressure_advance_line::draw_digit(double startx, double starty, char c) { - auto& writer = mp_gcodegen->writer(); - std::stringstream gcode; - const double lw = 0.48; - Flow line_flow = Flow(lw, 0.2, mp_gcodegen->config().nozzle_diameter.get_at(0)); - const double len = 2; - const double gap = lw / 2.0; - const double e = line_flow.mm3_per_mm() / 2.40528; // filament_mm/extrusion_mm - - // 0-------1 - // | | - // 3-------2 - // | | - // 4-------5 - const Vec2d p0(startx, starty); - const Vec2d p1(startx + len, starty); - const Vec2d p2(startx + len, starty - len); - const Vec2d p3(startx, starty - len); - const Vec2d p4(startx, starty - len * 2); - const Vec2d p5(startx + len, starty - len * 2); - - switch (c) - { - case '0': - gcode << move_to(p0); - gcode << writer.extrude_to_xy(p1, e * len); - gcode << writer.extrude_to_xy(p5, e * len * 2); - gcode << writer.extrude_to_xy(p4, e * len); - gcode << writer.extrude_to_xy(p0 - Vec2d(0, gap), e * len * 2); - break; - case '1': - gcode << move_to(p0 + Vec2d(len / 2, 0)); - gcode << writer.extrude_to_xy(p4 + Vec2d(len / 2, 0), e * len * 2); - break; - case '2': - gcode << move_to(p0); - gcode << writer.extrude_to_xy(p1, e * len); - gcode << writer.extrude_to_xy(p2, e * len); - gcode << writer.extrude_to_xy(p3, e * len); - gcode << writer.extrude_to_xy(p4, e * len); - gcode << writer.extrude_to_xy(p5, e * len); - break; - case '3': - gcode << move_to(p0); - gcode << writer.extrude_to_xy(p1, e * len); - gcode << writer.extrude_to_xy(p5, e * len * 2); - gcode << writer.extrude_to_xy(p4, e * len); - gcode << move_to(p2 - Vec2d(gap, 0)); - gcode << writer.extrude_to_xy(p3, e * len); - break; - case '4': - gcode << move_to(p0); - gcode << writer.extrude_to_xy(p3, e * len); - gcode << writer.extrude_to_xy(p2, e * len); - gcode << move_to(p1); - gcode << writer.extrude_to_xy(p5, e * len * 2); - break; - case '5': - gcode << move_to(p1); - gcode << writer.extrude_to_xy(p0, e * len); - gcode << writer.extrude_to_xy(p3, e * len); - gcode << writer.extrude_to_xy(p2, e * len); - gcode << writer.extrude_to_xy(p5, e * len); - gcode << writer.extrude_to_xy(p4, e * len); - break; - case '6': - gcode << move_to(p1); - gcode << writer.extrude_to_xy(p0, e * len); - gcode << writer.extrude_to_xy(p4, e * len * 2); - gcode << writer.extrude_to_xy(p5, e * len); - gcode << writer.extrude_to_xy(p2, e * len); - gcode << writer.extrude_to_xy(p3, e * len); - break; - case '7': - gcode << move_to(p0); - gcode << writer.extrude_to_xy(p1, e * len); - gcode << writer.extrude_to_xy(p5, e * len * 2); - break; - case '8': - gcode << move_to(p2); - gcode << writer.extrude_to_xy(p3, e * len); - gcode << writer.extrude_to_xy(p4, e * len); - gcode << writer.extrude_to_xy(p5, e * len); - gcode << writer.extrude_to_xy(p1, e * len * 2); - gcode << writer.extrude_to_xy(p0, e * len); - gcode << writer.extrude_to_xy(p3, e * len); - break; - case '9': - gcode << move_to(p5); - gcode << writer.extrude_to_xy(p1, e * len * 2); - gcode << writer.extrude_to_xy(p0, e * len); - gcode << writer.extrude_to_xy(p3, e * len); - gcode << writer.extrude_to_xy(p2, e * len); - break; - case '.': - gcode << move_to(p4 + Vec2d(len / 2, 0)); - gcode << writer.extrude_to_xy(p4 + Vec2d(len / 2, len / 2), e * len); - break; - default: - break; } - return gcode.str(); - } - // draw number - std::string calib_pressure_advance_line::draw_number(double startx, double starty, double value) { - double spacing = 3.0; - auto sNumber = std::to_string(value); - sNumber.erase(sNumber.find_last_not_of('0') + 1, std::string::npos); - sNumber.erase(sNumber.find_last_not_of('.') + 1, std::string::npos); - std::stringstream gcode; - gcode << mp_gcodegen->writer().set_speed(3600); - for (int i = 0; i < sNumber.length(); ++i) { - if (i > 5) - break; - gcode << draw_digit(startx + i * spacing, starty, sNumber[i]); - } - 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 d79cc1bad5..b87c775129 100644 --- a/src/libslic3r/calib.hpp +++ b/src/libslic3r/calib.hpp @@ -17,8 +17,8 @@ enum class CalibMode : int { Calib_Vol_speed_Tower, Calib_VFA_Tower, Calib_Retraction_tower - }; + struct Calib_Params { Calib_Params(); @@ -27,10 +27,18 @@ struct Calib_Params CalibMode mode; }; -class calib_pressure_advance { +class calib_pressure_advance +{ +public: + enum class DrawDigitMode { + Horizontal = 0, + Vertical + }; private: std::string move_to(Ved3d pt); std::string move_to(Vec2d pt); + std::string draw_digit(double startx, double starty, char c, calib_pressure_advance::DrawDigitMode mode); + std::string draw_number(double startx, double starty, double value, calib_pressure_advance::DrawDigitMode mode); } class calib_pressure_advance_line: public calib_pressure_advance @@ -49,8 +57,6 @@ public: private: std::string print_pa_lines(double start_x, double start_y, double start_pa, double step_pa, int num); - std::string draw_digit(double startx, double starty, char c); - std::string draw_number(double startx, double starty, double value); private: GCode* mp_gcodegen; double m_length_short, m_length_long;