QoL: improve PA Line method

Signed-off-by: SoftFever <softfeverever@gmail.com>
This commit is contained in:
SoftFever 2023-09-25 20:39:02 +08:00
parent 7ef43f6849
commit f06b7cb526
2 changed files with 471 additions and 671 deletions

File diff suppressed because it is too large Load diff

View file

@ -1,4 +1,5 @@
#pragma once #pragma once
#include <string>
#define calib_pressure_advance_dd #define calib_pressure_advance_dd
#include "GCode.hpp" #include "GCode.hpp"
@ -23,24 +24,16 @@ enum class CalibMode : int {
Calib_Retraction_tower Calib_Retraction_tower
}; };
enum class CalibState { enum class CalibState { Start = 0, Preset, Calibration, CoarseSave, FineCalibration, Save, Finish };
Start = 0,
Preset,
Calibration,
CoarseSave,
FineCalibration,
Save,
Finish
};
struct Calib_Params { struct Calib_Params
Calib_Params() : mode(CalibMode::Calib_None) { }; {
double start, end, step; Calib_Params() : mode(CalibMode::Calib_None){};
bool print_numbers; double start, end, step;
bool print_numbers;
CalibMode mode; CalibMode mode;
}; };
class X1CCalibInfos class X1CCalibInfos
{ {
public: public:
@ -101,8 +94,8 @@ public:
std::string filament_id; std::string filament_id;
std::string setting_id; std::string setting_id;
std::string name; std::string name;
float k_value = 0.0; float k_value = 0.0;
float n_coef = 0.0; float n_coef = 0.0;
int confidence = -1; // 0: success 1: uncertain 2: failed int confidence = -1; // 0: success 1: uncertain 2: failed
}; };
@ -125,133 +118,130 @@ public:
int confidence; // 0: success 1: uncertain 2: failed int confidence; // 0: success 1: uncertain 2: failed
}; };
class CalibPressureAdvance { struct DrawBoxOptArgs
public: {
static float find_optimal_PA_speed(const DynamicPrintConfig &config, double line_width, double layer_height, DrawBoxOptArgs(int num_perimeters, double height, double line_width, double speed)
int filament_idx = 0); : num_perimeters{num_perimeters}, height{height}, line_width{line_width}, speed{speed} {};
DrawBoxOptArgs() = default;
protected: bool is_filled{false};
CalibPressureAdvance() =default; int num_perimeters;
~CalibPressureAdvance() =default; double height;
double line_width;
double speed;
};
class CalibPressureAdvance
{
public:
static float find_optimal_PA_speed(const DynamicPrintConfig &config, double line_width, double layer_height, int filament_idx = 0);
enum class DrawDigitMode { protected:
Left_To_Right, CalibPressureAdvance() = default;
Bottom_To_Top CalibPressureAdvance(const DynamicPrintConfig& config) : m_config(config){};
}; CalibPressureAdvance(const FullPrintConfig &config) { m_config.apply(config); };
~CalibPressureAdvance() = default;
void delta_scale_bed_ext(BoundingBoxf& bed_ext) const { bed_ext.scale(1.0f / 1.41421f); } enum class DrawDigitMode { Left_To_Right, Bottom_To_Top };
void delta_scale_bed_ext(BoundingBoxf &bed_ext) const { bed_ext.scale(1.0f / 1.41421f); }
std::string move_to(Vec2d pt, GCodeWriter &writer, std::string comment = std::string());
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 move_to(Vec2d pt, GCodeWriter& writer, std::string comment = std::string());
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) const;
double number_spacing() const { return m_digit_segment_len + m_digit_gap_len; }; double number_spacing() const { return m_digit_segment_len + m_digit_gap_len; };
std::string draw_digit( std::string draw_digit(double startx,
double startx, double starty,
double starty, char c,
char c, CalibPressureAdvance::DrawDigitMode mode,
CalibPressureAdvance::DrawDigitMode mode, double line_width,
double line_width, double e_per_mm,
double e_per_mm, GCodeWriter &writer);
GCodeWriter& writer std::string draw_number(double startx,
); double starty,
std::string draw_number( double value,
double startx, CalibPressureAdvance::DrawDigitMode mode,
double starty, double line_width,
double value, double e_per_mm,
CalibPressureAdvance::DrawDigitMode mode, double speed,
double line_width, GCodeWriter &writer);
double e_per_mm,
double speed,
GCodeWriter& writer
);
Vec3d m_last_pos;
DrawDigitMode m_draw_digit_mode {DrawDigitMode::Left_To_Right}; std::string draw_line(
const double m_digit_segment_len {2}; GCodeWriter &writer, Vec2d to_pt, double line_width, double layer_height, double speed, const std::string &comment = std::string());
const double m_digit_gap_len {1}; std::string draw_box(GCodeWriter &writer, double min_x, double min_y, double size_x, double size_y, DrawBoxOptArgs opt_args);
const std::string::size_type m_max_number_len {5};
double to_radians(double degrees) const { return degrees * M_PI / 180; };
double get_distance(Vec2d from, Vec2d to) const;
Vec3d m_last_pos;
DynamicPrintConfig m_config;
const double m_encroachment{1. / 3.};
DrawDigitMode m_draw_digit_mode{DrawDigitMode::Left_To_Right};
const double m_digit_segment_len{2};
const double m_digit_gap_len{1};
const std::string::size_type m_max_number_len{5};
}; };
class CalibPressureAdvanceLine : public CalibPressureAdvance { class CalibPressureAdvanceLine : public CalibPressureAdvance
{
public: public:
CalibPressureAdvanceLine(GCode* gcodegen) : CalibPressureAdvanceLine(GCode *gcodegen) : CalibPressureAdvance(gcodegen->config()), mp_gcodegen(gcodegen),m_nozzle_diameter(gcodegen->config().nozzle_diameter.get_at(0)){};
mp_gcodegen(gcodegen), ~CalibPressureAdvanceLine(){};
m_nozzle_diameter(gcodegen->config().nozzle_diameter.get_at(0))
{ };
~CalibPressureAdvanceLine() { };
std::string generate_test(double start_pa = 0, double step_pa = 0.002, int count = 50); std::string generate_test(double start_pa = 0, double step_pa = 0.002, int count = 50);
void set_speed(double fast = 100.0, double slow = 20.0) { void set_speed(double fast = 100.0, double slow = 20.0)
{
m_slow_speed = slow; m_slow_speed = slow;
m_fast_speed = fast; m_fast_speed = fast;
} }
const double& line_width() { return m_line_width; }; const double &line_width() { return m_line_width; };
bool is_delta() const; bool is_delta() const;
bool& draw_numbers() { return m_draw_numbers; } bool &draw_numbers() { return m_draw_numbers; }
private: private:
std::string print_pa_lines(double start_x, double start_y, double start_pa, double step_pa, int num); std::string print_pa_lines(double start_x, double start_y, double start_pa, double step_pa, int num);
void delta_modify_start(double& startx, double& starty, int count);
GCode* mp_gcodegen; void delta_modify_start(double &startx, double &starty, int count);
GCode *mp_gcodegen;
double m_nozzle_diameter; double m_nozzle_diameter;
double m_slow_speed, m_fast_speed; double m_slow_speed, m_fast_speed;
const double m_height_layer {0.2};
const double m_line_width {0.6};
const double m_thin_line_width {0.44};
const double m_number_line_width {0.48};
const double m_space_y {3.5};
double m_length_short {20.0}, m_length_long {40.0}; const double m_height_layer{0.2};
bool m_draw_numbers {true}; const double m_line_width{0.6};
const double m_thin_line_width{0.44};
const double m_number_line_width{0.48};
const double m_space_y{3.5};
double m_length_short{20.0}, m_length_long{40.0};
bool m_draw_numbers{true};
}; };
struct SuggestedConfigCalibPAPattern { struct SuggestedConfigCalibPAPattern
const std::vector<std::pair<std::string, double>> float_pairs { {
{"initial_layer_print_height", 0.25}, const std::vector<std::pair<std::string, double>> float_pairs{{"initial_layer_print_height", 0.25},
{"layer_height", 0.2}, {"layer_height", 0.2},
{"initial_layer_speed", 30} {"initial_layer_speed", 30}};
};
const std::vector<std::pair<std::string, double>> nozzle_ratio_pairs { const std::vector<std::pair<std::string, double>> nozzle_ratio_pairs{{"line_width", 112.5}, {"initial_layer_line_width", 140}};
{"line_width", 112.5},
{"initial_layer_line_width", 140}
};
const std::vector<std::pair<std::string, int>> int_pairs { const std::vector<std::pair<std::string, int>> int_pairs{{"skirt_loops", 0}, {"wall_loops", 3}};
{"skirt_loops", 0},
{"wall_loops", 3}
};
const std::pair<std::string, BrimType> brim_pair {"brim_type", BrimType::btNoBrim}; const std::pair<std::string, BrimType> brim_pair{"brim_type", BrimType::btNoBrim};
}; };
class CalibPressureAdvancePattern : public CalibPressureAdvance { class CalibPressureAdvancePattern : public CalibPressureAdvance
friend struct DrawLineOptArgs; {
friend struct DrawBoxOptArgs; friend struct DrawBoxOptArgs;
public: public:
CalibPressureAdvancePattern( CalibPressureAdvancePattern(
const Calib_Params& params, const Calib_Params &params, const DynamicPrintConfig &config, bool is_bbl_machine, Model &model, const Vec3d &origin);
const DynamicPrintConfig& config,
bool is_bbl_machine,
Model& model,
const Vec3d& origin
);
double handle_xy_size() const { return m_handle_xy_size; }; double handle_xy_size() const { return m_handle_xy_size; };
double handle_spacing() const { return m_handle_spacing; }; double handle_spacing() const { return m_handle_spacing; };
@ -259,85 +249,25 @@ public:
double print_size_y() const { return object_size_y(); }; 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 max_layer_z() const { return height_first_layer() + ((m_num_layers - 1) * height_layer()); };
void generate_custom_gcodes( void generate_custom_gcodes(const DynamicPrintConfig &config, bool is_bbl_machine, Model &model, const Vec3d &origin);
const DynamicPrintConfig& config,
bool is_bbl_machine,
Model& model,
const Vec3d& origin
);
protected: protected:
double speed_first_layer() const { return m_config.option<ConfigOptionFloat>("initial_layer_speed")->value; }; double speed_first_layer() const { return m_config.option<ConfigOptionFloat>("initial_layer_speed")->value; };
double speed_perimeter() const { return m_config.option<ConfigOptionFloat>("outer_wall_speed")->value; }; double speed_perimeter() const { return m_config.option<ConfigOptionFloat>("outer_wall_speed")->value; };
double line_width_first_layer() const { return m_config.get_abs_value("initial_layer_line_width"); }; double line_width_first_layer() const { return m_config.get_abs_value("initial_layer_line_width"); };
double line_width() const { return m_config.get_abs_value("line_width"); }; double line_width() const { return m_config.get_abs_value("line_width"); };
int wall_count() const { return m_config.option<ConfigOptionInt>("wall_loops")->value; }; int wall_count() const { return m_config.option<ConfigOptionInt>("wall_loops")->value; };
private: private:
struct DrawLineOptArgs { void refresh_setup(const DynamicPrintConfig &config, bool is_bbl_machine, const Model &model, const Vec3d &origin);
DrawLineOptArgs(const CalibPressureAdvancePattern& p) : void _refresh_starting_point(const Model &model);
height {p.height_layer()}, void _refresh_writer(bool is_bbl_machine, const Model &model, const Vec3d &origin);
line_width {p.line_width()},
speed {p.speed_adjust(p.speed_perimeter())}
{ };
double height; double height_first_layer() const { return m_config.option<ConfigOptionFloat>("initial_layer_print_height")->value; };
double line_width; double height_layer() const { return m_config.option<ConfigOptionFloat>("layer_height")->value; };
double speed; const int get_num_patterns() const { return std::ceil((m_params.end - m_params.start) / m_params.step + 1); }
std::string comment {"Print line"};
};
struct DrawBoxOptArgs { /*
DrawBoxOptArgs(const CalibPressureAdvancePattern& p) :
num_perimeters {p.wall_count()},
height {p.height_first_layer()},
line_width {p.line_width_first_layer()},
speed {p.speed_adjust(p.speed_first_layer())}
{ };
bool is_filled {false};
int num_perimeters;
double height;
double line_width;
double speed;
};
void refresh_setup(
const DynamicPrintConfig& config,
bool is_bbl_machine,
const Model& model,
const Vec3d& origin
);
void _refresh_starting_point(const Model& model);
void _refresh_writer(
bool is_bbl_machine,
const Model& model,
const Vec3d& origin
);
double height_first_layer() const { return m_config.option<ConfigOptionFloat>("initial_layer_print_height")->value; };
double height_layer() const { return m_config.option<ConfigOptionFloat>("layer_height")->value; };
const int get_num_patterns() const
{
return std::ceil((m_params.end - m_params.start) / m_params.step + 1);
}
std::string draw_line(
Vec2d to_pt,
DrawLineOptArgs opt_args
);
std::string draw_box(
double min_x,
double min_y,
double size_x,
double size_y,
DrawBoxOptArgs opt_args
);
double to_radians(double degrees) const { return degrees * M_PI / 180; };
double get_distance(Vec2d from, Vec2d to) const;
/*
from slic3r documentation: spacing = extrusion_width - layer_height * (1 - PI/4) from slic3r documentation: spacing = extrusion_width - layer_height * (1 - PI/4)
"spacing" = center-to-center distance of adjacent extrusions, which partially overlap "spacing" = center-to-center distance of adjacent extrusions, which partially overlap
https://manual.slic3r.org/advanced/flow-math https://manual.slic3r.org/advanced/flow-math
@ -358,23 +288,21 @@ private:
double pattern_shift() const; double pattern_shift() const;
const Calib_Params& m_params; const Calib_Params &m_params;
DynamicPrintConfig m_config; GCodeWriter m_writer;
GCodeWriter m_writer; bool m_is_delta;
bool m_is_delta; Vec3d m_starting_point;
Vec3d m_starting_point;
const double m_handle_xy_size {5}; const double m_handle_xy_size{5};
const double m_handle_spacing {2}; const double m_handle_spacing{2};
const int m_num_layers {4}; const int m_num_layers{4};
const double m_wall_side_length {30.0};
const int m_corner_angle {90};
const int m_pattern_spacing {2};
const double m_encroachment {1. / 3.};
const double m_glyph_padding_horizontal {1}; const double m_wall_side_length{30.0};
const double m_glyph_padding_vertical {1}; const int m_corner_angle{90};
const int m_pattern_spacing{2};
const double m_glyph_padding_horizontal{1};
const double m_glyph_padding_vertical{1};
}; };
} // namespace Slic3r } // namespace Slic3r