#include "gcode_file.h" #include "gcode_parser.h" #include #include #include grbl::grbl_file grbl::grbl_file::load(std::string path) { grbl::grbl_parser parser; grbl::grbl_file result{}; std::ifstream in_file{path}; if (in_file) { parser.parse(in_file); result = grbl_file(parser.commands); } return result; } grbl::grbl_file::grbl_file(std::vector cmd) : commands(cmd) { } std::vector grbl::grbl_file::get_gcode() { std::vector result; result.emplace_back("G90 G91.1 G21 G17"); grbl::parser_state state; auto xyz = "XYZ"; std::stringstream ss; ss << std::fixed << std::setprecision(3); for (auto &c: commands) { auto *motion = dynamic_cast(c); bool is_motion = motion != nullptr; auto *line = dynamic_cast(c); auto *arc = dynamic_cast(c); auto *mcode = dynamic_cast(c); auto *spindle = dynamic_cast(c); auto *dwell = dynamic_cast(c); if (is_motion) { if (motion->feed != state.feed) { ss.str(""); ss << "F" << motion->feed; result.push_back(ss.str()); state.feed = motion->feed; } } if (line != nullptr) { std::string code = line->rapid ? "G0" : "G1"; for (int i = 0; i < 3; i++) { if (!line->position_valid[i]) continue; if (!line->start_valid || state.position[i] != line->end[i]) { ss.str(""); ss << xyz[i] << line->end[i]; code += ss.str(); } } result.push_back(code); state.position = line->end; continue; } if (arc != nullptr) { if (state.plane != arc->plane) { switch (arc->plane) { case arc_plane::xy: result.emplace_back("G17"); break; case arc_plane::yz: result.emplace_back("G19"); break; case arc_plane::zx: result.emplace_back("G18"); break; } state.plane = arc->plane; } std::string code = arc->direction == arc_direction::cw ? "G2" : "G3"; if (state.position.x != arc->end.x) { ss.str(""); ss << "X" << arc->end.x; code += ss.str(); } if (state.position.y != arc->end.y) { ss.str(""); ss << "Y" << arc->end.y; code += ss.str(); } if (state.position.z != arc->end.z) { ss.str(""); ss << "Z" << arc->end.z; code += ss.str(); } glm::vec3 center = roll_components({arc->u, arc->v, 0}, (int) arc->plane) - state.position; if (center.x != 0 && arc->plane != arc_plane::yz) { ss.str(""); ss << " I" << center.x; code += ss.str(); } if (center.y != 0 && arc->plane != arc_plane::zx) { ss.str(""); ss << " J" << center.y; code += ss.str(); } if (center.z != 0 && arc->plane != arc_plane::xy) { ss.str(""); ss << " K" << center.z; code += ss.str(); } result.push_back(code); state.position = arc->end; continue; } if (mcode != nullptr) { int code = mcode->code; if (code == 2 || code == 30) continue; result.push_back("M" + std::to_string(code)); continue; } if (spindle != nullptr) { ss.str(""); ss << "S" << spindle->speed; result.push_back(ss.str()); continue; } if (dwell != nullptr) { ss.str(""); ss << "G4 P" << dwell->seconds; result.push_back(ss.str()); continue; } } return result; }