diff --git a/CMakeLists.txt b/CMakeLists.txt index 372c74f..4bb235d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,5 +23,5 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_VISIBILITY_PRESET hidden) -add_executable(sender main.cpp grbl.h grbl.cpp grbl_test.cpp grbl_communication.h grbl_communication.cpp) +add_executable(sender main.cpp grbl.h grbl.cpp grbl_test.cpp grbl_communication.h grbl_communication.cpp machine.h grbl_machine.cpp) target_link_libraries(sender nanogui gtest gtest_main) \ No newline at end of file diff --git a/grbl_communication.cpp b/grbl_communication.cpp index 56a18b6..7687fd0 100644 --- a/grbl_communication.cpp +++ b/grbl_communication.cpp @@ -12,7 +12,7 @@ grbl::tcp_transport::tcp_transport(std::string address, uint16_t p) live_check_thread = std::thread(&grbl::tcp_transport::worker, this); } -void grbl::tcp_transport::open(grbl::transport_callbacks &cb) { +void grbl::tcp_transport::open(grbl::transport_callbacks& cb) { if (is_connected) { close(); } @@ -83,6 +83,8 @@ void grbl::tcp_transport::worker() { if (result == -1) { std::cerr << "Failed while writing." << std::endl; close(); + } else { + std::cout << "<< " << line << std::endl; } send_queue.pop(); @@ -127,8 +129,8 @@ grbl::tcp_transport::~tcp_transport() { live_check_thread.join(); } -bool grbl::tcp_transport::is_empty_line(const std::string &line) { - for (auto &c: line) { +bool grbl::tcp_transport::is_empty_line(const std::string& line) { + for (auto& c: line) { if (c != '\r' && c != '\n' && c != ' ') { return false; } diff --git a/grbl_communication.h b/grbl_communication.h index d94df5a..79a9bc5 100644 --- a/grbl_communication.h +++ b/grbl_communication.h @@ -9,32 +9,31 @@ namespace grbl { struct transport; struct transport_callbacks { - virtual void on_connected(transport*) = 0; - virtual void on_disconnected(transport*) = 0; - virtual void on_line_received(std::string line, transport* ) = 0; - virtual void on_banner(std::string version, transport* ) = 0; + virtual void on_connected(transport *) = 0; + virtual void on_disconnected(transport *) = 0; + virtual void on_line_received(std::string line, transport *) = 0; + virtual void on_banner(std::string version, transport *) = 0; }; struct transport { virtual void open(transport_callbacks& cb) = 0; virtual void close() = 0; virtual void send(std::string line) = 0; + virtual void send_single_char_command(uint8_t data) const = 0; }; struct tcp_transport : public transport { - virtual ~tcp_transport(); tcp_transport(std::string address, uint16_t port); + virtual ~tcp_transport(); void open(transport_callbacks& cb) override; void close() override; void send(std::string line) override; + void send_single_char_command(uint8_t data) const override; void request_realtime_report(); - void request_cycle_start(); - void request_feed_hold(); - void parser_state_report(); private: @@ -50,8 +49,6 @@ private: std::queue send_queue; volatile bool should_quit = false; static bool is_empty_line(const std::string& line); - - void send_single_char_command(uint8_t data) const; }; } diff --git a/grbl_machine.cpp b/grbl_machine.cpp new file mode 100644 index 0000000..a664bea --- /dev/null +++ b/grbl_machine.cpp @@ -0,0 +1,118 @@ +#include +#include +#include "machine.h" + +grbl::machine::machine() { + pipe = new tcp_transport("192.168.5.39", 23); +} + +grbl::machine::~machine() { + delete pipe; +} + +void grbl::machine::connect() { + pipe->open(*this); +} + +void grbl::machine::run_program(grbl::program pgm) { + std::cout << "running program with " << pgm.number_of_instructions() << " instructions" << std::endl; + running_program = pgm; + state = grbl_machine_state::run_program; + + executed_instructions = 0; + continue_program(); +} + +void grbl::machine::on_connected(grbl::transport *transport) { + std::cout << "grbl machine connected" << std::endl; + // telnet handshake so that we get the banner. banner won't be coming otherwise +// t->send("\xff\xfd\x18\xff\xfd\x20\xff\xfd\x23\xff\xfd\x27"); + pipe->send("\xff\xfd\x18"); + +} + +void grbl::machine::on_disconnected(grbl::transport *transport) { + std::cout << "grbl machine disconnected" << std::endl; +} + +void grbl::machine::on_line_received(std::string line, grbl::transport *transport) { + std::cout << ">> " << line << std::endl; + + if (state == grbl_machine_state::run_program) { + if (line.rfind("ok", 0) == 0) { + continue_program(); + } else if (line.rfind("error", 0) == 0) { + std::cerr << "Received error" << std::endl; + } else { + } + } else { + // evaluate responses when not running a program + } +} + +void grbl::machine::on_banner(std::string version, grbl::transport *transport) { + std::cout << "grbl machine received banner" << std::endl; +} + +void grbl::machine::continue_program() { + if (executed_instructions < running_program.number_of_instructions()) { + instruction to_send; + do { + to_send = running_program.instruction_at(executed_instructions++); + } while (to_send.type != instruction_type::gcode && executed_instructions < running_program.number_of_instructions()); + + if (to_send.type == instruction_type::gcode) { + pipe->send(to_send.command); + } else { + state = grbl_machine_state::idle; + } + } else { + state = grbl_machine_state::idle; + } +} + +void grbl::machine::request_jog(jog_state jog) const { + cancel_jog(); + if (jog.no_jogging()) { +// cancel_jog(); + return; + } + + std::stringstream ss; + ss << "$J=G91 G21 "; + + if (jog.left_pressed) + ss << " X-1000"; + else if (jog.right_pressed) + ss << " X1000"; + + if (jog.up_pressed) + ss << " Y1000"; + else if (jog.down_pressed) + ss << " Y-1000"; + + if (jog.z_up_pressed) + ss << " Z1000"; + else if (jog.z_down_pressed) + ss << " Z-1000"; + + if (jog.speed_fast_pressed) { + ss << " F10000"; + } else if (jog.speed_slow_pressed) { + ss << " F100"; + } else { + ss << " F1000"; + } + + pipe->send(ss.str()); +} + +void grbl::machine::cancel_jog() const { + pipe->send_single_char_command(0x85); + + +} + +bool grbl::jog_state::no_jogging() const { + return !(up_pressed || down_pressed || left_pressed || right_pressed || z_up_pressed || z_down_pressed); +} diff --git a/machine.h b/machine.h new file mode 100644 index 0000000..0c17730 --- /dev/null +++ b/machine.h @@ -0,0 +1,81 @@ +#pragma once + +#include "grbl_communication.h" +#include "grbl.h" + +namespace grbl { + + +enum class grbl_machine_state { + init, + run_program, + idle, +}; + +enum class jog_direction { + up, + down, + left, + right, + up_left, + up_right, + down_left, + down_right +}; + +struct jog_state { + bool left_pressed = false; + bool right_pressed = false; + bool up_pressed = false; + bool down_pressed = false; + bool z_up_pressed = false; + bool z_down_pressed = false; + bool speed_fast_pressed = false; + bool speed_slow_pressed = false; + + bool no_jogging() const; +}; + +static bool operator==(const jog_state& a, const jog_state& b) { + if (a.left_pressed != b.left_pressed || + a.right_pressed != b.right_pressed || + a.up_pressed != b.up_pressed || + a.down_pressed != b.down_pressed || + a.z_up_pressed != b.z_up_pressed || + a.z_down_pressed != b.z_down_pressed || + a.speed_fast_pressed != b.speed_fast_pressed || + a.speed_slow_pressed != b.speed_slow_pressed) { + return false; + } + return true; +} + +static bool operator!=(const jog_state& a, const jog_state& b) { + return !(a == b); +} + +struct machine : public transport_callbacks { + machine(); + ~machine(); + + void connect(); + void run_program(grbl::program pgm); + void request_jog(jog_state jog) const; + void cancel_jog() const; + + void on_connected(transport *transport) override; + void on_disconnected(transport *transport) override; + void on_line_received(std::string line, transport *transport) override; + + + void on_banner(std::string version, transport *transport) override; + transport *pipe = nullptr; + grbl_machine_state state = grbl_machine_state::init; + program running_program; + size_t executed_instructions = 0; + void continue_program(); +}; + + +} + diff --git a/main.cpp b/main.cpp index 338e9b4..e40cc6f 100644 --- a/main.cpp +++ b/main.cpp @@ -51,15 +51,20 @@ #include "grbl.h" #include #include "grbl_communication.h" +#include "machine.h" using namespace nanogui; +grbl::machine cnc{}; + + class SenderApp : public Screen { public: Window *window; Window *left_window; Window *right_window; + grbl::jog_state jog; SenderApp() : Screen(Vector2i(1024, 768), "GRBL Sender") { inc_ref(); @@ -82,7 +87,15 @@ public: new Label(left_window, "Push buttons", "sans-bold"); Button *b = new Button(left_window, "Plain button"); - b->set_callback([] { std::cout << "pushed!" << std::endl; }); + b->set_callback([&] { + auto path = file_dialog( + {{"nc", "G-Code files"}, + {"ngc", "G-Code files"}}, false); + grbl::program pgm{path}; + if (pgm.is_loaded) { + cnc.run_program(pgm); + } + }); b->set_tooltip("short tooltip"); /* Alternative construction notation using variadic template */ @@ -553,12 +566,13 @@ public: m_shader->set_uniform("intensity", 0.5f); } - bool resize_event(const Vector2i &size) override { + bool resize_event(const Vector2i& size) override { window->set_size(size); Screen::resize_event(size); return true; } + virtual bool keyboard_event(int key, int scancode, int action, int modifiers) { if (Screen::keyboard_event(key, scancode, action, modifiers)) return true; @@ -567,13 +581,77 @@ public: return true; } - if (key == GLFW_KEY_UP) { + auto new_jog = jog; + + if (key == GLFW_KEY_LEFT_SHIFT) { if (action == GLFW_PRESS) { - set_caption("Jogging"); + new_jog.speed_fast_pressed = true; } else if (action == GLFW_RELEASE) { - set_caption("Idle"); + new_jog.speed_fast_pressed = false; } } + + if (key == GLFW_KEY_LEFT_CONTROL) { + if (action == GLFW_PRESS) { + new_jog.speed_slow_pressed = true; + } else if (action == GLFW_RELEASE) { + new_jog.speed_slow_pressed = false; + } + } + + if (key == GLFW_KEY_UP) { + if (action == GLFW_PRESS) { + new_jog.up_pressed = true; + } else if (action == GLFW_RELEASE) { + new_jog.up_pressed = false; + } + } + + if (key == GLFW_KEY_DOWN) { + if (action == GLFW_PRESS) { + new_jog.down_pressed = true; + } else if (action == GLFW_RELEASE) { + new_jog.down_pressed = false; + } + } + + if (key == GLFW_KEY_LEFT) { + if (action == GLFW_PRESS) { + new_jog.left_pressed = true; + } else if (action == GLFW_RELEASE) { + new_jog.left_pressed = false; + } + } + + if (key == GLFW_KEY_RIGHT) { + if (action == GLFW_PRESS) { + new_jog.right_pressed = true; + } else if (action == GLFW_RELEASE) { + new_jog.right_pressed = false; + } + } + + if (key == GLFW_KEY_PAGE_UP) { + if (action == GLFW_PRESS) { + new_jog.z_up_pressed = true; + } else if (action == GLFW_RELEASE) { + new_jog.z_up_pressed = false; + } + } + + if (key == GLFW_KEY_PAGE_DOWN) { + if (action == GLFW_PRESS) { + new_jog.z_down_pressed = true; + } else if (action == GLFW_RELEASE) { + new_jog.z_down_pressed = false; + } + } + + if (jog != new_jog) { + cnc.request_jog(new_jog); + jog = new_jog; + } + return false; } @@ -625,22 +703,22 @@ struct grbl_listener : public grbl::transport_callbacks { std::cout << "Listener: disconnected!" << std::endl; } - void on_line_received(std::string line, grbl::transport *t) override { - std::cout << "Listener: -> " << line << std::endl; - } - void on_banner(std::string version, grbl::transport *t) override { std::cout << "Banner: " << version << std::endl; t->send("$$"); } + + void on_line_received(std::string line, grbl::transport *t) override { + std::cout << "Listener: -> " << line << std::endl; + } }; int main(int argc, char **argv) { - grbl_listener listener{}; - - grbl::tcp_transport transport("192.168.5.39", 23); - transport.open(listener); +// grbl_listener listener; +// +// grbl::tcp_transport transport("192.168.5.39", 23); +// transport.open(listener); testing::InitGoogleTest(&argc, argv); auto result = RUN_ALL_TESTS(); @@ -648,10 +726,17 @@ int main(int argc, char **argv) { exit(result); } - transport.request_realtime_report(); - transport.request_cycle_start(); - transport.request_feed_hold(); - transport.parser_state_report(); + cnc.connect(); + +// grbl::program pgm{"./program.nc"}; +//// pgm.dump(std::cout); +// +// cnc.run_program(pgm); + +// transport.request_realtime_report(); +// transport.request_cycle_start(); +// transport.request_feed_hold(); +// transport.parser_state_report(); try { @@ -671,7 +756,7 @@ int main(int argc, char **argv) { } nanogui::shutdown(); - } catch (const std::exception &e) { + } catch (const std::exception& e) { std::string error_msg = std::string("Caught a fatal error: ") + std::string(e.what()); std::cerr << error_msg << std::endl; return -1; diff --git a/program.nc b/program.nc index de2194f..80e5883 100644 --- a/program.nc +++ b/program.nc @@ -1,1414 +1,110 @@ -( pcb2gcode 1.2.2 ) -( Software-independent Gcode ) - +(Block-name: Header) +(Block-expand: 1) +(Block-enable: 1) G94 ( Millimeters per minute feed rate. ) G21 ( Units == Millimeters. ) - G90 ( Absolute coordinates. ) S10000 ( RPM spindle speed. ) -G64 P0.05080 ( set maximum deviation from commanded toolpath ) -F600.00000 ( Feedrate. ) - -F600.00000 ( Feedrate. ) -M3 ( Spindle on clockwise. ) -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X3.87739 Y78.52820 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X3.87739 Y78.52820 -X3.62339 Y78.47740 -X3.59799 Y78.42660 -X3.26779 Y78.27420 -X3.03919 Y78.04560 -X2.98839 Y78.04560 -X2.98839 Y77.99480 -X2.75979 Y77.76620 -X2.60739 Y77.43600 -X2.55659 Y77.41060 -X2.53119 Y77.23280 -X2.42959 Y76.97880 -X2.40419 Y76.72480 -X2.42959 Y76.03900 -X2.53119 Y75.78500 -X2.55659 Y75.60720 -X2.60739 Y75.58180 -X2.75979 Y75.25160 -X2.98839 Y75.02300 -X2.98839 Y74.97220 -X3.03919 Y74.97220 -X3.26779 Y74.74360 -X3.59799 Y74.59120 -X3.62339 Y74.54040 -X3.80119 Y74.51500 -X4.05519 Y74.41340 -X4.30919 Y74.38800 -X4.99499 Y74.41340 -X5.24899 Y74.51500 -X5.42679 Y74.54040 -X5.45219 Y74.59120 -X5.78239 Y74.74360 -X6.01099 Y74.97220 -X6.06179 Y74.97220 -X6.06179 Y75.02300 -X6.29039 Y75.25160 -X6.44279 Y75.58180 -X6.49359 Y75.60720 -X6.51899 Y75.78500 -X6.62059 Y76.03900 -X6.64599 Y76.29300 -X6.62059 Y76.97880 -X6.51899 Y77.23280 -X6.49359 Y77.41060 -X6.44279 Y77.43600 -X6.29039 Y77.76620 -X6.06179 Y77.99480 -X6.06179 Y78.04560 -X6.01099 Y78.04560 -X5.78239 Y78.27420 -X5.45219 Y78.42660 -X5.42679 Y78.47740 -X5.24899 Y78.50280 -X4.99499 Y78.60440 -X4.74099 Y78.62980 -X4.05519 Y78.60440 -X3.87739 Y78.52820 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X19.82859 Y72.68620 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X19.82859 Y72.68620 -X19.82859 Y70.88280 -X22.03839 Y70.88280 -X22.03839 Y72.78780 -X19.82859 Y72.78780 -X19.82859 Y72.68620 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X20.28579 Y70.14620 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X20.28579 Y70.14620 -X20.00639 Y69.94300 -X19.85399 Y69.61280 -X19.82859 Y69.13020 -X19.87939 Y68.87620 -X19.98099 Y68.74920 -X20.00639 Y68.64760 -X20.18419 Y68.49520 -X20.23499 Y68.49520 -X20.28579 Y68.41900 -X20.56519 Y68.34280 -X21.30179 Y68.34280 -X21.53039 Y68.39360 -X21.70819 Y68.54600 -X21.75899 Y68.54600 -X21.86059 Y68.64760 -X21.88599 Y68.74920 -X21.98759 Y68.87620 -X22.03839 Y69.13020 -X22.01299 Y69.61280 -X21.86059 Y69.94300 -X21.68279 Y70.09540 -X21.63199 Y70.09540 -X21.58119 Y70.17160 -X21.30179 Y70.24780 -X20.56519 Y70.24780 -X20.33659 Y70.19700 -X20.28579 Y70.14620 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X20.28579 Y67.60620 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X20.28579 Y67.60620 -X20.00639 Y67.40300 -X19.85399 Y67.07280 -X19.82859 Y66.59020 -X19.87939 Y66.33620 -X19.98099 Y66.20920 -X20.00639 Y66.10760 -X20.10799 Y66.00600 -X20.23499 Y65.95520 -X20.28579 Y65.87900 -X20.56519 Y65.80280 -X21.30179 Y65.80280 -X21.53039 Y65.85360 -X21.63199 Y65.95520 -X21.75899 Y66.00600 -X21.86059 Y66.10760 -X21.88599 Y66.20920 -X21.98759 Y66.33620 -X22.03839 Y66.59020 -X22.01299 Y67.07280 -X21.86059 Y67.40300 -X21.75899 Y67.50460 -X21.63199 Y67.55540 -X21.58119 Y67.63160 -X21.30179 Y67.70780 -X20.56519 Y67.70780 -X20.33659 Y67.65700 -X20.28579 Y67.60620 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X41.18999 Y65.19320 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X41.18999 Y65.19320 -X41.18999 Y63.13580 -X43.34899 Y63.13580 -X43.34899 Y65.29480 -X41.18999 Y65.29480 -X41.18999 Y65.19320 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X41.74879 Y67.73320 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X41.74879 Y67.73320 -X41.57099 Y67.65700 -X41.36779 Y67.47920 -X41.18999 Y67.07280 -X41.18999 Y66.43780 -X41.36779 Y66.03140 -X41.69799 Y65.77740 -X42.05359 Y65.67580 -X42.63779 Y65.70120 -X43.04419 Y65.90440 -X43.22199 Y66.10760 -X43.34899 Y66.43780 -X43.34899 Y67.07280 -X43.17119 Y67.47920 -X42.96799 Y67.65700 -X42.63779 Y67.80940 -X42.05359 Y67.83480 -X41.79959 Y67.78400 -X41.74879 Y67.73320 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X39.94539 Y53.33140 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X39.94539 Y53.33140 -X39.86919 Y53.28060 -X39.84379 Y53.17900 -X39.84379 Y52.89960 -X39.89459 Y52.79800 -X39.89459 Y47.69260 -X39.84379 Y47.59100 -X39.84379 Y47.31160 -X39.86919 Y47.21000 -X40.02159 Y47.08300 -X40.37719 Y47.05760 -X40.52959 Y47.13380 -X40.60579 Y47.21000 -X40.63119 Y47.31160 -X40.63119 Y47.59100 -X40.58039 Y47.69260 -X40.58039 Y52.79800 -X40.63119 Y52.89960 -X40.63119 Y53.17900 -X40.55499 Y53.33140 -X40.37719 Y53.43300 -X40.09779 Y53.43300 -X39.97079 Y53.38220 -X39.94539 Y53.33140 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X56.20139 Y50.28340 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X56.20139 Y50.28340 -X56.12519 Y50.23260 -X56.09979 Y50.13100 -X56.09979 Y49.85160 -X56.15059 Y49.72460 -X56.35379 Y49.59760 -X56.63319 Y49.59760 -X56.70939 Y49.64840 -X66.43759 Y49.64840 -X66.51379 Y49.59760 -X66.79319 Y49.59760 -X66.92019 Y49.64840 -X67.02179 Y49.75000 -X67.04719 Y49.85160 -X67.02179 Y50.23260 -X66.92019 Y50.33420 -X66.79319 Y50.38500 -X66.51379 Y50.38500 -X66.43759 Y50.33420 -X56.70939 Y50.33420 -X56.63319 Y50.38500 -X56.35379 Y50.38500 -X56.22679 Y50.33420 -X56.20139 Y50.28340 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X55.33779 Y45.68600 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X55.33779 Y45.68600 -X55.15999 Y45.63520 -X55.13459 Y45.58440 -X54.98219 Y45.50820 -X54.75359 Y45.25420 -X54.62659 Y44.97480 -X54.57579 Y44.72080 -X54.57579 Y44.18740 -X54.62659 Y43.93340 -X54.75359 Y43.65400 -X55.00759 Y43.37460 -X55.05839 Y43.37460 -X55.08379 Y43.32380 -X55.26159 Y43.22220 -X55.49019 Y43.14600 -X56.20139 Y43.12060 -X56.65859 Y43.27300 -X57.01419 Y43.57780 -X57.16659 Y43.85720 -X57.21739 Y44.03500 -X57.24279 Y44.72080 -X57.19199 Y44.97480 -X57.06499 Y45.25420 -X56.81099 Y45.53360 -X56.76019 Y45.53360 -X56.55699 Y45.68600 -X56.32839 Y45.76220 -X55.61719 Y45.78760 -X55.38859 Y45.73680 -X55.33779 Y45.68600 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X55.33779 Y40.68220 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X55.33779 Y40.68220 -X55.26159 Y40.68220 -X55.08379 Y40.58060 -X55.05839 Y40.52980 -X55.00759 Y40.52980 -X54.80439 Y40.32660 -X54.62659 Y39.97100 -X54.57579 Y39.71700 -X54.57579 Y39.18360 -X54.62659 Y38.92960 -X54.75359 Y38.65020 -X55.00759 Y38.37080 -X55.05839 Y38.37080 -X55.08379 Y38.32000 -X55.26159 Y38.21840 -X55.49019 Y38.14220 -X56.20139 Y38.11680 -X56.65859 Y38.26920 -X57.01419 Y38.57400 -X57.16659 Y38.85340 -X57.21739 Y39.03120 -X57.24279 Y39.71700 -X57.19199 Y39.97100 -X57.06499 Y40.25040 -X56.81099 Y40.52980 -X56.42999 Y40.73300 -X56.20139 Y40.78380 -X55.61719 Y40.78380 -X55.38859 Y40.73300 -X55.33779 Y40.68220 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X55.36319 Y35.37360 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X55.36319 Y35.37360 -X55.15999 Y35.27200 -X55.03299 Y35.14500 -X54.98219 Y34.99260 -X54.85519 Y34.84020 -X54.80439 Y34.53540 -X54.80439 Y34.20520 -X54.85519 Y33.90040 -X54.90599 Y33.87500 -X55.03299 Y33.59560 -X55.36319 Y33.34160 -X55.69339 Y33.26540 -X56.27759 Y33.29080 -X56.63319 Y33.44320 -X56.78559 Y33.59560 -X56.91259 Y33.87500 -X56.96339 Y33.90040 -X57.01419 Y34.20520 -X57.01419 Y34.53540 -X56.96339 Y34.84020 -X56.91259 Y34.86560 -X56.78559 Y35.14500 -X56.63319 Y35.29740 -X56.48079 Y35.34820 -X56.45539 Y35.39900 -X56.12519 Y35.47520 -X55.69339 Y35.47520 -X55.36319 Y35.37360 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X54.80439 Y32.83360 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X54.80439 Y32.83360 -X54.80439 Y30.72540 -X57.01419 Y30.72540 -X57.01419 Y32.93520 -X54.80439 Y32.93520 -X54.80439 Y32.83360 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X60.36699 Y43.17140 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X60.36699 Y43.17140 -X60.18919 Y43.12060 -X59.96059 Y42.94280 -X59.78279 Y42.73960 -X59.65579 Y42.46020 -X59.60499 Y42.20620 -X59.60499 Y41.67280 -X59.68119 Y41.34260 -X59.78279 Y41.13940 -X60.03679 Y40.86000 -X60.08759 Y40.86000 -X60.29079 Y40.70760 -X60.51939 Y40.63140 -X61.23059 Y40.60600 -X61.68779 Y40.75840 -X62.04339 Y41.06320 -X62.19579 Y41.34260 -X62.24659 Y41.52040 -X62.27199 Y42.20620 -X62.22119 Y42.46020 -X62.09419 Y42.73960 -X61.84019 Y43.01900 -X61.45919 Y43.22220 -X61.23059 Y43.27300 -X60.64639 Y43.27300 -X60.41779 Y43.22220 -X60.36699 Y43.17140 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X60.39239 Y55.87140 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X60.39239 Y55.87140 -X60.31619 Y55.82060 -X60.29079 Y55.71900 -X60.29079 Y55.43960 -X60.31619 Y55.33800 -X60.41779 Y55.23640 -X60.54479 Y55.18560 -X60.82419 Y55.18560 -X60.90039 Y55.23640 -X72.53359 Y55.23640 -X72.60979 Y55.18560 -X72.88919 Y55.18560 -X73.01619 Y55.23640 -X73.11779 Y55.33800 -X73.14319 Y55.43960 -X73.11779 Y55.82060 -X73.01619 Y55.92220 -X72.88919 Y55.97300 -X72.60979 Y55.97300 -X72.53359 Y55.92220 -X60.90039 Y55.92220 -X60.82419 Y55.97300 -X60.54479 Y55.97300 -X60.41779 Y55.92220 -X60.39239 Y55.87140 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X74.18459 Y71.31460 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X74.18459 Y71.31460 -X74.18459 Y69.20640 -X76.39439 Y69.20640 -X76.39439 Y71.41620 -X74.18459 Y71.41620 -X74.18459 Y71.31460 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X77.28339 Y71.31460 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X77.28339 Y71.31460 -X77.08019 Y71.21300 -X76.95319 Y71.08600 -X76.90239 Y70.93360 -X76.77539 Y70.78120 -X76.72459 Y70.47640 -X76.72459 Y70.14620 -X76.77539 Y69.84140 -X76.82619 Y69.81600 -X76.95319 Y69.53660 -X77.28339 Y69.28260 -X77.61359 Y69.20640 -X78.19779 Y69.23180 -X78.55339 Y69.38420 -X78.70579 Y69.53660 -X78.83279 Y69.81600 -X78.88359 Y69.84140 -X78.93439 Y70.14620 -X78.93439 Y70.47640 -X78.88359 Y70.78120 -X78.83279 Y70.80660 -X78.70579 Y71.08600 -X78.55339 Y71.23840 -X78.40099 Y71.28920 -X78.37559 Y71.34000 -X78.04539 Y71.41620 -X77.61359 Y71.41620 -X77.28339 Y71.31460 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X94.96179 Y68.11420 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X94.96179 Y68.11420 -X94.68239 Y67.91100 -X94.52999 Y67.58080 -X94.50459 Y67.09820 -X94.55539 Y66.84420 -X94.65699 Y66.71720 -X94.68239 Y66.61560 -X94.78399 Y66.51400 -X94.91099 Y66.46320 -X94.96179 Y66.38700 -X95.24119 Y66.31080 -X95.97779 Y66.31080 -X96.20639 Y66.36160 -X96.38419 Y66.51400 -X96.43499 Y66.51400 -X96.53659 Y66.61560 -X96.56199 Y66.71720 -X96.66359 Y66.84420 -X96.71439 Y67.09820 -X96.68899 Y67.58080 -X96.53659 Y67.91100 -X96.35879 Y68.06340 -X96.30799 Y68.06340 -X96.25719 Y68.13960 -X95.97779 Y68.21580 -X95.24119 Y68.21580 -X95.01259 Y68.16500 -X94.96179 Y68.11420 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X94.96179 Y65.57420 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X94.96179 Y65.57420 -X94.68239 Y65.37100 -X94.52999 Y65.04080 -X94.50459 Y64.55820 -X94.55539 Y64.30420 -X94.65699 Y64.17720 -X94.68239 Y64.07560 -X94.78399 Y63.97400 -X94.91099 Y63.92320 -X94.96179 Y63.84700 -X95.24119 Y63.77080 -X95.97779 Y63.77080 -X96.20639 Y63.82160 -X96.30799 Y63.92320 -X96.43499 Y63.97400 -X96.53659 Y64.07560 -X96.56199 Y64.17720 -X96.66359 Y64.30420 -X96.71439 Y64.55820 -X96.68899 Y65.04080 -X96.53659 Y65.37100 -X96.43499 Y65.47260 -X96.30799 Y65.52340 -X96.25719 Y65.59960 -X95.97779 Y65.67580 -X95.24119 Y65.67580 -X95.01259 Y65.62500 -X94.96179 Y65.57420 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X94.50459 Y63.03420 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X94.50459 Y63.03420 -X94.50459 Y61.23080 -X96.71439 Y61.23080 -X96.71439 Y63.13580 -X94.50459 Y63.13580 -X94.50459 Y63.03420 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X94.50459 Y54.04260 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X94.50459 Y54.04260 -X94.50459 Y51.93440 -X96.71439 Y51.93440 -X96.71439 Y54.14420 -X94.50459 Y54.14420 -X94.50459 Y54.04260 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X92.04079 Y53.50920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X92.04079 Y53.50920 -X91.78679 Y53.38220 -X91.65979 Y53.25520 -X91.48199 Y52.84880 -X91.48199 Y52.21380 -X91.65979 Y51.80740 -X91.98999 Y51.55340 -X92.34559 Y51.45180 -X92.92979 Y51.47720 -X93.33619 Y51.68040 -X93.51399 Y51.88360 -X93.64099 Y52.21380 -X93.64099 Y52.84880 -X93.46319 Y53.25520 -X93.25999 Y53.43300 -X92.92979 Y53.58540 -X92.34559 Y53.61080 -X92.09159 Y53.56000 -X92.04079 Y53.50920 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X88.94199 Y53.50920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X88.94199 Y53.50920 -X88.94199 Y51.45180 -X91.10099 Y51.45180 -X91.10099 Y53.61080 -X88.94199 Y53.61080 -X88.94199 Y53.50920 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X95.06339 Y51.50260 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X95.06339 Y51.50260 -X94.86019 Y51.40100 -X94.73319 Y51.27400 -X94.68239 Y51.12160 -X94.55539 Y50.96920 -X94.50459 Y50.66440 -X94.50459 Y50.33420 -X94.55539 Y50.02940 -X94.60619 Y50.00400 -X94.73319 Y49.72460 -X95.06339 Y49.47060 -X95.39359 Y49.39440 -X95.97779 Y49.41980 -X96.33339 Y49.57220 -X96.48579 Y49.72460 -X96.61279 Y50.00400 -X96.66359 Y50.02940 -X96.71439 Y50.33420 -X96.71439 Y50.66440 -X96.66359 Y50.96920 -X96.61279 Y50.99460 -X96.48579 Y51.27400 -X96.33339 Y51.42640 -X96.18099 Y51.47720 -X96.15559 Y51.52800 -X95.82539 Y51.60420 -X95.39359 Y51.60420 -X95.06339 Y51.50260 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X95.87619 Y78.52820 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X95.87619 Y78.52820 -X95.62219 Y78.47740 -X95.59679 Y78.42660 -X95.26659 Y78.27420 -X95.03799 Y78.04560 -X94.98719 Y78.04560 -X94.98719 Y77.99480 -X94.75859 Y77.76620 -X94.60619 Y77.43600 -X94.55539 Y77.41060 -X94.52999 Y77.23280 -X94.42839 Y76.97880 -X94.40299 Y76.72480 -X94.42839 Y76.03900 -X94.52999 Y75.78500 -X94.55539 Y75.60720 -X94.60619 Y75.58180 -X94.75859 Y75.25160 -X94.98719 Y75.02300 -X94.98719 Y74.97220 -X95.03799 Y74.97220 -X95.26659 Y74.74360 -X95.59679 Y74.59120 -X95.62219 Y74.54040 -X95.79999 Y74.51500 -X96.05399 Y74.41340 -X96.30799 Y74.38800 -X96.99379 Y74.41340 -X97.24779 Y74.51500 -X97.42559 Y74.54040 -X97.45099 Y74.59120 -X97.78119 Y74.74360 -X98.00979 Y74.97220 -X98.06059 Y74.97220 -X98.06059 Y75.02300 -X98.28919 Y75.25160 -X98.44159 Y75.58180 -X98.49239 Y75.60720 -X98.51779 Y75.78500 -X98.61939 Y76.03900 -X98.64479 Y76.29300 -X98.61939 Y76.97880 -X98.51779 Y77.23280 -X98.49239 Y77.41060 -X98.44159 Y77.43600 -X98.28919 Y77.76620 -X98.06059 Y77.99480 -X98.06059 Y78.04560 -X98.00979 Y78.04560 -X97.78119 Y78.27420 -X97.45099 Y78.42660 -X97.42559 Y78.47740 -X97.24779 Y78.50280 -X96.99379 Y78.60440 -X96.73979 Y78.62980 -X96.05399 Y78.60440 -X95.87619 Y78.52820 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X95.87619 Y6.51920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X95.87619 Y6.51920 -X95.62219 Y6.46840 -X95.59679 Y6.41760 -X95.26659 Y6.26520 -X95.03799 Y6.03660 -X94.98719 Y6.03660 -X94.98719 Y5.98580 -X94.75859 Y5.75720 -X94.60619 Y5.42700 -X94.55539 Y5.40160 -X94.52999 Y5.22380 -X94.42839 Y4.96980 -X94.40299 Y4.71580 -X94.42839 Y4.03000 -X94.52999 Y3.77600 -X94.55539 Y3.59820 -X94.60619 Y3.57280 -X94.75859 Y3.24260 -X94.98719 Y3.01400 -X94.98719 Y2.96320 -X95.03799 Y2.96320 -X95.26659 Y2.73460 -X95.59679 Y2.58220 -X95.62219 Y2.53140 -X95.79999 Y2.50600 -X96.05399 Y2.40440 -X96.30799 Y2.37900 -X96.99379 Y2.40440 -X97.24779 Y2.50600 -X97.42559 Y2.53140 -X97.45099 Y2.58220 -X97.78119 Y2.73460 -X98.00979 Y2.96320 -X98.06059 Y2.96320 -X98.06059 Y3.01400 -X98.28919 Y3.24260 -X98.44159 Y3.57280 -X98.49239 Y3.59820 -X98.51779 Y3.77600 -X98.61939 Y4.03000 -X98.64479 Y4.28400 -X98.61939 Y4.96980 -X98.51779 Y5.22380 -X98.49239 Y5.40160 -X98.44159 Y5.42700 -X98.28919 Y5.75720 -X98.06059 Y5.98580 -X98.06059 Y6.03660 -X98.00979 Y6.03660 -X97.78119 Y6.26520 -X97.45099 Y6.41760 -X97.42559 Y6.46840 -X97.24779 Y6.49380 -X96.99379 Y6.59540 -X96.73979 Y6.62080 -X96.05399 Y6.59540 -X95.87619 Y6.51920 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X49.77519 Y8.44960 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X49.77519 Y8.44960 -X49.57199 Y8.34800 -X49.44499 Y8.22100 -X49.39419 Y8.06860 -X49.26719 Y7.91620 -X49.21639 Y7.61140 -X49.21639 Y7.28120 -X49.26719 Y6.97640 -X49.31799 Y6.95100 -X49.44499 Y6.67160 -X49.77519 Y6.41760 -X50.10539 Y6.34140 -X50.68959 Y6.36680 -X51.04519 Y6.51920 -X51.19759 Y6.67160 -X51.32459 Y6.95100 -X51.37539 Y6.97640 -X51.42619 Y7.28120 -X51.42619 Y7.61140 -X51.37539 Y7.91620 -X51.32459 Y7.94160 -X51.19759 Y8.22100 -X51.04519 Y8.37340 -X50.89279 Y8.42420 -X50.86739 Y8.47500 -X50.53719 Y8.55120 -X50.10539 Y8.55120 -X49.77519 Y8.44960 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X49.21639 Y10.98960 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X49.21639 Y10.98960 -X49.21639 Y8.88140 -X51.42619 Y8.88140 -X51.42619 Y11.09120 -X49.21639 Y11.09120 -X49.21639 Y10.98960 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X45.15239 Y10.98960 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X45.15239 Y10.98960 -X45.15239 Y8.88140 -X47.36219 Y8.88140 -X47.36219 Y11.09120 -X45.15239 Y11.09120 -X45.15239 Y10.98960 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X45.71119 Y8.44960 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X45.71119 Y8.44960 -X45.50799 Y8.34800 -X45.38099 Y8.22100 -X45.33019 Y8.06860 -X45.20319 Y7.91620 -X45.15239 Y7.61140 -X45.15239 Y7.28120 -X45.20319 Y6.97640 -X45.25399 Y6.95100 -X45.38099 Y6.67160 -X45.71119 Y6.41760 -X46.04139 Y6.34140 -X46.62559 Y6.36680 -X46.98119 Y6.51920 -X47.13359 Y6.67160 -X47.26059 Y6.95100 -X47.31139 Y6.97640 -X47.36219 Y7.28120 -X47.36219 Y7.61140 -X47.31139 Y7.91620 -X47.26059 Y7.94160 -X47.13359 Y8.22100 -X46.98119 Y8.37340 -X46.82879 Y8.42420 -X46.80339 Y8.47500 -X46.47319 Y8.55120 -X46.04139 Y8.55120 -X45.71119 Y8.44960 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X23.13059 Y13.19940 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X23.13059 Y13.19940 -X23.05439 Y13.14860 -X23.02899 Y13.04700 -X23.02899 Y12.76760 -X23.05439 Y12.66600 -X23.15599 Y12.56440 -X23.28299 Y12.51360 -X23.56239 Y12.51360 -X23.63859 Y12.56440 -X31.48719 Y12.56440 -X31.56339 Y12.51360 -X31.84279 Y12.51360 -X31.96979 Y12.56440 -X32.07139 Y12.66600 -X32.09679 Y12.76760 -X32.07139 Y13.14860 -X31.96979 Y13.25020 -X31.84279 Y13.30100 -X31.56339 Y13.30100 -X31.48719 Y13.25020 -X23.63859 Y13.25020 -X23.56239 Y13.30100 -X23.28299 Y13.30100 -X23.15599 Y13.25020 -X23.13059 Y13.19940 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X21.30179 Y15.38380 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X21.30179 Y15.38380 -X21.20019 Y15.30760 -X21.17479 Y14.92660 -X21.20019 Y14.82500 -X21.30179 Y14.72340 -X21.42879 Y14.67260 -X21.70819 Y14.67260 -X21.78439 Y14.72340 -X29.88699 Y14.69800 -X30.01399 Y14.74880 -X30.11559 Y14.85040 -X30.14099 Y14.95200 -X30.11559 Y15.33300 -X30.01399 Y15.43460 -X29.88699 Y15.48540 -X29.60759 Y15.48540 -X29.48059 Y15.40920 -X21.78439 Y15.40920 -X21.70819 Y15.46000 -X21.42879 Y15.46000 -X21.30179 Y15.38380 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X22.29239 Y19.98120 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X22.29239 Y19.98120 -X22.29239 Y18.17780 -X24.50219 Y18.17780 -X24.50219 Y20.08280 -X22.29239 Y20.08280 -X22.29239 Y19.98120 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X22.74959 Y22.52120 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X22.74959 Y22.52120 -X22.47019 Y22.31800 -X22.31779 Y21.98780 -X22.29239 Y21.50520 -X22.34319 Y21.25120 -X22.44479 Y21.12420 -X22.47019 Y21.02260 -X22.57179 Y20.92100 -X22.69879 Y20.87020 -X22.74959 Y20.79400 -X23.02899 Y20.71780 -X23.76559 Y20.71780 -X23.99419 Y20.76860 -X24.09579 Y20.87020 -X24.22279 Y20.92100 -X24.32439 Y21.02260 -X24.34979 Y21.12420 -X24.45139 Y21.25120 -X24.50219 Y21.50520 -X24.47679 Y21.98780 -X24.32439 Y22.31800 -X24.22279 Y22.41960 -X24.09579 Y22.47040 -X24.04499 Y22.54660 -X23.76559 Y22.62280 -X23.02899 Y22.62280 -X22.80039 Y22.57200 -X22.74959 Y22.52120 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X22.74959 Y25.06120 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X22.74959 Y25.06120 -X22.47019 Y24.85800 -X22.31779 Y24.52780 -X22.29239 Y24.04520 -X22.34319 Y23.79120 -X22.44479 Y23.66420 -X22.47019 Y23.56260 -X22.57179 Y23.46100 -X22.69879 Y23.41020 -X22.74959 Y23.33400 -X23.02899 Y23.25780 -X23.76559 Y23.25780 -X23.99419 Y23.30860 -X24.09579 Y23.41020 -X24.22279 Y23.46100 -X24.32439 Y23.56260 -X24.34979 Y23.66420 -X24.45139 Y23.79120 -X24.50219 Y24.04520 -X24.47679 Y24.52780 -X24.32439 Y24.85800 -X24.22279 Y24.95960 -X24.09579 Y25.01040 -X24.04499 Y25.08660 -X23.76559 Y25.16280 -X23.02899 Y25.16280 -X22.80039 Y25.11200 -X22.74959 Y25.06120 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X21.65739 Y30.97940 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X21.65739 Y30.97940 -X21.58119 Y30.92860 -X21.55579 Y30.82700 -X21.55579 Y30.54760 -X21.58119 Y30.44600 -X21.68279 Y30.34440 -X21.80979 Y30.29360 -X22.08919 Y30.29360 -X22.16539 Y30.34440 -X27.82959 Y30.34440 -X27.90579 Y30.29360 -X28.18519 Y30.29360 -X28.31219 Y30.34440 -X28.41379 Y30.44600 -X28.43919 Y30.54760 -X28.41379 Y30.92860 -X28.31219 Y31.03020 -X28.18519 Y31.08100 -X27.90579 Y31.08100 -X27.82959 Y31.03020 -X22.16539 Y31.03020 -X22.08919 Y31.08100 -X21.80979 Y31.08100 -X21.68279 Y31.03020 -X21.65739 Y30.97940 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X16.06939 Y33.01140 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X16.06939 Y33.01140 -X15.99319 Y32.96060 -X15.96779 Y32.85900 -X15.96779 Y32.57960 -X16.01859 Y32.47800 -X16.01859 Y28.38860 -X15.96779 Y28.28700 -X15.96779 Y28.00760 -X15.99319 Y27.90600 -X16.14559 Y27.77900 -X16.50119 Y27.75360 -X16.70439 Y27.88060 -X16.75519 Y28.00760 -X16.75519 Y28.28700 -X16.70439 Y28.38860 -X16.70439 Y32.47800 -X16.75519 Y32.57960 -X16.75519 Y32.85900 -X16.72979 Y32.96060 -X16.62819 Y33.06220 -X16.50119 Y33.11300 -X16.22179 Y33.11300 -X16.09479 Y33.06220 -X16.06939 Y33.01140 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X15.18039 Y38.26920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X15.18039 Y38.26920 -X15.18039 Y36.46580 -X17.39019 Y36.46580 -X17.39019 Y38.37080 -X15.18039 Y38.37080 -X15.18039 Y38.26920 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X15.63759 Y40.80920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X15.63759 Y40.80920 -X15.35819 Y40.60600 -X15.20579 Y40.27580 -X15.18039 Y39.79320 -X15.23119 Y39.53920 -X15.33279 Y39.41220 -X15.35819 Y39.31060 -X15.45979 Y39.20900 -X15.58679 Y39.15820 -X15.63759 Y39.08200 -X15.91699 Y39.00580 -X16.65359 Y39.00580 -X16.88219 Y39.05660 -X16.98379 Y39.15820 -X17.11079 Y39.20900 -X17.21239 Y39.31060 -X17.23779 Y39.41220 -X17.33939 Y39.53920 -X17.39019 Y39.79320 -X17.36479 Y40.27580 -X17.21239 Y40.60600 -X17.11079 Y40.70760 -X16.98379 Y40.75840 -X16.93299 Y40.83460 -X16.65359 Y40.91080 -X15.91699 Y40.91080 -X15.68839 Y40.86000 -X15.63759 Y40.80920 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X15.63759 Y43.34920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X15.63759 Y43.34920 -X15.35819 Y43.14600 -X15.20579 Y42.81580 -X15.18039 Y42.33320 -X15.23119 Y42.07920 -X15.33279 Y41.95220 -X15.35819 Y41.85060 -X15.45979 Y41.74900 -X15.58679 Y41.69820 -X15.63759 Y41.62200 -X15.91699 Y41.54580 -X16.65359 Y41.54580 -X16.88219 Y41.59660 -X16.98379 Y41.69820 -X17.11079 Y41.74900 -X17.21239 Y41.85060 -X17.23779 Y41.95220 -X17.33939 Y42.07920 -X17.39019 Y42.33320 -X17.36479 Y42.81580 -X17.21239 Y43.14600 -X17.11079 Y43.24760 -X16.98379 Y43.29840 -X16.93299 Y43.37460 -X16.65359 Y43.45080 -X15.91699 Y43.45080 -X15.68839 Y43.40000 -X15.63759 Y43.34920 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X15.63759 Y45.88920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X15.63759 Y45.88920 -X15.35819 Y45.68600 -X15.20579 Y45.35580 -X15.18039 Y44.87320 -X15.23119 Y44.61920 -X15.33279 Y44.49220 -X15.35819 Y44.39060 -X15.53599 Y44.23820 -X15.58679 Y44.23820 -X15.63759 Y44.16200 -X15.91699 Y44.08580 -X16.65359 Y44.08580 -X16.88219 Y44.13660 -X16.98379 Y44.23820 -X17.11079 Y44.28900 -X17.21239 Y44.39060 -X17.23779 Y44.49220 -X17.33939 Y44.61920 -X17.39019 Y44.87320 -X17.36479 Y45.35580 -X17.21239 Y45.68600 -X17.11079 Y45.78760 -X16.98379 Y45.83840 -X16.93299 Y45.91460 -X16.65359 Y45.99080 -X15.91699 Y45.99080 -X15.68839 Y45.94000 -X15.63759 Y45.88920 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X15.18039 Y24.93420 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X15.18039 Y24.93420 -X15.18039 Y23.13080 -X17.39019 Y23.13080 -X17.39019 Y25.03580 -X15.18039 Y25.03580 -X15.18039 Y24.93420 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X15.63759 Y22.39420 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X15.63759 Y22.39420 -X15.35819 Y22.19100 -X15.20579 Y21.86080 -X15.18039 Y21.37820 -X15.23119 Y21.12420 -X15.33279 Y20.99720 -X15.35819 Y20.89560 -X15.45979 Y20.79400 -X15.58679 Y20.74320 -X15.63759 Y20.66700 -X15.91699 Y20.59080 -X16.65359 Y20.59080 -X16.88219 Y20.64160 -X16.98379 Y20.74320 -X17.11079 Y20.79400 -X17.21239 Y20.89560 -X17.23779 Y20.99720 -X17.33939 Y21.12420 -X17.39019 Y21.37820 -X17.36479 Y21.86080 -X17.21239 Y22.19100 -X17.11079 Y22.29260 -X16.98379 Y22.34340 -X16.93299 Y22.41960 -X16.65359 Y22.49580 -X15.91699 Y22.49580 -X15.68839 Y22.44500 -X15.63759 Y22.39420 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X15.63759 Y19.85420 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X15.63759 Y19.85420 -X15.35819 Y19.65100 -X15.20579 Y19.32080 -X15.18039 Y18.83820 -X15.23119 Y18.58420 -X15.33279 Y18.45720 -X15.35819 Y18.35560 -X15.45979 Y18.25400 -X15.58679 Y18.20320 -X15.63759 Y18.12700 -X15.91699 Y18.05080 -X16.65359 Y18.05080 -X16.88219 Y18.10160 -X16.98379 Y18.20320 -X17.11079 Y18.25400 -X17.21239 Y18.35560 -X17.23779 Y18.45720 -X17.33939 Y18.58420 -X17.39019 Y18.83820 -X17.36479 Y19.32080 -X17.21239 Y19.65100 -X17.11079 Y19.75260 -X16.98379 Y19.80340 -X16.93299 Y19.87960 -X16.65359 Y19.95580 -X15.91699 Y19.95580 -X15.68839 Y19.90500 -X15.63759 Y19.85420 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z5.00000 ( retract ) - -G00 X3.87739 Y6.51920 ( rapid move to begin. ) -F300.00000 -G01 Z-0.05000 -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -F600.00000 -X3.87739 Y6.51920 -X3.62339 Y6.46840 -X3.59799 Y6.41760 -X3.26779 Y6.26520 -X3.03919 Y6.03660 -X2.98839 Y6.03660 -X2.98839 Y5.98580 -X2.75979 Y5.75720 -X2.60739 Y5.42700 -X2.55659 Y5.40160 -X2.53119 Y5.22380 -X2.42959 Y4.96980 -X2.40419 Y4.71580 -X2.42959 Y4.03000 -X2.53119 Y3.77600 -X2.55659 Y3.59820 -X2.60739 Y3.57280 -X2.75979 Y3.24260 -X2.98839 Y3.01400 -X2.98839 Y2.96320 -X3.03919 Y2.96320 -X3.26779 Y2.73460 -X3.59799 Y2.58220 -X3.62339 Y2.53140 -X3.80119 Y2.50600 -X4.05519 Y2.40440 -X4.30919 Y2.37900 -X4.99499 Y2.40440 -X5.24899 Y2.50600 -X5.42679 Y2.53140 -X5.45219 Y2.58220 -X5.78239 Y2.73460 -X6.01099 Y2.96320 -X6.06179 Y2.96320 -X6.06179 Y3.01400 -X6.29039 Y3.24260 -X6.44279 Y3.57280 -X6.49359 Y3.59820 -X6.51899 Y3.77600 -X6.62059 Y4.03000 -X6.64599 Y4.28400 -X6.62059 Y4.96980 -X6.51899 Y5.22380 -X6.49359 Y5.40160 -X6.44279 Y5.42700 -X6.29039 Y5.75720 -X6.06179 Y5.98580 -X6.06179 Y6.03660 -X6.01099 Y6.03660 -X5.78239 Y6.26520 -X5.45219 Y6.41760 -X5.42679 Y6.46840 -X5.24899 Y6.49380 -X4.99499 Y6.59540 -X4.74099 Y6.62080 -X4.05519 Y6.59540 -X3.87739 Y6.51920 - -G04 P0 ( dwell for no time -- G64 should not smooth over this point ) -G00 Z10.000 ( retract ) - -M5 ( Spindle off. ) -M9 ( Coolant off. ) -M2 ( Program end. ) +M3 S24000 +G4 P3 +G0 Z10 +(Block-name: Text) +(Block-expand: 0) +(Block-enable: 1) +(Text: MATEI) +( ---------- cut-here ---------- ) +g0 z3 +g0 x2.7539 y21.8701 +g1 z0.1 f500 +g1 f1200 +g1 x2.7539 y21.8701 +g1 x9.9316 y21.8701 +g1 x14.9121 y10.166 +g1 x19.9219 y21.8701 +g1 x27.085 y21.8701 +g1 x27.085 y0 +g1 x21.7529 y0 +g1 x21.7529 y15.9961 +g1 x16.7139 y4.2041 +g1 x13.1396 y4.2041 +g1 x8.1006 y15.9961 +g1 x8.1006 y0 +g1 x2.7539 y0 +g1 x2.7539 y21.8701 +( ---------- cut-here ---------- ) +g0 z3 +g0 x38.4668 y8.042 +g1 z0.1 f500 +g1 f1200 +g1 x38.4668 y8.042 +g1 x44.458 y8.042 +g1 x41.4697 y16.7432 +g1 x38.4668 y8.042 +( ---------- cut-here ---------- ) +g0 z3 +g0 x45.8789 y3.9844 +g1 z0.1 f500 +g1 f1200 +g1 x45.8789 y3.9844 +g1 x37.0605 y3.9844 +g1 x35.6689 y0 +g1 x30 y0 +g1 x38.1006 y21.8701 +g1 x44.8242 y21.8701 +g1 x52.9248 y0 +g1 x47.2559 y0 +g1 x45.8789 y3.9844 +( ---------- cut-here ---------- ) +g0 z3 +g0 x53.2178 y21.8701 +g1 z0.1 f500 +g1 f1200 +g1 x53.2178 y21.8701 +g1 x73.374 y21.8701 +g1 x73.374 y17.6074 +g1 x66.123 y17.6074 +g1 x66.123 y0 +g1 x60.4834 y0 +g1 x60.4834 y17.6074 +g1 x53.2178 y17.6074 +g1 x53.2178 y21.8701 +( ---------- cut-here ---------- ) +g0 z3 +g0 x76.2891 y21.8701 +g1 z0.1 f500 +g1 f1200 +g1 x76.2891 y21.8701 +g1 x91.5088 y21.8701 +g1 x91.5088 y17.6074 +g1 x81.9287 y17.6074 +g1 x81.9287 y13.5352 +g1 x90.9375 y13.5352 +g1 x90.9375 y9.2725 +g1 x81.9287 y9.2725 +g1 x81.9287 y4.2627 +g1 x91.8311 y4.2627 +g1 x91.8311 y0 +g1 x76.2891 y0 +g1 x76.2891 y21.8701 +( ---------- cut-here ---------- ) +g0 z3 +g0 x96.7822 y21.8701 +g1 z0.1 f500 +g1 f1200 +g1 x96.7822 y21.8701 +g1 x102.4219 y21.8701 +g1 x102.4219 y0 +g1 x96.7822 y0 +g1 x96.7822 y21.8701 +g0 z3 +(Block-name: Text) +(Block-expand: 1) +(Block-enable: 1) +(Text: MATEI) +g0 z3 +(Block-name: Footer) +(Block-expand: 1) +(Block-enable: 1) +G0 Z10 +M5