diff --git a/CMakeLists.txt b/CMakeLists.txt index 67a7184..372c74f 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) +add_executable(sender main.cpp grbl.h grbl.cpp grbl_test.cpp grbl_communication.h grbl_communication.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 new file mode 100644 index 0000000..62fbe36 --- /dev/null +++ b/grbl_communication.cpp @@ -0,0 +1,119 @@ +#include "grbl_communication.h" + +#include +#include +#include +#include +#include +#include + +grbl::tcp_transport::tcp_transport(std::string address, uint16_t p) + : ip{std::move(address)}, port{p} { + live_check_thread = std::thread(&grbl::tcp_transport::worker, this); +} + +void grbl::tcp_transport::open(grbl::transport_callbacks& cb) { + if (is_connected) { + close(); + } + + listener = &cb; + fd = socket(AF_INET, SOCK_STREAM, 0); + if (fd == -1) { + std::cerr << "Error creating socket" << std::endl; + } + + struct sockaddr_in serv_addr{}; + serv_addr.sin_family = AF_INET; + serv_addr.sin_port = htons(port); + + if (inet_pton(AF_INET, ip.c_str(), &serv_addr.sin_addr) <= 0) { + std::cerr << "Invalid address/ Address not supported" << std::endl; + return; + } + + auto status = connect(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); + if (status < 0) { + std::cerr << "Connection failed"; + return; + } + + is_connected = true; + listener->on_connected(this); + + // set non-blocking please, after we connected + fcntl(fd, F_SETFL, O_NONBLOCK); +} + +void grbl::tcp_transport::close() { + if (fd >= 0) { + ::close(fd); + + is_connected = false; + send_queue = std::queue{}; + + if (listener != nullptr) + listener->on_disconnected(this); + } +} + +void grbl::tcp_transport::send(std::string line) { + if (is_connected) { + send_queue.push(line + "\r"); + } +} + +void grbl::tcp_transport::worker() { + std::string received; + uint8_t buffer[200]; + + while (!should_quit) { + if (is_connected) { + // anything to write? + if (!send_queue.empty()) { + auto line = send_queue.front(); + auto result = write(fd, line.c_str(), line.size()); + if (result == -1) { + std::cerr << "Failed while writing." << std::endl; + close(); + } + + send_queue.pop(); + } + + // anything to read? + auto read_bytes = read(fd, buffer, 200); + if (read_bytes > 0) { + for (int i = 0; i < read_bytes; i++) { + auto is_eol = buffer[i] == '\r' || buffer[i] == '\n'; + if (is_eol) { + if (!is_empty_line(received)) { + listener->on_line_received(received, this); + } + received.clear(); + } else { + received.push_back(static_cast(buffer[i])); + } + } + } + + // give some time to others + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + } +} + +grbl::tcp_transport::~tcp_transport() { + close(); + should_quit = true; + live_check_thread.join(); +} + +bool grbl::tcp_transport::is_empty_line(std::string line) { + for (auto& c: line) { + if (c != '\r' && c != '\n' && c != ' ') { + return false; + } + } + return true; +} diff --git a/grbl_communication.h b/grbl_communication.h new file mode 100644 index 0000000..94ad643 --- /dev/null +++ b/grbl_communication.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include + +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; +}; + +struct transport { + virtual void open(transport_callbacks& cb) = 0; + virtual void close() = 0; + virtual void send(std::string line) = 0; +}; + +struct tcp_transport : public transport { + virtual ~tcp_transport(); + tcp_transport(std::string address, uint16_t port); + + void open(transport_callbacks& cb) override; + void close() override; + void send(std::string line) override; + +private: + + void worker(); + + std::string ip; + uint16_t port; + transport_callbacks *listener = nullptr; + int fd = -1; + volatile bool is_connected = false; + std::thread live_check_thread; + std::queue send_queue; + volatile bool should_quit = false; + bool is_empty_line(std::string line); +}; + +} + diff --git a/main.cpp b/main.cpp index a508f25..ea1f047 100644 --- a/main.cpp +++ b/main.cpp @@ -50,6 +50,7 @@ #include #include "grbl.h" #include +#include "grbl_communication.h" using namespace nanogui; @@ -611,8 +612,29 @@ private: int m_current_image; }; + +struct grbl_listener : public grbl::transport_callbacks { + void on_connected(grbl::transport *t) override { + std::cout << "Listener: connected!" << std::endl; + t->send("$$"); + } + + void on_disconnected(grbl::transport *t) override { + std::cout << "Listener: disconnected!" << std::endl; + } + + 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); + testing::InitGoogleTest(&argc, argv); auto result = RUN_ALL_TESTS(); if (result) { @@ -621,9 +643,9 @@ int main(int argc, char **argv) { try { - grbl::program pgm; - pgm.load("./program.nc"); - pgm.dump(std::cout); +// grbl::program pgm; +// pgm.load("./program.nc"); +// pgm.dump(std::cout); nanogui::init(); diff --git a/program.nc b/program.nc new file mode 100644 index 0000000..de2194f --- /dev/null +++ b/program.nc @@ -0,0 +1,1414 @@ +( pcb2gcode 1.2.2 ) +( Software-independent Gcode ) + +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. ) +