mirror of
https://git.mirrors.martin98.com/https://github.com/prusa3d/PrusaSlicer.git
synced 2025-08-12 20:49:06 +08:00
SPE-1872: Corrections into GCodeProcessor::process_G2_G3() to match firmware code
This commit is contained in:
parent
07b653cb22
commit
ebc7444a20
@ -3268,7 +3268,11 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
|
|||||||
arc.end = Vec3d(end_position[X], end_position[Y], end_position[Z]);
|
arc.end = Vec3d(end_position[X], end_position[Y], end_position[Z]);
|
||||||
|
|
||||||
// radii
|
// radii
|
||||||
|
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
|
if (std::abs(arc.end_radius() - arc.start_radius()) > 0.001) {
|
||||||
|
#else
|
||||||
if (std::abs(arc.end_radius() - arc.start_radius()) > EPSILON) {
|
if (std::abs(arc.end_radius() - arc.start_radius()) > EPSILON) {
|
||||||
|
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
// what to do ???
|
// what to do ???
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3356,8 +3360,14 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
|
|||||||
const double z_per_segment = arc.delta_z() * inv_segment;
|
const double z_per_segment = arc.delta_z() * inv_segment;
|
||||||
const double extruder_per_segment = (extrusion.has_value()) ? *extrusion * inv_segment : 0.0;
|
const double extruder_per_segment = (extrusion.has_value()) ? *extrusion * inv_segment : 0.0;
|
||||||
|
|
||||||
|
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
|
const double sq_theta_per_segment = sqr(theta_per_segment);
|
||||||
|
const double cos_T = 1.0 - 0.5 * sq_theta_per_segment;
|
||||||
|
const double sin_T = theta_per_segment - sq_theta_per_segment * theta_per_segment / 6.0f;
|
||||||
|
#else
|
||||||
const double cos_T = 1.0 - 0.5 * sqr(theta_per_segment); // Small angle approximation
|
const double cos_T = 1.0 - 0.5 * sqr(theta_per_segment); // Small angle approximation
|
||||||
const double sin_T = theta_per_segment;
|
const double sin_T = theta_per_segment;
|
||||||
|
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
|
|
||||||
AxisCoords prev_target = m_start_position;
|
AxisCoords prev_target = m_start_position;
|
||||||
AxisCoords arc_target;
|
AxisCoords arc_target;
|
||||||
@ -3370,9 +3380,27 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
|
|||||||
|
|
||||||
static const size_t N_ARC_CORRECTION = 25;
|
static const size_t N_ARC_CORRECTION = 25;
|
||||||
Vec3d curr_rel_arc_start = arc.relative_start();
|
Vec3d curr_rel_arc_start = arc.relative_start();
|
||||||
|
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
|
size_t count = N_ARC_CORRECTION;
|
||||||
|
#else
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
|
|
||||||
for (size_t i = 1; i < segments; ++i) {
|
for (size_t i = 1; i < segments; ++i) {
|
||||||
|
#if ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
|
if (count-- == 0) {
|
||||||
|
const double cos_Ti = ::cos(i * theta_per_segment);
|
||||||
|
const double sin_Ti = ::sin(i * theta_per_segment);
|
||||||
|
curr_rel_arc_start.x() = -double(rel_center.x()) * cos_Ti + double(rel_center.y()) * sin_Ti;
|
||||||
|
curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti;
|
||||||
|
count = N_ARC_CORRECTION;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T;
|
||||||
|
curr_rel_arc_start.x() = curr_rel_arc_start.x() * cos_T - curr_rel_arc_start.y() * sin_T;
|
||||||
|
curr_rel_arc_start.y() = r_axisi;
|
||||||
|
}
|
||||||
|
#else
|
||||||
if (count < N_ARC_CORRECTION) {
|
if (count < N_ARC_CORRECTION) {
|
||||||
// Apply vector rotation matrix
|
// Apply vector rotation matrix
|
||||||
const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T;
|
const float r_axisi = curr_rel_arc_start.x() * sin_T + curr_rel_arc_start.y() * cos_T;
|
||||||
@ -3389,6 +3417,7 @@ void GCodeProcessor::process_G2_G3(const GCodeReader::GCodeLine& line, bool cloc
|
|||||||
curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti;
|
curr_rel_arc_start.y() = -double(rel_center.x()) * sin_Ti - double(rel_center.y()) * cos_Ti;
|
||||||
count = 0;
|
count = 0;
|
||||||
}
|
}
|
||||||
|
#endif // ENABLE_ET_SPE1872_FIRMWARE_G2G3
|
||||||
|
|
||||||
// Update arc_target location
|
// Update arc_target location
|
||||||
arc_target[X] = arc.center.x() + curr_rel_arc_start.x();
|
arc_target[X] = arc.center.x() + curr_rel_arc_start.x();
|
||||||
|
@ -65,6 +65,7 @@
|
|||||||
// requires VGCODE_ENABLE_ET_SPE1872 set to 1 in libvgcode (Types.hpp)
|
// requires VGCODE_ENABLE_ET_SPE1872 set to 1 in libvgcode (Types.hpp)
|
||||||
#define ENABLE_ET_SPE1872 (1 && ENABLE_NEW_GCODE_VIEWER)
|
#define ENABLE_ET_SPE1872 (1 && ENABLE_NEW_GCODE_VIEWER)
|
||||||
#define ENABLE_ET_SPE1872_FIRMWARE_BUDDY (1 && ENABLE_ET_SPE1872)
|
#define ENABLE_ET_SPE1872_FIRMWARE_BUDDY (1 && ENABLE_ET_SPE1872)
|
||||||
|
#define ENABLE_ET_SPE1872_FIRMWARE_G2G3 (1 && ENABLE_ET_SPE1872)
|
||||||
#define ENABLE_ET_SPE1872_DEBUG (1 && ENABLE_ET_SPE1872)
|
#define ENABLE_ET_SPE1872_DEBUG (1 && ENABLE_ET_SPE1872)
|
||||||
|
|
||||||
// Enable G-Code viewer statistics imgui dialog
|
// Enable G-Code viewer statistics imgui dialog
|
||||||
|
Loading…
x
Reference in New Issue
Block a user