Enabled arcs render after adapting OpenCNCPilot code.

Started porting iosender to C++
This commit is contained in:
2023-05-16 09:18:06 +03:00
parent c05a6a1ad2
commit 42aefe8ed8
23 changed files with 2200 additions and 18 deletions
+123
View File
@@ -0,0 +1,123 @@
#pragma once
#include <glm/vec3.hpp>
#include <vector>
#include <memory>
#include <cmath>
#include "glm/ext/scalar_constants.hpp"
namespace grbl {
glm::vec<3, double> roll_components(glm::vec<3, double> v, int turns);
enum class arc_plane {
xy = 0,
yz = 1,
zx = 2
};
enum class arc_direction {
cw,
ccw
};
struct command {
virtual ~command() = default;
int line_number = 1;
};
struct mcode_cmd : public command {
mcode_cmd(int code, int line_number);
int code;
};
struct spindle_cmd : public command {
spindle_cmd(double speed, int line_number);
double speed;
};
struct dwell_cmd : public command {
dwell_cmd(double seconds, int line_number);
double seconds;
};
struct motion_cmd : public command {
glm::vec<3, double> start = glm::vec3(0);
glm::vec<3, double> end = glm::vec3(0);
double feed = 0;
glm::vec<3, double> delta() const { return end - start; }
// Total travel distance of tool
virtual double length() const = 0;
virtual glm::vec<3, double> interpolate(double ratio) = 0;
virtual std::vector<std::shared_ptr<motion_cmd>> split(double length) = 0;
};
struct line_motion_cmd : public motion_cmd {
bool rapid = false;
// PositionValid[i] is true if the corresponding coordinate of the end position was defined in the file.
// eg. for a file with "G0 Z15" as the first line, X and Y would still be false
bool position_valid[3] = {false, false, false};
bool start_valid = false;
double length() const override;
glm::vec<3, double> interpolate(double ratio) override;
std::vector<std::shared_ptr<motion_cmd>> split(double length) override;
};
struct arc_motion_cmd : public motion_cmd {
arc_plane plane;
arc_direction direction;
double u; //absolute position of center in first axis of plane
double v; //absolute position of center in second axis of plane
double start_angle() const {
glm::vec<3, double> start_in_plane = roll_components(start, -(int) plane);
double X = start_in_plane.x - u;
double Y = start_in_plane.y - v;
return atan2(Y, X);
}
double end_angle() const {
glm::vec<3, double> end_in_plane = roll_components(end, -(int) plane);
double X = end_in_plane.x - u;
double Y = end_in_plane.y - v;
return atan2(Y, X);
}
double angle_span() const {
double span = end_angle() - start_angle();
if (direction == arc_direction::cw) {
if (span >= 0)
span -= 2 * glm::pi<double>();
} else {
if (span <= 0)
span += 2 * glm::pi<double>();
}
return span;
}
double radius() const {
glm::vec<3, double> start_plane = roll_components(start, -(int) plane);
glm::vec<3, double> end_plane = roll_components(end, -(int) plane);
return (
sqrt(pow(start_plane.x - u, 2) + pow(start_plane.y - v, 2)) +
sqrt(pow(end_plane.x - u, 2) + pow(end_plane.y - v, 2))
) / 2;
}
glm::vec<3, double> interpolate(double ratio) override;
std::vector<std::shared_ptr<motion_cmd>> split(double length) override;
double length() const override;
};
}